@payloadcms/richtext-lexical 0.1.16 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/cell/index.d.ts.map +1 -1
  2. package/dist/cell/index.js +2 -6
  3. package/dist/field/Field.d.ts.map +1 -1
  4. package/dist/field/Field.js +2 -2
  5. package/dist/field/features/Blocks/component/BlockContent.d.ts +3 -2
  6. package/dist/field/features/Blocks/component/BlockContent.d.ts.map +1 -1
  7. package/dist/field/features/Blocks/component/BlockContent.js +48 -28
  8. package/dist/field/features/Blocks/component/FormSavePlugin.d.ts +4 -6
  9. package/dist/field/features/Blocks/component/FormSavePlugin.d.ts.map +1 -1
  10. package/dist/field/features/Blocks/component/FormSavePlugin.js +5 -6
  11. package/dist/field/features/Blocks/component/index.d.ts +5 -4
  12. package/dist/field/features/Blocks/component/index.d.ts.map +1 -1
  13. package/dist/field/features/Blocks/component/index.js +33 -22
  14. package/dist/field/features/Blocks/drawer/index.d.ts.map +1 -1
  15. package/dist/field/features/Blocks/drawer/index.js +7 -9
  16. package/dist/field/features/Blocks/index.d.ts.map +1 -1
  17. package/dist/field/features/Blocks/index.js +11 -22
  18. package/dist/field/features/Blocks/nodes/BlocksNode.d.ts +5 -7
  19. package/dist/field/features/Blocks/nodes/BlocksNode.d.ts.map +1 -1
  20. package/dist/field/features/Blocks/nodes/BlocksNode.js +31 -10
  21. package/dist/field/features/Blocks/plugin/index.d.ts +1 -1
  22. package/dist/field/features/Blocks/plugin/index.d.ts.map +1 -1
  23. package/dist/field/features/Blocks/plugin/index.js +1 -1
  24. package/dist/field/features/Blocks/populationPromise.js +2 -2
  25. package/dist/field/features/Blocks/utils/transformInputFormData.d.ts +11 -0
  26. package/dist/field/features/Blocks/utils/transformInputFormData.d.ts.map +1 -0
  27. package/dist/field/features/Blocks/utils/transformInputFormData.js +35 -0
  28. package/dist/field/features/Blocks/utils/transformInputFormSchema.d.ts +3 -0
  29. package/dist/field/features/Blocks/utils/transformInputFormSchema.d.ts.map +1 -0
  30. package/dist/field/features/Blocks/utils/transformInputFormSchema.js +43 -0
  31. package/dist/field/features/Blocks/validate.d.ts.map +1 -1
  32. package/dist/field/features/Blocks/validate.js +11 -4
  33. package/dist/field/features/Link/plugins/autoLink/index.d.ts.map +1 -1
  34. package/dist/field/features/Link/plugins/autoLink/index.js +142 -32
  35. package/dist/field/features/Relationship/nodes/RelationshipNode.js +2 -2
  36. package/dist/field/features/converters/html/field/index.d.ts +17 -1
  37. package/dist/field/features/converters/html/field/index.d.ts.map +1 -1
  38. package/dist/field/features/converters/html/field/index.js +57 -18
  39. package/dist/field/features/debug/TestRecorder/index.d.ts +3 -0
  40. package/dist/field/features/debug/TestRecorder/index.d.ts.map +1 -0
  41. package/dist/field/features/debug/TestRecorder/index.js +29 -0
  42. package/dist/field/features/debug/TestRecorder/plugin/index.d.ts +5 -0
  43. package/dist/field/features/debug/TestRecorder/plugin/index.d.ts.map +1 -0
  44. package/dist/field/features/debug/TestRecorder/plugin/index.js +498 -0
  45. package/dist/field/features/debug/TestRecorder/plugin/index.scss +51 -0
  46. package/dist/field/features/debug/TreeView/index.js +2 -2
  47. package/dist/field/features/types.d.ts +16 -0
  48. package/dist/field/features/types.d.ts.map +1 -1
  49. package/dist/field/lexical/LexicalEditor.d.ts.map +1 -1
  50. package/dist/field/lexical/LexicalEditor.js +14 -2
  51. package/dist/field/lexical/plugins/FloatingSelectToolbar/ToolbarButton/index.d.ts.map +1 -1
  52. package/dist/field/lexical/plugins/FloatingSelectToolbar/ToolbarButton/index.js +7 -1
  53. package/dist/field/lexical/plugins/FloatingSelectToolbar/ToolbarDropdown/DropDown.d.ts.map +1 -1
  54. package/dist/field/lexical/plugins/FloatingSelectToolbar/ToolbarDropdown/DropDown.js +7 -1
  55. package/dist/field/lexical/plugins/FloatingSelectToolbar/index.d.ts.map +1 -1
  56. package/dist/field/lexical/plugins/FloatingSelectToolbar/index.js +2 -2
  57. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts.map +1 -1
  58. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.js +2 -1
  59. package/dist/field/lexical/ui/ContentEditable.scss +0 -1
  60. package/dist/field/lexical/utils/environment.d.ts +18 -0
  61. package/dist/field/lexical/utils/environment.d.ts.map +1 -0
  62. package/dist/field/lexical/utils/environment.js +58 -0
  63. package/dist/field/lexical/utils/setFloatingElemPosition.d.ts +1 -1
  64. package/dist/field/lexical/utils/setFloatingElemPosition.d.ts.map +1 -1
  65. package/dist/field/lexical/utils/setFloatingElemPosition.js +14 -3
  66. package/dist/field/lexical/utils/setFloatingElemPositionForLinkEditor.d.ts +1 -1
  67. package/dist/field/lexical/utils/setFloatingElemPositionForLinkEditor.d.ts.map +1 -1
  68. package/dist/field/lexical/utils/setFloatingElemPositionForLinkEditor.js +1 -1
  69. package/dist/index.d.ts +2 -0
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +89 -1
  72. package/package.json +16 -16
