yapp 3.0.4 → 4.0.2

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 (75) hide show
  1. package/README.md +7 -7
  2. package/example.js +1415 -1685
  3. package/lib/defaults.js +4 -4
  4. package/lib/example/div/sizeable/left.js +1 -1
  5. package/lib/example/div/sizeable/middle.js +1 -1
  6. package/lib/example/div/sizeable/right.js +1 -1
  7. package/lib/example/div/sizeable/top.js +1 -1
  8. package/lib/example/textarea/bnf.js +1 -1
  9. package/lib/example/textarea/lexicalEntries.js +1 -1
  10. package/lib/example/textarea/parseTree.js +1 -1
  11. package/lib/example/textarea/tokens.js +1 -1
  12. package/lib/example/view/javascript.js +1 -1
  13. package/lib/example/view/json.js +1 -1
  14. package/lib/example/view/xml.js +1 -1
  15. package/lib/example/view.js +23 -42
  16. package/lib/example/yapp.js +5 -3
  17. package/lib/gutter.js +7 -40
  18. package/lib/highlights.js +248 -0
  19. package/lib/lexer/javascript.js +1 -1
  20. package/lib/lexer/json.js +1 -1
  21. package/lib/lexer/plainText.js +1 -1
  22. package/lib/lexer/xml.js +1 -1
  23. package/lib/lineNumbers.js +13 -3
  24. package/lib/mixins/style.js +1 -1
  25. package/lib/parser/javascript.js +2 -2
  26. package/lib/parser/json.js +1 -1
  27. package/lib/parser/plainText.js +1 -1
  28. package/lib/parser/xml.js +1 -1
  29. package/lib/plugin/javascript.js +1 -1
  30. package/lib/plugin/json.js +1 -1
  31. package/lib/plugin/plainText.js +1 -1
  32. package/lib/plugin/xml.js +1 -1
  33. package/lib/plugin.js +1 -1
  34. package/lib/prettyPrinter.js +29 -145
  35. package/lib/processor/javascript.js +1 -1
  36. package/lib/processor/json.js +1 -1
  37. package/lib/processor/plainText.js +1 -1
  38. package/lib/processor/xml.js +1 -1
  39. package/lib/processor.js +1 -1
  40. package/lib/renderYappStyles.js +1 -1
  41. package/lib/richTextarea.js +5 -26
  42. package/lib/styles.js +1 -5
  43. package/lib/syntax.js +77 -19
  44. package/lib/token/significant/argument.js +1 -1
  45. package/lib/token/significant/attribute.js +1 -1
  46. package/lib/token/significant/comment.js +1 -1
  47. package/lib/token/significant/error.js +1 -1
  48. package/lib/token/significant/jsx/attributeName.js +1 -1
  49. package/lib/token/significant/jsx/tagName.js +1 -1
  50. package/lib/token/significant/name.js +1 -1
  51. package/lib/token/significant/string.js +1 -1
  52. package/lib/token/significant/variable.js +1 -1
  53. package/lib/utilities/content.js +1 -1
  54. package/lib/utilities/css.js +1 -1
  55. package/lib/utilities/plugin.js +1 -1
  56. package/lib/utilities/properties.js +1 -1
  57. package/lib/utilities/rules.js +1 -1
  58. package/lib/utilities/scrollbarThickness.js +1 -1
  59. package/lib/utilities/tokens.js +1 -1
  60. package/lib/yapp.js +34 -96
  61. package/package.json +1 -1
  62. package/src/defaults.js +1 -1
  63. package/src/example/view.js +8 -28
  64. package/src/example/yapp.js +3 -2
  65. package/src/gutter.js +9 -41
  66. package/src/highlights.js +70 -0
  67. package/src/lineNumbers.js +13 -2
  68. package/src/parser/javascript.js +1 -1
  69. package/src/prettyPrinter.js +24 -134
  70. package/src/richTextarea.js +4 -28
  71. package/src/styles.js +0 -1
  72. package/src/syntax.js +20 -22
  73. package/src/yapp.js +49 -129
  74. package/lib/element/scrollable.js +0 -338
  75. package/src/element/scrollable.js +0 -166
