@pie-lib/editable-html-tip-tap 1.0.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 (167) hide show
  1. package/CHANGELOG.json +32 -0
  2. package/CHANGELOG.md +2280 -0
  3. package/lib/__tests__/editor.test.js +470 -0
  4. package/lib/__tests__/serialization.test.js +246 -0
  5. package/lib/__tests__/utils.js +106 -0
  6. package/lib/block-tags.js +25 -0
  7. package/lib/constants.js +16 -0
  8. package/lib/editor.js +1356 -0
  9. package/lib/extensions/MediaView.js +112 -0
  10. package/lib/extensions/characters.js +65 -0
  11. package/lib/extensions/component.js +325 -0
  12. package/lib/extensions/css.js +252 -0
  13. package/lib/extensions/custom-toolbar-wrapper.js +124 -0
  14. package/lib/extensions/image.js +106 -0
  15. package/lib/extensions/math.js +330 -0
  16. package/lib/extensions/media.js +276 -0
  17. package/lib/extensions/responseArea.js +278 -0
  18. package/lib/index.js +1213 -0
  19. package/lib/old-index.js +269 -0
  20. package/lib/parse-html.js +16 -0
  21. package/lib/plugins/characters/custom-popper.js +73 -0
  22. package/lib/plugins/characters/index.js +305 -0
  23. package/lib/plugins/characters/utils.js +381 -0
  24. package/lib/plugins/css/icons/index.js +37 -0
  25. package/lib/plugins/css/index.js +390 -0
  26. package/lib/plugins/customPlugin/index.js +114 -0
  27. package/lib/plugins/html/icons/index.js +38 -0
  28. package/lib/plugins/html/index.js +81 -0
  29. package/lib/plugins/image/__tests__/component.test.js +51 -0
  30. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +56 -0
  31. package/lib/plugins/image/__tests__/image-toolbar.test.js +26 -0
  32. package/lib/plugins/image/__tests__/index.test.js +98 -0
  33. package/lib/plugins/image/__tests__/insert-image-handler.test.js +125 -0
  34. package/lib/plugins/image/__tests__/mock-change.js +25 -0
  35. package/lib/plugins/image/alt-dialog.js +129 -0
  36. package/lib/plugins/image/component.js +419 -0
  37. package/lib/plugins/image/image-toolbar.js +177 -0
  38. package/lib/plugins/image/index.js +263 -0
  39. package/lib/plugins/image/insert-image-handler.js +117 -0
  40. package/lib/plugins/index.js +413 -0
  41. package/lib/plugins/list/__tests__/index.test.js +79 -0
  42. package/lib/plugins/list/index.js +334 -0
  43. package/lib/plugins/math/__tests__/index.test.js +300 -0
  44. package/lib/plugins/math/index.js +454 -0
  45. package/lib/plugins/media/__tests__/index.test.js +71 -0
  46. package/lib/plugins/media/index.js +387 -0
  47. package/lib/plugins/media/media-dialog.js +709 -0
  48. package/lib/plugins/media/media-toolbar.js +101 -0
  49. package/lib/plugins/media/media-wrapper.js +93 -0
  50. package/lib/plugins/rendering/index.js +46 -0
  51. package/lib/plugins/respArea/drag-in-the-blank/choice.js +289 -0
  52. package/lib/plugins/respArea/drag-in-the-blank/index.js +94 -0
  53. package/lib/plugins/respArea/explicit-constructed-response/index.js +120 -0
  54. package/lib/plugins/respArea/icons/index.js +95 -0
  55. package/lib/plugins/respArea/index.js +341 -0
  56. package/lib/plugins/respArea/inline-dropdown/index.js +126 -0
  57. package/lib/plugins/respArea/math-templated/index.js +130 -0
  58. package/lib/plugins/respArea/utils.js +125 -0
  59. package/lib/plugins/table/CustomTablePlugin.js +133 -0
  60. package/lib/plugins/table/__tests__/index.test.js +442 -0
  61. package/lib/plugins/table/__tests__/table-toolbar.test.js +54 -0
  62. package/lib/plugins/table/icons/index.js +69 -0
  63. package/lib/plugins/table/index.js +483 -0
  64. package/lib/plugins/table/table-toolbar.js +187 -0
  65. package/lib/plugins/textAlign/icons/index.js +194 -0
  66. package/lib/plugins/textAlign/index.js +34 -0
  67. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +128 -0
  68. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +51 -0
  69. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +54 -0
  70. package/lib/plugins/toolbar/__tests__/toolbar.test.js +120 -0
  71. package/lib/plugins/toolbar/default-toolbar.js +229 -0
  72. package/lib/plugins/toolbar/done-button.js +53 -0
  73. package/lib/plugins/toolbar/editor-and-toolbar.js +286 -0
  74. package/lib/plugins/toolbar/index.js +34 -0
  75. package/lib/plugins/toolbar/toolbar-buttons.js +194 -0
  76. package/lib/plugins/toolbar/toolbar.js +376 -0
  77. package/lib/plugins/utils.js +62 -0
  78. package/lib/serialization.js +677 -0
  79. package/lib/shared/alert-dialog.js +75 -0
  80. package/lib/theme.js +9 -0
  81. package/package.json +69 -0
  82. package/src/__tests__/editor.test.jsx +363 -0
  83. package/src/__tests__/serialization.test.js +291 -0
  84. package/src/__tests__/utils.js +36 -0
  85. package/src/block-tags.js +17 -0
  86. package/src/constants.js +7 -0
  87. package/src/editor.jsx +1197 -0
  88. package/src/extensions/characters.js +46 -0
  89. package/src/extensions/component.jsx +294 -0
  90. package/src/extensions/css.js +217 -0
  91. package/src/extensions/custom-toolbar-wrapper.jsx +100 -0
  92. package/src/extensions/image.js +55 -0
  93. package/src/extensions/math.js +259 -0
  94. package/src/extensions/media.js +182 -0
  95. package/src/extensions/responseArea.js +205 -0
  96. package/src/index.jsx +1462 -0
  97. package/src/old-index.jsx +162 -0
  98. package/src/parse-html.js +8 -0
  99. package/src/plugins/README.md +27 -0
  100. package/src/plugins/characters/custom-popper.js +48 -0
  101. package/src/plugins/characters/index.jsx +284 -0
  102. package/src/plugins/characters/utils.js +447 -0
  103. package/src/plugins/css/icons/index.jsx +17 -0
  104. package/src/plugins/css/index.jsx +340 -0
  105. package/src/plugins/customPlugin/index.jsx +85 -0
  106. package/src/plugins/html/icons/index.jsx +19 -0
  107. package/src/plugins/html/index.jsx +72 -0
  108. package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +51 -0
  109. package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +27 -0
  110. package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +44 -0
  111. package/src/plugins/image/__tests__/component.test.jsx +41 -0
  112. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +42 -0
  113. package/src/plugins/image/__tests__/image-toolbar.test.jsx +11 -0
  114. package/src/plugins/image/__tests__/index.test.js +95 -0
  115. package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
  116. package/src/plugins/image/__tests__/mock-change.js +15 -0
  117. package/src/plugins/image/alt-dialog.jsx +82 -0
  118. package/src/plugins/image/component.jsx +343 -0
  119. package/src/plugins/image/image-toolbar.jsx +100 -0
  120. package/src/plugins/image/index.jsx +227 -0
  121. package/src/plugins/image/insert-image-handler.js +79 -0
  122. package/src/plugins/index.jsx +377 -0
  123. package/src/plugins/list/__tests__/index.test.js +54 -0
  124. package/src/plugins/list/index.jsx +305 -0
  125. package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +48 -0
  126. package/src/plugins/math/__tests__/index.test.jsx +245 -0
  127. package/src/plugins/math/index.jsx +379 -0
  128. package/src/plugins/media/__tests__/index.test.js +75 -0
  129. package/src/plugins/media/index.jsx +325 -0
  130. package/src/plugins/media/media-dialog.js +624 -0
  131. package/src/plugins/media/media-toolbar.jsx +56 -0
  132. package/src/plugins/media/media-wrapper.jsx +43 -0
  133. package/src/plugins/rendering/index.js +31 -0
  134. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +215 -0
  135. package/src/plugins/respArea/drag-in-the-blank/index.jsx +70 -0
  136. package/src/plugins/respArea/explicit-constructed-response/index.jsx +92 -0
  137. package/src/plugins/respArea/icons/index.jsx +71 -0
  138. package/src/plugins/respArea/index.jsx +299 -0
  139. package/src/plugins/respArea/inline-dropdown/index.jsx +108 -0
  140. package/src/plugins/respArea/math-templated/index.jsx +104 -0
  141. package/src/plugins/respArea/utils.jsx +90 -0
  142. package/src/plugins/table/CustomTablePlugin.js +113 -0
  143. package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +44 -0
  144. package/src/plugins/table/__tests__/index.test.jsx +401 -0
  145. package/src/plugins/table/__tests__/table-toolbar.test.jsx +42 -0
  146. package/src/plugins/table/icons/index.jsx +53 -0
  147. package/src/plugins/table/index.jsx +427 -0
  148. package/src/plugins/table/table-toolbar.jsx +136 -0
  149. package/src/plugins/textAlign/icons/index.jsx +114 -0
  150. package/src/plugins/textAlign/index.jsx +23 -0
  151. package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +923 -0
  152. package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +20 -0
  153. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +36 -0
  154. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +46 -0
  155. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +94 -0
  156. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +37 -0
  157. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +51 -0
  158. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +106 -0
  159. package/src/plugins/toolbar/default-toolbar.jsx +206 -0
  160. package/src/plugins/toolbar/done-button.jsx +38 -0
  161. package/src/plugins/toolbar/editor-and-toolbar.jsx +257 -0
  162. package/src/plugins/toolbar/index.jsx +23 -0
  163. package/src/plugins/toolbar/toolbar-buttons.jsx +138 -0
  164. package/src/plugins/toolbar/toolbar.jsx +338 -0
  165. package/src/plugins/utils.js +31 -0
  166. package/src/serialization.jsx +621 -0
  167. package/src/theme.js +1 -0
