@pie-lib/editable-html 9.5.13 → 10.0.0-beta.1

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 (144) hide show
  1. package/CHANGELOG.md +0 -302
  2. package/lib/components.js +116 -0
  3. package/lib/components.js.map +1 -0
  4. package/lib/editor.js +418 -103
  5. package/lib/editor.js.map +1 -1
  6. package/lib/index.js +101 -155
  7. package/lib/index.js.map +1 -1
  8. package/lib/new-serialization.js +320 -0
  9. package/lib/new-serialization.js.map +1 -0
  10. package/lib/old-serialization.js +330 -0
  11. package/lib/parse-html.js +1 -1
  12. package/lib/parse-html.js.map +1 -1
  13. package/lib/plugins/characters/custom-popper.js +1 -1
  14. package/lib/plugins/characters/custom-popper.js.map +1 -1
  15. package/lib/plugins/characters/index.js +21 -19
  16. package/lib/plugins/characters/index.js.map +1 -1
  17. package/lib/plugins/characters/utils.js +1 -1
  18. package/lib/plugins/characters/utils.js.map +1 -1
  19. package/lib/plugins/hotKeys/index.js +67 -0
  20. package/lib/plugins/hotKeys/index.js.map +1 -0
  21. package/lib/plugins/image/alt-dialog.js +1 -6
  22. package/lib/plugins/image/alt-dialog.js.map +1 -1
  23. package/lib/plugins/image/component.js +70 -53
  24. package/lib/plugins/image/component.js.map +1 -1
  25. package/lib/plugins/image/image-toolbar.js +7 -9
  26. package/lib/plugins/image/image-toolbar.js.map +1 -1
  27. package/lib/plugins/image/index.js +83 -27
  28. package/lib/plugins/image/index.js.map +1 -1
  29. package/lib/plugins/image/insert-image-handler.js +72 -33
  30. package/lib/plugins/image/insert-image-handler.js.map +1 -1
  31. package/lib/plugins/index.js +23 -41
  32. package/lib/plugins/index.js.map +1 -1
  33. package/lib/plugins/list/index.js +64 -100
  34. package/lib/plugins/list/index.js.map +1 -1
  35. package/lib/plugins/math/index.js +86 -60
  36. package/lib/plugins/math/index.js.map +1 -1
  37. package/lib/plugins/media/index.js +202 -132
  38. package/lib/plugins/media/index.js.map +1 -1
  39. package/lib/plugins/media/media-dialog.js +17 -16
  40. package/lib/plugins/media/media-dialog.js.map +1 -1
  41. package/lib/plugins/media/media-toolbar.js +3 -3
  42. package/lib/plugins/media/media-toolbar.js.map +1 -1
  43. package/lib/plugins/media/media-wrapper.js +21 -58
  44. package/lib/plugins/media/media-wrapper.js.map +1 -1
  45. package/lib/plugins/respArea/drag-in-the-blank/choice.js +3 -3
  46. package/lib/plugins/respArea/drag-in-the-blank/choice.js.map +1 -1
  47. package/lib/plugins/respArea/drag-in-the-blank/index.js +3 -2
  48. package/lib/plugins/respArea/drag-in-the-blank/index.js.map +1 -1
  49. package/lib/plugins/respArea/explicit-constructed-response/index.js +3 -2
  50. package/lib/plugins/respArea/explicit-constructed-response/index.js.map +1 -1
  51. package/lib/plugins/respArea/icons/index.js +13 -15
  52. package/lib/plugins/respArea/icons/index.js.map +1 -1
  53. package/lib/plugins/respArea/index.js +87 -53
  54. package/lib/plugins/respArea/index.js.map +1 -1
  55. package/lib/plugins/respArea/inline-dropdown/index.js +4 -3
  56. package/lib/plugins/respArea/inline-dropdown/index.js.map +1 -1
  57. package/lib/plugins/respArea/utils.js +17 -20
  58. package/lib/plugins/respArea/utils.js.map +1 -1
  59. package/lib/plugins/table/icons/index.js +1 -1
  60. package/lib/plugins/table/icons/index.js.map +1 -1
  61. package/lib/plugins/table/index.js +381 -212
  62. package/lib/plugins/table/index.js.map +1 -1
  63. package/lib/plugins/table/table-toolbar.js +5 -6
  64. package/lib/plugins/table/table-toolbar.js.map +1 -1
  65. package/lib/plugins/toolbar/default-toolbar.js +55 -11
  66. package/lib/plugins/toolbar/default-toolbar.js.map +1 -1
  67. package/lib/plugins/toolbar/done-button.js +1 -1
  68. package/lib/plugins/toolbar/done-button.js.map +1 -1
  69. package/lib/plugins/toolbar/editor-and-toolbar.js +186 -232
  70. package/lib/plugins/toolbar/editor-and-toolbar.js.map +1 -1
  71. package/lib/plugins/toolbar/index.js +1 -2
  72. package/lib/plugins/toolbar/index.js.map +1 -1
  73. package/lib/plugins/toolbar/toolbar-buttons.js +1 -1
  74. package/lib/plugins/toolbar/toolbar-buttons.js.map +1 -1
  75. package/lib/plugins/toolbar/toolbar.js +253 -239
  76. package/lib/plugins/toolbar/toolbar.js.map +1 -1
  77. package/lib/plugins/utils.js +27 -2
  78. package/lib/plugins/utils.js.map +1 -1
  79. package/lib/serialization.js +1 -1
  80. package/lib/serialization.js.map +1 -1
  81. package/lib/slate-editor.js +302 -0
  82. package/lib/test-serializer.js +189 -0
  83. package/lib/test-serializer.js.map +1 -0
  84. package/lib/theme.js +1 -1
  85. package/lib/theme.js.map +1 -1
  86. package/package.json +18 -14
  87. package/playground/image/data.js +20 -20
  88. package/playground/image/index.html +22 -20
  89. package/playground/image/index.jsx +12 -10
  90. package/playground/index.html +25 -23
  91. package/playground/mathquill/index.html +23 -20
  92. package/playground/mathquill/index.jsx +18 -22
  93. package/playground/prod-test/index.html +24 -20
  94. package/playground/prod-test/index.jsx +5 -3
  95. package/playground/schema-override/data.js +10 -10
  96. package/playground/schema-override/image-plugin.jsx +3 -4
  97. package/playground/schema-override/index.html +21 -19
  98. package/playground/schema-override/index.jsx +13 -14
  99. package/playground/serialization/data.js +10 -10
  100. package/playground/serialization/image-plugin.jsx +3 -4
  101. package/playground/serialization/index.html +22 -20
  102. package/playground/table-examples.html +5 -8
  103. package/playground/webpack.config.js +10 -10
  104. package/src/components.js +135 -0
  105. package/src/editor.jsx +478 -141
  106. package/src/index.jsx +71 -95
  107. package/src/new-serialization.jsx +291 -0
  108. package/src/parse-html.js +1 -1
  109. package/src/plugins/characters/custom-popper.js +7 -7
  110. package/src/plugins/characters/index.jsx +33 -34
  111. package/src/plugins/characters/utils.js +81 -81
  112. package/src/plugins/hotKeys/index.js +54 -0
  113. package/src/plugins/image/alt-dialog.jsx +4 -5
  114. package/src/plugins/image/component.jsx +106 -89
  115. package/src/plugins/image/image-toolbar.jsx +27 -19
  116. package/src/plugins/image/index.jsx +75 -43
  117. package/src/plugins/image/insert-image-handler.js +62 -27
  118. package/src/plugins/index.jsx +23 -41
  119. package/src/plugins/list/index.jsx +70 -95
  120. package/src/plugins/math/index.jsx +102 -82
  121. package/src/plugins/media/index.jsx +159 -124
  122. package/src/plugins/media/media-dialog.js +98 -71
  123. package/src/plugins/media/media-toolbar.jsx +8 -8
  124. package/src/plugins/media/media-wrapper.jsx +29 -30
  125. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +21 -19
  126. package/src/plugins/respArea/drag-in-the-blank/index.jsx +14 -11
  127. package/src/plugins/respArea/explicit-constructed-response/index.jsx +7 -6
  128. package/src/plugins/respArea/icons/index.jsx +11 -14
  129. package/src/plugins/respArea/index.jsx +92 -52
  130. package/src/plugins/respArea/inline-dropdown/index.jsx +9 -8
  131. package/src/plugins/respArea/utils.jsx +26 -35
  132. package/src/plugins/table/icons/index.jsx +17 -11
  133. package/src/plugins/table/index.jsx +288 -231
  134. package/src/plugins/table/table-toolbar.jsx +15 -11
  135. package/src/plugins/toolbar/default-toolbar.jsx +65 -19
  136. package/src/plugins/toolbar/done-button.jsx +4 -4
  137. package/src/plugins/toolbar/editor-and-toolbar.jsx +150 -145
  138. package/src/plugins/toolbar/index.jsx +2 -3
  139. package/src/plugins/toolbar/toolbar-buttons.jsx +11 -11
  140. package/src/plugins/toolbar/toolbar.jsx +244 -221
  141. package/src/plugins/utils.js +21 -4
  142. package/src/serialization.jsx +32 -32
  143. package/src/test-serializer.js +139 -0
  144. package/src/test-serializer.js.rej +20 -0
@@ -5,16 +5,18 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.serialization = exports.reactAttributes = exports.parseStyleString = exports.moveFocusToBeginningOfTable = exports["default"] = void 0;
8
+ exports.serialization = exports.reactAttributes = exports.parseStyleString = exports["default"] = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
12
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
12
16
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
17
 
14
18
  var _react = _interopRequireDefault(require("react"));
15
19
 
16
- var _slateEditTable = _interopRequireDefault(require("slate-edit-table"));
17
-
18
20
  var _slate = require("slate");
19
21
 
20
22
  var _debug = _interopRequireDefault(require("debug"));
@@ -25,43 +27,57 @@ var _tableToolbar = _interopRequireDefault(require("./table-toolbar"));
25
27
 
26
28
  var _propTypes = _interopRequireDefault(require("prop-types"));
27
29
 
28
- var _slatePropTypes = _interopRequireDefault(require("slate-prop-types"));
30
+ var _slateHyperscript = require("slate-hyperscript");
29
31
 
30
- var _styles = require("@material-ui/core/styles");
32
+ var _styles = require("@material-ui/styles");
31
33
 
32
34
  var _reactAttrConverter = _interopRequireDefault(require("react-attr-converter"));
33
35
 
34
36
  var _toStyle = require("to-style");
35
37
 
38
+ var _get = _interopRequireDefault(require("lodash/get"));
39
+
40
+ var _omit = _interopRequireDefault(require("lodash/omit"));
41
+
42
+ var _reduce = _interopRequireDefault(require("lodash/reduce"));
43
+
36
44
  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; }
37
45
 
38
46
  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; }
39
47
 
48
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
49
+
50
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
51
+
52
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
53
+
40
54
  var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:table');