@@ -0,0 +1,498 @@
1
+ 'use client';
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ function _export(target, all) {
7
+ for(var name in all)Object.defineProperty(target, name, {
8
+ enumerable: true,
9
+ get: all[name]
10
+ });
11
+ }
12
+ _export(exports, {
13
+ isSelectAll: function() {
14
+ return isSelectAll;
15
+ },
16
+ TestRecorderPlugin: function() {
17
+ return TestRecorderPlugin;
18
+ }
19
+ });
20
+ const _LexicalComposerContext = require("@lexical/react/LexicalComposerContext");
21
+ const _lexical = require("lexical");
22
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
23
+ const _environment = require("../../../../lexical/utils/environment");
24
+ require("./index.scss");
25
+ function _getRequireWildcardCache(nodeInterop) {
26
+ if (typeof WeakMap !== "function") return null;
27
+ var cacheBabelInterop = new WeakMap();
28
+ var cacheNodeInterop = new WeakMap();
29
+ return (_getRequireWildcardCache = function(nodeInterop) {
30
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
31
+ })(nodeInterop);
32
+ }
33
+ function _interop_require_wildcard(obj, nodeInterop) {
34
+ if (!nodeInterop && obj && obj.__esModule) {
35
+ return obj;
36
+ }
37
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
38
+ return {
39
+ default: obj
40
+ };
41
+ }
42
+ var cache = _getRequireWildcardCache(nodeInterop);
43
+ if (cache && cache.has(obj)) {
44
+ return cache.get(obj);
45
+ }
46
+ var newObj = {};
47
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
48
+ for(var key in obj){
49
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
50
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
51
+ if (desc && (desc.get || desc.set)) {
52
+ Object.defineProperty(newObj, key, desc);
53
+ } else {
54
+ newObj[key] = obj[key];
55
+ }
56
+ }
57
+ }
58
+ newObj.default = obj;
59
+ if (cache) {
60
+ cache.set(obj, newObj);
61
+ }
62
+ return newObj;
63
+ }
64
+ const copy = (text)=>{
65
+ const textArea = document.createElement('textarea');
66
+ textArea.value = text || '';
67
+ textArea.style.position = 'absolute';
68
+ textArea.style.opacity = '0';
69
+ document.body?.appendChild(textArea);
70
+ textArea.focus();
71
+ textArea.select();
72
+ try {
73
+ const result = document.execCommand('copy');
74
+ // eslint-disable-next-line no-console
75
+ console.log(result);
76
+ } catch (error) {
77
+ console.error(error);
78
+ }
79
+ document.body?.removeChild(textArea);
80
+ };
81
+ const download = (filename, text)=>{
82
+ const a = document.createElement('a');
83
+ a.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text || ''));
84
+ a.setAttribute('download', filename);
85
+ a.style.display = 'none';
86
+ document.body?.appendChild(a);
87
+ a.click();
88
+ document.body?.removeChild(a);
89
+ };
90
+ const formatStep = (step)=>{
91
+ const formatOneStep = (name, value)=>{
92
+ switch(name){
93
+ case 'click':
94
+ {
95
+ return ` await page.mouse.click(${value.x}, ${value.y});`;
96
+ }
97
+ case 'press':
98
+ {
99
+ return ` await page.keyboard.press('${value}');`;
100
+ }
101
+ case 'keydown':
102
+ {
103
+ return ` await page.keyboard.keydown('${value}');`;
104
+ }
105
+ case 'keyup':
106
+ {
107
+ return ` await page.keyboard.keyup('${value}');`;
108
+ }
109
+ case 'type':
110
+ {
111
+ return ` await page.keyboard.type('${value}');`;
112
+ }
113
+ case 'selectAll':
114
+ {
115
+ return ` await selectAll(page);`;
116
+ }
117
+ case 'snapshot':
118
+ {
119
+ return ` await assertHTMLSnapshot(page);
120
+ await assertSelection(page, {
121
+ anchorPath: [${value.anchorPath.toString()}],
122
+ anchorOffset: ${value.anchorOffset},
123
+ focusPath: [${value.focusPath.toString()}],
124
+ focusOffset: ${value.focusOffset},
125
+ });
126
+ `;
127
+ }
128
+ default:
129
+ return ``;
130
+ }
131
+ };
132
+ const formattedStep = formatOneStep(step.name, step.value);
133
+ switch(step.count){
134
+ case 1:
135
+ return formattedStep;
136
+ case 2:
137
+ return [
138
+ formattedStep,
139
+ formattedStep
140
+ ].join(`\n`);
141
+ default:
142
+ return ` await repeat(${step.count}, async () => {
143
+ ${formattedStep}
144
+ );`;
145
+ }
146
+ };
147
+ function isSelectAll(event) {
148
+ return event.keyCode === 65 && (_environment.IS_APPLE ? event.metaKey : event.ctrlKey);
149
+ }
150
+ // stolen from LexicalSelection-test
151
+ function sanitizeSelection(selection) {
152
+ const { anchorNode, focusNode } = selection;
153
+ let { anchorOffset, focusOffset } = selection;
154
+ if (anchorOffset !== 0) {
155
+ anchorOffset--;
156
+ }
157
+ if (focusOffset !== 0) {
158
+ focusOffset--;
159
+ }
160
+ return {
161
+ anchorNode,
162
+ anchorOffset,
163
+ focusNode,
164
+ focusOffset
165
+ };
166
+ }
167
+ function getPathFromNodeToEditor(node, rootElement) {
168
+ let currentNode = node;
169
+ const path = [];
170
+ while(currentNode !== rootElement){
171
+ if (currentNode !== null && currentNode !== undefined) {
172
+ path.unshift(Array.from(currentNode?.parentNode?.childNodes ?? []).indexOf(currentNode));
173
+ }
174
+ currentNode = currentNode?.parentNode;
175
+ }
176
+ return path;
177
+ }
178
+ const keyPresses = new Set([
179
+ 'Enter',
180
+ 'Backspace',
181
+ 'Delete',
182
+ 'Escape',
183
+ 'ArrowLeft',
184
+ 'ArrowRight',
185
+ 'ArrowUp',
186
+ 'ArrowDown'
187
+ ]);
188
+ function useTestRecorder(editor) {
189
+ const [steps, setSteps] = (0, _react.useState)([]);
190
+ const [isRecording, setIsRecording] = (0, _react.useState)(false);
191
+ const [, setCurrentInnerHTML] = (0, _react.useState)('');
192
+ const [templatedTest, setTemplatedTest] = (0, _react.useState)('');
193
+ const previousSelectionRef = (0, _react.useRef)(null);
194
+ const skipNextSelectionChangeRef = (0, _react.useRef)(false);
195
+ const preRef = (0, _react.useRef)(null);
196
+ const getCurrentEditor = (0, _react.useCallback)(()=>{
197
+ return editor;
198
+ }, [
199
+ editor
200
+ ]);
201
+ const generateTestContent = (0, _react.useCallback)(()=>{
202
+ const rootElement = editor.getRootElement();
203
+ const browserSelection = window.getSelection();
204
+ if (rootElement == null || browserSelection == null || browserSelection.anchorNode == null || browserSelection.focusNode == null || !rootElement.contains(browserSelection.anchorNode) || !rootElement.contains(browserSelection.focusNode)) {
205
+ return null;
206
+ }
207
+ return `
208
+ import {
209
+ initializeE2E,
210
+ assertHTMLSnapshot,
211
+ assertSelection,
212
+ repeat,
213
+ } from '../utils';
214
+ import {selectAll} from '../keyboardShortcuts';
215
+ import { RangeSelection } from 'lexical';
216
+ import { NodeSelection } from 'lexical';
217
+
218
+ describe('Test case', () => {
219
+ initializeE2E((e2e) => {
220
+ it('Should pass this test', async () => {
221
+ const {page} = e2e;
222
+
223
+ await page.focus('div[contenteditable="true"]');
224
+ ${steps.map(formatStep).join(`\n`)}
225
+ });
226
+ });
227
+ `;
228
+ }, [
229
+ editor,
230
+ steps
231
+ ]);
232
+ // just a wrapper around inserting new actions so that we can
233
+ // coalesce some actions like insertText/moveNativeSelection
234
+ const pushStep = (0, _react.useCallback)((name, value)=>{
235
+ setSteps((currentSteps)=>{
236
+ // trying to group steps
237
+ const currentIndex = steps.length - 1;
238
+ const lastStep = steps[currentIndex];
239
+ if (lastStep) {
240
+ if (lastStep.name === name) {
241
+ if (name === 'type') {
242
+ // for typing events we just append the text
243
+ return [
244
+ ...steps.slice(0, currentIndex),
245
+ {
246
+ ...lastStep,
247
+ value: lastStep.value + value
248
+ }
249
+ ];
250
+ } else {
251
+ // for other events we bump the counter if their values are the same
252
+ if (lastStep.value === value) {
253
+ return [
254
+ ...steps.slice(0, currentIndex),
255
+ {
256
+ ...lastStep,
257
+ count: lastStep.count + 1
258
+ }
259
+ ];
260
+ }
261
+ }
262
+ }
263
+ }
264
+ // could not group, just append a new one
265
+ return [
266
+ ...currentSteps,
267
+ {
268
+ name,
269
+ count: 1,
270
+ value
271
+ }
272
+ ];
273
+ });
274
+ }, [
275
+ steps,
276
+ setSteps
277
+ ]);
278
+ (0, _react.useLayoutEffect)(()=>{
279
+ const onKeyDown = (event)=>{
280
+ if (!isRecording) {
281
+ return;
282
+ }
283
+ const key = event.key;
284
+ if (isSelectAll(event)) {
285
+ pushStep('selectAll', '');
286
+ } else if (keyPresses.has(key)) {
287
+ pushStep('press', event.key);
288
+ } else if ([
289
+ ...key
290
+ ].length > 1) {
291
+ pushStep('keydown', event.key);
292
+ } else {
293
+ pushStep('type', event.key);
294
+ }
295
+ };
296
+ const onKeyUp = (event)=>{
297
+ if (!isRecording) {
298
+ return;
299
+ }
300
+ const key = event.key;
301
+ if (!keyPresses.has(key) && [
302
+ ...key
303
+ ].length > 1) {
304
+ pushStep('keyup', event.key);
305
+ }
306
+ };
307
+ return editor.registerRootListener((rootElement, prevRootElement)=>{
308
+ if (prevRootElement !== null) {
309
+ prevRootElement.removeEventListener('keydown', onKeyDown);
310
+ prevRootElement.removeEventListener('keyup', onKeyUp);
311
+ }
312
+ if (rootElement !== null) {
313
+ rootElement.addEventListener('keydown', onKeyDown);
314
+ rootElement.addEventListener('keyup', onKeyUp);
315
+ }
316
+ });
317
+ }, [
318
+ editor,
319
+ isRecording,
320
+ pushStep
321
+ ]);
322
+ (0, _react.useLayoutEffect)(()=>{
323
+ if (preRef.current) {
324
+ preRef.current.scrollTo(0, preRef.current.scrollHeight);
325
+ }
326
+ }, [
327
+ generateTestContent
328
+ ]);
329
+ (0, _react.useEffect)(()=>{
330
+ if (steps) {
331
+ const testContent = generateTestContent();
332
+ if (testContent !== null) {
333
+ setTemplatedTest(testContent);
334
+ }
335
+ if (preRef.current) {
336
+ preRef.current.scrollTo(0, preRef.current.scrollHeight);
337
+ }
338
+ }
339
+ }, [
340
+ generateTestContent,
341
+ steps
342
+ ]);
343
+ (0, _react.useEffect)(()=>{
344
+ const removeUpdateListener = editor.registerUpdateListener(({ dirtyElements, dirtyLeaves, editorState })=>{
345
+ if (!isRecording) {
346
+ return;
347
+ }
348
+ const currentSelection = editorState._selection;
349
+ const previousSelection = previousSelectionRef.current;
350
+ const skipNextSelectionChange = skipNextSelectionChangeRef.current;
351
+ if (previousSelection !== currentSelection) {
352
+ if (dirtyLeaves.size === 0 && dirtyElements.size === 0 && !skipNextSelectionChange) {
353
+ const browserSelection = window.getSelection();
354
+ if (browserSelection && (browserSelection.anchorNode == null || browserSelection.focusNode == null)) {
355
+ return;
356
+ }
357
+ }
358
+ previousSelectionRef.current = currentSelection;
359
+ }
360
+ skipNextSelectionChangeRef.current = false;
361
+ const testContent = generateTestContent();
362
+ if (testContent !== null) {
363
+ setTemplatedTest(testContent);
364
+ }
365
+ });
366
+ return removeUpdateListener;
367
+ }, [
368
+ editor,
369
+ generateTestContent,
370
+ isRecording,
371
+ pushStep
372
+ ]);
373
+ // save innerHTML
374
+ (0, _react.useEffect)(()=>{
375
+ if (!isRecording) {
376
+ return;
377
+ }
378
+ const removeUpdateListener = editor.registerUpdateListener(()=>{
379
+ const rootElement = editor.getRootElement();
380
+ if (rootElement !== null) {
381
+ setCurrentInnerHTML(rootElement?.innerHTML);
382
+ }
383
+ });
384
+ return removeUpdateListener;
385
+ }, [
386
+ editor,
387
+ isRecording
388
+ ]);
389
+ // clear editor and start recording
390
+ const toggleEditorSelection = (0, _react.useCallback)((currentEditor)=>{
391
+ if (!isRecording) {
392
+ currentEditor.update(()=>{
393
+ const root = (0, _lexical.$getRoot)();
394
+ root.clear();
395
+ const text = (0, _lexical.$createTextNode)();
396
+ root.append((0, _lexical.$createParagraphNode)().append(text));
397
+ text.select();
398
+ });
399
+ setSteps([]);
400
+ }
401
+ setIsRecording((currentIsRecording)=>!currentIsRecording);
402
+ }, [
403
+ isRecording
404
+ ]);
405
+ const onSnapshotClick = (0, _react.useCallback)(()=>{
406
+ if (!isRecording) {
407
+ return;
408
+ }
409
+ const browserSelection = window.getSelection();
410
+ if (browserSelection === null || browserSelection.anchorNode == null || browserSelection.focusNode == null) {
411
+ return;
412
+ }
413
+ const { anchorNode, anchorOffset, focusNode, focusOffset } = sanitizeSelection(browserSelection);
414
+ const rootElement = getCurrentEditor().getRootElement();
415
+ let anchorPath;
416
+ if (anchorNode !== null) {
417
+ anchorPath = getPathFromNodeToEditor(anchorNode, rootElement);
418
+ }
419
+ let focusPath;
420
+ if (focusNode !== null) {
421
+ focusPath = getPathFromNodeToEditor(focusNode, rootElement);
422
+ }
423
+ pushStep('snapshot', {
424
+ anchorNode,
425
+ anchorOffset,
426
+ anchorPath,
427
+ focusNode,
428
+ focusOffset,
429
+ focusPath
430
+ });
431
+ }, [
432
+ pushStep,
433
+ isRecording,
434
+ getCurrentEditor
435
+ ]);
436
+ const onCopyClick = (0, _react.useCallback)(()=>{
437
+ copy(generateTestContent());
438
+ }, [
439
+ generateTestContent
440
+ ]);
441
+ const onDownloadClick = (0, _react.useCallback)(()=>{
442
+ download('test.js', generateTestContent());
443
+ }, [
444
+ generateTestContent
445
+ ]);
446
+ const button = /*#__PURE__*/ _react.createElement("button", {
447
+ className: `editor-dev-button ${isRecording ? 'active' : ''}`,
448
+ id: "test-recorder-button",
449
+ onClick: (e)=>{
450
+ toggleEditorSelection(getCurrentEditor());
451
+ e.preventDefault();
452
+ },
453
+ title: isRecording ? 'Disable test recorder' : 'Enable test recorder'
454
+ }, isRecording ? 'Disable test recorder' : 'Enable test recorder');
455
+ const output = isRecording ? /*#__PURE__*/ _react.createElement("div", {
456
+ className: "test-recorder-output"
457
+ }, /*#__PURE__*/ _react.createElement("div", {
458
+ className: "test-recorder-toolbar"
459
+ }, /*#__PURE__*/ _react.createElement("button", {
460
+ className: "test-recorder-button",
461
+ id: "test-recorder-button-snapshot",
462
+ onClick: (e)=>{
463
+ onSnapshotClick();
464
+ e.preventDefault();
465
+ },
466
+ title: "Insert snapshot"
467
+ }, "Insert Snapshot"), /*#__PURE__*/ _react.createElement("button", {
468
+ className: "test-recorder-button",
469
+ id: "test-recorder-button-copy",
470
+ onClick: (e)=>{
471
+ onCopyClick();
472
+ e.preventDefault();
473
+ },
474
+ title: "Copy to clipboard"
475
+ }, "Copy"), /*#__PURE__*/ _react.createElement("button", {
476
+ className: "test-recorder-button",
477
+ id: "test-recorder-button-download",
478
+ onClick: (e)=>{
479
+ onDownloadClick();
480
+ e.preventDefault();
481
+ },
482
+ title: "Download as a file"
483
+ }, "Download")), /*#__PURE__*/ _react.createElement("pre", {
484
+ id: "test-recorder",
485
+ ref: preRef
486
+ }, templatedTest)) : null;
487
+ return [
488
+ button,
489
+ output
490
+ ];
491
+ }
492
+ const TestRecorderPlugin = ()=>{
493
+ const [editor] = (0, _LexicalComposerContext.useLexicalComposerContext)();
494
+ const [testRecorderButton, testRecorderOutput] = useTestRecorder(editor);
495
+ return /*#__PURE__*/ _react.createElement(_react.Fragment, null, /*#__PURE__*/ _react.createElement("p", null, "HI"), testRecorderButton, testRecorderOutput, /*#__PURE__*/ _react.createElement("p", null, "DONE"));
496
+ };
497
+
498
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9maWVsZC9mZWF0dXJlcy9kZWJ1Zy9UZXN0UmVjb3JkZXIvcGx1Z2luL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCdcbmltcG9ydCB0eXBlIHsgR3JpZFNlbGVjdGlvbiwgTGV4aWNhbEVkaXRvciwgTm9kZVNlbGVjdGlvbiwgUmFuZ2VTZWxlY3Rpb24gfSBmcm9tICdsZXhpY2FsJ1xuXG5pbXBvcnQgeyB1c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0IH0gZnJvbSAnQGxleGljYWwvcmVhY3QvTGV4aWNhbENvbXBvc2VyQ29udGV4dCdcbmltcG9ydCB7ICRjcmVhdGVQYXJhZ3JhcGhOb2RlLCAkY3JlYXRlVGV4dE5vZGUsICRnZXRSb290IH0gZnJvbSAnbGV4aWNhbCdcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IElTX0FQUExFIH0gZnJvbSAnLi4vLi4vLi4vLi4vbGV4aWNhbC91dGlscy9lbnZpcm9ubWVudCdcbmltcG9ydCAnLi9pbmRleC5zY3NzJ1xuXG5jb25zdCBjb3B5ID0gKHRleHQ6IG51bGwgfCBzdHJpbmcpID0+IHtcbiAgY29uc3QgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpXG4gIHRleHRBcmVhLnZhbHVlID0gdGV4dCB8fCAnJ1xuICB0ZXh0QXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgdGV4dEFyZWEuc3R5bGUub3BhY2l0eSA9ICcwJ1xuICBkb2N1bWVudC5ib2R5Py5hcHBlbmRDaGlsZCh0ZXh0QXJlYSlcbiAgdGV4dEFyZWEuZm9jdXMoKVxuICB0ZXh0QXJlYS5zZWxlY3QoKVxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5JylcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKHJlc3VsdClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICB9XG4gIGRvY3VtZW50LmJvZHk/LnJlbW92ZUNoaWxkKHRleHRBcmVhKVxufVxuXG5jb25zdCBkb3dubG9hZCA9IChmaWxlbmFtZTogc3RyaW5nLCB0ZXh0OiBudWxsIHwgc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0IHx8ICcnKSlcbiAgYS5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZW5hbWUpXG4gIGEuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICBkb2N1bWVudC5ib2R5Py5hcHBlbmRDaGlsZChhKVxuICBhLmNsaWNrKClcbiAgZG9jdW1lbnQuYm9keT8ucmVtb3ZlQ2hpbGQoYSlcbn1cblxuY29uc3QgZm9ybWF0U3RlcCA9IChzdGVwOiBTdGVwKSA9PiB7XG4gIGNvbnN0IGZvcm1hdE9uZVN0ZXAgPSAobmFtZTogc3RyaW5nLCB2YWx1ZTogU3RlcFsndmFsdWUnXSkgPT4ge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xpY2snOiB7XG4gICAgICAgIHJldHVybiBgICAgICAgYXdhaXQgcGFnZS5tb3VzZS5jbGljaygke3ZhbHVlLnh9LCAke3ZhbHVlLnl9KTtgXG4gICAgICB9XG4gICAgICBjYXNlICdwcmVzcyc6IHtcbiAgICAgICAgcmV0dXJuIGAgICAgICBhd2FpdCBwYWdlLmtleWJvYXJkLnByZXNzKCcke3ZhbHVlfScpO2BcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2tleWRvd24nOiB7XG4gICAgICAgIHJldHVybiBgICAgICAgYXdhaXQgcGFnZS5rZXlib2FyZC5rZXlkb3duKCcke3ZhbHVlfScpO2BcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2tleXVwJzoge1xuICAgICAgICByZXR1cm4gYCAgICAgIGF3YWl0IHBhZ2Uua2V5Ym9hcmQua2V5dXAoJyR7dmFsdWV9Jyk7YFxuICAgICAgfVxuICAgICAgY2FzZSAndHlwZSc6IHtcbiAgICAgICAgcmV0dXJuIGAgICAgICBhd2FpdCBwYWdlLmtleWJvYXJkLnR5cGUoJyR7dmFsdWV9Jyk7YFxuICAgICAgfVxuICAgICAgY2FzZSAnc2VsZWN0QWxsJzoge1xuICAgICAgICByZXR1cm4gYCAgICAgIGF3YWl0IHNlbGVjdEFsbChwYWdlKTtgXG4gICAgICB9XG4gICAgICBjYXNlICdzbmFwc2hvdCc6IHtcbiAgICAgICAgcmV0dXJuIGAgICAgICBhd2FpdCBhc3NlcnRIVE1MU25hcHNob3QocGFnZSk7XG4gICAgICBhd2FpdCBhc3NlcnRTZWxlY3Rpb24ocGFnZSwge1xuICAgICAgICBhbmNob3JQYXRoOiBbJHt2YWx1ZS5hbmNob3JQYXRoLnRvU3RyaW5nKCl9XSxcbiAgICAgICAgYW5jaG9yT2Zmc2V0OiAke3ZhbHVlLmFuY2hvck9mZnNldH0sXG4gICAgICAgIGZvY3VzUGF0aDogWyR7dmFsdWUuZm9jdXNQYXRoLnRvU3RyaW5nKCl9XSxcbiAgICAgICAgZm9jdXNPZmZzZXQ6ICR7dmFsdWUuZm9jdXNPZmZzZXR9LFxuICAgICAgfSk7XG5gXG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYGBcbiAgICB9XG4gIH1cbiAgY29uc3QgZm9ybWF0dGVkU3RlcCA9IGZvcm1hdE9uZVN0ZXAoc3RlcC5uYW1lLCBzdGVwLnZhbHVlKVxuICBzd2l0Y2ggKHN0ZXAuY291bnQpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZm9ybWF0dGVkU3RlcFxuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBbZm9ybWF0dGVkU3RlcCwgZm9ybWF0dGVkU3RlcF0uam9pbihgXFxuYClcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGAgICAgICBhd2FpdCByZXBlYXQoJHtzdGVwLmNvdW50fSwgYXN5bmMgKCkgPT4ge1xuICAke2Zvcm1hdHRlZFN0ZXB9XG4gICAgICApO2BcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTZWxlY3RBbGwoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV2ZW50LmtleUNvZGUgPT09IDY1ICYmIChJU19BUFBMRSA/IGV2ZW50Lm1ldGFLZXkgOiBldmVudC5jdHJsS2V5KVxufVxuXG4vLyBzdG9sZW4gZnJvbSBMZXhpY2FsU2VsZWN0aW9uLXRlc3RcbmZ1bmN0aW9uIHNhbml0aXplU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uKSB7XG4gIGNvbnN0IHsgYW5jaG9yTm9kZSwgZm9jdXNOb2RlIH0gPSBzZWxlY3Rpb25cbiAgbGV0IHsgYW5jaG9yT2Zmc2V0LCBmb2N1c09mZnNldCB9ID0gc2VsZWN0aW9uXG4gIGlmIChhbmNob3JPZmZzZXQgIT09IDApIHtcbiAgICBhbmNob3JPZmZzZXQtLVxuICB9XG4gIGlmIChmb2N1c09mZnNldCAhPT0gMCkge1xuICAgIGZvY3VzT2Zmc2V0LS1cbiAgfVxuICByZXR1cm4geyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfVxufVxuXG5mdW5jdGlvbiBnZXRQYXRoRnJvbU5vZGVUb0VkaXRvcihub2RlOiBOb2RlLCByb290RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsKSB7XG4gIGxldCBjdXJyZW50Tm9kZTogTm9kZSB8IG51bGwgfCB1bmRlZmluZWQgPSBub2RlXG4gIGNvbnN0IHBhdGggPSBbXVxuICB3aGlsZSAoY3VycmVudE5vZGUgIT09IHJvb3RFbGVtZW50KSB7XG4gICAgaWYgKGN1cnJlbnROb2RlICE9PSBudWxsICYmIGN1cnJlbnROb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhdGgudW5zaGlmdChcbiAgICAgICAgQXJyYXkuZnJvbShjdXJyZW50Tm9kZT8ucGFyZW50Tm9kZT8uY2hpbGROb2RlcyA/PyBbXSkuaW5kZXhPZihjdXJyZW50Tm9kZSBhcyBDaGlsZE5vZGUpLFxuICAgICAgKVxuICAgIH1cbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlPy5wYXJlbnROb2RlXG4gIH1cbiAgcmV0dXJuIHBhdGhcbn1cblxuY29uc3Qga2V5UHJlc3NlcyA9IG5ldyBTZXQoW1xuICAnRW50ZXInLFxuICAnQmFja3NwYWNlJyxcbiAgJ0RlbGV0ZScsXG4gICdFc2NhcGUnLFxuICAnQXJyb3dMZWZ0JyxcbiAgJ0Fycm93UmlnaHQnLFxuICAnQXJyb3dVcCcsXG4gICdBcnJvd0Rvd24nLFxuXSlcblxudHlwZSBTdGVwID0ge1xuICBjb3VudDogbnVtYmVyXG4gIG5hbWU6IHN0cmluZ1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICB2YWx1ZTogYW55XG59XG5cbnR5cGUgU3RlcHMgPSBTdGVwW11cblxuZnVuY3Rpb24gdXNlVGVzdFJlY29yZGVyKGVkaXRvcjogTGV4aWNhbEVkaXRvcik6IFtKU1guRWxlbWVudCwgSlNYLkVsZW1lbnQgfCBudWxsXSB7XG4gIGNvbnN0IFtzdGVwcywgc2V0U3RlcHNdID0gdXNlU3RhdGU8U3RlcHM+KFtdKVxuICBjb25zdCBbaXNSZWNvcmRpbmcsIHNldElzUmVjb3JkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbLCBzZXRDdXJyZW50SW5uZXJIVE1MXSA9IHVzZVN0YXRlKCcnKVxuICBjb25zdCBbdGVtcGxhdGVkVGVzdCwgc2V0VGVtcGxhdGVkVGVzdF0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgcHJldmlvdXNTZWxlY3Rpb25SZWYgPSB1c2VSZWY8R3JpZFNlbGVjdGlvbiB8IE5vZGVTZWxlY3Rpb24gfCBSYW5nZVNlbGVjdGlvbiB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHNraXBOZXh0U2VsZWN0aW9uQ2hhbmdlUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBwcmVSZWYgPSB1c2VSZWY8SFRNTFByZUVsZW1lbnQ+KG51bGwpXG5cbiAgY29uc3QgZ2V0Q3VycmVudEVkaXRvciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICByZXR1cm4gZWRpdG9yXG4gIH0sIFtlZGl0b3JdKVxuXG4gIGNvbnN0IGdlbmVyYXRlVGVzdENvbnRlbnQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBlZGl0b3IuZ2V0Um9vdEVsZW1lbnQoKVxuICAgIGNvbnN0IGJyb3dzZXJTZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcblxuICAgIGlmIChcbiAgICAgIHJvb3RFbGVtZW50ID09IG51bGwgfHxcbiAgICAgIGJyb3dzZXJTZWxlY3Rpb24gPT0gbnVsbCB8fFxuICAgICAgYnJvd3NlclNlbGVjdGlvbi5hbmNob3JOb2RlID09IG51bGwgfHxcbiAgICAgIGJyb3dzZXJTZWxlY3Rpb24uZm9jdXNOb2RlID09IG51bGwgfHxcbiAgICAgICFyb290RWxlbWVudC5jb250YWlucyhicm93c2VyU2VsZWN0aW9uLmFuY2hvck5vZGUpIHx8XG4gICAgICAhcm9vdEVsZW1lbnQuY29udGFpbnMoYnJvd3NlclNlbGVjdGlvbi5mb2N1c05vZGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBgXG5pbXBvcnQge1xuICBpbml0aWFsaXplRTJFLFxuICBhc3NlcnRIVE1MU25hcHNob3QsXG4gIGFzc2VydFNlbGVjdGlvbixcbiAgcmVwZWF0LFxufSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge3NlbGVjdEFsbH0gZnJvbSAnLi4va2V5Ym9hcmRTaG9ydGN1dHMnO1xuaW1wb3J0IHsgUmFuZ2VTZWxlY3Rpb24gfSBmcm9tICdsZXhpY2FsJztcbmltcG9ydCB7IE5vZGVTZWxlY3Rpb24gfSBmcm9tICdsZXhpY2FsJztcblxuZGVzY3JpYmUoJ1Rlc3QgY2FzZScsICgpID0+IHtcbiAgaW5pdGlhbGl6ZUUyRSgoZTJlKSA9PiB7XG4gICAgaXQoJ1Nob3VsZCBwYXNzIHRoaXMgdGVzdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHtwYWdlfSA9IGUyZTtcblxuICAgICAgYXdhaXQgcGFnZS5mb2N1cygnZGl2W2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKTtcbiR7c3RlcHMubWFwKGZvcm1hdFN0ZXApLmpvaW4oYFxcbmApfVxuICAgIH0pO1xufSk7XG4gICAgYFxuICB9LCBbZWRpdG9yLCBzdGVwc10pXG5cbiAgLy8ganVzdCBhIHdyYXBwZXIgYXJvdW5kIGluc2VydGluZyBuZXcgYWN0aW9ucyBzbyB0aGF0IHdlIGNhblxuICAvLyBjb2FsZXNjZSBzb21lIGFjdGlvbnMgbGlrZSBpbnNlcnRUZXh0L21vdmVOYXRpdmVTZWxlY3Rpb25cbiAgY29uc3QgcHVzaFN0ZXAgPSB1c2VDYWxsYmFjayhcbiAgICAobmFtZTogc3RyaW5nLCB2YWx1ZTogU3RlcFsndmFsdWUnXSkgPT4ge1xuICAgICAgc2V0U3RlcHMoKGN1cnJlbnRTdGVwcykgPT4ge1xuICAgICAgICAvLyB0cnlpbmcgdG8gZ3JvdXAgc3RlcHNcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc3RlcHMubGVuZ3RoIC0gMVxuICAgICAgICBjb25zdCBsYXN0U3RlcCA9IHN0ZXBzW2N1cnJlbnRJbmRleF1cbiAgICAgICAgaWYgKGxhc3RTdGVwKSB7XG4gICAgICAgICAgaWYgKGxhc3RTdGVwLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChuYW1lID09PSAndHlwZScpIHtcbiAgICAgICAgICAgICAgLy8gZm9yIHR5cGluZyBldmVudHMgd2UganVzdCBhcHBlbmQgdGhlIHRleHRcbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAuLi5zdGVwcy5zbGljZSgwLCBjdXJyZW50SW5kZXgpLFxuICAgICAgICAgICAgICAgIHsgLi4ubGFzdFN0ZXAsIHZhbHVlOiBsYXN0U3RlcC52YWx1ZSArIHZhbHVlIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZvciBvdGhlciBldmVudHMgd2UgYnVtcCB0aGUgY291bnRlciBpZiB0aGVpciB2YWx1ZXMgYXJlIHRoZSBzYW1lXG4gICAgICAgICAgICAgIGlmIChsYXN0U3RlcC52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWy4uLnN0ZXBzLnNsaWNlKDAsIGN1cnJlbnRJbmRleCksIHsgLi4ubGFzdFN0ZXAsIGNvdW50OiBsYXN0U3RlcC5jb3VudCArIDEgfV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb3VsZCBub3QgZ3JvdXAsIGp1c3QgYXBwZW5kIGEgbmV3IG9uZVxuICAgICAgICByZXR1cm4gWy4uLmN1cnJlbnRTdGVwcywgeyBuYW1lLCBjb3VudDogMSwgdmFsdWUgfV1cbiAgICAgIH0pXG4gICAgfSxcbiAgICBbc3RlcHMsIHNldFN0ZXBzXSxcbiAgKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25LZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzUmVjb3JkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gZXZlbnQua2V5XG4gICAgICBpZiAoaXNTZWxlY3RBbGwoZXZlbnQpKSB7XG4gICAgICAgIHB1c2hTdGVwKCdzZWxlY3RBbGwnLCAnJylcbiAgICAgIH0gZWxzZSBpZiAoa2V5UHJlc3Nlcy5oYXMoa2V5KSkge1xuICAgICAgICBwdXNoU3RlcCgncHJlc3MnLCBldmVudC5rZXkpXG4gICAgICB9IGVsc2UgaWYgKFsuLi5rZXldLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcHVzaFN0ZXAoJ2tleWRvd24nLCBldmVudC5rZXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoU3RlcCgndHlwZScsIGV2ZW50LmtleSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbktleVVwID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzUmVjb3JkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gZXZlbnQua2V5XG4gICAgICBpZiAoIWtleVByZXNzZXMuaGFzKGtleSkgJiYgWy4uLmtleV0ubGVuZ3RoID4gMSkge1xuICAgICAgICBwdXNoU3RlcCgna2V5dXAnLCBldmVudC5rZXkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVkaXRvci5yZWdpc3RlclJvb3RMaXN0ZW5lcihcbiAgICAgIChyb290RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsLCBwcmV2Um9vdEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAocHJldlJvb3RFbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgcHJldlJvb3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24pXG4gICAgICAgICAgcHJldlJvb3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgb25LZXlVcClcbiAgICAgICAgfVxuICAgICAgICBpZiAocm9vdEVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICByb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duKVxuICAgICAgICAgIHJvb3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgb25LZXlVcClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApXG4gIH0sIFtlZGl0b3IsIGlzUmVjb3JkaW5nLCBwdXNoU3RlcF0pXG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHByZVJlZi5jdXJyZW50LnNjcm9sbFRvKDAsIHByZVJlZi5jdXJyZW50LnNjcm9sbEhlaWdodClcbiAgICB9XG4gIH0sIFtnZW5lcmF0ZVRlc3RDb250ZW50XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzdGVwcykge1xuICAgICAgY29uc3QgdGVzdENvbnRlbnQgPSBnZW5lcmF0ZVRlc3RDb250ZW50KClcbiAgICAgIGlmICh0ZXN0Q29udGVudCAhPT0gbnVsbCkge1xuICAgICAgICBzZXRUZW1wbGF0ZWRUZXN0KHRlc3RDb250ZW50KVxuICAgICAgfVxuICAgICAgaWYgKHByZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHByZVJlZi5jdXJyZW50LnNjcm9sbFRvKDAsIHByZVJlZi5jdXJyZW50LnNjcm9sbEhlaWdodClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtnZW5lcmF0ZVRlc3RDb250ZW50LCBzdGVwc10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCByZW1vdmVVcGRhdGVMaXN0ZW5lciA9IGVkaXRvci5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKFxuICAgICAgKHsgZGlydHlFbGVtZW50cywgZGlydHlMZWF2ZXMsIGVkaXRvclN0YXRlIH0pID0+IHtcbiAgICAgICAgaWYgKCFpc1JlY29yZGluZykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb24gPSBlZGl0b3JTdGF0ZS5fc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0aW9uID0gcHJldmlvdXNTZWxlY3Rpb25SZWYuY3VycmVudFxuICAgICAgICBjb25zdCBza2lwTmV4dFNlbGVjdGlvbkNoYW5nZSA9IHNraXBOZXh0U2VsZWN0aW9uQ2hhbmdlUmVmLmN1cnJlbnRcbiAgICAgICAgaWYgKHByZXZpb3VzU2VsZWN0aW9uICE9PSBjdXJyZW50U2VsZWN0aW9uKSB7XG4gICAgICAgICAgaWYgKGRpcnR5TGVhdmVzLnNpemUgPT09IDAgJiYgZGlydHlFbGVtZW50cy5zaXplID09PSAwICYmICFza2lwTmV4dFNlbGVjdGlvbkNoYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgYnJvd3NlclNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBicm93c2VyU2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgIChicm93c2VyU2VsZWN0aW9uLmFuY2hvck5vZGUgPT0gbnVsbCB8fCBicm93c2VyU2VsZWN0aW9uLmZvY3VzTm9kZSA9PSBudWxsKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwcmV2aW91c1NlbGVjdGlvblJlZi5jdXJyZW50ID0gY3VycmVudFNlbGVjdGlvblxuICAgICAgICB9XG4gICAgICAgIHNraXBOZXh0U2VsZWN0aW9uQ2hhbmdlUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBjb25zdCB0ZXN0Q29udGVudCA9IGdlbmVyYXRlVGVzdENvbnRlbnQoKVxuICAgICAgICBpZiAodGVzdENvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICBzZXRUZW1wbGF0ZWRUZXN0KHRlc3RDb250ZW50KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIClcbiAgICByZXR1cm4gcmVtb3ZlVXBkYXRlTGlzdGVuZXJcbiAgfSwgW2VkaXRvciwgZ2VuZXJhdGVUZXN0Q29udGVudCwgaXNSZWNvcmRpbmcsIHB1c2hTdGVwXSlcblxuICAvLyBzYXZlIGlubmVySFRNTFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNSZWNvcmRpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCByZW1vdmVVcGRhdGVMaXN0ZW5lciA9IGVkaXRvci5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gZWRpdG9yLmdldFJvb3RFbGVtZW50KClcbiAgICAgIGlmIChyb290RWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICBzZXRDdXJyZW50SW5uZXJIVE1MKHJvb3RFbGVtZW50Py5pbm5lckhUTUwpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gcmVtb3ZlVXBkYXRlTGlzdGVuZXJcbiAgfSwgW2VkaXRvciwgaXNSZWNvcmRpbmddKVxuXG4gIC8vIGNsZWFyIGVkaXRvciBhbmQgc3RhcnQgcmVjb3JkaW5nXG4gIGNvbnN0IHRvZ2dsZUVkaXRvclNlbGVjdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChjdXJyZW50RWRpdG9yOiBMZXhpY2FsRWRpdG9yKSA9PiB7XG4gICAgICBpZiAoIWlzUmVjb3JkaW5nKSB7XG4gICAgICAgIGN1cnJlbnRFZGl0b3IudXBkYXRlKCgpID0+IHtcbiAgICAgICAgICBjb25zdCByb290ID0gJGdldFJvb3QoKVxuICAgICAgICAgIHJvb3QuY2xlYXIoKVxuICAgICAgICAgIGNvbnN0IHRleHQgPSAkY3JlYXRlVGV4dE5vZGUoKVxuICAgICAgICAgIHJvb3QuYXBwZW5kKCRjcmVhdGVQYXJhZ3JhcGhOb2RlKCkuYXBwZW5kKHRleHQpKVxuICAgICAgICAgIHRleHQuc2VsZWN0KClcbiAgICAgICAgfSlcbiAgICAgICAgc2V0U3RlcHMoW10pXG4gICAgICB9XG4gICAgICBzZXRJc1JlY29yZGluZygoY3VycmVudElzUmVjb3JkaW5nKSA9PiAhY3VycmVudElzUmVjb3JkaW5nKVxuICAgIH0sXG4gICAgW2lzUmVjb3JkaW5nXSxcbiAgKVxuXG4gIGNvbnN0IG9uU25hcHNob3RDbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIWlzUmVjb3JkaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgYnJvd3NlclNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgIGlmIChcbiAgICAgIGJyb3dzZXJTZWxlY3Rpb24gPT09IG51bGwgfHxcbiAgICAgIGJyb3dzZXJTZWxlY3Rpb24uYW5jaG9yTm9kZSA9PSBudWxsIHx8XG4gICAgICBicm93c2VyU2VsZWN0aW9uLmZvY3VzTm9kZSA9PSBudWxsXG4gICAgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgeyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfSA9IHNhbml0aXplU2VsZWN0aW9uKGJyb3dzZXJTZWxlY3Rpb24pXG4gICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBnZXRDdXJyZW50RWRpdG9yKCkuZ2V0Um9vdEVsZW1lbnQoKVxuICAgIGxldCBhbmNob3JQYXRoXG4gICAgaWYgKGFuY2hvck5vZGUgIT09IG51bGwpIHtcbiAgICAgIGFuY2hvclBhdGggPSBnZXRQYXRoRnJvbU5vZGVUb0VkaXRvcihhbmNob3JOb2RlLCByb290RWxlbWVudClcbiAgICB9XG4gICAgbGV0IGZvY3VzUGF0aFxuICAgIGlmIChmb2N1c05vZGUgIT09IG51bGwpIHtcbiAgICAgIGZvY3VzUGF0aCA9IGdldFBhdGhGcm9tTm9kZVRvRWRpdG9yKGZvY3VzTm9kZSwgcm9vdEVsZW1lbnQpXG4gICAgfVxuICAgIHB1c2hTdGVwKCdzbmFwc2hvdCcsIHtcbiAgICAgIGFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQsXG4gICAgICBhbmNob3JQYXRoLFxuICAgICAgZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQsXG4gICAgICBmb2N1c1BhdGgsXG4gICAgfSlcbiAgfSwgW3B1c2hTdGVwLCBpc1JlY29yZGluZywgZ2V0Q3VycmVudEVkaXRvcl0pXG5cbiAgY29uc3Qgb25Db3B5Q2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29weShnZW5lcmF0ZVRlc3RDb250ZW50KCkpXG4gIH0sIFtnZW5lcmF0ZVRlc3RDb250ZW50XSlcblxuICBjb25zdCBvbkRvd25sb2FkQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZG93bmxvYWQoJ3Rlc3QuanMnLCBnZW5lcmF0ZVRlc3RDb250ZW50KCkpXG4gIH0sIFtnZW5lcmF0ZVRlc3RDb250ZW50XSlcblxuICBjb25zdCBidXR0b24gPSAoXG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3NOYW1lPXtgZWRpdG9yLWRldi1idXR0b24gJHtpc1JlY29yZGluZyA/ICdhY3RpdmUnIDogJyd9YH1cbiAgICAgIGlkPVwidGVzdC1yZWNvcmRlci1idXR0b25cIlxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgdG9nZ2xlRWRpdG9yU2VsZWN0aW9uKGdldEN1cnJlbnRFZGl0b3IoKSlcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB9fVxuICAgICAgdGl0bGU9e2lzUmVjb3JkaW5nID8gJ0Rpc2FibGUgdGVzdCByZWNvcmRlcicgOiAnRW5hYmxlIHRlc3QgcmVjb3JkZXInfVxuICAgID5cbiAgICAgIHtpc1JlY29yZGluZyA/ICdEaXNhYmxlIHRlc3QgcmVjb3JkZXInIDogJ0VuYWJsZSB0ZXN0IHJlY29yZGVyJ31cbiAgICA8L2J1dHRvbj5cbiAgKVxuICBjb25zdCBvdXRwdXQgPSBpc1JlY29yZGluZyA/IChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInRlc3QtcmVjb3JkZXItb3V0cHV0XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRlc3QtcmVjb3JkZXItdG9vbGJhclwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPVwidGVzdC1yZWNvcmRlci1idXR0b25cIlxuICAgICAgICAgIGlkPVwidGVzdC1yZWNvcmRlci1idXR0b24tc25hcHNob3RcIlxuICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICBvblNuYXBzaG90Q2xpY2soKVxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgfX1cbiAgICAgICAgICB0aXRsZT1cIkluc2VydCBzbmFwc2hvdFwiXG4gICAgICAgID5cbiAgICAgICAgICBJbnNlcnQgU25hcHNob3RcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXN0LXJlY29yZGVyLWJ1dHRvblwiXG4gICAgICAgICAgaWQ9XCJ0ZXN0LXJlY29yZGVyLWJ1dHRvbi1jb3B5XCJcbiAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgb25Db3B5Q2xpY2soKVxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgfX1cbiAgICAgICAgICB0aXRsZT1cIkNvcHkgdG8gY2xpcGJvYXJkXCJcbiAgICAgICAgPlxuICAgICAgICAgIENvcHlcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXN0LXJlY29yZGVyLWJ1dHRvblwiXG4gICAgICAgICAgaWQ9XCJ0ZXN0LXJlY29yZGVyLWJ1dHRvbi1kb3dubG9hZFwiXG4gICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgIG9uRG93bmxvYWRDbGljaygpXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICB9fVxuICAgICAgICAgIHRpdGxlPVwiRG93bmxvYWQgYXMgYSBmaWxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIERvd25sb2FkXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8cHJlIGlkPVwidGVzdC1yZWNvcmRlclwiIHJlZj17cHJlUmVmfT5cbiAgICAgICAge3RlbXBsYXRlZFRlc3R9XG4gICAgICA8L3ByZT5cbiAgICA8L2Rpdj5cbiAgKSA6IG51bGxcblxuICByZXR1cm4gW2J1dHRvbiwgb3V0cHV0XVxufVxuZXhwb3J0IGNvbnN0IFRlc3RSZWNvcmRlclBsdWdpbjogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIGNvbnN0IFtlZGl0b3JdID0gdXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpXG4gIGNvbnN0IFt0ZXN0UmVjb3JkZXJCdXR0b24sIHRlc3RSZWNvcmRlck91dHB1dF0gPSB1c2VUZXN0UmVjb3JkZXIoZWRpdG9yKVxuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgPHA+SEk8L3A+XG4gICAgICB7dGVzdFJlY29yZGVyQnV0dG9ufVxuICAgICAge3Rlc3RSZWNvcmRlck91dHB1dH1cbiAgICAgIDxwPkRPTkU8L3A+XG4gICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgKVxufVxuIl0sIm5hbWVzIjpbImlzU2VsZWN0QWxsIiwiVGVzdFJlY29yZGVyUGx1Z2luIiwiY29weSIsInRleHQiLCJ0ZXh0QXJlYSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInZhbHVlIiwic3R5bGUiLCJwb3NpdGlvbiIsIm9wYWNpdHkiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJmb2N1cyIsInNlbGVjdCIsInJlc3VsdCIsImV4ZWNDb21tYW5kIiwiY29uc29sZSIsImxvZyIsImVycm9yIiwicmVtb3ZlQ2hpbGQiLCJkb3dubG9hZCIsImZpbGVuYW1lIiwiYSIsInNldEF0dHJpYnV0ZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImRpc3BsYXkiLCJjbGljayIsImZvcm1hdFN0ZXAiLCJzdGVwIiwiZm9ybWF0T25lU3RlcCIsIm5hbWUiLCJ4IiwieSIsImFuY2hvclBhdGgiLCJ0b1N0cmluZyIsImFuY2hvck9mZnNldCIsImZvY3VzUGF0aCIsImZvY3VzT2Zmc2V0IiwiZm9ybWF0dGVkU3RlcCIsImNvdW50Iiwiam9pbiIsImV2ZW50Iiwia2V5Q29kZSIsIklTX0FQUExFIiwibWV0YUtleSIsImN0cmxLZXkiLCJzYW5pdGl6ZVNlbGVjdGlvbiIsInNlbGVjdGlvbiIsImFuY2hvck5vZGUiLCJmb2N1c05vZGUiLCJnZXRQYXRoRnJvbU5vZGVUb0VkaXRvciIsIm5vZGUiLCJyb290RWxlbWVudCIsImN1cnJlbnROb2RlIiwicGF0aCIsInVuZGVmaW5lZCIsInVuc2hpZnQiLCJBcnJheSIsImZyb20iLCJwYXJlbnROb2RlIiwiY2hpbGROb2RlcyIsImluZGV4T2YiLCJrZXlQcmVzc2VzIiwiU2V0IiwidXNlVGVzdFJlY29yZGVyIiwiZWRpdG9yIiwic3RlcHMiLCJzZXRTdGVwcyIsInVzZVN0YXRlIiwiaXNSZWNvcmRpbmciLCJzZXRJc1JlY29yZGluZyIsInNldEN1cnJlbnRJbm5lckhUTUwiLCJ0ZW1wbGF0ZWRUZXN0Iiwic2V0VGVtcGxhdGVkVGVzdCIsInByZXZpb3VzU2VsZWN0aW9uUmVmIiwidXNlUmVmIiwic2tpcE5leHRTZWxlY3Rpb25DaGFuZ2VSZWYiLCJwcmVSZWYiLCJnZXRDdXJyZW50RWRpdG9yIiwidXNlQ2FsbGJhY2siLCJnZW5lcmF0ZVRlc3RDb250ZW50IiwiZ2V0Um9vdEVsZW1lbnQiLCJicm93c2VyU2VsZWN0aW9uIiwid2luZG93IiwiZ2V0U2VsZWN0aW9uIiwiY29udGFpbnMiLCJtYXAiLCJwdXNoU3RlcCIsImN1cnJlbnRTdGVwcyIsImN1cnJlbnRJbmRleCIsImxlbmd0aCIsImxhc3RTdGVwIiwic2xpY2UiLCJ1c2VMYXlvdXRFZmZlY3QiLCJvbktleURvd24iLCJrZXkiLCJoYXMiLCJvbktleVVwIiwicmVnaXN0ZXJSb290TGlzdGVuZXIiLCJwcmV2Um9vdEVsZW1lbnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsImN1cnJlbnQiLCJzY3JvbGxUbyIsInNjcm9sbEhlaWdodCIsInVzZUVmZmVjdCIsInRlc3RDb250ZW50IiwicmVtb3ZlVXBkYXRlTGlzdGVuZXIiLCJyZWdpc3RlclVwZGF0ZUxpc3RlbmVyIiwiZGlydHlFbGVtZW50cyIsImRpcnR5TGVhdmVzIiwiZWRpdG9yU3RhdGUiLCJjdXJyZW50U2VsZWN0aW9uIiwiX3NlbGVjdGlvbiIsInByZXZpb3VzU2VsZWN0aW9uIiwic2tpcE5leHRTZWxlY3Rpb25DaGFuZ2UiLCJzaXplIiwiaW5uZXJIVE1MIiwidG9nZ2xlRWRpdG9yU2VsZWN0aW9uIiwiY3VycmVudEVkaXRvciIsInVwZGF0ZSIsInJvb3QiLCIkZ2V0Um9vdCIsImNsZWFyIiwiJGNyZWF0ZVRleHROb2RlIiwiYXBwZW5kIiwiJGNyZWF0ZVBhcmFncmFwaE5vZGUiLCJjdXJyZW50SXNSZWNvcmRpbmciLCJvblNuYXBzaG90Q2xpY2siLCJvbkNvcHlDbGljayIsIm9uRG93bmxvYWRDbGljayIsImJ1dHRvbiIsImNsYXNzTmFtZSIsImlkIiwib25DbGljayIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInRpdGxlIiwib3V0cHV0IiwiZGl2IiwicHJlIiwicmVmIiwidXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCIsInRlc3RSZWNvcmRlckJ1dHRvbiIsInRlc3RSZWNvcmRlck91dHB1dCIsIlJlYWN0IiwiRnJhZ21lbnQiLCJwIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0lBdUZnQkEsV0FBVztlQUFYQTs7SUFpV0hDLGtCQUFrQjtlQUFsQkE7Ozt3Q0FyYjZCO3lCQUNzQjsrREFDekM7NkJBR0U7UUFDbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFUCxNQUFNQyxPQUFPLENBQUNDO0lBQ1osTUFBTUMsV0FBV0MsU0FBU0MsYUFBYSxDQUFDO0lBQ3hDRixTQUFTRyxLQUFLLEdBQUdKLFFBQVE7SUFDekJDLFNBQVNJLEtBQUssQ0FBQ0MsUUFBUSxHQUFHO0lBQzFCTCxTQUFTSSxLQUFLLENBQUNFLE9BQU8sR0FBRztJQUN6QkwsU0FBU00sSUFBSSxFQUFFQyxZQUFZUjtJQUMzQkEsU0FBU1MsS0FBSztJQUNkVCxTQUFTVSxNQUFNO0lBQ2YsSUFBSTtRQUNGLE1BQU1DLFNBQVNWLFNBQVNXLFdBQVcsQ0FBQztRQUNwQyxzQ0FBc0M7UUFDdENDLFFBQVFDLEdBQUcsQ0FBQ0g7SUFDZCxFQUFFLE9BQU9JLE9BQU87UUFDZEYsUUFBUUUsS0FBSyxDQUFDQTtJQUNoQjtJQUNBZCxTQUFTTSxJQUFJLEVBQUVTLFlBQVloQjtBQUM3QjtBQUVBLE1BQU1pQixXQUFXLENBQUNDLFVBQWtCbkI7SUFDbEMsTUFBTW9CLElBQUlsQixTQUFTQyxhQUFhLENBQUM7SUFDakNpQixFQUFFQyxZQUFZLENBQUMsUUFBUSxtQ0FBbUNDLG1CQUFtQnRCLFFBQVE7SUFDckZvQixFQUFFQyxZQUFZLENBQUMsWUFBWUY7SUFDM0JDLEVBQUVmLEtBQUssQ0FBQ2tCLE9BQU8sR0FBRztJQUNsQnJCLFNBQVNNLElBQUksRUFBRUMsWUFBWVc7SUFDM0JBLEVBQUVJLEtBQUs7SUFDUHRCLFNBQVNNLElBQUksRUFBRVMsWUFBWUc7QUFDN0I7QUFFQSxNQUFNSyxhQUFhLENBQUNDO0lBQ2xCLE1BQU1DLGdCQUFnQixDQUFDQyxNQUFjeEI7UUFDbkMsT0FBUXdCO1lBQ04sS0FBSztnQkFBUztvQkFDWixPQUFPLENBQUMsNkJBQTZCLEVBQUV4QixNQUFNeUIsQ0FBQyxDQUFDLEVBQUUsRUFBRXpCLE1BQU0wQixDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNoRTtZQUNBLEtBQUs7Z0JBQVM7b0JBQ1osT0FBTyxDQUFDLGlDQUFpQyxFQUFFMUIsTUFBTSxHQUFHLENBQUM7Z0JBQ3ZEO1lBQ0EsS0FBSztnQkFBVztvQkFDZCxPQUFPLENBQUMsbUNBQW1DLEVBQUVBLE1BQU0sR0FBRyxDQUFDO2dCQUN6RDtZQUNBLEtBQUs7Z0JBQVM7b0JBQ1osT0FBTyxDQUFDLGlDQUFpQyxFQUFFQSxNQUFNLEdBQUcsQ0FBQztnQkFDdkQ7WUFDQSxLQUFLO2dCQUFRO29CQUNYLE9BQU8sQ0FBQyxnQ0FBZ0MsRUFBRUEsTUFBTSxHQUFHLENBQUM7Z0JBQ3REO1lBQ0EsS0FBSztnQkFBYTtvQkFDaEIsT0FBTyxDQUFDLDRCQUE0QixDQUFDO2dCQUN2QztZQUNBLEtBQUs7Z0JBQVk7b0JBQ2YsT0FBTyxDQUFDOztxQkFFSyxFQUFFQSxNQUFNMkIsVUFBVSxDQUFDQyxRQUFRLEdBQUc7c0JBQzdCLEVBQUU1QixNQUFNNkIsWUFBWSxDQUFDO29CQUN2QixFQUFFN0IsTUFBTThCLFNBQVMsQ0FBQ0YsUUFBUSxHQUFHO3FCQUM1QixFQUFFNUIsTUFBTStCLFdBQVcsQ0FBQzs7QUFFekMsQ0FBQztnQkFDSztZQUNBO2dCQUNFLE9BQU8sQ0FBQyxDQUFDO1FBQ2I7SUFDRjtJQUNBLE1BQU1DLGdCQUFnQlQsY0FBY0QsS0FBS0UsSUFBSSxFQUFFRixLQUFLdEIsS0FBSztJQUN6RCxPQUFRc0IsS0FBS1csS0FBSztRQUNoQixLQUFLO1lBQ0gsT0FBT0Q7UUFDVCxLQUFLO1lBQ0gsT0FBTztnQkFBQ0E7Z0JBQWVBO2FBQWMsQ0FBQ0UsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pEO1lBQ0UsT0FBTyxDQUFDLG1CQUFtQixFQUFFWixLQUFLVyxLQUFLLENBQUM7RUFDNUMsRUFBRUQsY0FBYztRQUNWLENBQUM7SUFDUDtBQUNGO0FBRU8sU0FBU3ZDLFlBQVkwQyxLQUFvQjtJQUM5QyxPQUFPQSxNQUFNQyxPQUFPLEtBQUssTUFBT0MsQ0FBQUEscUJBQVEsR0FBR0YsTUFBTUcsT0FBTyxHQUFHSCxNQUFNSSxPQUFPLEFBQUQ7QUFDekU7QUFFQSxvQ0FBb0M7QUFDcEMsU0FBU0Msa0JBQWtCQyxTQUFvQjtJQUM3QyxNQUFNLEVBQUVDLFVBQVUsRUFBRUMsU0FBUyxFQUFFLEdBQUdGO0lBQ2xDLElBQUksRUFBRVosWUFBWSxFQUFFRSxXQUFXLEVBQUUsR0FBR1U7SUFDcEMsSUFBSVosaUJBQWlCLEdBQUc7UUFDdEJBO0lBQ0Y7SUFDQSxJQUFJRSxnQkFBZ0IsR0FBRztRQUNyQkE7SUFDRjtJQUNBLE9BQU87UUFBRVc7UUFBWWI7UUFBY2M7UUFBV1o7SUFBWTtBQUM1RDtBQUVBLFNBQVNhLHdCQUF3QkMsSUFBVSxFQUFFQyxXQUErQjtJQUMxRSxJQUFJQyxjQUF1Q0Y7SUFDM0MsTUFBTUcsT0FBTyxFQUFFO0lBQ2YsTUFBT0QsZ0JBQWdCRCxZQUFhO1FBQ2xDLElBQUlDLGdCQUFnQixRQUFRQSxnQkFBZ0JFLFdBQVc7WUFDckRELEtBQUtFLE9BQU8sQ0FDVkMsTUFBTUMsSUFBSSxDQUFDTCxhQUFhTSxZQUFZQyxjQUFjLEVBQUUsRUFBRUMsT0FBTyxDQUFDUjtRQUVsRTtRQUNBQSxjQUFjQSxhQUFhTTtJQUM3QjtJQUNBLE9BQU9MO0FBQ1Q7QUFFQSxNQUFNUSxhQUFhLElBQUlDLElBQUk7SUFDekI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtDQUNEO0FBV0QsU0FBU0MsZ0JBQWdCQyxNQUFxQjtJQUM1QyxNQUFNLENBQUNDLE9BQU9DLFNBQVMsR0FBR0MsSUFBQUEsZUFBUSxFQUFRLEVBQUU7SUFDNUMsTUFBTSxDQUFDQyxhQUFhQyxlQUFlLEdBQUdGLElBQUFBLGVBQVEsRUFBQztJQUMvQyxNQUFNLEdBQUdHLG9CQUFvQixHQUFHSCxJQUFBQSxlQUFRLEVBQUM7SUFDekMsTUFBTSxDQUFDSSxlQUFlQyxpQkFBaUIsR0FBR0wsSUFBQUEsZUFBUSxFQUFDO0lBQ25ELE1BQU1NLHVCQUF1QkMsSUFBQUEsYUFBTSxFQUF3RDtJQUMzRixNQUFNQyw2QkFBNkJELElBQUFBLGFBQU0sRUFBQztJQUMxQyxNQUFNRSxTQUFTRixJQUFBQSxhQUFNLEVBQWlCO0lBRXRDLE1BQU1HLG1CQUFtQkMsSUFBQUEsa0JBQVcsRUFBQztRQUNuQyxPQUFPZDtJQUNULEdBQUc7UUFBQ0E7S0FBTztJQUVYLE1BQU1lLHNCQUFzQkQsSUFBQUEsa0JBQVcsRUFBQztRQUN0QyxNQUFNM0IsY0FBY2EsT0FBT2dCLGNBQWM7UUFDekMsTUFBTUMsbUJBQW1CQyxPQUFPQyxZQUFZO1FBRTVDLElBQ0VoQyxlQUFlLFFBQ2Y4QixvQkFBb0IsUUFDcEJBLGlCQUFpQmxDLFVBQVUsSUFBSSxRQUMvQmtDLGlCQUFpQmpDLFNBQVMsSUFBSSxRQUM5QixDQUFDRyxZQUFZaUMsUUFBUSxDQUFDSCxpQkFBaUJsQyxVQUFVLEtBQ2pELENBQUNJLFlBQVlpQyxRQUFRLENBQUNILGlCQUFpQmpDLFNBQVMsR0FDaEQ7WUFDQSxPQUFPO1FBQ1Q7UUFFQSxPQUFPLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJaLEVBQUVpQixNQUFNb0IsR0FBRyxDQUFDM0QsWUFBWWEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7OztJQUcvQixDQUFDO0lBQ0gsR0FBRztRQUFDeUI7UUFBUUM7S0FBTTtJQUVsQiw2REFBNkQ7SUFDN0QsNERBQTREO0lBQzVELE1BQU1xQixXQUFXUixJQUFBQSxrQkFBVyxFQUMxQixDQUFDakQsTUFBY3hCO1FBQ2I2RCxTQUFTLENBQUNxQjtZQUNSLHdCQUF3QjtZQUN4QixNQUFNQyxlQUFldkIsTUFBTXdCLE1BQU0sR0FBRztZQUNwQyxNQUFNQyxXQUFXekIsS0FBSyxDQUFDdUIsYUFBYTtZQUNwQyxJQUFJRSxVQUFVO2dCQUNaLElBQUlBLFNBQVM3RCxJQUFJLEtBQUtBLE1BQU07b0JBQzFCLElBQUlBLFNBQVMsUUFBUTt3QkFDbkIsNENBQTRDO3dCQUM1QyxPQUFPOytCQUNGb0MsTUFBTTBCLEtBQUssQ0FBQyxHQUFHSDs0QkFDbEI7Z0NBQUUsR0FBR0UsUUFBUTtnQ0FBRXJGLE9BQU9xRixTQUFTckYsS0FBSyxHQUFHQTs0QkFBTTt5QkFDOUM7b0JBQ0gsT0FBTzt3QkFDTCxvRUFBb0U7d0JBQ3BFLElBQUlxRixTQUFTckYsS0FBSyxLQUFLQSxPQUFPOzRCQUM1QixPQUFPO21DQUFJNEQsTUFBTTBCLEtBQUssQ0FBQyxHQUFHSDtnQ0FBZTtvQ0FBRSxHQUFHRSxRQUFRO29DQUFFcEQsT0FBT29ELFNBQVNwRCxLQUFLLEdBQUc7Z0NBQUU7NkJBQUU7d0JBQ3RGO29CQUNGO2dCQUNGO1lBQ0Y7WUFDQSx5Q0FBeUM7WUFDekMsT0FBTzttQkFBSWlEO2dCQUFjO29CQUFFMUQ7b0JBQU1TLE9BQU87b0JBQUdqQztnQkFBTTthQUFFO1FBQ3JEO0lBQ0YsR0FDQTtRQUFDNEQ7UUFBT0M7S0FBUztJQUduQjBCLElBQUFBLHNCQUFlLEVBQUM7UUFDZCxNQUFNQyxZQUFZLENBQUNyRDtZQUNqQixJQUFJLENBQUM0QixhQUFhO2dCQUNoQjtZQUNGO1lBQ0EsTUFBTTBCLE1BQU10RCxNQUFNc0QsR0FBRztZQUNyQixJQUFJaEcsWUFBWTBDLFFBQVE7Z0JBQ3RCOEMsU0FBUyxhQUFhO1lBQ3hCLE9BQU8sSUFBSXpCLFdBQVdrQyxHQUFHLENBQUNELE1BQU07Z0JBQzlCUixTQUFTLFNBQVM5QyxNQUFNc0QsR0FBRztZQUM3QixPQUFPLElBQUk7bUJBQUlBO2FBQUksQ0FBQ0wsTUFBTSxHQUFHLEdBQUc7Z0JBQzlCSCxTQUFTLFdBQVc5QyxNQUFNc0QsR0FBRztZQUMvQixPQUFPO2dCQUNMUixTQUFTLFFBQVE5QyxNQUFNc0QsR0FBRztZQUM1QjtRQUNGO1FBRUEsTUFBTUUsVUFBVSxDQUFDeEQ7WUFDZixJQUFJLENBQUM0QixhQUFhO2dCQUNoQjtZQUNGO1lBQ0EsTUFBTTBCLE1BQU10RCxNQUFNc0QsR0FBRztZQUNyQixJQUFJLENBQUNqQyxXQUFXa0MsR0FBRyxDQUFDRCxRQUFRO21CQUFJQTthQUFJLENBQUNMLE1BQU0sR0FBRyxHQUFHO2dCQUMvQ0gsU0FBUyxTQUFTOUMsTUFBTXNELEdBQUc7WUFDN0I7UUFDRjtRQUVBLE9BQU85QixPQUFPaUMsb0JBQW9CLENBQ2hDLENBQUM5QyxhQUFpQytDO1lBQ2hDLElBQUlBLG9CQUFvQixNQUFNO2dCQUM1QkEsZ0JBQWdCQyxtQkFBbUIsQ0FBQyxXQUFXTjtnQkFDL0NLLGdCQUFnQkMsbUJBQW1CLENBQUMsU0FBU0g7WUFDL0M7WUFDQSxJQUFJN0MsZ0JBQWdCLE1BQU07Z0JBQ3hCQSxZQUFZaUQsZ0JBQWdCLENBQUMsV0FBV1A7Z0JBQ3hDMUMsWUFBWWlELGdCQUFnQixDQUFDLFNBQVNKO1lBQ3hDO1FBQ0Y7SUFFSixHQUFHO1FBQUNoQztRQUFRSTtRQUFha0I7S0FBUztJQUVsQ00sSUFBQUEsc0JBQWUsRUFBQztRQUNkLElBQUloQixPQUFPeUIsT0FBTyxFQUFFO1lBQ2xCekIsT0FBT3lCLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDLEdBQUcxQixPQUFPeUIsT0FBTyxDQUFDRSxZQUFZO1FBQ3hEO0lBQ0YsR0FBRztRQUFDeEI7S0FBb0I7SUFFeEJ5QixJQUFBQSxnQkFBUyxFQUFDO1FBQ1IsSUFBSXZDLE9BQU87WUFDVCxNQUFNd0MsY0FBYzFCO1lBQ3BCLElBQUkwQixnQkFBZ0IsTUFBTTtnQkFDeEJqQyxpQkFBaUJpQztZQUNuQjtZQUNBLElBQUk3QixPQUFPeUIsT0FBTyxFQUFFO2dCQUNsQnpCLE9BQU95QixPQUFPLENBQUNDLFFBQVEsQ0FBQyxHQUFHMUIsT0FBT3lCLE9BQU8sQ0FBQ0UsWUFBWTtZQUN4RDtRQUNGO0lBQ0YsR0FBRztRQUFDeEI7UUFBcUJkO0tBQU07SUFFL0J1QyxJQUFBQSxnQkFBUyxFQUFDO1FBQ1IsTUFBTUUsdUJBQXVCMUMsT0FBTzJDLHNCQUFzQixDQUN4RCxDQUFDLEVBQUVDLGFBQWEsRUFBRUMsV0FBVyxFQUFFQyxXQUFXLEVBQUU7WUFDMUMsSUFBSSxDQUFDMUMsYUFBYTtnQkFDaEI7WUFDRjtZQUNBLE1BQU0yQyxtQkFBbUJELFlBQVlFLFVBQVU7WUFDL0MsTUFBTUMsb0JBQW9CeEMscUJBQXFCNEIsT0FBTztZQUN0RCxNQUFNYSwwQkFBMEJ2QywyQkFBMkIwQixPQUFPO1lBQ2xFLElBQUlZLHNCQUFzQkYsa0JBQWtCO2dCQUMxQyxJQUFJRixZQUFZTSxJQUFJLEtBQUssS0FBS1AsY0FBY08sSUFBSSxLQUFLLEtBQUssQ0FBQ0QseUJBQXlCO29CQUNsRixNQUFNakMsbUJBQW1CQyxPQUFPQyxZQUFZO29CQUM1QyxJQUNFRixvQkFDQ0EsQ0FBQUEsaUJBQWlCbEMsVUFBVSxJQUFJLFFBQVFrQyxpQkFBaUJqQyxTQUFTLElBQUksSUFBRyxHQUN6RTt3QkFDQTtvQkFDRjtnQkFDRjtnQkFDQXlCLHFCQUFxQjRCLE9BQU8sR0FBR1U7WUFDakM7WUFDQXBDLDJCQUEyQjBCLE9BQU8sR0FBRztZQUNyQyxNQUFNSSxjQUFjMUI7WUFDcEIsSUFBSTBCLGdCQUFnQixNQUFNO2dCQUN4QmpDLGlCQUFpQmlDO1lBQ25CO1FBQ0Y7UUFFRixPQUFPQztJQUNULEdBQUc7UUFBQzFDO1FBQVFlO1FBQXFCWDtRQUFha0I7S0FBUztJQUV2RCxpQkFBaUI7SUFDakJrQixJQUFBQSxnQkFBUyxFQUFDO1FBQ1IsSUFBSSxDQUFDcEMsYUFBYTtZQUNoQjtRQUNGO1FBQ0EsTUFBTXNDLHVCQUF1QjFDLE9BQU8yQyxzQkFBc0IsQ0FBQztZQUN6RCxNQUFNeEQsY0FBY2EsT0FBT2dCLGNBQWM7WUFDekMsSUFBSTdCLGdCQUFnQixNQUFNO2dCQUN4Qm1CLG9CQUFvQm5CLGFBQWFpRTtZQUNuQztRQUNGO1FBQ0EsT0FBT1Y7SUFDVCxHQUFHO1FBQUMxQztRQUFRSTtLQUFZO0lBRXhCLG1DQUFtQztJQUNuQyxNQUFNaUQsd0JBQXdCdkMsSUFBQUEsa0JBQVcsRUFDdkMsQ0FBQ3dDO1FBQ0MsSUFBSSxDQUFDbEQsYUFBYTtZQUNoQmtELGNBQWNDLE1BQU0sQ0FBQztnQkFDbkIsTUFBTUMsT0FBT0MsSUFBQUEsaUJBQVE7Z0JBQ3JCRCxLQUFLRSxLQUFLO2dCQUNWLE1BQU16SCxPQUFPMEgsSUFBQUEsd0JBQWU7Z0JBQzVCSCxLQUFLSSxNQUFNLENBQUNDLElBQUFBLDZCQUFvQixJQUFHRCxNQUFNLENBQUMzSDtnQkFDMUNBLEtBQUtXLE1BQU07WUFDYjtZQUNBc0QsU0FBUyxFQUFFO1FBQ2I7UUFDQUcsZUFBZSxDQUFDeUQscUJBQXVCLENBQUNBO0lBQzFDLEdBQ0E7UUFBQzFEO0tBQVk7SUFHZixNQUFNMkQsa0JBQWtCakQsSUFBQUEsa0JBQVcsRUFBQztRQUNsQyxJQUFJLENBQUNWLGFBQWE7WUFDaEI7UUFDRjtRQUNBLE1BQU1hLG1CQUFtQkMsT0FBT0MsWUFBWTtRQUM1QyxJQUNFRixxQkFBcUIsUUFDckJBLGlCQUFpQmxDLFVBQVUsSUFBSSxRQUMvQmtDLGlCQUFpQmpDLFNBQVMsSUFBSSxNQUM5QjtZQUNBO1FBQ0Y7UUFDQSxNQUFNLEVBQUVELFVBQVUsRUFBRWIsWUFBWSxFQUFFYyxTQUFTLEVBQUVaLFdBQVcsRUFBRSxHQUFHUyxrQkFBa0JvQztRQUMvRSxNQUFNOUIsY0FBYzBCLG1CQUFtQkcsY0FBYztRQUNyRCxJQUFJaEQ7UUFDSixJQUFJZSxlQUFlLE1BQU07WUFDdkJmLGFBQWFpQix3QkFBd0JGLFlBQVlJO1FBQ25EO1FBQ0EsSUFBSWhCO1FBQ0osSUFBSWEsY0FBYyxNQUFNO1lBQ3RCYixZQUFZYyx3QkFBd0JELFdBQVdHO1FBQ2pEO1FBQ0FtQyxTQUFTLFlBQVk7WUFDbkJ2QztZQUNBYjtZQUNBRjtZQUNBZ0I7WUFDQVo7WUFDQUQ7UUFDRjtJQUNGLEdBQUc7UUFBQ21EO1FBQVVsQjtRQUFhUztLQUFpQjtJQUU1QyxNQUFNbUQsY0FBY2xELElBQUFBLGtCQUFXLEVBQUM7UUFDOUI5RSxLQUFLK0U7SUFDUCxHQUFHO1FBQUNBO0tBQW9CO0lBRXhCLE1BQU1rRCxrQkFBa0JuRCxJQUFBQSxrQkFBVyxFQUFDO1FBQ2xDM0QsU0FBUyxXQUFXNEQ7SUFDdEIsR0FBRztRQUFDQTtLQUFvQjtJQUV4QixNQUFNbUQsdUJBQ0oscUJBQUNBO1FBQ0NDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRS9ELGNBQWMsV0FBVyxHQUFHLENBQUM7UUFDN0RnRSxJQUFHO1FBQ0hDLFNBQVMsQ0FBQ0M7WUFDUmpCLHNCQUFzQnhDO1lBQ3RCeUQsRUFBRUMsY0FBYztRQUNsQjtRQUNBQyxPQUFPcEUsY0FBYywwQkFBMEI7T0FFOUNBLGNBQWMsMEJBQTBCO0lBRzdDLE1BQU1xRSxTQUFTckUsNEJBQ2IscUJBQUNzRTtRQUFJUCxXQUFVO3FCQUNiLHFCQUFDTztRQUFJUCxXQUFVO3FCQUNiLHFCQUFDRDtRQUNDQyxXQUFVO1FBQ1ZDLElBQUc7UUFDSEMsU0FBUyxDQUFDQztZQUNSUDtZQUNBTyxFQUFFQyxjQUFjO1FBQ2xCO1FBQ0FDLE9BQU07T0FDUCxrQ0FHRCxxQkFBQ047UUFDQ0MsV0FBVTtRQUNWQyxJQUFHO1FBQ0hDLFNBQVMsQ0FBQ0M7WUFDUk47WUFDQU0sRUFBRUMsY0FBYztRQUNsQjtRQUNBQyxPQUFNO09BQ1AsdUJBR0QscUJBQUNOO1FBQ0NDLFdBQVU7UUFDVkMsSUFBRztRQUNIQyxTQUFTLENBQUNDO1lBQ1JMO1lBQ0FLLEVBQUVDLGNBQWM7UUFDbEI7UUFDQUMsT0FBTTtPQUNQLDRCQUlILHFCQUFDRztRQUFJUCxJQUFHO1FBQWdCUSxLQUFLaEU7T0FDMUJMLGtCQUdIO0lBRUosT0FBTztRQUFDMkQ7UUFBUU87S0FBTztBQUN6QjtBQUNPLE1BQU0xSSxxQkFBK0I7SUFDMUMsTUFBTSxDQUFDaUUsT0FBTyxHQUFHNkUsSUFBQUEsaURBQXlCO0lBQzFDLE1BQU0sQ0FBQ0Msb0JBQW9CQyxtQkFBbUIsR0FBR2hGLGdCQUFnQkM7SUFFakUscUJBQ0UscUJBQUNnRixPQUFNQyxRQUFRLHNCQUNiLHFCQUFDQyxXQUFFLE9BQ0ZKLG9CQUNBQyxrQ0FDRCxxQkFBQ0csV0FBRTtBQUdUIn0=
@@ -0,0 +1,51 @@
1
+ .test-recorder-output {
2
+ margin: 20px auto 20px auto;
3
+ width: 100%;
4
+ }
5
+ .test-recorder-toolbar {
6
+ display: flex;
7
+ }
8
+
9
+ .test-recorder-button {
10
+ position: relative;
11
+ display: block;
12
+ font-size: 10px;
13
+ padding: 6px 6px;
14
+ border-radius: 4px;
15
+ border: none;
16
+ cursor: pointer;
17
+ outline: none;
18
+ box-shadow: 1px 2px 2px rgba(0, 0, 0, 0.4);
19
+ background-color: #222;
20
+ color: white;
21
+ transition: box-shadow 50ms ease-out;
22
+ }
23
+
24
+ .test-recorder-button:active {
25
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.4);
26
+ }
27
+
28
+ .test-recorder-button + .test-recorder-button {
29
+ margin-left: 4px;
30
+ }
31
+
32
+ .test-recorder-button::after {
33
+ content: '';
34
+ position: absolute;
35
+ top: 8px;
36
+ right: 8px;
37
+ bottom: 8px;
38
+ left: 8px;
39
+ display: block;
40
+ background-size: contain;
41
+ filter: invert(1);
42
+ }
43
+ #test-recorder-button {
44
+ position: relative;
45
+ }
46
+
47
+ #test-recorder-button-snapshot {
48
+ margin-right: auto;
49
+ }
50
+
51
+
@@ -17,7 +17,7 @@ const TreeviewFeature = ()=>{
17
17
  plugins: [
18
18
  {
19
19
  Component: _plugin.TreeViewPlugin,
20
- position: 'normal'
20
+ position: 'bottom'
21
21
  }
22
22
  ],
23
23
  props: null
@@ -27,4 +27,4 @@ const TreeviewFeature = ()=>{
27
27
  };
28
28
  };
