@pie-lib/editable-html-tip-tap 1.2.0-next.2 → 1.2.0-next.4

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 (84) hide show
  1. package/CHANGELOG.md +25 -28
  2. package/LICENSE.md +5 -0
  3. package/lib/components/CharacterPicker.js +1 -1
  4. package/lib/components/CharacterPicker.js.map +1 -1
  5. package/lib/components/EditableHtml.js +1 -1
  6. package/lib/components/EditableHtml.js.map +1 -1
  7. package/lib/components/MenuBar.js +1 -1
  8. package/lib/components/MenuBar.js.map +1 -1
  9. package/lib/components/TiptapContainer.js +1 -1
  10. package/lib/components/TiptapContainer.js.map +1 -1
  11. package/lib/components/characters/characterUtils.js +1 -1
  12. package/lib/components/characters/custom-popper.js +1 -1
  13. package/lib/components/common/done-button.js +1 -1
  14. package/lib/components/common/toolbar-buttons.js +1 -1
  15. package/lib/components/icons/CssIcon.js +1 -1
  16. package/lib/components/icons/RespArea.js +1 -1
  17. package/lib/components/icons/TableIcons.js +1 -1
  18. package/lib/components/icons/TextAlign.js +1 -1
  19. package/lib/components/image/AltDialog.js +1 -1
  20. package/lib/components/image/ImageToolbar.js +1 -1
  21. package/lib/components/image/InsertImageHandler.js +1 -1
  22. package/lib/components/media/MediaDialog.js +1 -1
  23. package/lib/components/media/MediaToolbar.js +1 -1
  24. package/lib/components/media/MediaWrapper.js +1 -1
  25. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +1 -1
  26. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +1 -1
  27. package/lib/components/respArea/DragInTheBlank/choice.js +1 -1
  28. package/lib/components/respArea/ExplicitConstructedResponse.js +1 -1
  29. package/lib/components/respArea/InlineDropdown.js +1 -1
  30. package/lib/components/respArea/ToolbarIcon.js +1 -1
  31. package/lib/constants.js +1 -1
  32. package/lib/extensions/css.js +1 -1
  33. package/lib/extensions/custom-toolbar-wrapper.js +1 -1
  34. package/lib/extensions/extended-table.js +1 -1
  35. package/lib/extensions/image-component.js +1 -1
  36. package/lib/extensions/image-component.js.map +1 -1
  37. package/lib/extensions/image.js +1 -1
  38. package/lib/extensions/index.js +1 -1
  39. package/lib/extensions/index.js.map +1 -1
  40. package/lib/extensions/math.js +1 -1
  41. package/lib/extensions/media.js +1 -1
  42. package/lib/extensions/responseArea.js +1 -1
  43. package/lib/index.js +1 -1
  44. package/lib/styles/editorContainerStyles.js +1 -1
  45. package/lib/theme.js +1 -1
  46. package/lib/utils/size.js +1 -1
  47. package/package.json +5 -5
  48. package/src/components/EditableHtml.jsx +4 -2
  49. package/lib/__tests__/EditableHtml.test.js +0 -377
  50. package/lib/__tests__/constants.test.js +0 -21
  51. package/lib/__tests__/extensions.test.js +0 -209
  52. package/lib/__tests__/index.test.js +0 -235
  53. package/lib/__tests__/size-utils.test.js +0 -57
  54. package/lib/__tests__/theme.test.js +0 -17
  55. package/lib/components/__tests__/AltDialog.test.js +0 -201
  56. package/lib/components/__tests__/CharacterPicker.test.js +0 -305
  57. package/lib/components/__tests__/CssIcon.test.js +0 -58
  58. package/lib/components/__tests__/DragInTheBlank.test.js +0 -295
  59. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +0 -253
  60. package/lib/components/__tests__/ImageToolbar.test.js +0 -185
  61. package/lib/components/__tests__/InlineDropdown.test.js +0 -287
  62. package/lib/components/__tests__/InsertImageHandler.test.js +0 -162
  63. package/lib/components/__tests__/MediaDialog.test.js +0 -433
  64. package/lib/components/__tests__/MediaToolbar.test.js +0 -126
  65. package/lib/components/__tests__/MediaWrapper.test.js +0 -96
  66. package/lib/components/__tests__/MenuBar.test.js +0 -459
  67. package/lib/components/__tests__/RespArea.test.js +0 -171
  68. package/lib/components/__tests__/TableIcons.test.js +0 -153
  69. package/lib/components/__tests__/TextAlign.test.js +0 -209
  70. package/lib/components/__tests__/TiptapContainer.test.js +0 -196
  71. package/lib/components/__tests__/characterUtils.test.js +0 -178
  72. package/lib/components/__tests__/choice.test.js +0 -213
  73. package/lib/components/__tests__/custom-popper.test.js +0 -108
  74. package/lib/components/__tests__/done-button.test.js +0 -72
  75. package/lib/components/__tests__/toolbar-buttons.test.js +0 -277
  76. package/lib/extensions/__tests__/component.test.js +0 -314
  77. package/lib/extensions/__tests__/css.test.js +0 -214
  78. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +0 -175
  79. package/lib/extensions/__tests__/extended-table.test.js +0 -92
  80. package/lib/extensions/__tests__/image-component.test.js +0 -305
  81. package/lib/extensions/__tests__/image.test.js +0 -164
  82. package/lib/extensions/__tests__/media.test.js +0 -292
  83. package/lib/extensions/__tests__/responseArea.test.js +0 -330
  84. package/lib/extensions/component.js +0 -305