41
- var Table = (0, _styles.withStyles)(function () {
42
- return {
43
- table: {}
44
- };
45
- })(function (props) {
46
- var nodeAttributes = dataToAttributes(props.node.data);
47
- return /*#__PURE__*/_react["default"].createElement("table", (0, _extends2["default"])({
48
- className: props.classes.table
49
- }, props.attributes, nodeAttributes, {
55
+
56
+ var Table = /*#__PURE__*/_react["default"].forwardRef(function (props) {
57
+ var nodeAttributes = (0, _omit["default"])(dataToAttributes(props.element.data), 'newTable');
58
+ var attrs = (0, _omit["default"])(props.attributes, 'newTable');
59
+ return /*#__PURE__*/_react["default"].createElement("table", (0, _extends2["default"])({}, attrs, nodeAttributes, {
50
60
  onFocus: props.onFocus,
51
61
  onBlur: props.onBlur
52
- }), /*#__PURE__*/_react["default"].createElement("tbody", null, props.children));
62
+ }), props.children);
53
63
  });
64
+
54
65
  Table.propTypes = {
55
66
  attributes: _propTypes["default"].object,
67
+ element: _propTypes["default"].object,
56
68
  onFocus: _propTypes["default"].func,
57
69
  onBlur: _propTypes["default"].func,
58
- node: _slatePropTypes["default"].node,
70
+ node: _propTypes["default"].shape({
71
+ type: _propTypes["default"].string,
72
+ children: _propTypes["default"].array,
73
+ data: _propTypes["default"].object
74
+ }),
59
75
  children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired
60
76
  };
61
77
 
62
- var TableRow = function TableRow(props) {
78
+ var TableRow = /*#__PURE__*/_react["default"].forwardRef(function (props) {
63
79
  return /*#__PURE__*/_react["default"].createElement("tr", props.attributes, props.children);
64
- };
80
+ });
65
81
 
66
82
  TableRow.propTypes = {
67
83
  attributes: _propTypes["default"].object,
@@ -69,163 +85,377 @@ TableRow.propTypes = {
69
85
  onBlur: _propTypes["default"].func,
70
86
  children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired
71
87
  };
72
- var TableCell = (0, _styles.withStyles)(function () {
73
- return {
74
- td: {
75
- minWidth: '25px'
76
- }
77
- };
78
- })(function (props) {
79
- var Tag = props.node.data.get('header') ? 'th' : 'td';
80
- var nodeAttributes = dataToAttributes(props.node.data);
88
+
89
+ var TableBody = /*#__PURE__*/_react["default"].forwardRef(function (props) {
90
+ return /*#__PURE__*/_react["default"].createElement("tbody", props.attributes, props.children);
91
+ });
92
+
93
+ TableBody.propTypes = {
94
+ attributes: _propTypes["default"].object,
95
+ onFocus: _propTypes["default"].func,
96
+ onBlur: _propTypes["default"].func,
97
+ children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired
98
+ };
99
+ var useCellStyles = (0, _styles.makeStyles)({
100
+ td: {
101
+ minWidth: '25px'
102
+ }
103
+ });
104
+
105
+ var TableCell = /*#__PURE__*/_react["default"].forwardRef(function (props) {
106
+ var classes = useCellStyles();
107
+ var node = props.node;
108
+ var Tag = (0, _get["default"])(node, 'data.header') ? 'th' : 'td';
109
+ var nodeAttributes = dataToAttributes(props.element.data);
81
110
  delete nodeAttributes.header;
82
111
  return /*#__PURE__*/_react["default"].createElement(Tag, (0, _extends2["default"])({}, props.attributes, nodeAttributes, {
83
- colSpan: props.node.data.get('colspan'),
84
- className: props.classes[Tag],
112
+ colSpan: (0, _get["default"])(node, 'data.colspan'),
113
+ className: classes[Tag],
85
114
  onFocus: props.onFocus,
86
115
  onBlur: props.onBlur
87
116
  }), props.children);
88
117
  });
118
+
89
119
  TableCell.propTypes = {
120
+ node: _propTypes["default"].object,
121
+ element: _propTypes["default"].object,
90
122
  attributes: _propTypes["default"].object,
91
123
  onFocus: _propTypes["default"].func,
92
124
  onBlur: _propTypes["default"].func,
93
125
  children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired
94
126
  };
95
127
 
96
- var moveFocusToBeginningOfTable = function moveFocusToBeginningOfTable(change) {
97
- var addedTable = change.value.document.findDescendant(function (d) {
98
- return !!d.data && !!d.data.get('newTable');
128
+ var getAncestorByType = function getAncestorByType(editor, type) {
129
+ if (!editor || !type) {
130
+ return null;
131
+ }
132
+
133
+ var ancestors = _slate.Node.ancestors(editor, _slate.Editor.path(editor, editor.selection), {
134
+ reverse: true
99
135
  });
100
136
 
101
- if (!addedTable) {
102
- return;
137
+ var _iterator = _createForOfIteratorHelper(ancestors),
138
+ _step;
139
+
140
+ try {
141
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
142
+ var _step$value = (0, _slicedToArray2["default"])(_step.value, 2),
143
+ ancestor = _step$value[0],
144
+ ancestorPath = _step$value[1];
145
+
146
+ if (ancestor.type === type) {
147
+ return [ancestor, ancestorPath];
148
+ }
149
+ }
150
+ } catch (err) {
151
+ _iterator.e(err);
152
+ } finally {
153
+ _iterator.f();
103
154
  }
104
155
 
105
- change.collapseToStartOf(addedTable);
106
- var update = addedTable.data.remove('newTable');
107
- change.setNodeByKey(addedTable.key, {
108
- data: update
109
- });
156
+ return null;
110
157
  };
111
158
 
112
- exports.moveFocusToBeginningOfTable = moveFocusToBeginningOfTable;
159
+ var moveToBeginningOfTable = function moveToBeginningOfTable(editor) {
160
+ var _getAncestorByType = getAncestorByType(editor, 'table'),
161
+ _getAncestorByType2 = (0, _slicedToArray2["default"])(_getAncestorByType, 2),
162
+ tableBlock = _getAncestorByType2[0],
163
+ tablePath = _getAncestorByType2[1];
164
+
165
+ var firstTdPath;
166
+
167
+ var _iterator2 = _createForOfIteratorHelper(_slate.Node.descendants(tableBlock, {
168
+ reverse: true
169
+ })),
170
+ _step2;
171
+
172
+ try {
173
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
174
+ var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
175
+ descendant = _step2$value[0],
176
+ descendantPath = _step2$value[1];
177
+
178
+ if (descendant.type === 'td') {
179
+ firstTdPath = descendantPath;
180
+ }
181
+ }
182
+ } catch (err) {
183
+ _iterator2.e(err);
184
+ } finally {
185
+ _iterator2.f();
186
+ }
187
+
188
+ _slate.Transforms.select(editor, [].concat((0, _toConsumableArray2["default"])(tablePath), (0, _toConsumableArray2["default"])(firstTdPath)));
189
+ };
190
+
191
+ var TABLE_TYPES = ['tbody', 'tr', 'td', 'table'];
113
192
 
114
193
  var _default = function _default(opts, toolbarPlugins
115
194
  /* : {toolbar: {}}[] */
116
195
  ) {
117
- var core = (0, _slateEditTable["default"])({
118
- typeContent: 'div'
119
- }); // fix outdated schema
120
-
121
- if (core.schema && core.schema.blocks) {
122
- Object.keys(core.schema.blocks).forEach(function (key) {
123
- var block = core.schema.blocks[key];
124
-
125
- if (block.parent) {
126
- if (block.nodes[0].types) {
127
- block.nodes[0] = {
128
- type: block.nodes[0].types[0]
129
- };
130
- }
196
+ var core = {
197
+ utils: {}
198
+ };
131
199
 
132
- if (block.nodes[0].objects) {
133
- block.nodes[0] = {
134
- object: block.nodes[0].objects[0]
135
- };
136
- }
200
+ core.utils.createTable = function () {
201
+ var row = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2;
202
+ var columns = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
203
+ var tableRows = [];
204
+ var rowLength = new Array(row).fill(0).length;
205
+ var columnsLength = new Array(columns).fill(0).length;
206
+
207
+ for (var i = 0; i < rowLength; i++) {
208
+ var tableRow = {
209
+ type: 'tr',
210
+ children: []
211
+ };
137
212
 
138
- block.parent = {
139
- type: block.parent.types[0]
140
- };
141
- } else {
142
- block.nodes[0] = {
143
- type: block.nodes[0].types[0]
144
- };
213
+ for (var j = 0; j < columnsLength; j++) {
214
+ tableRow.children.push({
215
+ type: 'td',
216
+ children: [{
217
+ text: ''
218
+ }]
219
+ });
145
220
  }
146
- });
147
- }
148
221
 
149
- core.utils.getTableBlock = function (containerNode, key) {
150
- var node = containerNode.getDescendant(key);
151
- var ancestors = containerNode.getAncestors(key).push(node);
152
- return ancestors.findLast(function (p) {
153
- return p.type === 'table';
154
- });
222
+ tableRows.push(tableRow);
223
+ }
224
+
225
+ return {
226
+ type: 'table',
227
+ children: [{
228
+ type: 'tbody',
229
+ children: tableRows
230
+ }]
231
+ };
232
+ };
233
+
234
+ core.utils.getTableBlock = function (editor) {
235
+ return getAncestorByType(editor, 'table');
236
+ };
237
+
238
+ core.utils.isSelectionInTable = function (editor) {
239
+ return !!core.utils.getTableBlock(editor);
155
240
  };
156
241
 
157
242
  core.utils.createTableWithOptions = function (row, columns, extra) {
158
243
  var createdTable = core.utils.createTable(row, columns);
159
244
 
160
- var newTable = _slate.Block.create(_objectSpread(_objectSpread({}, createdTable.toJSON()), extra));
245
+ var newTable = _objectSpread(_objectSpread({}, createdTable), extra);
161
246
 
162
247
  return newTable;
163
248
  };
164
249
 
165
250
  core.toolbar = {
166
251
  icon: /*#__PURE__*/_react["default"].createElement(_GridOn["default"], null),
167
- onClick: function onClick(value, onChange) {
252
+ onClick: function onClick(editor) {
168
253
  log('insert table');
169
- var change = value.change();
170
254
  var newTable = core.utils.createTableWithOptions(2, 2, {
171
255
  data: {
172
256
  border: '1',
173
257
  newTable: true
174
258
  }
175
259
  });
176
- change.insertBlock(newTable);
177
- moveFocusToBeginningOfTable(change);
178
- onChange(change);
179
- },
180
- supports: function supports(node, value) {
181
- return node && node.object === 'block' && core.utils.isSelectionInTable(value);
260
+ editor.insertNode(newTable);
261
+ moveToBeginningOfTable(editor, newTable);
182
262
  },
183
263
 
184
264
  /**
185
265
  * Note - the node may not be a table node - it may be a node inside a table.
186
266
  */
187
- customToolbar: function customToolbar(node, value, onToolbarDone) {
267
+ customToolbar: function customToolbar(node, value, editor, onToolbarDone) {
188
268
  log('[customToolbar] node.data: ', node.data);
189
- var tableBlock = core.utils.getTableBlock(value.document, node === null || node === void 0 ? void 0 : node.key);
269
+
270
+ var _core$utils$getTableB = core.utils.getTableBlock(editor),
271
+ _core$utils$getTableB2 = (0, _slicedToArray2["default"])(_core$utils$getTableB, 1),
272
+ tableBlock = _core$utils$getTableB2[0];
273
+
190
274
  log('[customToolbar] tableBlock: ', tableBlock);
191
275
 
192
276
  var hasBorder = function hasBorder() {
193
- return tableBlock.data.get('border') && tableBlock.data.get('border') !== '0';
277
+ return (0, _get["default"])(tableBlock, 'data.border') !== '0';
194
278
  };
195
279
 
196
280
  var addRow = function addRow() {
197
- var change = core.changes.insertRow(value.change());
198
- onToolbarDone(change, false);
199
- };
281
+ var _getAncestorByType3 = getAncestorByType(editor, 'tr'),
282
+ _getAncestorByType4 = (0, _slicedToArray2["default"])(_getAncestorByType3, 2),
283
+ trNode = _getAncestorByType4[0],
284
+ trPath = _getAncestorByType4[1];
200
285
 
201
- var addColumn = function addColumn() {
202
- var change = core.changes.insertColumn(value.change());
203
- onToolbarDone(change, false);
286
+ log('[addRow]');
287
+
288
+ if (trNode) {
289
+ var newTr = {
290
+ type: 'tr',
291
+ children: []
292
+ };
293
+ var columnsLength = trNode.children.length;
294
+
295
+ for (var i = 0; i < columnsLength; i++) {
296
+ newTr.children.push({
297
+ type: 'td',
298
+ children: [{
299
+ text: ''
300
+ }]
301
+ });
302
+ }
303
+
304
+ _slate.Transforms.insertNodes(editor, [newTr], {
305
+ at: trPath
306
+ });
307
+ }
204
308
  };
205
309
 
206
310
  var removeRow = function removeRow() {
207
- var change = core.changes.removeRow(value.change());
208
- onToolbarDone(change, false);
311
+ var _getAncestorByType5 = getAncestorByType(editor, 'tbody'),
312
+ _getAncestorByType6 = (0, _slicedToArray2["default"])(_getAncestorByType5, 2),
313
+ tBodyNode = _getAncestorByType6[0],
314
+ tBodyPath = _getAncestorByType6[1];
315
+
316
+ log('[removeRow]');
317
+
318
+ if (tBodyPath) {
319
+ if (tBodyNode.children.length > 1) {
320
+ var _getAncestorByType7 = getAncestorByType(editor, 'tr'),
321
+ _getAncestorByType8 = (0, _slicedToArray2["default"])(_getAncestorByType7, 2),
322
+ trPath = _getAncestorByType8[1];
323
+
324
+ log('[removeRow]');
325
+
326
+ if (trPath) {
327
+ _slate.Transforms.removeNodes(editor, {
328
+ at: trPath
329
+ });
330
+ }
331
+ }
332
+ }
333
+ };
334
+
335
+ var addColumn = function addColumn() {
336
+ var _getAncestorByType9 = getAncestorByType(editor, 'tbody'),
337
+ _getAncestorByType10 = (0, _slicedToArray2["default"])(_getAncestorByType9, 2),
338
+ tBodyNode = _getAncestorByType10[0],
339
+ tBodyPath = _getAncestorByType10[1];
340
+
341
+ log('[addColumn]');
342
+
343
+ if (tBodyNode) {
344
+ var emptyTd = {
345
+ type: 'td',
346
+ children: [{
347
+ text: ''
348
+ }]
349
+ };
350
+
351
+ var trElements = _slate.Editor.nodes(editor, {
352
+ at: tBodyPath,
353
+ // Path of Editor
354
+ match: function match(node) {
355
+ return 'tr' === node.type;
356
+ }
357
+ });
358
+
359
+ var _iterator3 = _createForOfIteratorHelper(trElements),
360
+ _step3;
361
+
362
+ try {
363
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
364
+ var _step3$value = (0, _slicedToArray2["default"])(_step3.value, 2),
365
+ trNode = _step3$value[0],
366
+ nodePath = _step3$value[1];
367
+
368
+ _slate.Transforms.insertNodes(editor, [emptyTd], {
369
+ at: [].concat((0, _toConsumableArray2["default"])(nodePath), [trNode.children.length])
370
+ });
371
+ }
372
+ } catch (err) {
373
+ _iterator3.e(err);
374
+ } finally {
375
+ _iterator3.f();
376
+ }
377
+ }
209
378
  };
210
379
 
211
380
  var removeColumn = function removeColumn() {
212
- var change = core.changes.removeColumn(value.change());
213
- onToolbarDone(change, false);
381
+ var _getAncestorByType11 = getAncestorByType(editor, 'tbody'),
382
+ _getAncestorByType12 = (0, _slicedToArray2["default"])(_getAncestorByType11, 2),
383
+ tBodyNode = _getAncestorByType12[0],
384
+ tBodyPath = _getAncestorByType12[1];
385
+
386
+ log('[addColumn]');
387
+
388
+ if (tBodyNode) {
389
+ var currentPath = _slate.Editor.path(editor, editor.selection);
390
+
391
+ var columnIndex = currentPath[currentPath.length - 2];
392
+
393
+ var trElements = _slate.Editor.nodes(editor, {
394
+ at: tBodyPath,
395
+ // Path of Editor
396
+ match: function match(node) {
397
+ return 'tr' === node.type;
398
+ }
399
+ });
400
+
401
+ var _iterator4 = _createForOfIteratorHelper(trElements),
402
+ _step4;
403
+
404
+ try {
405
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
406
+ var _step4$value = (0, _slicedToArray2["default"])(_step4.value, 2),
407
+ trNode = _step4$value[0],
408
+ nodePath = _step4$value[1];
409
+
410
+ if (trNode.children.length > 1) {
411
+ _slate.Transforms.removeNodes(editor, {
412
+ at: [].concat((0, _toConsumableArray2["default"])(nodePath), [columnIndex])
413
+ });
414
+ }
415
+ }
416
+ } catch (err) {
417
+ _iterator4.e(err);
418
+ } finally {
419
+ _iterator4.f();
420
+ }
421
+ }
214
422
  };
215
423
 
216
424
  var removeTable = function removeTable() {
217
- var change = core.changes.removeTable(value.change());
218
- onToolbarDone(change, false);
425
+ var _getAncestorByType13 = getAncestorByType(editor, 'table'),
426
+ _getAncestorByType14 = (0, _slicedToArray2["default"])(_getAncestorByType13, 2),
427
+ tableNode = _getAncestorByType14[0],
428
+ tablePath = _getAncestorByType14[1];
429
+
430
+ editor.apply({
431
+ type: 'remove_node',
432
+ path: tablePath,
433
+ node: tableNode
434
+ });
219
435
  };
220
436
 
221
437
  var toggleBorder = function toggleBorder() {
222
438
  var data = tableBlock.data;
223
- var update = data.set('border', hasBorder() ? '0' : '1');
439
+
440
+ var update = _objectSpread(_objectSpread({}, data), {}, {
441
+ border: hasBorder() ? '0' : '1'
442
+ });
443
+
444
+ var _getAncestorByType15 = getAncestorByType(editor, 'table'),
445
+ _getAncestorByType16 = (0, _slicedToArray2["default"])(_getAncestorByType15, 2),
446
+ tablePath = _getAncestorByType16[1];
447
+
224
448
  log('[toggleBorder] update: ', update);
225
- var change = value.change().setNodeByKey(tableBlock.key, {
226
- data: update
449
+ editor.apply({
450
+ type: 'set_node',
451
+ path: tablePath,
452
+ properties: {
453
+ data: node.data
454
+ },
455
+ newProperties: {
456
+ data: update
457
+ }
227
458
  });
228
- onToolbarDone(change, false);
229
459
  };
230
460
 
231
461
  var onDone = function onDone() {
@@ -235,11 +465,11 @@ var _default = function _default(opts, toolbarPlugins
235
465
 
236
466
  var Tb = function Tb() {
237
467
  return /*#__PURE__*/_react["default"].createElement(_tableToolbar["default"], {
468
+ editor: editor,
238
469
  plugins: toolbarPlugins,
239
470
  onChange: function onChange(c) {
240
471
  return onToolbarDone(c, false);
241
472
  },
242
- value: value,
243
473
  onAddRow: addRow,
244
474
  onRemoveRow: removeRow,
245
475
  onAddColumn: addColumn,
@@ -255,6 +485,10 @@ var _default = function _default(opts, toolbarPlugins
255
485
  }
256
486
  };
257
487
 
488
+ core.supports = function (node, editor) {
489
+ return TABLE_TYPES.includes(node.type);
490
+ };
491
+
258
492
  var Node = function Node(props) {
259
493
  switch (props.node.type) {
260
494
  case 'table':
@@ -263,10 +497,16 @@ var _default = function _default(opts, toolbarPlugins
263
497
  onBlur: opts.onBlur
264
498
  }));
265
499
 
266
- case 'table_row':
500
+ case 'tbody':
501
+ return /*#__PURE__*/_react["default"].createElement(TableBody, (0, _extends2["default"])({}, props, {
502
+ onFocus: opts.onFocus,
503
+ onBlur: opts.onBlur
504
+ }));
505
+
506
+ case 'tr':
267
507
  return /*#__PURE__*/_react["default"].createElement(TableRow, props);
268
508
 
269
- case 'table_cell':
509
+ case 'td':
270
510
  return /*#__PURE__*/_react["default"].createElement(TableCell, (0, _extends2["default"])({}, props, {
271
511
  onFocus: opts.onFocus,
272
512
  onBlur: opts.onBlur
@@ -280,74 +520,6 @@ var _default = function _default(opts, toolbarPlugins
280
520
  Node.propTypes = {
281
521
  node: _propTypes["default"].object
282
522
  };
283
-
284
- core.normalizeNode = function (node) {
285
- if (node.object !== 'document') {
286
- return;
287
- }
288
-
289
- var tableAdded = node.findDescendant(function (d) {
290
- return d.data && d.data.get('newTable');
291
- });
292
-
293
- if (!tableAdded) {
294
- return;
295
- }
296
-
297
- var nodeToSearch = node.getParent(tableAdded.key) || node;
298
- var shouldAddTextAfterNode = false;
299
- var indexToNotHaveTableOn = nodeToSearch.nodes.size - 1;
300
- var indexOfLastTable = nodeToSearch.nodes.findLastIndex(function (d) {
301
- return d.type === 'table';
302
- }); // if the last table in the document is of type table, we need to do the change
303
-
304
- if (indexOfLastTable === indexToNotHaveTableOn) {
305
- shouldAddTextAfterNode = true;
306
- }
307
-
308
- if (!shouldAddTextAfterNode) {
309
- return;
310
- }
311
-
312
- return function (change) {
313
- if (shouldAddTextAfterNode) {
314
- var tableJSON = tableAdded.toJSON(); // we remove the table node because otherwise we can't add the empty block after it
315
- // we need a block that contains text in order to do it
316
-
317
- change.removeNodeByKey(tableAdded.key);
318
-
319
- var newBlock = _slate.Block.create({
320
- object: 'block',
321
- type: 'div'
322
- }); // we add an empty block but that it's going to be normalized
323
- // because it will add the empty text to it like it should
324
-
325
-
326
- change.insertBlock(newBlock);
327
- change.withoutNormalization(function () {
328
- // we do these changes without normalization
329
- // we get the text previous to the new block added
330
- var prevText = change.value.document.getPreviousText(newBlock.key);
331
-
332
- if (prevText) {
333
- var _prevText$text, _prevText$text2;
334
-
335
- // we move focus to the previous text
336
- change.moveFocusTo(prevText.key, (_prevText$text = prevText.text) === null || _prevText$text === void 0 ? void 0 : _prevText$text.length).moveAnchorTo(prevText.key, (_prevText$text2 = prevText.text) === null || _prevText$text2 === void 0 ? void 0 : _prevText$text2.length);
337
- } // we insert the table block between the first block with text and the last block with text
338
-
339
-
340
- change.insertBlock(_objectSpread(_objectSpread({}, tableJSON), {}, {
341
- data: _objectSpread(_objectSpread({}, tableJSON.data), {}, {
342
- newTable: true
343
- })
344
- }));
345
- moveFocusToBeginningOfTable(change);
346
- });
347
- }
348
- };
349
- };
350
-
351
523
  core.renderNode = Node;
352
524
  return core;
353
525
  };
@@ -396,11 +568,7 @@ var attributesToMap = function attributesToMap(el) {
396
568
  };
397
569
 
398
570
  var dataToAttributes = function dataToAttributes(data) {
399
- if (!data || !data.get) {
400
- return {};
401
- }
402
-
403
- return data.reduce(function (acc, v, name) {
571
+ return (0, _reduce["default"])(data, function (acc, v, name) {
404
572
  if (v) {
405
573
  acc[(0, _reactAttrConverter["default"])(name)] = v;
406
574
  }
@@ -420,80 +588,81 @@ var serialization = {
420
588
  {
421
589
  var children = el.children.length === 1 && el.children[0].tagName.toLowerCase() === 'tbody' ? el.children[0].children : el.children;
422
590
  var c = Array.from(children);
423
- return {
424
- object: 'block',
591
+ return (0, _slateHyperscript.jsx)('element', {
425
592
  type: 'table',
426
- nodes: next(c),
427
593
  data: attributes.reduce(attributesToMap(el), {})
428
- };
594
+ }, next(c));
595
+ }
596
+
597
+ case 'tbody':
598
+ {
599
+ return (0, _slateHyperscript.jsx)('element', {
600
+ type: 'tbody'
601
+ }, next(el.childNodes));
429
602
  }
430
603
 
431
604
  case 'th':
432
605
  {
433
- return {
434
- object: 'block',
435
- type: 'table_cell',
436
- nodes: next(el.childNodes),
606
+ return (0, _slateHyperscript.jsx)('element', {
607
+ type: 'th',
437
608
  data: cellAttributes.reduce(attributesToMap(el), {
438
609
  header: true
439
610
  })
440
- };
611
+ }, next(el.childNodes));
441
612
  }
442
613
 
443
614
  case 'tr':
444
615
  {
445
- return {
446
- object: 'block',
447
- type: 'table_row',
448
- nodes: next(Array.from(el.children))
449
- };
616
+ return (0, _slateHyperscript.jsx)('element', {
617
+ type: 'tr'
618
+ }, next(Array.from(el.children)));
450
619
  }
451
620
 
452
621
  case 'td':
453
622
  {
454
- return {
455
- object: 'block',
456
- type: 'table_cell',
457
- nodes: next(Array.from(el.childNodes)),
623
+ return (0, _slateHyperscript.jsx)('element', {
624
+ type: 'td',
458
625
  data: cellAttributes.reduce(attributesToMap(el), {
459
- header: false
626
+ header: true
460
627
  })
461
- };
628
+ }, next(el.childNodes));
462
629
  }
463
630
  }
464
631
  },
465
632
  serialize: function serialize(object, children) {
466
- if (object.object !== 'block') {
467
- return;
468
- }
469
-
470
633
  switch (object.type) {
471
634
  case 'table':
472
635
  {
473
636
  var _attributes = dataToAttributes(object.data);
474
637
 
475
- return /*#__PURE__*/_react["default"].createElement("table", _attributes, /*#__PURE__*/_react["default"].createElement("tbody", null, children));
638
+ return /*#__PURE__*/_react["default"].createElement("table", _attributes, children);
639
+ }
640
+
641
+ case 'tbody':
642
+ {
643
+ return /*#__PURE__*/_react["default"].createElement("tbody", null, children);
476
644
  }
477
645
 
478
- case 'table_row':
646
+ case 'tr':
479
647
  {
480
648
  return /*#__PURE__*/_react["default"].createElement("tr", null, children);
481
649
  }
482
650
 
483
- case 'table_cell':
651
+ case 'td':
484
652
  {
485
653
  var _attributes2 = dataToAttributes(object.data);
486
654
 
487
- delete _attributes2.header;
655
+ return /*#__PURE__*/_react["default"].createElement("td", _attributes2, children);
656
+ }
488
657
 
489
- if (object.data.get('header')) {
490
- return /*#__PURE__*/_react["default"].createElement("th", _attributes2, children);
491
- } else {
492
- return /*#__PURE__*/_react["default"].createElement("td", _attributes2, children);
493
- }
658
+ case 'th':
659
+ {
660
+ var _attributes3 = dataToAttributes(object.data);
661
+
662
+ return /*#__PURE__*/_react["default"].createElement("th", _attributes3, children);
494
663
  }
495
664
  }
496
665
  }
497
666
  };
498
667
  exports.serialization = serialization;
499
- //# sourceMappingURL=index.js.map
668
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJkZWJ1ZyIsIlRhYmxlIiwiUmVhY3QiLCJmb3J3YXJkUmVmIiwicHJvcHMiLCJub2RlQXR0cmlidXRlcyIsIm9taXQiLCJkYXRhVG9BdHRyaWJ1dGVzIiwiZWxlbWVudCIsImRhdGEiLCJhdHRycyIsImF0dHJpYnV0ZXMiLCJvbkZvY3VzIiwib25CbHVyIiwiY2hpbGRyZW4iLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJmdW5jIiwibm9kZSIsInNoYXBlIiwidHlwZSIsInN0cmluZyIsImFycmF5Iiwib25lT2ZUeXBlIiwiYXJyYXlPZiIsImlzUmVxdWlyZWQiLCJUYWJsZVJvdyIsIlRhYmxlQm9keSIsInVzZUNlbGxTdHlsZXMiLCJtYWtlU3R5bGVzIiwidGQiLCJtaW5XaWR0aCIsIlRhYmxlQ2VsbCIsImNsYXNzZXMiLCJUYWciLCJnZXQiLCJoZWFkZXIiLCJnZXRBbmNlc3RvckJ5VHlwZSIsImVkaXRvciIsImFuY2VzdG9ycyIsIlNsYXRlTm9kZSIsIkVkaXRvciIsInBhdGgiLCJzZWxlY3Rpb24iLCJyZXZlcnNlIiwiYW5jZXN0b3IiLCJhbmNlc3RvclBhdGgiLCJtb3ZlVG9CZWdpbm5pbmdPZlRhYmxlIiwidGFibGVCbG9jayIsInRhYmxlUGF0aCIsImZpcnN0VGRQYXRoIiwiZGVzY2VuZGFudHMiLCJkZXNjZW5kYW50IiwiZGVzY2VuZGFudFBhdGgiLCJUcmFuc2Zvcm1zIiwic2VsZWN0IiwiVEFCTEVfVFlQRVMiLCJvcHRzIiwidG9vbGJhclBsdWdpbnMiLCJjb3JlIiwidXRpbHMiLCJjcmVhdGVUYWJsZSIsInJvdyIsImNvbHVtbnMiLCJ0YWJsZVJvd3MiLCJyb3dMZW5ndGgiLCJBcnJheSIsImZpbGwiLCJsZW5ndGgiLCJjb2x1bW5zTGVuZ3RoIiwiaSIsInRhYmxlUm93IiwiaiIsInB1c2giLCJ0ZXh0IiwiZ2V0VGFibGVCbG9jayIsImlzU2VsZWN0aW9uSW5UYWJsZSIsImNyZWF0ZVRhYmxlV2l0aE9wdGlvbnMiLCJleHRyYSIsImNyZWF0ZWRUYWJsZSIsIm5ld1RhYmxlIiwidG9vbGJhciIsImljb24iLCJvbkNsaWNrIiwiYm9yZGVyIiwiaW5zZXJ0Tm9kZSIsImN1c3RvbVRvb2xiYXIiLCJ2YWx1ZSIsIm9uVG9vbGJhckRvbmUiLCJoYXNCb3JkZXIiLCJhZGRSb3ciLCJ0ck5vZGUiLCJ0clBhdGgiLCJuZXdUciIsImluc2VydE5vZGVzIiwiYXQiLCJyZW1vdmVSb3ciLCJ0Qm9keU5vZGUiLCJ0Qm9keVBhdGgiLCJyZW1vdmVOb2RlcyIsImFkZENvbHVtbiIsImVtcHR5VGQiLCJ0ckVsZW1lbnRzIiwibm9kZXMiLCJtYXRjaCIsIm5vZGVQYXRoIiwicmVtb3ZlQ29sdW1uIiwiY3VycmVudFBhdGgiLCJjb2x1bW5JbmRleCIsInJlbW92ZVRhYmxlIiwidGFibGVOb2RlIiwiYXBwbHkiLCJ0b2dnbGVCb3JkZXIiLCJ1cGRhdGUiLCJwcm9wZXJ0aWVzIiwibmV3UHJvcGVydGllcyIsIm9uRG9uZSIsIlRiIiwiYyIsInN1cHBvcnRzIiwiaW5jbHVkZXMiLCJOb2RlIiwicmVuZGVyTm9kZSIsInBhcnNlU3R5bGVTdHJpbmciLCJzIiwicmVnZXgiLCJyZXN1bHQiLCJleGVjIiwidHJpbSIsInJlYWN0QXR0cmlidXRlcyIsIm8iLCJ0b1N0eWxlT2JqZWN0IiwiY2FtZWxpemUiLCJhZGRVbml0cyIsImF0dHJpYnV0ZXNUb01hcCIsImVsIiwiYWNjIiwiYXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIiwic3R5bGVTdHJpbmciLCJyZWFjdFN0eWxlT2JqZWN0IiwicmVkdWNlIiwidiIsIm5hbWUiLCJjb252ZXJ0IiwiY2VsbEF0dHJpYnV0ZXMiLCJzZXJpYWxpemF0aW9uIiwiZGVzZXJpYWxpemUiLCJuZXh0IiwidGFnIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiZnJvbSIsImpzeCIsImNoaWxkTm9kZXMiLCJzZXJpYWxpemUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGx1Z2lucy90YWJsZS9pbmRleC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE5vZGUgYXMgU2xhdGVOb2RlLCBFZGl0b3IsIFRyYW5zZm9ybXMgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IEdyaWRPbiBmcm9tICdAbWF0ZXJpYWwtdWkvaWNvbnMvR3JpZE9uJztcbmltcG9ydCBUYWJsZVRvb2xiYXIgZnJvbSAnLi90YWJsZS10b29sYmFyJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBqc3ggfSBmcm9tICdzbGF0ZS1oeXBlcnNjcmlwdCc7XG5pbXBvcnQgeyBtYWtlU3R5bGVzIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3N0eWxlcyc7XG5pbXBvcnQgY29udmVydCBmcm9tICdyZWFjdC1hdHRyLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBvYmplY3QgYXMgdG9TdHlsZU9iamVjdCB9IGZyb20gJ3RvLXN0eWxlJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2dldCc7XG5pbXBvcnQgb21pdCBmcm9tICdsb2Rhc2gvb21pdCc7XG5pbXBvcnQgcmVkdWNlIGZyb20gJ2xvZGFzaC9yZWR1Y2UnO1xuXG5jb25zdCBsb2cgPSBkZWJ1ZygnQHBpZS1saWI6ZWRpdGFibGUtaHRtbDpwbHVnaW5zOnRhYmxlJyk7XG5cbmNvbnN0IFRhYmxlID0gUmVhY3QuZm9yd2FyZFJlZihwcm9wcyA9PiB7XG4gIGNvbnN0IG5vZGVBdHRyaWJ1dGVzID0gb21pdChkYXRhVG9BdHRyaWJ1dGVzKHByb3BzLmVsZW1lbnQuZGF0YSksICduZXdUYWJsZScpO1xuICBjb25zdCBhdHRycyA9IG9taXQocHJvcHMuYXR0cmlidXRlcywgJ25ld1RhYmxlJyk7XG5cbiAgcmV0dXJuIChcbiAgICA8dGFibGUgey4uLmF0dHJzfSB7Li4ubm9kZUF0dHJpYnV0ZXN9IG9uRm9jdXM9e3Byb3BzLm9uRm9jdXN9IG9uQmx1cj17cHJvcHMub25CbHVyfT5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L3RhYmxlPlxuICApO1xufSk7XG5cblRhYmxlLnByb3BUeXBlcyA9IHtcbiAgYXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgZWxlbWVudDogUHJvcFR5cGVzLm9iamVjdCxcbiAgb25Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gIG5vZGU6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmFycmF5LFxuICAgIGRhdGE6IFByb3BUeXBlcy5vYmplY3RcbiAgfSksXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubm9kZSksIFByb3BUeXBlcy5ub2RlXSkuaXNSZXF1aXJlZFxufTtcblxuY29uc3QgVGFibGVSb3cgPSBSZWFjdC5mb3J3YXJkUmVmKHByb3BzID0+IDx0ciB7Li4ucHJvcHMuYXR0cmlidXRlc30+e3Byb3BzLmNoaWxkcmVufTwvdHI+KTtcblxuVGFibGVSb3cucHJvcFR5cGVzID0ge1xuICBhdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5ub2RlKSwgUHJvcFR5cGVzLm5vZGVdKS5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBUYWJsZUJvZHkgPSBSZWFjdC5mb3J3YXJkUmVmKHByb3BzID0+IDx0Ym9keSB7Li4ucHJvcHMuYXR0cmlidXRlc30+e3Byb3BzLmNoaWxkcmVufTwvdGJvZHk+KTtcblxuVGFibGVCb2R5LnByb3BUeXBlcyA9IHtcbiAgYXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgb25Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubm9kZSksIFByb3BUeXBlcy5ub2RlXSkuaXNSZXF1aXJlZFxufTtcblxuY29uc3QgdXNlQ2VsbFN0eWxlcyA9IG1ha2VTdHlsZXMoe1xuICB0ZDoge1xuICAgIG1pbldpZHRoOiAnMjVweCdcbiAgfVxufSk7XG5cbmNvbnN0IFRhYmxlQ2VsbCA9IFJlYWN0LmZvcndhcmRSZWYocHJvcHMgPT4ge1xuICBjb25zdCBjbGFzc2VzID0gdXNlQ2VsbFN0eWxlcygpO1xuICBjb25zdCB7IG5vZGUgfSA9IHByb3BzO1xuICBjb25zdCBUYWcgPSBnZXQobm9kZSwgJ2RhdGEuaGVhZGVyJykgPyAndGgnIDogJ3RkJztcblxuICBjb25zdCBub2RlQXR0cmlidXRlcyA9IGRhdGFUb0F0dHJpYnV0ZXMocHJvcHMuZWxlbWVudC5kYXRhKTtcbiAgZGVsZXRlIG5vZGVBdHRyaWJ1dGVzLmhlYWRlcjtcblxuICByZXR1cm4gKFxuICAgIDxUYWdcbiAgICAgIHsuLi5wcm9wcy5hdHRyaWJ1dGVzfVxuICAgICAgey4uLm5vZGVBdHRyaWJ1dGVzfVxuICAgICAgY29sU3Bhbj17Z2V0KG5vZGUsICdkYXRhLmNvbHNwYW4nKX1cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlc1tUYWddfVxuICAgICAgb25Gb2N1cz17cHJvcHMub25Gb2N1c31cbiAgICAgIG9uQmx1cj17cHJvcHMub25CbHVyfVxuICAgID5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L1RhZz5cbiAgKTtcbn0pO1xuXG5UYWJsZUNlbGwucHJvcFR5cGVzID0ge1xuICBub2RlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBlbGVtZW50OiBQcm9wVHlwZXMub2JqZWN0LFxuICBhdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5ub2RlKSwgUHJvcFR5cGVzLm5vZGVdKS5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBnZXRBbmNlc3RvckJ5VHlwZSA9IChlZGl0b3IsIHR5cGUpID0+IHtcbiAgaWYgKCFlZGl0b3IgfHwgIXR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGFuY2VzdG9ycyA9IFNsYXRlTm9kZS5hbmNlc3RvcnMoZWRpdG9yLCBFZGl0b3IucGF0aChlZGl0b3IsIGVkaXRvci5zZWxlY3Rpb24pLCB7XG4gICAgcmV2ZXJzZTogdHJ1ZVxuICB9KTtcblxuICBmb3IgKGNvbnN0IFthbmNlc3RvciwgYW5jZXN0b3JQYXRoXSBvZiBhbmNlc3RvcnMpIHtcbiAgICBpZiAoYW5jZXN0b3IudHlwZSA9PT0gdHlwZSkge1xuICAgICAgcmV0dXJuIFthbmNlc3RvciwgYW5jZXN0b3JQYXRoXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IG1vdmVUb0JlZ2lubmluZ09mVGFibGUgPSBlZGl0b3IgPT4ge1xuICBjb25zdCBbdGFibGVCbG9jaywgdGFibGVQYXRoXSA9IGdldEFuY2VzdG9yQnlUeXBlKGVkaXRvciwgJ3RhYmxlJyk7XG4gIGxldCBmaXJzdFRkUGF0aDtcblxuICBmb3IgKGNvbnN0IFtkZXNjZW5kYW50LCBkZXNjZW5kYW50UGF0aF0gb2YgU2xhdGVOb2RlLmRlc2NlbmRhbnRzKHRhYmxlQmxvY2ssIHsgcmV2ZXJzZTogdHJ1ZSB9KSkge1xuICAgIGlmIChkZXNjZW5kYW50LnR5cGUgPT09ICd0ZCcpIHtcbiAgICAgIGZpcnN0VGRQYXRoID0gZGVzY2VuZGFudFBhdGg7XG4gICAgfVxuICB9XG5cbiAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBbLi4udGFibGVQYXRoLCAuLi5maXJzdFRkUGF0aF0pO1xufTtcblxuY29uc3QgVEFCTEVfVFlQRVMgPSBbJ3Rib2R5JywgJ3RyJywgJ3RkJywgJ3RhYmxlJ107XG5cbmV4cG9ydCBkZWZhdWx0IChvcHRzLCB0b29sYmFyUGx1Z2lucyAvKiA6ICB7dG9vbGJhcjoge319W10gKi8pID0+IHtcbiAgY29uc3QgY29yZSA9IHtcbiAgICB1dGlsczoge31cbiAgfTtcblxuICBjb3JlLnV0aWxzLmNyZWF0ZVRhYmxlID0gKHJvdyA9IDIsIGNvbHVtbnMgPSAyKSA9PiB7XG4gICAgY29uc3QgdGFibGVSb3dzID0gW107XG4gICAgY29uc3Qgcm93TGVuZ3RoID0gbmV3IEFycmF5KHJvdykuZmlsbCgwKS5sZW5ndGg7XG4gICAgY29uc3QgY29sdW1uc0xlbmd0aCA9IG5ldyBBcnJheShjb2x1bW5zKS5maWxsKDApLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93TGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRhYmxlUm93ID0geyB0eXBlOiAndHInLCBjaGlsZHJlbjogW10gfTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2x1bW5zTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdGFibGVSb3cuY2hpbGRyZW4ucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3RkJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXh0OiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRhYmxlUm93cy5wdXNoKHRhYmxlUm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAndGJvZHknLFxuICAgICAgICAgIGNoaWxkcmVuOiB0YWJsZVJvd3NcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG4gIH07XG5cbiAgY29yZS51dGlscy5nZXRUYWJsZUJsb2NrID0gZWRpdG9yID0+IGdldEFuY2VzdG9yQnlUeXBlKGVkaXRvciwgJ3RhYmxlJyk7XG5cbiAgY29yZS51dGlscy5pc1NlbGVjdGlvbkluVGFibGUgPSBlZGl0b3IgPT4gISFjb3JlLnV0aWxzLmdldFRhYmxlQmxvY2soZWRpdG9yKTtcblxuICBjb3JlLnV0aWxzLmNyZWF0ZVRhYmxlV2l0aE9wdGlvbnMgPSAocm93LCBjb2x1bW5zLCBleHRyYSkgPT4ge1xuICAgIGNvbnN0IGNyZWF0ZWRUYWJsZSA9IGNvcmUudXRpbHMuY3JlYXRlVGFibGUocm93LCBjb2x1bW5zKTtcbiAgICBjb25zdCBuZXdUYWJsZSA9IHsgLi4uY3JlYXRlZFRhYmxlLCAuLi5leHRyYSB9O1xuXG4gICAgcmV0dXJuIG5ld1RhYmxlO1xuICB9O1xuXG4gIGNvcmUudG9vbGJhciA9IHtcbiAgICBpY29uOiA8R3JpZE9uIC8+LFxuICAgIG9uQ2xpY2s6IGVkaXRvciA9PiB7XG4gICAgICBsb2coJ2luc2VydCB0YWJsZScpO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBjb3JlLnV0aWxzLmNyZWF0ZVRhYmxlV2l0aE9wdGlvbnMoMiwgMiwge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgYm9yZGVyOiAnMScsXG4gICAgICAgICAgbmV3VGFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGVkaXRvci5pbnNlcnROb2RlKG5ld1RhYmxlKTtcbiAgICAgIG1vdmVUb0JlZ2lubmluZ09mVGFibGUoZWRpdG9yLCBuZXdUYWJsZSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBOb3RlIC0gdGhlIG5vZGUgbWF5IG5vdCBiZSBhIHRhYmxlIG5vZGUgLSBpdCBtYXkgYmUgYSBub2RlIGluc2lkZSBhIHRhYmxlLlxuICAgICAqL1xuICAgIGN1c3RvbVRvb2xiYXI6IChub2RlLCB2YWx1ZSwgZWRpdG9yLCBvblRvb2xiYXJEb25lKSA9PiB7XG4gICAgICBsb2coJ1tjdXN0b21Ub29sYmFyXSBub2RlLmRhdGE6ICcsIG5vZGUuZGF0YSk7XG5cbiAgICAgIGNvbnN0IFt0YWJsZUJsb2NrXSA9IGNvcmUudXRpbHMuZ2V0VGFibGVCbG9jayhlZGl0b3IpO1xuICAgICAgbG9nKCdbY3VzdG9tVG9vbGJhcl0gdGFibGVCbG9jazogJywgdGFibGVCbG9jayk7XG5cbiAgICAgIGNvbnN0IGhhc0JvcmRlciA9ICgpID0+IGdldCh0YWJsZUJsb2NrLCAnZGF0YS5ib3JkZXInKSAhPT0gJzAnO1xuICAgICAgY29uc3QgYWRkUm93ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBbdHJOb2RlLCB0clBhdGhdID0gZ2V0QW5jZXN0b3JCeVR5cGUoZWRpdG9yLCAndHInKTtcblxuICAgICAgICBsb2coJ1thZGRSb3ddJyk7XG5cbiAgICAgICAgaWYgKHRyTm9kZSkge1xuICAgICAgICAgIGNvbnN0IG5ld1RyID0geyB0eXBlOiAndHInLCBjaGlsZHJlbjogW10gfTtcbiAgICAgICAgICBjb25zdCBjb2x1bW5zTGVuZ3RoID0gdHJOb2RlLmNoaWxkcmVuLmxlbmd0aDtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXdUci5jaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RkJyxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgVHJhbnNmb3Jtcy5pbnNlcnROb2RlcyhlZGl0b3IsIFtuZXdUcl0sIHsgYXQ6IHRyUGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVtb3ZlUm93ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBbdEJvZHlOb2RlLCB0Qm9keVBhdGhdID0gZ2V0QW5jZXN0b3JCeVR5cGUoZWRpdG9yLCAndGJvZHknKTtcblxuICAgICAgICBsb2coJ1tyZW1vdmVSb3ddJyk7XG5cbiAgICAgICAgaWYgKHRCb2R5UGF0aCkge1xuICAgICAgICAgIGlmICh0Qm9keU5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgWywgdHJQYXRoXSA9IGdldEFuY2VzdG9yQnlUeXBlKGVkaXRvciwgJ3RyJyk7XG5cbiAgICAgICAgICAgIGxvZygnW3JlbW92ZVJvd10nKTtcblxuICAgICAgICAgICAgaWYgKHRyUGF0aCkge1xuICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnJlbW92ZU5vZGVzKGVkaXRvciwgeyBhdDogdHJQYXRoIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgYWRkQ29sdW1uID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBbdEJvZHlOb2RlLCB0Qm9keVBhdGhdID0gZ2V0QW5jZXN0b3JCeVR5cGUoZWRpdG9yLCAndGJvZHknKTtcblxuICAgICAgICBsb2coJ1thZGRDb2x1bW5dJyk7XG5cbiAgICAgICAgaWYgKHRCb2R5Tm9kZSkge1xuICAgICAgICAgIGNvbnN0IGVtcHR5VGQgPSB7XG4gICAgICAgICAgICB0eXBlOiAndGQnLFxuICAgICAgICAgICAgY2hpbGRyZW46IFt7IHRleHQ6ICcnIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0ckVsZW1lbnRzID0gRWRpdG9yLm5vZGVzKGVkaXRvciwge1xuICAgICAgICAgICAgYXQ6IHRCb2R5UGF0aCwgLy8gUGF0aCBvZiBFZGl0b3JcbiAgICAgICAgICAgIG1hdGNoOiBub2RlID0+ICd0cicgPT09IG5vZGUudHlwZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBbdHJOb2RlLCBub2RlUGF0aF0gb2YgdHJFbGVtZW50cykge1xuICAgICAgICAgICAgVHJhbnNmb3Jtcy5pbnNlcnROb2RlcyhlZGl0b3IsIFtlbXB0eVRkXSwge1xuICAgICAgICAgICAgICBhdDogWy4uLm5vZGVQYXRoLCB0ck5vZGUuY2hpbGRyZW4ubGVuZ3RoXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZW1vdmVDb2x1bW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IFt0Qm9keU5vZGUsIHRCb2R5UGF0aF0gPSBnZXRBbmNlc3RvckJ5VHlwZShlZGl0b3IsICd0Ym9keScpO1xuXG4gICAgICAgIGxvZygnW2FkZENvbHVtbl0nKTtcblxuICAgICAgICBpZiAodEJvZHlOb2RlKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBFZGl0b3IucGF0aChlZGl0b3IsIGVkaXRvci5zZWxlY3Rpb24pO1xuICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMl07XG4gICAgICAgICAgY29uc3QgdHJFbGVtZW50cyA9IEVkaXRvci5ub2RlcyhlZGl0b3IsIHtcbiAgICAgICAgICAgIGF0OiB0Qm9keVBhdGgsIC8vIFBhdGggb2YgRWRpdG9yXG4gICAgICAgICAgICBtYXRjaDogbm9kZSA9PiAndHInID09PSBub2RlLnR5cGVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGZvciAoY29uc3QgW3RyTm9kZSwgbm9kZVBhdGhdIG9mIHRyRWxlbWVudHMpIHtcbiAgICAgICAgICAgIGlmICh0ck5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnJlbW92ZU5vZGVzKGVkaXRvciwgeyBhdDogWy4uLm5vZGVQYXRoLCBjb2x1bW5JbmRleF0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZW1vdmVUYWJsZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgW3RhYmxlTm9kZSwgdGFibGVQYXRoXSA9IGdldEFuY2VzdG9yQnlUeXBlKGVkaXRvciwgJ3RhYmxlJyk7XG5cbiAgICAgICAgZWRpdG9yLmFwcGx5KHtcbiAgICAgICAgICB0eXBlOiAncmVtb3ZlX25vZGUnLFxuICAgICAgICAgIHBhdGg6IHRhYmxlUGF0aCxcbiAgICAgICAgICBub2RlOiB0YWJsZU5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0b2dnbGVCb3JkZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gdGFibGVCbG9jaztcbiAgICAgICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgYm9yZGVyOiBoYXNCb3JkZXIoKSA/ICcwJyA6ICcxJ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBbLCB0YWJsZVBhdGhdID0gZ2V0QW5jZXN0b3JCeVR5cGUoZWRpdG9yLCAndGFibGUnKTtcblxuICAgICAgICBsb2coJ1t0b2dnbGVCb3JkZXJdIHVwZGF0ZTogJywgdXBkYXRlKTtcblxuICAgICAgICBlZGl0b3IuYXBwbHkoe1xuICAgICAgICAgIHR5cGU6ICdzZXRfbm9kZScsXG4gICAgICAgICAgcGF0aDogdGFibGVQYXRoLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGRhdGE6IG5vZGUuZGF0YVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmV3UHJvcGVydGllczogeyBkYXRhOiB1cGRhdGUgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpID0+IHtcbiAgICAgICAgbG9nKCdbb25Eb25lXSBjYWxsIG9uVG9vbGJhckRvbmUuLi4nKTtcbiAgICAgICAgb25Ub29sYmFyRG9uZShudWxsLCB0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IFRiID0gKCkgPT4gKFxuICAgICAgICA8VGFibGVUb29sYmFyXG4gICAgICAgICAgZWRpdG9yPXtlZGl0b3J9XG4gICAgICAgICAgcGx1Z2lucz17dG9vbGJhclBsdWdpbnN9XG4gICAgICAgICAgb25DaGFuZ2U9e2MgPT4gb25Ub29sYmFyRG9uZShjLCBmYWxzZSl9XG4gICAgICAgICAgb25BZGRSb3c9e2FkZFJvd31cbiAgICAgICAgICBvblJlbW92ZVJvdz17cmVtb3ZlUm93fVxuICAgICAgICAgIG9uQWRkQ29sdW1uPXthZGRDb2x1bW59XG4gICAgICAgICAgb25SZW1vdmVDb2x1bW49e3JlbW92ZUNvbHVtbn1cbiAgICAgICAgICBvblJlbW92ZVRhYmxlPXtyZW1vdmVUYWJsZX1cbiAgICAgICAgICBoYXNCb3JkZXI9e2hhc0JvcmRlcigpfVxuICAgICAgICAgIG9uVG9nZ2xlQm9yZGVyPXt0b2dnbGVCb3JkZXJ9XG4gICAgICAgICAgb25Eb25lPXtvbkRvbmV9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgICAgcmV0dXJuIFRiO1xuICAgIH1cbiAgfTtcblxuICBjb3JlLnN1cHBvcnRzID0gKG5vZGUsIGVkaXRvcikgPT4gVEFCTEVfVFlQRVMuaW5jbHVkZXMobm9kZS50eXBlKTtcblxuICBjb25zdCBOb2RlID0gcHJvcHMgPT4ge1xuICAgIHN3aXRjaCAocHJvcHMubm9kZS50eXBlKSB7XG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICAgIHJldHVybiA8VGFibGUgey4uLnByb3BzfSBvbkZvY3VzPXtvcHRzLm9uRm9jdXN9IG9uQmx1cj17b3B0cy5vbkJsdXJ9IC8+O1xuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgICByZXR1cm4gPFRhYmxlQm9keSB7Li4ucHJvcHN9IG9uRm9jdXM9e29wdHMub25Gb2N1c30gb25CbHVyPXtvcHRzLm9uQmx1cn0gLz47XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIHJldHVybiA8VGFibGVSb3cgey4uLnByb3BzfSAvPjtcbiAgICAgIGNhc2UgJ3RkJzpcbiAgICAgICAgcmV0dXJuIDxUYWJsZUNlbGwgey4uLnByb3BzfSBvbkZvY3VzPXtvcHRzLm9uRm9jdXN9IG9uQmx1cj17b3B0cy5vbkJsdXJ9IC8+O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuICBOb2RlLnByb3BUeXBlcyA9IHtcbiAgICBub2RlOiBQcm9wVHlwZXMub2JqZWN0XG4gIH07XG5cbiAgY29yZS5yZW5kZXJOb2RlID0gTm9kZTtcblxuICByZXR1cm4gY29yZTtcbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZVN0eWxlU3RyaW5nID0gcyA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gLyhbXFx3LV0qKVxccyo6XFxzKihbXjtdKikvZztcbiAgbGV0IG1hdGNoO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMocykpKSB7XG4gICAgcmVzdWx0W21hdGNoWzFdXSA9IG1hdGNoWzJdLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlYWN0QXR0cmlidXRlcyA9IG8gPT4gdG9TdHlsZU9iamVjdChvLCB7IGNhbWVsaXplOiB0cnVlLCBhZGRVbml0czogZmFsc2UgfSk7XG5cbmNvbnN0IGF0dHJpYnV0ZXNUb01hcCA9IGVsID0+IChhY2MsIGF0dHJpYnV0ZSkgPT4ge1xuICBjb25zdCB2YWx1ZSA9IGVsLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICBpZiAodmFsdWUpIHtcbiAgICBpZiAoYXR0cmlidXRlID09PSAnc3R5bGUnKSB7XG4gICAgICBjb25zdCBzdHlsZVN0cmluZyA9IGVsLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgY29uc3QgcmVhY3RTdHlsZU9iamVjdCA9IHJlYWN0QXR0cmlidXRlcyhwYXJzZVN0eWxlU3RyaW5nKHN0eWxlU3RyaW5nKSk7XG4gICAgICBhY2NbJ3N0eWxlJ10gPSByZWFjdFN0eWxlT2JqZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2NbYXR0cmlidXRlXSA9IGVsLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYWNjO1xufTtcblxuY29uc3QgZGF0YVRvQXR0cmlidXRlcyA9IGRhdGEgPT4ge1xuICByZXR1cm4gcmVkdWNlKFxuICAgIGRhdGEsXG4gICAgKGFjYywgdiwgbmFtZSkgPT4ge1xuICAgICAgaWYgKHYpIHtcbiAgICAgICAgYWNjW2NvbnZlcnQobmFtZSldID0gdjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fVxuICApO1xufTtcblxuY29uc3QgYXR0cmlidXRlcyA9IFsnYm9yZGVyJywgJ2NlbGxwYWRkaW5nJywgJ2NlbGxzcGFjaW5nJywgJ2NsYXNzJywgJ3N0eWxlJ107XG5cbmNvbnN0IGNlbGxBdHRyaWJ1dGVzID0gWydjb2xzcGFuJywgJ3Jvd3NwYW4nLCAnY2xhc3MnLCAnc3R5bGUnXTtcblxuZXhwb3J0IGNvbnN0IHNlcmlhbGl6YXRpb24gPSB7XG4gIGRlc2VyaWFsaXplKGVsLCBuZXh0KSB7XG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ3RhYmxlJzoge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9XG4gICAgICAgICAgZWwuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIGVsLmNoaWxkcmVuWzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3Rib2R5J1xuICAgICAgICAgICAgPyBlbC5jaGlsZHJlblswXS5jaGlsZHJlblxuICAgICAgICAgICAgOiBlbC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgYyA9IEFycmF5LmZyb20oY2hpbGRyZW4pO1xuXG4gICAgICAgIHJldHVybiBqc3goXG4gICAgICAgICAgJ2VsZW1lbnQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICAgICAgICBkYXRhOiBhdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7fSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5leHQoYylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Rib2R5Jzoge1xuICAgICAgICByZXR1cm4ganN4KFxuICAgICAgICAgICdlbGVtZW50JyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGJvZHknXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuZXh0KGVsLmNoaWxkTm9kZXMpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICd0aCc6IHtcbiAgICAgICAgcmV0dXJuIGpzeChcbiAgICAgICAgICAnZWxlbWVudCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ3RoJyxcbiAgICAgICAgICAgIGRhdGE6IGNlbGxBdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7IGhlYWRlcjogdHJ1ZSB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmV4dChlbC5jaGlsZE5vZGVzKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAndHInOiB7XG4gICAgICAgIHJldHVybiBqc3goXG4gICAgICAgICAgJ2VsZW1lbnQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0cidcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5leHQoQXJyYXkuZnJvbShlbC5jaGlsZHJlbikpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICd0ZCc6IHtcbiAgICAgICAgcmV0dXJuIGpzeChcbiAgICAgICAgICAnZWxlbWVudCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ3RkJyxcbiAgICAgICAgICAgIGRhdGE6IGNlbGxBdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7IGhlYWRlcjogdHJ1ZSB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmV4dChlbC5jaGlsZE5vZGVzKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2VyaWFsaXplKG9iamVjdCwgY2hpbGRyZW4pIHtcbiAgICBzd2l0Y2ggKG9iamVjdC50eXBlKSB7XG4gICAgICBjYXNlICd0YWJsZSc6IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGRhdGFUb0F0dHJpYnV0ZXMob2JqZWN0LmRhdGEpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDx0YWJsZSB7Li4uYXR0cmlidXRlc30+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Rib2R5Jzoge1xuICAgICAgICByZXR1cm4gPHRib2R5PntjaGlsZHJlbn08L3Rib2R5PjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RyJzoge1xuICAgICAgICByZXR1cm4gPHRyPntjaGlsZHJlbn08L3RyPjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RkJzoge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGF0YVRvQXR0cmlidXRlcyhvYmplY3QuZGF0YSk7XG4gICAgICAgIHJldHVybiA8dGQgey4uLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L3RkPjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RoJzoge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGF0YVRvQXR0cmlidXRlcyhvYmplY3QuZGF0YSk7XG4gICAgICAgIHJldHVybiA8dGggey4uLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L3RoPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLEdBQUcsR0FBRyxJQUFBQyxpQkFBQSxFQUFNLHNDQUFOLENBQVo7O0FBRUEsSUFBTUMsS0FBSyxnQkFBR0MsaUJBQUEsQ0FBTUMsVUFBTixDQUFpQixVQUFBQyxLQUFLLEVBQUk7RUFDdEMsSUFBTUMsY0FBYyxHQUFHLElBQUFDLGdCQUFBLEVBQUtDLGdCQUFnQixDQUFDSCxLQUFLLENBQUNJLE9BQU4sQ0FBY0MsSUFBZixDQUFyQixFQUEyQyxVQUEzQyxDQUF2QjtFQUNBLElBQU1DLEtBQUssR0FBRyxJQUFBSixnQkFBQSxFQUFLRixLQUFLLENBQUNPLFVBQVgsRUFBdUIsVUFBdkIsQ0FBZDtFQUVBLG9CQUNFLHVFQUFXRCxLQUFYLEVBQXNCTCxjQUF0QjtJQUFzQyxPQUFPLEVBQUVELEtBQUssQ0FBQ1EsT0FBckQ7SUFBOEQsTUFBTSxFQUFFUixLQUFLLENBQUNTO0VBQTVFLElBQ0dULEtBQUssQ0FBQ1UsUUFEVCxDQURGO0FBS0QsQ0FUYSxDQUFkOztBQVdBYixLQUFLLENBQUNjLFNBQU4sR0FBa0I7RUFDaEJKLFVBQVUsRUFBRUsscUJBQUEsQ0FBVUMsTUFETjtFQUVoQlQsT0FBTyxFQUFFUSxxQkFBQSxDQUFVQyxNQUZIO0VBR2hCTCxPQUFPLEVBQUVJLHFCQUFBLENBQVVFLElBSEg7RUFJaEJMLE1BQU0sRUFBRUcscUJBQUEsQ0FBVUUsSUFKRjtFQUtoQkMsSUFBSSxFQUFFSCxxQkFBQSxDQUFVSSxLQUFWLENBQWdCO0lBQ3BCQyxJQUFJLEVBQUVMLHFCQUFBLENBQVVNLE1BREk7SUFFcEJSLFFBQVEsRUFBRUUscUJBQUEsQ0FBVU8sS0FGQTtJQUdwQmQsSUFBSSxFQUFFTyxxQkFBQSxDQUFVQztFQUhJLENBQWhCLENBTFU7RUFVaEJILFFBQVEsRUFBRUUscUJBQUEsQ0FBVVEsU0FBVixDQUFvQixDQUFDUixxQkFBQSxDQUFVUyxPQUFWLENBQWtCVCxxQkFBQSxDQUFVRyxJQUE1QixDQUFELEVBQW9DSCxxQkFBQSxDQUFVRyxJQUE5QyxDQUFwQixFQUF5RU87QUFWbkUsQ0FBbEI7O0FBYUEsSUFBTUMsUUFBUSxnQkFBR3pCLGlCQUFBLENBQU1DLFVBQU4sQ0FBaUIsVUFBQUMsS0FBSztFQUFBLG9CQUFJLHNDQUFRQSxLQUFLLENBQUNPLFVBQWQsRUFBMkJQLEtBQUssQ0FBQ1UsUUFBakMsQ0FBSjtBQUFBLENBQXRCLENBQWpCOztBQUVBYSxRQUFRLENBQUNaLFNBQVQsR0FBcUI7RUFDbkJKLFVBQVUsRUFBRUsscUJBQUEsQ0FBVUMsTUFESDtFQUVuQkwsT0FBTyxFQUFFSSxxQkFBQSxDQUFVRSxJQUZBO0VBR25CTCxNQUFNLEVBQUVHLHFCQUFBLENBQVVFLElBSEM7RUFJbkJKLFFBQVEsRUFBRUUscUJBQUEsQ0FBVVEsU0FBVixDQUFvQixDQUFDUixxQkFBQSxDQUFVUyxPQUFWLENBQWtCVCxxQkFBQSxDQUFVRyxJQUE1QixDQUFELEVBQW9DSCxxQkFBQSxDQUFVRyxJQUE5QyxDQUFwQixFQUF5RU87QUFKaEUsQ0FBckI7O0FBT0EsSUFBTUUsU0FBUyxnQkFBRzFCLGlCQUFBLENBQU1DLFVBQU4sQ0FBaUIsVUFBQUMsS0FBSztFQUFBLG9CQUFJLHlDQUFXQSxLQUFLLENBQUNPLFVBQWpCLEVBQThCUCxLQUFLLENBQUNVLFFBQXBDLENBQUo7QUFBQSxDQUF0QixDQUFsQjs7QUFFQWMsU0FBUyxDQUFDYixTQUFWLEdBQXNCO0VBQ3BCSixVQUFVLEVBQUVLLHFCQUFBLENBQVVDLE1BREY7RUFFcEJMLE9BQU8sRUFBRUkscUJBQUEsQ0FBVUUsSUFGQztFQUdwQkwsTUFBTSxFQUFFRyxxQkFBQSxDQUFVRSxJQUhFO0VBSXBCSixRQUFRLEVBQUVFLHFCQUFBLENBQVVRLFNBQVYsQ0FBb0IsQ0FBQ1IscUJBQUEsQ0FBVVMsT0FBVixDQUFrQlQscUJBQUEsQ0FBVUcsSUFBNUIsQ0FBRCxFQUFvQ0gscUJBQUEsQ0FBVUcsSUFBOUMsQ0FBcEIsRUFBeUVPO0FBSi9ELENBQXRCO0FBT0EsSUFBTUcsYUFBYSxHQUFHLElBQUFDLGtCQUFBLEVBQVc7RUFDL0JDLEVBQUUsRUFBRTtJQUNGQyxRQUFRLEVBQUU7RUFEUjtBQUQyQixDQUFYLENBQXRCOztBQU1BLElBQU1DLFNBQVMsZ0JBQUcvQixpQkFBQSxDQUFNQyxVQUFOLENBQWlCLFVBQUFDLEtBQUssRUFBSTtFQUMxQyxJQUFNOEIsT0FBTyxHQUFHTCxhQUFhLEVBQTdCO0VBQ0EsSUFBUVYsSUFBUixHQUFpQmYsS0FBakIsQ0FBUWUsSUFBUjtFQUNBLElBQU1nQixHQUFHLEdBQUcsSUFBQUMsZUFBQSxFQUFJakIsSUFBSixFQUFVLGFBQVYsSUFBMkIsSUFBM0IsR0FBa0MsSUFBOUM7RUFFQSxJQUFNZCxjQUFjLEdBQUdFLGdCQUFnQixDQUFDSCxLQUFLLENBQUNJLE9BQU4sQ0FBY0MsSUFBZixDQUF2QztFQUNBLE9BQU9KLGNBQWMsQ0FBQ2dDLE1BQXRCO0VBRUEsb0JBQ0UsZ0NBQUMsR0FBRCxnQ0FDTWpDLEtBQUssQ0FBQ08sVUFEWixFQUVNTixjQUZOO0lBR0UsT0FBTyxFQUFFLElBQUErQixlQUFBLEVBQUlqQixJQUFKLEVBQVUsY0FBVixDQUhYO0lBSUUsU0FBUyxFQUFFZSxPQUFPLENBQUNDLEdBQUQsQ0FKcEI7SUFLRSxPQUFPLEVBQUUvQixLQUFLLENBQUNRLE9BTGpCO0lBTUUsTUFBTSxFQUFFUixLQUFLLENBQUNTO0VBTmhCLElBUUdULEtBQUssQ0FBQ1UsUUFSVCxDQURGO0FBWUQsQ0FwQmlCLENBQWxCOztBQXNCQW1CLFNBQVMsQ0FBQ2xCLFNBQVYsR0FBc0I7RUFDcEJJLElBQUksRUFBRUgscUJBQUEsQ0FBVUMsTUFESTtFQUVwQlQsT0FBTyxFQUFFUSxxQkFBQSxDQUFVQyxNQUZDO0VBR3BCTixVQUFVLEVBQUVLLHFCQUFBLENBQVVDLE1BSEY7RUFJcEJMLE9BQU8sRUFBRUkscUJBQUEsQ0FBVUUsSUFKQztFQUtwQkwsTUFBTSxFQUFFRyxxQkFBQSxDQUFVRSxJQUxFO0VBTXBCSixRQUFRLEVBQUVFLHFCQUFBLENBQVVRLFNBQVYsQ0FBb0IsQ0FBQ1IscUJBQUEsQ0FBVVMsT0FBVixDQUFrQlQscUJBQUEsQ0FBVUcsSUFBNUIsQ0FBRCxFQUFvQ0gscUJBQUEsQ0FBVUcsSUFBOUMsQ0FBcEIsRUFBeUVPO0FBTi9ELENBQXRCOztBQVNBLElBQU1ZLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FBQ0MsTUFBRCxFQUFTbEIsSUFBVCxFQUFrQjtFQUMxQyxJQUFJLENBQUNrQixNQUFELElBQVcsQ0FBQ2xCLElBQWhCLEVBQXNCO0lBQ3BCLE9BQU8sSUFBUDtFQUNEOztFQUVELElBQU1tQixTQUFTLEdBQUdDLFdBQUEsQ0FBVUQsU0FBVixDQUFvQkQsTUFBcEIsRUFBNEJHLGFBQUEsQ0FBT0MsSUFBUCxDQUFZSixNQUFaLEVBQW9CQSxNQUFNLENBQUNLLFNBQTNCLENBQTVCLEVBQW1FO0lBQ25GQyxPQUFPLEVBQUU7RUFEMEUsQ0FBbkUsQ0FBbEI7O0VBTDBDLDJDQVNITCxTQVRHO0VBQUE7O0VBQUE7SUFTMUMsb0RBQWtEO01BQUE7TUFBQSxJQUF0Q00sUUFBc0M7TUFBQSxJQUE1QkMsWUFBNEI7O01BQ2hELElBQUlELFFBQVEsQ0FBQ3pCLElBQVQsS0FBa0JBLElBQXRCLEVBQTRCO1FBQzFCLE9BQU8sQ0FBQ3lCLFFBQUQsRUFBV0MsWUFBWCxDQUFQO01BQ0Q7SUFDRjtFQWJ5QztJQUFBO0VBQUE7SUFBQTtFQUFBOztFQWUxQyxPQUFPLElBQVA7QUFDRCxDQWhCRDs7QUFrQkEsSUFBTUMsc0JBQXNCLEdBQUcsU0FBekJBLHNCQUF5QixDQUFBVCxNQUFNLEVBQUk7RUFDdkMseUJBQWdDRCxpQkFBaUIsQ0FBQ0MsTUFBRCxFQUFTLE9BQVQsQ0FBakQ7RUFBQTtFQUFBLElBQU9VLFVBQVA7RUFBQSxJQUFtQkMsU0FBbkI7O0VBQ0EsSUFBSUMsV0FBSjs7RUFGdUMsNENBSUlWLFdBQUEsQ0FBVVcsV0FBVixDQUFzQkgsVUFBdEIsRUFBa0M7SUFBRUosT0FBTyxFQUFFO0VBQVgsQ0FBbEMsQ0FKSjtFQUFBOztFQUFBO0lBSXZDLHVEQUFpRztNQUFBO01BQUEsSUFBckZRLFVBQXFGO01BQUEsSUFBekVDLGNBQXlFOztNQUMvRixJQUFJRCxVQUFVLENBQUNoQyxJQUFYLEtBQW9CLElBQXhCLEVBQThCO1FBQzVCOEIsV0FBVyxHQUFHRyxjQUFkO01BQ0Q7SUFDRjtFQVJzQztJQUFBO0VBQUE7SUFBQTtFQUFBOztFQVV2Q0MsaUJBQUEsQ0FBV0MsTUFBWCxDQUFrQmpCLE1BQWxCLGdEQUE4QlcsU0FBOUIsdUNBQTRDQyxXQUE1QztBQUNELENBWEQ7O0FBYUEsSUFBTU0sV0FBVyxHQUFHLENBQUMsT0FBRCxFQUFVLElBQVYsRUFBZ0IsSUFBaEIsRUFBc0IsT0FBdEIsQ0FBcEI7O2VBRWUsa0JBQUNDLElBQUQsRUFBT0M7QUFBZTtBQUF0QixFQUFtRDtFQUNoRSxJQUFNQyxJQUFJLEdBQUc7SUFDWEMsS0FBSyxFQUFFO0VBREksQ0FBYjs7RUFJQUQsSUFBSSxDQUFDQyxLQUFMLENBQVdDLFdBQVgsR0FBeUIsWUFBMEI7SUFBQSxJQUF6QkMsR0FBeUIsdUVBQW5CLENBQW1CO0lBQUEsSUFBaEJDLE9BQWdCLHVFQUFOLENBQU07SUFDakQsSUFBTUMsU0FBUyxHQUFHLEVBQWxCO0lBQ0EsSUFBTUMsU0FBUyxHQUFHLElBQUlDLEtBQUosQ0FBVUosR0FBVixFQUFlSyxJQUFmLENBQW9CLENBQXBCLEVBQXVCQyxNQUF6QztJQUNBLElBQU1DLGFBQWEsR0FBRyxJQUFJSCxLQUFKLENBQVVILE9BQVYsRUFBbUJJLElBQW5CLENBQXdCLENBQXhCLEVBQTJCQyxNQUFqRDs7SUFFQSxLQUFLLElBQUlFLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdMLFNBQXBCLEVBQStCSyxDQUFDLEVBQWhDLEVBQW9DO01BQ2xDLElBQU1DLFFBQVEsR0FBRztRQUFFbkQsSUFBSSxFQUFFLElBQVI7UUFBY1AsUUFBUSxFQUFFO01BQXhCLENBQWpCOztNQUVBLEtBQUssSUFBSTJELENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdILGFBQXBCLEVBQW1DRyxDQUFDLEVBQXBDLEVBQXdDO1FBQ3RDRCxRQUFRLENBQUMxRCxRQUFULENBQWtCNEQsSUFBbEIsQ0FBdUI7VUFDckJyRCxJQUFJLEVBQUUsSUFEZTtVQUVyQlAsUUFBUSxFQUFFLENBQ1I7WUFDRTZELElBQUksRUFBRTtVQURSLENBRFE7UUFGVyxDQUF2QjtNQVFEOztNQUVEVixTQUFTLENBQUNTLElBQVYsQ0FBZUYsUUFBZjtJQUNEOztJQUVELE9BQU87TUFDTG5ELElBQUksRUFBRSxPQUREO01BRUxQLFFBQVEsRUFBRSxDQUNSO1FBQ0VPLElBQUksRUFBRSxPQURSO1FBRUVQLFFBQVEsRUFBRW1EO01BRlosQ0FEUTtJQUZMLENBQVA7RUFTRCxDQS9CRDs7RUFpQ0FMLElBQUksQ0FBQ0MsS0FBTCxDQUFXZSxhQUFYLEdBQTJCLFVBQUFyQyxNQUFNO0lBQUEsT0FBSUQsaUJBQWlCLENBQUNDLE1BQUQsRUFBUyxPQUFULENBQXJCO0VBQUEsQ0FBakM7O0VBRUFxQixJQUFJLENBQUNDLEtBQUwsQ0FBV2dCLGtCQUFYLEdBQWdDLFVBQUF0QyxNQUFNO0lBQUEsT0FBSSxDQUFDLENBQUNxQixJQUFJLENBQUNDLEtBQUwsQ0FBV2UsYUFBWCxDQUF5QnJDLE1BQXpCLENBQU47RUFBQSxDQUF0Qzs7RUFFQXFCLElBQUksQ0FBQ0MsS0FBTCxDQUFXaUIsc0JBQVgsR0FBb0MsVUFBQ2YsR0FBRCxFQUFNQyxPQUFOLEVBQWVlLEtBQWYsRUFBeUI7SUFDM0QsSUFBTUMsWUFBWSxHQUFHcEIsSUFBSSxDQUFDQyxLQUFMLENBQVdDLFdBQVgsQ0FBdUJDLEdBQXZCLEVBQTRCQyxPQUE1QixDQUFyQjs7SUFDQSxJQUFNaUIsUUFBUSxtQ0FBUUQsWUFBUixHQUF5QkQsS0FBekIsQ0FBZDs7SUFFQSxPQUFPRSxRQUFQO0VBQ0QsQ0FMRDs7RUFPQXJCLElBQUksQ0FBQ3NCLE9BQUwsR0FBZTtJQUNiQyxJQUFJLGVBQUUsZ0NBQUMsa0JBQUQsT0FETztJQUViQyxPQUFPLEVBQUUsaUJBQUE3QyxNQUFNLEVBQUk7TUFDakJ4QyxHQUFHLENBQUMsY0FBRCxDQUFIO01BQ0EsSUFBTWtGLFFBQVEsR0FBR3JCLElBQUksQ0FBQ0MsS0FBTCxDQUFXaUIsc0JBQVgsQ0FBa0MsQ0FBbEMsRUFBcUMsQ0FBckMsRUFBd0M7UUFDdkRyRSxJQUFJLEVBQUU7VUFDSjRFLE1BQU0sRUFBRSxHQURKO1VBRUpKLFFBQVEsRUFBRTtRQUZOO01BRGlELENBQXhDLENBQWpCO01BT0ExQyxNQUFNLENBQUMrQyxVQUFQLENBQWtCTCxRQUFsQjtNQUNBakMsc0JBQXNCLENBQUNULE1BQUQsRUFBUzBDLFFBQVQsQ0FBdEI7SUFDRCxDQWJZOztJQWNiO0FBQ0o7QUFDQTtJQUNJTSxhQUFhLEVBQUUsdUJBQUNwRSxJQUFELEVBQU9xRSxLQUFQLEVBQWNqRCxNQUFkLEVBQXNCa0QsYUFBdEIsRUFBd0M7TUFDckQxRixHQUFHLENBQUMsNkJBQUQsRUFBZ0NvQixJQUFJLENBQUNWLElBQXJDLENBQUg7O01BRUEsNEJBQXFCbUQsSUFBSSxDQUFDQyxLQUFMLENBQVdlLGFBQVgsQ0FBeUJyQyxNQUF6QixDQUFyQjtNQUFBO01BQUEsSUFBT1UsVUFBUDs7TUFDQWxELEdBQUcsQ0FBQyw4QkFBRCxFQUFpQ2tELFVBQWpDLENBQUg7O01BRUEsSUFBTXlDLFNBQVMsR0FBRyxTQUFaQSxTQUFZO1FBQUEsT0FBTSxJQUFBdEQsZUFBQSxFQUFJYSxVQUFKLEVBQWdCLGFBQWhCLE1BQW1DLEdBQXpDO01BQUEsQ0FBbEI7O01BQ0EsSUFBTTBDLE1BQU0sR0FBRyxTQUFUQSxNQUFTLEdBQU07UUFDbkIsMEJBQXlCckQsaUJBQWlCLENBQUNDLE1BQUQsRUFBUyxJQUFULENBQTFDO1FBQUE7UUFBQSxJQUFPcUQsTUFBUDtRQUFBLElBQWVDLE1BQWY7O1FBRUE5RixHQUFHLENBQUMsVUFBRCxDQUFIOztRQUVBLElBQUk2RixNQUFKLEVBQVk7VUFDVixJQUFNRSxLQUFLLEdBQUc7WUFBRXpFLElBQUksRUFBRSxJQUFSO1lBQWNQLFFBQVEsRUFBRTtVQUF4QixDQUFkO1VBQ0EsSUFBTXdELGFBQWEsR0FBR3NCLE1BQU0sQ0FBQzlFLFFBQVAsQ0FBZ0J1RCxNQUF0Qzs7VUFFQSxLQUFLLElBQUlFLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdELGFBQXBCLEVBQW1DQyxDQUFDLEVBQXBDLEVBQXdDO1lBQ3RDdUIsS0FBSyxDQUFDaEYsUUFBTixDQUFlNEQsSUFBZixDQUFvQjtjQUNsQnJELElBQUksRUFBRSxJQURZO2NBRWxCUCxRQUFRLEVBQUUsQ0FDUjtnQkFDRTZELElBQUksRUFBRTtjQURSLENBRFE7WUFGUSxDQUFwQjtVQVFEOztVQUVEcEIsaUJBQUEsQ0FBV3dDLFdBQVgsQ0FBdUJ4RCxNQUF2QixFQUErQixDQUFDdUQsS0FBRCxDQUEvQixFQUF3QztZQUFFRSxFQUFFLEVBQUVIO1VBQU4sQ0FBeEM7UUFDRDtNQUNGLENBdEJEOztNQXdCQSxJQUFNSSxTQUFTLEdBQUcsU0FBWkEsU0FBWSxHQUFNO1FBQ3RCLDBCQUErQjNELGlCQUFpQixDQUFDQyxNQUFELEVBQVMsT0FBVCxDQUFoRDtRQUFBO1FBQUEsSUFBTzJELFNBQVA7UUFBQSxJQUFrQkMsU0FBbEI7O1FBRUFwRyxHQUFHLENBQUMsYUFBRCxDQUFIOztRQUVBLElBQUlvRyxTQUFKLEVBQWU7VUFDYixJQUFJRCxTQUFTLENBQUNwRixRQUFWLENBQW1CdUQsTUFBbkIsR0FBNEIsQ0FBaEMsRUFBbUM7WUFDakMsMEJBQW1CL0IsaUJBQWlCLENBQUNDLE1BQUQsRUFBUyxJQUFULENBQXBDO1lBQUE7WUFBQSxJQUFTc0QsTUFBVDs7WUFFQTlGLEdBQUcsQ0FBQyxhQUFELENBQUg7O1lBRUEsSUFBSThGLE1BQUosRUFBWTtjQUNWdEMsaUJBQUEsQ0FBVzZDLFdBQVgsQ0FBdUI3RCxNQUF2QixFQUErQjtnQkFBRXlELEVBQUUsRUFBRUg7Y0FBTixDQUEvQjtZQUNEO1VBQ0Y7UUFDRjtNQUNGLENBaEJEOztNQWtCQSxJQUFNUSxTQUFTLEdBQUcsU0FBWkEsU0FBWSxHQUFNO1FBQ3RCLDBCQUErQi9ELGlCQUFpQixDQUFDQyxNQUFELEVBQVMsT0FBVCxDQUFoRDtRQUFBO1FBQUEsSUFBTzJELFNBQVA7UUFBQSxJQUFrQkMsU0FBbEI7O1FBRUFwRyxHQUFHLENBQUMsYUFBRCxDQUFIOztRQUVBLElBQUltRyxTQUFKLEVBQWU7VUFDYixJQUFNSSxPQUFPLEdBQUc7WUFDZGpGLElBQUksRUFBRSxJQURRO1lBRWRQLFFBQVEsRUFBRSxDQUFDO2NBQUU2RCxJQUFJLEVBQUU7WUFBUixDQUFEO1VBRkksQ0FBaEI7O1VBSUEsSUFBTTRCLFVBQVUsR0FBRzdELGFBQUEsQ0FBTzhELEtBQVAsQ0FBYWpFLE1BQWIsRUFBcUI7WUFDdEN5RCxFQUFFLEVBQUVHLFNBRGtDO1lBQ3ZCO1lBQ2ZNLEtBQUssRUFBRSxlQUFBdEYsSUFBSTtjQUFBLE9BQUksU0FBU0EsSUFBSSxDQUFDRSxJQUFsQjtZQUFBO1VBRjJCLENBQXJCLENBQW5COztVQUxhLDRDQVVvQmtGLFVBVnBCO1VBQUE7O1VBQUE7WUFVYix1REFBNkM7Y0FBQTtjQUFBLElBQWpDWCxNQUFpQztjQUFBLElBQXpCYyxRQUF5Qjs7Y0FDM0NuRCxpQkFBQSxDQUFXd0MsV0FBWCxDQUF1QnhELE1BQXZCLEVBQStCLENBQUMrRCxPQUFELENBQS9CLEVBQTBDO2dCQUN4Q04sRUFBRSxnREFBTVUsUUFBTixJQUFnQmQsTUFBTSxDQUFDOUUsUUFBUCxDQUFnQnVELE1BQWhDO2NBRHNDLENBQTFDO1lBR0Q7VUFkWTtZQUFBO1VBQUE7WUFBQTtVQUFBO1FBZWQ7TUFDRixDQXJCRDs7TUF1QkEsSUFBTXNDLFlBQVksR0FBRyxTQUFmQSxZQUFlLEdBQU07UUFDekIsMkJBQStCckUsaUJBQWlCLENBQUNDLE1BQUQsRUFBUyxPQUFULENBQWhEO1FBQUE7UUFBQSxJQUFPMkQsU0FBUDtRQUFBLElBQWtCQyxTQUFsQjs7UUFFQXBHLEdBQUcsQ0FBQyxhQUFELENBQUg7O1FBRUEsSUFBSW1HLFNBQUosRUFBZTtVQUNiLElBQU1VLFdBQVcsR0FBR2xFLGFBQUEsQ0FBT0MsSUFBUCxDQUFZSixNQUFaLEVBQW9CQSxNQUFNLENBQUNLLFNBQTNCLENBQXBCOztVQUNBLElBQU1pRSxXQUFXLEdBQUdELFdBQVcsQ0FBQ0EsV0FBVyxDQUFDdkMsTUFBWixHQUFxQixDQUF0QixDQUEvQjs7VUFDQSxJQUFNa0MsVUFBVSxHQUFHN0QsYUFBQSxDQUFPOEQsS0FBUCxDQUFhakUsTUFBYixFQUFxQjtZQUN0Q3lELEVBQUUsRUFBRUcsU0FEa0M7WUFDdkI7WUFDZk0sS0FBSyxFQUFFLGVBQUF0RixJQUFJO2NBQUEsT0FBSSxTQUFTQSxJQUFJLENBQUNFLElBQWxCO1lBQUE7VUFGMkIsQ0FBckIsQ0FBbkI7O1VBSGEsNENBUW9Ca0YsVUFScEI7VUFBQTs7VUFBQTtZQVFiLHVEQUE2QztjQUFBO2NBQUEsSUFBakNYLE1BQWlDO2NBQUEsSUFBekJjLFFBQXlCOztjQUMzQyxJQUFJZCxNQUFNLENBQUM5RSxRQUFQLENBQWdCdUQsTUFBaEIsR0FBeUIsQ0FBN0IsRUFBZ0M7Z0JBQzlCZCxpQkFBQSxDQUFXNkMsV0FBWCxDQUF1QjdELE1BQXZCLEVBQStCO2tCQUFFeUQsRUFBRSxnREFBTVUsUUFBTixJQUFnQkcsV0FBaEI7Z0JBQUosQ0FBL0I7Y0FDRDtZQUNGO1VBWlk7WUFBQTtVQUFBO1lBQUE7VUFBQTtRQWFkO01BQ0YsQ0FuQkQ7O01BcUJBLElBQU1DLFdBQVcsR0FBRyxTQUFkQSxXQUFjLEdBQU07UUFDeEIsMkJBQStCeEUsaUJBQWlCLENBQUNDLE1BQUQsRUFBUyxPQUFULENBQWhEO1FBQUE7UUFBQSxJQUFPd0UsU0FBUDtRQUFBLElBQWtCN0QsU0FBbEI7O1FBRUFYLE1BQU0sQ0FBQ3lFLEtBQVAsQ0FBYTtVQUNYM0YsSUFBSSxFQUFFLGFBREs7VUFFWHNCLElBQUksRUFBRU8sU0FGSztVQUdYL0IsSUFBSSxFQUFFNEY7UUFISyxDQUFiO01BS0QsQ0FSRDs7TUFVQSxJQUFNRSxZQUFZLEdBQUcsU0FBZkEsWUFBZSxHQUFNO1FBQ3pCLElBQVF4RyxJQUFSLEdBQWlCd0MsVUFBakIsQ0FBUXhDLElBQVI7O1FBQ0EsSUFBTXlHLE1BQU0sbUNBQ1B6RyxJQURPO1VBRVY0RSxNQUFNLEVBQUVLLFNBQVMsS0FBSyxHQUFMLEdBQVc7UUFGbEIsRUFBWjs7UUFJQSwyQkFBc0JwRCxpQkFBaUIsQ0FBQ0MsTUFBRCxFQUFTLE9BQVQsQ0FBdkM7UUFBQTtRQUFBLElBQVNXLFNBQVQ7O1FBRUFuRCxHQUFHLENBQUMseUJBQUQsRUFBNEJtSCxNQUE1QixDQUFIO1FBRUEzRSxNQUFNLENBQUN5RSxLQUFQLENBQWE7VUFDWDNGLElBQUksRUFBRSxVQURLO1VBRVhzQixJQUFJLEVBQUVPLFNBRks7VUFHWGlFLFVBQVUsRUFBRTtZQUNWMUcsSUFBSSxFQUFFVSxJQUFJLENBQUNWO1VBREQsQ0FIRDtVQU1YMkcsYUFBYSxFQUFFO1lBQUUzRyxJQUFJLEVBQUV5RztVQUFSO1FBTkosQ0FBYjtNQVFELENBbEJEOztNQW9CQSxJQUFNRyxNQUFNLEdBQUcsU0FBVEEsTUFBUyxHQUFNO1FBQ25CdEgsR0FBRyxDQUFDLGdDQUFELENBQUg7UUFDQTBGLGFBQWEsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUFiO01BQ0QsQ0FIRDs7TUFLQSxJQUFNNkIsRUFBRSxHQUFHLFNBQUxBLEVBQUs7UUFBQSxvQkFDVCxnQ0FBQyx3QkFBRDtVQUNFLE1BQU0sRUFBRS9FLE1BRFY7VUFFRSxPQUFPLEVBQUVvQixjQUZYO1VBR0UsUUFBUSxFQUFFLGtCQUFBNEQsQ0FBQztZQUFBLE9BQUk5QixhQUFhLENBQUM4QixDQUFELEVBQUksS0FBSixDQUFqQjtVQUFBLENBSGI7VUFJRSxRQUFRLEVBQUU1QixNQUpaO1VBS0UsV0FBVyxFQUFFTSxTQUxmO1VBTUUsV0FBVyxFQUFFSSxTQU5mO1VBT0UsY0FBYyxFQUFFTSxZQVBsQjtVQVFFLGFBQWEsRUFBRUcsV0FSakI7VUFTRSxTQUFTLEVBQUVwQixTQUFTLEVBVHRCO1VBVUUsY0FBYyxFQUFFdUIsWUFWbEI7VUFXRSxNQUFNLEVBQUVJO1FBWFYsRUFEUztNQUFBLENBQVg7O01BZUEsT0FBT0MsRUFBUDtJQUNEO0VBaktZLENBQWY7O0VBb0tBMUQsSUFBSSxDQUFDNEQsUUFBTCxHQUFnQixVQUFDckcsSUFBRCxFQUFPb0IsTUFBUDtJQUFBLE9BQWtCa0IsV0FBVyxDQUFDZ0UsUUFBWixDQUFxQnRHLElBQUksQ0FBQ0UsSUFBMUIsQ0FBbEI7RUFBQSxDQUFoQjs7RUFFQSxJQUFNcUcsSUFBSSxHQUFHLFNBQVBBLElBQU8sQ0FBQXRILEtBQUssRUFBSTtJQUNwQixRQUFRQSxLQUFLLENBQUNlLElBQU4sQ0FBV0UsSUFBbkI7TUFDRSxLQUFLLE9BQUw7UUFDRSxvQkFBTyxnQ0FBQyxLQUFELGdDQUFXakIsS0FBWDtVQUFrQixPQUFPLEVBQUVzRCxJQUFJLENBQUM5QyxPQUFoQztVQUF5QyxNQUFNLEVBQUU4QyxJQUFJLENBQUM3QztRQUF0RCxHQUFQOztNQUNGLEtBQUssT0FBTDtRQUNFLG9CQUFPLGdDQUFDLFNBQUQsZ0NBQWVULEtBQWY7VUFBc0IsT0FBTyxFQUFFc0QsSUFBSSxDQUFDOUMsT0FBcEM7VUFBNkMsTUFBTSxFQUFFOEMsSUFBSSxDQUFDN0M7UUFBMUQsR0FBUDs7TUFDRixLQUFLLElBQUw7UUFDRSxvQkFBTyxnQ0FBQyxRQUFELEVBQWNULEtBQWQsQ0FBUDs7TUFDRixLQUFLLElBQUw7UUFDRSxvQkFBTyxnQ0FBQyxTQUFELGdDQUFlQSxLQUFmO1VBQXNCLE9BQU8sRUFBRXNELElBQUksQ0FBQzlDLE9BQXBDO1VBQTZDLE1BQU0sRUFBRThDLElBQUksQ0FBQzdDO1FBQTFELEdBQVA7O01BQ0Y7UUFDRSxPQUFPLElBQVA7SUFWSjtFQVlELENBYkQ7O0VBY0E2RyxJQUFJLENBQUMzRyxTQUFMLEdBQWlCO0lBQ2ZJLElBQUksRUFBRUgscUJBQUEsQ0FBVUM7RUFERCxDQUFqQjtFQUlBMkMsSUFBSSxDQUFDK0QsVUFBTCxHQUFrQkQsSUFBbEI7RUFFQSxPQUFPOUQsSUFBUDtBQUNELEM7Ozs7QUFFTSxJQUFNZ0UsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFtQixDQUFBQyxDQUFDLEVBQUk7RUFDbkMsSUFBTUMsS0FBSyxHQUFHLHlCQUFkO0VBQ0EsSUFBSXJCLEtBQUo7RUFDQSxJQUFNc0IsTUFBTSxHQUFHLEVBQWY7O0VBQ0EsT0FBUXRCLEtBQUssR0FBR3FCLEtBQUssQ0FBQ0UsSUFBTixDQUFXSCxDQUFYLENBQWhCLEVBQWdDO0lBQzlCRSxNQUFNLENBQUN0QixLQUFLLENBQUMsQ0FBRCxDQUFOLENBQU4sR0FBbUJBLEtBQUssQ0FBQyxDQUFELENBQUwsQ0FBU3dCLElBQVQsRUFBbkI7RUFDRDs7RUFDRCxPQUFPRixNQUFQO0FBQ0QsQ0FSTTs7OztBQVVBLElBQU1HLGVBQWUsR0FBRyxTQUFsQkEsZUFBa0IsQ0FBQUMsQ0FBQztFQUFBLE9BQUksSUFBQUMsZUFBQSxFQUFjRCxDQUFkLEVBQWlCO0lBQUVFLFFBQVEsRUFBRSxJQUFaO0lBQWtCQyxRQUFRLEVBQUU7RUFBNUIsQ0FBakIsQ0FBSjtBQUFBLENBQXpCOzs7O0FBRVAsSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixDQUFBQyxFQUFFO0VBQUEsT0FBSSxVQUFDQyxHQUFELEVBQU1DLFNBQU4sRUFBb0I7SUFDaEQsSUFBTWxELEtBQUssR0FBR2dELEVBQUUsQ0FBQ0csWUFBSCxDQUFnQkQsU0FBaEIsQ0FBZDs7SUFDQSxJQUFJbEQsS0FBSixFQUFXO01BQ1QsSUFBSWtELFNBQVMsS0FBSyxPQUFsQixFQUEyQjtRQUN6QixJQUFNRSxXQUFXLEdBQUdKLEVBQUUsQ0FBQ0csWUFBSCxDQUFnQkQsU0FBaEIsQ0FBcEI7UUFDQSxJQUFNRyxnQkFBZ0IsR0FBR1gsZUFBZSxDQUFDTixnQkFBZ0IsQ0FBQ2dCLFdBQUQsQ0FBakIsQ0FBeEM7UUFDQUgsR0FBRyxDQUFDLE9BQUQsQ0FBSCxHQUFlSSxnQkFBZjtNQUNELENBSkQsTUFJTztRQUNMSixHQUFHLENBQUNDLFNBQUQsQ0FBSCxHQUFpQkYsRUFBRSxDQUFDRyxZQUFILENBQWdCRCxTQUFoQixDQUFqQjtNQUNEO0lBQ0Y7O0lBQ0QsT0FBT0QsR0FBUDtFQUNELENBWnlCO0FBQUEsQ0FBMUI7O0FBY0EsSUFBTWxJLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBbUIsQ0FBQUUsSUFBSSxFQUFJO0VBQy9CLE9BQU8sSUFBQXFJLGtCQUFBLEVBQ0xySSxJQURLLEVBRUwsVUFBQ2dJLEdBQUQsRUFBTU0sQ0FBTixFQUFTQyxJQUFULEVBQWtCO0lBQ2hCLElBQUlELENBQUosRUFBTztNQUNMTixHQUFHLENBQUMsSUFBQVEsOEJBQUEsRUFBUUQsSUFBUixDQUFELENBQUgsR0FBcUJELENBQXJCO0lBQ0Q7O0lBQ0QsT0FBT04sR0FBUDtFQUNELENBUEksRUFRTCxFQVJLLENBQVA7QUFVRCxDQVhEOztBQWFBLElBQU05SCxVQUFVLEdBQUcsQ0FBQyxRQUFELEVBQVcsYUFBWCxFQUEwQixhQUExQixFQUF5QyxPQUF6QyxFQUFrRCxPQUFsRCxDQUFuQjtBQUVBLElBQU11SSxjQUFjLEdBQUcsQ0FBQyxTQUFELEVBQVksU0FBWixFQUF1QixPQUF2QixFQUFnQyxPQUFoQyxDQUF2QjtBQUVPLElBQU1DLGFBQWEsR0FBRztFQUMzQkMsV0FEMkIsdUJBQ2ZaLEVBRGUsRUFDWGEsSUFEVyxFQUNMO0lBQ3BCLElBQU1DLEdBQUcsR0FBR2QsRUFBRSxDQUFDZSxPQUFILENBQVdDLFdBQVgsRUFBWjs7SUFFQSxRQUFRRixHQUFSO01BQ0UsS0FBSyxPQUFMO1FBQWM7VUFDWixJQUFNeEksUUFBUSxHQUNaMEgsRUFBRSxDQUFDMUgsUUFBSCxDQUFZdUQsTUFBWixLQUF1QixDQUF2QixJQUE0Qm1FLEVBQUUsQ0FBQzFILFFBQUgsQ0FBWSxDQUFaLEVBQWV5SSxPQUFmLENBQXVCQyxXQUF2QixPQUF5QyxPQUFyRSxHQUNJaEIsRUFBRSxDQUFDMUgsUUFBSCxDQUFZLENBQVosRUFBZUEsUUFEbkIsR0FFSTBILEVBQUUsQ0FBQzFILFFBSFQ7VUFJQSxJQUFNeUcsQ0FBQyxHQUFHcEQsS0FBSyxDQUFDc0YsSUFBTixDQUFXM0ksUUFBWCxDQUFWO1VBRUEsT0FBTyxJQUFBNEkscUJBQUEsRUFDTCxTQURLLEVBRUw7WUFDRXJJLElBQUksRUFBRSxPQURSO1lBRUVaLElBQUksRUFBRUUsVUFBVSxDQUFDbUksTUFBWCxDQUFrQlAsZUFBZSxDQUFDQyxFQUFELENBQWpDLEVBQXVDLEVBQXZDO1VBRlIsQ0FGSyxFQU1MYSxJQUFJLENBQUM5QixDQUFELENBTkMsQ0FBUDtRQVFEOztNQUNELEtBQUssT0FBTDtRQUFjO1VBQ1osT0FBTyxJQUFBbUMscUJBQUEsRUFDTCxTQURLLEVBRUw7WUFDRXJJLElBQUksRUFBRTtVQURSLENBRkssRUFLTGdJLElBQUksQ0FBQ2IsRUFBRSxDQUFDbUIsVUFBSixDQUxDLENBQVA7UUFPRDs7TUFDRCxLQUFLLElBQUw7UUFBVztVQUNULE9BQU8sSUFBQUQscUJBQUEsRUFDTCxTQURLLEVBRUw7WUFDRXJJLElBQUksRUFBRSxJQURSO1lBRUVaLElBQUksRUFBRXlJLGNBQWMsQ0FBQ0osTUFBZixDQUFzQlAsZUFBZSxDQUFDQyxFQUFELENBQXJDLEVBQTJDO2NBQUVuRyxNQUFNLEVBQUU7WUFBVixDQUEzQztVQUZSLENBRkssRUFNTGdILElBQUksQ0FBQ2IsRUFBRSxDQUFDbUIsVUFBSixDQU5DLENBQVA7UUFRRDs7TUFDRCxLQUFLLElBQUw7UUFBVztVQUNULE9BQU8sSUFBQUQscUJBQUEsRUFDTCxTQURLLEVBRUw7WUFDRXJJLElBQUksRUFBRTtVQURSLENBRkssRUFLTGdJLElBQUksQ0FBQ2xGLEtBQUssQ0FBQ3NGLElBQU4sQ0FBV2pCLEVBQUUsQ0FBQzFILFFBQWQsQ0FBRCxDQUxDLENBQVA7UUFPRDs7TUFDRCxLQUFLLElBQUw7UUFBVztVQUNULE9BQU8sSUFBQTRJLHFCQUFBLEVBQ0wsU0FESyxFQUVMO1lBQ0VySSxJQUFJLEVBQUUsSUFEUjtZQUVFWixJQUFJLEVBQUV5SSxjQUFjLENBQUNKLE1BQWYsQ0FBc0JQLGVBQWUsQ0FBQ0MsRUFBRCxDQUFyQyxFQUEyQztjQUFFbkcsTUFBTSxFQUFFO1lBQVYsQ0FBM0M7VUFGUixDQUZLLEVBTUxnSCxJQUFJLENBQUNiLEVBQUUsQ0FBQ21CLFVBQUosQ0FOQyxDQUFQO1FBUUQ7SUF0REg7RUF3REQsQ0E1RDBCO0VBNkQzQkMsU0E3RDJCLHFCQTZEakIzSSxNQTdEaUIsRUE2RFRILFFBN0RTLEVBNkRDO0lBQzFCLFFBQVFHLE1BQU0sQ0FBQ0ksSUFBZjtNQUNFLEtBQUssT0FBTDtRQUFjO1VBQ1osSUFBTVYsV0FBVSxHQUFHSixnQkFBZ0IsQ0FBQ1UsTUFBTSxDQUFDUixJQUFSLENBQW5DOztVQUNBLG9CQUNFLHlDQUFXRSxXQUFYLEVBQ0dHLFFBREgsQ0FERjtRQUtEOztNQUNELEtBQUssT0FBTDtRQUFjO1VBQ1osb0JBQU8sK0NBQVFBLFFBQVIsQ0FBUDtRQUNEOztNQUNELEtBQUssSUFBTDtRQUFXO1VBQ1Qsb0JBQU8sNENBQUtBLFFBQUwsQ0FBUDtRQUNEOztNQUNELEtBQUssSUFBTDtRQUFXO1VBQ1QsSUFBTUgsWUFBVSxHQUFHSixnQkFBZ0IsQ0FBQ1UsTUFBTSxDQUFDUixJQUFSLENBQW5DOztVQUNBLG9CQUFPLHNDQUFRRSxZQUFSLEVBQXFCRyxRQUFyQixDQUFQO1FBQ0Q7O01BQ0QsS0FBSyxJQUFMO1FBQVc7VUFDVCxJQUFNSCxZQUFVLEdBQUdKLGdCQUFnQixDQUFDVSxNQUFNLENBQUNSLElBQVIsQ0FBbkM7O1VBQ0Esb0JBQU8sc0NBQVFFLFlBQVIsRUFBcUJHLFFBQXJCLENBQVA7UUFDRDtJQXRCSDtFQXdCRDtBQXRGMEIsQ0FBdEIifQ==