package/lib/yapp.js CHANGED
@@ -11,7 +11,6 @@ Object.defineProperty(exports, "default", {
11
11
  var _easyWithStyle = /*#__PURE__*/ _interopRequireDefault(require("easy-with-style"));
12
12
  var _easy = require("easy");
13
13
  var _style = /*#__PURE__*/ _interopRequireDefault(require("./mixins/style"));
14
- var _richTextarea = /*#__PURE__*/ _interopRequireDefault(require("./richTextarea"));
15
14
  var _prettyPrinter = /*#__PURE__*/ _interopRequireDefault(require("./prettyPrinter"));
16
15
  var _scrollbarThickness = require("./utilities/scrollbarThickness");
17
16
  var _plugin = require("./utilities/plugin");
@@ -191,7 +190,7 @@ function _createSuper(Derived) {
191
190
  }
192
191
  function _templateObject() {
193
192
  var data = _taggedTemplateLiteral([
194
- "\n\n width: 100%;\n position: relative;\n\n border: 1px solid;\n \n color: ",
193
+ "\n\n width: 100%;\n height: 100%;\n\n border: 1px solid;\n \n color: ",
195
194
  ";\n caret-color: ",
196
195
  ";\n border-color: ",
197
196
  ";\n background-color: ",
@@ -209,6 +208,17 @@ var Yapp = /*#__PURE__*/ function(Element) {
209
208
  _classCallCheck(this, Yapp);
210
209
  var _this;
211
210
  _this = _super.call(this, selector);
211
+ _defineProperty(_assertThisInitialized(_this), "changeHandler", function(event, element) {
212
+ var richTextarea = element, contentChanged = richTextarea.hasContentChanged();
213
+ if (contentChanged) {
214
+ var _properties = _this.properties, _onContentChange = _properties.onContentChange, onContentChange = _onContentChange === void 0 ? null : _onContentChange, contentChangeHandler = onContentChange; ///
215
+ _this.update();
216
+ if (contentChangeHandler) {
217
+ element = _assertThisInitialized(_this); ///
218
+ contentChangeHandler(event, element);
219
+ }
220
+ }
221
+ });
212
222
  _this.plugin = plugin;
213
223
  return _this;
214
224
  }
@@ -226,23 +236,6 @@ var Yapp = /*#__PURE__*/ function(Element) {
226
236
  return content;
227
237
  }
228
238
  },
229
- {
230
- key: "getInnerBounds",
231
- value: function getInnerBounds(gutterWidth) {
232
- var top, left, width = this.getWidth(), height = this.getHeight();
233
- var paddingTop = this.getPaddingTop(), paddingLeft = this.getPaddingLeft(), paddingRight = this.getPaddingRight(), paddingBottom = this.getPaddingBottom(), borderTopWidth = this.getBorderTopWidth(), borderLeftWidth = this.getBorderLeftWidth(), borderRightWidth = this.getBorderRightWidth(), borderBottomWidth = this.getBorderBottomWidth();
234
- top = paddingTop;
235
- left = paddingLeft;
236
- width -= borderLeftWidth + paddingLeft + paddingRight + borderRightWidth;
237
- height -= borderTopWidth + paddingTop + paddingBottom + borderBottomWidth;
238
- if (gutterWidth !== null) {
239
- left += gutterWidth;
240
- width -= gutterWidth;
241
- }
242
- var bounds = _easy.Bounds.fromTopLeftWidthAndHeight(top, left, width, height), innerBounds = bounds; ///
243
- return innerBounds;
244
- }
245
- },
246
239
  {
247
240
  key: "getInitialLineCount",
248
241
  value: function getInitialLineCount() {
@@ -274,71 +267,26 @@ var Yapp = /*#__PURE__*/ function(Element) {
274
267
  this.plugin.setParser(parser);
275
268
  }
276
269
  },
277
- {
278
- key: "changeHandler",
279
- value: function changeHandler(event, element) {
280
- var richTextarea = element, contentChanged = richTextarea.hasContentChanged();
281
- if (contentChanged) {
282
- var onContentChange = this.properties.onContentChange, contentChangeHandler = onContentChange; ///
283
- this.update();
284
- element = this; ///
285
- contentChangeHandler && contentChangeHandler(event, element); ///
286
- }
287
- }
288
- },
289
- {
290
- key: "scrollHandler",
291
- value: function scrollHandler(event, element) {
292
- var richTextarea = element, scrollTop = richTextarea.getScrollTop(), scrollLeft = richTextarea.getScrollLeft();
293
- this.scrollPrettyPrinter(scrollTop, scrollLeft);
294
- }
295
- },
296
270
  {
297
271
  key: "update",
298
272
  value: function update() {
299
273
  var content = this.getContent();
300
274
  this.plugin.update(content);
301
- var tokens = this.plugin.getTokens(), gutterWidth = this.updatePrettyPrinter(tokens);
302
- if (gutterWidth !== null) {
303
- var innerBounds = this.getInnerBounds(gutterWidth), richTextareaBounds = innerBounds; ///
304
- this.setRichTextareaBounds(richTextareaBounds);
305
- }
306
- }
307
- },
308
- {
309
- key: "resize",
310
- value: function resize() {
311
- var innerBounds, gutterWidth;
312
- gutterWidth = null;
313
- innerBounds = this.getInnerBounds(gutterWidth);
314
- var prettyPrinterBounds = innerBounds; ///
315
- this.setPrettyPrinterBounds(prettyPrinterBounds);
316
- gutterWidth = this.resizePrettyPrinter();
317
- innerBounds = this.getInnerBounds(gutterWidth);
318
- var richTextareaBounds = innerBounds; ///
319
- this.setRichTextareaBounds(richTextareaBounds);
320
- }
321
- },
322
- {
323
- key: "render",
324
- value: function render() {
325
- var lineHeight = this.getLineHeight(), paddingTop = this.getPaddingTop(), paddingBottom = this.getPaddingBottom(), borderTopWidth = this.getBorderTopWidth(), initialLineCount = this.getInitialLineCount(), borderBottomWidth = this.getBorderBottomWidth(), scrollbarThickness = this.getScrollbarThickness(), height = borderTopWidth + paddingTop + initialLineCount * lineHeight + paddingBottom + borderBottomWidth + scrollbarThickness;
326
- this.setHeight(height);
327
- this.resize();
328
- this.update();
275
+ var tokens = this.plugin.getTokens();
276
+ this.updatePrettyPrinter(tokens);
329
277
  }
330
278
  },
331
279
  {
332
280
  key: "didMount",
333
281
  value: function didMount() {
334
- var _properties = this.properties, _firaCode = _properties.firaCode, firaCode = _firaCode === void 0 ? _defaults.DEFAULT_FIRA_CODE : _firaCode, _deferRender = _properties.deferRender, deferRender = _deferRender === void 0 ? _defaults.DEFAULT_DEFER_RENDER : _deferRender;
282
+ var _properties = this.properties, _firaCode = _properties.firaCode, firaCode = _firaCode === void 0 ? _defaults.DEFAULT_FIRA_CODE : _firaCode, _autoHeight = _properties.autoHeight, autoHeight = _autoHeight === void 0 ? _defaults.DEFAULT_AUTO_HEIGHT : _autoHeight;
335
283
  if (firaCode) {
336
284
  this.addClass("fira-code");
337
285
  }
338
- if (deferRender) {
339
- return;
286
+ if (autoHeight) {
287
+ var lineHeight = this.getLineHeight(), paddingTop = this.getPaddingTop(), paddingBottom = this.getPaddingBottom(), borderTopWidth = this.getBorderTopWidth(), initialLineCount = this.getInitialLineCount(), borderBottomWidth = this.getBorderBottomWidth(), scrollbarThickness = this.getScrollbarThickness(), height = borderTopWidth + paddingTop + initialLineCount * lineHeight + paddingBottom + borderBottomWidth + scrollbarThickness;
288
+ this.setHeight(height);
340
289
  }
341
- this.render();
342
290
  }
343
291
  },
344
292
  {
@@ -353,34 +301,27 @@ var Yapp = /*#__PURE__*/ function(Element) {
353
301
  {
354
302
  key: "childElements",
355
303
  value: function childElements() {
356
- var _properties = this.properties, _hiddenGutter = _properties.hiddenGutter, hiddenGutter = _hiddenGutter === void 0 ? _defaults.DEFAULT_HIDDEN_GUTTER : _hiddenGutter, _hiddenScrollbars = _properties.hiddenScrollbars, hiddenScrollbars = _hiddenScrollbars === void 0 ? _defaults.DEFAULT_HIDDEN_SCROLLBARS : _hiddenScrollbars, _fancyScrollbars = _properties.fancyScrollbars, fancyScrollbars = _fancyScrollbars === void 0 ? _defaults.DEFAULT_FANCY_SCROLLBARS : _fancyScrollbars, changeHandler = this.changeHandler.bind(this), scrollHandler = this.scrollHandler.bind(this), scrollbarThickness = this.getScrollbarThickness();
357
- return [
358
- /*#__PURE__*/ _easy.React.createElement(_prettyPrinter.default, {
359
- hiddenGutter: hiddenGutter,
360
- scrollbarThickness: scrollbarThickness
361
- }),
362
- /*#__PURE__*/ _easy.React.createElement(_richTextarea.default, {
363
- onChange: changeHandler,
364
- onScroll: scrollHandler,
365
- hiddenScrollbars: hiddenScrollbars,
366
- fancyScrollbars: fancyScrollbars,
367
- active: true
368
- })
369
- ];
304
+ var _properties = this.properties, _hiddenGutter = _properties.hiddenGutter, hiddenGutter = _hiddenGutter === void 0 ? _defaults.DEFAULT_HIDDEN_GUTTER : _hiddenGutter, _hiddenScrollbars = _properties.hiddenScrollbars, hiddenScrollbars = _hiddenScrollbars === void 0 ? _defaults.DEFAULT_HIDDEN_SCROLLBARS : _hiddenScrollbars, _fancyScrollbars = _properties.fancyScrollbars, fancyScrollbars = _fancyScrollbars === void 0 ? _defaults.DEFAULT_FANCY_SCROLLBARS : _fancyScrollbars, scrollbarThickness = this.getScrollbarThickness();
305
+ return /*#__PURE__*/ _easy.React.createElement(_prettyPrinter.default, {
306
+ onChange: this.changeHandler,
307
+ hiddenGutter: hiddenGutter,
308
+ fancyScrollbars: fancyScrollbars,
309
+ hiddenScrollbars: hiddenScrollbars,
310
+ scrollbarThickness: scrollbarThickness
311
+ });
370
312
  }
371
313
  },
372
314
  {
373
315
  key: "parentContext",
374
316
  value: function parentContext() {
375
- var getPlugin = this.getPlugin.bind(this), getContent = this.getContent.bind(this), updateYapp = this.update.bind(this), resizeYapp = this.resize.bind(this), setYappWidth = this.setWidth.bind(this), setYappHeight = this.setHeight.bind(this), setYappLexer = this.setLexer.bind(this), setYappParser = this.setParser.bind(this); ///
317
+ var getPlugin = this.getPlugin.bind(this), getContent = this.getContent.bind(this), updateYapp = this.update.bind(this), setYappLexer = this.setLexer.bind(this), setYappWidth = this.setWidth.bind(this), setYappHeight = this.setHeight.bind(this), setYappParser = this.setParser.bind(this); ///
376
318
  return {
377
319
  getPlugin: getPlugin,
378
320
  getContent: getContent,
379
321
  updateYapp: updateYapp,
380
- resizeYapp: resizeYapp,
322
+ setYappLexer: setYappLexer,
381
323
  setYappWidth: setYappWidth,
382
324
  setYappHeight: setYappHeight,
383
- setYappLexer: setYappLexer,
384
325
  setYappParser: setYappParser
385
326
  };
386
327
  }
@@ -388,16 +329,12 @@ var Yapp = /*#__PURE__*/ function(Element) {
388
329
  {
389
330
  key: "initialise",
390
331
  value: function initialise() {
391
- var _this = this;
392
332
  this.assignContext();
393
- var _properties = this.properties, childElements = _properties.childElements, _editable = _properties.editable, editable = _editable === void 0 ? _defaults.DEFAULT_EDITABLE : _editable, language = this.plugin.getLanguage(), content = (0, _content.contentFromChildElements)(childElements), readOnly = !editable, scrollTop = 0, scrollLeft = 0; ///
333
+ var _properties = this.properties, childElements = _properties.childElements, _editable = _properties.editable, editable = _editable === void 0 ? _defaults.DEFAULT_EDITABLE : _editable, language = this.plugin.getLanguage(), content = (0, _content.contentFromChildElements)(childElements), readOnly = !editable;
394
334
  this.setLanguage(language);
395
- this.scrollPrettyPrinter(scrollTop, scrollLeft);
396
335
  this.setRichTextareaContent(content);
397
336
  this.setRichTextareaReadOnly(readOnly);
398
- this.onResize(function(event, element) {
399
- return _this.resize();
400
- });
337
+ this.update();
401
338
  }
402
339
  }
403
340
  ], [
@@ -427,12 +364,13 @@ _defineProperty(Yapp, "ignoredProperties", [
427
364
  "language",
428
365
  "firaCode",
429
366
  "editable",
430
- "deferRender",
367
+ "autoHeight",
431
368
  "hiddenGutter",
432
369
  "noScrollbars",
433
- "fancyScrollbars"
370
+ "fancyScrollbars",
371
+ "onContentChange"
434
372
  ]);
435
373
  Object.assign(Yapp.prototype, _style.default);
436
374
  var _default = (0, _easyWithStyle.default)(Yapp)(_templateObject(), _colour.colour, _colour.caretColour, _colour.borderColour, _colour.backgroundColour);
437
375
 
438
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy95YXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgd2l0aFN0eWxlIGZyb20gXCJlYXN5LXdpdGgtc3R5bGVcIjsgIC8vL1xuXG5pbXBvcnQgeyBSZWFjdCwgQm91bmRzLCBFbGVtZW50IH0gZnJvbSBcImVhc3lcIjtcblxuaW1wb3J0IHN0eWxlTWl4aW5zIGZyb20gXCIuL21peGlucy9zdHlsZVwiO1xuaW1wb3J0IFJpY2hUZXh0YXJlYSBmcm9tIFwiLi9yaWNoVGV4dGFyZWFcIjtcbmltcG9ydCBQcmV0dHlQcmludGVyIGZyb20gXCIuL3ByZXR0eVByaW50ZXJcIjtcblxuaW1wb3J0IHsgZ2V0U2Nyb2xsYmFyVGhpY2tuZXNzIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3Njcm9sbGJhclRoaWNrbmVzc1wiO1xuaW1wb3J0IHsgcGx1Z2luRnJvbUxhbmd1YWdlQW5kUGx1Z2luIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3BsdWdpblwiO1xuaW1wb3J0IHsgcHJvcGVydGllc0Zyb21Db250ZW50TGFuZ3VhZ2VQbHVnaW5BbmRPcHRpb25zIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3Byb3BlcnRpZXNcIjtcbmltcG9ydCB7IGxpbmVDb3VudEZyb21Db250ZW50LCBjb250ZW50RnJvbUNoaWxkRWxlbWVudHMgfSBmcm9tIFwiLi91dGlsaXRpZXMvY29udGVudFwiO1xuaW1wb3J0IHsgY29sb3VyLCBjYXJldENvbG91ciwgYm9yZGVyQ29sb3VyLCBiYWNrZ3JvdW5kQ29sb3VyIH0gZnJvbSBcIi4vc2NoZW1lL2NvbG91clwiO1xuaW1wb3J0IHsgREVGQVVMVF9FRElUQUJMRSwgREVGQVVMVF9GSVJBX0NPREUsIERFRkFVTFRfREVGRVJfUkVOREVSLCBERUZBVUxUX0hJRERFTl9HVVRURVIsIERFRkFVTFRfSElEREVOX1NDUk9MTEJBUlMsIERFRkFVTFRfRkFOQ1lfU0NST0xMQkFSUyB9IGZyb20gXCIuL2RlZmF1bHRzXCI7XG5cbmNsYXNzIFlhcHAgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3Ioc2VsZWN0b3IsIHBsdWdpbikge1xuICAgIHN1cGVyKHNlbGVjdG9yKTtcblxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgZ2V0UGx1Z2luKCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbjtcbiAgfVxuXG4gIGdldENvbnRlbnQoKSB7XG4gICAgY29uc3QgcmljaFRleHRhcmVhQ29udGVudCA9IHRoaXMuZ2V0UmljaFRleHRhcmVhQ29udGVudCgpLFxuICAgICAgICAgIGNvbnRlbnQgPSByaWNoVGV4dGFyZWFDb250ZW50OyAgLy8vXG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIGdldElubmVyQm91bmRzKGd1dHRlcldpZHRoKSB7XG4gICAgbGV0IHRvcCxcbiAgICAgICAgbGVmdCxcbiAgICAgICAgd2lkdGggPSB0aGlzLmdldFdpZHRoKCksXG4gICAgICAgIGhlaWdodCA9IHRoaXMuZ2V0SGVpZ2h0KCk7XG5cbiAgICBjb25zdCBwYWRkaW5nVG9wID0gdGhpcy5nZXRQYWRkaW5nVG9wKCksXG4gICAgICAgICAgcGFkZGluZ0xlZnQgPSB0aGlzLmdldFBhZGRpbmdMZWZ0KCksXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0ID0gdGhpcy5nZXRQYWRkaW5nUmlnaHQoKSxcbiAgICAgICAgICBwYWRkaW5nQm90dG9tID0gdGhpcy5nZXRQYWRkaW5nQm90dG9tKCksXG4gICAgICAgICAgYm9yZGVyVG9wV2lkdGggPSB0aGlzLmdldEJvcmRlclRvcFdpZHRoKCksXG4gICAgICAgICAgYm9yZGVyTGVmdFdpZHRoID0gdGhpcy5nZXRCb3JkZXJMZWZ0V2lkdGgoKSxcbiAgICAgICAgICBib3JkZXJSaWdodFdpZHRoID0gdGhpcy5nZXRCb3JkZXJSaWdodFdpZHRoKCksXG4gICAgICAgICAgYm9yZGVyQm90dG9tV2lkdGggPSB0aGlzLmdldEJvcmRlckJvdHRvbVdpZHRoKCk7XG5cbiAgICB0b3AgPSBwYWRkaW5nVG9wO1xuICAgIGxlZnQgPSBwYWRkaW5nTGVmdDtcblxuICAgIHdpZHRoIC09ICggYm9yZGVyTGVmdFdpZHRoICsgcGFkZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodFdpZHRoICk7XG4gICAgaGVpZ2h0IC09ICggYm9yZGVyVG9wV2lkdGggKyBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbVdpZHRoICk7XG5cbiAgICBpZiAoZ3V0dGVyV2lkdGggIT09IG51bGwpIHtcbiAgICAgIGxlZnQgKz0gZ3V0dGVyV2lkdGg7XG4gICAgICB3aWR0aCAtPSBndXR0ZXJXaWR0aDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZHMgPSBCb3VuZHMuZnJvbVRvcExlZnRXaWR0aEFuZEhlaWdodCh0b3AsIGxlZnQsIHdpZHRoLCBoZWlnaHQpLFxuICAgICAgICAgIGlubmVyQm91bmRzID0gYm91bmRzOyAvLy9cblxuICAgIHJldHVybiBpbm5lckJvdW5kcztcbiAgfVxuXG4gIGdldEluaXRpYWxMaW5lQ291bnQoKSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCgpLFxuICAgICAgICAgIGxpbmVDb3VudCA9IGxpbmVDb3VudEZyb21Db250ZW50KGNvbnRlbnQpLFxuICAgICAgICAgIGluaXRpYWxMaW5lQ291bnQgPSBsaW5lQ291bnQ7IC8vL1xuXG4gICAgcmV0dXJuIGluaXRpYWxMaW5lQ291bnQ7XG4gIH1cblxuICBnZXRTY3JvbGxiYXJUaGlja25lc3MoKSB7XG4gICAgbGV0IHNjcm9sbGJhclRoaWNrbmVzcyA9IDA7XG5cbiAgICBjb25zdCB7IGhpZGRlblNjcm9sbGJhcnMgPSBERUZBVUxUX0hJRERFTl9TQ1JPTExCQVJTIH0gPSB0aGlzLnByb3BlcnRpZXM7XG5cbiAgICBpZiAoIWhpZGRlblNjcm9sbGJhcnMpIHtcbiAgICAgIGNvbnN0IHsgZmFuY3lTY3JvbGxiYXJzID0gREVGQVVMVF9GQU5DWV9TQ1JPTExCQVJTIH0gPSB0aGlzLnByb3BlcnRpZXM7XG5cbiAgICAgIHNjcm9sbGJhclRoaWNrbmVzcyA9IGdldFNjcm9sbGJhclRoaWNrbmVzcyhmYW5jeVNjcm9sbGJhcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBzY3JvbGxiYXJUaGlja25lc3M7XG4gIH1cblxuICBzZXRMZXhlcihsZXhlcikgeyB0aGlzLnBsdWdpbi5zZXRMZXhlcihsZXhlcik7IH1cblxuICBzZXRQYXJzZXIocGFyc2VyKSB7IHRoaXMucGx1Z2luLnNldFBhcnNlcihwYXJzZXIpOyB9XG5cbiAgY2hhbmdlSGFuZGxlcihldmVudCwgZWxlbWVudCkge1xuICAgIGNvbnN0IHJpY2hUZXh0YXJlYSA9IGVsZW1lbnQsIC8vL1xuICAgICAgICAgIGNvbnRlbnRDaGFuZ2VkID0gcmljaFRleHRhcmVhLmhhc0NvbnRlbnRDaGFuZ2VkKCk7XG5cbiAgICBpZiAoY29udGVudENoYW5nZWQpIHtcbiAgICAgIGNvbnN0IHsgb25Db250ZW50Q2hhbmdlIH0gPSB0aGlzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBjb250ZW50Q2hhbmdlSGFuZGxlciA9IG9uQ29udGVudENoYW5nZTsgLy8vXG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAgIGVsZW1lbnQgPSB0aGlzOyAvLy9cblxuICAgICAgY29udGVudENoYW5nZUhhbmRsZXIgJiYgY29udGVudENoYW5nZUhhbmRsZXIoZXZlbnQsIGVsZW1lbnQpOyAvLy9cbiAgICB9XG4gIH1cblxuICBzY3JvbGxIYW5kbGVyKGV2ZW50LCBlbGVtZW50KSB7XG4gICAgY29uc3QgcmljaFRleHRhcmVhID0gZWxlbWVudCwgLy8vXG4gICAgICAgICAgc2Nyb2xsVG9wID0gcmljaFRleHRhcmVhLmdldFNjcm9sbFRvcCgpLFxuICAgICAgICAgIHNjcm9sbExlZnQgPSByaWNoVGV4dGFyZWEuZ2V0U2Nyb2xsTGVmdCgpO1xuXG4gICAgdGhpcy5zY3JvbGxQcmV0dHlQcmludGVyKHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCk7XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCgpO1xuXG4gICAgdGhpcy5wbHVnaW4udXBkYXRlKGNvbnRlbnQpO1xuXG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy5wbHVnaW4uZ2V0VG9rZW5zKCksXG4gICAgICAgICAgZ3V0dGVyV2lkdGggPSB0aGlzLnVwZGF0ZVByZXR0eVByaW50ZXIodG9rZW5zKTtcblxuICAgIGlmIChndXR0ZXJXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgaW5uZXJCb3VuZHMgPSB0aGlzLmdldElubmVyQm91bmRzKGd1dHRlcldpZHRoKSxcbiAgICAgICAgICAgIHJpY2hUZXh0YXJlYUJvdW5kcyA9IGlubmVyQm91bmRzOyAvLy9cblxuICAgICAgdGhpcy5zZXRSaWNoVGV4dGFyZWFCb3VuZHMocmljaFRleHRhcmVhQm91bmRzKTtcbiAgICB9XG4gIH1cblxuICByZXNpemUoKSB7XG4gICAgbGV0IGlubmVyQm91bmRzLFxuICAgICAgICBndXR0ZXJXaWR0aDtcblxuICAgIGd1dHRlcldpZHRoID0gbnVsbDtcblxuICAgIGlubmVyQm91bmRzID0gdGhpcy5nZXRJbm5lckJvdW5kcyhndXR0ZXJXaWR0aCk7XG5cbiAgICBjb25zdCBwcmV0dHlQcmludGVyQm91bmRzID0gaW5uZXJCb3VuZHM7ICAvLy9cblxuICAgIHRoaXMuc2V0UHJldHR5UHJpbnRlckJvdW5kcyhwcmV0dHlQcmludGVyQm91bmRzKTtcblxuICAgIGd1dHRlcldpZHRoID0gdGhpcy5yZXNpemVQcmV0dHlQcmludGVyKCk7XG5cbiAgICBpbm5lckJvdW5kcyA9IHRoaXMuZ2V0SW5uZXJCb3VuZHMoZ3V0dGVyV2lkdGgpO1xuXG4gICAgY29uc3QgcmljaFRleHRhcmVhQm91bmRzID0gaW5uZXJCb3VuZHM7IC8vL1xuXG4gICAgdGhpcy5zZXRSaWNoVGV4dGFyZWFCb3VuZHMocmljaFRleHRhcmVhQm91bmRzKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdGhpcy5nZXRMaW5lSGVpZ2h0KCksXG4gICAgICAgICAgcGFkZGluZ1RvcCA9IHRoaXMuZ2V0UGFkZGluZ1RvcCgpLFxuICAgICAgICAgIHBhZGRpbmdCb3R0b20gPSB0aGlzLmdldFBhZGRpbmdCb3R0b20oKSxcbiAgICAgICAgICBib3JkZXJUb3BXaWR0aCA9IHRoaXMuZ2V0Qm9yZGVyVG9wV2lkdGgoKSxcbiAgICAgICAgICBpbml0aWFsTGluZUNvdW50ID0gdGhpcy5nZXRJbml0aWFsTGluZUNvdW50KCksXG4gICAgICAgICAgYm9yZGVyQm90dG9tV2lkdGggPSB0aGlzLmdldEJvcmRlckJvdHRvbVdpZHRoKCksXG4gICAgICAgICAgc2Nyb2xsYmFyVGhpY2tuZXNzID0gdGhpcy5nZXRTY3JvbGxiYXJUaGlja25lc3MoKSxcbiAgICAgICAgICBoZWlnaHQgPSBib3JkZXJUb3BXaWR0aCArIHBhZGRpbmdUb3AgKyBpbml0aWFsTGluZUNvdW50ICogbGluZUhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b21XaWR0aCArIHNjcm9sbGJhclRoaWNrbmVzcztcblxuICAgIHRoaXMuc2V0SGVpZ2h0KGhlaWdodCk7XG5cbiAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIGRpZE1vdW50KCkge1xuICAgIGNvbnN0IHsgZmlyYUNvZGUgPSBERUZBVUxUX0ZJUkFfQ09ERSwgZGVmZXJSZW5kZXIgPSBERUZBVUxUX0RFRkVSX1JFTkRFUiB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuXG4gICAgaWYgKGZpcmFDb2RlKSB7XG4gICAgICB0aGlzLmFkZENsYXNzKFwiZmlyYS1jb2RlXCIpO1xuICAgIH1cblxuICAgIGlmIChkZWZlclJlbmRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICB3aWxsVW5tb3VudCgpIHtcbiAgICBjb25zdCB7IGZpcmFDb2RlID0gREVGQVVMVF9GSVJBX0NPREUgfSA9IHRoaXMucHJvcGVydGllcztcblxuICAgIGlmIChmaXJhQ29kZSkge1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcyhcImZpcmEtY29kZVwiKTtcbiAgICB9XG4gIH1cblxuICBjaGlsZEVsZW1lbnRzKCkge1xuICAgIGNvbnN0IHsgaGlkZGVuR3V0dGVyID0gREVGQVVMVF9ISURERU5fR1VUVEVSLCBoaWRkZW5TY3JvbGxiYXJzID0gREVGQVVMVF9ISURERU5fU0NST0xMQkFSUywgZmFuY3lTY3JvbGxiYXJzID0gREVGQVVMVF9GQU5DWV9TQ1JPTExCQVJTIH0gPSB0aGlzLnByb3BlcnRpZXMsXG4gICAgICAgICAgY2hhbmdlSGFuZGxlciA9IHRoaXMuY2hhbmdlSGFuZGxlci5iaW5kKHRoaXMpLFxuICAgICAgICAgIHNjcm9sbEhhbmRsZXIgPSB0aGlzLnNjcm9sbEhhbmRsZXIuYmluZCh0aGlzKSxcbiAgICAgICAgICBzY3JvbGxiYXJUaGlja25lc3MgPSB0aGlzLmdldFNjcm9sbGJhclRoaWNrbmVzcygpO1xuXG4gICAgcmV0dXJuIChbXG5cbiAgICAgIDxQcmV0dHlQcmludGVyIGhpZGRlbkd1dHRlcj17aGlkZGVuR3V0dGVyfSBzY3JvbGxiYXJUaGlja25lc3M9e3Njcm9sbGJhclRoaWNrbmVzc30gLz4sXG4gICAgICA8UmljaFRleHRhcmVhIG9uQ2hhbmdlPXtjaGFuZ2VIYW5kbGVyfSBvblNjcm9sbD17c2Nyb2xsSGFuZGxlcn0gaGlkZGVuU2Nyb2xsYmFycz17aGlkZGVuU2Nyb2xsYmFyc30gZmFuY3lTY3JvbGxiYXJzPXtmYW5jeVNjcm9sbGJhcnN9IGFjdGl2ZSAvPlxuXG4gICAgXSk7XG4gIH1cblxuICBwYXJlbnRDb250ZXh0KCkge1xuICAgIGNvbnN0IGdldFBsdWdpbiA9IHRoaXMuZ2V0UGx1Z2luLmJpbmQodGhpcyksXG4gICAgICAgICAgZ2V0Q29udGVudCA9IHRoaXMuZ2V0Q29udGVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHVwZGF0ZVlhcHAgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpLCAgLy8vXG4gICAgICAgICAgcmVzaXplWWFwcCA9IHRoaXMucmVzaXplLmJpbmQodGhpcyksICAvLy9cbiAgICAgICAgICBzZXRZYXBwV2lkdGggPSB0aGlzLnNldFdpZHRoLmJpbmQodGhpcyksICAvLy9cbiAgICAgICAgICBzZXRZYXBwSGVpZ2h0ID0gdGhpcy5zZXRIZWlnaHQuYmluZCh0aGlzKSwgIC8vL1xuICAgICAgICAgIHNldFlhcHBMZXhlciA9IHRoaXMuc2V0TGV4ZXIuYmluZCh0aGlzKSwgIC8vL1xuICAgICAgICAgIHNldFlhcHBQYXJzZXIgPSB0aGlzLnNldFBhcnNlci5iaW5kKHRoaXMpOyAgLy8vXG5cbiAgICByZXR1cm4gKHtcbiAgICAgIGdldFBsdWdpbixcbiAgICAgIGdldENvbnRlbnQsXG4gICAgICB1cGRhdGVZYXBwLFxuICAgICAgcmVzaXplWWFwcCxcbiAgICAgIHNldFlhcHBXaWR0aCxcbiAgICAgIHNldFlhcHBIZWlnaHQsXG4gICAgICBzZXRZYXBwTGV4ZXIsXG4gICAgICBzZXRZYXBwUGFyc2VyXG4gICAgfSk7XG4gIH1cblxuICBpbml0aWFsaXNlKCkge1xuICAgIHRoaXMuYXNzaWduQ29udGV4dCgpO1xuXG4gICAgY29uc3QgeyBjaGlsZEVsZW1lbnRzLCBlZGl0YWJsZSA9IERFRkFVTFRfRURJVEFCTEUgfSA9IHRoaXMucHJvcGVydGllcyxcbiAgICAgICAgICBsYW5ndWFnZSA9IHRoaXMucGx1Z2luLmdldExhbmd1YWdlKCksXG4gICAgICAgICAgY29udGVudCA9IGNvbnRlbnRGcm9tQ2hpbGRFbGVtZW50cyhjaGlsZEVsZW1lbnRzKSxcbiAgICAgICAgICByZWFkT25seSA9ICFlZGl0YWJsZSxcbiAgICAgICAgICBzY3JvbGxUb3AgPSAwLCAgLy8vXG4gICAgICAgICAgc2Nyb2xsTGVmdCA9IDA7IC8vL1xuXG4gICAgdGhpcy5zZXRMYW5ndWFnZShsYW5ndWFnZSk7XG5cbiAgICB0aGlzLnNjcm9sbFByZXR0eVByaW50ZXIoc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0KTtcblxuICAgIHRoaXMuc2V0UmljaFRleHRhcmVhQ29udGVudChjb250ZW50KTtcblxuICAgIHRoaXMuc2V0UmljaFRleHRhcmVhUmVhZE9ubHkocmVhZE9ubHkpO1xuXG4gICAgdGhpcy5vblJlc2l6ZSgoZXZlbnQsIGVsZW1lbnQpID0+IHRoaXMucmVzaXplKCkpO1xuICB9XG5cbiAgc3RhdGljIHRhZ05hbWUgPSBcImRpdlwiO1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcGVydGllcyA9IHtcbiAgICBjbGFzc05hbWU6IFwieWFwcFwiXG4gIH07XG5cbiAgc3RhdGljIGlnbm9yZWRQcm9wZXJ0aWVzID0gW1xuICAgIFwiUGx1Z2luXCIsXG4gICAgXCJsYW5ndWFnZVwiLFxuICAgIFwiZmlyYUNvZGVcIixcbiAgICBcImVkaXRhYmxlXCIsXG4gICAgXCJkZWZlclJlbmRlclwiLFxuICAgIFwiaGlkZGVuR3V0dGVyXCIsXG4gICAgXCJub1Njcm9sbGJhcnNcIixcbiAgICBcImZhbmN5U2Nyb2xsYmFyc1wiXG4gIF07XG5cbiAgc3RhdGljIGZyb21Db250ZW50KGNvbnRlbnQsIGxhbmd1YWdlLCBQbHVnaW4sIG9wdGlvbnMpIHtcbiAgICBjb25zdCBDbGFzcyA9IFlhcHAsXG4gICAgICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXNGcm9tQ29udGVudExhbmd1YWdlUGx1Z2luQW5kT3B0aW9ucyhjb250ZW50LCBsYW5ndWFnZSwgUGx1Z2luLCBvcHRpb25zKSxcbiAgICAgICAgICBwbHVnaW4gPSBwbHVnaW5Gcm9tTGFuZ3VhZ2VBbmRQbHVnaW4obGFuZ3VhZ2UsIFBsdWdpbiksXG4gICAgICAgICAgeWFwcCA9IEVsZW1lbnQuZnJvbUNsYXNzKENsYXNzLCBwcm9wZXJ0aWVzLCBwbHVnaW4pO1xuXG4gICAgcmV0dXJuIHlhcHA7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNsYXNzKENsYXNzLCBwcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgeyBsYW5ndWFnZSwgUGx1Z2luIH0gPSBwcm9wZXJ0aWVzLFxuICAgICAgICAgIHBsdWdpbiA9IHBsdWdpbkZyb21MYW5ndWFnZUFuZFBsdWdpbihsYW5ndWFnZSwgUGx1Z2luKSxcbiAgICAgICAgICB5YXBwID0gRWxlbWVudC5mcm9tQ2xhc3MoQ2xhc3MsIHByb3BlcnRpZXMsIHBsdWdpbik7XG5cbiAgICByZXR1cm4geWFwcDtcbiAgfVxufVxuXG5PYmplY3QuYXNzaWduKFlhcHAucHJvdG90eXBlLCBzdHlsZU1peGlucyk7XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZShZYXBwKWBcblxuICB3aWR0aDogMTAwJTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIGJvcmRlcjogMXB4IHNvbGlkO1xuICBcbiAgY29sb3I6ICR7Y29sb3VyfTtcbiAgY2FyZXQtY29sb3I6ICR7Y2FyZXRDb2xvdXJ9O1xuICBib3JkZXItY29sb3I6ICR7Ym9yZGVyQ29sb3VyfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtiYWNrZ3JvdW5kQ29sb3VyfTtcblxuICBmb250LXNpemU6IDEzcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBmb250LWZhbWlseTogXCJNZW5sb1wiLCBcIkx1Y2lkYSBTYW5zIFR5cGV3cml0ZXJcIiwgbW9ub3NwYWNlO1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6IG5vcm1hbDtcblxuICAuZmlyYS1jb2RlIHtcblxuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICBmb250LWZhbWlseTogXCJGaXJhIENvZGVcIjtcbiAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuICAgIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogXCJjYWx0XCIgMTtcbiAgICBcbiAgfVxuXG5gO1xuIl0sIm5hbWVzIjpbIllhcHAiLCJzZWxlY3RvciIsInBsdWdpbiIsImdldFBsdWdpbiIsImdldENvbnRlbnQiLCJyaWNoVGV4dGFyZWFDb250ZW50IiwiZ2V0UmljaFRleHRhcmVhQ29udGVudCIsImNvbnRlbnQiLCJnZXRJbm5lckJvdW5kcyIsImd1dHRlcldpZHRoIiwidG9wIiwibGVmdCIsIndpZHRoIiwiZ2V0V2lkdGgiLCJoZWlnaHQiLCJnZXRIZWlnaHQiLCJwYWRkaW5nVG9wIiwiZ2V0UGFkZGluZ1RvcCIsInBhZGRpbmdMZWZ0IiwiZ2V0UGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiLCJnZXRQYWRkaW5nUmlnaHQiLCJwYWRkaW5nQm90dG9tIiwiZ2V0UGFkZGluZ0JvdHRvbSIsImJvcmRlclRvcFdpZHRoIiwiZ2V0Qm9yZGVyVG9wV2lkdGgiLCJib3JkZXJMZWZ0V2lkdGgiLCJnZXRCb3JkZXJMZWZ0V2lkdGgiLCJib3JkZXJSaWdodFdpZHRoIiwiZ2V0Qm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiZ2V0Qm9yZGVyQm90dG9tV2lkdGgiLCJib3VuZHMiLCJCb3VuZHMiLCJmcm9tVG9wTGVmdFdpZHRoQW5kSGVpZ2h0IiwiaW5uZXJCb3VuZHMiLCJnZXRJbml0aWFsTGluZUNvdW50IiwibGluZUNvdW50IiwibGluZUNvdW50RnJvbUNvbnRlbnQiLCJpbml0aWFsTGluZUNvdW50IiwiZ2V0U2Nyb2xsYmFyVGhpY2tuZXNzIiwic2Nyb2xsYmFyVGhpY2tuZXNzIiwicHJvcGVydGllcyIsImhpZGRlblNjcm9sbGJhcnMiLCJERUZBVUxUX0hJRERFTl9TQ1JPTExCQVJTIiwiZmFuY3lTY3JvbGxiYXJzIiwiREVGQVVMVF9GQU5DWV9TQ1JPTExCQVJTIiwic2V0TGV4ZXIiLCJsZXhlciIsInNldFBhcnNlciIsInBhcnNlciIsImNoYW5nZUhhbmRsZXIiLCJldmVudCIsImVsZW1lbnQiLCJyaWNoVGV4dGFyZWEiLCJjb250ZW50Q2hhbmdlZCIsImhhc0NvbnRlbnRDaGFuZ2VkIiwib25Db250ZW50Q2hhbmdlIiwiY29udGVudENoYW5nZUhhbmRsZXIiLCJ1cGRhdGUiLCJzY3JvbGxIYW5kbGVyIiwic2Nyb2xsVG9wIiwiZ2V0U2Nyb2xsVG9wIiwic2Nyb2xsTGVmdCIsImdldFNjcm9sbExlZnQiLCJzY3JvbGxQcmV0dHlQcmludGVyIiwidG9rZW5zIiwiZ2V0VG9rZW5zIiwidXBkYXRlUHJldHR5UHJpbnRlciIsInJpY2hUZXh0YXJlYUJvdW5kcyIsInNldFJpY2hUZXh0YXJlYUJvdW5kcyIsInJlc2l6ZSIsInByZXR0eVByaW50ZXJCb3VuZHMiLCJzZXRQcmV0dHlQcmludGVyQm91bmRzIiwicmVzaXplUHJldHR5UHJpbnRlciIsInJlbmRlciIsImxpbmVIZWlnaHQiLCJnZXRMaW5lSGVpZ2h0Iiwic2V0SGVpZ2h0IiwiZGlkTW91bnQiLCJmaXJhQ29kZSIsIkRFRkFVTFRfRklSQV9DT0RFIiwiZGVmZXJSZW5kZXIiLCJERUZBVUxUX0RFRkVSX1JFTkRFUiIsImFkZENsYXNzIiwid2lsbFVubW91bnQiLCJyZW1vdmVDbGFzcyIsImNoaWxkRWxlbWVudHMiLCJoaWRkZW5HdXR0ZXIiLCJERUZBVUxUX0hJRERFTl9HVVRURVIiLCJiaW5kIiwiUHJldHR5UHJpbnRlciIsIlJpY2hUZXh0YXJlYSIsIm9uQ2hhbmdlIiwib25TY3JvbGwiLCJhY3RpdmUiLCJwYXJlbnRDb250ZXh0IiwidXBkYXRlWWFwcCIsInJlc2l6ZVlhcHAiLCJzZXRZYXBwV2lkdGgiLCJzZXRXaWR0aCIsInNldFlhcHBIZWlnaHQiLCJzZXRZYXBwTGV4ZXIiLCJzZXRZYXBwUGFyc2VyIiwiaW5pdGlhbGlzZSIsImFzc2lnbkNvbnRleHQiLCJlZGl0YWJsZSIsIkRFRkFVTFRfRURJVEFCTEUiLCJsYW5ndWFnZSIsImdldExhbmd1YWdlIiwiY29udGVudEZyb21DaGlsZEVsZW1lbnRzIiwicmVhZE9ubHkiLCJzZXRMYW5ndWFnZSIsInNldFJpY2hUZXh0YXJlYUNvbnRlbnQiLCJzZXRSaWNoVGV4dGFyZWFSZWFkT25seSIsIm9uUmVzaXplIiwiZnJvbUNvbnRlbnQiLCJQbHVnaW4iLCJvcHRpb25zIiwiQ2xhc3MiLCJwcm9wZXJ0aWVzRnJvbUNvbnRlbnRMYW5ndWFnZVBsdWdpbkFuZE9wdGlvbnMiLCJwbHVnaW5Gcm9tTGFuZ3VhZ2VBbmRQbHVnaW4iLCJ5YXBwIiwiRWxlbWVudCIsImZyb21DbGFzcyIsInRhZ05hbWUiLCJkZWZhdWx0UHJvcGVydGllcyIsImNsYXNzTmFtZSIsImlnbm9yZWRQcm9wZXJ0aWVzIiwiT2JqZWN0IiwiYXNzaWduIiwicHJvdG90eXBlIiwic3R5bGVNaXhpbnMiLCJ3aXRoU3R5bGUiLCJjb2xvdXIiLCJjYXJldENvbG91ciIsImJvcmRlckNvbG91ciIsImJhY2tncm91bmRDb2xvdXIiXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7OzsrQkErUmIsU0E0QkU7OztlQTVCRixRQTRCRTs7O2tFQXpUb0IsaUJBQWlCO29CQUVBLE1BQU07MERBRXJCLGdCQUFnQjtpRUFDZixnQkFBZ0I7a0VBQ2YsaUJBQWlCO2tDQUVMLGdDQUFnQztzQkFDMUIsb0JBQW9COzBCQUNGLHdCQUF3Qjt1QkFDdkIscUJBQXFCO3NCQUNoQixpQkFBaUI7d0JBQ2lFLFlBQVk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFbEssSUFBQSxBQUFNQSxJQUFJLGlCQTRRUCxBQTVRSDs7O2FBQU1BLElBQUksQ0FDSUMsUUFBUSxFQUFFQyxNQUFNOzs7a0NBQ3BCRCxRQUFRLEVBQUU7UUFFaEIsTUFBS0MsTUFBTSxHQUFHQSxNQUFNLENBQUM7Ozs7O1lBR3ZCQyxHQUFTLEVBQVRBLFdBQVM7bUJBQVRBLFNBQUFBLFNBQVMsR0FBRztnQkFDVixPQUFPLElBQUksQ0FBQ0QsTUFBTSxDQUFDO2FBQ3BC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
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy95YXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgd2l0aFN0eWxlIGZyb20gXCJlYXN5LXdpdGgtc3R5bGVcIjsgIC8vL1xuXG5pbXBvcnQgeyBSZWFjdCwgRWxlbWVudCB9IGZyb20gXCJlYXN5XCI7XG5cbmltcG9ydCBzdHlsZU1peGlucyBmcm9tIFwiLi9taXhpbnMvc3R5bGVcIjtcbmltcG9ydCBQcmV0dHlQcmludGVyIGZyb20gXCIuL3ByZXR0eVByaW50ZXJcIjtcblxuaW1wb3J0IHsgZ2V0U2Nyb2xsYmFyVGhpY2tuZXNzIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3Njcm9sbGJhclRoaWNrbmVzc1wiO1xuaW1wb3J0IHsgcGx1Z2luRnJvbUxhbmd1YWdlQW5kUGx1Z2luIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3BsdWdpblwiO1xuaW1wb3J0IHsgcHJvcGVydGllc0Zyb21Db250ZW50TGFuZ3VhZ2VQbHVnaW5BbmRPcHRpb25zIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3Byb3BlcnRpZXNcIjtcbmltcG9ydCB7IGxpbmVDb3VudEZyb21Db250ZW50LCBjb250ZW50RnJvbUNoaWxkRWxlbWVudHMgfSBmcm9tIFwiLi91dGlsaXRpZXMvY29udGVudFwiO1xuaW1wb3J0IHsgY29sb3VyLCBjYXJldENvbG91ciwgYm9yZGVyQ29sb3VyLCBiYWNrZ3JvdW5kQ29sb3VyIH0gZnJvbSBcIi4vc2NoZW1lL2NvbG91clwiO1xuaW1wb3J0IHsgREVGQVVMVF9FRElUQUJMRSwgREVGQVVMVF9GSVJBX0NPREUsIERFRkFVTFRfQVVUT19IRUlHSFQsIERFRkFVTFRfSElEREVOX0dVVFRFUiwgREVGQVVMVF9ISURERU5fU0NST0xMQkFSUywgREVGQVVMVF9GQU5DWV9TQ1JPTExCQVJTIH0gZnJvbSBcIi4vZGVmYXVsdHNcIjtcblxuY2xhc3MgWWFwcCBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihzZWxlY3RvciwgcGx1Z2luKSB7XG4gICAgc3VwZXIoc2VsZWN0b3IpO1xuXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gIH1cblxuICBjaGFuZ2VIYW5kbGVyID0gKGV2ZW50LCBlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgcmljaFRleHRhcmVhID0gZWxlbWVudCwgLy8vXG4gICAgICAgICAgY29udGVudENoYW5nZWQgPSByaWNoVGV4dGFyZWEuaGFzQ29udGVudENoYW5nZWQoKTtcblxuICAgIGlmIChjb250ZW50Q2hhbmdlZCkge1xuICAgICAgY29uc3QgeyBvbkNvbnRlbnRDaGFuZ2UgPSBudWxsIH0gPSB0aGlzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBjb250ZW50Q2hhbmdlSGFuZGxlciA9IG9uQ29udGVudENoYW5nZTsgIC8vL1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICBpZiAoY29udGVudENoYW5nZUhhbmRsZXIpIHtcbiAgICAgICAgZWxlbWVudCA9IHRoaXM7IC8vL1xuXG4gICAgICAgIGNvbnRlbnRDaGFuZ2VIYW5kbGVyKGV2ZW50LCBlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRQbHVnaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luO1xuICB9XG5cbiAgZ2V0Q29udGVudCgpIHtcbiAgICBjb25zdCByaWNoVGV4dGFyZWFDb250ZW50ID0gdGhpcy5nZXRSaWNoVGV4dGFyZWFDb250ZW50KCksXG4gICAgICAgICAgY29udGVudCA9IHJpY2hUZXh0YXJlYUNvbnRlbnQ7ICAvLy9cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgZ2V0SW5pdGlhbExpbmVDb3VudCgpIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRDb250ZW50KCksXG4gICAgICAgICAgbGluZUNvdW50ID0gbGluZUNvdW50RnJvbUNvbnRlbnQoY29udGVudCksXG4gICAgICAgICAgaW5pdGlhbExpbmVDb3VudCA9IGxpbmVDb3VudDsgLy8vXG5cbiAgICByZXR1cm4gaW5pdGlhbExpbmVDb3VudDtcbiAgfVxuXG4gIGdldFNjcm9sbGJhclRoaWNrbmVzcygpIHtcbiAgICBsZXQgc2Nyb2xsYmFyVGhpY2tuZXNzID0gMDtcblxuICAgIGNvbnN0IHsgaGlkZGVuU2Nyb2xsYmFycyA9IERFRkFVTFRfSElEREVOX1NDUk9MTEJBUlMgfSA9IHRoaXMucHJvcGVydGllcztcblxuICAgIGlmICghaGlkZGVuU2Nyb2xsYmFycykge1xuICAgICAgY29uc3QgeyBmYW5jeVNjcm9sbGJhcnMgPSBERUZBVUxUX0ZBTkNZX1NDUk9MTEJBUlMgfSA9IHRoaXMucHJvcGVydGllcztcblxuICAgICAgc2Nyb2xsYmFyVGhpY2tuZXNzID0gZ2V0U2Nyb2xsYmFyVGhpY2tuZXNzKGZhbmN5U2Nyb2xsYmFycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjcm9sbGJhclRoaWNrbmVzcztcbiAgfVxuXG4gIHNldExleGVyKGxleGVyKSB7IHRoaXMucGx1Z2luLnNldExleGVyKGxleGVyKTsgfVxuXG4gIHNldFBhcnNlcihwYXJzZXIpIHsgdGhpcy5wbHVnaW4uc2V0UGFyc2VyKHBhcnNlcik7IH1cblxuICB1cGRhdGUoKSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCgpO1xuXG4gICAgdGhpcy5wbHVnaW4udXBkYXRlKGNvbnRlbnQpO1xuXG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy5wbHVnaW4uZ2V0VG9rZW5zKCk7XG5cbiAgICB0aGlzLnVwZGF0ZVByZXR0eVByaW50ZXIodG9rZW5zKTtcbiAgfVxuXG4gIGRpZE1vdW50KCkge1xuICAgIGNvbnN0IHsgZmlyYUNvZGUgPSBERUZBVUxUX0ZJUkFfQ09ERSwgYXV0b0hlaWdodCA9IERFRkFVTFRfQVVUT19IRUlHSFQgfSA9IHRoaXMucHJvcGVydGllcztcblxuICAgIGlmIChmaXJhQ29kZSkge1xuICAgICAgdGhpcy5hZGRDbGFzcyhcImZpcmEtY29kZVwiKTtcbiAgICB9XG5cbiAgICBpZiAoYXV0b0hlaWdodCkge1xuICAgICAgY29uc3QgbGluZUhlaWdodCA9IHRoaXMuZ2V0TGluZUhlaWdodCgpLFxuICAgICAgICAgICAgcGFkZGluZ1RvcCA9IHRoaXMuZ2V0UGFkZGluZ1RvcCgpLFxuICAgICAgICAgICAgcGFkZGluZ0JvdHRvbSA9IHRoaXMuZ2V0UGFkZGluZ0JvdHRvbSgpLFxuICAgICAgICAgICAgYm9yZGVyVG9wV2lkdGggPSB0aGlzLmdldEJvcmRlclRvcFdpZHRoKCksXG4gICAgICAgICAgICBpbml0aWFsTGluZUNvdW50ID0gdGhpcy5nZXRJbml0aWFsTGluZUNvdW50KCksXG4gICAgICAgICAgICBib3JkZXJCb3R0b21XaWR0aCA9IHRoaXMuZ2V0Qm9yZGVyQm90dG9tV2lkdGgoKSxcbiAgICAgICAgICAgIHNjcm9sbGJhclRoaWNrbmVzcyA9IHRoaXMuZ2V0U2Nyb2xsYmFyVGhpY2tuZXNzKCksXG4gICAgICAgICAgICBoZWlnaHQgPSBib3JkZXJUb3BXaWR0aCArIHBhZGRpbmdUb3AgKyBpbml0aWFsTGluZUNvdW50ICogbGluZUhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b21XaWR0aCArIHNjcm9sbGJhclRoaWNrbmVzcztcblxuICAgICAgdGhpcy5zZXRIZWlnaHQoaGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICB3aWxsVW5tb3VudCgpIHtcbiAgICBjb25zdCB7IGZpcmFDb2RlID0gREVGQVVMVF9GSVJBX0NPREUgfSA9IHRoaXMucHJvcGVydGllcztcblxuICAgIGlmIChmaXJhQ29kZSkge1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcyhcImZpcmEtY29kZVwiKTtcbiAgICB9XG4gIH1cblxuICBjaGlsZEVsZW1lbnRzKCkge1xuICAgIGNvbnN0IHsgaGlkZGVuR3V0dGVyID0gREVGQVVMVF9ISURERU5fR1VUVEVSLCBoaWRkZW5TY3JvbGxiYXJzID0gREVGQVVMVF9ISURERU5fU0NST0xMQkFSUywgZmFuY3lTY3JvbGxiYXJzID0gREVGQVVMVF9GQU5DWV9TQ1JPTExCQVJTIH0gPSB0aGlzLnByb3BlcnRpZXMsXG4gICAgICAgICAgc2Nyb2xsYmFyVGhpY2tuZXNzID0gdGhpcy5nZXRTY3JvbGxiYXJUaGlja25lc3MoKTtcblxuICAgIHJldHVybiAoXG5cbiAgICAgIDxQcmV0dHlQcmludGVyIG9uQ2hhbmdlPXt0aGlzLmNoYW5nZUhhbmRsZXJ9XG4gICAgICAgICAgICAgICAgICAgICBoaWRkZW5HdXR0ZXI9e2hpZGRlbkd1dHRlcn1cbiAgICAgICAgICAgICAgICAgICAgIGZhbmN5U2Nyb2xsYmFycz17ZmFuY3lTY3JvbGxiYXJzfVxuICAgICAgICAgICAgICAgICAgICAgaGlkZGVuU2Nyb2xsYmFycz17aGlkZGVuU2Nyb2xsYmFyc31cbiAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGJhclRoaWNrbmVzcz17c2Nyb2xsYmFyVGhpY2tuZXNzfSAvPlxuXG4gICAgKTtcbiAgfVxuXG4gIHBhcmVudENvbnRleHQoKSB7XG4gICAgY29uc3QgZ2V0UGx1Z2luID0gdGhpcy5nZXRQbHVnaW4uYmluZCh0aGlzKSxcbiAgICAgICAgICBnZXRDb250ZW50ID0gdGhpcy5nZXRDb250ZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgdXBkYXRlWWFwcCA9IHRoaXMudXBkYXRlLmJpbmQodGhpcyksICAvLy9cbiAgICAgICAgICBzZXRZYXBwTGV4ZXIgPSB0aGlzLnNldExleGVyLmJpbmQodGhpcyksICAvLy9cbiAgICAgICAgICBzZXRZYXBwV2lkdGggPSB0aGlzLnNldFdpZHRoLmJpbmQodGhpcyksICAvLy9cbiAgICAgICAgICBzZXRZYXBwSGVpZ2h0ID0gdGhpcy5zZXRIZWlnaHQuYmluZCh0aGlzKSwgIC8vL1xuICAgICAgICAgIHNldFlhcHBQYXJzZXIgPSB0aGlzLnNldFBhcnNlci5iaW5kKHRoaXMpOyAgLy8vXG5cbiAgICByZXR1cm4gKHtcbiAgICAgIGdldFBsdWdpbixcbiAgICAgIGdldENvbnRlbnQsXG4gICAgICB1cGRhdGVZYXBwLFxuICAgICAgc2V0WWFwcExleGVyLFxuICAgICAgc2V0WWFwcFdpZHRoLFxuICAgICAgc2V0WWFwcEhlaWdodCxcbiAgICAgIHNldFlhcHBQYXJzZXJcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRpYWxpc2UoKSB7XG4gICAgdGhpcy5hc3NpZ25Db250ZXh0KCk7XG5cbiAgICBjb25zdCB7IGNoaWxkRWxlbWVudHMsIGVkaXRhYmxlID0gREVGQVVMVF9FRElUQUJMRSB9ID0gdGhpcy5wcm9wZXJ0aWVzLFxuICAgICAgICAgIGxhbmd1YWdlID0gdGhpcy5wbHVnaW4uZ2V0TGFuZ3VhZ2UoKSxcbiAgICAgICAgICBjb250ZW50ID0gY29udGVudEZyb21DaGlsZEVsZW1lbnRzKGNoaWxkRWxlbWVudHMpLFxuICAgICAgICAgIHJlYWRPbmx5ID0gIWVkaXRhYmxlO1xuXG4gICAgdGhpcy5zZXRMYW5ndWFnZShsYW5ndWFnZSk7XG5cbiAgICB0aGlzLnNldFJpY2hUZXh0YXJlYUNvbnRlbnQoY29udGVudCk7XG5cbiAgICB0aGlzLnNldFJpY2hUZXh0YXJlYVJlYWRPbmx5KHJlYWRPbmx5KTtcblxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBzdGF0aWMgdGFnTmFtZSA9IFwiZGl2XCI7XG5cbiAgc3RhdGljIGRlZmF1bHRQcm9wZXJ0aWVzID0ge1xuICAgIGNsYXNzTmFtZTogXCJ5YXBwXCJcbiAgfTtcblxuICBzdGF0aWMgaWdub3JlZFByb3BlcnRpZXMgPSBbXG4gICAgXCJQbHVnaW5cIixcbiAgICBcImxhbmd1YWdlXCIsXG4gICAgXCJmaXJhQ29kZVwiLFxuICAgIFwiZWRpdGFibGVcIixcbiAgICBcImF1dG9IZWlnaHRcIixcbiAgICBcImhpZGRlbkd1dHRlclwiLFxuICAgIFwibm9TY3JvbGxiYXJzXCIsXG4gICAgXCJmYW5jeVNjcm9sbGJhcnNcIixcbiAgICBcIm9uQ29udGVudENoYW5nZVwiXG4gIF07XG5cbiAgc3RhdGljIGZyb21Db250ZW50KGNvbnRlbnQsIGxhbmd1YWdlLCBQbHVnaW4sIG9wdGlvbnMpIHtcbiAgICBjb25zdCBDbGFzcyA9IFlhcHAsXG4gICAgICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXNGcm9tQ29udGVudExhbmd1YWdlUGx1Z2luQW5kT3B0aW9ucyhjb250ZW50LCBsYW5ndWFnZSwgUGx1Z2luLCBvcHRpb25zKSxcbiAgICAgICAgICBwbHVnaW4gPSBwbHVnaW5Gcm9tTGFuZ3VhZ2VBbmRQbHVnaW4obGFuZ3VhZ2UsIFBsdWdpbiksXG4gICAgICAgICAgeWFwcCA9IEVsZW1lbnQuZnJvbUNsYXNzKENsYXNzLCBwcm9wZXJ0aWVzLCBwbHVnaW4pO1xuXG4gICAgcmV0dXJuIHlhcHA7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNsYXNzKENsYXNzLCBwcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgeyBsYW5ndWFnZSwgUGx1Z2luIH0gPSBwcm9wZXJ0aWVzLFxuICAgICAgICAgIHBsdWdpbiA9IHBsdWdpbkZyb21MYW5ndWFnZUFuZFBsdWdpbihsYW5ndWFnZSwgUGx1Z2luKSxcbiAgICAgICAgICB5YXBwID0gRWxlbWVudC5mcm9tQ2xhc3MoQ2xhc3MsIHByb3BlcnRpZXMsIHBsdWdpbik7XG5cbiAgICByZXR1cm4geWFwcDtcbiAgfVxufVxuXG5PYmplY3QuYXNzaWduKFlhcHAucHJvdG90eXBlLCBzdHlsZU1peGlucyk7XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZShZYXBwKWBcblxuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuXG4gIGJvcmRlcjogMXB4IHNvbGlkO1xuICBcbiAgY29sb3I6ICR7Y29sb3VyfTtcbiAgY2FyZXQtY29sb3I6ICR7Y2FyZXRDb2xvdXJ9O1xuICBib3JkZXItY29sb3I6ICR7Ym9yZGVyQ29sb3VyfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtiYWNrZ3JvdW5kQ29sb3VyfTtcblxuICBmb250LXNpemU6IDEzcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBmb250LWZhbWlseTogXCJNZW5sb1wiLCBcIkx1Y2lkYSBTYW5zIFR5cGV3cml0ZXJcIiwgbW9ub3NwYWNlO1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6IG5vcm1hbDtcblxuICAuZmlyYS1jb2RlIHtcblxuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICBmb250LWZhbWlseTogXCJGaXJhIENvZGVcIjtcbiAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuICAgIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogXCJjYWx0XCIgMTtcbiAgICBcbiAgfVxuXG5gO1xuIl0sIm5hbWVzIjpbIllhcHAiLCJzZWxlY3RvciIsInBsdWdpbiIsImNoYW5nZUhhbmRsZXIiLCJldmVudCIsImVsZW1lbnQiLCJyaWNoVGV4dGFyZWEiLCJjb250ZW50Q2hhbmdlZCIsImhhc0NvbnRlbnRDaGFuZ2VkIiwicHJvcGVydGllcyIsIm9uQ29udGVudENoYW5nZSIsImNvbnRlbnRDaGFuZ2VIYW5kbGVyIiwidXBkYXRlIiwiZ2V0UGx1Z2luIiwiZ2V0Q29udGVudCIsInJpY2hUZXh0YXJlYUNvbnRlbnQiLCJnZXRSaWNoVGV4dGFyZWFDb250ZW50IiwiY29udGVudCIsImdldEluaXRpYWxMaW5lQ291bnQiLCJsaW5lQ291bnQiLCJsaW5lQ291bnRGcm9tQ29udGVudCIsImluaXRpYWxMaW5lQ291bnQiLCJnZXRTY3JvbGxiYXJUaGlja25lc3MiLCJzY3JvbGxiYXJUaGlja25lc3MiLCJoaWRkZW5TY3JvbGxiYXJzIiwiREVGQVVMVF9ISURERU5fU0NST0xMQkFSUyIsImZhbmN5U2Nyb2xsYmFycyIsIkRFRkFVTFRfRkFOQ1lfU0NST0xMQkFSUyIsInNldExleGVyIiwibGV4ZXIiLCJzZXRQYXJzZXIiLCJwYXJzZXIiLCJ0b2tlbnMiLCJnZXRUb2tlbnMiLCJ1cGRhdGVQcmV0dHlQcmludGVyIiwiZGlkTW91bnQiLCJmaXJhQ29kZSIsIkRFRkFVTFRfRklSQV9DT0RFIiwiYXV0b0hlaWdodCIsIkRFRkFVTFRfQVVUT19IRUlHSFQiLCJhZGRDbGFzcyIsImxpbmVIZWlnaHQiLCJnZXRMaW5lSGVpZ2h0IiwicGFkZGluZ1RvcCIsImdldFBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIiwiZ2V0UGFkZGluZ0JvdHRvbSIsImJvcmRlclRvcFdpZHRoIiwiZ2V0Qm9yZGVyVG9wV2lkdGgiLCJib3JkZXJCb3R0b21XaWR0aCIsImdldEJvcmRlckJvdHRvbVdpZHRoIiwiaGVpZ2h0Iiwic2V0SGVpZ2h0Iiwid2lsbFVubW91bnQiLCJyZW1vdmVDbGFzcyIsImNoaWxkRWxlbWVudHMiLCJoaWRkZW5HdXR0ZXIiLCJERUZBVUxUX0hJRERFTl9HVVRURVIiLCJQcmV0dHlQcmludGVyIiwib25DaGFuZ2UiLCJwYXJlbnRDb250ZXh0IiwiYmluZCIsInVwZGF0ZVlhcHAiLCJzZXRZYXBwTGV4ZXIiLCJzZXRZYXBwV2lkdGgiLCJzZXRXaWR0aCIsInNldFlhcHBIZWlnaHQiLCJzZXRZYXBwUGFyc2VyIiwiaW5pdGlhbGlzZSIsImFzc2lnbkNvbnRleHQiLCJlZGl0YWJsZSIsIkRFRkFVTFRfRURJVEFCTEUiLCJsYW5ndWFnZSIsImdldExhbmd1YWdlIiwiY29udGVudEZyb21DaGlsZEVsZW1lbnRzIiwicmVhZE9ubHkiLCJzZXRMYW5ndWFnZSIsInNldFJpY2hUZXh0YXJlYUNvbnRlbnQiLCJzZXRSaWNoVGV4dGFyZWFSZWFkT25seSIsImZyb21Db250ZW50IiwiUGx1Z2luIiwib3B0aW9ucyIsIkNsYXNzIiwicHJvcGVydGllc0Zyb21Db250ZW50TGFuZ3VhZ2VQbHVnaW5BbmRPcHRpb25zIiwicGx1Z2luRnJvbUxhbmd1YWdlQW5kUGx1Z2luIiwieWFwcCIsIkVsZW1lbnQiLCJmcm9tQ2xhc3MiLCJ0YWdOYW1lIiwiZGVmYXVsdFByb3BlcnRpZXMiLCJjbGFzc05hbWUiLCJpZ25vcmVkUHJvcGVydGllcyIsIk9iamVjdCIsImFzc2lnbiIsInByb3RvdHlwZSIsInN0eWxlTWl4aW5zIiwid2l0aFN0eWxlIiwiY29sb3VyIiwiY2FyZXRDb2xvdXIiLCJib3JkZXJDb2xvdXIiLCJiYWNrZ3JvdW5kQ29sb3VyIl0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7K0JBK01iLFNBNEJFOzs7ZUE1QkYsUUE0QkU7OztrRUF6T29CLGlCQUFpQjtvQkFFUixNQUFNOzBEQUViLGdCQUFnQjtrRUFDZCxpQkFBaUI7a0NBRUwsZ0NBQWdDO3NCQUMxQixvQkFBb0I7MEJBQ0Ysd0JBQXdCO3VCQUN2QixxQkFBcUI7c0JBQ2hCLGlCQUFpQjt3QkFDZ0UsWUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVqSyxJQUFBLEFBQU1BLElBQUksaUJBNkxQLEFBN0xIO2NBQU1BLElBQUk7OEJBQUpBLElBQUk7YUFBSkEsSUFBSSxDQUNJQyxRQUFRLEVBQUVDLE1BQU07OEJBRHhCRixJQUFJOztrQ0FFQUMsUUFBUSxFQUFFO1FBS2xCRSwrQ0FBQUEsZUFBYSxFQUFHLFNBQUNDLEtBQUssRUFBRUMsT0FBTyxFQUFLO1lBQ2xDLElBQU1DLFlBQVksR0FBR0QsT0FBTyxFQUN0QkUsY0FBYyxHQUFHRCxZQUFZLENBQUNFLGlCQUFpQixFQUFFLEFBQUM7WUFFeEQsSUFBSUQsY0FBYyxFQUFFO2dCQUNsQixJQUFtQyxXQUFlLEdBQWYsTUFBS0UsVUFBVSxxQkFBZixXQUFlLENBQTFDQyxlQUFlLEVBQWZBLGVBQWUsaUNBQUcsSUFBSSxtQkFBQSxFQUN4QkMsb0JBQW9CLEdBQUdELGVBQWUsQUFBQyxFQUFFLEdBQUc7Z0JBRWxELE1BQUtFLE1BQU0sRUFBRSxDQUFDO2dCQUVkLElBQUlELG9CQUFvQixFQUFFO29CQUN4Qk4s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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "yapp",
3
3
  "author": "James Smith",
4
- "version": "3.0.4",
4
+ "version": "4.0.2",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/yapp",
7
7
  "description": "Yet Another Pretty Printer.",
package/src/defaults.js CHANGED
@@ -3,7 +3,7 @@
3
3
  export const DEFAULT_HOST = "";
4
4
  export const DEFAULT_EDITABLE = false;
5
5
  export const DEFAULT_FIRA_CODE = false;
6
- export const DEFAULT_DEFER_RENDER = false;
6
+ export const DEFAULT_AUTO_HEIGHT = true;
7
7
  export const DEFAULT_HIDDEN_GUTTER = false;
8
8
  export const DEFAULT_FANCY_SCROLLBARS = false;
9
9
  export const DEFAULT_HIDDEN_SCROLLBARS = false;
@@ -20,11 +20,11 @@ import LexicalEntriesTextarea from "./textarea/lexicalEntries";
20
20
  const { rulesFromBNF } = parserUtilities;
21
21
 
22
22
  class View extends Element {
23
- contentChangeHandler(event, element) {
23
+ contentChangeHandler = (event, element) => {
24
24
  this.update();
25
25
  }
26
26
 
27
- keyUpHandler(event, element) {
27
+ keyUpHandler = (event, element) => {
28
28
  try {
29
29
  const { Plugin } = this.constructor,
30
30
  { Lexer, Parser } = Plugin,
@@ -49,19 +49,6 @@ class View extends Element {
49
49
  }
50
50
  }
51
51
 
52
- dragHandler() {
53
- const leftSizeableDivWidth = this.getLeftSizeableDivWidth(),
54
- topSizeableDivHeight = this.getTopSizeableDivHeight(),
55
- yappWidth = leftSizeableDivWidth, ///
56
- yappHeight = topSizeableDivHeight; ///
57
-
58
- this.setYappWidth(yappWidth);
59
-
60
- this.setYappHeight(yappHeight);
61
-
62
- this.resizeYapp();
63
- }
64
-
65
52
  update() {
66
53
  try {
67
54
  let parseTree = null;
@@ -90,10 +77,6 @@ class View extends Element {
90
77
 
91
78
  didMount() {
92
79
  this.update();
93
-
94
- this.dragHandler(); ///
95
-
96
- this.resizeYapp(); ///
97
80
  }
98
81
 
99
82
  willUnmount() {
@@ -101,10 +84,7 @@ class View extends Element {
101
84
  }
102
85
 
103
86
  childElements() {
104
- const { Plugin, firaCode, initialContent } = this.constructor,
105
- dragHandler = this.dragHandler.bind(this),
106
- keyUpHandler = this.keyUpHandler.bind(this),
107
- contentChangeHandler = this.contentChangeHandler.bind(this);
87
+ const { Plugin, firaCode, initialContent } = this.constructor;
108
88
 
109
89
  return ([
110
90
 
@@ -112,11 +92,11 @@ class View extends Element {
112
92
  <LeftSizeableDiv>
113
93
  <RowsDiv>
114
94
  <TopSizeableDiv>
115
- <Yapp Plugin={Plugin} firaCode={firaCode} onContentChange={contentChangeHandler} >
95
+ <Yapp Plugin={Plugin} firaCode={firaCode} onContentChange={this.contentChangeHandler} >
116
96
  {initialContent}
117
97
  </Yapp>
118
98
  </TopSizeableDiv>
119
- <HorizontalSplitterDiv onDrag={dragHandler}/>
99
+ <HorizontalSplitterDiv/>
120
100
  <RowDiv>
121
101
  <RowsDiv>
122
102
  <MiddleSizeableDiv>
@@ -138,7 +118,7 @@ class View extends Element {
138
118
  </RowDiv>
139
119
  </RowsDiv>
140
120
  </LeftSizeableDiv>
141
- <VerticalSplitterDiv onDrag={dragHandler}/>
121
+ <VerticalSplitterDiv/>
142
122
  <ColumnDiv>
143
123
  <RowsDiv>
144
124
  <RightSizeableDiv>
@@ -146,7 +126,7 @@ class View extends Element {
146
126
  <SubHeading>
147
127
  Lexical entries
148
128
  </SubHeading>
149
- <LexicalEntriesTextarea onKeyUp={keyUpHandler} />
129
+ <LexicalEntriesTextarea onKeyUp={this.keyUpHandler} />
150
130
  </RowsDiv>
151
131
  </RightSizeableDiv>
152
132
  <HorizontalSplitterDiv />
@@ -155,7 +135,7 @@ class View extends Element {
155
135
  <SubHeading>
156
136
  BNF
157
137
  </SubHeading>
158
- <BNFTextarea onKeyUp={keyUpHandler} />
138
+ <BNFTextarea onKeyUp={this.keyUpHandler} />
159
139
  </RowsDiv>
160
140
  </RowDiv>
161
141
  </RowsDiv>
@@ -6,11 +6,12 @@ import Yapp from "../index"; ///
6
6
 
7
7
  export default withStyle(class extends Yapp {
8
8
  static defaultProperties = {
9
- editable: true
9
+ editable: true,
10
+ autoHeight: false,
11
+ hiddenGutter: true
10
12
  };
11
13
  })`
12
14
 
13
- border: 1px solid;
14
15
  border-color: #666;
15
16
 
16
17
  `;
package/src/gutter.js CHANGED
@@ -6,7 +6,6 @@ import { React, Element } from "easy";
6
6
 
7
7
  import LineNumbers from "./lineNumbers";
8
8
 
9
- import { gutterHeight } from "./styles";
10
9
  import { lineCountFromTokens } from "./utilities/tokens";
11
10
 
12
11
  class Gutter extends Element {
@@ -19,20 +18,7 @@ class Gutter extends Element {
19
18
  }
20
19
 
21
20
  scroll(scrollTop, scrollLeft) {
22
- this.setScrollTop(scrollTop);
23
-
24
- this.position();
25
- }
26
-
27
- position() {
28
- const scrollTop = this.getScrollTop();
29
-
30
- const top = `${-scrollTop}px`,
31
- css = {
32
- top
33
- };
34
-
35
- this.css(css);
21
+ this.scrollLineNumbers(scrollTop, scrollLeft);
36
22
  }
37
23
 
38
24
  getLineCount() {
@@ -42,54 +28,35 @@ class Gutter extends Element {
42
28
  return lineCount;
43
29
  }
44
30
 
45
- getScrollTop() {
46
- const state = this.getState(),
47
- { scrollTop } = state;
48
-
49
- return scrollTop;
50
- }
51
-
52
31
  setLineCount(lineCount) {
53
32
  this.updateState({
54
33
  lineCount
55
34
  });
56
35
  }
57
36
 
58
- setScrollTop(scrollTop) {
59
- this.updateState({
60
- scrollTop
61
- });
62
- }
63
-
64
37
  setInitialState() {
65
- const scrollTop = 0,
66
- lineCount = null;
38
+ const lineCount = null;
67
39
 
68
40
  this.setState({
69
- scrollTop,
70
41
  lineCount
71
42
  });
72
43
  }
73
44
 
74
45
  childElements() {
75
- return ([
46
+ return (
76
47
 
77
- <LineNumbers />,
48
+ <LineNumbers />
78
49
 
79
- ]);
50
+ );
80
51
  }
81
52
 
82
53
  parentContext() {
83
54
  const context = this.getContext(),
84
55
  getLineCount = this.getLineCount.bind(this),
85
- getGutterWidth = this.getWidth.bind(this), ///
86
- positionGutter = this.position.bind(this), ///
87
56
  updateGutter = this.update.bind(this), ///
88
57
  scrollGutter = this.scroll.bind(this), ///
89
58
  parentContext = Object.assign({}, context, {
90
59
  getLineCount,
91
- getGutterWidth,
92
- positionGutter,
93
60
  updateGutter,
94
61
  scrollGutter
95
62
  });
@@ -112,9 +79,10 @@ class Gutter extends Element {
112
79
 
113
80
  export default withStyle(Gutter)`
114
81
 
115
- height: ${gutterHeight};
116
- z-index: 2;
117
- position: absolute;
82
+ width: fit-content;
83
+ overflow: hidden;
84
+ position: relative;
85
+ grid-area: gutter;
118
86
  text-align: right;
119
87
  user-select: none;
120
88
  pointer-events: none;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ import withStyle from "easy-with-style"; ///
4
+
5
+ import { Element } from "easy";
6
+
7
+ import Syntax from "./syntax";
8
+
9
+ class Highlights extends Element {
10
+ update(tokens) {
11
+ this.updateSyntax(tokens);
12
+ }
13
+
14
+ scroll(scrollTop, scrollLeft) {
15
+ this.scrollSyntax(scrollTop, scrollLeft);
16
+ }
17
+
18
+ childElements() {
19
+ return (
20
+
21
+ <Syntax/>
22
+
23
+ );
24
+ }
25
+
26
+ parentContext() {
27
+ const context = this.getContext(),
28
+ updateHighlights = this.update.bind(this), ///
29
+ scrollHighlights = this.scroll.bind(this), ///
30
+ parentContext = Object.assign({}, context, {
31
+ updateHighlights,
32
+ scrollHighlights
33
+ });
34
+
35
+ return parentContext;
36
+ }
37
+
38
+ initialise() {
39
+ this.assignContext([
40
+ "updateHighlights",
41
+ "scrollHighlights",
42
+ "scrollbarThickness"
43
+ ]);
44
+ }
45
+
46
+ static tagName = "div";
47
+
48
+ static defaultProperties = {
49
+ className: "syntax"
50
+ };
51
+ }
52
+
53
+ export default withStyle(Highlights)`
54
+
55
+ z-index: 0;
56
+ width: 100%;
57
+ height: 100%;
58
+ overflow: hidden;
59
+ position: relative;
60
+ grid-area: syntax;
61
+
62
+ background-color: inherit;
63
+
64
+ font-size: inherit;
65
+ line-height: inherit;
66
+ font-family: inherit;
67
+ text-rendering: inherit;
68
+ font-feature-settings: inherit;
69
+
70
+ `;
@@ -17,10 +17,21 @@ class LineNumbers extends Element {
17
17
  this.html(html);
18
18
  }
19
19
 
20
+ scroll(scrollTop, scrollLeft) {
21
+ const top = `${-scrollTop}px`,
22
+ css = {
23
+ top
24
+ };
25
+
26
+ this.css(css);
27
+ }
28
+
20
29
  parentContext() {
21
- const updateLineNumbers = this.update.bind(this); ///
30
+ const scrollLineNumbers = this.scroll.bind(this), ///
31
+ updateLineNumbers = this.update.bind(this); ///
22
32
 
23
33
  return ({
34
+ scrollLineNumbers,
24
35
  updateLineNumbers
25
36
  });
26
37
  }
@@ -34,8 +45,8 @@ class LineNumbers extends Element {
34
45
 
35
46
  export default withStyle(LineNumbers)`
36
47
 
37
- float: left;
38
48
  margin: 0 6px 0 6px;
49
+ position: relative;
39
50
 
40
51
  color: inherit;
41
52