@pie-lib/editable-html-tip-tap 2.1.20-beta.1 → 2.1.20-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/__tests__/EditableHtml.test.js +831 -0
- package/lib/__tests__/constants.test.js +21 -0
- package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
- package/lib/__tests__/extensions.test.js +209 -0
- package/lib/__tests__/index.test.js +250 -0
- package/lib/__tests__/size-utils.test.js +57 -0
- package/lib/__tests__/spellcheck.test.js +142 -0
- package/lib/__tests__/theme.test.js +17 -0
- package/lib/components/__tests__/AltDialog.test.js +201 -0
- package/lib/components/__tests__/CharacterPicker.test.js +455 -0
- package/lib/components/__tests__/CssIcon.test.js +58 -0
- package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
- package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
- package/lib/components/__tests__/ImageToolbar.test.js +185 -0
- package/lib/components/__tests__/InlineDropdown.test.js +839 -0
- package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
- package/lib/components/__tests__/MediaDialog.test.js +433 -0
- package/lib/components/__tests__/MediaToolbar.test.js +126 -0
- package/lib/components/__tests__/MediaWrapper.test.js +96 -0
- package/lib/components/__tests__/MenuBar.test.js +502 -0
- package/lib/components/__tests__/RespArea.test.js +171 -0
- package/lib/components/__tests__/TableIcons.test.js +153 -0
- package/lib/components/__tests__/TextAlign.test.js +209 -0
- package/lib/components/__tests__/TiptapContainer.test.js +196 -0
- package/lib/components/__tests__/characterUtils.test.js +178 -0
- package/lib/components/__tests__/choice.test.js +213 -0
- package/lib/components/__tests__/custom-popper.test.js +108 -0
- package/lib/components/__tests__/done-button.test.js +72 -0
- package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
- package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
- package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
- package/lib/extensions/__tests__/css.test.js +214 -0
- package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
- package/lib/extensions/__tests__/divNode.test.js +108 -0
- package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
- package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
- package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
- package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
- package/lib/extensions/__tests__/extended-table.test.js +200 -0
- package/lib/extensions/__tests__/image-component.test.js +432 -0
- package/lib/extensions/__tests__/image.test.js +313 -0
- package/lib/extensions/__tests__/math.test.js +1411 -0
- package/lib/extensions/__tests__/media-node-view.test.js +307 -0
- package/lib/extensions/__tests__/media.test.js +292 -0
- package/lib/extensions/__tests__/responseArea.test.js +736 -0
- package/lib/utils/__tests__/helper.test.js +107 -0
- package/lib/utils/__tests__/toolbar.test.js +38 -0
- package/package.json +3 -3
- package/src/__tests__/EditableHtml.test.jsx +588 -0
- package/src/__tests__/constants.test.js +19 -0
- package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
- package/src/__tests__/extensions.test.js +208 -0
- package/src/__tests__/index.test.jsx +154 -0
- package/src/__tests__/size-utils.test.js +64 -0
- package/src/__tests__/theme.test.js +17 -0
- package/src/components/__tests__/AltDialog.test.jsx +147 -0
- package/src/components/__tests__/CharacterPicker.test.jsx +270 -0
- package/src/components/__tests__/CssIcon.test.jsx +46 -0
- package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
- package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +209 -0
- package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
- package/src/components/__tests__/InlineDropdown.test.jsx +557 -0
- package/src/components/__tests__/InsertImageHandler.test.js +161 -0
- package/src/components/__tests__/MediaDialog.test.jsx +293 -0
- package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
- package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
- package/src/components/__tests__/MenuBar.test.jsx +250 -0
- package/src/components/__tests__/RespArea.test.jsx +122 -0
- package/src/components/__tests__/TableIcons.test.jsx +149 -0
- package/src/components/__tests__/TextAlign.test.jsx +167 -0
- package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
- package/src/components/__tests__/characterUtils.test.js +166 -0
- package/src/components/__tests__/choice.test.jsx +171 -0
- package/src/components/__tests__/custom-popper.test.jsx +82 -0
- package/src/components/__tests__/done-button.test.jsx +54 -0
- package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
- package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
- package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
- package/src/extensions/__tests__/css.test.js +196 -0
- package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
- package/src/extensions/__tests__/divNode.test.js +87 -0
- package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
- package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
- package/src/extensions/__tests__/extended-list-item.test.js +13 -0
- package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
- package/src/extensions/__tests__/extended-table.test.js +183 -0
- package/src/extensions/__tests__/image-component.test.jsx +346 -0
- package/src/extensions/__tests__/image.test.js +237 -0
- package/src/extensions/__tests__/math.test.js +900 -0
- package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
- package/src/extensions/__tests__/media.test.js +271 -0
- package/src/extensions/__tests__/responseArea.test.js +655 -0
- package/src/utils/__tests__/helper.test.js +126 -0
- package/src/utils/__tests__/toolbar.test.js +43 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _InsertImageHandler = _interopRequireDefault(require("../image/InsertImageHandler"));
|
|
5
|
+
describe('InsertImageHandler', function () {
|
|
6
|
+
var mockNode = {
|
|
7
|
+
attrs: {},
|
|
8
|
+
nodeSize: 1
|
|
9
|
+
};
|
|
10
|
+
var NODE_POS = 5;
|
|
11
|
+
var nodeInfo = function nodeInfo() {
|
|
12
|
+
var node = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : mockNode;
|
|
13
|
+
var pos = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : NODE_POS;
|
|
14
|
+
return [node, pos];
|
|
15
|
+
};
|
|
16
|
+
var createMockEditor = function createMockEditor() {
|
|
17
|
+
return {
|
|
18
|
+
_insertingImage: true,
|
|
19
|
+
state: {
|
|
20
|
+
doc: {},
|
|
21
|
+
tr: {
|
|
22
|
+
setNodeMarkup: jest.fn(function (pos, type, attrs) {
|
|
23
|
+
return {
|
|
24
|
+
setNodeMarkup: jest.fn()
|
|
25
|
+
};
|
|
26
|
+
}),
|
|
27
|
+
"delete": jest.fn(function (from, to) {
|
|
28
|
+
return {
|
|
29
|
+
"delete": jest.fn()
|
|
30
|
+
};
|
|
31
|
+
})
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
view: {
|
|
35
|
+
dispatch: jest.fn()
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
var mockOnFinish = jest.fn();
|
|
40
|
+
beforeEach(function () {
|
|
41
|
+
jest.clearAllMocks();
|
|
42
|
+
});
|
|
43
|
+
it('creates handler instance', function () {
|
|
44
|
+
var editor = createMockEditor();
|
|
45
|
+
var info = nodeInfo();
|
|
46
|
+
var handler = new _InsertImageHandler["default"](editor, info, mockOnFinish);
|
|
47
|
+
expect(handler).toBeDefined();
|
|
48
|
+
expect(handler.editor).toBe(editor);
|
|
49
|
+
expect(handler.nodeInfo).toBe(info);
|
|
50
|
+
expect(handler.node).toBe(mockNode);
|
|
51
|
+
expect(handler.onFinish).toBe(mockOnFinish);
|
|
52
|
+
});
|
|
53
|
+
it('stores nodePos from nodeInfo tuple', function () {
|
|
54
|
+
var editor = createMockEditor();
|
|
55
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(mockNode, 42), mockOnFinish);
|
|
56
|
+
expect(handler.nodePos).toBe(42);
|
|
57
|
+
});
|
|
58
|
+
it('stores isPasted parameter', function () {
|
|
59
|
+
var editor = createMockEditor();
|
|
60
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish, true);
|
|
61
|
+
expect(handler.isPasted).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it('defaults isPasted to false', function () {
|
|
64
|
+
var editor = createMockEditor();
|
|
65
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish);
|
|
66
|
+
expect(handler.isPasted).toBe(false);
|
|
67
|
+
});
|
|
68
|
+
it('cancel deletes node and calls onFinish', function () {
|
|
69
|
+
var editor = createMockEditor();
|
|
70
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish);
|
|
71
|
+
handler.cancel();
|
|
72
|
+
expect(mockOnFinish).toHaveBeenCalledWith(false);
|
|
73
|
+
expect(editor._insertingImage).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
it('updateNode dispatches transaction with new attributes', function () {
|
|
76
|
+
var editor = createMockEditor();
|
|
77
|
+
var mockNodeAt = jest.fn(function () {
|
|
78
|
+
return {
|
|
79
|
+
attrs: {
|
|
80
|
+
existing: 'value'
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
editor.state.doc.nodeAt = mockNodeAt;
|
|
85
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish);
|
|
86
|
+
handler.updateNode({
|
|
87
|
+
newAttr: 'newValue'
|
|
88
|
+
});
|
|
89
|
+
expect(mockNodeAt).toHaveBeenCalledWith(NODE_POS);
|
|
90
|
+
expect(editor.view.dispatch).toHaveBeenCalled();
|
|
91
|
+
});
|
|
92
|
+
it('done calls onFinish with false on error', function () {
|
|
93
|
+
var editor = createMockEditor();
|
|
94
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish);
|
|
95
|
+
var consoleLogSpy = jest.spyOn(console, 'log').mockImplementation();
|
|
96
|
+
handler.done('error', null);
|
|
97
|
+
expect(consoleLogSpy).toHaveBeenCalledWith('error');
|
|
98
|
+
expect(mockOnFinish).toHaveBeenCalledWith(false);
|
|
99
|
+
expect(editor._insertingImage).toBe(false);
|
|
100
|
+
consoleLogSpy.mockRestore();
|
|
101
|
+
});
|
|
102
|
+
it('done updates node and calls onFinish with true on success', function () {
|
|
103
|
+
var editor = createMockEditor();
|
|
104
|
+
var mockNodeAt = jest.fn(function () {
|
|
105
|
+
return {
|
|
106
|
+
attrs: {}
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
editor.state.doc.nodeAt = mockNodeAt;
|
|
110
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish);
|
|
111
|
+
handler.done(null, 'http://example.com/image.jpg');
|
|
112
|
+
expect(editor.view.dispatch).toHaveBeenCalled();
|
|
113
|
+
expect(mockOnFinish).toHaveBeenCalledWith(true);
|
|
114
|
+
expect(editor._insertingImage).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
it('fileChosen returns early when no file provided', function () {
|
|
117
|
+
var editor = createMockEditor();
|
|
118
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish);
|
|
119
|
+
handler.fileChosen(null);
|
|
120
|
+
expect(editor.view.dispatch).not.toHaveBeenCalled();
|
|
121
|
+
});
|
|
122
|
+
it('fileChosen saves file and reads it as data URL', function () {
|
|
123
|
+
var editor = createMockEditor();
|
|
124
|
+
var mockNodeAt = jest.fn(function () {
|
|
125
|
+
return {
|
|
126
|
+
attrs: {}
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
editor.state.doc.nodeAt = mockNodeAt;
|
|
130
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish);
|
|
131
|
+
var mockFile = new File(['content'], 'test.jpg', {
|
|
132
|
+
type: 'image/jpeg'
|
|
133
|
+
});
|
|
134
|
+
global.FileReader = jest.fn(function () {
|
|
135
|
+
this.readAsDataURL = jest.fn(function () {
|
|
136
|
+
this.result = 'data:image/jpeg;base64,abc123';
|
|
137
|
+
this.onload();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
handler.fileChosen(mockFile);
|
|
141
|
+
expect(handler.chosenFile).toBe(mockFile);
|
|
142
|
+
expect(editor._insertingImage).toBe(false);
|
|
143
|
+
});
|
|
144
|
+
it('progress updates node with percent', function () {
|
|
145
|
+
var editor = createMockEditor();
|
|
146
|
+
var mockNodeAt = jest.fn(function () {
|
|
147
|
+
return {
|
|
148
|
+
attrs: {}
|
|
149
|
+
};
|
|
150
|
+
});
|
|
151
|
+
editor.state.doc.nodeAt = mockNodeAt;
|
|
152
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish);
|
|
153
|
+
handler.progress(50, 500, 1000);
|
|
154
|
+
expect(editor.view.dispatch).toHaveBeenCalled();
|
|
155
|
+
});
|
|
156
|
+
it('getChosenFile returns the chosen file', function () {
|
|
157
|
+
var editor = createMockEditor();
|
|
158
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish);
|
|
159
|
+
var mockFile = new File(['content'], 'test.jpg', {
|
|
160
|
+
type: 'image/jpeg'
|
|
161
|
+
});
|
|
162
|
+
handler.chosenFile = mockFile;
|
|
163
|
+
expect(handler.getChosenFile()).toBe(mockFile);
|
|
164
|
+
});
|
|
165
|
+
it('getChosenFile returns null initially', function () {
|
|
166
|
+
var editor = createMockEditor();
|
|
167
|
+
var handler = new _InsertImageHandler["default"](editor, nodeInfo(), mockOnFinish);
|
|
168
|
+
expect(handler.getChosenFile()).toBeNull();
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfSW5zZXJ0SW1hZ2VIYW5kbGVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJkZXNjcmliZSIsIm1vY2tOb2RlIiwiYXR0cnMiLCJub2RlU2l6ZSIsIk5PREVfUE9TIiwibm9kZUluZm8iLCJub2RlIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwicG9zIiwiY3JlYXRlTW9ja0VkaXRvciIsIl9pbnNlcnRpbmdJbWFnZSIsInN0YXRlIiwiZG9jIiwidHIiLCJzZXROb2RlTWFya3VwIiwiamVzdCIsImZuIiwidHlwZSIsImZyb20iLCJ0byIsInZpZXciLCJkaXNwYXRjaCIsIm1vY2tPbkZpbmlzaCIsImJlZm9yZUVhY2giLCJjbGVhckFsbE1vY2tzIiwiaXQiLCJlZGl0b3IiLCJpbmZvIiwiaGFuZGxlciIsIkluc2VydEltYWdlSGFuZGxlciIsImV4cGVjdCIsInRvQmVEZWZpbmVkIiwidG9CZSIsIm9uRmluaXNoIiwibm9kZVBvcyIsImlzUGFzdGVkIiwiY2FuY2VsIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJtb2NrTm9kZUF0IiwiZXhpc3RpbmciLCJub2RlQXQiLCJ1cGRhdGVOb2RlIiwibmV3QXR0ciIsInRvSGF2ZUJlZW5DYWxsZWQiLCJjb25zb2xlTG9nU3B5Iiwic3B5T24iLCJjb25zb2xlIiwibW9ja0ltcGxlbWVudGF0aW9uIiwiZG9uZSIsIm1vY2tSZXN0b3JlIiwiZmlsZUNob3NlbiIsIm5vdCIsIm1vY2tGaWxlIiwiRmlsZSIsImdsb2JhbCIsIkZpbGVSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwicmVzdWx0Iiwib25sb2FkIiwiY2hvc2VuRmlsZSIsInByb2dyZXNzIiwiZ2V0Q2hvc2VuRmlsZSIsInRvQmVOdWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvX190ZXN0c19fL0luc2VydEltYWdlSGFuZGxlci50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJbnNlcnRJbWFnZUhhbmRsZXIgZnJvbSAnLi4vaW1hZ2UvSW5zZXJ0SW1hZ2VIYW5kbGVyJztcblxuZGVzY3JpYmUoJ0luc2VydEltYWdlSGFuZGxlcicsICgpID0+IHtcbiAgY29uc3QgbW9ja05vZGUgPSB7XG4gICAgYXR0cnM6IHt9LFxuICAgIG5vZGVTaXplOiAxLFxuICB9O1xuXG4gIGNvbnN0IE5PREVfUE9TID0gNTtcblxuICBjb25zdCBub2RlSW5mbyA9IChub2RlID0gbW9ja05vZGUsIHBvcyA9IE5PREVfUE9TKSA9PiBbbm9kZSwgcG9zXTtcblxuICBjb25zdCBjcmVhdGVNb2NrRWRpdG9yID0gKCkgPT4gKHtcbiAgICBfaW5zZXJ0aW5nSW1hZ2U6IHRydWUsXG4gICAgc3RhdGU6IHtcbiAgICAgIGRvYzoge30sXG4gICAgICB0cjoge1xuICAgICAgICBzZXROb2RlTWFya3VwOiBqZXN0LmZuKChwb3MsIHR5cGUsIGF0dHJzKSA9PiAoeyBzZXROb2RlTWFya3VwOiBqZXN0LmZuKCkgfSkpLFxuICAgICAgICBkZWxldGU6IGplc3QuZm4oKGZyb20sIHRvKSA9PiAoeyBkZWxldGU6IGplc3QuZm4oKSB9KSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgdmlldzoge1xuICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBtb2NrT25GaW5pc2ggPSBqZXN0LmZuKCk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGl0KCdjcmVhdGVzIGhhbmRsZXIgaW5zdGFuY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgZWRpdG9yID0gY3JlYXRlTW9ja0VkaXRvcigpO1xuICAgIGNvbnN0IGluZm8gPSBub2RlSW5mbygpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSW5zZXJ0SW1hZ2VIYW5kbGVyKGVkaXRvciwgaW5mbywgbW9ja09uRmluaXNoKTtcbiAgICBleHBlY3QoaGFuZGxlcikudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QoaGFuZGxlci5lZGl0b3IpLnRvQmUoZWRpdG9yKTtcbiAgICBleHBlY3QoaGFuZGxlci5ub2RlSW5mbykudG9CZShpbmZvKTtcbiAgICBleHBlY3QoaGFuZGxlci5ub2RlKS50b0JlKG1vY2tOb2RlKTtcbiAgICBleHBlY3QoaGFuZGxlci5vbkZpbmlzaCkudG9CZShtb2NrT25GaW5pc2gpO1xuICB9KTtcblxuICBpdCgnc3RvcmVzIG5vZGVQb3MgZnJvbSBub2RlSW5mbyB0dXBsZScsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBub2RlSW5mbyhtb2NrTm9kZSwgNDIpLCBtb2NrT25GaW5pc2gpO1xuICAgIGV4cGVjdChoYW5kbGVyLm5vZGVQb3MpLnRvQmUoNDIpO1xuICB9KTtcblxuICBpdCgnc3RvcmVzIGlzUGFzdGVkIHBhcmFtZXRlcicsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBub2RlSW5mbygpLCBtb2NrT25GaW5pc2gsIHRydWUpO1xuICAgIGV4cGVjdChoYW5kbGVyLmlzUGFzdGVkKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgnZGVmYXVsdHMgaXNQYXN0ZWQgdG8gZmFsc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgZWRpdG9yID0gY3JlYXRlTW9ja0VkaXRvcigpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSW5zZXJ0SW1hZ2VIYW5kbGVyKGVkaXRvciwgbm9kZUluZm8oKSwgbW9ja09uRmluaXNoKTtcbiAgICBleHBlY3QoaGFuZGxlci5pc1Bhc3RlZCkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdjYW5jZWwgZGVsZXRlcyBub2RlIGFuZCBjYWxscyBvbkZpbmlzaCcsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBub2RlSW5mbygpLCBtb2NrT25GaW5pc2gpO1xuICAgIGhhbmRsZXIuY2FuY2VsKCk7XG4gICAgZXhwZWN0KG1vY2tPbkZpbmlzaCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZmFsc2UpO1xuICAgIGV4cGVjdChlZGl0b3IuX2luc2VydGluZ0ltYWdlKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3VwZGF0ZU5vZGUgZGlzcGF0Y2hlcyB0cmFuc2FjdGlvbiB3aXRoIG5ldyBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGNyZWF0ZU1vY2tFZGl0b3IoKTtcbiAgICBjb25zdCBtb2NrTm9kZUF0ID0gamVzdC5mbigoKSA9PiAoeyBhdHRyczogeyBleGlzdGluZzogJ3ZhbHVlJyB9IH0pKTtcbiAgICBlZGl0b3Iuc3RhdGUuZG9jLm5vZGVBdCA9IG1vY2tOb2RlQXQ7XG5cbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEluc2VydEltYWdlSGFuZGxlcihlZGl0b3IsIG5vZGVJbmZvKCksIG1vY2tPbkZpbmlzaCk7XG4gICAgaGFuZGxlci51cGRhdGVOb2RlKHsgbmV3QXR0cjogJ25ld1ZhbHVlJyB9KTtcblxuICAgIGV4cGVjdChtb2NrTm9kZUF0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChOT0RFX1BPUyk7XG4gICAgZXhwZWN0KGVkaXRvci52aWV3LmRpc3BhdGNoKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdkb25lIGNhbGxzIG9uRmluaXNoIHdpdGggZmFsc2Ugb24gZXJyb3InLCAoKSA9PiB7XG4gICAgY29uc3QgZWRpdG9yID0gY3JlYXRlTW9ja0VkaXRvcigpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSW5zZXJ0SW1hZ2VIYW5kbGVyKGVkaXRvciwgbm9kZUluZm8oKSwgbW9ja09uRmluaXNoKTtcbiAgICBjb25zdCBjb25zb2xlTG9nU3B5ID0gamVzdC5zcHlPbihjb25zb2xlLCAnbG9nJykubW9ja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICBoYW5kbGVyLmRvbmUoJ2Vycm9yJywgbnVsbCk7XG5cbiAgICBleHBlY3QoY29uc29sZUxvZ1NweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Vycm9yJyk7XG4gICAgZXhwZWN0KG1vY2tPbkZpbmlzaCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZmFsc2UpO1xuICAgIGV4cGVjdChlZGl0b3IuX2luc2VydGluZ0ltYWdlKS50b0JlKGZhbHNlKTtcbiAgICBjb25zb2xlTG9nU3B5Lm1vY2tSZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdkb25lIHVwZGF0ZXMgbm9kZSBhbmQgY2FsbHMgb25GaW5pc2ggd2l0aCB0cnVlIG9uIHN1Y2Nlc3MnLCAoKSA9PiB7XG4gICAgY29uc3QgZWRpdG9yID0gY3JlYXRlTW9ja0VkaXRvcigpO1xuICAgIGNvbnN0IG1vY2tOb2RlQXQgPSBqZXN0LmZuKCgpID0+ICh7IGF0dHJzOiB7fSB9KSk7XG4gICAgZWRpdG9yLnN0YXRlLmRvYy5ub2RlQXQgPSBtb2NrTm9kZUF0O1xuXG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBub2RlSW5mbygpLCBtb2NrT25GaW5pc2gpO1xuICAgIGhhbmRsZXIuZG9uZShudWxsLCAnaHR0cDovL2V4YW1wbGUuY29tL2ltYWdlLmpwZycpO1xuXG4gICAgZXhwZWN0KGVkaXRvci52aWV3LmRpc3BhdGNoKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgZXhwZWN0KG1vY2tPbkZpbmlzaCkudG9IYXZlQmVlbkNhbGxlZFdpdGgodHJ1ZSk7XG4gICAgZXhwZWN0KGVkaXRvci5faW5zZXJ0aW5nSW1hZ2UpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnZmlsZUNob3NlbiByZXR1cm5zIGVhcmx5IHdoZW4gbm8gZmlsZSBwcm92aWRlZCcsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBub2RlSW5mbygpLCBtb2NrT25GaW5pc2gpO1xuICAgIGhhbmRsZXIuZmlsZUNob3NlbihudWxsKTtcbiAgICBleHBlY3QoZWRpdG9yLnZpZXcuZGlzcGF0Y2gpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdmaWxlQ2hvc2VuIHNhdmVzIGZpbGUgYW5kIHJlYWRzIGl0IGFzIGRhdGEgVVJMJywgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGNyZWF0ZU1vY2tFZGl0b3IoKTtcbiAgICBjb25zdCBtb2NrTm9kZUF0ID0gamVzdC5mbigoKSA9PiAoeyBhdHRyczoge30gfSkpO1xuICAgIGVkaXRvci5zdGF0ZS5kb2Mubm9kZUF0ID0gbW9ja05vZGVBdDtcblxuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSW5zZXJ0SW1hZ2VIYW5kbGVyKGVkaXRvciwgbm9kZUluZm8oKSwgbW9ja09uRmluaXNoKTtcbiAgICBjb25zdCBtb2NrRmlsZSA9IG5ldyBGaWxlKFsnY29udGVudCddLCAndGVzdC5qcGcnLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KTtcblxuICAgIGdsb2JhbC5GaWxlUmVhZGVyID0gamVzdC5mbihmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnJlYWRBc0RhdGFVUkwgPSBqZXN0LmZuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSAnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCxhYmMxMjMnO1xuICAgICAgICB0aGlzLm9ubG9hZCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBoYW5kbGVyLmZpbGVDaG9zZW4obW9ja0ZpbGUpO1xuXG4gICAgZXhwZWN0KGhhbmRsZXIuY2hvc2VuRmlsZSkudG9CZShtb2NrRmlsZSk7XG4gICAgZXhwZWN0KGVkaXRvci5faW5zZXJ0aW5nSW1hZ2UpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICBpdCgncHJvZ3Jlc3MgdXBkYXRlcyBub2RlIHdpdGggcGVyY2VudCcsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgbW9ja05vZGVBdCA9IGplc3QuZm4oKCkgPT4gKHsgYXR0cnM6IHt9IH0pKTtcbiAgICBlZGl0b3Iuc3RhdGUuZG9jLm5vZGVBdCA9IG1vY2tOb2RlQXQ7XG5cbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEluc2VydEltYWdlSGFuZGxlcihlZGl0b3IsIG5vZGVJbmZvKCksIG1vY2tPbkZpbmlzaCk7XG4gICAgaGFuZGxlci5wcm9ncmVzcyg1MCwgNTAwLCAxMDAwKTtcblxuICAgIGV4cGVjdChlZGl0b3Iudmlldy5kaXNwYXRjaCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdCgnZ2V0Q2hvc2VuRmlsZSByZXR1cm5zIHRoZSBjaG9zZW4gZmlsZScsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBub2RlSW5mbygpLCBtb2NrT25GaW5pc2gpO1xuICAgIGNvbnN0IG1vY2tGaWxlID0gbmV3IEZpbGUoWydjb250ZW50J10sICd0ZXN0LmpwZycsIHsgdHlwZTogJ2ltYWdlL2pwZWcnIH0pO1xuICAgIGhhbmRsZXIuY2hvc2VuRmlsZSA9IG1vY2tGaWxlO1xuXG4gICAgZXhwZWN0KGhhbmRsZXIuZ2V0Q2hvc2VuRmlsZSgpKS50b0JlKG1vY2tGaWxlKTtcbiAgfSk7XG5cbiAgaXQoJ2dldENob3NlbkZpbGUgcmV0dXJucyBudWxsIGluaXRpYWxseScsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBub2RlSW5mbygpLCBtb2NrT25GaW5pc2gpO1xuICAgIGV4cGVjdChoYW5kbGVyLmdldENob3NlbkZpbGUoKSkudG9CZU51bGwoKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsbUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsWUFBTTtFQUNuQyxJQUFNQyxRQUFRLEdBQUc7SUFDZkMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNUQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBRUQsSUFBTUMsUUFBUSxHQUFHLENBQUM7RUFFbEIsSUFBTUMsUUFBUSxHQUFHLFNBQVhBLFFBQVFBLENBQUE7SUFBQSxJQUFJQyxJQUFJLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHTixRQUFRO0lBQUEsSUFBRVMsR0FBRyxHQUFBSCxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBR0gsUUFBUTtJQUFBLE9BQUssQ0FBQ0UsSUFBSSxFQUFFSSxHQUFHLENBQUM7RUFBQTtFQUVqRSxJQUFNQyxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQWdCQSxDQUFBO0lBQUEsT0FBVTtNQUM5QkMsZUFBZSxFQUFFLElBQUk7TUFDckJDLEtBQUssRUFBRTtRQUNMQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ1BDLEVBQUUsRUFBRTtVQUNGQyxhQUFhLEVBQUVDLElBQUksQ0FBQ0MsRUFBRSxDQUFDLFVBQUNSLEdBQUcsRUFBRVMsSUFBSSxFQUFFakIsS0FBSztZQUFBLE9BQU07Y0FBRWMsYUFBYSxFQUFFQyxJQUFJLENBQUNDLEVBQUUsQ0FBQztZQUFFLENBQUM7VUFBQSxDQUFDLENBQUM7VUFDNUUsVUFBUUQsSUFBSSxDQUFDQyxFQUFFLENBQUMsVUFBQ0UsSUFBSSxFQUFFQyxFQUFFO1lBQUEsT0FBTTtj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
|