@pie-lib/editable-html-tip-tap 2.1.20-beta.6 → 2.1.20-beta.8

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 (94) hide show
  1. package/lib/__tests__/EditableHtml.test.js +831 -0
  2. package/lib/__tests__/constants.test.js +21 -0
  3. package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
  4. package/lib/__tests__/extensions.test.js +209 -0
  5. package/lib/__tests__/index.test.js +250 -0
  6. package/lib/__tests__/size-utils.test.js +57 -0
  7. package/lib/__tests__/spellcheck.test.js +142 -0
  8. package/lib/__tests__/theme.test.js +17 -0
  9. package/lib/components/__tests__/AltDialog.test.js +201 -0
  10. package/lib/components/__tests__/CharacterPicker.test.js +455 -0
  11. package/lib/components/__tests__/CssIcon.test.js +58 -0
  12. package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
  13. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
  14. package/lib/components/__tests__/ImageToolbar.test.js +185 -0
  15. package/lib/components/__tests__/InlineDropdown.test.js +839 -0
  16. package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
  17. package/lib/components/__tests__/MediaDialog.test.js +433 -0
  18. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  19. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  20. package/lib/components/__tests__/MenuBar.test.js +502 -0
  21. package/lib/components/__tests__/RespArea.test.js +171 -0
  22. package/lib/components/__tests__/TableIcons.test.js +153 -0
  23. package/lib/components/__tests__/TextAlign.test.js +209 -0
  24. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  25. package/lib/components/__tests__/characterUtils.test.js +178 -0
  26. package/lib/components/__tests__/choice.test.js +213 -0
  27. package/lib/components/__tests__/custom-popper.test.js +108 -0
  28. package/lib/components/__tests__/done-button.test.js +72 -0
  29. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  30. package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
  31. package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
  32. package/lib/extensions/__tests__/css.test.js +214 -0
  33. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
  34. package/lib/extensions/__tests__/divNode.test.js +108 -0
  35. package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
  36. package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
  37. package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
  38. package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
  39. package/lib/extensions/__tests__/extended-table.test.js +200 -0
  40. package/lib/extensions/__tests__/image-component.test.js +432 -0
  41. package/lib/extensions/__tests__/image.test.js +313 -0
  42. package/lib/extensions/__tests__/math.test.js +1411 -0
  43. package/lib/extensions/__tests__/media-node-view.test.js +307 -0
  44. package/lib/extensions/__tests__/media.test.js +292 -0
  45. package/lib/extensions/__tests__/responseArea.test.js +736 -0
  46. package/lib/utils/__tests__/helper.test.js +107 -0
  47. package/lib/utils/__tests__/toolbar.test.js +38 -0
  48. package/package.json +3 -3
  49. package/src/__tests__/EditableHtml.test.jsx +588 -0
  50. package/src/__tests__/constants.test.js +19 -0
  51. package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
  52. package/src/__tests__/extensions.test.js +208 -0
  53. package/src/__tests__/index.test.jsx +154 -0
  54. package/src/__tests__/size-utils.test.js +64 -0
  55. package/src/__tests__/theme.test.js +17 -0
  56. package/src/components/__tests__/AltDialog.test.jsx +147 -0
  57. package/src/components/__tests__/CharacterPicker.test.jsx +270 -0
  58. package/src/components/__tests__/CssIcon.test.jsx +46 -0
  59. package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
  60. package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +209 -0
  61. package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
  62. package/src/components/__tests__/InlineDropdown.test.jsx +557 -0
  63. package/src/components/__tests__/InsertImageHandler.test.js +161 -0
  64. package/src/components/__tests__/MediaDialog.test.jsx +293 -0
  65. package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
  66. package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
  67. package/src/components/__tests__/MenuBar.test.jsx +250 -0
  68. package/src/components/__tests__/RespArea.test.jsx +122 -0
  69. package/src/components/__tests__/TableIcons.test.jsx +149 -0
  70. package/src/components/__tests__/TextAlign.test.jsx +167 -0
  71. package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
  72. package/src/components/__tests__/characterUtils.test.js +166 -0
  73. package/src/components/__tests__/choice.test.jsx +171 -0
  74. package/src/components/__tests__/custom-popper.test.jsx +82 -0
  75. package/src/components/__tests__/done-button.test.jsx +54 -0
  76. package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
  77. package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
  78. package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
  79. package/src/extensions/__tests__/css.test.js +196 -0
  80. package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
  81. package/src/extensions/__tests__/divNode.test.js +87 -0
  82. package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
  83. package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
  84. package/src/extensions/__tests__/extended-list-item.test.js +13 -0
  85. package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
  86. package/src/extensions/__tests__/extended-table.test.js +183 -0
  87. package/src/extensions/__tests__/image-component.test.jsx +346 -0
  88. package/src/extensions/__tests__/image.test.js +237 -0
  89. package/src/extensions/__tests__/math.test.js +900 -0
  90. package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
  91. package/src/extensions/__tests__/media.test.js +271 -0
  92. package/src/extensions/__tests__/responseArea.test.js +655 -0
  93. package/src/utils/__tests__/helper.test.js +126 -0
  94. package/src/utils/__tests__/toolbar.test.js +43 -0
