@pie-lib/editable-html-tip-tap 1.1.1-next.3 → 1.1.1-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 (114) hide show
  1. package/lib/__tests__/EditableHtml.test.js +377 -0
  2. package/lib/__tests__/constants.test.js +21 -0
  3. package/lib/__tests__/extensions.test.js +209 -0
  4. package/lib/__tests__/index.test.js +235 -0
  5. package/lib/__tests__/size-utils.test.js +57 -0
  6. package/lib/__tests__/theme.test.js +17 -0
  7. package/lib/components/CharacterPicker.js +1 -1
  8. package/lib/components/CharacterPicker.js.map +1 -1
  9. package/lib/components/EditableHtml.js +1 -1
  10. package/lib/components/EditableHtml.js.map +1 -1
  11. package/lib/components/MenuBar.js +1 -1
  12. package/lib/components/MenuBar.js.map +1 -1
  13. package/lib/components/TiptapContainer.js +25 -6
  14. package/lib/components/TiptapContainer.js.map +1 -1
  15. package/lib/components/__tests__/AltDialog.test.js +201 -0
  16. package/lib/components/__tests__/CharacterPicker.test.js +305 -0
  17. package/lib/components/__tests__/CssIcon.test.js +58 -0
  18. package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
  19. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +253 -0
  20. package/lib/components/__tests__/ImageToolbar.test.js +185 -0
  21. package/lib/components/__tests__/InlineDropdown.test.js +287 -0
  22. package/lib/components/__tests__/InsertImageHandler.test.js +162 -0
  23. package/lib/components/__tests__/MediaDialog.test.js +433 -0
  24. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  25. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  26. package/lib/components/__tests__/MenuBar.test.js +459 -0
  27. package/lib/components/__tests__/RespArea.test.js +171 -0
  28. package/lib/components/__tests__/TableIcons.test.js +153 -0
  29. package/lib/components/__tests__/TextAlign.test.js +209 -0
  30. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  31. package/lib/components/__tests__/characterUtils.test.js +178 -0
  32. package/lib/components/__tests__/choice.test.js +213 -0
  33. package/lib/components/__tests__/custom-popper.test.js +108 -0
  34. package/lib/components/__tests__/done-button.test.js +72 -0
  35. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  36. package/lib/components/characters/characterUtils.js +1 -1
  37. package/lib/components/characters/characterUtils.js.map +1 -1
  38. package/lib/components/characters/custom-popper.js +1 -1
  39. package/lib/components/characters/custom-popper.js.map +1 -1
  40. package/lib/components/common/done-button.js +1 -1
  41. package/lib/components/common/done-button.js.map +1 -1
  42. package/lib/components/common/toolbar-buttons.js +1 -1
  43. package/lib/components/common/toolbar-buttons.js.map +1 -1
  44. package/lib/components/icons/CssIcon.js +1 -1
  45. package/lib/components/icons/CssIcon.js.map +1 -1
  46. package/lib/components/icons/RespArea.js +1 -1
  47. package/lib/components/icons/RespArea.js.map +1 -1
  48. package/lib/components/icons/TableIcons.js +1 -1
  49. package/lib/components/icons/TableIcons.js.map +1 -1
  50. package/lib/components/icons/TextAlign.js +1 -1
  51. package/lib/components/icons/TextAlign.js.map +1 -1
  52. package/lib/components/image/AltDialog.js +1 -1
  53. package/lib/components/image/AltDialog.js.map +1 -1
  54. package/lib/components/image/ImageToolbar.js +1 -1
  55. package/lib/components/image/ImageToolbar.js.map +1 -1
  56. package/lib/components/image/InsertImageHandler.js +1 -1
  57. package/lib/components/image/InsertImageHandler.js.map +1 -1
  58. package/lib/components/media/MediaDialog.js +1 -1
  59. package/lib/components/media/MediaDialog.js.map +1 -1
  60. package/lib/components/media/MediaToolbar.js +1 -1
  61. package/lib/components/media/MediaToolbar.js.map +1 -1
  62. package/lib/components/media/MediaWrapper.js +1 -1
  63. package/lib/components/media/MediaWrapper.js.map +1 -1
  64. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +1 -1
  65. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +1 -1
  66. package/lib/components/respArea/DragInTheBlank/choice.js +1 -1
  67. package/lib/components/respArea/DragInTheBlank/choice.js.map +1 -1
  68. package/lib/components/respArea/ExplicitConstructedResponse.js +1 -1
  69. package/lib/components/respArea/ExplicitConstructedResponse.js.map +1 -1
  70. package/lib/components/respArea/InlineDropdown.js +1 -1
  71. package/lib/components/respArea/InlineDropdown.js.map +1 -1
  72. package/lib/components/respArea/ToolbarIcon.js +1 -1
  73. package/lib/components/respArea/ToolbarIcon.js.map +1 -1
  74. package/lib/constants.js +1 -1
  75. package/lib/constants.js.map +1 -1
  76. package/lib/extensions/__tests__/component.test.js +314 -0
  77. package/lib/extensions/__tests__/css.test.js +214 -0
  78. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
  79. package/lib/extensions/__tests__/extended-table.test.js +92 -0
  80. package/lib/extensions/__tests__/image-component.test.js +305 -0
  81. package/lib/extensions/__tests__/image.test.js +164 -0
  82. package/lib/extensions/__tests__/media.test.js +292 -0
  83. package/lib/extensions/__tests__/responseArea.test.js +330 -0
  84. package/lib/extensions/component.js +305 -0
  85. package/lib/extensions/css.js +1 -1
  86. package/lib/extensions/css.js.map +1 -1
  87. package/lib/extensions/custom-toolbar-wrapper.js +1 -1
  88. package/lib/extensions/custom-toolbar-wrapper.js.map +1 -1
  89. package/lib/extensions/extended-table.js +1 -1
  90. package/lib/extensions/extended-table.js.map +1 -1
  91. package/lib/extensions/image-component.js +1 -1
  92. package/lib/extensions/image-component.js.map +1 -1
  93. package/lib/extensions/image.js +1 -1
  94. package/lib/extensions/image.js.map +1 -1
  95. package/lib/extensions/index.js +1 -1
  96. package/lib/extensions/index.js.map +1 -1
  97. package/lib/extensions/math.js +1 -1
  98. package/lib/extensions/math.js.map +1 -1
  99. package/lib/extensions/media.js +1 -1
  100. package/lib/extensions/media.js.map +1 -1
  101. package/lib/extensions/responseArea.js +1 -1
  102. package/lib/extensions/responseArea.js.map +1 -1
  103. package/lib/index.js +1 -1
  104. package/lib/index.js.map +1 -1
  105. package/lib/styles/editorContainerStyles.js +1 -1
  106. package/lib/styles/editorContainerStyles.js.map +1 -1
  107. package/lib/theme.js +1 -1
  108. package/lib/theme.js.map +1 -1
  109. package/lib/utils/size.js +1 -1
  110. package/lib/utils/size.js.map +1 -1
  111. package/package.json +2 -2
  112. package/src/components/TiptapContainer.jsx +24 -4
  113. package/LICENSE.md +0 -5
  114. package/NEXT.CHANGELOG.json +0 -1
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
+ var _responseArea = require("../responseArea");
6
+ jest.mock('@tiptap/core', function () {
7
+ return {
8
+ Extension: {
9
+ create: jest.fn(function (config) {
10
+ return config;
11
+ })
12
+ },
13
+ Node: {
14
+ create: jest.fn(function (config) {
15
+ return config;
16
+ })
17
+ }
18
+ };
19
+ });
20
+ jest.mock('@tiptap/react', function () {
21
+ return {
22
+ Node: {
23
+ create: jest.fn(function (config) {
24
+ return config;
25
+ })
26
+ },
27
+ ReactNodeViewRenderer: jest.fn(function (component) {
28
+ return component;
29
+ })
30
+ };
31
+ });
32
+ jest.mock('prosemirror-state', function () {
33
+ return {
34
+ Plugin: jest.fn(function (config) {
35
+ return config;
36
+ }),
37
+ PluginKey: jest.fn(function (key) {
38
+ this.key = key;
39
+ }),
40
+ TextSelection: {
41
+ near: jest.fn(function (pos, dir) {
42
+ return {
43
+ type: 'text',
44
+ pos: pos,
45
+ dir: dir
46
+ };
47
+ }),
48
+ create: jest.fn(function (doc, pos) {
49
+ return {
50
+ type: 'text',
51
+ pos: pos
52
+ };
53
+ })
54
+ },
55
+ NodeSelection: {
56
+ create: jest.fn(function (doc, pos) {
57
+ return {
58
+ type: 'node',
59
+ pos: pos
60
+ };
61
+ })
62
+ }
63
+ };
64
+ });
65
+ jest.mock('../../components/respArea/ExplicitConstructedResponse', function () {
66
+ return {
67
+ __esModule: true,
68
+ "default": jest.fn(function () {
69
+ return /*#__PURE__*/React.createElement("div", {
70
+ "data-testid": "explicit-constructed-response"
71
+ });
72
+ })
73
+ };
74
+ });
75
+ jest.mock('../../components/respArea/DragInTheBlank/DragInTheBlank', function () {
76
+ return {
77
+ __esModule: true,
78
+ "default": jest.fn(function () {
79
+ return /*#__PURE__*/React.createElement("div", {
80
+ "data-testid": "drag-in-the-blank"
81
+ });
82
+ })
83
+ };
84
+ });
85
+ jest.mock('../../components/respArea/InlineDropdown', function () {
86
+ return {
87
+ __esModule: true,
88
+ "default": jest.fn(function () {
89
+ return /*#__PURE__*/React.createElement("div", {
90
+ "data-testid": "inline-dropdown"
91
+ });
92
+ })
93
+ };
94
+ });
95
+ describe('ResponseAreaExtension', function () {
96
+ describe('configuration', function () {
97
+ it('has correct name', function () {
98
+ expect(_responseArea.ResponseAreaExtension.name).toBe('responseArea');
99
+ });
100
+ });
101
+ describe('addOptions', function () {
102
+ it('returns default options', function () {
103
+ var options = _responseArea.ResponseAreaExtension.addOptions();
104
+ expect(options).toHaveProperty('maxResponseAreas', null);
105
+ expect(options).toHaveProperty('error', null);
106
+ expect(options).toHaveProperty('options', null);
107
+ expect(options).toHaveProperty('respAreaToolbar', null);
108
+ expect(options).toHaveProperty('onHandleAreaChange', null);
109
+ });
110
+ });
111
+ describe('addProseMirrorPlugins', function () {
112
+ it('returns empty array when no type specified', function () {
113
+ var context = {
114
+ options: {}
115
+ };
116
+ var plugins = _responseArea.ResponseAreaExtension.addProseMirrorPlugins.call(context);
117
+ expect(Array.isArray(plugins)).toBe(true);
118
+ expect(plugins).toHaveLength(0);
119
+ });
120
+ it('returns plugin array when type is specified', function () {
121
+ var context = {
122
+ options: {
123
+ type: 'explicit-constructed-response',
124
+ maxResponseAreas: 5
125
+ }
126
+ };
127
+ var plugins = _responseArea.ResponseAreaExtension.addProseMirrorPlugins.call(context);
128
+ expect(Array.isArray(plugins)).toBe(true);
129
+ expect(plugins).toHaveLength(1);
130
+ expect(plugins[0]).toHaveProperty('key');
131
+ expect(plugins[0]).toHaveProperty('view');
132
+ });
133
+ });
134
+ describe('addCommands', function () {
135
+ it('returns insertResponseArea command', function () {
136
+ var commands = _responseArea.ResponseAreaExtension.addCommands();
137
+ expect(commands).toHaveProperty('insertResponseArea');
138
+ expect((0, _typeof2["default"])(commands.insertResponseArea)).toBe('function');
139
+ });
140
+ });
141
+ });
142
+ describe('ExplicitConstructedResponseNode', function () {
143
+ describe('configuration', function () {
144
+ it('has correct name', function () {
145
+ expect(_responseArea.ExplicitConstructedResponseNode.name).toBe('explicit_constructed_response');
146
+ });
147
+ it('is inline', function () {
148
+ expect(_responseArea.ExplicitConstructedResponseNode.inline).toBe(true);
149
+ });
150
+ it('is in inline group', function () {
151
+ expect(_responseArea.ExplicitConstructedResponseNode.group).toBe('inline');
152
+ });
153
+ it('is atomic', function () {
154
+ expect(_responseArea.ExplicitConstructedResponseNode.atom).toBe(true);
155
+ });
156
+ });
157
+ describe('addAttributes', function () {
158
+ it('returns required attributes', function () {
159
+ var attributes = _responseArea.ExplicitConstructedResponseNode.addAttributes();
160
+ expect(attributes).toHaveProperty('index');
161
+ expect(attributes).toHaveProperty('value');
162
+ expect(attributes).toHaveProperty('updated');
163
+ expect(attributes.index).toEqual({
164
+ "default": null
165
+ });
166
+ expect(attributes.value).toEqual({
167
+ "default": ''
168
+ });
169
+ expect(attributes.updated).toEqual({
170
+ "default": ''
171
+ });
172
+ });
173
+ });
174
+ describe('parseHTML', function () {
175
+ it('returns parsing rules', function () {
176
+ var rules = _responseArea.ExplicitConstructedResponseNode.parseHTML();
177
+ expect(Array.isArray(rules)).toBe(true);
178
+ expect(rules).toHaveLength(1);
179
+ expect(rules[0]).toHaveProperty('tag');
180
+ });
181
+ });
182
+ describe('renderHTML', function () {
183
+ it('renders span with attributes', function () {
184
+ var result = _responseArea.ExplicitConstructedResponseNode.renderHTML({
185
+ HTMLAttributes: {
186
+ index: '1',
187
+ id: '1',
188
+ value: 'test'
189
+ }
190
+ });
191
+ expect(result[0]).toBe('span');
192
+ expect(result[1]).toHaveProperty('data-type', 'explicit_constructed_response');
193
+ });
194
+ });
195
+ describe('addNodeView', function () {
196
+ it('returns ReactNodeViewRenderer result', function () {
197
+ var result = _responseArea.ExplicitConstructedResponseNode.addNodeView();
198
+ expect(result).toBeDefined();
199
+ });
200
+ });
201
+ });
202
+ describe('DragInTheBlankNode', function () {
203
+ describe('configuration', function () {
204
+ it('has correct name', function () {
205
+ expect(_responseArea.DragInTheBlankNode.name).toBe('drag_in_the_blank');
206
+ });
207
+ it('is inline', function () {
208
+ expect(_responseArea.DragInTheBlankNode.inline).toBe(true);
209
+ });
210
+ it('is in inline group', function () {
211
+ expect(_responseArea.DragInTheBlankNode.group).toBe('inline');
212
+ });
213
+ it('is atomic', function () {
214
+ expect(_responseArea.DragInTheBlankNode.atom).toBe(true);
215
+ });
216
+ });
217
+ describe('addAttributes', function () {
218
+ it('returns required attributes', function () {
219
+ var attributes = _responseArea.DragInTheBlankNode.addAttributes();
220
+ expect(attributes).toHaveProperty('index');
221
+ expect(attributes).toHaveProperty('id');
222
+ expect(attributes).toHaveProperty('value');
223
+ expect(attributes).toHaveProperty('inTable');
224
+ expect(attributes).toHaveProperty('updated');
225
+ expect(attributes.index).toEqual({
226
+ "default": null
227
+ });
228
+ expect(attributes.id).toEqual({
229
+ "default": null
230
+ });
231
+ expect(attributes.value).toEqual({
232
+ "default": ''
233
+ });
234
+ expect(attributes.inTable).toEqual({
235
+ "default": null
236
+ });
237
+ expect(attributes.updated).toEqual({
238
+ "default": ''
239
+ });
240
+ });
241
+ });
242
+ describe('parseHTML', function () {
243
+ it('returns parsing rules', function () {
244
+ var rules = _responseArea.DragInTheBlankNode.parseHTML();
245
+ expect(Array.isArray(rules)).toBe(true);
246
+ expect(rules).toHaveLength(1);
247
+ expect(rules[0]).toHaveProperty('tag');
248
+ });
249
+ });
250
+ describe('renderHTML', function () {
251
+ it('renders span with attributes', function () {
252
+ var result = _responseArea.DragInTheBlankNode.renderHTML({
253
+ HTMLAttributes: {
254
+ index: '1',
255
+ id: '1',
256
+ value: 'test'
257
+ }
258
+ });
259
+ expect(result[0]).toBe('span');
260
+ expect(result[1]).toHaveProperty('data-type', 'drag_in_the_blank');
261
+ });
262
+ });
263
+ describe('addNodeView', function () {
264
+ it('returns ReactNodeViewRenderer result', function () {
265
+ var result = _responseArea.DragInTheBlankNode.addNodeView();
266
+ expect(result).toBeDefined();
267
+ });
268
+ });
269
+ });
270
+ describe('InlineDropdownNode', function () {
271
+ describe('configuration', function () {
272
+ it('has correct name', function () {
273
+ expect(_responseArea.InlineDropdownNode.name).toBe('inline_dropdown');
274
+ });
275
+ it('is inline', function () {
276
+ expect(_responseArea.InlineDropdownNode.inline).toBe(true);
277
+ });
278
+ it('is in inline group', function () {
279
+ expect(_responseArea.InlineDropdownNode.group).toBe('inline');
280
+ });
281
+ it('is atomic', function () {
282
+ expect(_responseArea.InlineDropdownNode.atom).toBe(true);
283
+ });
284
+ });
285
+ describe('addAttributes', function () {
286
+ it('returns required attributes', function () {
287
+ var attributes = _responseArea.InlineDropdownNode.addAttributes();
288
+ expect(attributes).toHaveProperty('index');
289
+ expect(attributes).toHaveProperty('value');
290
+ expect(attributes).toHaveProperty('updated');
291
+ expect(attributes.index).toEqual({
292
+ "default": null
293
+ });
294
+ expect(attributes.value).toEqual({
295
+ "default": ''
296
+ });
297
+ expect(attributes.updated).toEqual({
298
+ "default": ''
299
+ });
300
+ });
301
+ });
302
+ describe('parseHTML', function () {
303
+ it('returns parsing rules', function () {
304
+ var rules = _responseArea.InlineDropdownNode.parseHTML();
305
+ expect(Array.isArray(rules)).toBe(true);
306
+ expect(rules).toHaveLength(1);
307
+ expect(rules[0]).toHaveProperty('tag');
308
+ });
309
+ });
310
+ describe('renderHTML', function () {
311
+ it('renders span with attributes', function () {
312
+ var result = _responseArea.InlineDropdownNode.renderHTML({
313
+ HTMLAttributes: {
314
+ index: '1',
315
+ id: '1',
316
+ value: 'test'
317
+ }
318
+ });
319
+ expect(result[0]).toBe('span');
320
+ expect(result[1]).toHaveProperty('data-type', 'inline_dropdown');
321
+ });
322
+ });
323
+ describe('addNodeView', function () {
324
+ it('returns ReactNodeViewRenderer result', function () {
325
+ var result = _responseArea.InlineDropdownNode.addNodeView();
326
+ expect(result).toBeDefined();
327
+ });
328
+ });
329
+ });
330
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVzcG9uc2VBcmVhIiwicmVxdWlyZSIsImplc3QiLCJtb2NrIiwiRXh0ZW5zaW9uIiwiY3JlYXRlIiwiZm4iLCJjb25maWciLCJOb2RlIiwiUmVhY3ROb2RlVmlld1JlbmRlcmVyIiwiY29tcG9uZW50IiwiUGx1Z2luIiwiUGx1Z2luS2V5Iiwia2V5IiwiVGV4dFNlbGVjdGlvbiIsIm5lYXIiLCJwb3MiLCJkaXIiLCJ0eXBlIiwiZG9jIiwiTm9kZVNlbGVjdGlvbiIsIl9fZXNNb2R1bGUiLCJSZWFjdCIsImNyZWF0ZUVsZW1lbnQiLCJkZXNjcmliZSIsIml0IiwiZXhwZWN0IiwiUmVzcG9uc2VBcmVhRXh0ZW5zaW9uIiwibmFtZSIsInRvQmUiLCJvcHRpb25zIiwiYWRkT3B0aW9ucyIsInRvSGF2ZVByb3BlcnR5IiwiY29udGV4dCIsInBsdWdpbnMiLCJhZGRQcm9zZU1pcnJvclBsdWdpbnMiLCJjYWxsIiwiQXJyYXkiLCJpc0FycmF5IiwidG9IYXZlTGVuZ3RoIiwibWF4UmVzcG9uc2VBcmVhcyIsImNvbW1hbmRzIiwiYWRkQ29tbWFuZHMiLCJfdHlwZW9mMiIsImluc2VydFJlc3BvbnNlQXJlYSIsIkV4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZU5vZGUiLCJpbmxpbmUiLCJncm91cCIsImF0b20iLCJhdHRyaWJ1dGVzIiwiYWRkQXR0cmlidXRlcyIsImluZGV4IiwidG9FcXVhbCIsInZhbHVlIiwidXBkYXRlZCIsInJ1bGVzIiwicGFyc2VIVE1MIiwicmVzdWx0IiwicmVuZGVySFRNTCIsIkhUTUxBdHRyaWJ1dGVzIiwiaWQiLCJhZGROb2RlVmlldyIsInRvQmVEZWZpbmVkIiwiRHJhZ0luVGhlQmxhbmtOb2RlIiwiaW5UYWJsZSIsIklubGluZURyb3Bkb3duTm9kZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leHRlbnNpb25zL19fdGVzdHNfXy9yZXNwb25zZUFyZWEudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEcmFnSW5UaGVCbGFua05vZGUsXG4gIEV4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZU5vZGUsXG4gIElubGluZURyb3Bkb3duTm9kZSxcbiAgUmVzcG9uc2VBcmVhRXh0ZW5zaW9uLFxufSBmcm9tICcuLi9yZXNwb25zZUFyZWEnO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvY29yZScsICgpID0+ICh7XG4gIEV4dGVuc2lvbjogeyBjcmVhdGU6IGplc3QuZm4oKGNvbmZpZykgPT4gY29uZmlnKSB9LFxuICBOb2RlOiB7IGNyZWF0ZTogamVzdC5mbigoY29uZmlnKSA9PiBjb25maWcpIH0sXG59KSk7XG5cbmplc3QubW9jaygnQHRpcHRhcC9yZWFjdCcsICgpID0+ICh7XG4gIE5vZGU6IHsgY3JlYXRlOiBqZXN0LmZuKChjb25maWcpID0+IGNvbmZpZykgfSxcbiAgUmVhY3ROb2RlVmlld1JlbmRlcmVyOiBqZXN0LmZuKChjb21wb25lbnQpID0+IGNvbXBvbmVudCksXG59KSk7XG5cbmplc3QubW9jaygncHJvc2VtaXJyb3Itc3RhdGUnLCAoKSA9PiAoe1xuICBQbHVnaW46IGplc3QuZm4oZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIHJldHVybiBjb25maWc7XG4gIH0pLFxuICBQbHVnaW5LZXk6IGplc3QuZm4oZnVuY3Rpb24gKGtleSkge1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICB9KSxcbiAgVGV4dFNlbGVjdGlvbjoge1xuICAgIG5lYXI6IGplc3QuZm4oKHBvcywgZGlyKSA9PiAoeyB0eXBlOiAndGV4dCcsIHBvcywgZGlyIH0pKSxcbiAgICBjcmVhdGU6IGplc3QuZm4oKGRvYywgcG9zKSA9PiAoeyB0eXBlOiAndGV4dCcsIHBvcyB9KSksXG4gIH0sXG4gIE5vZGVTZWxlY3Rpb246IHtcbiAgICBjcmVhdGU6IGplc3QuZm4oKGRvYywgcG9zKSA9PiAoeyB0eXBlOiAnbm9kZScsIHBvcyB9KSksXG4gIH0sXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9yZXNwQXJlYS9FeHBsaWNpdENvbnN0cnVjdGVkUmVzcG9uc2UnLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZVwiIC8+KSxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi8uLi9jb21wb25lbnRzL3Jlc3BBcmVhL0RyYWdJblRoZUJsYW5rL0RyYWdJblRoZUJsYW5rJywgKCkgPT4gKHtcbiAgX19lc01vZHVsZTogdHJ1ZSxcbiAgZGVmYXVsdDogamVzdC5mbigoKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwiZHJhZy1pbi10aGUtYmxhbmtcIiAvPiksXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9yZXNwQXJlYS9JbmxpbmVEcm9wZG93bicsICgpID0+ICh7XG4gIF9fZXNNb2R1bGU6IHRydWUsXG4gIGRlZmF1bHQ6IGplc3QuZm4oKCkgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImlubGluZS1kcm9wZG93blwiIC8+KSxcbn0pKTtcblxuZGVzY3JpYmUoJ1Jlc3BvbnNlQXJlYUV4dGVuc2lvbicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2NvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2hhcyBjb3JyZWN0IG5hbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoUmVzcG9uc2VBcmVhRXh0ZW5zaW9uLm5hbWUpLnRvQmUoJ3Jlc3BvbnNlQXJlYScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkT3B0aW9ucycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBkZWZhdWx0IG9wdGlvbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0gUmVzcG9uc2VBcmVhRXh0ZW5zaW9uLmFkZE9wdGlvbnMoKTtcblxuICAgICAgZXhwZWN0KG9wdGlvbnMpLnRvSGF2ZVByb3BlcnR5KCdtYXhSZXNwb25zZUFyZWFzJywgbnVsbCk7XG4gICAgICBleHBlY3Qob3B0aW9ucykudG9IYXZlUHJvcGVydHkoJ2Vycm9yJywgbnVsbCk7XG4gICAgICBleHBlY3Qob3B0aW9ucykudG9IYXZlUHJvcGVydHkoJ29wdGlvbnMnLCBudWxsKTtcbiAgICAgIGV4cGVjdChvcHRpb25zKS50b0hhdmVQcm9wZXJ0eSgncmVzcEFyZWFUb29sYmFyJywgbnVsbCk7XG4gICAgICBleHBlY3Qob3B0aW9ucykudG9IYXZlUHJvcGVydHkoJ29uSGFuZGxlQXJlYUNoYW5nZScsIG51bGwpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkUHJvc2VNaXJyb3JQbHVnaW5zJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGVtcHR5IGFycmF5IHdoZW4gbm8gdHlwZSBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICBvcHRpb25zOiB7fSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSBSZXNwb25zZUFyZWFFeHRlbnNpb24uYWRkUHJvc2VNaXJyb3JQbHVnaW5zLmNhbGwoY29udGV4dCk7XG5cbiAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KHBsdWdpbnMpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHBsdWdpbnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIHBsdWdpbiBhcnJheSB3aGVuIHR5cGUgaXMgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHR5cGU6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsXG4gICAgICAgICAgbWF4UmVzcG9uc2VBcmVhczogNSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSBSZXNwb25zZUFyZWFFeHRlbnNpb24uYWRkUHJvc2VNaXJyb3JQbHVnaW5zLmNhbGwoY29udGV4dCk7XG5cbiAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KHBsdWdpbnMpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHBsdWdpbnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgIGV4cGVjdChwbHVnaW5zWzBdKS50b0hhdmVQcm9wZXJ0eSgna2V5Jyk7XG4gICAgICBleHBlY3QocGx1Z2luc1swXSkudG9IYXZlUHJvcGVydHkoJ3ZpZXcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZENvbW1hbmRzJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGluc2VydFJlc3BvbnNlQXJlYSBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHMgPSBSZXNwb25zZUFyZWFFeHRlbnNpb24uYWRkQ29tbWFuZHMoKTtcblxuICAgICAgZXhwZWN0KGNvbW1hbmRzKS50b0hhdmVQcm9wZXJ0eSgnaW5zZXJ0UmVzcG9uc2VBcmVhJyk7XG4gICAgICBleHBlY3QodHlwZW9mIGNvbW1hbmRzLmluc2VydFJlc3BvbnNlQXJlYSkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0V4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZU5vZGUnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdoYXMgY29ycmVjdCBuYW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KEV4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZU5vZGUubmFtZSkudG9CZSgnZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2UnKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbmxpbmUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoRXhwbGljaXRDb25zdHJ1Y3RlZFJlc3BvbnNlTm9kZS5pbmxpbmUpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgaW4gaW5saW5lIGdyb3VwJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KEV4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZU5vZGUuZ3JvdXApLnRvQmUoJ2lubGluZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGF0b21pYycsICgpID0+IHtcbiAgICAgIGV4cGVjdChFeHBsaWNpdENvbnN0cnVjdGVkUmVzcG9uc2VOb2RlLmF0b20pLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRBdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHJlcXVpcmVkIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gRXhwbGljaXRDb25zdHJ1Y3RlZFJlc3BvbnNlTm9kZS5hZGRBdHRyaWJ1dGVzKCk7XG5cbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnaW5kZXgnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndmFsdWUnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndXBkYXRlZCcpO1xuXG4gICAgICBleHBlY3QoYXR0cmlidXRlcy5pbmRleCkudG9FcXVhbCh7IGRlZmF1bHQ6IG51bGwgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy52YWx1ZSkudG9FcXVhbCh7IGRlZmF1bHQ6ICcnIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMudXBkYXRlZCkudG9FcXVhbCh7IGRlZmF1bHQ6ICcnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2VIVE1MJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHBhcnNpbmcgcnVsZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBydWxlcyA9IEV4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZU5vZGUucGFyc2VIVE1MKCk7XG5cbiAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KHJ1bGVzKSkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChydWxlcykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KHJ1bGVzWzBdKS50b0hhdmVQcm9wZXJ0eSgndGFnJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJIVE1MJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHNwYW4gd2l0aCBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gRXhwbGljaXRDb25zdHJ1Y3RlZFJlc3BvbnNlTm9kZS5yZW5kZXJIVE1MKHtcbiAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBpbmRleDogJzEnLFxuICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgdmFsdWU6ICd0ZXN0JyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0WzBdKS50b0JlKCdzcGFuJyk7XG4gICAgICBleHBlY3QocmVzdWx0WzFdKS50b0hhdmVQcm9wZXJ0eSgnZGF0YS10eXBlJywgJ2V4cGxpY2l0X2NvbnN0cnVjdGVkX3Jlc3BvbnNlJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGROb2RlVmlldycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBSZWFjdE5vZGVWaWV3UmVuZGVyZXIgcmVzdWx0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gRXhwbGljaXRDb25zdHJ1Y3RlZFJlc3BvbnNlTm9kZS5hZGROb2RlVmlldygpO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnRHJhZ0luVGhlQmxhbmtOb2RlJywgKCkgPT4ge1xuICBkZXNjcmliZSgnY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICBpdCgnaGFzIGNvcnJlY3QgbmFtZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChEcmFnSW5UaGVCbGFua05vZGUubmFtZSkudG9CZSgnZHJhZ19pbl90aGVfYmxhbmsnKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbmxpbmUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoRHJhZ0luVGhlQmxhbmtOb2RlLmlubGluZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbiBpbmxpbmUgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoRHJhZ0luVGhlQmxhbmtOb2RlLmdyb3VwKS50b0JlKCdpbmxpbmUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBhdG9taWMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoRHJhZ0luVGhlQmxhbmtOb2RlLmF0b20pLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRBdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHJlcXVpcmVkIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gRHJhZ0luVGhlQmxhbmtOb2RlLmFkZEF0dHJpYnV0ZXMoKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdpbmRleCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdpZCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd2YWx1ZScpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdpblRhYmxlJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ3VwZGF0ZWQnKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuaW5kZXgpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuaWQpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMudmFsdWUpLnRvRXF1YWwoeyBkZWZhdWx0OiAnJyB9KTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLmluVGFibGUpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMudXBkYXRlZCkudG9FcXVhbCh7IGRlZmF1bHQ6ICcnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2VIVE1MJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHBhcnNpbmcgcnVsZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBydWxlcyA9IERyYWdJblRoZUJsYW5rTm9kZS5wYXJzZUhUTUwoKTtcblxuICAgICAgZXhwZWN0KEFycmF5LmlzQXJyYXkocnVsZXMpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJ1bGVzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICBleHBlY3QocnVsZXNbMF0pLnRvSGF2ZVByb3BlcnR5KCd0YWcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbmRlckhUTUwnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgc3BhbiB3aXRoIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBEcmFnSW5UaGVCbGFua05vZGUucmVuZGVySFRNTCh7XG4gICAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgaW5kZXg6ICcxJyxcbiAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgIHZhbHVlOiAndGVzdCcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdFswXSkudG9CZSgnc3BhbicpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9IYXZlUHJvcGVydHkoJ2RhdGEtdHlwZScsICdkcmFnX2luX3RoZV9ibGFuaycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkTm9kZVZpZXcnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgUmVhY3ROb2RlVmlld1JlbmRlcmVyIHJlc3VsdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IERyYWdJblRoZUJsYW5rTm9kZS5hZGROb2RlVmlldygpO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnSW5saW5lRHJvcGRvd25Ob2RlJywgKCkgPT4ge1xuICBkZXNjcmliZSgnY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICBpdCgnaGFzIGNvcnJlY3QgbmFtZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChJbmxpbmVEcm9wZG93bk5vZGUubmFtZSkudG9CZSgnaW5saW5lX2Ryb3Bkb3duJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgaW5saW5lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KElubGluZURyb3Bkb3duTm9kZS5pbmxpbmUpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgaW4gaW5saW5lIGdyb3VwJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KElubGluZURyb3Bkb3duTm9kZS5ncm91cCkudG9CZSgnaW5saW5lJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgYXRvbWljJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KElubGluZURyb3Bkb3duTm9kZS5hdG9tKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkQXR0cmlidXRlcycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyByZXF1aXJlZCBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IElubGluZURyb3Bkb3duTm9kZS5hZGRBdHRyaWJ1dGVzKCk7XG5cbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnaW5kZXgnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndmFsdWUnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndXBkYXRlZCcpO1xuXG4gICAgICBleHBlY3QoYXR0cmlidXRlcy5pbmRleCkudG9FcXVhbCh7IGRlZmF1bHQ6IG51bGwgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy52YWx1ZSkudG9FcXVhbCh7IGRlZmF1bHQ6ICcnIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMudXBkYXRlZCkudG9FcXVhbCh7IGRlZmF1bHQ6ICcnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2VIVE1MJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHBhcnNpbmcgcnVsZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBydWxlcyA9IElubGluZURyb3Bkb3duTm9kZS5wYXJzZUhUTUwoKTtcblxuICAgICAgZXhwZWN0KEFycmF5LmlzQXJyYXkocnVsZXMpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJ1bGVzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICBleHBlY3QocnVsZXNbMF0pLnRvSGF2ZVByb3BlcnR5KCd0YWcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbmRlckhUTUwnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgc3BhbiB3aXRoIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBJbmxpbmVEcm9wZG93bk5vZGUucmVuZGVySFRNTCh7XG4gICAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgaW5kZXg6ICcxJyxcbiAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgIHZhbHVlOiAndGVzdCcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdFswXSkudG9CZSgnc3BhbicpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9IYXZlUHJvcGVydHkoJ2RhdGEtdHlwZScsICdpbmxpbmVfZHJvcGRvd24nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZE5vZGVWaWV3JywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIFJlYWN0Tm9kZVZpZXdSZW5kZXJlciByZXN1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBJbmxpbmVEcm9wZG93bk5vZGUuYWRkTm9kZVZpZXcoKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLGFBQUEsR0FBQUMsT0FBQTtBQU9BQyxJQUFJLENBQUNDLElBQUksQ0FBQyxjQUFjLEVBQUU7RUFBQSxPQUFPO0lBQy9CQyxTQUFTLEVBQUU7TUFBRUMsTUFBTSxFQUFFSCxJQUFJLENBQUNJLEVBQUUsQ0FBQyxVQUFDQyxNQUFNO1FBQUEsT0FBS0EsTUFBTTtNQUFBO0lBQUUsQ0FBQztJQUNsREMsSUFBSSxFQUFFO01BQUVILE1BQU0sRUFBRUgsSUFBSSxDQUFDSSxFQUFFLENBQUMsVUFBQ0MsTUFBTTtRQUFBLE9BQUtBLE1BQU07TUFBQTtJQUFFO0VBQzlDLENBQUM7QUFBQSxDQUFDLENBQUM7QUFFSEwsSUFBSSxDQUFDQyxJQUFJLENBQUMsZUFBZSxFQUFFO0VBQUEsT0FBTztJQUNoQ0ssSUFBSSxFQUFFO01BQUVILE1BQU0sRUFBRUgsSUFBSSxDQUFDSSxFQUFFLENBQUMsVUFBQ0MsTUFBTTtRQUFBLE9BQUtBLE1BQU07TUFBQTtJQUFFLENBQUM7SUFDN0NFLHFCQUFxQixFQUFFUCxJQUFJLENBQUNJLEVBQUUsQ0FBQyxVQUFDSSxTQUFTO01BQUEsT0FBS0EsU0FBUztJQUFBO0VBQ3pELENBQUM7QUFBQSxDQUFDLENBQUM7QUFFSFIsSUFBSSxDQUFDQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7RUFBQSxPQUFPO0lBQ3BDUSxNQUFNLEVBQUVULElBQUksQ0FBQ0ksRUFBRSxDQUFDLFVBQVVDLE1BQU0sRUFBRTtNQUNoQyxPQUFPQSxNQUFNO0lBQ2YsQ0FBQyxDQUFDO0lBQ0ZLLFNBQVMsRUFBRVYsSUFBSSxDQUFDSSxFQUFFLENBQUMsVUFBVU8sR0FBRyxFQUFFO01B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