@@ -1,292 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
- var _media = require("../media");
6
- jest.mock('@tiptap/core', function () {
7
- return {
8
- Node: {
9
- create: jest.fn(function (config) {
10
- return config;
11
- })
12
- },
13
- mergeAttributes: jest.fn(function () {
14
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
15
- args[_key] = arguments[_key];
16
- }
17
- return Object.assign.apply(Object, [{}].concat(args));
18
- })
19
- };
20
- });
21
- jest.mock('@tiptap/react', function () {
22
- return {
23
- NodeViewWrapper: function NodeViewWrapper(_ref) {
24
- var children = _ref.children;
25
- return /*#__PURE__*/React.createElement("div", {
26
- "data-testid": "node-view-wrapper"
27
- }, children);
28
- },
29
- ReactNodeViewRenderer: jest.fn(function (component) {
30
- return component;
31
- })
32
- };
33
- });
34
- jest.mock('react-dom', function () {
35
- return {
36
- render: jest.fn()
37
- };
38
- });
39
- jest.mock('../../components/media/MediaDialog', function () {
40
- return {
41
- __esModule: true,
42
- "default": jest.fn(function () {
43
- return /*#__PURE__*/React.createElement("div", {
44
- "data-testid": "media-dialog"
45
- });
46
- })
47
- };
48
- });
49
- jest.mock('../../components/media/MediaToolbar', function () {
50
- return {
51
- __esModule: true,
52
- "default": jest.fn(function () {
53
- return /*#__PURE__*/React.createElement("div", {
54
- "data-testid": "media-toolbar"
55
- });
56
- })
57
- };
58
- });
59
- describe('Media', function () {
60
- describe('configuration', function () {
61
- it('has correct name', function () {
62
- expect(_media.Media.name).toBe('media');
63
- });
64
- it('is inline', function () {
65
- expect(_media.Media.inline).toBe(true);
66
- });
67
- it('is in inline group', function () {
68
- expect(_media.Media.group).toBe('inline');
69
- });
70
- it('is atomic', function () {
71
- expect(_media.Media.atom).toBe(true);
72
- });
73
- });
74
- describe('addAttributes', function () {
75
- it('returns all media attributes with defaults', function () {
76
- var attributes = _media.Media.addAttributes();
77
- expect(attributes).toHaveProperty('type');
78
- expect(attributes).toHaveProperty('src');
79
- expect(attributes).toHaveProperty('width');
80
- expect(attributes).toHaveProperty('height');
81
- expect(attributes).toHaveProperty('title');
82
- expect(attributes).toHaveProperty('starts');
83
- expect(attributes).toHaveProperty('ends');
84
- expect(attributes).toHaveProperty('editing');
85
- expect(attributes).toHaveProperty('tag');
86
- expect(attributes).toHaveProperty('url');
87
- expect(attributes.type["default"]).toBe('video');
88
- expect(attributes.src["default"]).toBeNull();
89
- expect(attributes.tag["default"]).toBe('iframe');
90
- expect(attributes.editing["default"]).toBe(false);
91
- });
92
- });
93
- describe('parseHTML', function () {
94
- it('returns parsing rules for iframe and audio', function () {
95
- var rules = _media.Media.parseHTML();
96
- expect(Array.isArray(rules)).toBe(true);
97
- expect(rules).toHaveLength(2);
98
- expect(rules[0].tag).toBe('iframe[data-type="video"]');
99
- expect(rules[1].tag).toBe('audio');
100
- });
101
- it('parses video iframe attributes', function () {
102
- var rules = _media.Media.parseHTML();
103
- var mockEl = {
104
- getAttribute: jest.fn(function (attr) {
105
- var attrs = {
106
- src: 'https://video.com/embed',
107
- width: '640',
108
- height: '480'
109
- };
110
- return attrs[attr] || null;
111
- }),
112
- dataset: {
113
- title: 'Test Video',
114
- starts: '10',
115
- ends: '60',
116
- url: 'https://video.com/watch'
117
- }
118
- };
119
- var result = rules[0].getAttrs(mockEl);
120
- expect(result.type).toBe('video');
121
- expect(result.tag).toBe('iframe');
122
- expect(result.src).toBe('https://video.com/embed');
123
- expect(result.width).toBe('640');
124
- expect(result.height).toBe('480');
125
- expect(result.title).toBe('Test Video');
126
- });
127
- it('parses audio element attributes', function () {
128
- var rules = _media.Media.parseHTML();
129
- var mockEl = {
130
- querySelector: jest.fn(function () {
131
- return {
132
- getAttribute: jest.fn(function () {
133
- return 'https://audio.com/file.mp3';
134
- })
135
- };
136
- })
137
- };
138
- var result = rules[1].getAttrs(mockEl);
139
- expect(result.type).toBe('audio');
140
- expect(result.tag).toBe('audio');
141
- expect(result.src).toBe('https://audio.com/file.mp3');
142
- });
143
- });
144
- describe('renderHTML', function () {
145
- it('renders audio element for audio type', function () {
146
- var HTMLAttributes = {
147
- tag: 'audio',
148
- src: 'test.mp3'
149
- };
150
- var result = _media.Media.renderHTML({
151
- HTMLAttributes: HTMLAttributes
152
- });
153
- expect(result[0]).toBe('audio');
154
- expect(result[1]).toEqual({
155
- controls: 'controls',
156
- controlsList: 'nodownload'
157
- });
158
- expect(result[2][0]).toBe('source');
159
- expect(result[2][1]).toEqual({
160
- src: 'test.mp3',
161
- type: 'audio/mp3'
162
- });
163
- });
164
- it('renders iframe for video type', function () {
165
- var HTMLAttributes = {
166
- tag: 'iframe',
167
- src: 'https://video.com/embed',
168
- width: '640',
169
- height: '480'
170
- };
171
- var result = _media.Media.renderHTML({
172
- HTMLAttributes: HTMLAttributes
173
- });
174
- expect(result[0]).toBe('iframe');
175
- expect(result[1]).toHaveProperty('data-type', 'video');
176
- expect(result[1]).toHaveProperty('frameborder', '0');
177
- expect(result[1]).toHaveProperty('src', 'https://video.com/embed');
178
- expect(result[1]).toHaveProperty('width', '640');
179
- expect(result[1]).toHaveProperty('height', '480');
180
- });
181
- it('renders iframe without dimensions if not provided', function () {
182
- var HTMLAttributes = {
183
- tag: 'iframe',
184
- src: 'https://video.com/embed'
185
- };
186
- var result = _media.Media.renderHTML({
187
- HTMLAttributes: HTMLAttributes
188
- });
189
- expect(result[1]).not.toHaveProperty('width');
190
- expect(result[1]).not.toHaveProperty('height');
191
- });
192
- });
193
- describe('addCommands', function () {
194
- it('returns insertMedia and updateMedia commands', function () {
195
- var commands = _media.Media.addCommands();
196
- expect(commands).toHaveProperty('insertMedia');
197
- expect(commands).toHaveProperty('updateMedia');
198
- expect((0, _typeof2["default"])(commands.insertMedia)).toBe('function');
199
- expect((0, _typeof2["default"])(commands.updateMedia)).toBe('function');
200
- });
201
- it('insertMedia inserts content with attributes', function () {
202
- var context = {
203
- name: 'media'
204
- };
205
- var commands = _media.Media.addCommands.call(context);
206
- var mockCommands = {
207
- insertContent: jest.fn(function () {
208
- return true;
209
- })
210
- };
211
- var attrs = {
212
- type: 'video',
213
- src: 'test.mp4'
214
- };
215
- var result = commands.insertMedia(attrs)({
216
- commands: mockCommands
217
- });
218
- expect(mockCommands.insertContent).toHaveBeenCalledWith({
219
- type: 'media',
220
- attrs: attrs
221
- });
222
- expect(result).toBe(true);
223
- });
224
- it('updateMedia updates attributes', function () {
225
- var context = {
226
- name: 'media'
227
- };
228
- var commands = _media.Media.addCommands.call(context);
229
- var mockCommands = {
230
- updateAttributes: jest.fn(function () {
231
- return true;
232
- })
233
- };
234
- var attrs = {
235
- width: '800'
236
- };
237
- var result = commands.updateMedia(attrs)({
238
- commands: mockCommands
239
- });
240
- expect(mockCommands.updateAttributes).toHaveBeenCalledWith('media', attrs);
241
- expect(result).toBe(true);
242
- });
243
- });
244
- describe('addNodeView', function () {
245
- it('returns ReactNodeViewRenderer result', function () {
246
- var result = _media.Media.addNodeView();
247
- expect(result).toBeDefined();
248
- });
249
- });
250
- });
251
- describe('insertDialog', function () {
252
- beforeEach(function () {
253
- document.body.innerHTML = '';
254
- document.body.style.overflow = 'auto';
255
- });
256
- it('creates dialog element', function () {
257
- var mockCallback = jest.fn();
258
- var props = {
259
- type: 'video',
260
- callback: mockCallback,
261
- options: {}
262
- };
263
- (0, _media.insertDialog)(props);
264
- var dialog = document.querySelector('.insert-media-dialog');
265
- expect(dialog).toBeTruthy();
266
- });
267
- it('sets body overflow to hidden', function () {
268
- var mockCallback = jest.fn();
269
- var props = {
270
- type: 'video',
271
- callback: mockCallback,
272
- options: {}
273
- };
274
- (0, _media.insertDialog)(props);
275
- expect(document.body.style.overflow).toBe('hidden');
276
- });
277
- it('removes previous dialogs', function () {
278
- var existingDialog = document.createElement('div');
279
- existingDialog.className = 'insert-media-dialog';
280
- document.body.appendChild(existingDialog);
281
- var mockCallback = jest.fn();
282
- var props = {
283
- type: 'video',
284
- callback: mockCallback,
285
- options: {}
286
- };
287
- (0, _media.insertDialog)(props);
288
- var dialogs = document.querySelectorAll('.insert-media-dialog');
289
- expect(dialogs).toHaveLength(1);
290
- });
291
- });
292
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWVkaWEiLCJyZXF1aXJlIiwiamVzdCIsIm1vY2siLCJOb2RlIiwiY3JlYXRlIiwiZm4iLCJjb25maWciLCJtZXJnZUF0dHJpYnV0ZXMiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsIk9iamVjdCIsImFzc2lnbiIsImFwcGx5IiwiY29uY2F0IiwiTm9kZVZpZXdXcmFwcGVyIiwiX3JlZiIsImNoaWxkcmVuIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50IiwiUmVhY3ROb2RlVmlld1JlbmRlcmVyIiwiY29tcG9uZW50IiwicmVuZGVyIiwiX19lc01vZHVsZSIsImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJNZWRpYSIsIm5hbWUiLCJ0b0JlIiwiaW5saW5lIiwiZ3JvdXAiLCJhdG9tIiwiYXR0cmlidXRlcyIsImFkZEF0dHJpYnV0ZXMiLCJ0b0hhdmVQcm9wZXJ0eSIsInR5cGUiLCJzcmMiLCJ0b0JlTnVsbCIsInRhZyIsImVkaXRpbmciLCJydWxlcyIsInBhcnNlSFRNTCIsImlzQXJyYXkiLCJ0b0hhdmVMZW5ndGgiLCJtb2NrRWwiLCJnZXRBdHRyaWJ1dGUiLCJhdHRyIiwiYXR0cnMiLCJ3aWR0aCIsImhlaWdodCIsImRhdGFzZXQiLCJ0aXRsZSIsInN0YXJ0cyIsImVuZHMiLCJ1cmwiLCJyZXN1bHQiLCJnZXRBdHRycyIsInF1ZXJ5U2VsZWN0b3IiLCJIVE1MQXR0cmlidXRlcyIsInJlbmRlckhUTUwiLCJ0b0VxdWFsIiwiY29udHJvbHMiLCJjb250cm9sc0xpc3QiLCJub3QiLCJjb21tYW5kcyIsImFkZENvbW1hbmRzIiwiX3R5cGVvZjIiLCJpbnNlcnRNZWRpYSIsInVwZGF0ZU1lZGlhIiwiY29udGV4dCIsImNhbGwiLCJtb2NrQ29tbWFuZHMiLCJpbnNlcnRDb250ZW50IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwiYWRkTm9kZVZpZXciLCJ0b0JlRGVmaW5lZCIsImJlZm9yZUVhY2giLCJkb2N1bWVudCIsImJvZHkiLCJpbm5lckhUTUwiLCJzdHlsZSIsIm92ZXJmbG93IiwibW9ja0NhbGxiYWNrIiwicHJvcHMiLCJjYWxsYmFjayIsIm9wdGlvbnMiLCJpbnNlcnREaWFsb2ciLCJkaWFsb2ciLCJ0b0JlVHJ1dGh5IiwiZXhpc3RpbmdEaWFsb2ciLCJjbGFzc05hbWUiLCJhcHBlbmRDaGlsZCIsImRpYWxvZ3MiLCJxdWVyeVNlbGVjdG9yQWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvX190ZXN0c19fL21lZGlhLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5zZXJ0RGlhbG9nLCBNZWRpYSB9IGZyb20gJy4uL21lZGlhJztcblxuamVzdC5tb2NrKCdAdGlwdGFwL2NvcmUnLCAoKSA9PiAoe1xuICBOb2RlOiB7IGNyZWF0ZTogamVzdC5mbigoY29uZmlnKSA9PiBjb25maWcpIH0sXG4gIG1lcmdlQXR0cmlidXRlczogamVzdC5mbigoLi4uYXJncykgPT4gT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncykpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuIH0pID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJub2RlLXZpZXctd3JhcHBlclwiPntjaGlsZHJlbn08L2Rpdj4sXG4gIFJlYWN0Tm9kZVZpZXdSZW5kZXJlcjogamVzdC5mbigoY29tcG9uZW50KSA9PiBjb21wb25lbnQpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ3JlYWN0LWRvbScsICgpID0+ICh7XG4gIHJlbmRlcjogamVzdC5mbigpLFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uLy4uL2NvbXBvbmVudHMvbWVkaWEvTWVkaWFEaWFsb2cnLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJtZWRpYS1kaWFsb2dcIiAvPiksXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9tZWRpYS9NZWRpYVRvb2xiYXInLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJtZWRpYS10b29sYmFyXCIgLz4pLFxufSkpO1xuXG5kZXNjcmliZSgnTWVkaWEnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdoYXMgY29ycmVjdCBuYW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KE1lZGlhLm5hbWUpLnRvQmUoJ21lZGlhJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgaW5saW5lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KE1lZGlhLmlubGluZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbiBpbmxpbmUgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoTWVkaWEuZ3JvdXApLnRvQmUoJ2lubGluZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGF0b21pYycsICgpID0+IHtcbiAgICAgIGV4cGVjdChNZWRpYS5hdG9tKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkQXR0cmlidXRlcycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBhbGwgbWVkaWEgYXR0cmlidXRlcyB3aXRoIGRlZmF1bHRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE1lZGlhLmFkZEF0dHJpYnV0ZXMoKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd0eXBlJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ3NyYycpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd3aWR0aCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdoZWlnaHQnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndGl0bGUnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnc3RhcnRzJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ2VuZHMnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnZWRpdGluZycpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd0YWcnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndXJsJyk7XG5cbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnR5cGUuZGVmYXVsdCkudG9CZSgndmlkZW8nKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnNyYy5kZWZhdWx0KS50b0JlTnVsbCgpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMudGFnLmRlZmF1bHQpLnRvQmUoJ2lmcmFtZScpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuZWRpdGluZy5kZWZhdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BhcnNlSFRNTCcsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBwYXJzaW5nIHJ1bGVzIGZvciBpZnJhbWUgYW5kIGF1ZGlvJywgKCkgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBNZWRpYS5wYXJzZUhUTUwoKTtcblxuICAgICAgZXhwZWN0KEFycmF5LmlzQXJyYXkocnVsZXMpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJ1bGVzKS50b0hhdmVMZW5ndGgoMik7XG4gICAgICBleHBlY3QocnVsZXNbMF0udGFnKS50b0JlKCdpZnJhbWVbZGF0YS10eXBlPVwidmlkZW9cIl0nKTtcbiAgICAgIGV4cGVjdChydWxlc1sxXS50YWcpLnRvQmUoJ2F1ZGlvJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFyc2VzIHZpZGVvIGlmcmFtZSBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBNZWRpYS5wYXJzZUhUTUwoKTtcbiAgICAgIGNvbnN0IG1vY2tFbCA9IHtcbiAgICAgICAgZ2V0QXR0cmlidXRlOiBqZXN0LmZuKChhdHRyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgICAgICBzcmM6ICdodHRwczovL3ZpZGVvLmNvbS9lbWJlZCcsXG4gICAgICAgICAgICB3aWR0aDogJzY0MCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICc0ODAnLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGF0dHJzW2F0dHJdIHx8IG51bGw7XG4gICAgICAgIH0pLFxuICAgICAgICBkYXRhc2V0OiB7XG4gICAgICAgICAgdGl0bGU6ICdUZXN0IFZpZGVvJyxcbiAgICAgICAgICBzdGFydHM6ICcxMCcsXG4gICAgICAgICAgZW5kczogJzYwJyxcbiAgICAgICAgICB1cmw6ICdodHRwczovL3ZpZGVvLmNvbS93YXRjaCcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBydWxlc1swXS5nZXRBdHRycyhtb2NrRWwpO1xuXG4gICAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoJ3ZpZGVvJyk7XG4gICAgICBleHBlY3QocmVzdWx0LnRhZykudG9CZSgnaWZyYW1lJyk7XG4gICAgICBleHBlY3QocmVzdWx0LnNyYykudG9CZSgnaHR0cHM6Ly92aWRlby5jb20vZW1iZWQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQud2lkdGgpLnRvQmUoJzY0MCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5oZWlnaHQpLnRvQmUoJzQ4MCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdC50aXRsZSkudG9CZSgnVGVzdCBWaWRlbycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3BhcnNlcyBhdWRpbyBlbGVtZW50IGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBydWxlcyA9IE1lZGlhLnBhcnNlSFRNTCgpO1xuICAgICAgY29uc3QgbW9ja0VsID0ge1xuICAgICAgICBxdWVyeVNlbGVjdG9yOiBqZXN0LmZuKCgpID0+ICh7XG4gICAgICAgICAgZ2V0QXR0cmlidXRlOiBqZXN0LmZuKCgpID0+ICdodHRwczovL2F1ZGlvLmNvbS9maWxlLm1wMycpLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBydWxlc1sxXS5nZXRBdHRycyhtb2NrRWwpO1xuXG4gICAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoJ2F1ZGlvJyk7XG4gICAgICBleHBlY3QocmVzdWx0LnRhZykudG9CZSgnYXVkaW8nKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuc3JjKS50b0JlKCdodHRwczovL2F1ZGlvLmNvbS9maWxlLm1wMycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVySFRNTCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBhdWRpbyBlbGVtZW50IGZvciBhdWRpbyB0eXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgSFRNTEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIHRhZzogJ2F1ZGlvJyxcbiAgICAgICAgc3JjOiAndGVzdC5tcDMnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gTWVkaWEucmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0WzBdKS50b0JlKCdhdWRpbycpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9FcXVhbCh7IGNvbnRyb2xzOiAnY29udHJvbHMnLCBjb250cm9sc0xpc3Q6ICdub2Rvd25sb2FkJyB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMl1bMF0pLnRvQmUoJ3NvdXJjZScpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsyXVsxXSkudG9FcXVhbCh7IHNyYzogJ3Rlc3QubXAzJywgdHlwZTogJ2F1ZGlvL21wMycgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBpZnJhbWUgZm9yIHZpZGVvIHR5cGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBIVE1MQXR0cmlidXRlcyA9IHtcbiAgICAgICAgdGFnOiAnaWZyYW1lJyxcbiAgICAgICAgc3JjOiAnaHR0cHM6Ly92aWRlby5jb20vZW1iZWQnLFxuICAgICAgICB3aWR0aDogJzY0MCcsXG4gICAgICAgIGhlaWdodDogJzQ4MCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBNZWRpYS5yZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ2lmcmFtZScpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9IYXZlUHJvcGVydHkoJ2RhdGEtdHlwZScsICd2aWRlbycpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9IYXZlUHJvcGVydHkoJ2ZyYW1lYm9yZGVyJywgJzAnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdzcmMnLCAnaHR0cHM6Ly92aWRlby5jb20vZW1iZWQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCd3aWR0aCcsICc2NDAnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdoZWlnaHQnLCAnNDgwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBpZnJhbWUgd2l0aG91dCBkaW1lbnNpb25zIGlmIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IEhUTUxBdHRyaWJ1dGVzID0ge1xuICAgICAgICB0YWc6ICdpZnJhbWUnLFxuICAgICAgICBzcmM6ICdodHRwczovL3ZpZGVvLmNvbS9lbWJlZCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBNZWRpYS5yZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLm5vdC50b0hhdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLm5vdC50b0hhdmVQcm9wZXJ0eSgnaGVpZ2h0Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRDb21tYW5kcycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBpbnNlcnRNZWRpYSBhbmQgdXBkYXRlTWVkaWEgY29tbWFuZHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kcyA9IE1lZGlhLmFkZENvbW1hbmRzKCk7XG5cbiAgICAgIGV4cGVjdChjb21tYW5kcykudG9IYXZlUHJvcGVydHkoJ2luc2VydE1lZGlhJyk7XG4gICAgICBleHBlY3QoY29tbWFuZHMpLnRvSGF2ZVByb3BlcnR5KCd1cGRhdGVNZWRpYScpO1xuICAgICAgZXhwZWN0KHR5cGVvZiBjb21tYW5kcy5pbnNlcnRNZWRpYSkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICAgIGV4cGVjdCh0eXBlb2YgY29tbWFuZHMudXBkYXRlTWVkaWEpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5zZXJ0TWVkaWEgaW5zZXJ0cyBjb250ZW50IHdpdGggYXR0cmlidXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IG5hbWU6ICdtZWRpYScgfTtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gTWVkaWEuYWRkQ29tbWFuZHMuY2FsbChjb250ZXh0KTtcbiAgICAgIGNvbnN0IG1vY2tDb21tYW5kcyA9IHtcbiAgICAgICAgaW5zZXJ0Q29udGVudDogamVzdC5mbigoKSA9PiB0cnVlKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBhdHRycyA9IHsgdHlwZTogJ3ZpZGVvJywgc3JjOiAndGVzdC5tcDQnIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbW1hbmRzLmluc2VydE1lZGlhKGF0dHJzKSh7IGNvbW1hbmRzOiBtb2NrQ29tbWFuZHMgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrQ29tbWFuZHMuaW5zZXJ0Q29udGVudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgICB0eXBlOiAnbWVkaWEnLFxuICAgICAgICBhdHRycyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVNZWRpYSB1cGRhdGVzIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0geyBuYW1lOiAnbWVkaWEnIH07XG4gICAgICBjb25zdCBjb21tYW5kcyA9IE1lZGlhLmFkZENvbW1hbmRzLmNhbGwoY29udGV4dCk7XG4gICAgICBjb25zdCBtb2NrQ29tbWFuZHMgPSB7XG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM6IGplc3QuZm4oKCkgPT4gdHJ1ZSksXG4gICAgICB9O1xuICAgICAgY29uc3QgYXR0cnMgPSB7IHdpZHRoOiAnODAwJyB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb21tYW5kcy51cGRhdGVNZWRpYShhdHRycykoeyBjb21tYW5kczogbW9ja0NvbW1hbmRzIH0pO1xuXG4gICAgICBleHBlY3QobW9ja0NvbW1hbmRzLnVwZGF0ZUF0dHJpYnV0ZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdtZWRpYScsIGF0dHJzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGROb2RlVmlldycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBSZWFjdE5vZGVWaWV3UmVuZGVyZXIgcmVzdWx0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gTWVkaWEuYWRkTm9kZVZpZXcoKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2luc2VydERpYWxvZycsICgpID0+IHtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICB9KTtcblxuICBpdCgnY3JlYXRlcyBkaWFsb2cgZWxlbWVudCcsICgpID0+IHtcbiAgICBjb25zdCBtb2NrQ2FsbGJhY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgY2FsbGJhY2s6IG1vY2tDYWxsYmFjayxcbiAgICAgIG9wdGlvbnM6IHt9LFxuICAgIH07XG5cbiAgICBpbnNlcnREaWFsb2cocHJvcHMpO1xuXG4gICAgY29uc3QgZGlhbG9nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmluc2VydC1tZWRpYS1kaWFsb2cnKTtcbiAgICBleHBlY3QoZGlhbG9nKS50b0JlVHJ1dGh5KCk7XG4gIH0pO1xuXG4gIGl0KCdzZXRzIGJvZHkgb3ZlcmZsb3cgdG8gaGlkZGVuJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tDYWxsYmFjayA9IGplc3QuZm4oKTtcbiAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICBjYWxsYmFjazogbW9ja0NhbGxiYWNrLFxuICAgICAgb3B0aW9uczoge30sXG4gICAgfTtcblxuICAgIGluc2VydERpYWxvZyhwcm9wcyk7XG5cbiAgICBleHBlY3QoZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdykudG9CZSgnaGlkZGVuJyk7XG4gIH0pO1xuXG4gIGl0KCdyZW1vdmVzIHByZXZpb3VzIGRpYWxvZ3MnLCAoKSA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmdEaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBleGlzdGluZ0RpYWxvZy5jbGFzc05hbWUgPSAnaW5zZXJ0LW1lZGlhLWRpYWxvZyc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChleGlzdGluZ0RpYWxvZyk7XG5cbiAgICBjb25zdCBtb2NrQ2FsbGJhY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgY2FsbGJhY2s6IG1vY2tDYWxsYmFjayxcbiAgICAgIG9wdGlvbnM6IHt9LFxuICAgIH07XG5cbiAgICBpbnNlcnREaWFsb2cocHJvcHMpO1xuXG4gICAgY29uc3QgZGlhbG9ncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnNlcnQtbWVkaWEtZGlhbG9nJyk7XG4gICAgZXhwZWN0KGRpYWxvZ3MpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUVBQyxJQUFJLENBQUNDLElBQUksQ0FBQyxjQUFjLEVBQUU7RUFBQSxPQUFPO0lBQy9CQyxJQUFJLEVBQUU7TUFBRUMsTUFBTSxFQUFFSCxJQUFJLENBQUNJLEVBQUUsQ0FBQyxVQUFDQyxNQUFNO1FBQUEsT0FBS0EsTUFBTTtNQUFBO0lBQUUsQ0FBQztJQUM3Q0MsZUFBZSxFQUFFTixJQUFJLENBQUNJLEVBQUUsQ0FBQztNQUFBLFNBQUFHLElBQUEsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLEVBQUlDLElBQUksT0FBQUMsS0FBQSxDQUFBSixJQUFBLEdBQUFLLElBQUEsTUFBQUEsSUFBQSxHQUFBTCxJQUFBLEVBQUFLLElBQUE7UUFBSkYsSUFBSSxDQUFBRSxJQUFBLElBQUFKLFNBQUEsQ0FBQUksSUFBQTtNQUFBO01BQUEsT0FBS0MsTUFBTSxDQUFDQyxNQUFNLENBQUFDLEtBQUEsQ0FBYkYsTUFBTSxHQUFRLENBQUMsQ0FBQyxFQUFBRyxNQUFBLENBQUtOLElBQUksRUFBQztJQUFBO0VBQ2xFLENBQUM7QUFBQSxDQUFDLENBQUM7QUFFSFYsSUFBSSxDQUFDQyxJQUFJLENBQUMsZUFBZSxFQUFFO0VBQUEsT0FBTztJQUNoQ2dCLGVBQWUsRUFBRSxTQUFqQkEsZUFB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