@@ -0,0 +1,736 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
6
+ var _responseArea = require("../responseArea");
7
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
8
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9
+ jest.mock('@tiptap/core', function () {
10
+ return {
11
+ Extension: {
12
+ create: jest.fn(function (config) {
13
+ return config;
14
+ })
15
+ },
16
+ Node: {
17
+ create: jest.fn(function (config) {
18
+ return config;
19
+ })
20
+ }
21
+ };
22
+ });
23
+ jest.mock('@tiptap/react', function () {
24
+ return {
25
+ Node: {
26
+ create: jest.fn(function (config) {
27
+ return config;
28
+ })
29
+ },
30
+ ReactNodeViewRenderer: jest.fn(function (component) {
31
+ return component;
32
+ })
33
+ };
34
+ });
35
+ jest.mock('prosemirror-state', function () {
36
+ return {
37
+ Plugin: jest.fn(function (config) {
38
+ return config;
39
+ }),
40
+ PluginKey: jest.fn(function (key) {
41
+ this.key = key;
42
+ }),
43
+ TextSelection: {
44
+ near: jest.fn(function (pos, dir) {
45
+ return {
46
+ type: 'text',
47
+ pos: pos,
48
+ dir: dir
49
+ };
50
+ }),
51
+ create: jest.fn(function (doc, pos) {
52
+ return {
53
+ type: 'text',
54
+ pos: pos
55
+ };
56
+ })
57
+ },
58
+ NodeSelection: {
59
+ create: jest.fn(function (doc, pos) {
60
+ return {
61
+ type: 'node',
62
+ pos: pos
63
+ };
64
+ })
65
+ }
66
+ };
67
+ });
68
+ jest.mock('../../components/respArea/ExplicitConstructedResponse', function () {
69
+ return {
70
+ __esModule: true,
71
+ "default": jest.fn(function () {
72
+ return /*#__PURE__*/React.createElement("div", {
73
+ "data-testid": "explicit-constructed-response"
74
+ });
75
+ })
76
+ };
77
+ });
78
+ jest.mock('../../components/respArea/DragInTheBlank/DragInTheBlank', function () {
79
+ return {
80
+ __esModule: true,
81
+ "default": jest.fn(function () {
82
+ return /*#__PURE__*/React.createElement("div", {
83
+ "data-testid": "drag-in-the-blank"
84
+ });
85
+ })
86
+ };
87
+ });
88
+ jest.mock('../../components/respArea/InlineDropdown', function () {
89
+ return {
90
+ __esModule: true,
91
+ "default": jest.fn(function () {
92
+ return /*#__PURE__*/React.createElement("div", {
93
+ "data-testid": "inline-dropdown"
94
+ });
95
+ })
96
+ };
97
+ });
98
+ describe('ResponseAreaExtension', function () {
99
+ describe('configuration', function () {
100
+ it('has correct name', function () {
101
+ expect(_responseArea.ResponseAreaExtension.name).toBe('responseArea');
102
+ });
103
+ });
104
+ describe('addOptions', function () {
105
+ it('returns default options', function () {
106
+ var options = _responseArea.ResponseAreaExtension.addOptions();
107
+ expect(options).toHaveProperty('maxResponseAreas', null);
108
+ expect(options).toHaveProperty('error', null);
109
+ expect(options).toHaveProperty('options', null);
110
+ expect(options).toHaveProperty('respAreaToolbar', null);
111
+ expect(options).toHaveProperty('onHandleAreaChange', null);
112
+ });
113
+ });
114
+ describe('addProseMirrorPlugins', function () {
115
+ it('returns empty array when no type specified', function () {
116
+ var context = {
117
+ options: {}
118
+ };
119
+ var plugins = _responseArea.ResponseAreaExtension.addProseMirrorPlugins.call(context);
120
+ expect(Array.isArray(plugins)).toBe(true);
121
+ expect(plugins).toHaveLength(0);
122
+ });
123
+ it('returns plugin array when type is specified', function () {
124
+ var context = {
125
+ options: {
126
+ type: 'explicit-constructed-response',
127
+ maxResponseAreas: 5
128
+ }
129
+ };
130
+ var plugins = _responseArea.ResponseAreaExtension.addProseMirrorPlugins.call(context);
131
+ expect(Array.isArray(plugins)).toBe(true);
132
+ expect(plugins).toHaveLength(1);
133
+ expect(plugins[0]).toHaveProperty('key');
134
+ expect(plugins[0]).toHaveProperty('view');
135
+ });
136
+ });
137
+ describe('addCommands', function () {
138
+ it('returns insertResponseArea command', function () {
139
+ var commands = _responseArea.ResponseAreaExtension.addCommands();
140
+ expect(commands).toHaveProperty('insertResponseArea');
141
+ expect((0, _typeof2["default"])(commands.insertResponseArea)).toBe('function');
142
+ });
143
+ it('returns refreshResponseArea command', function () {
144
+ var commands = _responseArea.ResponseAreaExtension.addCommands();
145
+ expect(commands).toHaveProperty('refreshResponseArea');
146
+ expect((0, _typeof2["default"])(commands.refreshResponseArea)).toBe('function');
147
+ });
148
+ it('refreshResponseArea handles node with attrs safely', function () {
149
+ var context = {
150
+ options: {
151
+ type: 'explicit-constructed-response',
152
+ maxResponseAreas: 5
153
+ }
154
+ };
155
+ var commands = _responseArea.ResponseAreaExtension.addCommands.call(context);
156
+ var refreshCommand = commands.refreshResponseArea();
157
+
158
+ // Mock transaction and state
159
+ var mockNode = {
160
+ attrs: {
161
+ index: '0',
162
+ value: 'test'
163
+ }
164
+ };
165
+ var mockTr = {
166
+ setNodeMarkup: jest.fn(),
167
+ setSelection: jest.fn()
168
+ };
169
+ var mockState = {
170
+ selection: {
171
+ from: 0,
172
+ $from: {
173
+ nodeAfter: mockNode
174
+ }
175
+ },
176
+ tr: mockTr
177
+ };
178
+ var mockCommands = {
179
+ focus: jest.fn()
180
+ };
181
+ var mockDispatch = jest.fn();
182
+ refreshCommand({
183
+ tr: mockTr,
184
+ state: mockState,
185
+ commands: mockCommands,
186
+ dispatch: mockDispatch
187
+ });
188
+ expect(mockTr.setNodeMarkup).toHaveBeenCalled();
189
+ });
190
+ it('refreshResponseArea handles node without attrs safely (optional chaining)', function () {
191
+ var context = {
192
+ options: {
193
+ type: 'explicit-constructed-response',
194
+ maxResponseAreas: 5
195
+ }
196
+ };
197
+ var commands = _responseArea.ResponseAreaExtension.addCommands.call(context);
198
+ var refreshCommand = commands.refreshResponseArea();
199
+
200
+ // Mock transaction and state with node that has no attrs
201
+ var mockNode = null;
202
+ var mockTr = {
203
+ setNodeMarkup: jest.fn(),
204
+ setSelection: jest.fn()
205
+ };
206
+ var mockState = {
207
+ selection: {
208
+ from: 0,
209
+ $from: {
210
+ nodeAfter: mockNode
211
+ }
212
+ },
213
+ tr: mockTr
214
+ };
215
+ var mockCommands = {
216
+ focus: jest.fn()
217
+ };
218
+ var mockDispatch = jest.fn();
219
+
220
+ // This should not throw an error due to optional chaining on node?.attrs
221
+ expect(function () {
222
+ refreshCommand({
223
+ tr: mockTr,
224
+ state: mockState,
225
+ commands: mockCommands,
226
+ dispatch: mockDispatch
227
+ });
228
+ }).not.toThrow();
229
+ });
230
+ it('refreshResponseArea updates timestamp in node attributes', function () {
231
+ var context = {
232
+ options: {
233
+ type: 'explicit-constructed-response',
234
+ maxResponseAreas: 5
235
+ }
236
+ };
237
+ var commands = _responseArea.ResponseAreaExtension.addCommands.call(context);
238
+ var refreshCommand = commands.refreshResponseArea();
239
+ var mockNode = {
240
+ attrs: {
241
+ index: '0',
242
+ value: 'test',
243
+ updated: '1234567890'
244
+ }
245
+ };
246
+ var mockTr = {
247
+ setNodeMarkup: jest.fn(function (pos, type, attrs) {
248
+ // Verify that updated timestamp is being set
249
+ expect(attrs.updated).toBeDefined();
250
+ expect(attrs.updated).not.toBe('1234567890');
251
+ }),
252
+ setSelection: jest.fn()
253
+ };
254
+ var mockState = {
255
+ selection: {
256
+ from: 0,
257
+ $from: {
258
+ nodeAfter: mockNode
259
+ }
260
+ },
261
+ tr: mockTr
262
+ };
263
+ var mockCommands = {
264
+ focus: jest.fn()
265
+ };
266
+ var mockDispatch = jest.fn();
267
+ refreshCommand({
268
+ tr: mockTr,
269
+ state: mockState,
270
+ commands: mockCommands,
271
+ dispatch: mockDispatch
272
+ });
273
+ expect(mockTr.setNodeMarkup).toHaveBeenCalled();
274
+ });
275
+ describe('insertResponseArea', function () {
276
+ beforeEach(function () {
277
+ jest.resetModules();
278
+ });
279
+ var buildInsertCommand = function buildInsertCommand() {
280
+ var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'inline-dropdown';
281
+ var _require = require('../responseArea'),
282
+ ResponseAreaExtension = _require.ResponseAreaExtension;
283
+ var context = {
284
+ options: {
285
+ type: type,
286
+ maxResponseAreas: 5
287
+ }
288
+ };
289
+ var commands = ResponseAreaExtension.addCommands.call(context);
290
+ return commands.insertResponseArea(type);
291
+ };
292
+ var createDoc = function createDoc(existingCount) {
293
+ var typeName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'inline_dropdown';
294
+ return {
295
+ descendants: jest.fn(function (callback) {
296
+ for (var i = 0; i < existingCount; i += 1) {
297
+ callback({
298
+ type: {
299
+ name: typeName
300
+ }
301
+ }, i);
302
+ }
303
+ }),
304
+ content: {
305
+ size: 50
306
+ }
307
+ };
308
+ };
309
+ it('assigns index 1 and id 1 on the first insert', function () {
310
+ var insert = buildInsertCommand();
311
+ var mockInlineNode = {
312
+ nodeSize: 1
313
+ };
314
+ var create = jest.fn(function () {
315
+ return mockInlineNode;
316
+ });
317
+ var mockDoc = createDoc(0);
318
+ var mockTr = {
319
+ insert: jest.fn(),
320
+ doc: mockDoc,
321
+ setSelection: jest.fn()
322
+ };
323
+ var state = {
324
+ schema: {
325
+ nodes: {
326
+ inline_dropdown: {
327
+ create: create
328
+ }
329
+ }
330
+ },
331
+ doc: mockDoc,
332
+ selection: {
333
+ from: 5
334
+ }
335
+ };
336
+ var mockDispatch = jest.fn();
337
+ var mockCommands = {
338
+ focus: jest.fn()
339
+ };
340
+ var result = insert({
341
+ tr: mockTr,
342
+ state: state,
343
+ dispatch: mockDispatch,
344
+ commands: mockCommands
345
+ });
346
+ expect(result).toBe(true);
347
+ expect(create).toHaveBeenCalledWith({
348
+ index: '1',
349
+ id: '1',
350
+ value: ''
351
+ });
352
+ expect(mockTr.insert).toHaveBeenCalledWith(5, mockInlineNode);
353
+ expect(mockDispatch).toHaveBeenCalled();
354
+ });
355
+ it('assigns consecutive indices on repeated inserts', function () {
356
+ var insert = buildInsertCommand();
357
+ var mockInlineNode = {
358
+ nodeSize: 1
359
+ };
360
+ var create = jest.fn(function () {
361
+ return mockInlineNode;
362
+ });
363
+ var mockDoc = createDoc(0);
364
+ var runOnce = function runOnce() {
365
+ var mockTr = {
366
+ insert: jest.fn(),
367
+ doc: mockDoc,
368
+ setSelection: jest.fn()
369
+ };
370
+ var state = {
371
+ schema: {
372
+ nodes: {
373
+ inline_dropdown: {
374
+ create: create
375
+ }
376
+ }
377
+ },
378
+ doc: mockDoc,
379
+ selection: {
380
+ from: 1
381
+ }
382
+ };
383
+ insert({
384
+ tr: mockTr,
385
+ state: state,
386
+ dispatch: jest.fn(),
387
+ commands: {
388
+ focus: jest.fn()
389
+ }
390
+ });
391
+ };
392
+ runOnce();
393
+ runOnce();
394
+ expect(create.mock.calls[0][0]).toEqual({
395
+ index: '1',
396
+ id: '1',
397
+ value: ''
398
+ });
399
+ expect(create.mock.calls[1][0]).toEqual({
400
+ index: '2',
401
+ id: '2',
402
+ value: ''
403
+ });
404
+ });
405
+ it('returns false when maxResponseAreas is reached', function () {
406
+ var insert = buildInsertCommand();
407
+ var mockInlineNode = {
408
+ nodeSize: 1
409
+ };
410
+ var create = jest.fn(function () {
411
+ return mockInlineNode;
412
+ });
413
+ var mockDoc = createDoc(5);
414
+ var mockTr = {
415
+ insert: jest.fn(),
416
+ doc: mockDoc,
417
+ setSelection: jest.fn()
418
+ };
419
+ var state = {
420
+ schema: {
421
+ nodes: {
422
+ inline_dropdown: {
423
+ create: create
424
+ }
425
+ }
426
+ },
427
+ doc: mockDoc,
428
+ selection: {
429
+ from: 5
430
+ }
431
+ };
432
+ var result = insert({
433
+ tr: mockTr,
434
+ state: state,
435
+ dispatch: jest.fn(),
436
+ commands: {
437
+ focus: jest.fn()
438
+ }
439
+ });
440
+ expect(result).toBe(false);
441
+ expect(create).not.toHaveBeenCalled();
442
+ expect(mockTr.insert).not.toHaveBeenCalled();
443
+ });
444
+ describe('selection after insert', function () {
445
+ var buildStateAndTr = function buildStateAndTr(typeName) {
446
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
447
+ _ref$withResolve = _ref.withResolve,
448
+ withResolve = _ref$withResolve === void 0 ? false : _ref$withResolve;
449
+ var mockInlineNode = {
450
+ nodeSize: 1
451
+ };
452
+ var create = jest.fn(function () {
453
+ return mockInlineNode;
454
+ });
455
+ var mockDoc = _objectSpread({
456
+ descendants: jest.fn(),
457
+ content: {
458
+ size: 50
459
+ }
460
+ }, withResolve ? {
461
+ resolve: jest.fn(function (pos) {
462
+ return {
463
+ resolved: pos
464
+ };
465
+ })
466
+ } : {});
467
+ var mockTr = {
468
+ insert: jest.fn(),
469
+ doc: mockDoc,
470
+ setSelection: jest.fn()
471
+ };
472
+ var state = {
473
+ schema: {
474
+ nodes: (0, _defineProperty2["default"])({}, typeName, {
475
+ create: create
476
+ })
477
+ },
478
+ doc: mockDoc,
479
+ selection: {
480
+ from: 5
481
+ }
482
+ };
483
+ return {
484
+ mockTr: mockTr,
485
+ state: state
486
+ };
487
+ };
488
+ it.each(['inline-dropdown', 'explicit-constructed-response'])('sets a NodeSelection on the inserted node for %s', function (type) {
489
+ var insert = buildInsertCommand(type);
490
+ var typeName = type.replace(/-/g, '_');
491
+ var _buildStateAndTr = buildStateAndTr(typeName),
492
+ mockTr = _buildStateAndTr.mockTr,
493
+ state = _buildStateAndTr.state;
494
+ var _require2 = require('prosemirror-state'),
495
+ NodeSelection = _require2.NodeSelection,
496
+ TextSelection = _require2.TextSelection;
497
+ insert({
498
+ tr: mockTr,
499
+ state: state,
500
+ dispatch: jest.fn(),
501
+ commands: {
502
+ focus: jest.fn()
503
+ }
504
+ });
505
+ expect(NodeSelection.create).toHaveBeenCalledWith(mockTr.doc, 5);
506
+ expect(TextSelection.near).not.toHaveBeenCalled();
507
+ expect(mockTr.setSelection).toHaveBeenCalledWith({
508
+ type: 'node',
509
+ pos: 5
510
+ });
511
+ });
512
+ it('sets a TextSelection just after the inserted node for math-templated (no NodeSelection)', function () {
513
+ var insert = buildInsertCommand('math-templated');
514
+ var _buildStateAndTr2 = buildStateAndTr('math_templated', {
515
+ withResolve: true
516
+ }),
517
+ mockTr = _buildStateAndTr2.mockTr,
518
+ state = _buildStateAndTr2.state;
519
+ var _require3 = require('prosemirror-state'),
520
+ NodeSelection = _require3.NodeSelection,
521
+ TextSelection = _require3.TextSelection;
522
+ insert({
523
+ tr: mockTr,
524
+ state: state,
525
+ dispatch: jest.fn(),
526
+ commands: {
527
+ focus: jest.fn()
528
+ }
529
+ });
530
+ expect(NodeSelection.create).not.toHaveBeenCalled();
531
+ // usedPos (5) + nodeSize (1) === 6
532
+ expect(mockTr.doc.resolve).toHaveBeenCalledWith(6);
533
+ expect(TextSelection.near).toHaveBeenCalledWith({
534
+ resolved: 6
535
+ }, 1);
536
+ expect(mockTr.setSelection).toHaveBeenCalledWith({
537
+ type: 'text',
538
+ pos: {
539
+ resolved: 6
540
+ },
541
+ dir: 1
542
+ });
543
+ });
544
+ });
545
+ });
546
+ });
547
+ });
548
+ describe('ExplicitConstructedResponseNode', function () {
549
+ describe('configuration', function () {
550
+ it('has correct name', function () {
551
+ expect(_responseArea.ExplicitConstructedResponseNode.name).toBe('explicit_constructed_response');
552
+ });
553
+ it('is inline', function () {
554
+ expect(_responseArea.ExplicitConstructedResponseNode.inline).toBe(true);
555
+ });
556
+ it('is in inline group', function () {
557
+ expect(_responseArea.ExplicitConstructedResponseNode.group).toBe('inline');
558
+ });
559
+ it('is atomic', function () {
560
+ expect(_responseArea.ExplicitConstructedResponseNode.atom).toBe(true);
561
+ });
562
+ });
563
+ describe('addAttributes', function () {
564
+ it('returns required attributes', function () {
565
+ var attributes = _responseArea.ExplicitConstructedResponseNode.addAttributes();
566
+ expect(attributes).toHaveProperty('index');
567
+ expect(attributes).toHaveProperty('value');
568
+ expect(attributes).toHaveProperty('updated');
569
+ expect(attributes.index).toEqual({
570
+ "default": null
571
+ });
572
+ expect(attributes.value).toEqual({
573
+ "default": ''
574
+ });
575
+ expect(attributes.updated).toEqual({
576
+ "default": ''
577
+ });
578
+ });
579
+ });
580
+ describe('parseHTML', function () {
581
+ it('returns parsing rules', function () {
582
+ var rules = _responseArea.ExplicitConstructedResponseNode.parseHTML();
583
+ expect(Array.isArray(rules)).toBe(true);
584
+ expect(rules).toHaveLength(1);
585
+ expect(rules[0]).toHaveProperty('tag');
586
+ });
587
+ });
588
+ describe('renderHTML', function () {
589
+ it('renders span with attributes', function () {
590
+ var result = _responseArea.ExplicitConstructedResponseNode.renderHTML({
591
+ HTMLAttributes: {
592
+ index: '1',
593
+ id: '1',
594
+ value: 'test'
595
+ }
596
+ });
597
+ expect(result[0]).toBe('span');
598
+ expect(result[1]).toHaveProperty('data-type', 'explicit_constructed_response');
599
+ });
600
+ });
601
+ describe('addNodeView', function () {
602
+ it('returns ReactNodeViewRenderer result', function () {
603
+ var result = _responseArea.ExplicitConstructedResponseNode.addNodeView();
604
+ expect(result).toBeDefined();
605
+ });
606
+ });
607
+ });
608
+ describe('DragInTheBlankNode', function () {
609
+ describe('configuration', function () {
610
+ it('has correct name', function () {
611
+ expect(_responseArea.DragInTheBlankNode.name).toBe('drag_in_the_blank');
612
+ });
613
+ it('is inline', function () {
614
+ expect(_responseArea.DragInTheBlankNode.inline).toBe(true);
615
+ });
616
+ it('is in inline group', function () {
617
+ expect(_responseArea.DragInTheBlankNode.group).toBe('inline');
618
+ });
619
+ it('is atomic', function () {
620
+ expect(_responseArea.DragInTheBlankNode.atom).toBe(true);
621
+ });
622
+ });
623
+ describe('addAttributes', function () {
624
+ it('returns required attributes', function () {
625
+ var attributes = _responseArea.DragInTheBlankNode.addAttributes();
626
+ expect(attributes).toHaveProperty('index');
627
+ expect(attributes).toHaveProperty('id');
628
+ expect(attributes).toHaveProperty('value');
629
+ expect(attributes).toHaveProperty('inTable');
630
+ expect(attributes).toHaveProperty('updated');
631
+ expect(attributes.index).toEqual({
632
+ "default": null
633
+ });
634
+ expect(attributes.id).toEqual({
635
+ "default": null
636
+ });
637
+ expect(attributes.value).toEqual({
638
+ "default": ''
639
+ });
640
+ expect(attributes.inTable).toEqual({
641
+ "default": null
642
+ });
643
+ expect(attributes.updated).toEqual({
644
+ "default": ''
645
+ });
646
+ });
647
+ });
648
+ describe('parseHTML', function () {
649
+ it('returns parsing rules', function () {
650
+ var rules = _responseArea.DragInTheBlankNode.parseHTML();
651
+ expect(Array.isArray(rules)).toBe(true);
652
+ expect(rules).toHaveLength(1);
653
+ expect(rules[0]).toHaveProperty('tag');
654
+ });
655
+ });
656
+ describe('renderHTML', function () {
657
+ it('renders span with attributes', function () {
658
+ var result = _responseArea.DragInTheBlankNode.renderHTML({
659
+ HTMLAttributes: {
660
+ index: '1',
661
+ id: '1',
662
+ value: 'test'
663
+ }
664
+ });
665
+ expect(result[0]).toBe('span');
666
+ expect(result[1]).toHaveProperty('data-type', 'drag_in_the_blank');
667
+ });
668
+ });
669
+ describe('addNodeView', function () {
670
+ it('returns ReactNodeViewRenderer result', function () {
671
+ var result = _responseArea.DragInTheBlankNode.addNodeView();
672
+ expect(result).toBeDefined();
673
+ });
674
+ });
675
+ });
676
+ describe('InlineDropdownNode', function () {
677
+ describe('configuration', function () {
678
+ it('has correct name', function () {
679
+ expect(_responseArea.InlineDropdownNode.name).toBe('inline_dropdown');
680
+ });
681
+ it('is inline', function () {
682
+ expect(_responseArea.InlineDropdownNode.inline).toBe(true);
683
+ });
684
+ it('is in inline group', function () {
685
+ expect(_responseArea.InlineDropdownNode.group).toBe('inline');
686
+ });
687
+ it('is atomic', function () {
688
+ expect(_responseArea.InlineDropdownNode.atom).toBe(true);
689
+ });
690
+ });
691
+ describe('addAttributes', function () {
692
+ it('returns required attributes', function () {
693
+ var attributes = _responseArea.InlineDropdownNode.addAttributes();
694
+ expect(attributes).toHaveProperty('index');
695
+ expect(attributes).toHaveProperty('value');
696
+ expect(attributes).toHaveProperty('updated');
697
+ expect(attributes.index).toEqual({
698
+ "default": null
699
+ });
700
+ expect(attributes.value).toEqual({
701
+ "default": ''
702
+ });
703
+ expect(attributes.updated).toEqual({
704
+ "default": ''
705
+ });
706
+ });
707
+ });
708
+ describe('parseHTML', function () {
709
+ it('returns parsing rules', function () {
710
+ var rules = _responseArea.InlineDropdownNode.parseHTML();
711
+ expect(Array.isArray(rules)).toBe(true);
712
+ expect(rules).toHaveLength(1);
713
+ expect(rules[0]).toHaveProperty('tag');
714
+ });
715
+ });
716
+ describe('renderHTML', function () {
717
+ it('renders span with attributes', function () {
718
+ var result = _responseArea.InlineDropdownNode.renderHTML({
719
+ HTMLAttributes: {
720
+ index: '1',
721
+ id: '1',
722
+ value: 'test'
723
+ }
724
+ });
725
+ expect(result[0]).toBe('span');
726
+ expect(result[1]).toHaveProperty('data-type', 'inline_dropdown');
727
+ });
728
+ });
729
+ describe('addNodeView', function () {
730
+ it('returns ReactNodeViewRenderer result', function () {
731
+ var result = _responseArea.InlineDropdownNode.addNodeView();
732
+ expect(result).toBeDefined();
733
+ });
734
+ });
735
+ });
736
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVzcG9uc2VBcmVhIiwicmVxdWlyZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiamVzdCIsIm1vY2siLCJFeHRlbnNpb24iLCJjcmVhdGUiLCJmbiIsImNvbmZpZyIsIk5vZGUiLCJSZWFjdE5vZGVWaWV3UmVuZGVyZXIiLCJjb21wb25lbnQiLCJQbHVnaW4iLCJQbHVnaW5LZXkiLCJrZXkiLCJUZXh0U2VsZWN0aW9uIiwibmVhciIsInBvcyIsImRpciIsInR5cGUiLCJkb2MiLCJOb2RlU2VsZWN0aW9uIiwiX19lc01vZHVsZSIsIlJlYWN0IiwiY3JlYXRlRWxlbWVudCIsImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJSZXNwb25zZUFyZWFFeHRlbnNpb24iLCJuYW1lIiwidG9CZSIsIm9wdGlvbnMiLCJhZGRPcHRpb25zIiwidG9IYXZlUHJvcGVydHkiLCJjb250ZXh0IiwicGx1Z2lucyIsImFkZFByb3NlTWlycm9yUGx1Z2lucyIsImNhbGwiLCJBcnJheSIsImlzQXJyYXkiLCJ0b0hhdmVMZW5ndGgiLCJtYXhSZXNwb25zZUFyZWFzIiwiY29tbWFuZHMiLCJhZGRDb21tYW5kcyIsIl90eXBlb2YyIiwiaW5zZXJ0UmVzcG9uc2VBcmVhIiwicmVmcmVzaFJlc3BvbnNlQXJlYSIsInJlZnJlc2hDb21tYW5kIiwibW9ja05vZGUiLCJhdHRycyIsImluZGV4IiwidmFsdWUiLCJtb2NrVHIiLCJzZXROb2RlTWFya3VwIiwic2V0U2VsZWN0aW9uIiwibW9ja1N0YXRlIiwic2VsZWN0aW9uIiwiZnJvbSIsIiRmcm9tIiwibm9kZUFmdGVyIiwidHIiLCJtb2NrQ29tbWFuZHMiLCJmb2N1cyIsIm1vY2tEaXNwYXRjaCIsInN0YXRlIiwiZGlzcGF0Y2giLCJ0b0hhdmVCZWVuQ2FsbGVkIiwibm90IiwidG9UaHJvdyIsInVwZGF0ZWQiLCJ0b0JlRGVmaW5lZCIsImJlZm9yZUVhY2giLCJyZXNldE1vZHVsZXMiLCJidWlsZEluc2VydENvbW1hbmQiLCJ1bmRlZmluZWQiLCJfcmVxdWlyZSIsImNyZWF0ZURvYyIsImV4aXN0aW5nQ291bnQiLCJ0eXBlTmFtZSIsImRlc2NlbmRhbnRzIiwiY2FsbGJhY2siLCJpIiwiY29udGVudCIsInNpemUiLCJpbnNlcnQiLCJtb2NrSW5saW5lTm9kZSIsIm5vZGVTaXplIiwibW9ja0RvYyIsInNjaGVtYSIsIm5vZGVzIiwiaW5saW5lX2Ryb3Bkb3duIiwicmVzdWx0IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJpZCIsInJ1bk9uY2UiLCJjYWxscyIsInRvRXF1YWwiLCJidWlsZFN0YXRlQW5kVHIiLCJfcmVmIiwiX3JlZiR3aXRoUmVzb2x2ZSIsIndpdGhSZXNvbHZlIiwicmVzb2x2ZSIsInJlc29sdmVkIiwiZWFjaCIsInJlcGxhY2UiLCJfYnVpbGRTdGF0ZUFuZFRyIiwiX3JlcXVpcmUyIiwiX2J1aWxkU3RhdGVBbmRUcjIiLCJfcmVxdWlyZTMiLCJFeHBsaWNpdENvbnN0cnVjdGVkUmVzcG9uc2VOb2RlIiwiaW5saW5lIiwiZ3JvdXAiLCJhdG9tIiwiYXR0cmlidXRlcyIsImFkZEF0dHJpYnV0ZXMiLCJydWxlcyIsInBhcnNlSFRNTCIsInJlbmRlckhUTUwiLCJIVE1MQXR0cmlidXRlcyIsImFkZE5vZGVWaWV3IiwiRHJhZ0luVGhlQmxhbmtOb2RlIiwiaW5UYWJsZSIsIklubGluZURyb3Bkb3duTm9kZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leHRlbnNpb25zL19fdGVzdHNfXy9yZXNwb25zZUFyZWEudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEcmFnSW5UaGVCbGFua05vZGUsXG4gIEV4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZU5vZGUsXG4gIElubGluZURyb3Bkb3duTm9kZSxcbiAgUmVzcG9uc2VBcmVhRXh0ZW5zaW9uLFxufSBmcm9tICcuLi9yZXNwb25zZUFyZWEnO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvY29yZScsICgpID0+ICh7XG4gIEV4dGVuc2lvbjogeyBjcmVhdGU6IGplc3QuZm4oKGNvbmZpZykgPT4gY29uZmlnKSB9LFxuICBOb2RlOiB7IGNyZWF0ZTogamVzdC5mbigoY29uZmlnKSA9PiBjb25maWcpIH0sXG59KSk7XG5cbmplc3QubW9jaygnQHRpcHRhcC9yZWFjdCcsICgpID0+ICh7XG4gIE5vZGU6IHsgY3JlYXRlOiBqZXN0LmZuKChjb25maWcpID0+IGNvbmZpZykgfSxcbiAgUmVhY3ROb2RlVmlld1JlbmRlcmVyOiBqZXN0LmZuKChjb21wb25lbnQpID0+IGNvbXBvbmVudCksXG59KSk7XG5cbmplc3QubW9jaygncHJvc2VtaXJyb3Itc3RhdGUnLCAoKSA9PiAoe1xuICBQbHVnaW46IGplc3QuZm4oZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIHJldHVybiBjb25maWc7XG4gIH0pLFxuICBQbHVnaW5LZXk6IGplc3QuZm4oZnVuY3Rpb24gKGtleSkge1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICB9KSxcbiAgVGV4dFNlbGVjdGlvbjoge1xuICAgIG5lYXI6IGplc3QuZm4oKHBvcywgZGlyKSA9PiAoeyB0eXBlOiAndGV4dCcsIHBvcywgZGlyIH0pKSxcbiAgICBjcmVhdGU6IGplc3QuZm4oKGRvYywgcG9zKSA9PiAoeyB0eXBlOiAndGV4dCcsIHBvcyB9KSksXG4gIH0sXG4gIE5vZGVTZWxlY3Rpb246IHtcbiAgICBjcmVhdGU6IGplc3QuZm4oKGRvYywgcG9zKSA9PiAoeyB0eXBlOiAnbm9kZScsIHBvcyB9KSksXG4gIH0sXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9yZXNwQXJlYS9FeHBsaWNpdENvbnN0cnVjdGVkUmVzcG9uc2UnLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZVwiIC8+KSxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi8uLi9jb21wb25lbnRzL3Jlc3BBcmVhL0RyYWdJblRoZUJsYW5rL0RyYWdJblRoZUJsYW5rJywgKCkgPT4gKHtcbiAgX19lc01vZHVsZTogdHJ1ZSxcbiAgZGVmYXVsdDogamVzdC5mbigoKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwiZHJhZy1pbi10aGUtYmxhbmtcIiAvPiksXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9yZXNwQXJlYS9JbmxpbmVEcm9wZG93bicsICgpID0+ICh7XG4gIF9fZXNNb2R1bGU6IHRydWUsXG4gIGRlZmF1bHQ6IGplc3QuZm4oKCkgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImlubGluZS1kcm9wZG93blwiIC8+KSxcbn0pKTtcblxuZGVzY3JpYmUoJ1Jlc3BvbnNlQXJlYUV4dGVuc2lvbicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2NvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2hhcyBjb3JyZWN0IG5hbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoUmVzcG9uc2VBcmVhRXh0ZW5zaW9uLm5hbWUpLnRvQmUoJ3Jlc3BvbnNlQXJlYScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkT3B0aW9ucycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBkZWZhdWx0IG9wdGlvbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0gUmVzcG9uc2VBcmVhRXh0ZW5zaW9uLmFkZE9wdGlvbnMoKTtcblxuICAgICAgZXhwZWN0KG9wdGlvbnMpLnRvSGF2ZVByb3BlcnR5KCdtYXhSZXNwb25zZUFyZWFzJywgbnVsbCk7XG4gICAgICBleHBlY3Qob3B0aW9ucykudG9IYXZlUHJvcGVydHkoJ2Vycm9yJywgbnVsbCk7XG4gICAgICBleHBlY3Qob3B0aW9ucykudG9IYXZlUHJvcGVydHkoJ29wdGlvbnMnLCBudWxsKTtcbiAgICAgIGV4cGVjdChvcHRpb25zKS50b0hhdmVQcm9wZXJ0eSgncmVzcEFyZWFUb29sYmFyJywgbnVsbCk7XG4gICAgICBleHBlY3Qob3B0aW9ucykudG9IYXZlUHJvcGVydHkoJ29uSGFuZGxlQXJlYUNoYW5nZScsIG51bGwpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkUHJvc2VNaXJyb3JQbHVnaW5zJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGVtcHR5IGFycmF5IHdoZW4gbm8gdHlwZSBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICBvcHRpb25zOiB7fSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSBSZXNwb25zZUFyZWFFeHRlbnNpb24uYWRkUHJvc2VNaXJyb3JQbHVnaW5zLmNhbGwoY29udGV4dCk7XG5cbiAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KHBsdWdpbnMpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHBsdWdpbnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIHBsdWdpbiBhcnJheSB3aGVuIHR5cGUgaXMgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHR5cGU6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsXG4gICAgICAgICAgbWF4UmVzcG9uc2VBcmVhczogNSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSBSZXNwb25zZUFyZWFFeHRlbnNpb24uYWRkUHJvc2VNaXJyb3JQbHVnaW5zLmNhbGwoY29udGV4dCk7XG5cbiAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KHBsdWdpbnMpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHBsdWdpbnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgIGV4cGVjdChwbHVnaW5zWzBdKS50b0hhdmVQcm9wZXJ0eSgna2V5Jyk7XG4gICAgICBleHBlY3QocGx1Z2luc1swXSkudG9IYXZlUHJvcGVydHkoJ3ZpZXcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZENvbW1hbmRzJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGluc2VydFJlc3BvbnNlQXJlYSBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHMgPSBSZXNwb25zZUFyZWFFeHRlbnNpb24uYWRkQ29tbWFuZHMoKTtcblxuICAgICAgZXhwZWN0KGNvbW1hbmRzKS50b0hhdmVQcm9wZXJ0eSgnaW5zZXJ0UmVzcG9uc2VBcmVhJyk7XG4gICAgICBleHBlY3QodHlwZW9mIGNvbW1hbmRzLmluc2VydFJlc3BvbnNlQXJlYSkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIHJlZnJlc2hSZXNwb25zZUFyZWEgY29tbWFuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gUmVzcG9uc2VBcmVhRXh0ZW5zaW9uLmFkZENvbW1hbmRzKCk7XG5cbiAgICAgIGV4cGVjdChjb21tYW5kcykudG9IYXZlUHJvcGVydHkoJ3JlZnJlc2hSZXNwb25zZUFyZWEnKTtcbiAgICAgIGV4cGVjdCh0eXBlb2YgY29tbWFuZHMucmVmcmVzaFJlc3BvbnNlQXJlYSkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWZyZXNoUmVzcG9uc2VBcmVhIGhhbmRsZXMgbm9kZSB3aXRoIGF0dHJzIHNhZmVseScsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAgIG1heFJlc3BvbnNlQXJlYXM6IDUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjb21tYW5kcyA9IFJlc3BvbnNlQXJlYUV4dGVuc2lvbi5hZGRDb21tYW5kcy5jYWxsKGNvbnRleHQpO1xuICAgICAgY29uc3QgcmVmcmVzaENvbW1hbmQgPSBjb21tYW5kcy5yZWZyZXNoUmVzcG9uc2VBcmVhKCk7XG5cbiAgICAgIC8vIE1vY2sgdHJhbnNhY3Rpb24gYW5kIHN0YXRlXG4gICAgICBjb25zdCBtb2NrTm9kZSA9IHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBpbmRleDogJzAnLFxuICAgICAgICAgIHZhbHVlOiAndGVzdCcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtb2NrVHIgPSB7XG4gICAgICAgIHNldE5vZGVNYXJrdXA6IGplc3QuZm4oKSxcbiAgICAgICAgc2V0U2VsZWN0aW9uOiBqZXN0LmZuKCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtb2NrU3RhdGUgPSB7XG4gICAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICAgIGZyb206IDAsXG4gICAgICAgICAgJGZyb206IHtcbiAgICAgICAgICAgIG5vZGVBZnRlcjogbW9ja05vZGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdHI6IG1vY2tUcixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1vY2tDb21tYW5kcyA9IHtcbiAgICAgICAgZm9jdXM6IGplc3QuZm4oKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1vY2tEaXNwYXRjaCA9IGplc3QuZm4oKTtcblxuICAgICAgcmVmcmVzaENvbW1hbmQoe1xuICAgICAgICB0cjogbW9ja1RyLFxuICAgICAgICBzdGF0ZTogbW9ja1N0YXRlLFxuICAgICAgICBjb21tYW5kczogbW9ja0NvbW1hbmRzLFxuICAgICAgICBkaXNwYXRjaDogbW9ja0Rpc3BhdGNoLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrVHIuc2V0Tm9kZU1hcmt1cCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlZnJlc2hSZXNwb25zZUFyZWEgaGFuZGxlcyBub2RlIHdpdGhvdXQgYXR0cnMgc2FmZWx5IChvcHRpb25hbCBjaGFpbmluZyknLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdHlwZTogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJyxcbiAgICAgICAgICBtYXhSZXNwb25zZUFyZWFzOiA1LFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29tbWFuZHMgPSBSZXNwb25zZUFyZWFFeHRlbnNpb24uYWRkQ29tbWFuZHMuY2FsbChjb250ZXh0KTtcbiAgICAgIGNvbnN0IHJlZnJlc2hDb21tYW5kID0gY29tbWFuZHMucmVmcmVzaFJlc3BvbnNlQXJlYSgpO1xuXG4gICAgICAvLyBNb2NrIHRyYW5zYWN0aW9uIGFuZCBzdGF0ZSB3aXRoIG5vZGUgdGhhdCBoYXMgbm8gYXR0cnNcbiAgICAgIGNvbnN0IG1vY2tOb2RlID0gbnVsbDtcblxuICAgICAgY29uc3QgbW9ja1RyID0ge1xuICAgICAgICBzZXROb2RlTWFya3VwOiBqZXN0LmZuKCksXG4gICAgICAgIHNldFNlbGVjdGlvbjogamVzdC5mbigpLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbW9ja1N0YXRlID0ge1xuICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICRmcm9tOiB7XG4gICAgICAgICAgICBub2RlQWZ0ZXI6IG1vY2tOb2RlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRyOiBtb2NrVHIsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtb2NrQ29tbWFuZHMgPSB7XG4gICAgICAgIGZvY3VzOiBqZXN0LmZuKCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtb2NrRGlzcGF0Y2ggPSBqZXN0LmZuKCk7XG5cbiAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCB0aHJvdyBhbiBlcnJvciBkdWUgdG8gb3B0aW9uYWwgY2hhaW5pbmcgb24gbm9kZT8uYXR0cnNcbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIHJlZnJlc2hDb21tYW5kKHtcbiAgICAgICAgICB0cjogbW9ja1RyLFxuICAgICAgICAgIHN0YXRlOiBtb2NrU3RhdGUsXG4gICAgICAgICAgY29tbWFuZHM6IG1vY2tDb21tYW5kcyxcbiAgICAgICAgICBkaXNwYXRjaDogbW9ja0Rpc3BhdGNoLFxuICAgICAgICB9KTtcbiAgICAgIH0pLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVmcmVzaFJlc3BvbnNlQXJlYSB1cGRhdGVzIHRpbWVzdGFtcCBpbiBub2RlIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdHlwZTogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJyxcbiAgICAgICAgICBtYXhSZXNwb25zZUFyZWFzOiA1LFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29tbWFuZHMgPSBSZXNwb25zZUFyZWFFeHRlbnNpb24uYWRkQ29tbWFuZHMuY2FsbChjb250ZXh0KTtcbiAgICAgIGNvbnN0IHJlZnJlc2hDb21tYW5kID0gY29tbWFuZHMucmVmcmVzaFJlc3BvbnNlQXJlYSgpO1xuXG4gICAgICBjb25zdCBtb2NrTm9kZSA9IHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBpbmRleDogJzAnLFxuICAgICAgICAgIHZhbHVlOiAndGVzdCcsXG4gICAgICAgICAgdXBkYXRlZDogJzEyMzQ1Njc4OTAnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbW9ja1RyID0ge1xuICAgICAgICBzZXROb2RlTWFya3VwOiBqZXN0LmZuKChwb3MsIHR5cGUsIGF0dHJzKSA9PiB7XG4gICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdXBkYXRlZCB0aW1lc3RhbXAgaXMgYmVpbmcgc2V0XG4gICAgICAgICAgZXhwZWN0KGF0dHJzLnVwZGF0ZWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICAgICAgZXhwZWN0KGF0dHJzLnVwZGF0ZWQpLm5vdC50b0JlKCcxMjM0NTY3ODkwJyk7XG4gICAgICAgIH0pLFxuICAgICAgICBzZXRTZWxlY3Rpb246IGplc3QuZm4oKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAkZnJvbToge1xuICAgICAgICAgICAgbm9kZUFmdGVyOiBtb2NrTm9kZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB0cjogbW9ja1RyLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbW9ja0NvbW1hbmRzID0ge1xuICAgICAgICBmb2N1czogamVzdC5mbigpLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbW9ja0Rpc3BhdGNoID0gamVzdC5mbigpO1xuXG4gICAgICByZWZyZXNoQ29tbWFuZCh7XG4gICAgICAgIHRyOiBtb2NrVHIsXG4gICAgICAgIHN0YXRlOiBtb2NrU3RhdGUsXG4gICAgICAgIGNvbW1hbmRzOiBtb2NrQ29tbWFuZHMsXG4gICAgICAgIGRpc3BhdGNoOiBtb2NrRGlzcGF0Y2gsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tUci5zZXROb2RlTWFya3VwKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaW5zZXJ0UmVzcG9uc2VBcmVhJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGplc3QucmVzZXRNb2R1bGVzKCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYnVpbGRJbnNlcnRDb21tYW5kID0gKHR5cGUgPSAnaW5saW5lLWRyb3Bkb3duJykgPT4ge1xuICAgICAgICBjb25zdCB7IFJlc3BvbnNlQXJlYUV4dGVuc2lvbiB9ID0gcmVxdWlyZSgnLi4vcmVzcG9uc2VBcmVhJyk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG1heFJlc3BvbnNlQXJlYXM6IDUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY29tbWFuZHMgPSBSZXNwb25zZUFyZWFFeHRlbnNpb24uYWRkQ29tbWFuZHMuY2FsbChjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLmluc2VydFJlc3BvbnNlQXJlYSh0eXBlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNyZWF0ZURvYyA9IChleGlzdGluZ0NvdW50LCB0eXBlTmFtZSA9ICdpbmxpbmVfZHJvcGRvd24nKSA9PiAoe1xuICAgICAgICBkZXNjZW5kYW50czogamVzdC5mbigoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nQ291bnQ7IGkgKz0gMSkge1xuICAgICAgICAgICAgY2FsbGJhY2soeyB0eXBlOiB7IG5hbWU6IHR5cGVOYW1lIH0gfSwgaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY29udGVudDogeyBzaXplOiA1MCB9LFxuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhc3NpZ25zIGluZGV4IDEgYW5kIGlkIDEgb24gdGhlIGZpcnN0IGluc2VydCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0ID0gYnVpbGRJbnNlcnRDb21tYW5kKCk7XG4gICAgICAgIGNvbnN0IG1vY2tJbmxpbmVOb2RlID0geyBub2RlU2l6ZTogMSB9O1xuICAgICAgICBjb25zdCBjcmVhdGUgPSBqZXN0LmZuKCgpID0+IG1vY2tJbmxpbmVOb2RlKTtcbiAgICAgICAgY29uc3QgbW9ja0RvYyA9IGNyZWF0ZURvYygwKTtcbiAgICAgICAgY29uc3QgbW9ja1RyID0ge1xuICAgICAgICAgIGluc2VydDogamVzdC5mbigpLFxuICAgICAgICAgIGRvYzogbW9ja0RvYyxcbiAgICAgICAgICBzZXRTZWxlY3Rpb246IGplc3QuZm4oKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICBub2Rlczoge1xuICAgICAgICAgICAgICBpbmxpbmVfZHJvcGRvd246IHsgY3JlYXRlIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZG9jOiBtb2NrRG9jLFxuICAgICAgICAgIHNlbGVjdGlvbjogeyBmcm9tOiA1IH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1vY2tEaXNwYXRjaCA9IGplc3QuZm4oKTtcbiAgICAgICAgY29uc3QgbW9ja0NvbW1hbmRzID0geyBmb2N1czogamVzdC5mbigpIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5zZXJ0KHtcbiAgICAgICAgICB0cjogbW9ja1RyLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGRpc3BhdGNoOiBtb2NrRGlzcGF0Y2gsXG4gICAgICAgICAgY29tbWFuZHM6IG1vY2tDb21tYW5kcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICAgICAgZXhwZWN0KGNyZWF0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgICAgIGluZGV4OiAnMScsXG4gICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QobW9ja1RyLmluc2VydCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoNSwgbW9ja0lubGluZU5vZGUpO1xuICAgICAgICBleHBlY3QobW9ja0Rpc3BhdGNoKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2Fzc2lnbnMgY29uc2VjdXRpdmUgaW5kaWNlcyBvbiByZXBlYXRlZCBpbnNlcnRzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbnNlcnQgPSBidWlsZEluc2VydENvbW1hbmQoKTtcbiAgICAgICAgY29uc3QgbW9ja0lubGluZU5vZGUgPSB7IG5vZGVTaXplOiAxIH07XG4gICAgICAgIGNvbnN0IGNyZWF0ZSA9IGplc3QuZm4oKCkgPT4gbW9ja0lubGluZU5vZGUpO1xuICAgICAgICBjb25zdCBtb2NrRG9jID0gY3JlYXRlRG9jKDApO1xuXG4gICAgICAgIGNvbnN0IHJ1bk9uY2UgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbW9ja1RyID0ge1xuICAgICAgICAgICAgaW5zZXJ0OiBqZXN0LmZuKCksXG4gICAgICAgICAgICBkb2M6IG1vY2tEb2MsXG4gICAgICAgICAgICBzZXRTZWxlY3Rpb246IGplc3QuZm4oKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICAgIG5vZGVzOiB7XG4gICAgICAgICAgICAgICAgaW5saW5lX2Ryb3Bkb3duOiB7IGNyZWF0ZSB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRvYzogbW9ja0RvYyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogeyBmcm9tOiAxIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpbnNlcnQoe1xuICAgICAgICAgICAgdHI6IG1vY2tUcixcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICAgICAgICAgIGNvbW1hbmRzOiB7IGZvY3VzOiBqZXN0LmZuKCkgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBydW5PbmNlKCk7XG4gICAgICAgIHJ1bk9uY2UoKTtcblxuICAgICAgICBleHBlY3QoY3JlYXRlLm1vY2suY2FsbHNbMF1bMF0pLnRvRXF1YWwoeyBpbmRleDogJzEnLCBpZDogJzEnLCB2YWx1ZTogJycgfSk7XG4gICAgICAgIGV4cGVjdChjcmVhdGUubW9jay5jYWxsc1sxXVswXSkudG9FcXVhbCh7IGluZGV4OiAnMicsIGlkOiAnMicsIHZhbHVlOiAnJyB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBmYWxzZSB3aGVuIG1heFJlc3BvbnNlQXJlYXMgaXMgcmVhY2hlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0ID0gYnVpbGRJbnNlcnRDb21tYW5kKCk7XG4gICAgICAgIGNvbnN0IG1vY2tJbmxpbmVOb2RlID0geyBub2RlU2l6ZTogMSB9O1xuICAgICAgICBjb25zdCBjcmVhdGUgPSBqZXN0LmZuKCgpID0+IG1vY2tJbmxpbmVOb2RlKTtcbiAgICAgICAgY29uc3QgbW9ja0RvYyA9IGNyZWF0ZURvYyg1KTtcbiAgICAgICAgY29uc3QgbW9ja1RyID0ge1xuICAgICAgICAgIGluc2VydDogamVzdC5mbigpLFxuICAgICAgICAgIGRvYzogbW9ja0RvYyxcbiAgICAgICAgICBzZXRTZWxlY3Rpb246IGplc3QuZm4oKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICBub2Rlczoge1xuICAgICAgICAgICAgICBpbmxpbmVfZHJvcGRvd246IHsgY3JlYXRlIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZG9jOiBtb2NrRG9jLFxuICAgICAgICAgIHNlbGVjdGlvbjogeyBmcm9tOiA1IH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5zZXJ0KHtcbiAgICAgICAgICB0cjogbW9ja1RyLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGRpc3BhdGNoOiBqZXN0LmZuKCksXG4gICAgICAgICAgY29tbWFuZHM6IHsgZm9jdXM6IGplc3QuZm4oKSB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICAgICAgZXhwZWN0KGNyZWF0ZSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgZXhwZWN0KG1vY2tUci5pbnNlcnQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3NlbGVjdGlvbiBhZnRlciBpbnNlcnQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkU3RhdGVBbmRUciA9ICh0eXBlTmFtZSwgeyB3aXRoUmVzb2x2ZSA9IGZhbHNlIH0gPSB7fSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1vY2tJbmxpbmVOb2RlID0geyBub2RlU2l6ZTogMSB9O1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZSA9IGplc3QuZm4oKCkgPT4gbW9ja0lubGluZU5vZGUpO1xuICAgICAgICAgIGNvbnN0IG1vY2tEb2MgPSB7XG4gICAgICAgICAgICBkZXNjZW5kYW50czogamVzdC5mbigpLFxuICAgICAgICAgICAgY29udGVudDogeyBzaXplOiA1MCB9LFxuICAgICAgICAgICAgLi4uKHdpdGhSZXNvbHZlID8geyByZXNvbHZlOiBqZXN0LmZuKChwb3MpID0+ICh7IHJlc29sdmVkOiBwb3MgfSkpIH0gOiB7fSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBtb2NrVHIgPSB7XG4gICAgICAgICAgICBpbnNlcnQ6IGplc3QuZm4oKSxcbiAgICAgICAgICAgIGRvYzogbW9ja0RvYyxcbiAgICAgICAgICAgIHNldFNlbGVjdGlvbjogamVzdC5mbigpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgICBzY2hlbWE6IHsgbm9kZXM6IHsgW3R5cGVOYW1lXTogeyBjcmVhdGUgfSB9IH0sXG4gICAgICAgICAgICBkb2M6IG1vY2tEb2MsXG4gICAgICAgICAgICBzZWxlY3Rpb246IHsgZnJvbTogNSB9LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4geyBtb2NrVHIsIHN0YXRlIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgaXQuZWFjaChbJ2lubGluZS1kcm9wZG93bicsICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZSddKShcbiAgICAgICAgICAnc2V0cyBhIE5vZGVTZWxlY3Rpb24gb24gdGhlIGluc2VydGVkIG5vZGUgZm9yICVzJyxcbiAgICAgICAgICAodHlwZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0ID0gYnVpbGRJbnNlcnRDb21tYW5kKHR5cGUpO1xuICAgICAgICAgICAgY29uc3QgdHlwZU5hbWUgPSB0eXBlLnJlcGxhY2UoLy0vZywgJ18nKTtcbiAgICAgICAgICAgIGNvbnN0IHsgbW9ja1RyLCBzdGF0ZSB9ID0gYnVpbGRTdGF0ZUFuZFRyKHR5cGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHsgTm9kZVNlbGVjdGlvbiwgVGV4dFNlbGVjdGlvbiB9ID0gcmVxdWlyZSgncHJvc2VtaXJyb3Itc3RhdGUnKTtcblxuICAgICAgICAgICAgaW5zZXJ0KHsgdHI6IG1vY2tUciwgc3RhdGUsIGRpc3BhdGNoOiBqZXN0LmZuKCksIGNvbW1hbmRzOiB7IGZvY3VzOiBqZXN0LmZuKCkgfSB9KTtcblxuICAgICAgICAgICAgZXhwZWN0KE5vZGVTZWxlY3Rpb24uY3JlYXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChtb2NrVHIuZG9jLCA1KTtcbiAgICAgICAgICAgIGV4cGVjdChUZXh0U2VsZWN0aW9uLm5lYXIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgICAgICBleHBlY3QobW9ja1RyLnNldFNlbGVjdGlvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoeyB0eXBlOiAnbm9kZScsIHBvczogNSB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGl0KCdzZXRzIGEgVGV4dFNlbGVjdGlvbiBqdXN0IGFmdGVyIHRoZSBpbnNlcnRlZCBub2RlIGZvciBtYXRoLXRlbXBsYXRlZCAobm8gTm9kZVNlbGVjdGlvbiknLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0ID0gYnVpbGRJbnNlcnRDb21tYW5kKCdtYXRoLXRlbXBsYXRlZCcpO1xuICAgICAgICAgIGNvbnN0IHsgbW9ja1RyLCBzdGF0ZSB9ID0gYnVpbGRTdGF0ZUFuZFRyKCdtYXRoX3RlbXBsYXRlZCcsIHsgd2l0aFJlc29sdmU6IHRydWUgfSk7XG4gICAgICAgICAgY29uc3QgeyBOb2RlU2VsZWN0aW9uLCBUZXh0U2VsZWN0aW9uIH0gPSByZXF1aXJlKCdwcm9zZW1pcnJvci1zdGF0ZScpO1xuXG4gICAgICAgICAgaW5zZXJ0KHsgdHI6IG1vY2tUciwgc3RhdGUsIGRpc3BhdGNoOiBqZXN0LmZuKCksIGNvbW1hbmRzOiB7IGZvY3VzOiBqZXN0LmZuKCkgfSB9KTtcblxuICAgICAgICAgIGV4cGVjdChOb2RlU2VsZWN0aW9uLmNyZWF0ZSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgICAvLyB1c2VkUG9zICg1KSArIG5vZGVTaXplICgxKSA9PT0gNlxuICAgICAgICAgIGV4cGVjdChtb2NrVHIuZG9jLnJlc29sdmUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDYpO1xuICAgICAgICAgIGV4cGVjdChUZXh0U2VsZWN0aW9uLm5lYXIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHsgcmVzb2x2ZWQ6IDYgfSwgMSk7XG4gICAgICAgICAgZXhwZWN0KG1vY2tUci5zZXRTZWxlY3Rpb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHsgdHlwZTogJ3RleHQnLCBwb3M6IHsgcmVzb2x2ZWQ6IDYgfSwgZGlyOiAxIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnRXhwbGljaXRDb25zdHJ1Y3RlZFJlc3BvbnNlTm9kZScsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2NvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2hhcyBjb3JyZWN0IG5hbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoRXhwbGljaXRDb25zdHJ1Y3RlZFJlc3BvbnNlTm9kZS5uYW1lKS50b0JlKCdleHBsaWNpdF9jb25zdHJ1Y3RlZF9yZXNwb25zZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGlubGluZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChFeHBsaWNpdENvbnN0cnVjdGVkUmVzcG9uc2VOb2RlLmlubGluZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbiBpbmxpbmUgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoRXhwbGljaXRDb25zdHJ1Y3RlZFJlc3BvbnNlTm9kZS5ncm91cCkudG9CZSgnaW5saW5lJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgYXRvbWljJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KEV4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZU5vZGUuYXRvbSkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZEF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgcmVxdWlyZWQgYXR0cmlidXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBFeHBsaWNpdENvbnN0cnVjdGVkUmVzcG9uc2VOb2RlLmFkZEF0dHJpYnV0ZXMoKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdpbmRleCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd2YWx1ZScpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd1cGRhdGVkJyk7XG5cbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLmluZGV4KS50b0VxdWFsKHsgZGVmYXVsdDogbnVsbCB9KTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnZhbHVlKS50b0VxdWFsKHsgZGVmYXVsdDogJycgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy51cGRhdGVkKS50b0VxdWFsKHsgZGVmYXVsdDogJycgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZUhUTUwnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgcGFyc2luZyBydWxlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJ1bGVzID0gRXhwbGljaXRDb25zdHJ1Y3RlZFJlc3BvbnNlTm9kZS5wYXJzZUhUTUwoKTtcblxuICAgICAgZXhwZWN0KEFycmF5LmlzQXJyYXkocnVsZXMpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJ1bGVzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICBleHBlY3QocnVsZXNbMF0pLnRvSGF2ZVByb3BlcnR5KCd0YWcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbmRlckhUTUwnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgc3BhbiB3aXRoIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBFeHBsaWNpdENvbnN0cnVjdGVkUmVzcG9uc2VOb2RlLnJlbmRlckhUTUwoe1xuICAgICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4OiAnMScsXG4gICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICB2YWx1ZTogJ3Rlc3QnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ3NwYW4nKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdkYXRhLXR5cGUnLCAnZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2UnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZE5vZGVWaWV3JywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIFJlYWN0Tm9kZVZpZXdSZW5kZXJlciByZXN1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBFeHBsaWNpdENvbnN0cnVjdGVkUmVzcG9uc2VOb2RlLmFkZE5vZGVWaWV3KCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdEcmFnSW5UaGVCbGFua05vZGUnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdoYXMgY29ycmVjdCBuYW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KERyYWdJblRoZUJsYW5rTm9kZS5uYW1lKS50b0JlKCdkcmFnX2luX3RoZV9ibGFuaycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGlubGluZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChEcmFnSW5UaGVCbGFua05vZGUuaW5saW5lKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGluIGlubGluZSBncm91cCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChEcmFnSW5UaGVCbGFua05vZGUuZ3JvdXApLnRvQmUoJ2lubGluZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGF0b21pYycsICgpID0+IHtcbiAgICAgIGV4cGVjdChEcmFnSW5UaGVCbGFua05vZGUuYXRvbSkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZEF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgcmVxdWlyZWQgYXR0cmlidXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBEcmFnSW5UaGVCbGFua05vZGUuYWRkQXR0cmlidXRlcygpO1xuXG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ2luZGV4Jyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ2lkJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ3ZhbHVlJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ2luVGFibGUnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndXBkYXRlZCcpO1xuXG4gICAgICBleHBlY3QoYXR0cmlidXRlcy5pbmRleCkudG9FcXVhbCh7IGRlZmF1bHQ6IG51bGwgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy5pZCkudG9FcXVhbCh7IGRlZmF1bHQ6IG51bGwgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy52YWx1ZSkudG9FcXVhbCh7IGRlZmF1bHQ6ICcnIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuaW5UYWJsZSkudG9FcXVhbCh7IGRlZmF1bHQ6IG51bGwgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy51cGRhdGVkKS50b0VxdWFsKHsgZGVmYXVsdDogJycgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZUhUTUwnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgcGFyc2luZyBydWxlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJ1bGVzID0gRHJhZ0luVGhlQmxhbmtOb2RlLnBhcnNlSFRNTCgpO1xuXG4gICAgICBleHBlY3QoQXJyYXkuaXNBcnJheShydWxlcykpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QocnVsZXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgIGV4cGVjdChydWxlc1swXSkudG9IYXZlUHJvcGVydHkoJ3RhZycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVySFRNTCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBzcGFuIHdpdGggYXR0cmlidXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IERyYWdJblRoZUJsYW5rTm9kZS5yZW5kZXJIVE1MKHtcbiAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBpbmRleDogJzEnLFxuICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgdmFsdWU6ICd0ZXN0JyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0WzBdKS50b0JlKCdzcGFuJyk7XG4gICAgICBleHBlY3QocmVzdWx0WzFdKS50b0hhdmVQcm9wZXJ0eSgnZGF0YS10eXBlJywgJ2RyYWdfaW5fdGhlX2JsYW5rJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGROb2RlVmlldycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBSZWFjdE5vZGVWaWV3UmVuZGVyZXIgcmVzdWx0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gRHJhZ0luVGhlQmxhbmtOb2RlLmFkZE5vZGVWaWV3KCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdJbmxpbmVEcm9wZG93bk5vZGUnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdoYXMgY29ycmVjdCBuYW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KElubGluZURyb3Bkb3duTm9kZS5uYW1lKS50b0JlKCdpbmxpbmVfZHJvcGRvd24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbmxpbmUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoSW5saW5lRHJvcGRvd25Ob2RlLmlubGluZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbiBpbmxpbmUgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoSW5saW5lRHJvcGRvd25Ob2RlLmdyb3VwKS50b0JlKCdpbmxpbmUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBhdG9taWMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoSW5saW5lRHJvcGRvd25Ob2RlLmF0b20pLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRBdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHJlcXVpcmVkIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gSW5saW5lRHJvcGRvd25Ob2RlLmFkZEF0dHJpYnV0ZXMoKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdpbmRleCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd2YWx1ZScpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd1cGRhdGVkJyk7XG5cbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLmluZGV4KS50b0VxdWFsKHsgZGVmYXVsdDogbnVsbCB9KTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnZhbHVlKS50b0VxdWFsKHsgZGVmYXVsdDogJycgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy51cGRhdGVkKS50b0VxdWFsKHsgZGVmYXVsdDogJycgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZUhUTUwnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgcGFyc2luZyBydWxlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJ1bGVzID0gSW5saW5lRHJvcGRvd25Ob2RlLnBhcnNlSFRNTCgpO1xuXG4gICAgICBleHBlY3QoQXJyYXkuaXNBcnJheShydWxlcykpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QocnVsZXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgIGV4cGVjdChydWxlc1swXSkudG9IYXZlUHJvcGVydHkoJ3RhZycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVySFRNTCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBzcGFuIHdpdGggYXR0cmlidXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IElubGluZURyb3Bkb3duTm9kZS5yZW5kZXJIVE1MKHtcbiAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBpbmRleDogJzEnLFxuICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgdmFsdWU6ICd0ZXN0JyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0WzBdKS50b0JlKCdzcGFuJyk7XG4gICAgICBleHBlY3QocmVzdWx0WzFdKS50b0hhdmVQcm9wZXJ0eSgnZGF0YS10eXBlJywgJ2lubGluZV9kcm9wZG93bicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkTm9kZVZpZXcnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgUmVhY3ROb2RlVmlld1JlbmRlcmVyIHJlc3VsdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IElubGluZURyb3Bkb3duTm9kZS5hZGROb2RlVmlldygpO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUFBLGFBQUEsR0FBQUMsT0FBQTtBQUt5QixTQUFBQyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFB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