29
29
 
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9maWVsZC9mZWF0dXJlcy9kZWJ1Zy9UcmVlVmlldy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZlYXR1cmVQcm92aWRlciB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuXG5pbXBvcnQgJy4vaW5kZXguc2NzcydcbmltcG9ydCB7IFRyZWVWaWV3UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4nXG5cbmV4cG9ydCBjb25zdCBUcmVldmlld0ZlYXR1cmUgPSAoKTogRmVhdHVyZVByb3ZpZGVyID0+IHtcbiAgcmV0dXJuIHtcbiAgICBmZWF0dXJlOiAoeyByZXNvbHZlZEZlYXR1cmVzLCB1bnNhbml0aXplZEVkaXRvckNvbmZpZyB9KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgQ29tcG9uZW50OiBUcmVlVmlld1BsdWdpbixcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnbm9ybWFsJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgIH1cbiAgICB9LFxuICAgIGtleTogJ2RlYnVnLXRyZWV2aWV3JyxcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlRyZWV2aWV3RmVhdHVyZSIsImZlYXR1cmUiLCJyZXNvbHZlZEZlYXR1cmVzIiwidW5zYW5pdGl6ZWRFZGl0b3JDb25maWciLCJwbHVnaW5zIiwiQ29tcG9uZW50IiwiVHJlZVZpZXdQbHVnaW4iLCJwb3NpdGlvbiIsInByb3BzIiwia2V5Il0sIm1hcHBpbmdzIjoiOzs7OytCQUthQTs7O2VBQUFBOzs7UUFITjt3QkFDd0I7QUFFeEIsTUFBTUEsa0JBQWtCO0lBQzdCLE9BQU87UUFDTEMsU0FBUyxDQUFDLEVBQUVDLGdCQUFnQixFQUFFQyx1QkFBdUIsRUFBRTtZQUNyRCxPQUFPO2dCQUNMQyxTQUFTO29CQUNQO3dCQUNFQyxXQUFXQyxzQkFBYzt3QkFDekJDLFVBQVU7b0JBQ1o7aUJBQ0Q7Z0JBQ0RDLE9BQU87WUFDVDtRQUNGO1FBQ0FDLEtBQUs7SUFDUDtBQUNGIn0=
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9maWVsZC9mZWF0dXJlcy9kZWJ1Zy9UcmVlVmlldy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZlYXR1cmVQcm92aWRlciB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuXG5pbXBvcnQgJy4vaW5kZXguc2NzcydcbmltcG9ydCB7IFRyZWVWaWV3UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4nXG5cbmV4cG9ydCBjb25zdCBUcmVldmlld0ZlYXR1cmUgPSAoKTogRmVhdHVyZVByb3ZpZGVyID0+IHtcbiAgcmV0dXJuIHtcbiAgICBmZWF0dXJlOiAoeyByZXNvbHZlZEZlYXR1cmVzLCB1bnNhbml0aXplZEVkaXRvckNvbmZpZyB9KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgQ29tcG9uZW50OiBUcmVlVmlld1BsdWdpbixcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYm90dG9tJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgIH1cbiAgICB9LFxuICAgIGtleTogJ2RlYnVnLXRyZWV2aWV3JyxcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlRyZWV2aWV3RmVhdHVyZSIsImZlYXR1cmUiLCJyZXNvbHZlZEZlYXR1cmVzIiwidW5zYW5pdGl6ZWRFZGl0b3JDb25maWciLCJwbHVnaW5zIiwiQ29tcG9uZW50IiwiVHJlZVZpZXdQbHVnaW4iLCJwb3NpdGlvbiIsInByb3BzIiwia2V5Il0sIm1hcHBpbmdzIjoiOzs7OytCQUthQTs7O2VBQUFBOzs7UUFITjt3QkFDd0I7QUFFeEIsTUFBTUEsa0JBQWtCO0lBQzdCLE9BQU87UUFDTEMsU0FBUyxDQUFDLEVBQUVDLGdCQUFnQixFQUFFQyx1QkFBdUIsRUFBRTtZQUNyRCxPQUFPO2dCQUNMQyxTQUFTO29CQUNQO3dCQUNFQyxXQUFXQyxzQkFBYzt3QkFDekJDLFVBQVU7b0JBQ1o7aUJBQ0Q7Z0JBQ0RDLE9BQU87WUFDVDtRQUNGO1FBQ0FDLEtBQUs7SUFDUDtBQUNGIn0=
@@ -59,6 +59,14 @@ export type Feature = {
59
59
  plugins?: Array<{
60
60
  Component: React.FC;
61
61
  position: 'normal';
62
+ } | {
63
+ Component: React.FC;
64
+ position: 'top';
65
+ } | {
66
+ Component: React.FC<{
67
+ anchorElem: HTMLElement;
68
+ }>;
69
+ position: 'bottom';
62
70
  } | {
63
71
  Component: React.FC<{
64
72
  anchorElem: HTMLElement;
@@ -117,9 +125,17 @@ export type SanitizedFeatures = Required<Pick<ResolvedFeature, 'markdownTransfor
117
125
  }) => SerializedEditorState>;
118
126
  };
119
127
  plugins?: Array<{
128
+ Component: React.FC;
129
+ key: string;
130
+ position: 'bottom';
131
+ } | {
120
132
  Component: React.FC;
121
133
  key: string;
122
134
  position: 'normal';
135
+ } | {
136
+ Component: React.FC;
137
+ key: string;
138
+ position: 'top';
123
139
  } | {
124
140
  Component: React.FC<{
125
141
  anchorElem: HTMLElement;