@@ -0,0 +1,677 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.valueToHtml = exports.reduceMultipleBrs = exports.reactAttributes = exports.parseStyleString = exports.htmlToValue = exports.handleHtml = exports.getBase64 = exports.extraCSSRulesOpts = exports.TEXT_RULE = exports.INLINE_TAGS = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _slateHtmlSerializer = _interopRequireDefault(require("slate-html-serializer"));
13
+
14
+ var _react = _interopRequireDefault(require("react"));
15
+
16
+ var _debug = _interopRequireDefault(require("debug"));
17
+
18
+ var _toStyle = require("to-style");
19
+
20
+ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
21
+
22
+ var _image = require("./plugins/image");
23
+
24
+ var _math = require("./plugins/math");
25
+
26
+ var _media = require("./plugins/media");
27
+
28
+ var _list = require("./plugins/list");
29
+
30
+ var _table = require("./plugins/table");
31
+
32
+ var _respArea = require("./plugins/respArea");
33
+
34
+ var _slate = require("slate");
35
+
36
+ var _blockTags = require("./block-tags");
37
+
38
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
39
+
40
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
41
+
42
+ var log = (0, _debug["default"])('@pie-lib:editable-html:serialization');
43
+ /**
44
+ * Tags to marks.
45
+ *
46
+ * @type {Object}
47
+ */
48
+
49
+ var MARK_TAGS = {
50
+ b: 'bold',
51
+ em: 'italic',
52
+ u: 'underline',
53
+ s: 'strikethrough',
54
+ code: 'code',
55
+ strong: 'bold',
56
+ blockquote: 'blockquote',
57
+ h3: 'h3',
58
+ sup: 'sup',
59
+ sub: 'sub'
60
+ };
61
+
62
+ var parseStyleString = function parseStyleString(s) {
63
+ var regex = /([\w-]*)\s*:\s*([^;]*)/g;
64
+ var match;
65
+ var result = {};
66
+
67
+ while (match = regex.exec(s)) {
68
+ result[match[1]] = match[2].trim();
69
+ }
70
+
71
+ return result;
72
+ };
73
+
74
+ exports.parseStyleString = parseStyleString;
75
+
76
+ var getBase64 = function getBase64(file) {
77
+ return new Promise(function (resolve, reject) {
78
+ var reader = new FileReader();
79
+ reader.readAsDataURL(file);
80
+
81
+ reader.onload = function () {
82
+ return resolve(reader.result);
83
+ };
84
+
85
+ reader.onerror = function (error) {
86
+ return reject(error);
87
+ };
88
+ });
89
+ };
90
+
91
+ exports.getBase64 = getBase64;
92
+
93
+ var reactAttributes = function reactAttributes(o) {
94
+ return (0, _toStyle.object)(o, {
95
+ camelize: true,
96
+ addUnits: false
97
+ });
98
+ };
99
+
100
+ exports.reactAttributes = reactAttributes;
101
+
102
+ var attributesToMap = function attributesToMap(el) {
103
+ return function (acc, attribute) {
104
+ var value = el.getAttribute(attribute);
105
+
106
+ if (value) {
107
+ if (attribute === 'style') {
108
+ var styleString = el.getAttribute(attribute);
109
+ var reactStyleObject = reactAttributes(parseStyleString(styleString));
110
+ acc['style'] = reactStyleObject;
111
+ } else {
112
+ acc[attribute] = el.getAttribute(attribute);
113
+ }
114
+ }
115
+
116
+ return acc;
117
+ };
118
+ };
119
+
120
+ var attributes = ['border', 'cellpadding', 'cellspacing', 'class', 'style', 'align'];
121
+ /**
122
+ * Serializer rules.
123
+ *
124
+ * @type {Array}
125
+ */
126
+
127
+ var blocks = {
128
+ deserialize: function deserialize(el, next) {
129
+ log('[blocks:deserialize] block: ', el);
130
+
131
+ var block = _blockTags.BLOCK_TAGS[el.tagName.toLowerCase()];
132
+
133
+ if (!block) return;
134
+ log('[blocks:deserialize] block: ', block);
135
+
136
+ if (el.childNodes.length === 1) {
137
+ var cn = el.childNodes[0];
138
+
139
+ if (cn && cn.tagName && cn.tagName.toLowerCase() === block) {
140
+ log('[we have a child node of the same]...');
141
+ return;
142
+ }
143
+ }
144
+
145
+ return {
146
+ object: 'block',
147
+ type: block,
148
+
149
+ /**
150
+ * Here for rendering styles for all block elements
151
+ */
152
+ data: {
153
+ attributes: attributes.reduce(attributesToMap(el), {})
154
+ },
155
+ nodes: next(el.childNodes)
156
+ };
157
+ },
158
+ serialize: function serialize(object, children) {
159
+ if (object.object !== 'block') return;
160
+ var jsonData = object.data.toJSON();
161
+ log('[blocks:serialize] object: ', object, children);
162
+ var key;
163
+
164
+ for (key in _blockTags.BLOCK_TAGS) {
165
+ if (_blockTags.BLOCK_TAGS[key] === object.type) {
166
+ var Tag = key;
167
+ return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
168
+ }
169
+ }
170
+ }
171
+ };
172
+ var INLINE_TAGS = {
173
+ span: 'span'
174
+ };
175
+ exports.INLINE_TAGS = INLINE_TAGS;
176
+ var inlines = {
177
+ deserialize: function deserialize(el, next) {
178
+ log('[inlines:deserialize] inline: ', el);
179
+ var inlineTag = INLINE_TAGS[el.tagName.toLowerCase()];
180
+ if (!inlineTag) return;
181
+ log('[inlines:deserialize] inline: ', inlineTag);
182
+
183
+ if (el.childNodes.length === 1) {
184
+ var cn = el.childNodes[0];
185
+
186
+ if (cn && cn.tagName && cn.tagName.toLowerCase() === inlineTag) {
187
+ log('[we have a child node of the same]...');
188
+ return;
189
+ }
190
+ }
191
+
192
+ return {
193
+ object: 'inline',
194
+ type: inlineTag,
195
+
196
+ /**
197
+ * Here for rendering styles for all inline elements
198
+ */
199
+ data: {
200
+ attributes: attributes.reduce(attributesToMap(el), {})
201
+ },
202
+ nodes: next(el.childNodes)
203
+ };
204
+ },
205
+ serialize: function serialize(object, children) {
206
+ if (object.object !== 'inline') return;
207
+ var jsonData = object.data.toJSON();
208
+ log('[inlines:serialize] object: ', object, children);
209
+ var key;
210
+
211
+ for (key in INLINE_TAGS) {
212
+ if (INLINE_TAGS[key] === object.type) {
213
+ var Tag = key;
214
+ return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
215
+ }
216
+ }
217
+ }
218
+ };
219
+ var extraCSSRulesOpts = {};
220
+ exports.extraCSSRulesOpts = extraCSSRulesOpts;
221
+ var STYLES_MAP = {
222
+ h3: {
223
+ fontSize: 'inherit',
224
+ fontWeight: 'inherit'
225
+ },
226
+ blockquote: {
227
+ background: '#f9f9f9',
228
+ borderLeft: '5px solid #ccc',
229
+ margin: '1.5em 10px',
230
+ padding: '.5em 10px'
231
+ }
232
+ };
233
+ var reactToHTMLAttributesMap = {
234
+ "class": 'className'
235
+ };
236
+ var marks = {
237
+ deserialize: function deserialize(el, next) {
238
+ var mark = MARK_TAGS[el.tagName.toLowerCase()];
239
+ var elClasses = el.getAttribute('class') || '';
240
+ var hasCSSRule = ((extraCSSRulesOpts === null || extraCSSRulesOpts === void 0 ? void 0 : extraCSSRulesOpts.names) || []).find(function (name) {
241
+ return elClasses === null || elClasses === void 0 ? void 0 : elClasses.includes(name);
242
+ });
243
+
244
+ if (!mark && !hasCSSRule) {
245
+ return;
246
+ }
247
+
248
+ log('[deserialize] mark: ', mark);
249
+ var attrs = attributes.reduce(attributesToMap(el), {});
250
+ var data = (0, _isEmpty["default"])(attrs) ? undefined : {
251
+ attributes: attrs
252
+ };
253
+ return {
254
+ object: 'mark',
255
+ type: hasCSSRule ? 'css' : mark,
256
+
257
+ /**
258
+ * Here for rendering styles for all elements
259
+ */
260
+ data: data,
261
+ nodes: next(el.childNodes)
262
+ };
263
+ },
264
+ serialize: function serialize(object, children) {
265
+ var _object$data, _jsonData$attributes;
266
+
267
+ var jsonData = ((_object$data = object.data) === null || _object$data === void 0 ? void 0 : _object$data.toJSON()) || {};
268
+ var elClasses = ((_jsonData$attributes = jsonData.attributes) === null || _jsonData$attributes === void 0 ? void 0 : _jsonData$attributes["class"]) || '';
269
+ var hasCSSRule = ((extraCSSRulesOpts === null || extraCSSRulesOpts === void 0 ? void 0 : extraCSSRulesOpts.names) || []).find(function (name) {
270
+ return elClasses === null || elClasses === void 0 ? void 0 : elClasses.includes(name);
271
+ });
272
+
273
+ if (hasCSSRule) {
274
+ var htmlAttrs = Object.keys(jsonData.attributes).reduce(function (obj, key) {
275
+ obj[reactToHTMLAttributesMap[key] || key] = jsonData.attributes[key];
276
+ return obj;
277
+ }, {});
278
+ return /*#__PURE__*/_react["default"].createElement("span", htmlAttrs, children);
279
+ }
280
+
281
+ if (_slate.Mark.isMark(object)) {
282
+ for (var key in MARK_TAGS) {
283
+ if (MARK_TAGS[key] === object.type) {
284
+ var Tag = key;
285
+ var additionalStyles = STYLES_MAP[Tag];
286
+
287
+ if (additionalStyles) {
288
+ if (!jsonData.attributes) {
289
+ jsonData.attributes = {};
290
+ }
291
+
292
+ jsonData.attributes.style = _objectSpread(_objectSpread({}, jsonData.attributes.style), additionalStyles);
293
+ }
294
+
295
+ return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
296
+ }
297
+ }
298
+ }
299
+ }
300
+ }; // eslint-disable-next-line no-unused-vars
301
+
302
+ var findPreviousText = function findPreviousText(el) {
303
+ if (el.nodeName === '#text') {
304
+ return el;
305
+ }
306
+
307
+ if (el.previousSibling) {
308
+ return findPreviousText(el.previousSibling);
309
+ }
310
+
311
+ return null;
312
+ };
313
+
314
+ var TEXT_RULE = {
315
+ deserialize: function deserialize(el) {
316
+ /**
317
+ * This needs to be called on the dom element in order to merge the adjacent text nodes together
318
+ * */
319
+ el.normalize();
320
+
321
+ if (el.tagName && el.tagName.toLowerCase() === 'br') {
322
+ return {
323
+ object: 'text',
324
+ leaves: [{
325
+ object: 'leaf',
326
+ text: '\n'
327
+ }]
328
+ };
329
+ }
330
+
331
+ if (el.nodeName === '#text') {
332
+ if (el.nodeValue && el.nodeValue.match(/<!--.*?-->/)) return;
333
+ log('[text:deserialize] return text object..');
334
+ return {
335
+ object: 'text',
336
+ leaves: [{
337
+ object: 'leaf',
338
+ text: el.nodeValue
339
+ }]
340
+ };
341
+ }
342
+ },
343
+ serialize: function serialize(obj, children) {
344
+ if (obj.object === 'string') {
345
+ return children.split('\n').reduce(function (array, text, i) {
346
+ if (i !== 0) array.push( /*#__PURE__*/_react["default"].createElement("br", null));
347
+ array.push(text);
348
+ return array;
349
+ }, []);
350
+ }
351
+ }
352
+ };
353
+ exports.TEXT_RULE = TEXT_RULE;
354
+ var RULES = [_list.serialization, _math.serialization, _media.serialization, _image.serialization, _table.serialization, _respArea.serialization, TEXT_RULE, inlines, blocks, marks];
355
+
356
+ function allWhitespace(node) {
357
+ // Use ECMA-262 Edition 3 String and RegExp features
358
+ return !/[^\t\n\r ]/.test(node.textContent);
359
+ }
360
+
361
+ function defaultParseHtml(html) {
362
+ if (typeof DOMParser === 'undefined') {
363
+ throw new Error('The native `DOMParser` global which the `Html` serializer uses by default is not present in this environment. You must supply the `options.parseHtml` function instead.');
364
+ }
365
+
366
+ var parsed = new DOMParser().parseFromString(html, 'text/html');
367
+ var body = parsed.body;
368
+ var textNodes = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, null);
369
+ var n = textNodes.nextNode();
370
+
371
+ while (n) {
372
+ var _n$nextSibling, _n$nextSibling$tagNam, _n$previousSibling, _n$previousSibling$ta;
373
+
374
+ var isWhiteSpace = allWhitespace(n);
375
+ var isNotNearMarkup = !MARK_TAGS[(_n$nextSibling = n.nextSibling) === null || _n$nextSibling === void 0 ? void 0 : (_n$nextSibling$tagNam = _n$nextSibling.tagName) === null || _n$nextSibling$tagNam === void 0 ? void 0 : _n$nextSibling$tagNam.toLowerCase()] && !MARK_TAGS[(_n$previousSibling = n.previousSibling) === null || _n$previousSibling === void 0 ? void 0 : (_n$previousSibling$ta = _n$previousSibling.tagName) === null || _n$previousSibling$ta === void 0 ? void 0 : _n$previousSibling$ta.toLowerCase()];
376
+
377
+ if (isWhiteSpace && isNotNearMarkup || n.nodeValue === "\u200B") {
378
+ n.parentNode.removeChild(n);
379
+ }
380
+
381
+ n = textNodes.nextNode();
382
+ }
383
+
384
+ return body;
385
+ }
386
+ /** If this lib is used on the server side, we need to bypass using the DOMParser - just put in a stub. */
387
+
388
+
389
+ var parseHtml = typeof window === 'undefined' ? function () {
390
+ return {
391
+ childNodes: []
392
+ };
393
+ } : defaultParseHtml;
394
+ var serializer = new _slateHtmlSerializer["default"]({
395
+ defaultBlock: 'div',
396
+ rules: RULES,
397
+ parseHtml: parseHtml
398
+ });
399
+
400
+ var _extends = Object.assign || function (target) {
401
+ for (var i = 1; i < arguments.length; i++) {
402
+ var source = arguments[i];
403
+
404
+ for (var key in source) {
405
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
406
+ target[key] = source[key];
407
+ }
408
+ }
409
+ }
410
+
411
+ return target;
412
+ };
413
+ /**
414
+ * This is needed in order to override the function that eventually leads
415
+ * to the max iteration of 12, which in most cases it's not enough. The newer versions
416
+ * have a different way to calculate this, but updating to a newer version of slate
417
+ * requires a lot of work fixing other issues. So we just increase the rules by 1000,
418
+ * which means a lot of iterations.
419
+ * Below is the code that calculates the max iterations.
420
+ * var max = schema.stack.plugins.length + schema.rules.length + 1;
421
+ */
422
+
423
+
424
+ serializer.deserialize = function deserialize(html) {
425
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
426
+ var _options$toJSON = options.toJSON;
427
+ var toJSON = _options$toJSON === undefined ? false : _options$toJSON;
428
+ var defaultBlock = this.defaultBlock;
429
+ var parseHtml = this.parseHtml;
430
+ var fragment = parseHtml(html);
431
+ var children = Array.from(fragment.childNodes);
432
+ var nodes = this.deserializeElements(children); // COMPAT: ensure that all top-level inline nodes are wrapped into a block.
433
+
434
+ nodes = nodes.reduce(function (memo, node, i, original) {
435
+ if (node.object === 'block') {
436
+ memo.push(node);
437
+ return memo;
438
+ }
439
+
440
+ if (i > 0 && original[i - 1].object !== 'block') {
441
+ var _block = memo[memo.length - 1];
442
+
443
+ _block.nodes.push(node);
444
+
445
+ return memo;
446
+ }
447
+
448
+ var block = _extends({
449
+ object: 'block',
450
+ data: {},
451
+ isVoid: false
452
+ }, defaultBlock, {
453
+ nodes: [node]
454
+ });
455
+
456
+ memo.push(block);
457
+ return memo;
458
+ }, []);
459
+
460
+ if (nodes.length === 0) {
461
+ nodes = [_extends({
462
+ object: 'block',
463
+ data: {},
464
+ isVoid: false
465
+ }, defaultBlock, {
466
+ nodes: [{
467
+ object: 'text',
468
+ leaves: [{
469
+ object: 'leaf',
470
+ text: '',
471
+ marks: []
472
+ }]
473
+ }]
474
+ })];
475
+ }
476
+
477
+ var json = {
478
+ object: 'value',
479
+ document: {
480
+ object: 'document',
481
+ data: {},
482
+ nodes: nodes
483
+ },
484
+ schema: {
485
+ rules: []
486
+ }
487
+ };
488
+ var i;
489
+
490
+ for (i = 0; i < 3000; i++) {
491
+ json.schema.rules.push({
492
+ match: {
493
+ object: 'document'
494
+ },
495
+ nodes: [{
496
+ match: {
497
+ object: 'block'
498
+ }
499
+ }]
500
+ });
501
+ }
502
+
503
+ var ret = toJSON ? json : _slate.Value.fromJSON(json);
504
+
505
+ if (ret) {
506
+ return ret;
507
+ }
508
+
509
+ return null;
510
+ };
511
+
512
+ var reduceMultipleBrs = function reduceMultipleBrs(markup) {
513
+ try {
514
+ return markup.replace(/(<br\s*\/?>){3,}/gi, '<br>');
515
+ } catch (e) {
516
+ // eslint-disable-next-line no-console
517
+ console.log("Couldn't remove <br/> tags: ", e);
518
+ }
519
+
520
+ return markup;
521
+ };
522
+
523
+ exports.reduceMultipleBrs = reduceMultipleBrs;
524
+
525
+ var reduceRedundantNewLineCharacters = function reduceRedundantNewLineCharacters(markup) {
526
+ try {
527
+ return markup.replace(/\n/gi, '');
528
+ } catch (e) {
529
+ // eslint-disable-next-line no-console
530
+ console.log("Couldn't remove <br/> tags: ", e);
531
+ }
532
+
533
+ return markup;
534
+ };
535
+ /**
536
+ * Makes sure that the html provided respects the schema
537
+ * rules for the slate editor.
538
+ * @param markup
539
+ * @returns {string}
540
+ */
541
+
542
+
543
+ var fixHtmlCode = function fixHtmlCode(markup) {
544
+ var wrapperEl = document.createElement('div');
545
+ wrapperEl.innerHTML = markup;
546
+ /**
547
+ * DIV elements that are at the same level as paragraphs
548
+ * are replaced with P elements for normalizing purposes
549
+ * @param child
550
+ */
551
+
552
+ var fixParagraphs = function fixParagraphs(child) {
553
+ var p = document.createElement('p');
554
+ p.innerHTML = child.innerHTML;
555
+ Array.from(child.attributes).forEach(function (attr) {
556
+ p.setAttribute(attr.name, attr.value);
557
+ });
558
+ child.replaceWith(p);
559
+ };
560
+ /**
561
+ * @summary Makes sure that tables are placed in the root document.
562
+ * @description This function removes the tables from the nodes that are
563
+ * placed inside the root element and places them exactly near
564
+ * the parent element.
565
+ * @param tableArray
566
+ */
567
+
568
+
569
+ var fixTables = function fixTables(tableArray) {
570
+ tableArray.forEach(function (el) {
571
+ var index = el.index,
572
+ child = el.child,
573
+ parent = el.parent;
574
+ var nodesBefore = [];
575
+ var nodesAfter = [];
576
+ var allNodes = Array.from(parent.childNodes);
577
+ var i;
578
+
579
+ for (i = 0; i < allNodes.length; i++) {
580
+ var node = allNodes[i];
581
+
582
+ if (i < index) {
583
+ nodesBefore.push(node);
584
+ } else if (i > index) {
585
+ nodesAfter.push(node);
586
+ }
587
+ } // creating the element that is going to be placed instead of the parent
588
+
589
+
590
+ var beforeEl = document.createElement(parent.nodeName);
591
+ beforeEl.append.apply(beforeEl, nodesBefore); // replacing parent with the beforeElement
592
+
593
+ parent.replaceWith(beforeEl); // adding the table right after the before element
594
+
595
+ beforeEl.after(child); // creating the element that is going to be placed after the table
596
+
597
+ var afterEl = document.createElement(parent.nodeName);
598
+ afterEl.append.apply(afterEl, nodesAfter); // adding the after element near the table
599
+
600
+ child.after(afterEl);
601
+ });
602
+ };
603
+
604
+ var emptyBlockCheck = function emptyBlockCheck(node) {
605
+ return (node.nodeName === 'DIV' || node.nodeName === 'P' || node.nodeName === 'LI') && node.childNodes.length === 0;
606
+ };
607
+
608
+ var parseNode = function parseNode(el) {
609
+ var childArray = Array.from(el.childNodes);
610
+ var hasParagraphs = childArray.find(function (child) {
611
+ return child.nodeName === 'P';
612
+ });
613
+ var tables = [];
614
+ childArray.forEach(function (child, index) {
615
+ // removing empty blocks
616
+ if (emptyBlockCheck(child)) {
617
+ child.remove();
618
+ return;
619
+ }
620
+
621
+ if (hasParagraphs && child.nodeName === 'DIV') {
622
+ fixParagraphs(child);
623
+ }
624
+
625
+ if (wrapperEl !== el && child.nodeName === 'TABLE') {
626
+ // we don't need to fix tables in the root element
627
+ tables.push({
628
+ index: index,
629
+ child: child,
630
+ parent: el
631
+ });
632
+ }
633
+
634
+ parseNode(child);
635
+ });
636
+
637
+ if (tables.length) {
638
+ fixTables(tables);
639
+ }
640
+ };
641
+
642
+ parseNode(wrapperEl);
643
+ return wrapperEl.innerHTML;
644
+ };
645
+
646
+ var handleHtml = function handleHtml(html) {
647
+ return fixHtmlCode(reduceRedundantNewLineCharacters(reduceMultipleBrs(html)));
648
+ };
649
+
650
+ exports.handleHtml = handleHtml;
651
+
652
+ var htmlToValue = function htmlToValue(html) {
653
+ try {
654
+ return serializer.deserialize(handleHtml(html));
655
+ } catch (e) {
656
+ // eslint-disable-next-line no-console
657
+ console.log("Couldn't parse html: ", e);
658
+ return {};
659
+ }
660
+ };
661
+
662
+ exports.htmlToValue = htmlToValue;
663
+
664
+ var valueToHtml = function valueToHtml(value) {
665
+ return serializer.serialize(value);
666
+ };
667
+ /**
668
+ *
669
+ * <div><div>a</div></div> -> <div>a</div>
670
+ *
671
+ * <div><div>a</div><div>b</div></div> -> <div>a</div><div>b</div>
672
+ * <div><div>a</div>4444<div>b</div></div> -> <div>a</div>4444<div>b</div>
673
+ */
674
+
675
+
676
+ exports.valueToHtml = valueToHtml;
677
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLmpzeCJdLCJuYW1lcyI6WyJsb2ciLCJNQVJLX1RBR1MiLCJiIiwiZW0iLCJ1IiwicyIsImNvZGUiLCJzdHJvbmciLCJibG9ja3F1b3RlIiwiaDMiLCJzdXAiLCJzdWIiLCJwYXJzZVN0eWxlU3RyaW5nIiwicmVnZXgiLCJtYXRjaCIsInJlc3VsdCIsImV4ZWMiLCJ0cmltIiwiZ2V0QmFzZTY0IiwiZmlsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJvbmxvYWQiLCJvbmVycm9yIiwiZXJyb3IiLCJyZWFjdEF0dHJpYnV0ZXMiLCJvIiwiY2FtZWxpemUiLCJhZGRVbml0cyIsImF0dHJpYnV0ZXNUb01hcCIsImVsIiwiYWNjIiwiYXR0cmlidXRlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzdHlsZVN0cmluZyIsInJlYWN0U3R5bGVPYmplY3QiLCJhdHRyaWJ1dGVzIiwiYmxvY2tzIiwiZGVzZXJpYWxpemUiLCJuZXh0IiwiYmxvY2siLCJCTE9DS19UQUdTIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNuIiwib2JqZWN0IiwidHlwZSIsImRhdGEiLCJyZWR1Y2UiLCJub2RlcyIsInNlcmlhbGl6ZSIsImNoaWxkcmVuIiwianNvbkRhdGEiLCJ0b0pTT04iLCJrZXkiLCJUYWciLCJJTkxJTkVfVEFHUyIsInNwYW4iLCJpbmxpbmVzIiwiaW5saW5lVGFnIiwiZXh0cmFDU1NSdWxlc09wdHMiLCJTVFlMRVNfTUFQIiwiZm9udFNpemUiLCJmb250V2VpZ2h0IiwiYmFja2dyb3VuZCIsImJvcmRlckxlZnQiLCJtYXJnaW4iLCJwYWRkaW5nIiwicmVhY3RUb0hUTUxBdHRyaWJ1dGVzTWFwIiwibWFya3MiLCJtYXJrIiwiZWxDbGFzc2VzIiwiaGFzQ1NTUnVsZSIsIm5hbWVzIiwiZmluZCIsIm5hbWUiLCJpbmNsdWRlcyIsImF0dHJzIiwidW5kZWZpbmVkIiwiaHRtbEF0dHJzIiwiT2JqZWN0Iiwia2V5cyIsIm9iaiIsIk1hcmsiLCJpc01hcmsiLCJhZGRpdGlvbmFsU3R5bGVzIiwic3R5bGUiLCJmaW5kUHJldmlvdXNUZXh0Iiwibm9kZU5hbWUiLCJwcmV2aW91c1NpYmxpbmciLCJURVhUX1JVTEUiLCJub3JtYWxpemUiLCJsZWF2ZXMiLCJ0ZXh0Iiwibm9kZVZhbHVlIiwic3BsaXQiLCJhcnJheSIsImkiLCJwdXNoIiwiUlVMRVMiLCJsaXN0U2VyaWFsaXphdGlvbiIsIm1hdGhTZXJpYWxpemF0aW9uIiwibWVkaWFTZXJpYWxpemF0aW9uIiwiaW1nU2VyaWFsaXphdGlvbiIsInRhYmxlU2VyaWFsaXphdGlvbiIsInJlc3BvbnNlQXJlYVNlcmlhbGl6YXRpb24iLCJhbGxXaGl0ZXNwYWNlIiwibm9kZSIsInRlc3QiLCJ0ZXh0Q29udGVudCIsImRlZmF1bHRQYXJzZUh0bWwiLCJodG1sIiwiRE9NUGFyc2VyIiwiRXJyb3IiLCJwYXJzZWQiLCJwYXJzZUZyb21TdHJpbmciLCJib2R5IiwidGV4dE5vZGVzIiwiZG9jdW1lbnQiLCJjcmVhdGVUcmVlV2Fsa2VyIiwiTm9kZUZpbHRlciIsIlNIT1dfVEVYVCIsIm4iLCJuZXh0Tm9kZSIsImlzV2hpdGVTcGFjZSIsImlzTm90TmVhck1hcmt1cCIsIm5leHRTaWJsaW5nIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicGFyc2VIdG1sIiwid2luZG93Iiwic2VyaWFsaXplciIsIkh0bWwiLCJkZWZhdWx0QmxvY2siLCJydWxlcyIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwic291cmNlIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwib3B0aW9ucyIsIl9vcHRpb25zJHRvSlNPTiIsImZyYWdtZW50IiwiQXJyYXkiLCJmcm9tIiwiZGVzZXJpYWxpemVFbGVtZW50cyIsIm1lbW8iLCJvcmlnaW5hbCIsIl9ibG9jayIsImlzVm9pZCIsImpzb24iLCJzY2hlbWEiLCJyZXQiLCJWYWx1ZSIsImZyb21KU09OIiwicmVkdWNlTXVsdGlwbGVCcnMiLCJtYXJrdXAiLCJyZXBsYWNlIiwiZSIsImNvbnNvbGUiLCJyZWR1Y2VSZWR1bmRhbnROZXdMaW5lQ2hhcmFjdGVycyIsImZpeEh0bWxDb2RlIiwid3JhcHBlckVsIiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsImZpeFBhcmFncmFwaHMiLCJjaGlsZCIsInAiLCJmb3JFYWNoIiwiYXR0ciIsInNldEF0dHJpYnV0ZSIsInJlcGxhY2VXaXRoIiwiZml4VGFibGVzIiwidGFibGVBcnJheSIsImluZGV4IiwicGFyZW50Iiwibm9kZXNCZWZvcmUiLCJub2Rlc0FmdGVyIiwiYWxsTm9kZXMiLCJiZWZvcmVFbCIsImFwcGVuZCIsImFmdGVyIiwiYWZ0ZXJFbCIsImVtcHR5QmxvY2tDaGVjayIsInBhcnNlTm9kZSIsImNoaWxkQXJyYXkiLCJoYXNQYXJhZ3JhcGhzIiwidGFibGVzIiwicmVtb3ZlIiwiaGFuZGxlSHRtbCIsImh0bWxUb1ZhbHVlIiwidmFsdWVUb0h0bWwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLEdBQUcsR0FBRyx1QkFBTSxzQ0FBTixDQUFaO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFNQyxTQUFTLEdBQUc7QUFDaEJDLEVBQUFBLENBQUMsRUFBRSxNQURhO0FBRWhCQyxFQUFBQSxFQUFFLEVBQUUsUUFGWTtBQUdoQkMsRUFBQUEsQ0FBQyxFQUFFLFdBSGE7QUFJaEJDLEVBQUFBLENBQUMsRUFBRSxlQUphO0FBS2hCQyxFQUFBQSxJQUFJLEVBQUUsTUFMVTtBQU1oQkMsRUFBQUEsTUFBTSxFQUFFLE1BTlE7QUFPaEJDLEVBQUFBLFVBQVUsRUFBRSxZQVBJO0FBUWhCQyxF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LEtBRFU7QUFFVlIsVUFBQUEsS0FBSyxFQUFMQSxLQUZVO0FBR1ZTLFVBQUFBLE1BQU0sRUFBRXZKO0FBSEUsU0FBWjtBQUtEOztBQUVEZ0ssTUFBQUEsU0FBUyxDQUFDbEIsS0FBRCxDQUFUO0FBQ0QsS0FyQkQ7O0FBdUJBLFFBQUlxQixNQUFNLENBQUNuSixNQUFYLEVBQW1CO0FBQ2pCb0ksTUFBQUEsU0FBUyxDQUFDZSxNQUFELENBQVQ7QUFDRDtBQUNGLEdBL0JEOztBQWlDQUgsRUFBQUEsU0FBUyxDQUFDdEIsU0FBRCxDQUFUO0FBRUEsU0FBT0EsU0FBUyxDQUFDRSxTQUFqQjtBQUNELENBMUdEOztBQTRHTyxJQUFNeUIsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQ2pGLElBQUQ7QUFBQSxTQUFVcUQsV0FBVyxDQUFDRCxnQ0FBZ0MsQ0FBQ0wsaUJBQWlCLENBQUMvQyxJQUFELENBQWxCLENBQWpDLENBQXJCO0FBQUEsQ0FBbkI7Ozs7QUFFQSxJQUFNa0YsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ2xGLElBQUQsRUFBVTtBQUNuQyxNQUFJO0FBQ0YsV0FBT29CLFVBQVUsQ0FBQy9GLFdBQVgsQ0FBdUI0SixVQUFVLENBQUNqRixJQUFELENBQWpDLENBQVA7QUFDRCxHQUZELENBRUUsT0FBT2tELENBQVAsRUFBVTtBQUNWO0FBQ0FDLElBQUFBLE9BQU8sQ0FBQ3pLLEdBQVIsQ0FBWSx1QkFBWixFQUFxQ3dLLENBQXJDO0FBQ0EsV0FBTyxFQUFQO0FBQ0Q7QUFDRixDQVJNOzs7O0FBVUEsSUFBTWlDLFdBQVcsR0FBRyxTQUFkQSxXQUFjLENBQUNwSyxLQUFEO0FBQUEsU0FBV3FHLFVBQVUsQ0FBQ2pGLFNBQVgsQ0FBcUJwQixLQUFyQixDQUFYO0FBQUEsQ0FBcEI7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBIdG1sIGZyb20gJ3NsYXRlLWh0bWwtc2VyaWFsaXplcic7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IG9iamVjdCBhcyB0b1N0eWxlT2JqZWN0IH0gZnJvbSAndG8tc3R5bGUnO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoL2lzRW1wdHknO1xuXG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIGltZ1NlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvaW1hZ2UnO1xuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiBhcyBtYXRoU2VyaWFsaXphdGlvbiB9IGZyb20gJy4vcGx1Z2lucy9tYXRoJztcbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gYXMgbWVkaWFTZXJpYWxpemF0aW9uIH0gZnJvbSAnLi9wbHVnaW5zL21lZGlhJztcbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gYXMgbGlzdFNlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvbGlzdCc7XG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIHRhYmxlU2VyaWFsaXphdGlvbiB9IGZyb20gJy4vcGx1Z2lucy90YWJsZSc7XG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIHJlc3BvbnNlQXJlYVNlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvcmVzcEFyZWEnO1xuaW1wb3J0IHsgTWFyaywgVmFsdWUgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBCTE9DS19UQUdTIH0gZnJvbSAnLi9ibG9jay10YWdzJztcblxuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtbGliOmVkaXRhYmxlLWh0bWw6c2VyaWFsaXphdGlvbicpO1xuXG4vKipcbiAqIFRhZ3MgdG8gbWFya3MuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuXG5jb25zdCBNQVJLX1RBR1MgPSB7XG4gIGI6ICdib2xkJyxcbiAgZW06ICdpdGFsaWMnLFxuICB1OiAndW5kZXJsaW5lJyxcbiAgczogJ3N0cmlrZXRocm91Z2gnLFxuICBjb2RlOiAnY29kZScsXG4gIHN0cm9uZzogJ2JvbGQnLFxuICBibG9ja3F1b3RlOiAnYmxvY2txdW90ZScsXG4gIGgzOiAnaDMnLFxuICBzdXA6ICdzdXAnLFxuICBzdWI6ICdzdWInLFxufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlU3R5bGVTdHJpbmcgPSAocykgPT4ge1xuICBjb25zdCByZWdleCA9IC8oW1xcdy1dKilcXHMqOlxccyooW147XSopL2c7XG4gIGxldCBtYXRjaDtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKHMpKSkge1xuICAgIHJlc3VsdFttYXRjaFsxXV0gPSBtYXRjaFsyXS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCYXNlNjQgPSAoZmlsZSkgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCk7XG4gICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlYWN0QXR0cmlidXRlcyA9IChvKSA9PiB0b1N0eWxlT2JqZWN0KG8sIHsgY2FtZWxpemU6IHRydWUsIGFkZFVuaXRzOiBmYWxzZSB9KTtcblxuY29uc3QgYXR0cmlidXRlc1RvTWFwID0gKGVsKSA9PiAoYWNjLCBhdHRyaWJ1dGUpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKGF0dHJpYnV0ZSA9PT0gJ3N0eWxlJykge1xuICAgICAgY29uc3Qgc3R5bGVTdHJpbmcgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IHJlYWN0U3R5bGVPYmplY3QgPSByZWFjdEF0dHJpYnV0ZXMocGFyc2VTdHlsZVN0cmluZyhzdHlsZVN0cmluZykpO1xuICAgICAgYWNjWydzdHlsZSddID0gcmVhY3RTdHlsZU9iamVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2F0dHJpYnV0ZV0gPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFjYztcbn07XG5cbmNvbnN0IGF0dHJpYnV0ZXMgPSBbJ2JvcmRlcicsICdjZWxscGFkZGluZycsICdjZWxsc3BhY2luZycsICdjbGFzcycsICdzdHlsZScsICdhbGlnbiddO1xuXG4vKipcbiAqIFNlcmlhbGl6ZXIgcnVsZXMuXG4gKlxuICogQHR5cGUge0FycmF5fVxuICovXG5cbmNvbnN0IGJsb2NrcyA9IHtcbiAgZGVzZXJpYWxpemUoZWwsIG5leHQpIHtcbiAgICBsb2coJ1tibG9ja3M6ZGVzZXJpYWxpemVdIGJsb2NrOiAnLCBlbCk7XG4gICAgY29uc3QgYmxvY2sgPSBCTE9DS19UQUdTW2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFibG9jaykgcmV0dXJuO1xuICAgIGxvZygnW2Jsb2NrczpkZXNlcmlhbGl6ZV0gYmxvY2s6ICcsIGJsb2NrKTtcblxuICAgIGlmIChlbC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgY24gPSBlbC5jaGlsZE5vZGVzWzBdO1xuICAgICAgaWYgKGNuICYmIGNuLnRhZ05hbWUgJiYgY24udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBibG9jaykge1xuICAgICAgICBsb2coJ1t3ZSBoYXZlIGEgY2hpbGQgbm9kZSBvZiB0aGUgc2FtZV0uLi4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICB0eXBlOiBibG9jayxcbiAgICAgIC8qKlxuICAgICAgICogSGVyZSBmb3IgcmVuZGVyaW5nIHN0eWxlcyBmb3IgYWxsIGJsb2NrIGVsZW1lbnRzXG4gICAgICAgKi9cbiAgICAgIGRhdGE6IHsgYXR0cmlidXRlczogYXR0cmlidXRlcy5yZWR1Y2UoYXR0cmlidXRlc1RvTWFwKGVsKSwge30pIH0sXG4gICAgICBub2RlczogbmV4dChlbC5jaGlsZE5vZGVzKSxcbiAgICB9O1xuICB9LFxuICBzZXJpYWxpemU6IChvYmplY3QsIGNoaWxkcmVuKSA9PiB7XG4gICAgaWYgKG9iamVjdC5vYmplY3QgIT09ICdibG9jaycpIHJldHVybjtcblxuICAgIGNvbnN0IGpzb25EYXRhID0gb2JqZWN0LmRhdGEudG9KU09OKCk7XG5cbiAgICBsb2coJ1tibG9ja3M6c2VyaWFsaXplXSBvYmplY3Q6ICcsIG9iamVjdCwgY2hpbGRyZW4pO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGtleSBpbiBCTE9DS19UQUdTKSB7XG4gICAgICBpZiAoQkxPQ0tfVEFHU1trZXldID09PSBvYmplY3QudHlwZSkge1xuICAgICAgICBjb25zdCBUYWcgPSBrZXk7XG5cbiAgICAgICAgcmV0dXJuIDxUYWcgey4uLmpzb25EYXRhLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L1RhZz47XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IElOTElORV9UQUdTID0ge1xuICBzcGFuOiAnc3BhbicsXG59O1xuXG5jb25zdCBpbmxpbmVzID0ge1xuICBkZXNlcmlhbGl6ZShlbCwgbmV4dCkge1xuICAgIGxvZygnW2lubGluZXM6ZGVzZXJpYWxpemVdIGlubGluZTogJywgZWwpO1xuICAgIGNvbnN0IGlubGluZVRhZyA9IElOTElORV9UQUdTW2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFpbmxpbmVUYWcpIHJldHVybjtcbiAgICBsb2coJ1tpbmxpbmVzOmRlc2VyaWFsaXplXSBpbmxpbmU6ICcsIGlubGluZVRhZyk7XG5cbiAgICBpZiAoZWwuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGNuID0gZWwuY2hpbGROb2Rlc1swXTtcbiAgICAgIGlmIChjbiAmJiBjbi50YWdOYW1lICYmIGNuLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gaW5saW5lVGFnKSB7XG4gICAgICAgIGxvZygnW3dlIGhhdmUgYSBjaGlsZCBub2RlIG9mIHRoZSBzYW1lXS4uLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9iamVjdDogJ2lubGluZScsXG4gICAgICB0eXBlOiBpbmxpbmVUYWcsXG4gICAgICAvKipcbiAgICAgICAqIEhlcmUgZm9yIHJlbmRlcmluZyBzdHlsZXMgZm9yIGFsbCBpbmxpbmUgZWxlbWVudHNcbiAgICAgICAqL1xuICAgICAgZGF0YTogeyBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7fSkgfSxcbiAgICAgIG5vZGVzOiBuZXh0KGVsLmNoaWxkTm9kZXMpLFxuICAgIH07XG4gIH0sXG4gIHNlcmlhbGl6ZTogKG9iamVjdCwgY2hpbGRyZW4pID0+IHtcbiAgICBpZiAob2JqZWN0Lm9iamVjdCAhPT0gJ2lubGluZScpIHJldHVybjtcblxuICAgIGNvbnN0IGpzb25EYXRhID0gb2JqZWN0LmRhdGEudG9KU09OKCk7XG5cbiAgICBsb2coJ1tpbmxpbmVzOnNlcmlhbGl6ZV0gb2JqZWN0OiAnLCBvYmplY3QsIGNoaWxkcmVuKTtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChrZXkgaW4gSU5MSU5FX1RBR1MpIHtcbiAgICAgIGlmIChJTkxJTkVfVEFHU1trZXldID09PSBvYmplY3QudHlwZSkge1xuICAgICAgICBjb25zdCBUYWcgPSBrZXk7XG5cbiAgICAgICAgcmV0dXJuIDxUYWcgey4uLmpzb25EYXRhLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L1RhZz47XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGV4dHJhQ1NTUnVsZXNPcHRzID0ge307XG5cbmNvbnN0IFNUWUxFU19NQVAgPSB7XG4gIGgzOiB7XG4gICAgZm9udFNpemU6ICdpbmhlcml0JyxcbiAgICBmb250V2VpZ2h0OiAnaW5oZXJpdCcsXG4gIH0sXG4gIGJsb2NrcXVvdGU6IHtcbiAgICBiYWNrZ3JvdW5kOiAnI2Y5ZjlmOScsXG4gICAgYm9yZGVyTGVmdDogJzVweCBzb2xpZCAjY2NjJyxcbiAgICBtYXJnaW46ICcxLjVlbSAxMHB4JyxcbiAgICBwYWRkaW5nOiAnLjVlbSAxMHB4JyxcbiAgfSxcbn07XG5cbmNvbnN0IHJlYWN0VG9IVE1MQXR0cmlidXRlc01hcCA9IHtcbiAgY2xhc3M6ICdjbGFzc05hbWUnLFxufTtcblxuY29uc3QgbWFya3MgPSB7XG4gIGRlc2VyaWFsaXplKGVsLCBuZXh0KSB7XG4gICAgY29uc3QgbWFyayA9IE1BUktfVEFHU1tlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgIGNvbnN0IGVsQ2xhc3NlcyA9IGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJztcbiAgICBjb25zdCBoYXNDU1NSdWxlID0gKGV4dHJhQ1NTUnVsZXNPcHRzPy5uYW1lcyB8fCBbXSkuZmluZCgobmFtZSkgPT4gZWxDbGFzc2VzPy5pbmNsdWRlcyhuYW1lKSk7XG5cbiAgICBpZiAoIW1hcmsgJiYgIWhhc0NTU1J1bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coJ1tkZXNlcmlhbGl6ZV0gbWFyazogJywgbWFyayk7XG4gICAgY29uc3QgYXR0cnMgPSBhdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7fSk7XG4gICAgY29uc3QgZGF0YSA9IGlzRW1wdHkoYXR0cnMpID8gdW5kZWZpbmVkIDogeyBhdHRyaWJ1dGVzOiBhdHRycyB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9iamVjdDogJ21hcmsnLFxuICAgICAgdHlwZTogaGFzQ1NTUnVsZSA/ICdjc3MnIDogbWFyayxcbiAgICAgIC8qKlxuICAgICAgICogSGVyZSBmb3IgcmVuZGVyaW5nIHN0eWxlcyBmb3IgYWxsIGVsZW1lbnRzXG4gICAgICAgKi9cbiAgICAgIGRhdGEsXG4gICAgICBub2RlczogbmV4dChlbC5jaGlsZE5vZGVzKSxcbiAgICB9O1xuICB9LFxuICBzZXJpYWxpemUob2JqZWN0LCBjaGlsZHJlbikge1xuICAgIGNvbnN0IGpzb25EYXRhID0gb2JqZWN0LmRhdGE/LnRvSlNPTigpIHx8IHt9O1xuICAgIGNvbnN0IGVsQ2xhc3NlcyA9IGpzb25EYXRhLmF0dHJpYnV0ZXM/LmNsYXNzIHx8ICcnO1xuICAgIGNvbnN0IGhhc0NTU1J1bGUgPSAoZXh0cmFDU1NSdWxlc09wdHM/Lm5hbWVzIHx8IFtdKS5maW5kKChuYW1lKSA9PiBlbENsYXNzZXM/LmluY2x1ZGVzKG5hbWUpKTtcblxuICAgIGlmIChoYXNDU1NSdWxlKSB7XG4gICAgICBjb25zdCBodG1sQXR0cnMgPSBPYmplY3Qua2V5cyhqc29uRGF0YS5hdHRyaWJ1dGVzKS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG4gICAgICAgIG9ialtyZWFjdFRvSFRNTEF0dHJpYnV0ZXNNYXBba2V5XSB8fCBrZXldID0ganNvbkRhdGEuYXR0cmlidXRlc1trZXldO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSwge30pO1xuXG4gICAgICByZXR1cm4gPHNwYW4gey4uLmh0bWxBdHRyc30+e2NoaWxkcmVufTwvc3Bhbj47XG4gICAgfVxuXG4gICAgaWYgKE1hcmsuaXNNYXJrKG9iamVjdCkpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBNQVJLX1RBR1MpIHtcbiAgICAgICAgaWYgKE1BUktfVEFHU1trZXldID09PSBvYmplY3QudHlwZSkge1xuICAgICAgICAgIGNvbnN0IFRhZyA9IGtleTtcbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsU3R5bGVzID0gU1RZTEVTX01BUFtUYWddO1xuXG4gICAgICAgICAgaWYgKGFkZGl0aW9uYWxTdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghanNvbkRhdGEuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICBqc29uRGF0YS5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGpzb25EYXRhLmF0dHJpYnV0ZXMuc3R5bGUgPSB7XG4gICAgICAgICAgICAgIC4uLmpzb25EYXRhLmF0dHJpYnV0ZXMuc3R5bGUsXG4gICAgICAgICAgICAgIC4uLmFkZGl0aW9uYWxTdHlsZXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiA8VGFnIHsuLi5qc29uRGF0YS5hdHRyaWJ1dGVzfT57Y2hpbGRyZW59PC9UYWc+O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb25zdCBmaW5kUHJldmlvdXNUZXh0ID0gKGVsKSA9PiB7XG4gIGlmIChlbC5ub2RlTmFtZSA9PT0gJyN0ZXh0Jykge1xuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIGlmIChlbC5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICByZXR1cm4gZmluZFByZXZpb3VzVGV4dChlbC5wcmV2aW91c1NpYmxpbmcpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgVEVYVF9SVUxFID0ge1xuICBkZXNlcmlhbGl6ZShlbCkge1xuICAgIC8qKlxuICAgICAqIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIG9uIHRoZSBkb20gZWxlbWVudCBpbiBvcmRlciB0byBtZXJnZSB0aGUgYWRqYWNlbnQgdGV4dCBub2RlcyB0b2dldGhlclxuICAgICAqICovXG4gICAgZWwubm9ybWFsaXplKCk7XG5cbiAgICBpZiAoZWwudGFnTmFtZSAmJiBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdicicpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9iamVjdDogJ3RleHQnLFxuICAgICAgICBsZWF2ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvYmplY3Q6ICdsZWFmJyxcbiAgICAgICAgICAgIHRleHQ6ICdcXG4nLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gJyN0ZXh0Jykge1xuICAgICAgaWYgKGVsLm5vZGVWYWx1ZSAmJiBlbC5ub2RlVmFsdWUubWF0Y2goLzwhLS0uKj8tLT4vKSkgcmV0dXJuO1xuXG4gICAgICBsb2coJ1t0ZXh0OmRlc2VyaWFsaXplXSByZXR1cm4gdGV4dCBvYmplY3QuLicpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2JqZWN0OiAndGV4dCcsXG4gICAgICAgIGxlYXZlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9iamVjdDogJ2xlYWYnLFxuICAgICAgICAgICAgdGV4dDogZWwubm9kZVZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICBzZXJpYWxpemUob2JqLCBjaGlsZHJlbikge1xuICAgIGlmIChvYmoub2JqZWN0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNwbGl0KCdcXG4nKS5yZWR1Y2UoKGFycmF5LCB0ZXh0LCBpKSA9PiB7XG4gICAgICAgIGlmIChpICE9PSAwKSBhcnJheS5wdXNoKDxiciAvPik7XG4gICAgICAgIGFycmF5LnB1c2godGV4dCk7XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH0sIFtdKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBSVUxFUyA9IFtcbiAgbGlzdFNlcmlhbGl6YXRpb24sXG4gIG1hdGhTZXJpYWxpemF0aW9uLFxuICBtZWRpYVNlcmlhbGl6YXRpb24sXG4gIGltZ1NlcmlhbGl6YXRpb24sXG4gIHRhYmxlU2VyaWFsaXphdGlvbixcbiAgcmVzcG9uc2VBcmVhU2VyaWFsaXphdGlvbixcbiAgVEVYVF9SVUxFLFxuICBpbmxpbmVzLFxuICBibG9ja3MsXG4gIG1hcmtzLFxuXTtcblxuZnVuY3Rpb24gYWxsV2hpdGVzcGFjZShub2RlKSB7XG4gIC8vIFVzZSBFQ01BLTI2MiBFZGl0aW9uIDMgU3RyaW5nIGFuZCBSZWdFeHAgZmVhdHVyZXNcbiAgcmV0dXJuICEvW15cXHRcXG5cXHIgXS8udGVzdChub2RlLnRleHRDb250ZW50KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFBhcnNlSHRtbChodG1sKSB7XG4gIGlmICh0eXBlb2YgRE9NUGFyc2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdUaGUgbmF0aXZlIGBET01QYXJzZXJgIGdsb2JhbCB3aGljaCB0aGUgYEh0bWxgIHNlcmlhbGl6ZXIgdXNlcyBieSBkZWZhdWx0IGlzIG5vdCBwcmVzZW50IGluIHRoaXMgZW52aXJvbm1lbnQuIFlvdSBtdXN0IHN1cHBseSB0aGUgYG9wdGlvbnMucGFyc2VIdG1sYCBmdW5jdGlvbiBpbnN0ZWFkLicsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuXG4gIGNvbnN0IHsgYm9keSB9ID0gcGFyc2VkO1xuICB2YXIgdGV4dE5vZGVzID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihib2R5LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVsbCwgbnVsbCk7XG4gIHZhciBuID0gdGV4dE5vZGVzLm5leHROb2RlKCk7XG5cbiAgd2hpbGUgKG4pIHtcbiAgICBjb25zdCBpc1doaXRlU3BhY2UgPSBhbGxXaGl0ZXNwYWNlKG4pO1xuICAgIGNvbnN0IGlzTm90TmVhck1hcmt1cCA9XG4gICAgICAhTUFSS19UQUdTW24ubmV4dFNpYmxpbmc/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCldICYmICFNQVJLX1RBR1Nbbi5wcmV2aW91c1NpYmxpbmc/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCldO1xuXG4gICAgaWYgKChpc1doaXRlU3BhY2UgJiYgaXNOb3ROZWFyTWFya3VwKSB8fCBuLm5vZGVWYWx1ZSA9PT0gJ1xcdTIwMEInKSB7XG4gICAgICBuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7XG4gICAgfVxuICAgIG4gPSB0ZXh0Tm9kZXMubmV4dE5vZGUoKTtcbiAgfVxuXG4gIHJldHVybiBib2R5O1xufVxuXG4vKiogSWYgdGhpcyBsaWIgaXMgdXNlZCBvbiB0aGUgc2VydmVyIHNpZGUsIHdlIG5lZWQgdG8gYnlwYXNzIHVzaW5nIHRoZSBET01QYXJzZXIgLSBqdXN0IHB1dCBpbiBhIHN0dWIuICovXG5jb25zdCBwYXJzZUh0bWwgPVxuICB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJ1xuICAgID8gKCkgPT4gKHtcbiAgICAgICAgY2hpbGROb2RlczogW10sXG4gICAgICB9KVxuICAgIDogZGVmYXVsdFBhcnNlSHRtbDtcblxuY29uc3Qgc2VyaWFsaXplciA9IG5ldyBIdG1sKHtcbiAgZGVmYXVsdEJsb2NrOiAnZGl2JyxcbiAgcnVsZXM6IFJVTEVTLFxuICBwYXJzZUh0bWwsXG59KTtcblxuY29uc3QgX2V4dGVuZHMgPVxuICBPYmplY3QuYXNzaWduIHx8XG4gIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbi8qKlxuICogVGhpcyBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIGZ1bmN0aW9uIHRoYXQgZXZlbnR1YWxseSBsZWFkc1xuICogdG8gdGhlIG1heCBpdGVyYXRpb24gb2YgMTIsIHdoaWNoIGluIG1vc3QgY2FzZXMgaXQncyBub3QgZW5vdWdoLiBUaGUgbmV3ZXIgdmVyc2lvbnNcbiAqIGhhdmUgYSBkaWZmZXJlbnQgd2F5IHRvIGNhbGN1bGF0ZSB0aGlzLCBidXQgdXBkYXRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIHNsYXRlXG4gKiByZXF1aXJlcyBhIGxvdCBvZiB3b3JrIGZpeGluZyBvdGhlciBpc3N1ZXMuIFNvIHdlIGp1c3QgaW5jcmVhc2UgdGhlIHJ1bGVzIGJ5IDEwMDAsXG4gKiB3aGljaCBtZWFucyBhIGxvdCBvZiBpdGVyYXRpb25zLlxuICogQmVsb3cgaXMgdGhlIGNvZGUgdGhhdCBjYWxjdWxhdGVzIHRoZSBtYXggaXRlcmF0aW9ucy5cbiAqIHZhciBtYXggPSBzY2hlbWEuc3RhY2sucGx1Z2lucy5sZW5ndGggKyBzY2hlbWEucnVsZXMubGVuZ3RoICsgMTtcbiAqL1xuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uIGRlc2VyaWFsaXplKGh0bWwpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIGNvbnN0IF9vcHRpb25zJHRvSlNPTiA9IG9wdGlvbnMudG9KU09OO1xuICBjb25zdCB0b0pTT04gPSBfb3B0aW9ucyR0b0pTT04gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX29wdGlvbnMkdG9KU09OO1xuICBjb25zdCBkZWZhdWx0QmxvY2sgPSB0aGlzLmRlZmF1bHRCbG9jaztcbiAgY29uc3QgcGFyc2VIdG1sID0gdGhpcy5wYXJzZUh0bWw7XG5cbiAgY29uc3QgZnJhZ21lbnQgPSBwYXJzZUh0bWwoaHRtbCk7XG4gIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZE5vZGVzKTtcbiAgbGV0IG5vZGVzID0gdGhpcy5kZXNlcmlhbGl6ZUVsZW1lbnRzKGNoaWxkcmVuKTtcblxuICAvLyBDT01QQVQ6IGVuc3VyZSB0aGF0IGFsbCB0b3AtbGV2ZWwgaW5saW5lIG5vZGVzIGFyZSB3cmFwcGVkIGludG8gYSBibG9jay5cbiAgbm9kZXMgPSBub2Rlcy5yZWR1Y2UoZnVuY3Rpb24obWVtbywgbm9kZSwgaSwgb3JpZ2luYWwpIHtcbiAgICBpZiAobm9kZS5vYmplY3QgPT09ICdibG9jaycpIHtcbiAgICAgIG1lbW8ucHVzaChub2RlKTtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH1cblxuICAgIGlmIChpID4gMCAmJiBvcmlnaW5hbFtpIC0gMV0ub2JqZWN0ICE9PSAnYmxvY2snKSB7XG4gICAgICBjb25zdCBfYmxvY2sgPSBtZW1vW21lbW8ubGVuZ3RoIC0gMV07XG5cbiAgICAgIF9ibG9jay5ub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfVxuXG4gICAgY29uc3QgYmxvY2sgPSBfZXh0ZW5kcyh7IG9iamVjdDogJ2Jsb2NrJywgZGF0YToge30sIGlzVm9pZDogZmFsc2UgfSwgZGVmYXVsdEJsb2NrLCB7XG4gICAgICBub2RlczogW25vZGVdLFxuICAgIH0pO1xuXG4gICAgbWVtby5wdXNoKGJsb2NrKTtcbiAgICByZXR1cm4gbWVtbztcbiAgfSwgW10pO1xuXG4gIGlmIChub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICBub2RlcyA9IFtcbiAgICAgIF9leHRlbmRzKHsgb2JqZWN0OiAnYmxvY2snLCBkYXRhOiB7fSwgaXNWb2lkOiBmYWxzZSB9LCBkZWZhdWx0QmxvY2ssIHtcbiAgICAgICAgbm9kZXM6IFt7IG9iamVjdDogJ3RleHQnLCBsZWF2ZXM6IFt7IG9iamVjdDogJ2xlYWYnLCB0ZXh0OiAnJywgbWFya3M6IFtdIH1dIH1dLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IGpzb24gPSB7XG4gICAgb2JqZWN0OiAndmFsdWUnLFxuICAgIGRvY3VtZW50OiB7XG4gICAgICBvYmplY3Q6ICdkb2N1bWVudCcsXG4gICAgICBkYXRhOiB7fSxcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICB9LFxuICAgIHNjaGVtYToge1xuICAgICAgcnVsZXM6IFtdLFxuICAgIH0sXG4gIH07XG5cbiAgbGV0IGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IDMwMDA7IGkrKykge1xuICAgIGpzb24uc2NoZW1hLnJ1bGVzLnB1c2goe1xuICAgICAgbWF0Y2g6IHsgb2JqZWN0OiAnZG9jdW1lbnQnIH0sXG4gICAgICBub2RlczogW3sgbWF0Y2g6IHsgb2JqZWN0OiAnYmxvY2snIH0gfV0sXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXQgPSB0b0pTT04gPyBqc29uIDogVmFsdWUuZnJvbUpTT04oanNvbik7XG5cbiAgaWYgKHJldCkge1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCByZWR1Y2VNdWx0aXBsZUJycyA9IChtYXJrdXApID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbWFya3VwLnJlcGxhY2UoLyg8YnJcXHMqXFwvPz4pezMsfS9naSwgJzxicj4nKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coXCJDb3VsZG4ndCByZW1vdmUgPGJyLz4gdGFnczogXCIsIGUpO1xuICB9XG5cbiAgcmV0dXJuIG1hcmt1cDtcbn07XG5cbmNvbnN0IHJlZHVjZVJlZHVuZGFudE5ld0xpbmVDaGFyYWN0ZXJzID0gKG1hcmt1cCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBtYXJrdXAucmVwbGFjZSgvXFxuL2dpLCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKFwiQ291bGRuJ3QgcmVtb3ZlIDxici8+IHRhZ3M6IFwiLCBlKTtcbiAgfVxuXG4gIHJldHVybiBtYXJrdXA7XG59O1xuXG4vKipcbiAqIE1ha2VzIHN1cmUgdGhhdCB0aGUgaHRtbCBwcm92aWRlZCByZXNwZWN0cyB0aGUgc2NoZW1hXG4gKiBydWxlcyBmb3IgdGhlIHNsYXRlIGVkaXRvci5cbiAqIEBwYXJhbSBtYXJrdXBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGZpeEh0bWxDb2RlID0gKG1hcmt1cCkgPT4ge1xuICBjb25zdCB3cmFwcGVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICB3cmFwcGVyRWwuaW5uZXJIVE1MID0gbWFya3VwO1xuXG4gIC8qKlxuICAgKiBESVYgZWxlbWVudHMgdGhhdCBhcmUgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgcGFyYWdyYXBoc1xuICAgKiBhcmUgcmVwbGFjZWQgd2l0aCBQIGVsZW1lbnRzIGZvciBub3JtYWxpemluZyBwdXJwb3Nlc1xuICAgKiBAcGFyYW0gY2hpbGRcbiAgICovXG4gIGNvbnN0IGZpeFBhcmFncmFwaHMgPSAoY2hpbGQpID0+IHtcbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXG4gICAgcC5pbm5lckhUTUwgPSBjaGlsZC5pbm5lckhUTUw7XG5cbiAgICBBcnJheS5mcm9tKGNoaWxkLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgIHAuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7XG4gICAgfSk7XG4gICAgY2hpbGQucmVwbGFjZVdpdGgocCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IE1ha2VzIHN1cmUgdGhhdCB0YWJsZXMgYXJlIHBsYWNlZCBpbiB0aGUgcm9vdCBkb2N1bWVudC5cbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgdGFibGVzIGZyb20gdGhlIG5vZGVzIHRoYXQgYXJlXG4gICAqIHBsYWNlZCBpbnNpZGUgdGhlIHJvb3QgZWxlbWVudCBhbmQgcGxhY2VzIHRoZW0gZXhhY3RseSBuZWFyXG4gICAqIHRoZSBwYXJlbnQgZWxlbWVudC5cbiAgICogQHBhcmFtIHRhYmxlQXJyYXlcbiAgICovXG4gIGNvbnN0IGZpeFRhYmxlcyA9ICh0YWJsZUFycmF5KSA9PiB7XG4gICAgdGFibGVBcnJheS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgY29uc3QgeyBpbmRleCwgY2hpbGQsIHBhcmVudCB9ID0gZWw7XG4gICAgICBjb25zdCBub2Rlc0JlZm9yZSA9IFtdO1xuICAgICAgY29uc3Qgbm9kZXNBZnRlciA9IFtdO1xuICAgICAgY29uc3QgYWxsTm9kZXMgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZE5vZGVzKTtcbiAgICAgIGxldCBpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGFsbE5vZGVzW2ldO1xuXG4gICAgICAgIGlmIChpIDwgaW5kZXgpIHtcbiAgICAgICAgICBub2Rlc0JlZm9yZS5wdXNoKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGkgPiBpbmRleCkge1xuICAgICAgICAgIG5vZGVzQWZ0ZXIucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjcmVhdGluZyB0aGUgZWxlbWVudCB0aGF0IGlzIGdvaW5nIHRvIGJlIHBsYWNlZCBpbnN0ZWFkIG9mIHRoZSBwYXJlbnRcbiAgICAgIGNvbnN0IGJlZm9yZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChwYXJlbnQubm9kZU5hbWUpO1xuXG4gICAgICBiZWZvcmVFbC5hcHBlbmQoLi4ubm9kZXNCZWZvcmUpO1xuXG4gICAgICAvLyByZXBsYWNpbmcgcGFyZW50IHdpdGggdGhlIGJlZm9yZUVsZW1lbnRcbiAgICAgIHBhcmVudC5yZXBsYWNlV2l0aChiZWZvcmVFbCk7XG5cbiAgICAgIC8vIGFkZGluZyB0aGUgdGFibGUgcmlnaHQgYWZ0ZXIgdGhlIGJlZm9yZSBlbGVtZW50XG4gICAgICBiZWZvcmVFbC5hZnRlcihjaGlsZCk7XG5cbiAgICAgIC8vIGNyZWF0aW5nIHRoZSBlbGVtZW50IHRoYXQgaXMgZ29pbmcgdG8gYmUgcGxhY2VkIGFmdGVyIHRoZSB0YWJsZVxuICAgICAgY29uc3QgYWZ0ZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50Lm5vZGVOYW1lKTtcblxuICAgICAgYWZ0ZXJFbC5hcHBlbmQoLi4ubm9kZXNBZnRlcik7XG5cbiAgICAgIC8vIGFkZGluZyB0aGUgYWZ0ZXIgZWxlbWVudCBuZWFyIHRoZSB0YWJsZVxuICAgICAgY2hpbGQuYWZ0ZXIoYWZ0ZXJFbCk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgZW1wdHlCbG9ja0NoZWNrID0gKG5vZGUpID0+XG4gICAgKG5vZGUubm9kZU5hbWUgPT09ICdESVYnIHx8IG5vZGUubm9kZU5hbWUgPT09ICdQJyB8fCBub2RlLm5vZGVOYW1lID09PSAnTEknKSAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwO1xuXG4gIGNvbnN0IHBhcnNlTm9kZSA9IChlbCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkQXJyYXkgPSBBcnJheS5mcm9tKGVsLmNoaWxkTm9kZXMpO1xuICAgIGNvbnN0IGhhc1BhcmFncmFwaHMgPSBjaGlsZEFycmF5LmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5ub2RlTmFtZSA9PT0gJ1AnKTtcbiAgICBjb25zdCB0YWJsZXMgPSBbXTtcblxuICAgIGNoaWxkQXJyYXkuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAvLyByZW1vdmluZyBlbXB0eSBibG9ja3NcbiAgICAgIGlmIChlbXB0eUJsb2NrQ2hlY2soY2hpbGQpKSB7XG4gICAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNQYXJhZ3JhcGhzICYmIGNoaWxkLm5vZGVOYW1lID09PSAnRElWJykge1xuICAgICAgICBmaXhQYXJhZ3JhcGhzKGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHdyYXBwZXJFbCAhPT0gZWwgJiYgY2hpbGQubm9kZU5hbWUgPT09ICdUQUJMRScpIHtcbiAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBmaXggdGFibGVzIGluIHRoZSByb290IGVsZW1lbnRcbiAgICAgICAgdGFibGVzLnB1c2goe1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIHBhcmVudDogZWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwYXJzZU5vZGUoY2hpbGQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRhYmxlcy5sZW5ndGgpIHtcbiAgICAgIGZpeFRhYmxlcyh0YWJsZXMpO1xuICAgIH1cbiAgfTtcblxuICBwYXJzZU5vZGUod3JhcHBlckVsKTtcblxuICByZXR1cm4gd3JhcHBlckVsLmlubmVySFRNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdG1sID0gKGh0bWwpID0+IGZpeEh0bWxDb2RlKHJlZHVjZVJlZHVuZGFudE5ld0xpbmVDaGFyYWN0ZXJzKHJlZHVjZU11bHRpcGxlQnJzKGh0bWwpKSk7XG5cbmV4cG9ydCBjb25zdCBodG1sVG9WYWx1ZSA9IChodG1sKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaGFuZGxlSHRtbChodG1sKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKFwiQ291bGRuJ3QgcGFyc2UgaHRtbDogXCIsIGUpO1xuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHZhbHVlVG9IdG1sID0gKHZhbHVlKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSk7XG5cbi8qKlxuICpcbiAqIDxkaXY+PGRpdj5hPC9kaXY+PC9kaXY+IC0+IDxkaXY+YTwvZGl2PlxuICpcbiAqIDxkaXY+PGRpdj5hPC9kaXY+PGRpdj5iPC9kaXY+PC9kaXY+IC0+IDxkaXY+YTwvZGl2PjxkaXY+YjwvZGl2PlxuICogPGRpdj48ZGl2PmE8L2Rpdj40NDQ0PGRpdj5iPC9kaXY+PC9kaXY+IC0+IDxkaXY+YTwvZGl2PjQ0NDQ8ZGl2PmI8L2Rpdj5cbiAqL1xuIl19