@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
package/lib/editor.js CHANGED
@@ -19,7 +19,7 @@ Object.defineProperty(exports, "DEFAULT_PLUGINS", {
19
19
  return _plugins.DEFAULT_PLUGINS;
20
20
  }
21
21
  });
22
- exports.serialization = exports["default"] = exports.Editor = void 0;
22
+ exports.serialization = exports["default"] = exports.EditorComponent = void 0;
23
23
 
24
24
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
25
25
 
@@ -39,20 +39,24 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
39
39
 
40
40
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
41
41
 
42
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
43
+
44
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
45
+
46
+ var _react = _interopRequireWildcard(require("react"));
47
+
42
48
  var _slateReact = require("slate-react");
43
49
 
44
- var _slatePropTypes = _interopRequireDefault(require("slate-prop-types"));
50
+ var _RootRef = _interopRequireDefault(require("@material-ui/core/RootRef"));
45
51
 
46
52
  var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
47
53
 
48
- var serialization = _interopRequireWildcard(require("./serialization"));
54
+ var serialization = _interopRequireWildcard(require("./new-serialization"));
49
55
 
50
56
  exports.serialization = serialization;
51
57
 
52
58
  var _propTypes = _interopRequireDefault(require("prop-types"));
53
59
 
54
- var _react = _interopRequireDefault(require("react"));
55
-
56
60
  var _slate = require("slate");
57
61
 
58
62
  var _plugins = require("./plugins");
@@ -69,6 +73,16 @@ var _slatePlainSerializer = _interopRequireDefault(require("slate-plain-serializ
69
73
 
70
74
  var _insertImageHandler = _interopRequireDefault(require("./plugins/image/insert-image-handler"));
71
75
 
76
+ var _isHotkey = _interopRequireDefault(require("is-hotkey"));
77
+
78
+ var _slateHistory = require("slate-history");
79
+
80
+ var _mathToolbar = require("@pie-lib/math-toolbar");
81
+
82
+ var _components = require("./components");
83
+
84
+ var _editorAndToolbar = _interopRequireDefault(require("./plugins/toolbar/editor-and-toolbar"));
85
+
72
86
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
73
87
 
74
88
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -81,6 +95,310 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
81
95
 
82
96
  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; }
83
97
 
98
+ var HOTKEYS = {
99
+ 'mod+b': 'bold',
100
+ 'mod+i': 'italic',
101
+ 'mod+u': 'underline',
102
+ 'mod+`': 'code'
103
+ };
104
+ var LIST_TYPES = ['numbered-list', 'bulleted-list'];
105
+ var TEXT_ALIGN_TYPES = ['left', 'center', 'right', 'justify'];
106
+ var initialValue = [{
107
+ type: 'paragraph',
108
+ children: [{
109
+ type: 'math',
110
+ data: {
111
+ latex: '\\frac{1}{2}',
112
+ wrapper: 'round_brackets'
113
+ },
114
+ children: [{
115
+ text: '\\(\\frac{1}{2}\\)'
116
+ }]
117
+ }]
118
+ }];
119
+
120
+ var SlateEditor = function SlateEditor(editorProps) {
121
+ var value = editorProps.value,
122
+ plugins = editorProps.plugins;
123
+ var renderElement = (0, _react.useCallback)(function (props) {
124
+ return /*#__PURE__*/_react["default"].createElement(Element, (0, _extends2["default"])({}, props, {
125
+ plugins: plugins
126
+ }));
127
+ }, []);
128
+ var renderLeaf = (0, _react.useCallback)(function (props) {
129
+ return /*#__PURE__*/_react["default"].createElement(Leaf, props);
130
+ }, []);
131
+ var editor = (0, _react.useMemo)(function () {
132
+ return (0, _plugins.withPlugins)((0, _slate.createEditor)(), plugins);
133
+ }, []);
134
+
135
+ var _useState = (0, _react.useState)(false),
136
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
137
+ isFocused = _useState2[0],
138
+ setIsFocused = _useState2[1];
139
+
140
+ var editorRef = (0, _react.useRef)(null);
141
+ (0, _react.useEffect)(function () {
142
+ if (editorProps.onEditor) {
143
+ editorProps.onEditor(editor);
144
+ }
145
+ }, [editor]);
146
+ var slateValue = (0, _react.useMemo)(function () {
147
+ // Slate throws an error if the value on the initial render is invalid
148
+ // so we directly set the value on the editor in order
149
+ // to be able to trigger normalization on the initial value before rendering
150
+ editor.children = value;
151
+
152
+ _slate.Editor.normalize(editor, {
153
+ force: true
154
+ }); // We return the normalized internal value so that the rendering can take over from here
155
+
156
+
157
+ return editor.children;
158
+ }, [editor, value]);
159
+
160
+ var onKeyDown = function onKeyDown(event) {
161
+ if (event.key === 'Enter' && event.shiftKey === true) {
162
+ editor.insertText('\n');
163
+ event.preventDefault();
164
+ event.stopPropagation();
165
+ return;
166
+ }
167
+
168
+ for (var hotkey in HOTKEYS) {
169
+ if ((0, _isHotkey["default"])(hotkey, event)) {
170
+ event.preventDefault();
171
+ var mark = HOTKEYS[hotkey];
172
+ toggleMark(editor, mark);
173
+ }
174
+ }
175
+ };
176
+
177
+ var onFocus = function onFocus() {
178
+ return setIsFocused(true);
179
+ };
180
+
181
+ var onBlur = function onBlur() {
182
+ setTimeout(function () {
183
+ if (!editorRef.current || !editorRef.current.contains(document.activeElement)) {
184
+ setIsFocused(false);
185
+ }
186
+ }, 50);
187
+ };
188
+
189
+ return /*#__PURE__*/_react["default"].createElement(_slateReact.Slate, {
190
+ editor: editor,
191
+ value: slateValue
192
+ }, /*#__PURE__*/_react["default"].createElement(_RootRef["default"], {
193
+ rootRef: editorRef
194
+ }, /*#__PURE__*/_react["default"].createElement(_editorAndToolbar["default"], (0, _extends2["default"])({}, editorProps, {
195
+ editor: editor,
196
+ isFocused: isFocused,
197
+ onDone: function onDone() {
198
+ setIsFocused(false);
199
+ editorProps.onDone(editor);
200
+ }
201
+ }), /*#__PURE__*/_react["default"].createElement(_slateReact.Editable, {
202
+ renderElement: renderElement,
203
+ renderLeaf: renderLeaf,
204
+ placeholder: "Enter some rich text\u2026",
205
+ spellCheck: true,
206
+ onKeyDown: onKeyDown,
207
+ onFocus: onFocus,
208
+ onBlur: onBlur
209
+ }))));
210
+ };
211
+
212
+ var toggleBlock = function toggleBlock(editor, format) {
213
+ var isActive = isBlockActive(editor, format, TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type');
214
+ var isList = LIST_TYPES.includes(format);
215
+
216
+ _slate.Transforms.unwrapNodes(editor, {
217
+ match: function match(n) {
218
+ return !_slate.Editor.isEditor(n) && _slate.Element.isElement(n) && LIST_TYPES.includes(n.type) && !TEXT_ALIGN_TYPES.includes(format);
219
+ },
220
+ split: true
221
+ });
222
+
223
+ var newProperties;
224
+
225
+ if (TEXT_ALIGN_TYPES.includes(format)) {
226
+ newProperties = {
227
+ align: isActive ? undefined : format
228
+ };
229
+ } else {
230
+ newProperties = {
231
+ type: isActive ? 'paragraph' : isList ? 'list_item' : format
232
+ };
233
+ }
234
+
235
+ _slate.Transforms.setNodes(editor, newProperties);
236
+
237
+ if (!isActive && isList) {
238
+ var block = {
239
+ type: format,
240
+ children: []
241
+ };
242
+
243
+ _slate.Transforms.wrapNodes(editor, block);
244
+ }
245
+ };
246
+
247
+ var toggleMark = function toggleMark(editor, format) {
248
+ var isActive = isMarkActive(editor, format);
249
+
250
+ if (isActive) {
251
+ _slate.Editor.removeMark(editor, format);
252
+ } else {
253
+ _slate.Editor.addMark(editor, format, true);
254
+ }
255
+ };
256
+
257
+ var isBlockActive = function isBlockActive(editor, format) {
258
+ var blockType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'type';
259
+ var selection = editor.selection;
260
+ if (!selection) return false;
261
+
262
+ var _Array$from = Array.from(_slate.Editor.nodes(editor, {
263
+ at: _slate.Editor.unhangRange(editor, selection),
264
+ match: function match(n) {
265
+ return !_slate.Editor.isEditor(n) && _slate.Element.isElement(n) && n[blockType] === format;
266
+ }
267
+ })),
268
+ _Array$from2 = (0, _slicedToArray2["default"])(_Array$from, 1),
269
+ match = _Array$from2[0];
270
+
271
+ return !!match;
272
+ };
273
+
274
+ var isMarkActive = function isMarkActive(editor, format) {
275
+ var marks = _slate.Editor.marks(editor);
276
+
277
+ return marks ? marks[format] === true : false;
278
+ };
279
+
280
+ var Element = function Element(props) {
281
+ var editor = (0, _slateReact.useSlateStatic)();
282
+ var focused = (0, _slateReact.useFocused)();
283
+ var attributes = props.attributes,
284
+ children = props.children,
285
+ element = props.element,
286
+ plugins = props.plugins;
287
+ var style = {
288
+ textAlign: element.align
289
+ };
290
+
291
+ var nodeProps = _objectSpread(_objectSpread(_objectSpread({}, attributes), props), {}, {
292
+ node: _objectSpread({}, element),
293
+ children: children
294
+ });
295
+
296
+ var pluginToRender = plugins.find(function (plugin) {
297
+ return typeof plugin.supports === 'function' && plugin.supports(element);
298
+ });
299
+
300
+ if (pluginToRender) {
301
+ return pluginToRender.renderNode(_objectSpread(_objectSpread({}, nodeProps), {}, {
302
+ editor: editor,
303
+ focused: focused
304
+ }));
305
+ }
306
+
307
+ switch (element.type) {
308
+ case 'block-quote':
309
+ return /*#__PURE__*/_react["default"].createElement("blockquote", (0, _extends2["default"])({
310
+ style: style
311
+ }, attributes), children);
312
+
313
+ case 'bulleted-list':
314
+ return /*#__PURE__*/_react["default"].createElement("ul", (0, _extends2["default"])({
315
+ style: style
316
+ }, attributes), children);
317
+
318
+ case 'heading-one':
319
+ return /*#__PURE__*/_react["default"].createElement("h1", (0, _extends2["default"])({
320
+ style: style
321
+ }, attributes), children);
322
+
323
+ case 'heading-two':
324
+ return /*#__PURE__*/_react["default"].createElement("h2", (0, _extends2["default"])({
325
+ style: style
326
+ }, attributes), children);
327
+
328
+ case 'list-item':
329
+ return /*#__PURE__*/_react["default"].createElement("li", (0, _extends2["default"])({
330
+ style: style
331
+ }, attributes), children);
332
+
333
+ case 'numbered-list':
334
+ return /*#__PURE__*/_react["default"].createElement("ol", (0, _extends2["default"])({
335
+ style: style
336
+ }, attributes), children);
337
+
338
+ default:
339
+ return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
340
+ style: _objectSpread(_objectSpread({}, style), {}, {
341
+ margin: 0
342
+ })
343
+ }, attributes), children);
344
+ }
345
+ };
346
+
347
+ var Leaf = function Leaf(_ref) {
348
+ var attributes = _ref.attributes,
349
+ children = _ref.children,
350
+ leaf = _ref.leaf;
351
+
352
+ if (leaf.bold) {
353
+ children = /*#__PURE__*/_react["default"].createElement("strong", null, children);
354
+ }
355
+
356
+ if (leaf.code) {
357
+ children = /*#__PURE__*/_react["default"].createElement("code", null, children);
358
+ }
359
+
360
+ if (leaf.italic) {
361
+ children = /*#__PURE__*/_react["default"].createElement("em", null, children);
362
+ }
363
+
364
+ if (leaf.underline) {
365
+ children = /*#__PURE__*/_react["default"].createElement("u", null, children);
366
+ }
367
+
368
+ if (leaf.strikethrough) {
369
+ children = /*#__PURE__*/_react["default"].createElement("del", null, children);
370
+ }
371
+
372
+ return /*#__PURE__*/_react["default"].createElement("span", attributes, children);
373
+ };
374
+
375
+ var BlockButton = function BlockButton(_ref2) {
376
+ var format = _ref2.format,
377
+ icon = _ref2.icon;
378
+ var editor = (0, _slateReact.useSlate)();
379
+ return /*#__PURE__*/_react["default"].createElement(_components.Button, {
380
+ active: isBlockActive(editor, format, TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type'),
381
+ onMouseDown: function onMouseDown(event) {
382
+ event.preventDefault();
383
+ toggleBlock(editor, format);
384
+ }
385
+ }, /*#__PURE__*/_react["default"].createElement(_components.Icon, null, icon));
386
+ };
387
+
388
+ var MarkButton = function MarkButton(_ref3) {
389
+ var format = _ref3.format,
390
+ icon = _ref3.icon;
391
+ var editor = (0, _slateReact.useSlate)();
392
+ return /*#__PURE__*/_react["default"].createElement(_components.Button, {
393
+ active: isMarkActive(editor, format),
394
+ onMouseDown: function onMouseDown(event) {
395
+ event.preventDefault();
396
+ toggleMark(editor, format);
397
+ }
398
+ }, /*#__PURE__*/_react["default"].createElement(_components.Icon, null, icon));
399
+ }; // old-editable
400
+
401
+
84
402
  var log = (0, _debug["default"])('editable-html:editor');
85
403
  var defaultToolbarOpts = {
86
404
  position: 'bottom',
@@ -96,21 +414,19 @@ var defaultResponseAreaProps = {
96
414
  };
97
415
  var defaultLanguageCharactersProps = [];
98
416
 
99
- var createToolbarOpts = function createToolbarOpts(toolbarOpts, error) {
100
- return _objectSpread(_objectSpread(_objectSpread({}, defaultToolbarOpts), toolbarOpts), {}, {
101
- error: error
102
- });
417
+ var createToolbarOpts = function createToolbarOpts(toolbarOpts) {
418
+ return _objectSpread(_objectSpread({}, defaultToolbarOpts), toolbarOpts);
103
419
  };
104
420
 
105
- var Editor = /*#__PURE__*/function (_React$Component) {
106
- (0, _inherits2["default"])(Editor, _React$Component);
421
+ var EditorComponent = /*#__PURE__*/function (_React$Component) {
422
+ (0, _inherits2["default"])(EditorComponent, _React$Component);
107
423
 
108
- var _super = _createSuper(Editor);
424
+ var _super = _createSuper(EditorComponent);
109
425
 
110
- function Editor(_props) {
426
+ function EditorComponent(_props) {
111
427
  var _this;
112
428
 
113
- (0, _classCallCheck2["default"])(this, Editor);
429
+ (0, _classCallCheck2["default"])(this, EditorComponent);
114
430
  _this = _super.call(this, _props);
115
431
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handlePlugins", function (props) {
116
432
  var normalizedResponseAreaProps = _objectSpread(_objectSpread({}, defaultResponseAreaProps), props.responseAreaProps);
@@ -122,7 +438,6 @@ var Editor = /*#__PURE__*/function (_React$Component) {
122
438
  onBlur: _this.onPluginBlur
123
439
  },
124
440
  image: {
125
- disableImageAlignmentButtons: props.disableImageAlignmentButtons,
126
441
  onDelete: props.imageSupport && props.imageSupport["delete"] && function (src, done) {
127
442
  props.imageSupport["delete"](src, function (e) {
128
443
  done(e, _this.state.value);
@@ -150,28 +465,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
150
465
  */
151
466
  disableScrollbar: !!props.disableScrollbar,
152
467
  disableUnderline: props.disableUnderline,
153
- autoWidth: props.autoWidthToolbar,
154
- onDone: function onDone() {
155
- var _this$state$value$sta, _this$state$value$sta2;
156
-
157
- var nonEmpty = props.nonEmpty;
158
- log('[onDone]');
159
-
160
- _this.setState({
161
- toolbarInFocus: false,
162
- focusedNode: null
163
- });
164
-
165
- _this.editor.blur();
166
-
167
- if (nonEmpty && ((_this$state$value$sta = _this.state.value.startText) === null || _this$state$value$sta === void 0 ? void 0 : (_this$state$value$sta2 = _this$state$value$sta.text) === null || _this$state$value$sta2 === void 0 ? void 0 : _this$state$value$sta2.length) === 0) {
168
- _this.resetValue(true).then(function () {
169
- _this.onEditingDone();
170
- });
171
- } else {
172
- _this.onEditingDone();
173
- }
174
- }
468
+ autoWidth: props.autoWidthToolbar
175
469
  },
176
470
  table: {
177
471
  onFocus: function onFocus() {
@@ -206,9 +500,6 @@ var Editor = /*#__PURE__*/function (_React$Component) {
206
500
  languageCharacters: props.languageCharactersProps,
207
501
  media: {
208
502
  focus: _this.focus,
209
- createChange: function createChange() {
210
- return _this.state.value.change();
211
- },
212
503
  onChange: _this.onChange,
213
504
  uploadSoundSupport: props.uploadSoundSupport
214
505
  }
@@ -248,15 +539,11 @@ var Editor = /*#__PURE__*/function (_React$Component) {
248
539
  _this.stashValue();
249
540
  });
250
541
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onMathClick", function (node) {
251
- _this.editor.change(function (c) {
252
- return c.collapseToStartOf(node);
253
- });
254
-
255
542
  _this.setState({
256
543
  selectedNode: node
257
544
  });
258
545
  });
259
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onEditingDone", function () {
546
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onEditingDone", function (editor) {
260
547
  log('[onEditingDone]');
261
548
 
262
549
  _this.setState({
@@ -266,7 +553,18 @@ var Editor = /*#__PURE__*/function (_React$Component) {
266
553
 
267
554
  log('[onEditingDone] value: ', _this.state.value);
268
555
 
269
- _this.props.onChange(_this.state.value, true);
556
+ _this.props.onChange(editor, true);
557
+ });
558
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDone", function (editor) {
559
+ var nonEmpty = _this.props.nonEmpty;
560
+ log('[onDone]');
561
+
562
+ _this.setState({
563
+ toolbarInFocus: false,
564
+ focusedNode: null
565
+ });
566
+
567
+ _this.onEditingDone(editor);
270
568
  });
271
569
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleBlur", function (resolve) {
272
570
  var nonEmpty = _this.props.nonEmpty;
@@ -277,14 +575,10 @@ var Editor = /*#__PURE__*/function (_React$Component) {
277
575
  focusedNode: null
278
576
  });
279
577
 
280
- if (_this.editor) {
281
- _this.editor.blur();
282
- }
283
-
284
578
  if (doneOn === 'blur') {
285
- var _this$state$value$sta3, _this$state$value$sta4;
579
+ var _this$state$value$sta, _this$state$value$sta2;
286
580
 
287
- if (nonEmpty && ((_this$state$value$sta3 = _this.state.value.startText) === null || _this$state$value$sta3 === void 0 ? void 0 : (_this$state$value$sta4 = _this$state$value$sta3.text) === null || _this$state$value$sta4 === void 0 ? void 0 : _this$state$value$sta4.length) === 0) {
581
+ if (nonEmpty && ((_this$state$value$sta = _this.state.value.startText) === null || _this$state$value$sta === void 0 ? void 0 : (_this$state$value$sta2 = _this$state$value$sta.text) === null || _this$state$value$sta2 === void 0 ? void 0 : _this$state$value$sta2.length) === 0) {
288
582
  _this.resetValue(true).then(function () {
289
583
  _this.onEditingDone();
290
584
 
@@ -423,15 +717,19 @@ var Editor = /*#__PURE__*/function (_React$Component) {
423
717
  return Promise.resolve({});
424
718
  }
425
719
  });
426
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChange", function (change, done) {
720
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChange", function (editor, done) {
427
721
  log('[onChange]');
428
- var value = change.value;
429
722
  var charactersLimit = _this.props.charactersLimit;
430
723
 
431
- if (value && value.document && value.document.text && value.document.text.length > charactersLimit) {
724
+ var allText = _slate.Editor.string(editor, []);
725
+
726
+ if (allText > charactersLimit) {
432
727
  return;
433
728
  }
434
729
 
730
+ var html = (0, serialization.valueToHtml)(editor);
731
+ var value = (0, serialization.htmlToValue)(html);
732
+
435
733
  _this.setState({
436
734
  value: value
437
735
  }, function () {
@@ -484,32 +782,13 @@ var Editor = /*#__PURE__*/function (_React$Component) {
484
782
  log('[validateNode] parent:', parent, p);
485
783
  return undefined;
486
784
  });
487
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeData", function (key, data) {
488
- log('[changeData]. .. ', key, data);
489
- /**
490
- * HACK ALERT: We should be calling setState here and storing the change data:
491
- *
492
- * <code>this.setState({changeData: { key, data}})</code>
493
- * However this is causing issues with the Mathquill instance. The 'input' event stops firing on the element and no
494
- * more changes get through. The issues seem to be related to the promises in onBlur/onFocus. But removing these
495
- * brings it's own problems. A major clean up is planned for this component so I've decided to temporarily settle
496
- * on this hack rather than spend more time on this.
497
- */
498
- // Uncomment this line to see the bug described above.
499
- // this.setState({changeData: {key, data}})
500
-
501
- _this.__TEMPORARY_CHANGE_DATA = {
502
- key: key,
503
- data: data
504
- };
505
- });
506
785
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "focus", function (pos, node) {
507
786
  var position = pos || 'end';
508
787
 
509
788
  _this.props.focus(position, node);
510
789
  });
511
790
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDropPaste", /*#__PURE__*/function () {
512
- var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event, change, dropContext) {
791
+ var _ref4 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event, change, dropContext) {
513
792
  var editor, transfer, file, type, fragment, text, src, inline, range, ch, handler, _change$value, _document, selection, startBlock, defaultBlock, defaultMarks, frag;
514
793
 
515
794
  return _regenerator["default"].wrap(function _callee$(_context) {
@@ -635,7 +914,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
635
914
  }));
636
915
 
637
916
  return function (_x, _x2, _x3) {
638
- return _ref.apply(this, arguments);
917
+ return _ref4.apply(this, arguments);
639
918
  };
640
919
  }());
641
920
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "renderPlaceholder", function (props) {
@@ -662,7 +941,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
662
941
  });
663
942
  _this.state = {
664
943
  value: _props.value,
665
- toolbarOpts: createToolbarOpts(_props.toolbarOpts, _props.error)
944
+ toolbarOpts: createToolbarOpts(_props.toolbarOpts)
666
945
  };
667
946
 
668
947
  _this.onResize = function () {
@@ -674,7 +953,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
674
953
  return _this;
675
954
  }
676
955
 
677
- (0, _createClass2["default"])(Editor, [{
956
+ (0, _createClass2["default"])(EditorComponent, [{
678
957
  key: "componentDidMount",
679
958
  value: function componentDidMount() {
680
959
  var _this2 = this;
@@ -688,8 +967,6 @@ var Editor = /*#__PURE__*/function (_React$Component) {
688
967
  if (_this2.editor) {
689
968
  var editorDOM = document.querySelector("[data-key=\"".concat(_this2.editor.value.document.key, "\"]"));
690
969
 
691
- _this2.editor.focus();
692
-
693
970
  if (editorDOM) {
694
971
  editorDOM.focus();
695
972
  }
@@ -701,7 +978,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
701
978
  key: "componentWillReceiveProps",
702
979
  value: function componentWillReceiveProps(nextProps) {
703
980
  var toolbarOpts = this.state.toolbarOpts;
704
- var newToolbarOpts = createToolbarOpts(nextProps.toolbarOpts, nextProps.error);
981
+ var newToolbarOpts = createToolbarOpts(nextProps.toolbarOpts);
705
982
 
706
983
  if (!(0, _isEqual["default"])(newToolbarOpts, toolbarOpts)) {
707
984
  this.setState({
@@ -737,7 +1014,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
737
1014
  }, {
738
1015
  key: "UNSAFE_componentWillReceiveProps",
739
1016
  value: function UNSAFE_componentWillReceiveProps(props) {
740
- if (!props.value.document.equals(this.props.value.document)) {
1017
+ if (!(0, _isEqual["default"])(props.value, this.props.value)) {
741
1018
  this.setState({
742
1019
  focus: false,
743
1020
  value: props.value
@@ -780,25 +1057,63 @@ var Editor = /*#__PURE__*/function (_React$Component) {
780
1057
  toolbarOpts = _this$state2.toolbarOpts;
781
1058
  log('[render] value: ', value);
782
1059
  var sizeStyle = this.buildSizeStyle();
783
- var names = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, classes.withBg, highlightShape), (0, _defineProperty2["default"])(_classNames, classes.toolbarOnTop, toolbarOpts.alwaysVisible && toolbarOpts.position === 'top'), _classNames), className);
1060
+ var names = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, classes.withBg, highlightShape), (0, _defineProperty2["default"])(_classNames, classes.toolbarOnTop, toolbarOpts.alwaysVisible && toolbarOpts.position === 'top'), _classNames), className, classes.slateEditor);
784
1061
  return /*#__PURE__*/_react["default"].createElement("div", {
785
- ref: function ref(_ref2) {
786
- return _this3.wrapperRef = _ref2;
1062
+ ref: function ref(_ref5) {
1063
+ return _this3.wrapperRef = _ref5;
787
1064
  },
788
1065
  style: {
789
1066
  width: sizeStyle.width
790
1067
  },
791
1068
  className: names
792
- }, /*#__PURE__*/_react["default"].createElement(_slateReact.Editor, {
1069
+ }, /*#__PURE__*/_react["default"].createElement(SlateEditor, {
793
1070
  plugins: this.plugins,
794
- innerRef: function innerRef(r) {
1071
+ toolbarRef: function toolbarRef(r) {
795
1072
  if (r) {
796
- _this3.slateEditor = r;
1073
+ _this3.toolbarRef = r;
797
1074
  }
798
1075
  },
799
- ref: function ref(r) {
800
- return _this3.editor = r && _this3.props.editorRef(r);
1076
+ onEditor: this.props.onEditor,
1077
+ value: value,
1078
+ focus: this.focus,
1079
+ onKeyDown: onKeyDown,
1080
+ onChange: this.onChange,
1081
+ getFocusedValue: this.getFocusedValue,
1082
+ onBlur: this.onBlur,
1083
+ onDrop: function onDrop(event, editor) {
1084
+ return _this3.onDropPaste(event, editor, true);
1085
+ },
1086
+ onPaste: function onPaste(event, editor) {
1087
+ return _this3.onDropPaste(event, editor);
1088
+ },
1089
+ onFocus: this.onFocus,
1090
+ onEditingDone: this.onEditingDone,
1091
+ onDone: this.onDone,
1092
+ focusedNode: focusedNode,
1093
+ normalize: this.normalize,
1094
+ readOnly: disabled,
1095
+ spellCheck: spellCheck,
1096
+ className: (0, _classnames["default"])((0, _defineProperty2["default"])({}, classes.noPadding, toolbarOpts && toolbarOpts.noBorder), classes.slateEditor),
1097
+ style: {
1098
+ minHeight: sizeStyle.minHeight,
1099
+ height: sizeStyle.height,
1100
+ maxHeight: sizeStyle.maxHeight
1101
+ },
1102
+ pluginProps: pluginProps,
1103
+ toolbarOpts: toolbarOpts,
1104
+ placeholder: placeholder,
1105
+ renderPlaceholder: this.renderPlaceholder
1106
+ }));
1107
+ return /*#__PURE__*/_react["default"].createElement("div", {
1108
+ ref: function ref(_ref6) {
1109
+ return _this3.wrapperRef = _ref6;
1110
+ },
1111
+ style: {
1112
+ width: sizeStyle.width
801
1113
  },
1114
+ className: names
1115
+ }, /*#__PURE__*/_react["default"].createElement(_slateReact.Editor, {
1116
+ plugins: this.plugins,
802
1117
  toolbarRef: function toolbarRef(r) {
803
1118
  if (r) {
804
1119
  _this3.toolbarRef = r;
@@ -822,7 +1137,6 @@ var Editor = /*#__PURE__*/function (_React$Component) {
822
1137
  normalize: this.normalize,
823
1138
  readOnly: disabled,
824
1139
  spellCheck: spellCheck,
825
- autoCorrect: spellCheck,
826
1140
  className: (0, _classnames["default"])((0, _defineProperty2["default"])({}, classes.noPadding, toolbarOpts && toolbarOpts.noBorder), classes.slateEditor),
827
1141
  style: {
828
1142
  minHeight: sizeStyle.minHeight,
@@ -832,28 +1146,29 @@ var Editor = /*#__PURE__*/function (_React$Component) {
832
1146
  pluginProps: pluginProps,
833
1147
  toolbarOpts: toolbarOpts,
834
1148
  placeholder: placeholder,
835
- renderPlaceholder: this.renderPlaceholder,
836
- onDataChange: this.changeData
1149
+ renderPlaceholder: this.renderPlaceholder
837
1150
  }));
838
1151
  }
839
1152
  }]);
840
- return Editor;
1153
+ return EditorComponent;
841
1154
  }(_react["default"].Component); // TODO color - hardcoded gray background and keypad colors will need to change too
842
1155
 
843
1156
 
844
- exports.Editor = Editor;
845
- (0, _defineProperty2["default"])(Editor, "propTypes", {
1157
+ exports.EditorComponent = EditorComponent;
1158
+ (0, _defineProperty2["default"])(EditorComponent, "propTypes", {
846
1159
  autoFocus: _propTypes["default"].bool,
847
- editorRef: _propTypes["default"].func.isRequired,
848
1160
  onRef: _propTypes["default"].func.isRequired,
849
1161
  onChange: _propTypes["default"].func.isRequired,
1162
+ onEditor: _propTypes["default"].func,
850
1163
  onFocus: _propTypes["default"].func,
851
1164
  onBlur: _propTypes["default"].func,
852
1165
  onKeyDown: _propTypes["default"].func,
853
- focus: _propTypes["default"].func.isRequired,
854
- value: _slatePropTypes["default"].value.isRequired,
1166
+ value: _propTypes["default"].arrayOf(_propTypes["default"].shape({
1167
+ type: _propTypes["default"].string,
1168
+ children: _propTypes["default"].array,
1169
+ data: _propTypes["default"].object
1170
+ })),
855
1171
  imageSupport: _propTypes["default"].object,
856
- disableImageAlignmentButtons: _propTypes["default"].bool,
857
1172
  uploadSoundSupport: _propTypes["default"].shape({
858
1173
  add: _propTypes["default"].func,
859
1174
  "delete": _propTypes["default"].func
@@ -901,7 +1216,7 @@ exports.Editor = Editor;
901
1216
  maxImageWidth: _propTypes["default"].number,
902
1217
  maxImageHeight: _propTypes["default"].number
903
1218
  });
904
- (0, _defineProperty2["default"])(Editor, "defaultProps", {
1219
+ (0, _defineProperty2["default"])(EditorComponent, "defaultProps", {
905
1220
  disableUnderline: true,
906
1221
  onFocus: function onFocus() {},
907
1222
  onBlur: function onBlur() {},
@@ -946,7 +1261,7 @@ var styles = {
946
1261
  }
947
1262
  };
948
1263
 
949
- var _default = (0, _styles.withStyles)(styles)(Editor);
1264
+ var _default = (0, _styles.withStyles)(styles)(EditorComponent);
950
1265
 
951
1266
  exports["default"] = _default;
952
- //# sourceMappingURL=editor.js.map
1267
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIT1RLRVlTIiwiTElTVF9UWVBFUyIsIlRFWFRfQUxJR05fVFlQRVMiLCJpbml0aWFsVmFsdWUiLCJ0eXBlIiwiY2hpbGRyZW4iLCJkYXRhIiwibGF0ZXgiLCJ3cmFwcGVyIiwidGV4dCIsIlNsYXRlRWRpdG9yIiwiZWRpdG9yUHJvcHMiLCJ2YWx1ZSIsInBsdWdpbnMiLCJyZW5kZXJFbGVtZW50IiwidXNlQ2FsbGJhY2siLCJwcm9wcyIsInJlbmRlckxlYWYiLCJlZGl0b3IiLCJ1c2VNZW1vIiwid2l0aFBsdWdpbnMiLCJjcmVhdGVFZGl0b3IiLCJ1c2VTdGF0ZSIsImlzRm9jdXNlZCIsInNldElzRm9jdXNlZCIsImVkaXRvclJlZiIsInVzZVJlZiIsInVzZUVmZmVjdCIsIm9uRWRpdG9yIiwic2xhdGVWYWx1ZSIsIkVkaXRvciIsIm5vcm1hbGl6ZSIsImZvcmNlIiwib25LZXlEb3duIiwiZXZlbnQiLCJrZXkiLCJzaGlmdEtleSIsImluc2VydFRleHQiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImhvdGtleSIsImlzSG90a2V5IiwibWFyayIsInRvZ2dsZU1hcmsiLCJvbkZvY3VzIiwib25CbHVyIiwic2V0VGltZW91dCIsImN1cnJlbnQiLCJjb250YWlucyIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsIm9uRG9uZSIsInRvZ2dsZUJsb2NrIiwiZm9ybWF0IiwiaXNBY3RpdmUiLCJpc0Jsb2NrQWN0aXZlIiwiaW5jbHVkZXMiLCJpc0xpc3QiLCJUcmFuc2Zvcm1zIiwidW53cmFwTm9kZXMiLCJtYXRjaCIsIm4iLCJpc0VkaXRvciIsIlNsYXRlRWxlbWVudCIsImlzRWxlbWVudCIsInNwbGl0IiwibmV3UHJvcGVydGllcyIsImFsaWduIiwidW5kZWZpbmVkIiwic2V0Tm9kZXMiLCJibG9jayIsIndyYXBOb2RlcyIsImlzTWFya0FjdGl2ZSIsInJlbW92ZU1hcmsiLCJhZGRNYXJrIiwiYmxvY2tUeXBlIiwic2VsZWN0aW9uIiwiQXJyYXkiLCJmcm9tIiwibm9kZXMiLCJhdCIsInVuaGFuZ1JhbmdlIiwibWFya3MiLCJFbGVtZW50IiwidXNlU2xhdGVTdGF0aWMiLCJmb2N1c2VkIiwidXNlRm9jdXNlZCIsImF0dHJpYnV0ZXMiLCJlbGVtZW50Iiwic3R5bGUiLCJ0ZXh0QWxpZ24iLCJub2RlUHJvcHMiLCJub2RlIiwicGx1Z2luVG9SZW5kZXIiLCJmaW5kIiwicGx1Z2luIiwic3VwcG9ydHMiLCJyZW5kZXJOb2RlIiwibWFyZ2luIiwiTGVhZiIsImxlYWYiLCJib2xkIiwiY29kZSIsIml0YWxpYyIsInVuZGVybGluZSIsInN0cmlrZXRocm91Z2giLCJCbG9ja0J1dHRvbiIsImljb24iLCJ1c2VTbGF0ZSIsIk1hcmtCdXR0b24iLCJsb2ciLCJkZWJ1ZyIsImRlZmF1bHRUb29sYmFyT3B0cyIsInBvc2l0aW9uIiwiYWxpZ25tZW50IiwiYWx3YXlzVmlzaWJsZSIsInNob3dEb25lIiwiZG9uZU9uIiwiZGVmYXVsdFJlc3BvbnNlQXJlYVByb3BzIiwib3B0aW9ucyIsInJlc3BBcmVhVG9vbGJhciIsIm9uSGFuZGxlQXJlYUNoYW5nZSIsImRlZmF1bHRMYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyIsImNyZWF0ZVRvb2xiYXJPcHRzIiwidG9vbGJhck9wdHMiLCJFZGl0b3JDb21wb25lbnQiLCJub3JtYWxpemVkUmVzcG9uc2VBcmVhUHJvcHMiLCJyZXNwb25zZUFyZWFQcm9wcyIsImJ1aWxkUGx1Z2lucyIsImFjdGl2ZVBsdWdpbnMiLCJtYXRoIiwib25DbGljayIsIm9uTWF0aENsaWNrIiwib25QbHVnaW5Gb2N1cyIsIm9uUGx1Z2luQmx1ciIsImltYWdlIiwib25EZWxldGUiLCJpbWFnZVN1cHBvcnQiLCJzcmMiLCJkb25lIiwiZSIsInN0YXRlIiwiaW5zZXJ0SW1hZ2VSZXF1ZXN0ZWQiLCJnZXRIYW5kbGVyIiwiaGFuZGxlciIsImFkZCIsIm1heEltYWdlV2lkdGgiLCJtYXhJbWFnZUhlaWdodCIsInRvb2xiYXIiLCJkaXNhYmxlU2Nyb2xsYmFyIiwiZGlzYWJsZVVuZGVybGluZSIsImF1dG9XaWR0aCIsImF1dG9XaWR0aFRvb2xiYXIiLCJ0YWJsZSIsInJlc3BvbnNlQXJlYSIsIm1heFJlc3BvbnNlQXJlYXMiLCJlcnJvciIsImxhbmd1YWdlQ2hhcmFjdGVycyIsImxhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzIiwibWVkaWEiLCJmb2N1cyIsIm9uQ2hhbmdlIiwidXBsb2FkU291bmRTdXBwb3J0IiwicmVsYXRlZFRhcmdldCIsInRhcmdldCIsImZpbmROb2RlIiwic2V0U3RhdGUiLCJmb2N1c2VkTm9kZSIsInJlc2V0VmFsdWUiLCJzdGFzaGVkVmFsdWUiLCJzdGFzaFZhbHVlIiwic2VsZWN0ZWROb2RlIiwibm9uRW1wdHkiLCJ0b29sYmFySW5Gb2N1cyIsIm9uRWRpdGluZ0RvbmUiLCJyZXNvbHZlIiwic3RhcnRUZXh0IiwibGVuZ3RoIiwidGhlbiIsIlByb21pc2UiLCJwcmVCbHVyVmFsdWUiLCJoYW5kbGVCbHVyIiwiYmluZCIsImVkaXRvckRPTSIsInF1ZXJ5U2VsZWN0b3IiLCJzdGF0ZVZhbHVlIiwid3JhcHBlclJlZiIsImVkaXRvckVsZW1lbnQiLCJjbG9zZXN0IiwiY2xhc3NOYW1lIiwidG9vbGJhckVsZW1lbnQiLCJ0b29sYmFyUmVmIiwiaXNJbkN1cnJlbnRDb21wb25lbnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiaGFuZGxlRG9tQmx1ciIsIl9fVEVNUE9SQVJZX0NIQU5HRV9EQVRBIiwiZG9tRWwiLCJjaGFuZ2UiLCJzZXROb2RlQnlLZXkiLCJhZGRFdmVudExpc3RlbmVyIiwic3RvcFJlc2V0IiwicmVkdWNlIiwicyIsInAiLCJ0b09iamVjdCIsIm5ld1ZhbHVlIiwiVmFsdWUiLCJmcm9tSlNPTiIsInRvSlNPTiIsImNoYXJhY3RlcnNMaW1pdCIsImFsbFRleHQiLCJzdHJpbmciLCJodG1sIiwidmFsdWVUb0h0bWwiLCJodG1sVG9WYWx1ZSIsInYiLCJlbmRzV2l0aCIsInBhcnNlSW50IiwiaXNOYU4iLCJvYmplY3QiLCJsYXN0IiwicGFyZW50IiwiZ2V0UGFyZW50IiwiQmxvY2siLCJwb3MiLCJkcm9wQ29udGV4dCIsInRyYW5zZmVyIiwiZ2V0RXZlbnRUcmFuc2ZlciIsImZpbGUiLCJmaWxlcyIsImZyYWdtZW50IiwiZ2V0QmFzZTY0IiwiaW5saW5lIiwiSW5saW5lIiwiY3JlYXRlIiwiaXNWb2lkIiwibG9hZGluZyIsInJhbmdlIiwiZ2V0RXZlbnRSYW5nZSIsInNlbGVjdCIsImNoIiwiaW5zZXJ0SW5saW5lIiwiSW5zZXJ0SW1hZ2VIYW5kbGVyIiwiaW5zZXJ0RnJhZ21lbnQiLCJzdGFydEJsb2NrIiwiZGVmYXVsdEJsb2NrIiwiZGVmYXVsdE1hcmtzIiwiZ2V0SW5zZXJ0TWFya3NBdFJhbmdlIiwiZnJhZyIsIlBsYWluIiwiZGVzZXJpYWxpemUiLCJwbGFjZWhvbGRlciIsInNpemUiLCJkaXNwbGF5Iiwid2lkdGgiLCJtYXhXaWR0aCIsIndoaXRlU3BhY2UiLCJvcGFjaXR5IiwicG9pbnRlckV2ZW50cyIsInVzZXJTZWxlY3QiLCJvblJlc2l6ZSIsImhhbmRsZVBsdWdpbnMiLCJvblJlZiIsIndpbmRvdyIsImF1dG9Gb2N1cyIsIm5leHRQcm9wcyIsIm5ld1Rvb2xiYXJPcHRzIiwiaXNFcXVhbCIsInplcm9XaWR0aEVscyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiZWwiLCJtaW5XaWR0aCIsIm1pbkhlaWdodCIsImhlaWdodCIsIm1heEhlaWdodCIsInZhbHVlVG9TaXplIiwiZGlzYWJsZWQiLCJzcGVsbENoZWNrIiwiaGlnaGxpZ2h0U2hhcGUiLCJjbGFzc2VzIiwicGx1Z2luUHJvcHMiLCJzaXplU3R5bGUiLCJidWlsZFNpemVTdHlsZSIsIm5hbWVzIiwiY2xhc3NOYW1lcyIsIndpdGhCZyIsInRvb2xiYXJPblRvcCIsInNsYXRlRWRpdG9yIiwicmVmIiwiciIsImdldEZvY3VzZWRWYWx1ZSIsIm9uRHJvcFBhc3RlIiwibm9QYWRkaW5nIiwibm9Cb3JkZXIiLCJyZW5kZXJQbGFjZWhvbGRlciIsIlJlYWN0IiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwiYm9vbCIsImZ1bmMiLCJpc1JlcXVpcmVkIiwiYXJyYXlPZiIsInNoYXBlIiwiYXJyYXkiLCJudW1iZXIiLCJvbmVPZlR5cGUiLCJhbnkiLCJvbmVPZiIsImxhbmd1YWdlIiwiY2hhcmFjdGVySWNvbiIsImNoYXJhY3RlcnMiLCJ2YWx1ZXMiLCJhbGxWYWxpZCIsImV2ZXJ5IiwiQUxMX1BMVUdJTlMiLCJFcnJvciIsImpvaW4iLCJzdHlsZXMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJmb250RmFtaWx5IiwidGFibGVMYXlvdXQiLCJib3JkZXJDb2xsYXBzZSIsImNvbG9yIiwiYmFja2dyb3VuZCIsImJvcmRlclRvcCIsInBhZGRpbmciLCJib3JkZXIiLCJtYXJnaW5Ub3AiLCJ3aXRoU3R5bGVzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2VkaXRvci5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBFZGl0b3IgYXMgT2xkU2xhdGVFZGl0b3IsXG4gIGZpbmROb2RlLFxuICBnZXRFdmVudFJhbmdlLFxuICBnZXRFdmVudFRyYW5zZmVyLFxuICB1c2VTbGF0ZVN0YXRpY1xufSBmcm9tICdzbGF0ZS1yZWFjdCc7XG5pbXBvcnQgUm9vdFJlZiBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9Sb290UmVmJztcblxuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0ICogYXMgc2VyaWFsaXphdGlvbiBmcm9tICcuL25ldy1zZXJpYWxpemF0aW9uJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBWYWx1ZSwgQmxvY2ssIElubGluZSB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IEFMTF9QTFVHSU5TLCBERUZBVUxUX1BMVUdJTlMsIGJ1aWxkUGx1Z2lucywgd2l0aFBsdWdpbnMgfSBmcm9tICcuL3BsdWdpbnMnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IHdpdGhTdHlsZXMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9zdHlsZXMnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ0BwaWUtbGliL3JlbmRlci11aSc7XG5pbXBvcnQgUGxhaW4gZnJvbSAnc2xhdGUtcGxhaW4tc2VyaWFsaXplcic7XG5cbmltcG9ydCB7IGdldEJhc2U2NCwgaHRtbFRvVmFsdWUsIHZhbHVlVG9IdG1sIH0gZnJvbSAnLi9uZXctc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgSW5zZXJ0SW1hZ2VIYW5kbGVyIGZyb20gJy4vcGx1Z2lucy9pbWFnZS9pbnNlcnQtaW1hZ2UtaGFuZGxlcic7XG5cbmltcG9ydCBpc0hvdGtleSBmcm9tICdpcy1ob3RrZXknO1xuaW1wb3J0IHsgRWRpdGFibGUsIHVzZUZvY3VzZWQsIHdpdGhSZWFjdCwgdXNlU2xhdGUsIFNsYXRlIH0gZnJvbSAnc2xhdGUtcmVhY3QnO1xuaW1wb3J0IHsgRWRpdG9yLCBUcmFuc2Zvcm1zLCBjcmVhdGVFZGl0b3IsIEVsZW1lbnQgYXMgU2xhdGVFbGVtZW50IH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgd2l0aEhpc3RvcnkgfSBmcm9tICdzbGF0ZS1oaXN0b3J5JztcbmltcG9ydCB7IE1hdGhQcmV2aWV3IH0gZnJvbSAnQHBpZS1saWIvbWF0aC10b29sYmFyJztcblxuaW1wb3J0IHsgQnV0dG9uLCBJY29uLCBUb29sYmFyIH0gZnJvbSAnLi9jb21wb25lbnRzJztcbmltcG9ydCBFZGl0b3JBbmRUb29sYmFyIGZyb20gJy4vcGx1Z2lucy90b29sYmFyL2VkaXRvci1hbmQtdG9vbGJhcic7XG5cbmNvbnN0IEhPVEtFWVMgPSB7XG4gICdtb2QrYic6ICdib2xkJyxcbiAgJ21vZCtpJzogJ2l0YWxpYycsXG4gICdtb2QrdSc6ICd1bmRlcmxpbmUnLFxuICAnbW9kK2AnOiAnY29kZSdcbn07XG5cbmNvbnN0IExJU1RfVFlQRVMgPSBbJ251bWJlcmVkLWxpc3QnLCAnYnVsbGV0ZWQtbGlzdCddO1xuY29uc3QgVEVYVF9BTElHTl9UWVBFUyA9IFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnLCAnanVzdGlmeSddO1xuXG5jb25zdCBpbml0aWFsVmFsdWUgPSBbXG4gIHtcbiAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICBjaGlsZHJlbjogW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnbWF0aCcsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBsYXRleDogJ1xcXFxmcmFjezF9ezJ9JyxcbiAgICAgICAgICB3cmFwcGVyOiAncm91bmRfYnJhY2tldHMnXG4gICAgICAgIH0sXG4gICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogJ1xcXFwoXFxcXGZyYWN7MX17Mn1cXFxcKSdcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdXG4gIH1cbl07XG5cbmNvbnN0IFNsYXRlRWRpdG9yID0gZWRpdG9yUHJvcHMgPT4ge1xuICBjb25zdCB7IHZhbHVlLCBwbHVnaW5zIH0gPSBlZGl0b3JQcm9wcztcbiAgY29uc3QgcmVuZGVyRWxlbWVudCA9IHVzZUNhbGxiYWNrKHByb3BzID0+IDxFbGVtZW50IHsuLi5wcm9wc30gcGx1Z2lucz17cGx1Z2luc30gLz4sIFtdKTtcbiAgY29uc3QgcmVuZGVyTGVhZiA9IHVzZUNhbGxiYWNrKHByb3BzID0+IDxMZWFmIHsuLi5wcm9wc30gLz4sIFtdKTtcbiAgY29uc3QgZWRpdG9yID0gdXNlTWVtbygoKSA9PiB3aXRoUGx1Z2lucyhjcmVhdGVFZGl0b3IoKSwgcGx1Z2lucyksIFtdKTtcbiAgY29uc3QgW2lzRm9jdXNlZCwgc2V0SXNGb2N1c2VkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgZWRpdG9yUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGVkaXRvclByb3BzLm9uRWRpdG9yKSB7XG4gICAgICBlZGl0b3JQcm9wcy5vbkVkaXRvcihlZGl0b3IpO1xuICAgIH1cbiAgfSwgW2VkaXRvcl0pO1xuXG4gIGNvbnN0IHNsYXRlVmFsdWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAvLyBTbGF0ZSB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIHZhbHVlIG9uIHRoZSBpbml0aWFsIHJlbmRlciBpcyBpbnZhbGlkXG4gICAgLy8gc28gd2UgZGlyZWN0bHkgc2V0IHRoZSB2YWx1ZSBvbiB0aGUgZWRpdG9yIGluIG9yZGVyXG4gICAgLy8gdG8gYmUgYWJsZSB0byB0cmlnZ2VyIG5vcm1hbGl6YXRpb24gb24gdGhlIGluaXRpYWwgdmFsdWUgYmVmb3JlIHJlbmRlcmluZ1xuICAgIGVkaXRvci5jaGlsZHJlbiA9IHZhbHVlO1xuICAgIEVkaXRvci5ub3JtYWxpemUoZWRpdG9yLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIC8vIFdlIHJldHVybiB0aGUgbm9ybWFsaXplZCBpbnRlcm5hbCB2YWx1ZSBzbyB0aGF0IHRoZSByZW5kZXJpbmcgY2FuIHRha2Ugb3ZlciBmcm9tIGhlcmVcbiAgICByZXR1cm4gZWRpdG9yLmNoaWxkcmVuO1xuICB9LCBbZWRpdG9yLCB2YWx1ZV0pO1xuXG4gIGNvbnN0IG9uS2V5RG93biA9IGV2ZW50ID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmIGV2ZW50LnNoaWZ0S2V5ID09PSB0cnVlKSB7XG4gICAgICBlZGl0b3IuaW5zZXJ0VGV4dCgnXFxuJyk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaG90a2V5IGluIEhPVEtFWVMpIHtcbiAgICAgIGlmIChpc0hvdGtleShob3RrZXksIGV2ZW50KSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBtYXJrID0gSE9US0VZU1tob3RrZXldO1xuICAgICAgICB0b2dnbGVNYXJrKGVkaXRvciwgbWFyayk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBvbkZvY3VzID0gKCkgPT4gc2V0SXNGb2N1c2VkKHRydWUpO1xuICBjb25zdCBvbkJsdXIgPSAoKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50IHx8ICFlZGl0b3JSZWYuY3VycmVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICBzZXRJc0ZvY3VzZWQoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIDUwKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxTbGF0ZSBlZGl0b3I9e2VkaXRvcn0gdmFsdWU9e3NsYXRlVmFsdWV9PlxuICAgICAgPFJvb3RSZWYgcm9vdFJlZj17ZWRpdG9yUmVmfT5cbiAgICAgICAgPEVkaXRvckFuZFRvb2xiYXJcbiAgICAgICAgICB7Li4uZWRpdG9yUHJvcHN9XG4gICAgICAgICAgZWRpdG9yPXtlZGl0b3J9XG4gICAgICAgICAgaXNGb2N1c2VkPXtpc0ZvY3VzZWR9XG4gICAgICAgICAgb25Eb25lPXsoKSA9PiB7XG4gICAgICAgICAgICBzZXRJc0ZvY3VzZWQoZmFsc2UpO1xuICAgICAgICAgICAgZWRpdG9yUHJvcHMub25Eb25lKGVkaXRvcik7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxFZGl0YWJsZVxuICAgICAgICAgICAgcmVuZGVyRWxlbWVudD17cmVuZGVyRWxlbWVudH1cbiAgICAgICAgICAgIHJlbmRlckxlYWY9e3JlbmRlckxlYWZ9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHNvbWUgcmljaCB0ZXh04oCmXCJcbiAgICAgICAgICAgIHNwZWxsQ2hlY2tcbiAgICAgICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgICAgICAgIG9uQmx1cj17b25CbHVyfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvRWRpdG9yQW5kVG9vbGJhcj5cbiAgICAgIDwvUm9vdFJlZj5cbiAgICA8L1NsYXRlPlxuICApO1xufTtcblxuY29uc3QgdG9nZ2xlQmxvY2sgPSAoZWRpdG9yLCBmb3JtYXQpID0+IHtcbiAgY29uc3QgaXNBY3RpdmUgPSBpc0Jsb2NrQWN0aXZlKFxuICAgIGVkaXRvcixcbiAgICBmb3JtYXQsXG4gICAgVEVYVF9BTElHTl9UWVBFUy5pbmNsdWRlcyhmb3JtYXQpID8gJ2FsaWduJyA6ICd0eXBlJ1xuICApO1xuICBjb25zdCBpc0xpc3QgPSBMSVNUX1RZUEVTLmluY2x1ZGVzKGZvcm1hdCk7XG5cbiAgVHJhbnNmb3Jtcy51bndyYXBOb2RlcyhlZGl0b3IsIHtcbiAgICBtYXRjaDogbiA9PlxuICAgICAgIUVkaXRvci5pc0VkaXRvcihuKSAmJlxuICAgICAgU2xhdGVFbGVtZW50LmlzRWxlbWVudChuKSAmJlxuICAgICAgTElTVF9UWVBFUy5pbmNsdWRlcyhuLnR5cGUpICYmXG4gICAgICAhVEVYVF9BTElHTl9UWVBFUy5pbmNsdWRlcyhmb3JtYXQpLFxuICAgIHNwbGl0OiB0cnVlXG4gIH0pO1xuICBsZXQgbmV3UHJvcGVydGllcztcbiAgaWYgKFRFWFRfQUxJR05fVFlQRVMuaW5jbHVkZXMoZm9ybWF0KSkge1xuICAgIG5ld1Byb3BlcnRpZXMgPSB7XG4gICAgICBhbGlnbjogaXNBY3RpdmUgPyB1bmRlZmluZWQgOiBmb3JtYXRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG5ld1Byb3BlcnRpZXMgPSB7XG4gICAgICB0eXBlOiBpc0FjdGl2ZSA/ICdwYXJhZ3JhcGgnIDogaXNMaXN0ID8gJ2xpc3RfaXRlbScgOiBmb3JtYXRcbiAgICB9O1xuICB9XG4gIFRyYW5zZm9ybXMuc2V0Tm9kZXMoZWRpdG9yLCBuZXdQcm9wZXJ0aWVzKTtcblxuICBpZiAoIWlzQWN0aXZlICYmIGlzTGlzdCkge1xuICAgIGNvbnN0IGJsb2NrID0geyB0eXBlOiBmb3JtYXQsIGNoaWxkcmVuOiBbXSB9O1xuICAgIFRyYW5zZm9ybXMud3JhcE5vZGVzKGVkaXRvciwgYmxvY2spO1xuICB9XG59O1xuXG5jb25zdCB0b2dnbGVNYXJrID0gKGVkaXRvciwgZm9ybWF0KSA9PiB7XG4gIGNvbnN0IGlzQWN0aXZlID0gaXNNYXJrQWN0aXZlKGVkaXRvciwgZm9ybWF0KTtcblxuICBpZiAoaXNBY3RpdmUpIHtcbiAgICBFZGl0b3IucmVtb3ZlTWFyayhlZGl0b3IsIGZvcm1hdCk7XG4gIH0gZWxzZSB7XG4gICAgRWRpdG9yLmFkZE1hcmsoZWRpdG9yLCBmb3JtYXQsIHRydWUpO1xuICB9XG59O1xuXG5jb25zdCBpc0Jsb2NrQWN0aXZlID0gKGVkaXRvciwgZm9ybWF0LCBibG9ja1R5cGUgPSAndHlwZScpID0+IHtcbiAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IGVkaXRvcjtcbiAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBbbWF0Y2hdID0gQXJyYXkuZnJvbShcbiAgICBFZGl0b3Iubm9kZXMoZWRpdG9yLCB7XG4gICAgICBhdDogRWRpdG9yLnVuaGFuZ1JhbmdlKGVkaXRvciwgc2VsZWN0aW9uKSxcbiAgICAgIG1hdGNoOiBuID0+ICFFZGl0b3IuaXNFZGl0b3IobikgJiYgU2xhdGVFbGVtZW50LmlzRWxlbWVudChuKSAmJiBuW2Jsb2NrVHlwZV0gPT09IGZvcm1hdFxuICAgIH0pXG4gICk7XG5cbiAgcmV0dXJuICEhbWF0Y2g7XG59O1xuXG5jb25zdCBpc01hcmtBY3RpdmUgPSAoZWRpdG9yLCBmb3JtYXQpID0+IHtcbiAgY29uc3QgbWFya3MgPSBFZGl0b3IubWFya3MoZWRpdG9yKTtcbiAgcmV0dXJuIG1hcmtzID8gbWFya3NbZm9ybWF0XSA9PT0gdHJ1ZSA6IGZhbHNlO1xufTtcblxuY29uc3QgRWxlbWVudCA9IHByb3BzID0+IHtcbiAgY29uc3QgZWRpdG9yID0gdXNlU2xhdGVTdGF0aWMoKTtcbiAgY29uc3QgZm9jdXNlZCA9IHVzZUZvY3VzZWQoKTtcbiAgY29uc3QgeyBhdHRyaWJ1dGVzLCBjaGlsZHJlbiwgZWxlbWVudCwgcGx1Z2lucyB9ID0gcHJvcHM7XG4gIGNvbnN0IHN0eWxlID0geyB0ZXh0QWxpZ246IGVsZW1lbnQuYWxpZ24gfTtcblxuICBjb25zdCBub2RlUHJvcHMgPSB7IC4uLmF0dHJpYnV0ZXMsIC4uLnByb3BzLCBub2RlOiB7IC4uLmVsZW1lbnQgfSwgY2hpbGRyZW4gfTtcbiAgY29uc3QgcGx1Z2luVG9SZW5kZXIgPSBwbHVnaW5zLmZpbmQoXG4gICAgcGx1Z2luID0+IHR5cGVvZiBwbHVnaW4uc3VwcG9ydHMgPT09ICdmdW5jdGlvbicgJiYgcGx1Z2luLnN1cHBvcnRzKGVsZW1lbnQpXG4gICk7XG5cbiAgaWYgKHBsdWdpblRvUmVuZGVyKSB7XG4gICAgcmV0dXJuIHBsdWdpblRvUmVuZGVyLnJlbmRlck5vZGUoeyAuLi5ub2RlUHJvcHMsIGVkaXRvciwgZm9jdXNlZCB9KTtcbiAgfVxuXG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSAnYmxvY2stcXVvdGUnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGJsb2NrcXVvdGUgc3R5bGU9e3N0eWxlfSB7Li4uYXR0cmlidXRlc30+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L2Jsb2NrcXVvdGU+XG4gICAgICApO1xuICAgIGNhc2UgJ2J1bGxldGVkLWxpc3QnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHVsIHN0eWxlPXtzdHlsZX0gey4uLmF0dHJpYnV0ZXN9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC91bD5cbiAgICAgICk7XG4gICAgY2FzZSAnaGVhZGluZy1vbmUnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGgxIHN0eWxlPXtzdHlsZX0gey4uLmF0dHJpYnV0ZXN9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9oMT5cbiAgICAgICk7XG4gICAgY2FzZSAnaGVhZGluZy10d28nOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGgyIHN0eWxlPXtzdHlsZX0gey4uLmF0dHJpYnV0ZXN9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9oMj5cbiAgICAgICk7XG4gICAgY2FzZSAnbGlzdC1pdGVtJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxsaSBzdHlsZT17c3R5bGV9IHsuLi5hdHRyaWJ1dGVzfT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvbGk+XG4gICAgICApO1xuICAgIGNhc2UgJ251bWJlcmVkLWxpc3QnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPG9sIHN0eWxlPXtzdHlsZX0gey4uLmF0dHJpYnV0ZXN9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9vbD5cbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICBtYXJnaW46IDBcbiAgICAgICAgICB9fVxuICAgICAgICAgIHsuLi5hdHRyaWJ1dGVzfVxuICAgICAgICA+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gIH1cbn07XG5cbmNvbnN0IExlYWYgPSAoeyBhdHRyaWJ1dGVzLCBjaGlsZHJlbiwgbGVhZiB9KSA9PiB7XG4gIGlmIChsZWFmLmJvbGQpIHtcbiAgICBjaGlsZHJlbiA9IDxzdHJvbmc+e2NoaWxkcmVufTwvc3Ryb25nPjtcbiAgfVxuXG4gIGlmIChsZWFmLmNvZGUpIHtcbiAgICBjaGlsZHJlbiA9IDxjb2RlPntjaGlsZHJlbn08L2NvZGU+O1xuICB9XG5cbiAgaWYgKGxlYWYuaXRhbGljKSB7XG4gICAgY2hpbGRyZW4gPSA8ZW0+e2NoaWxkcmVufTwvZW0+O1xuICB9XG5cbiAgaWYgKGxlYWYudW5kZXJsaW5lKSB7XG4gICAgY2hpbGRyZW4gPSA8dT57Y2hpbGRyZW59PC91PjtcbiAgfVxuXG4gIGlmIChsZWFmLnN0cmlrZXRocm91Z2gpIHtcbiAgICBjaGlsZHJlbiA9IDxkZWw+e2NoaWxkcmVufTwvZGVsPjtcbiAgfVxuXG4gIHJldHVybiA8c3BhbiB7Li4uYXR0cmlidXRlc30+e2NoaWxkcmVufTwvc3Bhbj47XG59O1xuXG5jb25zdCBCbG9ja0J1dHRvbiA9ICh7IGZvcm1hdCwgaWNvbiB9KSA9PiB7XG4gIGNvbnN0IGVkaXRvciA9IHVzZVNsYXRlKCk7XG4gIHJldHVybiAoXG4gICAgPEJ1dHRvblxuICAgICAgYWN0aXZlPXtpc0Jsb2NrQWN0aXZlKGVkaXRvciwgZm9ybWF0LCBURVhUX0FMSUdOX1RZUEVTLmluY2x1ZGVzKGZvcm1hdCkgPyAnYWxpZ24nIDogJ3R5cGUnKX1cbiAgICAgIG9uTW91c2VEb3duPXtldmVudCA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRvZ2dsZUJsb2NrKGVkaXRvciwgZm9ybWF0KTtcbiAgICAgIH19XG4gICAgPlxuICAgICAgPEljb24+e2ljb259PC9JY29uPlxuICAgIDwvQnV0dG9uPlxuICApO1xufTtcblxuY29uc3QgTWFya0J1dHRvbiA9ICh7IGZvcm1hdCwgaWNvbiB9KSA9PiB7XG4gIGNvbnN0IGVkaXRvciA9IHVzZVNsYXRlKCk7XG4gIHJldHVybiAoXG4gICAgPEJ1dHRvblxuICAgICAgYWN0aXZlPXtpc01hcmtBY3RpdmUoZWRpdG9yLCBmb3JtYXQpfVxuICAgICAgb25Nb3VzZURvd249e2V2ZW50ID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdG9nZ2xlTWFyayhlZGl0b3IsIGZvcm1hdCk7XG4gICAgICB9fVxuICAgID5cbiAgICAgIDxJY29uPntpY29ufTwvSWNvbj5cbiAgICA8L0J1dHRvbj5cbiAgKTtcbn07XG5cbi8vIG9sZC1lZGl0YWJsZVxuXG5leHBvcnQgeyBBTExfUExVR0lOUywgREVGQVVMVF9QTFVHSU5TLCBzZXJpYWxpemF0aW9uIH07XG5cbmNvbnN0IGxvZyA9IGRlYnVnKCdlZGl0YWJsZS1odG1sOmVkaXRvcicpO1xuXG5jb25zdCBkZWZhdWx0VG9vbGJhck9wdHMgPSB7XG4gIHBvc2l0aW9uOiAnYm90dG9tJyxcbiAgYWxpZ25tZW50OiAnbGVmdCcsXG4gIGFsd2F5c1Zpc2libGU6IGZhbHNlLFxuICBzaG93RG9uZTogdHJ1ZSxcbiAgZG9uZU9uOiAnYmx1cidcbn07XG5cbmNvbnN0IGRlZmF1bHRSZXNwb25zZUFyZWFQcm9wcyA9IHtcbiAgb3B0aW9uczoge30sXG4gIHJlc3BBcmVhVG9vbGJhcjogKCkgPT4ge30sXG4gIG9uSGFuZGxlQXJlYUNoYW5nZTogKCkgPT4ge31cbn07XG5cbmNvbnN0IGRlZmF1bHRMYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyA9IFtdO1xuXG5jb25zdCBjcmVhdGVUb29sYmFyT3B0cyA9IHRvb2xiYXJPcHRzID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5kZWZhdWx0VG9vbGJhck9wdHMsXG4gICAgLi4udG9vbGJhck9wdHNcbiAgfTtcbn07XG5cbmV4cG9ydCBjbGFzcyBFZGl0b3JDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGF1dG9Gb2N1czogUHJvcFR5cGVzLmJvb2wsXG4gICAgb25SZWY6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25FZGl0b3I6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uRm9jdXM6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25LZXlEb3duOiBQcm9wVHlwZXMuZnVuYyxcbiAgICB2YWx1ZTogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmFycmF5LFxuICAgICAgICBkYXRhOiBQcm9wVHlwZXMub2JqZWN0XG4gICAgICB9KVxuICAgICksXG4gICAgaW1hZ2VTdXBwb3J0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHVwbG9hZFNvdW5kU3VwcG9ydDogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGFkZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBkZWxldGU6IFByb3BUeXBlcy5mdW5jXG4gICAgfSksXG4gICAgY2hhcmFjdGVyc0xpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHdpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgaGVpZ2h0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgbWluSGVpZ2h0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgbWF4SGVpZ2h0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIGhpZ2hsaWdodFNoYXBlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgc3BlbGxDaGVjazogUHJvcFR5cGVzLmJvb2wsXG4gICAgbm9uRW1wdHk6IFByb3BUeXBlcy5ib29sLFxuICAgIGRpc2FibGVTY3JvbGxiYXI6IFByb3BUeXBlcy5ib29sLFxuICAgIGRpc2FibGVVbmRlcmxpbmU6IFByb3BUeXBlcy5ib29sLFxuICAgIGF1dG9XaWR0aFRvb2xiYXI6IFByb3BUeXBlcy5ib29sLFxuICAgIHBsdWdpblByb3BzOiBQcm9wVHlwZXMuYW55LFxuICAgIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHJlc3BvbnNlQXJlYVByb3BzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKFtcbiAgICAgICAgJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJyxcbiAgICAgICAgJ2lubGluZS1kcm9wZG93bicsXG4gICAgICAgICdkcmFnLWluLXRoZS1ibGFuaydcbiAgICAgIF0pLFxuICAgICAgb3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIHJlc3BBcmVhVG9vbGJhcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkhhbmRsZUFyZWFDaGFuZ2U6IFByb3BUeXBlcy5mdW5jXG4gICAgfSksXG4gICAgbGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHM6IFByb3BUeXBlcy5hcnJheU9mKFxuICAgICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgbGFuZ3VhZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgIGNoYXJhY3Rlckljb246IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgIGNoYXJhY3RlcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpKVxuICAgICAgfSlcbiAgICApLFxuICAgIHRvb2xiYXJPcHRzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgcG9zaXRpb246IFByb3BUeXBlcy5vbmVPZihbJ2JvdHRvbScsICd0b3AnXSksXG4gICAgICBhbGlnbm1lbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2xlZnQnLCAncmlnaHQnXSksXG4gICAgICBhbHdheXNWaXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIHNob3dEb25lOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGRvbmVPbjogUHJvcFR5cGVzLnN0cmluZ1xuICAgIH0pLFxuICAgIGFjdGl2ZVBsdWdpbnM6IFByb3BUeXBlcy5hcnJheU9mKHZhbHVlcyA9PiB7XG4gICAgICBjb25zdCBhbGxWYWxpZCA9IHZhbHVlcy5ldmVyeSh2ID0+IEFMTF9QTFVHSU5TLmluY2x1ZGVzKHYpKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgIWFsbFZhbGlkICYmXG4gICAgICAgIG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZXM6ICR7dmFsdWVzfSwgdmFsdWVzIG11c3QgYmUgb25lIG9mIFske0FMTF9QTFVHSU5TLmpvaW4oJywnKX1dYClcbiAgICAgICk7XG4gICAgfSksXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG1heEltYWdlV2lkdGg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgbWF4SW1hZ2VIZWlnaHQ6IFByb3BUeXBlcy5udW1iZXJcbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGRpc2FibGVVbmRlcmxpbmU6IHRydWUsXG4gICAgb25Gb2N1czogKCkgPT4ge30sXG4gICAgb25CbHVyOiAoKSA9PiB7fSxcbiAgICBvbktleURvd246ICgpID0+IHt9LFxuICAgIHRvb2xiYXJPcHRzOiBkZWZhdWx0VG9vbGJhck9wdHMsXG4gICAgcmVzcG9uc2VBcmVhUHJvcHM6IGRlZmF1bHRSZXNwb25zZUFyZWFQcm9wcyxcbiAgICBsYW5ndWFnZUNoYXJhY3RlcnNQcm9wczogZGVmYXVsdExhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzXG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHZhbHVlOiBwcm9wcy52YWx1ZSxcbiAgICAgIHRvb2xiYXJPcHRzOiBjcmVhdGVUb29sYmFyT3B0cyhwcm9wcy50b29sYmFyT3B0cylcbiAgICB9O1xuXG4gICAgdGhpcy5vblJlc2l6ZSA9ICgpID0+IHtcbiAgICAgIHByb3BzLm9uQ2hhbmdlKHRoaXMuc3RhdGUudmFsdWUsIHRydWUpO1xuICAgIH07XG5cbiAgICB0aGlzLmhhbmRsZVBsdWdpbnModGhpcy5wcm9wcyk7XG4gIH1cblxuICBoYW5kbGVQbHVnaW5zID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNwb25zZUFyZWFQcm9wcyA9IHtcbiAgICAgIC4uLmRlZmF1bHRSZXNwb25zZUFyZWFQcm9wcyxcbiAgICAgIC4uLnByb3BzLnJlc3BvbnNlQXJlYVByb3BzXG4gICAgfTtcblxuICAgIHRoaXMucGx1Z2lucyA9IGJ1aWxkUGx1Z2lucyhwcm9wcy5hY3RpdmVQbHVnaW5zLCB7XG4gICAgICBtYXRoOiB7XG4gICAgICAgIG9uQ2xpY2s6IHRoaXMub25NYXRoQ2xpY2ssXG4gICAgICAgIG9uRm9jdXM6IHRoaXMub25QbHVnaW5Gb2N1cyxcbiAgICAgICAgb25CbHVyOiB0aGlzLm9uUGx1Z2luQmx1clxuICAgICAgfSxcbiAgICAgIGltYWdlOiB7XG4gICAgICAgIG9uRGVsZXRlOlxuICAgICAgICAgIHByb3BzLmltYWdlU3VwcG9ydCAmJlxuICAgICAgICAgIHByb3BzLmltYWdlU3VwcG9ydC5kZWxldGUgJiZcbiAgICAgICAgICAoKHNyYywgZG9uZSkgPT4ge1xuICAgICAgICAgICAgcHJvcHMuaW1hZ2VTdXBwb3J0LmRlbGV0ZShzcmMsIGUgPT4ge1xuICAgICAgICAgICAgICBkb25lKGUsIHRoaXMuc3RhdGUudmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgIGluc2VydEltYWdlUmVxdWVzdGVkOlxuICAgICAgICAgIHByb3BzLmltYWdlU3VwcG9ydCAmJlxuICAgICAgICAgIChnZXRIYW5kbGVyID0+IHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGhhbmRsZXIgaXMgdGhlIG9iamVjdCB0aHJvdWdoIHdoaWNoIHRoZSBvdXRlciBjb250ZXh0XG4gICAgICAgICAgICAgKiBjb21tdW5pY2F0ZXMgZmlsZSB1cGxvYWQgZXZlbnRzIGxpa2U6IGZpbGVDaG9zZW4sIGNhbmNlbCwgcHJvZ3Jlc3NcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGdldEhhbmRsZXIoKCkgPT4gdGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICAgICAgICBwcm9wcy5pbWFnZVN1cHBvcnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICAgIH0pLFxuICAgICAgICBvbkZvY3VzOiB0aGlzLm9uUGx1Z2luRm9jdXMsXG4gICAgICAgIG9uQmx1cjogdGhpcy5vblBsdWdpbkJsdXIsXG4gICAgICAgIG1heEltYWdlV2lkdGg6IHRoaXMucHJvcHMubWF4SW1hZ2VXaWR0aCxcbiAgICAgICAgbWF4SW1hZ2VIZWlnaHQ6IHRoaXMucHJvcHMubWF4SW1hZ2VIZWlnaHRcbiAgICAgIH0sXG4gICAgICB0b29sYmFyOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUbyBtaW5pbWl6ZSBjb252ZXJ0aW5nIGh0bWwgLT4gc3RhdGUgLT4gaHRtbFxuICAgICAgICAgKiBXZSBvbmx5IGVtaXQgbWFya3VwIG9uY2UgJ2RvbmUnIGlzIGNsaWNrZWQuXG4gICAgICAgICAqL1xuICAgICAgICBkaXNhYmxlU2Nyb2xsYmFyOiAhIXByb3BzLmRpc2FibGVTY3JvbGxiYXIsXG4gICAgICAgIGRpc2FibGVVbmRlcmxpbmU6IHByb3BzLmRpc2FibGVVbmRlcmxpbmUsXG4gICAgICAgIGF1dG9XaWR0aDogcHJvcHMuYXV0b1dpZHRoVG9vbGJhclxuICAgICAgfSxcbiAgICAgIHRhYmxlOiB7XG4gICAgICAgIG9uRm9jdXM6ICgpID0+IHtcbiAgICAgICAgICBsb2coJ1t0YWJsZTpvbkZvY3VzXS4uLicpO1xuICAgICAgICAgIHRoaXMub25QbHVnaW5Gb2N1cygpO1xuICAgICAgICB9LFxuICAgICAgICBvbkJsdXI6ICgpID0+IHtcbiAgICAgICAgICBsb2coJ1t0YWJsZTpvbkJsdXJdLi4uJyk7XG4gICAgICAgICAgdGhpcy5vblBsdWdpbkJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlc3BvbnNlQXJlYToge1xuICAgICAgICB0eXBlOiBub3JtYWxpemVkUmVzcG9uc2VBcmVhUHJvcHMudHlwZSxcbiAgICAgICAgb3B0aW9uczogbm9ybWFsaXplZFJlc3BvbnNlQXJlYVByb3BzLm9wdGlvbnMsXG4gICAgICAgIG1heFJlc3BvbnNlQXJlYXM6IG5vcm1hbGl6ZWRSZXNwb25zZUFyZWFQcm9wcy5tYXhSZXNwb25zZUFyZWFzLFxuICAgICAgICByZXNwQXJlYVRvb2xiYXI6IG5vcm1hbGl6ZWRSZXNwb25zZUFyZWFQcm9wcy5yZXNwQXJlYVRvb2xiYXIsXG4gICAgICAgIG9uSGFuZGxlQXJlYUNoYW5nZTogbm9ybWFsaXplZFJlc3BvbnNlQXJlYVByb3BzLm9uSGFuZGxlQXJlYUNoYW5nZSxcbiAgICAgICAgZXJyb3I6IG5vcm1hbGl6ZWRSZXNwb25zZUFyZWFQcm9wcy5lcnJvcixcbiAgICAgICAgb25Gb2N1czogKCkgPT4ge1xuICAgICAgICAgIGxvZygnW3RhYmxlOm9uRm9jdXNdLi4uJyk7XG4gICAgICAgICAgdGhpcy5vblBsdWdpbkZvY3VzKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmx1cjogKCkgPT4ge1xuICAgICAgICAgIGxvZygnW3RhYmxlOm9uQmx1cl0uLi4nKTtcbiAgICAgICAgICB0aGlzLm9uUGx1Z2luQmx1cigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGFuZ3VhZ2VDaGFyYWN0ZXJzOiBwcm9wcy5sYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyxcbiAgICAgIG1lZGlhOiB7XG4gICAgICAgIGZvY3VzOiB0aGlzLmZvY3VzLFxuICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSxcbiAgICAgICAgdXBsb2FkU291bmRTdXBwb3J0OiBwcm9wcy51cGxvYWRTb3VuZFN1cHBvcnRcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAvLyBvblJlZiBpcyBuZWVkZWQgdG8gZ2V0IHRoZSByZWYgb2YgdGhlIGNvbXBvbmVudCBiZWNhdXNlIHdlIGV4cG9ydCBpdCB1c2luZyB3aXRoU3R5bGVzXG4gICAgdGhpcy5wcm9wcy5vblJlZih0aGlzKTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplKTtcblxuICAgIGlmICh0aGlzLmVkaXRvciAmJiB0aGlzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgICAgIGNvbnN0IGVkaXRvckRPTSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICBgW2RhdGEta2V5PVwiJHt0aGlzLmVkaXRvci52YWx1ZS5kb2N1bWVudC5rZXl9XCJdYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoZWRpdG9yRE9NKSB7XG4gICAgICAgICAgICBlZGl0b3JET00uZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgY29uc3QgeyB0b29sYmFyT3B0cyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBuZXdUb29sYmFyT3B0cyA9IGNyZWF0ZVRvb2xiYXJPcHRzKG5leHRQcm9wcy50b29sYmFyT3B0cyk7XG5cbiAgICBpZiAoIWlzRXF1YWwobmV3VG9vbGJhck9wdHMsIHRvb2xiYXJPcHRzKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHRvb2xiYXJPcHRzOiBuZXdUb29sYmFyT3B0c1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0VxdWFsKG5leHRQcm9wcy5sYW5ndWFnZUNoYXJhY3RlcnNQcm9wcywgdGhpcy5wcm9wcy5sYW5ndWFnZUNoYXJhY3RlcnNQcm9wcykpIHtcbiAgICAgIHRoaXMuaGFuZGxlUGx1Z2lucyhuZXh0UHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAvLyBUaGUgY3Vyc29yIGlzIG9uIGEgemVybyB3aWR0aCBlbGVtZW50IGFuZCB3aGVuIHRoYXQgaXMgcGxhY2VkIG5lYXIgdm9pZCBlbGVtZW50cywgaXQgaXMgbm90IHZpc2libGVcbiAgICAvLyBzbyB3ZSBpbmNyZWFzZSB0aGUgd2lkdGggdG8gYXQgbGVhc3QgMnB4IGluIG9yZGVyIGZvciB0aGUgdXNlciB0byBzZWUgaXRcbiAgICBjb25zdCB6ZXJvV2lkdGhFbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zbGF0ZS16ZXJvLXdpZHRoPVwielwiXScpO1xuXG4gICAgQXJyYXkuZnJvbSh6ZXJvV2lkdGhFbHMpLmZvckVhY2goZWwgPT4ge1xuICAgICAgZWwuc3R5bGUubWluV2lkdGggPSAnMnB4JztcbiAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgICB9KTtcbiAgfVxuXG4gIG9uUGx1Z2luQmx1ciA9IGUgPT4ge1xuICAgIGxvZygnW29uUGx1Z2luQmx1cl0nLCBlICYmIGUucmVsYXRlZFRhcmdldCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gZSAmJiBlLnJlbGF0ZWRUYXJnZXQ7XG5cbiAgICBjb25zdCBub2RlID0gdGFyZ2V0ID8gZmluZE5vZGUodGFyZ2V0LCB0aGlzLnN0YXRlLnZhbHVlKSA6IG51bGw7XG4gICAgbG9nKCdbb25QbHVnaW5CbHVyXSBub2RlOiAnLCBub2RlKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgZm9jdXNlZE5vZGU6IG5vZGUgfSwgKCkgPT4ge1xuICAgICAgdGhpcy5yZXNldFZhbHVlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgb25QbHVnaW5Gb2N1cyA9IGUgPT4ge1xuICAgIGxvZygnW29uUGx1Z2luRm9jdXNdJywgZSAmJiBlLnRhcmdldCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gZSAmJiBlLnRhcmdldDtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICBjb25zdCBub2RlID0gZmluZE5vZGUodGFyZ2V0LCB0aGlzLnN0YXRlLnZhbHVlKTtcbiAgICAgIGxvZygnW29uUGx1Z2luRm9jdXNdIG5vZGU6ICcsIG5vZGUpO1xuXG4gICAgICBjb25zdCBzdGFzaGVkVmFsdWUgPSB0aGlzLnN0YXRlLnN0YXNoZWRWYWx1ZSB8fCB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGZvY3VzZWROb2RlOiBub2RlLCBzdGFzaGVkVmFsdWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBmb2N1c2VkTm9kZTogbnVsbCB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGFzaFZhbHVlKCk7XG4gIH07XG5cbiAgb25NYXRoQ2xpY2sgPSBub2RlID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWROb2RlOiBub2RlIH0pO1xuICB9O1xuXG4gIG9uRWRpdGluZ0RvbmUgPSBlZGl0b3IgPT4ge1xuICAgIGxvZygnW29uRWRpdGluZ0RvbmVdJyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHN0YXNoZWRWYWx1ZTogbnVsbCwgZm9jdXNlZE5vZGU6IG51bGwgfSk7XG4gICAgbG9nKCdbb25FZGl0aW5nRG9uZV0gdmFsdWU6ICcsIHRoaXMuc3RhdGUudmFsdWUpO1xuICAgIHRoaXMucHJvcHMub25DaGFuZ2UoZWRpdG9yLCB0cnVlKTtcbiAgfTtcblxuICBvbkRvbmUgPSBlZGl0b3IgPT4ge1xuICAgIGNvbnN0IHsgbm9uRW1wdHkgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBsb2coJ1tvbkRvbmVdJyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHRvb2xiYXJJbkZvY3VzOiBmYWxzZSwgZm9jdXNlZE5vZGU6IG51bGwgfSk7XG5cbiAgICB0aGlzLm9uRWRpdGluZ0RvbmUoZWRpdG9yKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIG9uUmVzaXplIGV2ZW50IGxpc3RlbmVyXG4gICAqL1xuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZSk7XG4gIH1cblxuICAvLyBBbGxvd2luZyB0aW1lIGZvciBvbkNoYW5nZSB0byB0YWtlIGVmZmVjdCBpZiBpdCBpcyBjYWxsZWRcbiAgaGFuZGxlQmx1ciA9IHJlc29sdmUgPT4ge1xuICAgIGNvbnN0IHsgbm9uRW1wdHkgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge1xuICAgICAgdG9vbGJhck9wdHM6IHsgZG9uZU9uIH1cbiAgICB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIHRoaXMuc2V0U3RhdGUoeyB0b29sYmFySW5Gb2N1czogZmFsc2UsIGZvY3VzZWROb2RlOiBudWxsIH0pO1xuXG4gICAgaWYgKGRvbmVPbiA9PT0gJ2JsdXInKSB7XG4gICAgICBpZiAobm9uRW1wdHkgJiYgdGhpcy5zdGF0ZS52YWx1ZS5zdGFydFRleHQ/LnRleHQ/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnJlc2V0VmFsdWUodHJ1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkVkaXRpbmdEb25lKCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25FZGl0aW5nRG9uZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG9uQmx1ciA9IGV2ZW50ID0+IHtcbiAgICBsb2coJ1tvbkJsdXJdJyk7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcblxuICAgIGNvbnN0IG5vZGUgPSB0YXJnZXQgPyBmaW5kTm9kZSh0YXJnZXQsIHRoaXMuc3RhdGUudmFsdWUpIDogbnVsbDtcblxuICAgIGxvZygnW29uQmx1cl0gbm9kZTogJywgbm9kZSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICB7IHByZUJsdXJWYWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSwgZm9jdXNlZE5vZGU6ICFub2RlID8gbnVsbCA6IG5vZGUgfSxcbiAgICAgICAgdGhpcy5oYW5kbGVCbHVyLmJpbmQodGhpcywgcmVzb2x2ZSlcbiAgICAgICk7XG4gICAgICB0aGlzLnByb3BzLm9uQmx1cihldmVudCk7XG4gICAgfSk7XG4gIH07XG5cbiAgaGFuZGxlRG9tQmx1ciA9IGUgPT4ge1xuICAgIGNvbnN0IGVkaXRvckRPTSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWtleT1cIiR7dGhpcy5zdGF0ZS52YWx1ZS5kb2N1bWVudC5rZXl9XCJdYCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHsgdmFsdWU6IHN0YXRlVmFsdWUgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIGlmICghdGhpcy53cmFwcGVyUmVmKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWRpdG9yRWxlbWVudCA9XG4gICAgICAgICFlZGl0b3JET00gfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbG9zZXN0KGBbY2xhc3MqPVwiJHtlZGl0b3JET00uY2xhc3NOYW1lfVwiXWApO1xuICAgICAgY29uc3QgdG9vbGJhckVsZW1lbnQgPVxuICAgICAgICAhdGhpcy50b29sYmFyUmVmIHx8XG4gICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xvc2VzdChgW2NsYXNzKj1cIiR7dGhpcy50b29sYmFyUmVmLmNsYXNzTmFtZX1cIl1gKTtcbiAgICAgIGNvbnN0IGlzSW5DdXJyZW50Q29tcG9uZW50ID1cbiAgICAgICAgdGhpcy53cmFwcGVyUmVmLmNvbnRhaW5zKGVkaXRvckVsZW1lbnQpIHx8IHRoaXMud3JhcHBlclJlZi5jb250YWlucyh0b29sYmFyRWxlbWVudCk7XG5cbiAgICAgIGlmICghaXNJbkN1cnJlbnRDb21wb25lbnQpIHtcbiAgICAgICAgZWRpdG9yRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLmhhbmRsZURvbUJsdXIpO1xuXG4gICAgICAgIGlmIChzdGF0ZVZhbHVlLmlzRm9jdXNlZCkge1xuICAgICAgICAgIHRoaXMub25CbHVyKGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgNTApO1xuICB9O1xuXG4gIC8qXG4gICAqIE5lZWRzIHRvIGJlIHdyYXBwZWQgb3RoZXJ3aXNlIGl0IGNhdXNlcyBpc3N1ZXMgYmVjYXVzZSBvZiByYWNlIGNvbmRpdGlvbnNcbiAgICogS25vd24gaXNzdWUgZm9yIHNsYXRlanMuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2lhbnN0b3JtdGF5bG9yL3NsYXRlL2lzc3Vlcy8yMDk3XG4gICAqIFVzaW5nIHRpbWVvdXQgSSB3YXNuJ3QgYWJsZSB0byB0ZXN0IHRoaXNcbiAgICpcbiAgICogTm90ZTogVGhlIHVzZSBvZiBwcm9taXNlcyBoYXMgYmVlbiBjYXVzaW5nIGlzc3VlcyB3aXRoIE1hdGhRdWlsbFxuICAgKiAqL1xuICBvbkZvY3VzID0gKCkgPT5cbiAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGVkaXRvckRPTSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWtleT1cIiR7dGhpcy5zdGF0ZS52YWx1ZS5kb2N1bWVudC5rZXl9XCJdYCk7XG5cbiAgICAgIGxvZygnW29uRm9jdXNdJywgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrIC0gQHNlZSBjaGFuZ2VEYXRhIGJlbG93IGZvciBzb21lIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLl9fVEVNUE9SQVJZX0NIQU5HRV9EQVRBKSB7XG4gICAgICAgIGNvbnN0IHsga2V5LCBkYXRhIH0gPSB0aGlzLl9fVEVNUE9SQVJZX0NIQU5HRV9EQVRBO1xuICAgICAgICBjb25zdCBkb21FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWtleT1cIiR7a2V5fVwiXWApO1xuXG4gICAgICAgIGlmIChkb21FbCkge1xuICAgICAgICAgIGxldCBjaGFuZ2UgPSB0aGlzLnN0YXRlLnZhbHVlLmNoYW5nZSgpLnNldE5vZGVCeUtleShrZXksIHsgZGF0YSB9KTtcblxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogY2hhbmdlLnZhbHVlIH0sICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX19URU1QT1JBUllfQ0hBTkdFX0RBVEEgPSBudWxsO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBpcyBuZWVkZWQganVzdCBpbiBjYXNlIHRoZSBicm93c2VyIGRlY2lkZXMgdG8gbWFrZSB0aGUgZWRpdG9yXG4gICAgICAgKiBsb3NlIGZvY3VzIHdpdGhvdXQgdHJpZ2dlcmluZyB0aGUgb25CbHVyIGV2ZW50IChjYW4gaGFwcGVuIGluIGEgZmV3IGNhc2VzKS5cbiAgICAgICAqIFRoaXMgd2lsbCBhbHNvIHRyaWdnZXIgb25CbHVyIGlmIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBwYWdlIHdoZW4gdGhlIGVkaXRvclxuICAgICAgICogaXMgZm9jdXNlZC5cbiAgICAgICAqL1xuICAgICAgaWYgKGVkaXRvckRPTSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgICBlZGl0b3JET00ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuaGFuZGxlRG9tQmx1cik7XG4gICAgICAgIGVkaXRvckRPTS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5oYW5kbGVEb21CbHVyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFzaFZhbHVlKCk7XG4gICAgICB0aGlzLnByb3BzLm9uRm9jdXMoKTtcblxuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuXG4gIHN0YXNoVmFsdWUgPSAoKSA9PiB7XG4gICAgbG9nKCdbc3Rhc2hWYWx1ZV0nKTtcbiAgICBpZiAoIXRoaXMuc3RhdGUuc3Rhc2hlZFZhbHVlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc3Rhc2hlZFZhbHVlOiB0aGlzLnN0YXRlLnZhbHVlIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVzZXQgdGhlIHZhbHVlIGlmIHRoZSB1c2VyIGRpZG4ndCBjbGljayBkb25lLlxuICAgKi9cbiAgcmVzZXRWYWx1ZSA9IGZvcmNlID0+IHtcbiAgICBjb25zdCB7IHZhbHVlLCBmb2N1c2VkTm9kZSB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGNvbnN0IHN0b3BSZXNldCA9IHRoaXMucGx1Z2lucy5yZWR1Y2UoKHMsIHApID0+IHtcbiAgICAgIHJldHVybiBzIHx8IChwLnN0b3BSZXNldCAmJiBwLnN0b3BSZXNldCh0aGlzLnN0YXRlLnZhbHVlKSk7XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgbG9nKCdbcmVzZXRWYWx1ZV0nLCB2YWx1ZS5pc0ZvY3VzZWQsIGZvY3VzZWROb2RlLCAnc3RvcFJlc2V0OiAnLCBzdG9wUmVzZXQpO1xuICAgIGlmICgodGhpcy5zdGF0ZS5zdGFzaGVkVmFsdWUgJiYgIXZhbHVlLmlzRm9jdXNlZCAmJiAhZm9jdXNlZE5vZGUgJiYgIXN0b3BSZXNldCkgfHwgZm9yY2UpIHtcbiAgICAgIGxvZygnW3Jlc2V0VmFsdWVdIHJlc2V0dGluZy4uLicpO1xuICAgICAgbG9nKCdzdGFzaGVkJywgdGhpcy5zdGF0ZS5zdGFzaGVkVmFsdWUuZG9jdW1lbnQudG9PYmplY3QoKSk7XG4gICAgICBsb2coJ2N1cnJlbnQnLCB0aGlzLnN0YXRlLnZhbHVlLmRvY3VtZW50LnRvT2JqZWN0KCkpO1xuXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IFZhbHVlLmZyb21KU09OKHRoaXMuc3RhdGUuc3Rhc2hlZFZhbHVlLnRvSlNPTigpKTtcblxuICAgICAgbG9nKCduZXdWYWx1ZTogJywgbmV3VmFsdWUuZG9jdW1lbnQpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IG5ld1ZhbHVlLCBzdGFzaGVkVmFsdWU6IG51bGwgfSwgKCkgPT4ge1xuICAgICAgICAgICAgbG9nKCd2YWx1ZSBub3c6ICcsIHRoaXMuc3RhdGUudmFsdWUuZG9jdW1lbnQudG9KU09OKCkpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCA1MCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgfVxuICB9O1xuXG4gIG9uQ2hhbmdlID0gKGVkaXRvciwgZG9uZSkgPT4ge1xuICAgIGxvZygnW29uQ2hhbmdlXScpO1xuICAgIGNvbnN0IHsgY2hhcmFjdGVyc0xpbWl0IH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGFsbFRleHQgPSBFZGl0b3Iuc3RyaW5nKGVkaXRvciwgW10pO1xuXG4gICAgaWYgKGFsbFRleHQgPiBjaGFyYWN0ZXJzTGltaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBodG1sID0gdmFsdWVUb0h0bWwoZWRpdG9yKTtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bWxUb1ZhbHVlKGh0bWwpO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlIH0sICgpID0+IHtcbiAgICAgIGxvZygnW29uQ2hhbmdlXSwgY2FsbCBkb25lKCknKTtcblxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGdldEZvY3VzZWRWYWx1ZSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZS5pc0ZvY3VzZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlLnByZUJsdXJWYWx1ZTtcbiAgfTtcblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhwcm9wcykge1xuICAgIGlmICghaXNFcXVhbChwcm9wcy52YWx1ZSwgdGhpcy5wcm9wcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmb2N1czogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBwcm9wcy52YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsdWVUb1NpemUgPSB2ID0+IHtcbiAgICBpZiAoIXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodi5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2UgaWYgKHYuZW5kc1dpdGgoJ3B4JykgfHwgdi5lbmRzV2l0aCgndmgnKSB8fCB2LmVuZHNXaXRoKCd2dycpKSB7XG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludCh2LCAxMCk7XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSkgPyB2YWx1ZSA6IGAke3ZhbHVlfXB4YDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGAke3Z9cHhgO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfTtcblxuICBidWlsZFNpemVTdHlsZSgpIHtcbiAgICBjb25zdCB7IHdpZHRoLCBtaW5IZWlnaHQsIGhlaWdodCwgbWF4SGVpZ2h0IH0gPSB0aGlzLnByb3BzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB0aGlzLnZhbHVlVG9TaXplKHdpZHRoKSxcbiAgICAgIGhlaWdodDogdGhpcy52YWx1ZVRvU2l6ZShoZWlnaHQpLFxuICAgICAgbWluSGVpZ2h0OiB0aGlzLnZhbHVlVG9TaXplKG1pbkhlaWdodCksXG4gICAgICBtYXhIZWlnaHQ6IHRoaXMudmFsdWVUb1NpemUobWF4SGVpZ2h0KVxuICAgIH07XG4gIH1cblxuICB2YWxpZGF0ZU5vZGUgPSBub2RlID0+IHtcbiAgICBpZiAobm9kZS5vYmplY3QgIT09ICdibG9jaycpIHJldHVybjtcblxuICAgIGNvbnN0IGxhc3QgPSBub2RlLm5vZGVzLmxhc3QoKTtcbiAgICBpZiAoIWxhc3QpIHJldHVybjtcblxuICAgIGlmIChsYXN0LnR5cGUgIT09ICdpbWFnZScpIHJldHVybjtcblxuICAgIGxvZygnW3ZhbGlkYXRlTm9kZV0gbGFzdCBpcyBpbWFnZS4uJyk7XG5cbiAgICBjb25zdCBwYXJlbnQgPSBsYXN0LmdldFBhcmVudChsYXN0LmtleSk7XG4gICAgY29uc3QgcCA9IEJsb2NrLmdldFBhcmVudChsYXN0LmtleSk7XG4gICAgbG9nKCdbdmFsaWRhdGVOb2RlXSBwYXJlbnQ6JywgcGFyZW50LCBwKTtcblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgZm9jdXMgPSAocG9zLCBub2RlKSA9PiB7XG4gICAgY29uc3QgcG9zaXRpb24gPSBwb3MgfHwgJ2VuZCc7XG5cbiAgICB0aGlzLnByb3BzLmZvY3VzKHBvc2l0aW9uLCBub2RlKTtcbiAgfTtcblxuICBvbkRyb3BQYXN0ZSA9IGFzeW5jIChldmVudCwgY2hhbmdlLCBkcm9wQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGNoYW5nZS5lZGl0b3I7XG4gICAgY29uc3QgdHJhbnNmZXIgPSBnZXRFdmVudFRyYW5zZmVyKGV2ZW50KTtcbiAgICBjb25zdCBmaWxlID0gdHJhbnNmZXIuZmlsZXMgJiYgdHJhbnNmZXIuZmlsZXNbMF07XG5cbiAgICBjb25zdCB0eXBlID0gdHJhbnNmZXIudHlwZTtcbiAgICBjb25zdCBmcmFnbWVudCA9IHRyYW5zZmVyLmZyYWdtZW50O1xuICAgIGNvbnN0IHRleHQgPSB0cmFuc2Zlci50ZXh0O1xuXG4gICAgaWYgKFxuICAgICAgZmlsZSAmJlxuICAgICAgKGZpbGUudHlwZSA9PT0gJ2ltYWdlL2pwZWcnIHx8IGZpbGUudHlwZSA9PT0gJ2ltYWdlL2pwZycgfHwgZmlsZS50eXBlID09PSAnaW1hZ2UvcG5nJylcbiAgICApIHtcbiAgICAgIGlmICghdGhpcy5wcm9wcy5pbWFnZVN1cHBvcnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nKCdbb25Ecm9wUGFzdGVdJyk7XG4gICAgICAgIGNvbnN0IHNyYyA9IGF3YWl0IGdldEJhc2U2NChmaWxlKTtcbiAgICAgICAgY29uc3QgaW5saW5lID0gSW5saW5lLmNyZWF0ZSh7XG4gICAgICAgICAgdHlwZTogJ2ltYWdlJyxcbiAgICAgICAgICBpc1ZvaWQ6IHRydWUsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBzcmNcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkcm9wQ29udGV4dCkge1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByYW5nZSA9IGdldEV2ZW50UmFuZ2UoZXZlbnQsIGVkaXRvcik7XG4gICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICBjaGFuZ2Uuc2VsZWN0KHJhbmdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaCA9IGNoYW5nZS5pbnNlcnRJbmxpbmUoaW5saW5lKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShjaCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSW5zZXJ0SW1hZ2VIYW5kbGVyKGlubGluZSwgKCkgPT4gdGhpcy5zdGF0ZS52YWx1ZSwgdGhpcy5vbkNoYW5nZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMucHJvcHMuaW1hZ2VTdXBwb3J0LmFkZChoYW5kbGVyKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2coJ1tvbkRyb3BQYXN0ZV0gZXJyb3I6ICcsIGVycik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZnJhZ21lbnQnKSB7XG4gICAgICBjaGFuZ2UuaW5zZXJ0RnJhZ21lbnQoZnJhZ21lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RleHQnIHx8IHR5cGUgPT09ICdodG1sJykge1xuICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmFsdWU6IHsgZG9jdW1lbnQsIHNlbGVjdGlvbiwgc3RhcnRCbG9jayB9XG4gICAgICB9ID0gY2hhbmdlO1xuXG4gICAgICBpZiAoc3RhcnRCbG9jay5pc1ZvaWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWZhdWx0QmxvY2sgPSBzdGFydEJsb2NrO1xuICAgICAgY29uc3QgZGVmYXVsdE1hcmtzID0gZG9jdW1lbnQuZ2V0SW5zZXJ0TWFya3NBdFJhbmdlKHNlbGVjdGlvbik7XG4gICAgICBjb25zdCBmcmFnID0gUGxhaW4uZGVzZXJpYWxpemUodGV4dCwge1xuICAgICAgICBkZWZhdWx0QmxvY2ssXG4gICAgICAgIGRlZmF1bHRNYXJrc1xuICAgICAgfSkuZG9jdW1lbnQ7XG4gICAgICBjaGFuZ2UuaW5zZXJ0RnJhZ21lbnQoZnJhZyk7XG4gICAgfVxuICB9O1xuXG4gIHJlbmRlclBsYWNlaG9sZGVyID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSBwcm9wcztcbiAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBlZGl0b3IudmFsdWU7XG5cbiAgICBpZiAoIWVkaXRvci5wcm9wcy5wbGFjZWhvbGRlciB8fCBkb2N1bWVudC50ZXh0ICE9PSAnJyB8fCBkb2N1bWVudC5ub2Rlcy5zaXplICE9PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuXG4gICAgICAgIGNvbnRlbnRFZGl0YWJsZT17ZmFsc2V9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgd2lkdGg6ICdmaXQtY29udGVudCcsIC8vIGZvciBjZW50ZXJpbmcgdGhlIHBsYWNlaG9sZGVyIGlmIHRleHQtYWxpZ24gaXMgc2V0IHRvIGNlbnRlclxuICAgICAgICAgIG1heFdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgICAgb3BhY2l0eTogJzAuMzMnLFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgICB1c2VyU2VsZWN0OiAnbm9uZSdcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2VkaXRvci5wcm9wcy5wbGFjZWhvbGRlcn1cbiAgICAgIDwvc3Bhbj5cbiAgICApO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIHNwZWxsQ2hlY2ssXG4gICAgICBoaWdobGlnaHRTaGFwZSxcbiAgICAgIGNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHBsdWdpblByb3BzLFxuICAgICAgb25LZXlEb3duXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCB7IHZhbHVlLCBmb2N1c2VkTm9kZSwgdG9vbGJhck9wdHMgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBsb2coJ1tyZW5kZXJdIHZhbHVlOiAnLCB2YWx1ZSk7XG4gICAgY29uc3Qgc2l6ZVN0eWxlID0gdGhpcy5idWlsZFNpemVTdHlsZSgpO1xuICAgIGNvbnN0IG5hbWVzID0gY2xhc3NOYW1lcyhcbiAgICAgIHtcbiAgICAgICAgW2NsYXNzZXMud2l0aEJnXTogaGlnaGxpZ2h0U2hhcGUsXG4gICAgICAgIFtjbGFzc2VzLnRvb2xiYXJPblRvcF06IHRvb2xiYXJPcHRzLmFsd2F5c1Zpc2libGUgJiYgdG9vbGJhck9wdHMucG9zaXRpb24gPT09ICd0b3AnXG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgY2xhc3Nlcy5zbGF0ZUVkaXRvclxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICByZWY9e3JlZiA9PiAodGhpcy53cmFwcGVyUmVmID0gcmVmKX1cbiAgICAgICAgc3R5bGU9e3sgd2lkdGg6IHNpemVTdHlsZS53aWR0aCB9fVxuICAgICAgICBjbGFzc05hbWU9e25hbWVzfVxuICAgICAgPlxuICAgICAgICA8U2xhdGVFZGl0b3JcbiAgICAgICAgICBwbHVnaW5zPXt0aGlzLnBsdWdpbnN9XG4gICAgICAgICAgdG9vbGJhclJlZj17ciA9PiB7XG4gICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICB0aGlzLnRvb2xiYXJSZWYgPSByO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgICAgb25FZGl0b3I9e3RoaXMucHJvcHMub25FZGl0b3J9XG4gICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgIGZvY3VzPXt0aGlzLmZvY3VzfVxuICAgICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfVxuICAgICAgICAgIGdldEZvY3VzZWRWYWx1ZT17dGhpcy5nZXRGb2N1c2VkVmFsdWV9XG4gICAgICAgICAgb25CbHVyPXt0aGlzLm9uQmx1cn1cbiAgICAgICAgICBvbkRyb3A9eyhldmVudCwgZWRpdG9yKSA9PiB0aGlzLm9uRHJvcFBhc3RlKGV2ZW50LCBlZGl0b3IsIHRydWUpfVxuICAgICAgICAgIG9uUGFzdGU9eyhldmVudCwgZWRpdG9yKSA9PiB0aGlzLm9uRHJvcFBhc3RlKGV2ZW50LCBlZGl0b3IpfVxuICAgICAgICAgIG9uRm9jdXM9e3RoaXMub25Gb2N1c31cbiAgICAgICAgICBvbkVkaXRpbmdEb25lPXt0aGlzLm9uRWRpdGluZ0RvbmV9XG4gICAgICAgICAgb25Eb25lPXt0aGlzLm9uRG9uZX1cbiAgICAgICAgICBmb2N1c2VkTm9kZT17Zm9jdXNlZE5vZGV9XG4gICAgICAgICAgbm9ybWFsaXplPXt0aGlzLm5vcm1hbGl6ZX1cbiAgICAgICAgICByZWFkT25seT17ZGlzYWJsZWR9XG4gICAgICAgICAgc3BlbGxDaGVjaz17c3BlbGxDaGVja31cbiAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFtjbGFzc2VzLm5vUGFkZGluZ106IHRvb2xiYXJPcHRzICYmIHRvb2xiYXJPcHRzLm5vQm9yZGVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xhc3Nlcy5zbGF0ZUVkaXRvclxuICAgICAgICAgICl9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIG1pbkhlaWdodDogc2l6ZVN0eWxlLm1pbkhlaWdodCxcbiAgICAgICAgICAgIGhlaWdodDogc2l6ZVN0eWxlLmhlaWdodCxcbiAgICAgICAgICAgIG1heEhlaWdodDogc2l6ZVN0eWxlLm1heEhlaWdodFxuICAgICAgICAgIH19XG4gICAgICAgICAgcGx1Z2luUHJvcHM9e3BsdWdpblByb3BzfVxuICAgICAgICAgIHRvb2xiYXJPcHRzPXt0b29sYmFyT3B0c31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgcmVuZGVyUGxhY2Vob2xkZXI9e3RoaXMucmVuZGVyUGxhY2Vob2xkZXJ9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgcmVmPXtyZWYgPT4gKHRoaXMud3JhcHBlclJlZiA9IHJlZil9XG4gICAgICAgIHN0eWxlPXt7IHdpZHRoOiBzaXplU3R5bGUud2lkdGggfX1cbiAgICAgICAgY2xhc3NOYW1lPXtuYW1lc31cbiAgICAgID5cbiAgICAgICAgPE9sZFNsYXRlRWRpdG9yXG4gICAgICAgICAgcGx1Z2lucz17dGhpcy5wbHVnaW5zfVxuICAgICAgICAgIHRvb2xiYXJSZWY9e3IgPT4ge1xuICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgdGhpcy50b29sYmFyUmVmID0gcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICBmb2N1cz17dGhpcy5mb2N1c31cbiAgICAgICAgICBvbktleURvd249e29uS2V5RG93bn1cbiAgICAgICAgICBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZX1cbiAgICAgICAgICBnZXRGb2N1c2VkVmFsdWU9e3RoaXMuZ2V0Rm9jdXNlZFZhbHVlfVxuICAgICAgICAgIG9uQmx1cj17dGhpcy5vbkJsdXJ9XG4gICAgICAgICAgb25Ecm9wPXsoZXZlbnQsIGVkaXRvcikgPT4gdGhpcy5vbkRyb3BQYXN0ZShldmVudCwgZWRpdG9yLCB0cnVlKX1cbiAgICAgICAgICBvblBhc3RlPXsoZXZlbnQsIGVkaXRvcikgPT4gdGhpcy5vbkRyb3BQYXN0ZShldmVudCwgZWRpdG9yKX1cbiAgICAgICAgICBvbkZvY3VzPXt0aGlzLm9uRm9jdXN9XG4gICAgICAgICAgb25FZGl0aW5nRG9uZT17dGhpcy5vbkVkaXRpbmdEb25lfVxuICAgICAgICAgIGZvY3VzZWROb2RlPXtmb2N1c2VkTm9kZX1cbiAgICAgICAgICBub3JtYWxpemU9e3RoaXMubm9ybWFsaXplfVxuICAgICAgICAgIHJlYWRPbmx5PXtkaXNhYmxlZH1cbiAgICAgICAgICBzcGVsbENoZWNrPXtzcGVsbENoZWNrfVxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgW2NsYXNzZXMubm9QYWRkaW5nXTogdG9vbGJhck9wdHMgJiYgdG9vbGJhck9wdHMubm9Cb3JkZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGFzc2VzLnNsYXRlRWRpdG9yXG4gICAgICAgICAgKX1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgbWluSGVpZ2h0OiBzaXplU3R5bGUubWluSGVpZ2h0LFxuICAgICAgICAgICAgaGVpZ2h0OiBzaXplU3R5bGUuaGVpZ2h0LFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiBzaXplU3R5bGUubWF4SGVpZ2h0XG4gICAgICAgICAgfX1cbiAgICAgICAgICBwbHVnaW5Qcm9wcz17cGx1Z2luUHJvcHN9XG4gICAgICAgICAgdG9vbGJhck9wdHM9e3Rvb2xiYXJPcHRzfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICByZW5kZXJQbGFjZWhvbGRlcj17dGhpcy5yZW5kZXJQbGFjZWhvbGRlcn1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuLy8gVE9ETyBjb2xvciAtIGhhcmRjb2RlZCBncmF5IGJhY2tncm91bmQgYW5kIGtleXBhZCBjb2xvcnMgd2lsbCBuZWVkIHRvIGNoYW5nZSB0b29cbmNvbnN0IHN0eWxlcyA9IHtcbiAgd2l0aEJnOiB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwwLjA2KSdcbiAgfSxcbiAgc2xhdGVFZGl0b3I6IHtcbiAgICBmb250RmFtaWx5OiAnUm9ib3RvLCBzYW5zLXNlcmlmJyxcblxuICAgICcmIHRhYmxlJzoge1xuICAgICAgdGFibGVMYXlvdXQ6ICdmaXhlZCcsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgYm9yZGVyQ29sbGFwc2U6ICdjb2xsYXBzZScsXG4gICAgICBjb2xvcjogY29sb3IudGV4dCgpLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBjb2xvci5iYWNrZ3JvdW5kKClcbiAgICB9LFxuICAgICcmIHRhYmxlOm5vdChbYm9yZGVyPVwiMVwiXSkgdHInOiB7XG4gICAgICBib3JkZXJUb3A6ICcxcHggc29saWQgI2RmZTJlNSdcbiAgICAgIC8vIFRPRE8gcGVyaGFwcyBzZWNvbmRhcnkgY29sb3IgZm9yIGJhY2tncm91bmQsIGZvciBub3cgZGlzYWJsZVxuICAgICAgLy8gJyY6bnRoLWNoaWxkKDJuKSc6IHtcbiAgICAgIC8vICAgYmFja2dyb3VuZENvbG9yOiAnI2Y2ZjhmYSdcbiAgICAgIC8vIH1cbiAgICB9LFxuICAgICcmIHRkLCB0aCc6IHtcbiAgICAgIHBhZGRpbmc6ICcuNmVtIDFlbScsXG4gICAgICB0ZXh0QWxpZ246ICdjZW50ZXInXG4gICAgfSxcbiAgICAnJiB0YWJsZTpub3QoW2JvcmRlcj1cIjFcIl0pIHRkLCB0aCc6IHtcbiAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjZGZlMmU1J1xuICAgIH1cbiAgfSxcbiAgdG9vbGJhck9uVG9wOiB7XG4gICAgbWFyZ2luVG9wOiAnNDVweCdcbiAgfSxcbiAgbm9QYWRkaW5nOiB7XG4gICAgcGFkZGluZzogJzAgIWltcG9ydGFudCdcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMpKEVkaXRvckNvbXBvbmVudCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQU9BOztBQUVBOztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBRUE7O0FBR0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsT0FBTyxHQUFHO0VBQ2QsU0FBUyxNQURLO0VBRWQsU0FBUyxRQUZLO0VBR2QsU0FBUyxXQUhLO0VBSWQsU0FBUztBQUpLLENBQWhCO0FBT0EsSUFBTUMsVUFBVSxHQUFHLENBQUMsZUFBRCxFQUFrQixlQUFsQixDQUFuQjtBQUNBLElBQU1DLGdCQUFnQixHQUFHLENBQUMsTUFBRCxFQUFTLFFBQVQsRUFBbUIsT0FBbkIsRUFBNEIsU0FBNUIsQ0FBekI7QUFFQSxJQUFNQyxZQUFZLEdBQUcsQ0FDbkI7RUFDRUMsSUFBSSxFQUFFLFdBRFI7RUFFRUMsUUFBUSxFQUFFLENBQ1I7SUFDRUQsSUFBSSxFQUFFLE1BRFI7SUFFRUUsSUFBSSxFQUFFO01BQ0pDLEtBQUssRUFBRSxjQURIO01BRUpDLE9BQU8sRUFBRTtJQUZMLENBRlI7SUFNRUgsUUFBUSxFQUFFLENBQ1I7TUFDRUksSUFBSSxFQUFFO0lBRFIsQ0FEUTtFQU5aLENBRFE7QUFGWixDQURtQixDQUFyQjs7QUFvQkEsSUFBTUMsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQUMsV0FBVyxFQUFJO0VBQ2pDLElBQVFDLEtBQVIsR0FBMkJELFdBQTNCLENBQVFDLEtBQVI7RUFBQSxJQUFlQyxPQUFmLEdBQTJCRixXQUEzQixDQUFlRSxPQUFmO0VBQ0EsSUFBTUMsYUFBYSxHQUFHLElBQUFDLGtCQUFBLEVBQVksVUFBQUMsS0FBSztJQUFBLG9CQUFJLGdDQUFDLE9BQUQsZ0NBQWFBLEtBQWI7TUFBb0IsT0FBTyxFQUFFSDtJQUE3QixHQUFKO0VBQUEsQ0FBakIsRUFBK0QsRUFBL0QsQ0FBdEI7RUFDQSxJQUFNSSxVQUFVLEdBQUcsSUFBQUYsa0JBQUEsRUFBWSxVQUFBQyxLQUFLO0lBQUEsb0JBQUksZ0NBQUMsSUFBRCxFQUFVQSxLQUFWLENBQUo7RUFBQSxDQUFqQixFQUEwQyxFQUExQyxDQUFuQjtFQUNBLElBQU1FLE1BQU0sR0FBRyxJQUFBQyxjQUFBLEVBQVE7SUFBQSxPQUFNLElBQUFDLG9CQUFBLEVBQVksSUFBQUMsbUJBQUEsR0FBWixFQUE0QlIsT0FBNUIsQ0FBTjtFQUFBLENBQVIsRUFBb0QsRUFBcEQsQ0FBZjs7RUFDQSxnQkFBa0MsSUFBQVMsZUFBQSxFQUFTLEtBQVQsQ0FBbEM7RUFBQTtFQUFBLElBQU9DLFNBQVA7RUFBQSxJQUFrQkMsWUFBbEI7O0VBQ0EsSUFBTUMsU0FBUyxHQUFHLElBQUFDLGFBQUEsRUFBTyxJQUFQLENBQWxCO0VBRUEsSUFBQUMsZ0JBQUEsRUFBVSxZQUFNO0lBQ2QsSUFBSWhCLFdBQVcsQ0FBQ2lCLFFBQWhCLEVBQTBCO01BQ3hCakIsV0FBVyxDQUFDaUIsUUFBWixDQUFxQlYsTUFBckI7SUFDRDtFQUNGLENBSkQsRUFJRyxDQUFDQSxNQUFELENBSkg7RUFNQSxJQUFNVyxVQUFVLEdBQUcsSUFBQVYsY0FBQSxFQUFRLFlBQU07SUFDL0I7SUFDQTtJQUNBO0lBQ0FELE1BQU0sQ0FBQ2IsUUFBUCxHQUFrQk8sS0FBbEI7O0lBQ0FrQixhQUFBLENBQU9DLFNBQVAsQ0FBaUJiLE1BQWpCLEVBQXlCO01BQUVjLEtBQUssRUFBRTtJQUFULENBQXpCLEVBTCtCLENBTS9COzs7SUFDQSxPQUFPZCxNQUFNLENBQUNiLFFBQWQ7RUFDRCxDQVJrQixFQVFoQixDQUFDYSxNQUFELEVBQVNOLEtBQVQsQ0FSZ0IsQ0FBbkI7O0VBVUEsSUFBTXFCLFNBQVMsR0FBRyxTQUFaQSxTQUFZLENBQUFDLEtBQUssRUFBSTtJQUN6QixJQUFJQSxLQUFLLENBQUNDLEdBQU4sS0FBYyxPQUFkLElBQXlCRCxLQUFLLENBQUNFLFFBQU4sS0FBbUIsSUFBaEQsRUFBc0Q7TUFDcERsQixNQUFNLENBQUNtQixVQUFQLENBQWtCLElBQWxCO01BQ0FILEtBQUssQ0FBQ0ksY0FBTjtNQUNBSixLQUFLLENBQUNLLGVBQU47TUFDQTtJQUNEOztJQUNELEtBQUssSUFBTUMsTUFBWCxJQUFxQnhDLE9BQXJCLEVBQThCO01BQzVCLElBQUksSUFBQXlDLG9CQUFBLEVBQVNELE1BQVQsRUFBaUJOLEtBQWpCLENBQUosRUFBNkI7UUFDM0JBLEtBQUssQ0FBQ0ksY0FBTjtRQUNBLElBQU1JLElBQUksR0FBRzFDLE9BQU8sQ0FBQ3dDLE1BQUQsQ0FBcEI7UUFDQUcsVUFBVSxDQUFDekIsTUFBRCxFQUFTd0IsSUFBVCxDQUFWO01BQ0Q7SUFDRjtFQUNGLENBZEQ7O0VBZUEsSUFBTUUsT0FBTyxHQUFHLFNBQVZBLE9BQVU7SUFBQSxPQUFNcEIsWUFBWSxDQUFDLElBQUQsQ0FBbEI7RUFBQSxDQUFoQjs7RUFDQSxJQUFNcUIsTUFBTSxHQUFHLFNBQVRBLE1BQVMsR0FBTTtJQUNuQkMsVUFBVSxDQUFDLFlBQU07TUFDZixJQUFJLENBQUNyQixTQUFTLENBQUNzQixPQUFYLElBQXNCLENBQUN0QixTQUFTLENBQUNzQixPQUFWLENBQWtCQyxRQUFsQixDQUEyQkMsUUFBUSxDQUFDQyxhQUFwQyxDQUEzQixFQUErRTtRQUM3RTFCLFlBQVksQ0FBQyxLQUFELENBQVo7TUFDRDtJQUNGLENBSlMsRUFJUCxFQUpPLENBQVY7RUFLRCxDQU5EOztFQVFBLG9CQUNFLGdDQUFDLGlCQUFEO0lBQU8sTUFBTSxFQUFFTixNQUFmO0lBQXVCLEtBQUssRUFBRVc7RUFBOUIsZ0JBQ0UsZ0NBQUMsbUJBQUQ7SUFBUyxPQUFPLEVBQUVKO0VBQWxCLGdCQUNFLGdDQUFDLDRCQUFELGdDQUNNZCxXQUROO0lBRUUsTUFBTSxFQUFFTyxNQUZWO0lBR0UsU0FBUyxFQUFFSyxTQUhiO0lBSUUsTUFBTSxFQUFFLGtCQUFNO01BQ1pDLFlBQVksQ0FBQyxLQUFELENBQVo7TUFDQWIsV0FBVyxDQUFDd0MsTUFBWixDQUFtQmpDLE1BQW5CO0lBQ0Q7RUFQSCxpQkFTRSxnQ0FBQyxvQkFBRDtJQUNFLGFBQWEsRUFBRUosYUFEakI7SUFFRSxVQUFVLEVBQUVHLFVBRmQ7SUFHRSxXQUFXLEVBQUMsNEJBSGQ7SUFJRSxVQUFVLE1BSlo7SUFLRSxTQUFTLEVBQUVnQixTQUxiO0lBTUUsT0FBTyxFQUFFVyxPQU5YO0lBT0UsTUFBTSxFQUFFQztFQVBWLEVBVEYsQ0FERixDQURGLENBREY7QUF5QkQsQ0F6RUQ7O0FBMkVBLElBQU1PLFdBQVcsR0FBRyxTQUFkQSxXQUFjLENBQUNsQyxNQUFELEVBQVNtQyxNQUFULEVBQW9CO0VBQ3RDLElBQU1DLFFBQVEsR0FBR0MsYUFBYSxDQUM1QnJDLE1BRDRCLEVBRTVCbUMsTUFGNEIsRUFHNUJuRCxnQkFBZ0IsQ0FBQ3NELFFBQWpCLENBQTBCSCxNQUExQixJQUFvQyxPQUFwQyxHQUE4QyxNQUhsQixDQUE5QjtFQUtBLElBQU1JLE1BQU0sR0FBR3hELFVBQVUsQ0FBQ3VELFFBQVgsQ0FBb0JILE1BQXBCLENBQWY7O0VBRUFLLGlCQUFBLENBQVdDLFdBQVgsQ0FBdUJ6QyxNQUF2QixFQUErQjtJQUM3QjBDLEtBQUssRUFBRSxlQUFBQyxDQUFDO01BQUEsT0FDTixDQUFDL0IsYUFBQSxDQUFPZ0MsUUFBUCxDQUFnQkQsQ0FBaEIsQ0FBRCxJQUNBRSxjQUFBLENBQWFDLFNBQWIsQ0FBdUJILENBQXZCLENBREEsSUFFQTVELFVBQVUsQ0FBQ3VELFFBQVgsQ0FBb0JLLENBQUMsQ0FBQ3pELElBQXRCLENBRkEsSUFHQSxDQUFDRixnQkFBZ0IsQ0FBQ3NELFFBQWpCLENBQTBCSCxNQUExQixDQUpLO0lBQUEsQ0FEcUI7SUFNN0JZLEtBQUssRUFBRTtFQU5zQixDQUEvQjs7RUFRQSxJQUFJQyxhQUFKOztFQUNBLElBQUloRSxnQkFBZ0IsQ0FBQ3NELFFBQWpCLENBQTBCSCxNQUExQixDQUFKLEVBQXVDO0lBQ3JDYSxhQUFhLEdBQUc7TUFDZEMsS0FBSyxFQUFFYixRQUFRLEdBQUdjLFNBQUgsR0FBZWY7SUFEaEIsQ0FBaEI7RUFHRCxDQUpELE1BSU87SUFDTGEsYUFBYSxHQUFHO01BQ2Q5RCxJQUFJLEVBQUVrRCxRQUFRLEdBQUcsV0FBSCxHQUFpQkcsTUFBTSxHQUFHLFdBQUgsR0FBaUJKO0lBRHhDLENBQWhCO0VBR0Q7O0VBQ0RLLGlCQUFBLENBQVdXLFFBQVgsQ0FBb0JuRCxNQUFwQixFQUE0QmdELGFBQTVCOztFQUVBLElBQUksQ0FBQ1osUUFBRCxJQUFhRyxNQUFqQixFQUF5QjtJQUN2QixJQUFNYSxLQUFLLEdBQUc7TUFBRWxFLElBQUksRUFBRWlELE1BQVI7TUFBZ0JoRCxRQUFRLEVBQUU7SUFBMUIsQ0FBZDs7SUFDQXFELGlCQUFBLENBQVdhLFNBQVgsQ0FBcUJyRCxNQUFyQixFQUE2Qm9ELEtBQTdCO0VBQ0Q7QUFDRixDQWhDRDs7QUFrQ0EsSUFBTTNCLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUN6QixNQUFELEVBQVNtQyxNQUFULEVBQW9CO0VBQ3JDLElBQU1DLFFBQVEsR0FBR2tCLFlBQVksQ0FBQ3RELE1BQUQsRUFBU21DLE1BQVQsQ0FBN0I7O0VBRUEsSUFBSUMsUUFBSixFQUFjO0lBQ1p4QixhQUFBLENBQU8yQyxVQUFQLENBQWtCdkQsTUFBbEIsRUFBMEJtQyxNQUExQjtFQUNELENBRkQsTUFFTztJQUNMdkIsYUFBQSxDQUFPNEMsT0FBUCxDQUFleEQsTUFBZixFQUF1Qm1DLE1BQXZCLEVBQStCLElBQS9CO0VBQ0Q7QUFDRixDQVJEOztBQVVBLElBQU1FLGFBQWEsR0FBRyxTQUFoQkEsYUFBZ0IsQ0FBQ3JDLE1BQUQsRUFBU21DLE1BQVQsRUFBd0M7RUFBQSxJQUF2QnNCLFNBQXVCLHVFQUFYLE1BQVc7RUFDNUQsSUFBUUMsU0FBUixHQUFzQjFELE1BQXRCLENBQVEwRCxTQUFSO0VBQ0EsSUFBSSxDQUFDQSxTQUFMLEVBQWdCLE9BQU8sS0FBUDs7RUFFaEIsa0JBQWdCQyxLQUFLLENBQUNDLElBQU4sQ0FDZGhELGFBQUEsQ0FBT2lELEtBQVAsQ0FBYTdELE1BQWIsRUFBcUI7SUFDbkI4RCxFQUFFLEVBQUVsRCxhQUFBLENBQU9tRCxXQUFQLENBQW1CL0QsTUFBbkIsRUFBMkIwRCxTQUEzQixDQURlO0lBRW5CaEIsS0FBSyxFQUFFLGVBQUFDLENBQUM7TUFBQSxPQUFJLENBQUMvQixhQUFBLENBQU9nQyxRQUFQLENBQWdCRCxDQUFoQixDQUFELElBQXVCRSxjQUFBLENBQWFDLFNBQWIsQ0FBdUJILENBQXZCLENBQXZCLElBQW9EQSxDQUFDLENBQUNjLFNBQUQsQ0FBRCxLQUFpQnRCLE1BQXpFO0lBQUE7RUFGVyxDQUFyQixDQURjLENBQWhCO0VBQUE7RUFBQSxJQUFPTyxLQUFQOztFQU9BLE9BQU8sQ0FBQyxDQUFDQSxLQUFUO0FBQ0QsQ0FaRDs7QUFjQSxJQUFNWSxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDdEQsTUFBRCxFQUFTbUMsTUFBVCxFQUFvQjtFQUN2QyxJQUFNNkIsS0FBSyxHQUFHcEQsYUFBQSxDQUFPb0QsS0FBUCxDQUFhaEUsTUFBYixDQUFkOztFQUNBLE9BQU9nRSxLQUFLLEdBQUdBLEtBQUssQ0FBQzdCLE1BQUQsQ0FBTCxLQUFrQixJQUFyQixHQUE0QixLQUF4QztBQUNELENBSEQ7O0FBS0EsSUFBTThCLE9BQU8sR0FBRyxTQUFWQSxPQUFVLENBQUFuRSxLQUFLLEVBQUk7RUFDdkIsSUFBTUUsTUFBTSxHQUFHLElBQUFrRSwwQkFBQSxHQUFmO0VBQ0EsSUFBTUMsT0FBTyxHQUFHLElBQUFDLHNCQUFBLEdBQWhCO0VBQ0EsSUFBUUMsVUFBUixHQUFtRHZFLEtBQW5ELENBQVF1RSxVQUFSO0VBQUEsSUFBb0JsRixRQUFwQixHQUFtRFcsS0FBbkQsQ0FBb0JYLFFBQXBCO0VBQUEsSUFBOEJtRixPQUE5QixHQUFtRHhFLEtBQW5ELENBQThCd0UsT0FBOUI7RUFBQSxJQUF1QzNFLE9BQXZDLEdBQW1ERyxLQUFuRCxDQUF1Q0gsT0FBdkM7RUFDQSxJQUFNNEUsS0FBSyxHQUFHO0lBQUVDLFNBQVMsRUFBRUYsT0FBTyxDQUFDckI7RUFBckIsQ0FBZDs7RUFFQSxJQUFNd0IsU0FBUyxpREFBUUosVUFBUixHQUF1QnZFLEtBQXZCO0lBQThCNEUsSUFBSSxvQkFBT0osT0FBUCxDQUFsQztJQUFvRG5GLFFBQVEsRUFBUkE7RUFBcEQsRUFBZjs7RUFDQSxJQUFNd0YsY0FBYyxHQUFHaEYsT0FBTyxDQUFDaUYsSUFBUixDQUNyQixVQUFBQyxNQUFNO0lBQUEsT0FBSSxPQUFPQSxNQUFNLENBQUNDLFFBQWQsS0FBMkIsVUFBM0IsSUFBeUNELE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQlIsT0FBaEIsQ0FBN0M7RUFBQSxDQURlLENBQXZCOztFQUlBLElBQUlLLGNBQUosRUFBb0I7SUFDbEIsT0FBT0EsY0FBYyxDQUFDSSxVQUFmLGlDQUErQk4sU0FBL0I7TUFBMEN6RSxNQUFNLEVBQU5BLE1BQTFDO01BQWtEbUUsT0FBTyxFQUFQQTtJQUFsRCxHQUFQO0VBQ0Q7O0VBRUQsUUFBUUcsT0FBTyxDQUFDcEYsSUFBaEI7SUFDRSxLQUFLLGFBQUw7TUFDRSxvQkFDRTtRQUFZLEtBQUssRUFBRXFGO01BQW5CLEdBQThCRixVQUE5QixHQUNHbEYsUUFESCxDQURGOztJQUtGLEtBQUssZUFBTDtNQUNFLG9CQUNFO1FBQUksS0FBSyxFQUFFb0Y7TUFBWCxHQUFzQkYsVUFBdEIsR0FDR2xGLFFBREgsQ0FERjs7SUFLRixLQUFLLGFBQUw7TUFDRSxvQkFDRTtRQUFJLEtBQUssRUFBRW9GO01BQVgsR0FBc0JGLFVBQXRCLEdBQ0dsRixRQURILENBREY7O0lBS0YsS0FBSyxhQUFMO01BQ0Usb0JBQ0U7UUFBSSxLQUFLLEVBQUVvRjtNQUFYLEdBQXNCRixVQUF0QixHQUNHbEYsUUFESCxDQURGOztJQUtGLEtBQUssV0FBTDtNQUNFLG9CQUNFO1FBQUksS0FBSyxFQUFFb0Y7TUFBWCxHQUFzQkYsVUFBdEIsR0FDR2xGLFFBREgsQ0FERjs7SUFLRixLQUFLLGVBQUw7TUFDRSxvQkFDRTtRQUFJLEtBQUssRUFBRW9GO01BQVgsR0FBc0JGLFVBQXRCLEdBQ0dsRixRQURILENBREY7O0lBS0Y7TUFDRSxvQkFDRTtRQUNFLEtBQUssa0NBQ0FvRixLQURBO1VBRUhTLE1BQU0sRUFBRTtRQUZMO01BRFAsR0FLTVgsVUFMTixHQU9HbEYsUUFQSCxDQURGO0VBdENKO0FBa0RELENBakVEOztBQW1FQSxJQUFNOEYsSUFBSSxHQUFHLFNBQVBBLElBQU8sT0FBb0M7RUFBQSxJQUFqQ1osVUFBaUMsUUFBakNBLFVBQWlDO0VBQUEsSUFBckJsRixRQUFxQixRQUFyQkEsUUFBcUI7RUFBQSxJQUFYK0YsSUFBVyxRQUFYQSxJQUFXOztFQUMvQyxJQUFJQSxJQUFJLENBQUNDLElBQVQsRUFBZTtJQUNiaEcsUUFBUSxnQkFBRyxnREFBU0EsUUFBVCxDQUFYO0VBQ0Q7O0VBRUQsSUFBSStGLElBQUksQ0FBQ0UsSUFBVCxFQUFlO0lBQ2JqRyxRQUFRLGdCQUFHLDhDQUFPQSxRQUFQLENBQVg7RUFDRDs7RUFFRCxJQUFJK0YsSUFBSSxDQUFDRyxNQUFULEVBQWlCO0lBQ2ZsRyxRQUFRLGdCQUFHLDRDQUFLQSxRQUFMLENBQVg7RUFDRDs7RUFFRCxJQUFJK0YsSUFBSSxDQUFDSSxTQUFULEVBQW9CO0lBQ2xCbkcsUUFBUSxnQkFBRywyQ0FBSUEsUUFBSixDQUFYO0VBQ0Q7O0VBRUQsSUFBSStGLElBQUksQ0FBQ0ssYUFBVCxFQUF3QjtJQUN0QnBHLFFBQVEsZ0JBQUcsNkNBQU1BLFFBQU4sQ0FBWDtFQUNEOztFQUVELG9CQUFPLHdDQUFVa0YsVUFBVixFQUF1QmxGLFFBQXZCLENBQVA7QUFDRCxDQXRCRDs7QUF3QkEsSUFBTXFHLFdBQVcsR0FBRyxTQUFkQSxXQUFjLFFBQXNCO0VBQUEsSUFBbkJyRCxNQUFtQixTQUFuQkEsTUFBbUI7RUFBQSxJQUFYc0QsSUFBVyxTQUFYQSxJQUFXO0VBQ3hDLElBQU16RixNQUFNLEdBQUcsSUFBQTBGLG9CQUFBLEdBQWY7RUFDQSxvQkFDRSxnQ0FBQyxrQkFBRDtJQUNFLE1BQU0sRUFBRXJELGFBQWEsQ0FBQ3JDLE1BQUQsRUFBU21DLE1BQVQsRUFBaUJuRCxnQkFBZ0IsQ0FBQ3NELFFBQWpCLENBQTBCSCxNQUExQixJQUFvQyxPQUFwQyxHQUE4QyxNQUEvRCxDQUR2QjtJQUVFLFdBQVcsRUFBRSxxQkFBQW5CLEtBQUssRUFBSTtNQUNwQkEsS0FBSyxDQUFDSSxjQUFOO01BQ0FjLFdBQVcsQ0FBQ2xDLE1BQUQsRUFBU21DLE1BQVQsQ0FBWDtJQUNEO0VBTEgsZ0JBT0UsZ0NBQUMsZ0JBQUQsUUFBT3NELElBQVAsQ0FQRixDQURGO0FBV0QsQ0FiRDs7QUFlQSxJQUFNRSxVQUFVLEdBQUcsU0FBYkEsVUFBYSxRQUFzQjtFQUFBLElBQW5CeEQsTUFBbUIsU0FBbkJBLE1BQW1CO0VBQUEsSUFBWHNELElBQVcsU0FBWEEsSUFBVztFQUN2QyxJQUFNekYsTUFBTSxHQUFHLElBQUEwRixvQkFBQSxHQUFmO0VBQ0Esb0JBQ0UsZ0NBQUMsa0JBQUQ7SUFDRSxNQUFNLEVBQUVwQyxZQUFZLENBQUN0RCxNQUFELEVBQVNtQyxNQUFULENBRHRCO0lBRUUsV0FBVyxFQUFFLHFCQUFBbkIsS0FBSyxFQUFJO01BQ3BCQSxLQUFLLENBQUNJLGNBQU47TUFDQUssVUFBVSxDQUFDekIsTUFBRCxFQUFTbUMsTUFBVCxDQUFWO0lBQ0Q7RUFMSCxnQkFPRSxnQ0FBQyxnQkFBRCxRQUFPc0QsSUFBUCxDQVBGLENBREY7QUFXRCxDQWJELEMsQ0FlQTs7O0FBSUEsSUFBTUcsR0FBRyxHQUFHLElBQUFDLGlCQUFBLEVBQU0sc0JBQU4sQ0FBWjtBQUVBLElBQU1DLGtCQUFrQixHQUFHO0VBQ3pCQyxRQUFRLEVBQUUsUUFEZTtFQUV6QkMsU0FBUyxFQUFFLE1BRmM7RUFHekJDLGFBQWEsRUFBRSxLQUhVO0VBSXpCQyxRQUFRLEVBQUUsSUFKZTtFQUt6QkMsTUFBTSxFQUFFO0FBTGlCLENBQTNCO0FBUUEsSUFBTUMsd0JBQXdCLEdBQUc7RUFDL0JDLE9BQU8sRUFBRSxFQURzQjtFQUUvQkMsZUFBZSxFQUFFLDJCQUFNLENBQUUsQ0FGTTtFQUcvQkMsa0JBQWtCLEVBQUUsOEJBQU0sQ0FBRTtBQUhHLENBQWpDO0FBTUEsSUFBTUMsOEJBQThCLEdBQUcsRUFBdkM7O0FBRUEsSUFBTUMsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixDQUFBQyxXQUFXLEVBQUk7RUFDdkMsdUNBQ0taLGtCQURMLEdBRUtZLFdBRkw7QUFJRCxDQUxEOztJQU9hQyxlOzs7OztFQW1GWCx5QkFBWTdHLE1BQVosRUFBbUI7SUFBQTs7SUFBQTtJQUNqQiwwQkFBTUEsTUFBTjtJQURpQixrR0FjSCxVQUFBQSxLQUFLLEVBQUk7TUFDdkIsSUFBTThHLDJCQUEyQixtQ0FDNUJSLHdCQUQ0QixHQUU1QnRHLEtBQUssQ0FBQytHLGlCQUZzQixDQUFqQzs7TUFLQSxNQUFLbEgsT0FBTCxHQUFlLElBQUFtSCxxQkFBQSxFQUFhaEgsS0FBSyxDQUFDaUgsYUFBbkIsRUFBa0M7UUFDL0NDLElBQUksRUFBRTtVQUNKQyxPQUFPLEVBQUUsTUFBS0MsV0FEVjtVQUVKeEYsT0FBTyxFQUFFLE1BQUt5RixhQUZWO1VBR0p4RixNQUFNLEVBQUUsTUFBS3lGO1FBSFQsQ0FEeUM7UUFNL0NDLEtBQUssRUFBRTtVQUNMQyxRQUFRLEVBQ054SCxLQUFLLENBQUN5SCxZQUFOLElBQ0F6SCxLQUFLLENBQUN5SCxZQUFOLFVBREEsSUFFQyxVQUFDQyxHQUFELEVBQU1DLElBQU4sRUFBZTtZQUNkM0gsS0FBSyxDQUFDeUgsWUFBTixXQUEwQkMsR0FBMUIsRUFBK0IsVUFBQUUsQ0FBQyxFQUFJO2NBQ2xDRCxJQUFJLENBQUNDLENBQUQsRUFBSSxNQUFLQyxLQUFMLENBQVdqSSxLQUFmLENBQUo7WUFDRCxDQUZEO1VBR0QsQ0FSRTtVQVNMa0ksb0JBQW9CLEVBQ2xCOUgsS0FBSyxDQUFDeUgsWUFBTixJQUNDLFVBQUFNLFVBQVUsRUFBSTtZQUNiO0FBQ1o7QUFDQTtBQUNBO1lBQ1ksSUFBTUMsT0FBTyxHQUFHRCxVQUFVLENBQUM7Y0FBQSxPQUFNLE1BQUtGLEtBQUwsQ0FBV2pJLEtBQWpCO1lBQUEsQ0FBRCxDQUExQjtZQUNBSSxLQUFLLENBQUN5SCxZQUFOLENBQW1CUSxHQUFuQixDQUF1QkQsT0FBdkI7VUFDRCxDQWxCRTtVQW1CTHBHLE9BQU8sRUFBRSxNQUFLeUYsYUFuQlQ7VUFvQkx4RixNQUFNLEVBQUUsTUFBS3lGLFlBcEJSO1VBcUJMWSxhQUFhLEVBQUUsTUFBS2xJLEtBQUwsQ0FBV2tJLGFBckJyQjtVQXNCTEMsY0FBYyxFQUFFLE1BQUtuSSxLQUFMLENBQVdtSTtRQXRCdEIsQ0FOd0M7UUE4Qi9DQyxPQUFPLEVBQUU7VUFDUDtBQUNSO0FBQ0E7QUFDQTtVQUNRQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUNySSxLQUFLLENBQUNxSSxnQkFMbkI7VUFNUEMsZ0JBQWdCLEVBQUV0SSxLQUFLLENBQUNzSSxnQkFOakI7VUFPUEMsU0FBUyxFQUFFdkksS0FBSyxDQUFDd0k7UUFQVixDQTlCc0M7UUF1Qy9DQyxLQUFLLEVBQUU7VUFDTDdHLE9BQU8sRUFBRSxtQkFBTTtZQUNia0UsR0FBRyxDQUFDLG9CQUFELENBQUg7O1lBQ0EsTUFBS3VCLGFBQUw7VUFDRCxDQUpJO1VBS0x4RixNQUFNLEVBQUUsa0JBQU07WUFDWmlFLEdBQUcsQ0FBQyxtQkFBRCxDQUFIOztZQUNBLE1BQUt3QixZQUFMO1VBQ0Q7UUFSSSxDQXZDd0M7UUFpRC9Db0IsWUFBWSxFQUFFO1VBQ1p0SixJQUFJLEVBQUUwSCwyQkFBMkIsQ0FBQzFILElBRHRCO1VBRVptSCxPQUFPLEVBQUVPLDJCQUEyQixDQUFDUCxPQUZ6QjtVQUdab0MsZ0JBQWdCLEVBQUU3QiwyQkFBMkIsQ0FBQzZCLGdCQUhsQztVQUlabkMsZUFBZSxFQUFFTSwyQkFBMkIsQ0FBQ04sZUFKakM7VUFLWkMsa0JBQWtCLEVBQUVLLDJCQUEyQixDQUFDTCxrQkFMcEM7VUFNWm1DLEtBQUssRUFBRTlCLDJCQUEyQixDQUFDOEIsS0FOdkI7VUFPWmhILE9BQU8sRUFBRSxtQkFBTTtZQUNia0UsR0FBRyxDQUFDLG9CQUFELENBQUg7O1lBQ0EsTUFBS3VCLGFBQUw7VUFDRCxDQVZXO1VBV1p4RixNQUFNLEVBQUUsa0JBQU07WUFDWmlFLEdBQUcsQ0FBQyxtQkFBRCxDQUFIOztZQUNBLE1BQUt3QixZQUFMO1VBQ0Q7UUFkVyxDQWpEaUM7UUFpRS9DdUIsa0JBQWtCLEVBQUU3SSxLQUFLLENBQUM4SSx1QkFqRXFCO1FBa0UvQ0MsS0FBSyxFQUFFO1VBQ0xDLEtBQUssRUFBRSxNQUFLQSxLQURQO1VBRUxDLFFBQVEsRUFBRSxNQUFLQSxRQUZWO1VBR0xDLGtCQUFrQixFQUFFbEosS0FBSyxDQUFDa0o7UUFIckI7TUFsRXdDLENBQWxDLENBQWY7SUF3RUQsQ0E1RmtCO0lBQUEsaUdBNklKLFVBQUF0QixDQUFDLEVBQUk7TUFDbEI5QixHQUFHLENBQUMsZ0JBQUQsRUFBbUI4QixDQUFDLElBQUlBLENBQUMsQ0FBQ3VCLGFBQTFCLENBQUg7TUFDQSxJQUFNQyxNQUFNLEdBQUd4QixDQUFDLElBQUlBLENBQUMsQ0FBQ3VCLGFBQXRCO01BRUEsSUFBTXZFLElBQUksR0FBR3dFLE1BQU0sR0FBRyxJQUFBQyxvQkFBQSxFQUFTRCxNQUFULEVBQWlCLE1BQUt2QixLQUFMLENBQVdqSSxLQUE1QixDQUFILEdBQXdDLElBQTNEO01BQ0FrRyxHQUFHLENBQUMsdUJBQUQsRUFBMEJsQixJQUExQixDQUFIOztNQUNBLE1BQUswRSxRQUFMLENBQWM7UUFBRUMsV0FBVyxFQUFFM0U7TUFBZixDQUFkLEVBQXFDLFlBQU07UUFDekMsTUFBSzRFLFVBQUw7TUFDRCxDQUZEO0lBR0QsQ0F0SmtCO0lBQUEsa0dBd0pILFVBQUE1QixDQUFDLEVBQUk7TUFDbkI5QixHQUFHLENBQUMsaUJBQUQsRUFBb0I4QixDQUFDLElBQUlBLENBQUMsQ0FBQ3dCLE1BQTNCLENBQUg7TUFDQSxJQUFNQSxNQUFNLEdBQUd4QixDQUFDLElBQUlBLENBQUMsQ0FBQ3dCLE1BQXRCOztNQUNBLElBQUlBLE1BQUosRUFBWTtRQUNWLElBQU14RSxJQUFJLEdBQUcsSUFBQXlFLG9CQUFBLEVBQVNELE1BQVQsRUFBaUIsTUFBS3ZCLEtBQUwsQ0FBV2pJLEtBQTVCLENBQWI7UUFDQWtHLEdBQUcsQ0FBQyx3QkFBRCxFQUEyQmxCLElBQTNCLENBQUg7UUFFQSxJQUFNNkUsWUFBWSxHQUFHLE1BQUs1QixLQUFMLENBQVc0QixZQUFYLElBQTJCLE1BQUs1QixLQUFMLENBQVdqSSxLQUEzRDs7UUFDQSxNQUFLMEosUUFBTCxDQUFjO1VBQUVDLFdBQVcsRUFBRTNFLElBQWY7VUFBcUI2RSxZQUFZLEVBQVpBO1FBQXJCLENBQWQ7TUFDRCxDQU5ELE1BTU87UUFDTCxNQUFLSCxRQUFMLENBQWM7VUFBRUMsV0FBVyxFQUFFO1FBQWYsQ0FBZDtNQUNEOztNQUNELE1BQUtHLFVBQUw7SUFDRCxDQXJLa0I7SUFBQSxnR0F1S0wsVUFBQTlFLElBQUksRUFBSTtNQUNwQixNQUFLMEUsUUFBTCxDQUFjO1FBQUVLLFlBQVksRUFBRS9FO01BQWhCLENBQWQ7SUFDRCxDQXpLa0I7SUFBQSxrR0EyS0gsVUFBQTFFLE1BQU0sRUFBSTtNQUN4QjRGLEdBQUcsQ0FBQyxpQkFBRCxDQUFIOztNQUNBLE1BQUt3RCxRQUFMLENBQWM7UUFBRUcsWUFBWSxFQUFFLElBQWhCO1FBQXNCRixXQUFXLEVBQUU7TUFBbkMsQ0FBZDs7TUFDQXpELEdBQUcsQ0FBQyx5QkFBRCxFQUE0QixNQUFLK0IsS0FBTCxDQUFXakksS0FBdkMsQ0FBSDs7TUFDQSxNQUFLSSxLQUFMLENBQVdpSixRQUFYLENBQW9CL0ksTUFBcEIsRUFBNEIsSUFBNUI7SUFDRCxDQWhMa0I7SUFBQSwyRkFrTFYsVUFBQUEsTUFBTSxFQUFJO01BQ2pCLElBQVEwSixRQUFSLEdBQXFCLE1BQUs1SixLQUExQixDQUFRNEosUUFBUjtNQUVBOUQsR0FBRyxDQUFDLFVBQUQsQ0FBSDs7TUFDQSxNQUFLd0QsUUFBTCxDQUFjO1FBQUVPLGNBQWMsRUFBRSxLQUFsQjtRQUF5Qk4sV0FBVyxFQUFFO01BQXRDLENBQWQ7O01BRUEsTUFBS08sYUFBTCxDQUFtQjVKLE1BQW5CO0lBQ0QsQ0F6TGtCO0lBQUEsK0ZBbU1OLFVBQUE2SixPQUFPLEVBQUk7TUFDdEIsSUFBUUgsUUFBUixHQUFxQixNQUFLNUosS0FBMUIsQ0FBUTRKLFFBQVI7TUFDQSxJQUNpQnZELE1BRGpCLEdBRUksTUFBS3dCLEtBRlQsQ0FDRWpCLFdBREYsQ0FDaUJQLE1BRGpCOztNQUlBLE1BQUtpRCxRQUFMLENBQWM7UUFBRU8sY0FBYyxFQUFFLEtBQWxCO1FBQXlCTixXQUFXLEVBQUU7TUFBdEMsQ0FBZDs7TUFFQSxJQUFJbEQsTUFBTSxLQUFLLE1BQWYsRUFBdUI7UUFBQTs7UUFDckIsSUFBSXVELFFBQVEsSUFBSSxnQ0FBSy9CLEtBQUwsQ0FBV2pJLEtBQVgsQ0FBaUJvSyxTQUFqQiwwR0FBNEJ2SyxJQUE1QixrRkFBa0N3SyxNQUFsQyxNQUE2QyxDQUE3RCxFQUFnRTtVQUM5RCxNQUFLVCxVQUFMLENBQWdCLElBQWhCLEVBQXNCVSxJQUF0QixDQUEyQixZQUFNO1lBQy9CLE1BQUtKLGFBQUw7O1lBQ0FDLE9BQU87VUFDUixDQUhEO1FBSUQsQ0FMRCxNQUtPO1VBQ0wsTUFBS0QsYUFBTDs7VUFDQUMsT0FBTztRQUNSO01BQ0Y7SUFDRixDQXROa0I7SUFBQSwyRkF3TlYsVUFBQTdJLEtBQUssRUFBSTtNQUNoQjRFLEdBQUcsQ0FBQyxVQUFELENBQUg7TUFDQSxJQUFNc0QsTUFBTSxHQUFHbEksS0FBSyxDQUFDaUksYUFBckI7TUFFQSxJQUFNdkUsSUFBSSxHQUFHd0UsTUFBTSxHQUFHLElBQUFDLG9CQUFBLEVBQVNELE1BQVQsRUFBaUIsTUFBS3ZCLEtBQUwsQ0FBV2pJLEtBQTVCLENBQUgsR0FBd0MsSUFBM0Q7TUFFQWtHLEdBQUcsQ0FBQyxpQkFBRCxFQUFvQmxCLElBQXBCLENBQUg7TUFFQSxPQUFPLElBQUl1RixPQUFKLENBQVksVUFBQUosT0FBTyxFQUFJO1FBQzVCLE1BQUtULFFBQUwsQ0FDRTtVQUFFYyxZQUFZLEVBQUUsTUFBS3ZDLEtBQUwsQ0FBV2pJLEtBQTNCO1VBQWtDMkosV0FBVyxFQUFFLENBQUMzRSxJQUFELEdBQVEsSUFBUixHQUFlQTtRQUE5RCxDQURGLEVBRUUsTUFBS3lGLFVBQUwsQ0FBZ0JDLElBQWhCLGlEQUEyQlAsT0FBM0IsQ0FGRjs7UUFJQSxNQUFLL0osS0FBTCxDQUFXNkIsTUFBWCxDQUFrQlgsS0FBbEI7TUFDRCxDQU5NLENBQVA7SUFPRCxDQXZPa0I7SUFBQSxrR0F5T0gsVUFBQTBHLENBQUMsRUFBSTtNQUNuQixJQUFNMkMsU0FBUyxHQUFHdEksUUFBUSxDQUFDdUksYUFBVCx1QkFBcUMsTUFBSzNDLEtBQUwsQ0FBV2pJLEtBQVgsQ0FBaUJxQyxRQUFqQixDQUEwQmQsR0FBL0QsU0FBbEI7TUFFQVcsVUFBVSxDQUFDLFlBQU07UUFDZixJQUFlMkksVUFBZixHQUE4QixNQUFLNUMsS0FBbkMsQ0FBUWpJLEtBQVI7O1FBRUEsSUFBSSxDQUFDLE1BQUs4SyxVQUFWLEVBQXNCO1VBQ3BCO1FBQ0Q7O1FBRUQsSUFBTUMsYUFBYSxHQUNqQixDQUFDSixTQUFELElBQWN0SSxRQUFRLENBQUNDLGFBQVQsQ0FBdUIwSSxPQUF2QixxQkFBMkNMLFNBQVMsQ0FBQ00sU0FBckQsU0FEaEI7UUFFQSxJQUFNQyxjQUFjLEdBQ2xCLENBQUMsTUFBS0MsVUFBTixJQUNBOUksUUFBUSxDQUFDQyxhQUFULENBQXVCMEksT0FBdkIscUJBQTJDLE1BQUtHLFVBQUwsQ0FBZ0JGLFNBQTNELFNBRkY7O1FBR0EsSUFBTUcsb0JBQW9CLEdBQ3hCLE1BQUtOLFVBQUwsQ0FBZ0IxSSxRQUFoQixDQUF5QjJJLGFBQXpCLEtBQTJDLE1BQUtELFVBQUwsQ0FBZ0IxSSxRQUFoQixDQUF5QjhJLGNBQXpCLENBRDdDOztRQUdBLElBQUksQ0FBQ0Usb0JBQUwsRUFBMkI7VUFDekJULFNBQVMsQ0FBQ1UsbUJBQVYsQ0FBOEIsTUFBOUIsRUFBc0MsTUFBS0MsYUFBM0M7O1VBRUEsSUFBSVQsVUFBVSxDQUFDbEssU0FBZixFQUEwQjtZQUN4QixNQUFLc0IsTUFBTCxDQUFZK0YsQ0FBWjtVQUNEO1FBQ0Y7TUFDRixDQXRCUyxFQXNCUCxFQXRCTyxDQUFWO0lBdUJELENBblFrQjtJQUFBLDRGQTRRVDtNQUFBLE9BQ1IsSUFBSXVDLE9BQUosQ0FBWSxVQUFBSixPQUFPLEVBQUk7UUFDckIsSUFBTVEsU0FBUyxHQUFHdEksUUFBUSxDQUFDdUksYUFBVCx1QkFBcUMsTUFBSzNDLEtBQUwsQ0FBV2pJLEtBQVgsQ0FBaUJxQyxRQUFqQixDQUEwQmQsR0FBL0QsU0FBbEI7UUFFQTJFLEdBQUcsQ0FBQyxXQUFELEVBQWM3RCxRQUFRLENBQUNDLGFBQXZCLENBQUg7UUFFQTtBQUNOO0FBQ0E7O1FBQ00sSUFBSSxNQUFLaUosdUJBQVQsRUFBa0M7VUFDaEMsNEJBQXNCLE1BQUtBLHVCQUEzQjtVQUFBLElBQVFoSyxHQUFSLHlCQUFRQSxHQUFSO1VBQUEsSUFBYTdCLElBQWIseUJBQWFBLElBQWI7VUFDQSxJQUFNOEwsS0FBSyxHQUFHbkosUUFBUSxDQUFDdUksYUFBVCx1QkFBcUNySixHQUFyQyxTQUFkOztVQUVBLElBQUlpSyxLQUFKLEVBQVc7WUFDVCxJQUFJQyxNQUFNLEdBQUcsTUFBS3hELEtBQUwsQ0FBV2pJLEtBQVgsQ0FBaUJ5TCxNQUFqQixHQUEwQkMsWUFBMUIsQ0FBdUNuSyxHQUF2QyxFQUE0QztjQUFFN0IsSUFBSSxFQUFKQTtZQUFGLENBQTVDLENBQWI7O1lBRUEsTUFBS2dLLFFBQUwsQ0FBYztjQUFFMUosS0FBSyxFQUFFeUwsTUFBTSxDQUFDekw7WUFBaEIsQ0FBZCxFQUF1QyxZQUFNO2NBQzNDLE1BQUt1TCx1QkFBTCxHQUErQixJQUEvQjtZQUNELENBRkQ7VUFHRDtRQUNGO1FBRUQ7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7UUFDTSxJQUFJWixTQUFTLEtBQUt0SSxRQUFRLENBQUNDLGFBQTNCLEVBQTBDO1VBQ3hDcUksU0FBUyxDQUFDVSxtQkFBVixDQUE4QixNQUE5QixFQUFzQyxNQUFLQyxhQUEzQztVQUNBWCxTQUFTLENBQUNnQixnQkFBVixDQUEyQixNQUEzQixFQUFtQyxNQUFLTCxhQUF4QztRQUNEOztRQUVELE1BQUt4QixVQUFMOztRQUNBLE1BQUsxSixLQUFMLENBQVc0QixPQUFYOztRQUVBbUksT0FBTztNQUNSLENBcENELENBRFE7SUFBQSxDQTVRUztJQUFBLCtGQW1UTixZQUFNO01BQ2pCakUsR0FBRyxDQUFDLGNBQUQsQ0FBSDs7TUFDQSxJQUFJLENBQUMsTUFBSytCLEtBQUwsQ0FBVzRCLFlBQWhCLEVBQThCO1FBQzVCLE1BQUtILFFBQUwsQ0FBYztVQUFFRyxZQUFZLEVBQUUsTUFBSzVCLEtBQUwsQ0FBV2pJO1FBQTNCLENBQWQ7TUFDRDtJQUNGLENBeFRrQjtJQUFBLCtGQTZUTixVQUFBb0IsS0FBSyxFQUFJO01BQ3BCLGtCQUErQixNQUFLNkcsS0FBcEM7TUFBQSxJQUFRakksS0FBUixlQUFRQSxLQUFSO01BQUEsSUFBZTJKLFdBQWYsZUFBZUEsV0FBZjs7TUFFQSxJQUFNaUMsU0FBUyxHQUFHLE1BQUszTCxPQUFMLENBQWE0TCxNQUFiLENBQW9CLFVBQUNDLENBQUQsRUFBSUMsQ0FBSixFQUFVO1FBQzlDLE9BQU9ELENBQUMsSUFBS0MsQ0FBQyxDQUFDSCxTQUFGLElBQWVHLENBQUMsQ0FBQ0gsU0FBRixDQUFZLE1BQUszRCxLQUFMLENBQVdqSSxLQUF2QixDQUE1QjtNQUNELENBRmlCLEVBRWYsS0FGZSxDQUFsQjs7TUFJQWtHLEdBQUcsQ0FBQyxjQUFELEVBQWlCbEcsS0FBSyxDQUFDVyxTQUF2QixFQUFrQ2dKLFdBQWxDLEVBQStDLGFBQS9DLEVBQThEaUMsU0FBOUQsQ0FBSDs7TUFDQSxJQUFLLE1BQUszRCxLQUFMLENBQVc0QixZQUFYLElBQTJCLENBQUM3SixLQUFLLENBQUNXLFNBQWxDLElBQStDLENBQUNnSixXQUFoRCxJQUErRCxDQUFDaUMsU0FBakUsSUFBK0V4SyxLQUFuRixFQUEwRjtRQUN4RjhFLEdBQUcsQ0FBQywyQkFBRCxDQUFIO1FBQ0FBLEdBQUcsQ0FBQyxTQUFELEVBQVksTUFBSytCLEtBQUwsQ0FBVzRCLFlBQVgsQ0FBd0J4SCxRQUF4QixDQUFpQzJKLFFBQWpDLEVBQVosQ0FBSDtRQUNBOUYsR0FBRyxDQUFDLFNBQUQsRUFBWSxNQUFLK0IsS0FBTCxDQUFXakksS0FBWCxDQUFpQnFDLFFBQWpCLENBQTBCMkosUUFBMUIsRUFBWixDQUFIOztRQUVBLElBQU1DLFFBQVEsR0FBR0MsWUFBQSxDQUFNQyxRQUFOLENBQWUsTUFBS2xFLEtBQUwsQ0FBVzRCLFlBQVgsQ0FBd0J1QyxNQUF4QixFQUFmLENBQWpCOztRQUVBbEcsR0FBRyxDQUFDLFlBQUQsRUFBZStGLFFBQVEsQ0FBQzVKLFFBQXhCLENBQUg7UUFDQSxPQUFPLElBQUlrSSxPQUFKLENBQVksVUFBQUosT0FBTyxFQUFJO1VBQzVCakksVUFBVSxDQUFDLFlBQU07WUFDZixNQUFLd0gsUUFBTCxDQUFjO2NBQUUxSixLQUFLLEVBQUVpTSxRQUFUO2NBQW1CcEMsWUFBWSxFQUFFO1lBQWpDLENBQWQsRUFBdUQsWUFBTTtjQUMzRDNELEdBQUcsQ0FBQyxhQUFELEVBQWdCLE1BQUsrQixLQUFMLENBQVdqSSxLQUFYLENBQWlCcUMsUUFBakIsQ0FBMEIrSixNQUExQixFQUFoQixDQUFIO2NBQ0FqQyxPQUFPO1lBQ1IsQ0FIRDtVQUlELENBTFMsRUFLUCxFQUxPLENBQVY7UUFNRCxDQVBNLENBQVA7TUFRRCxDQWhCRCxNQWdCTztRQUNMLE9BQU9JLE9BQU8sQ0FBQ0osT0FBUixDQUFnQixFQUFoQixDQUFQO01BQ0Q7SUFDRixDQXhWa0I7SUFBQSw2RkEwVlIsVUFBQzdKLE1BQUQsRUFBU3lILElBQVQsRUFBa0I7TUFDM0I3QixHQUFHLENBQUMsWUFBRCxDQUFIO01BQ0EsSUFBUW1HLGVBQVIsR0FBNEIsTUFBS2pNLEtBQWpDLENBQVFpTSxlQUFSOztNQUNBLElBQU1DLE9BQU8sR0FBR3BMLGFBQUEsQ0FBT3FMLE1BQVAsQ0FBY2pNLE1BQWQsRUFBc0IsRUFBdEIsQ0FBaEI7O01BRUEsSUFBSWdNLE9BQU8sR0FBR0QsZUFBZCxFQUErQjtRQUM3QjtNQUNEOztNQUVELElBQU1HLElBQUksR0FBRyxJQUFBQyx5QkFBQSxFQUFZbk0sTUFBWixDQUFiO01BQ0EsSUFBTU4sS0FBSyxHQUFHLElBQUEwTSx5QkFBQSxFQUFZRixJQUFaLENBQWQ7O01BRUEsTUFBSzlDLFFBQUwsQ0FBYztRQUFFMUosS0FBSyxFQUFMQTtNQUFGLENBQWQsRUFBeUIsWUFBTTtRQUM3QmtHLEdBQUcsQ0FBQyx5QkFBRCxDQUFIOztRQUVBLElBQUk2QixJQUFKLEVBQVU7VUFDUkEsSUFBSTtRQUNMO01BQ0YsQ0FORDtJQU9ELENBN1drQjtJQUFBLG9HQStXRCxZQUFNO01BQ3RCLElBQUksTUFBS0UsS0FBTCxDQUFXakksS0FBWCxDQUFpQlcsU0FBckIsRUFBZ0M7UUFDOUIsT0FBTyxNQUFLc0gsS0FBTCxDQUFXakksS0FBbEI7TUFDRDs7TUFFRCxPQUFPLE1BQUtpSSxLQUFMLENBQVd1QyxZQUFsQjtJQUNELENBclhrQjtJQUFBLGdHQWdZTCxVQUFBbUMsQ0FBQyxFQUFJO01BQ2pCLElBQUksQ0FBQ0EsQ0FBTCxFQUFRO1FBQ047TUFDRDs7TUFFRCxJQUFJLE9BQU9BLENBQVAsS0FBYSxRQUFqQixFQUEyQjtRQUN6QixJQUFJQSxDQUFDLENBQUNDLFFBQUYsQ0FBVyxHQUFYLENBQUosRUFBcUI7VUFDbkIsT0FBT3BKLFNBQVA7UUFDRCxDQUZELE1BRU8sSUFBSW1KLENBQUMsQ0FBQ0MsUUFBRixDQUFXLElBQVgsS0FBb0JELENBQUMsQ0FBQ0MsUUFBRixDQUFXLElBQVgsQ0FBcEIsSUFBd0NELENBQUMsQ0FBQ0MsUUFBRixDQUFXLElBQVgsQ0FBNUMsRUFBOEQ7VUFDbkUsT0FBT0QsQ0FBUDtRQUNELENBRk0sTUFFQTtVQUNMLElBQU0zTSxLQUFLLEdBQUc2TSxRQUFRLENBQUNGLENBQUQsRUFBSSxFQUFKLENBQXRCO1VBQ0EsT0FBT0csS0FBSyxDQUFDOU0sS0FBRCxDQUFMLEdBQWVBLEtBQWYsYUFBMEJBLEtBQTFCLE9BQVA7UUFDRDtNQUNGOztNQUNELElBQUksT0FBTzJNLENBQVAsS0FBYSxRQUFqQixFQUEyQjtRQUN6QixpQkFBVUEsQ0FBVjtNQUNEOztNQUVEO0lBQ0QsQ0FwWmtCO0lBQUEsaUdBaWFKLFVBQUEzSCxJQUFJLEVBQUk7TUFDckIsSUFBSUEsSUFBSSxDQUFDK0gsTUFBTCxLQUFnQixPQUFwQixFQUE2QjtNQUU3QixJQUFNQyxJQUFJLEdBQUdoSSxJQUFJLENBQUNiLEtBQUwsQ0FBVzZJLElBQVgsRUFBYjtNQUNBLElBQUksQ0FBQ0EsSUFBTCxFQUFXO01BRVgsSUFBSUEsSUFBSSxDQUFDeE4sSUFBTCxLQUFjLE9BQWxCLEVBQTJCO01BRTNCMEcsR0FBRyxDQUFDLGdDQUFELENBQUg7TUFFQSxJQUFNK0csTUFBTSxHQUFHRCxJQUFJLENBQUNFLFNBQUwsQ0FBZUYsSUFBSSxDQUFDekwsR0FBcEIsQ0FBZjs7TUFDQSxJQUFNd0ssQ0FBQyxHQUFHb0IsWUFBQSxDQUFNRCxTQUFOLENBQWdCRixJQUFJLENBQUN6TCxHQUFyQixDQUFWOztNQUNBMkUsR0FBRyxDQUFDLHdCQUFELEVBQTJCK0csTUFBM0IsRUFBbUNsQixDQUFuQyxDQUFIO01BRUEsT0FBT3ZJLFNBQVA7SUFDRCxDQWhia0I7SUFBQSwwRkFrYlgsVUFBQzRKLEdBQUQsRUFBTXBJLElBQU4sRUFBZTtNQUNyQixJQUFNcUIsUUFBUSxHQUFHK0csR0FBRyxJQUFJLEtBQXhCOztNQUVBLE1BQUtoTixLQUFMLENBQVdnSixLQUFYLENBQWlCL0MsUUFBakIsRUFBMkJyQixJQUEzQjtJQUNELENBdGJrQjtJQUFBO01BQUEsMEZBd2JMLGlCQUFPMUQsS0FBUCxFQUFjbUssTUFBZCxFQUFzQjRCLFdBQXRCO1FBQUE7O1FBQUE7VUFBQTtZQUFBO2NBQUE7Z0JBQ04vTSxNQURNLEdBQ0dtTCxNQUFNLENBQUNuTCxNQURWO2dCQUVOZ04sUUFGTSxHQUVLLElBQUFDLDRCQUFBLEVBQWlCak0sS0FBakIsQ0FGTDtnQkFHTmtNLElBSE0sR0FHQ0YsUUFBUSxDQUFDRyxLQUFULElBQWtCSCxRQUFRLENBQUNHLEtBQVQsQ0FBZSxDQUFmLENBSG5CO2dCQUtOak8sSUFMTSxHQUtDOE4sUUFBUSxDQUFDOU4sSUFMVjtnQkFNTmtPLFFBTk0sR0FNS0osUUFBUSxDQUFDSSxRQU5kO2dCQU9ON04sSUFQTSxHQU9DeU4sUUFBUSxDQUFDek4sSUFQVjs7Z0JBQUEsTUFVVjJOLElBQUksS0FDSEEsSUFBSSxDQUFDaE8sSUFBTCxLQUFjLFlBQWQsSUFBOEJnTyxJQUFJLENBQUNoTyxJQUFMLEtBQWMsV0FBNUMsSUFBMkRnTyxJQUFJLENBQUNoTyxJQUFMLEtBQWMsV0FEdEUsQ0FWTTtrQkFBQTtrQkFBQTtnQkFBQTs7Z0JBQUEsSUFhTCxNQUFLWSxLQUFMLENBQVd5SCxZQWJOO2tCQUFBO2tCQUFBO2dCQUFBOztnQkFBQTs7Y0FBQTtnQkFBQTtnQkFpQlIzQixHQUFHLENBQUMsZUFBRCxDQUFIO2dCQWpCUTtnQkFBQSxPQWtCVSxJQUFBeUgsdUJBQUEsRUFBVUgsSUFBVixDQWxCVjs7Y0FBQTtnQkFrQkYxRixHQWxCRTtnQkFtQkY4RixNQW5CRSxHQW1CT0MsYUFBQSxDQUFPQyxNQUFQLENBQWM7a0JBQzNCdE8sSUFBSSxFQUFFLE9BRHFCO2tCQUUzQnVPLE1BQU0sRUFBRSxJQUZtQjtrQkFHM0JyTyxJQUFJLEVBQUU7b0JBQ0pzTyxPQUFPLEVBQUUsS0FETDtvQkFFSmxHLEdBQUcsRUFBSEE7a0JBRkk7Z0JBSHFCLENBQWQsQ0FuQlA7O2dCQTRCUixJQUFJdUYsV0FBSixFQUFpQjtrQkFDZixNQUFLakUsS0FBTDtnQkFDRCxDQUZELE1BRU87a0JBQ0M2RSxLQURELEdBQ1MsSUFBQUMseUJBQUEsRUFBYzVNLEtBQWQsRUFBcUJoQixNQUFyQixDQURUOztrQkFFTCxJQUFJMk4sS0FBSixFQUFXO29CQUNUeEMsTUFBTSxDQUFDMEMsTUFBUCxDQUFjRixLQUFkO2tCQUNEO2dCQUNGOztnQkFFS0csRUFyQ0UsR0FxQ0czQyxNQUFNLENBQUM0QyxZQUFQLENBQW9CVCxNQUFwQixDQXJDSDs7Z0JBc0NSLE1BQUt2RSxRQUFMLENBQWMrRSxFQUFkOztnQkFDTWhHLE9BdkNFLEdBdUNRLElBQUlrRyw4QkFBSixDQUF1QlYsTUFBdkIsRUFBK0I7a0JBQUEsT0FBTSxNQUFLM0YsS0FBTCxDQUFXakksS0FBakI7Z0JBQUEsQ0FBL0IsRUFBdUQsTUFBS3FKLFFBQTVELEVBQXNFLElBQXRFLENBdkNSOztnQkF3Q1IsTUFBS2pKLEtBQUwsQ0FBV3lILFlBQVgsQ0FBd0JRLEdBQXhCLENBQTRCRCxPQUE1Qjs7Z0JBeENRO2dCQUFBOztjQUFBO2dCQUFBO2dCQUFBO2dCQTBDUmxDLEdBQUcsQ0FBQyx1QkFBRCxjQUFIOztjQTFDUTtnQkFBQTtnQkFBQTs7Y0FBQTtnQkFBQSxNQTRDRDFHLElBQUksS0FBSyxVQTVDUjtrQkFBQTtrQkFBQTtnQkFBQTs7Z0JBNkNWaU0sTUFBTSxDQUFDOEMsY0FBUCxDQUFzQmIsUUFBdEI7Z0JBN0NVO2dCQUFBOztjQUFBO2dCQUFBLE1BOENEbE8sSUFBSSxLQUFLLE1BQVQsSUFBbUJBLElBQUksS0FBSyxNQTlDM0I7a0JBQUE7a0JBQUE7Z0JBQUE7O2dCQUFBLElBK0NMSyxJQS9DSztrQkFBQTtrQkFBQTtnQkFBQTs7Z0JBQUE7O2NBQUE7Z0JBQUEsZ0JBb0RONEwsTUFwRE0sQ0FtRFJ6TCxLQW5EUSxFQW1EQ3FDLFNBbkRELGlCQW1EQ0EsUUFuREQsRUFtRFcyQixTQW5EWCxpQkFtRFdBLFNBbkRYLEVBbURzQndLLFVBbkR0QixpQkFtRHNCQSxVQW5EdEI7O2dCQUFBLEtBc0ROQSxVQUFVLENBQUNULE1BdERMO2tCQUFBO2tCQUFBO2dCQUFBOztnQkFBQTs7Y0FBQTtnQkEwREpVLFlBMURJLEdBMERXRCxVQTFEWDtnQkEyREpFLFlBM0RJLEdBMkRXck0sU0FBUSxDQUFDc00scUJBQVQsQ0FBK0IzSyxTQUEvQixDQTNEWDtnQkE0REo0SyxJQTVESSxHQTRER0MsZ0NBQUEsQ0FBTUMsV0FBTixDQUFrQmpQLElBQWxCLEVBQXdCO2tCQUNuQzRPLFlBQVksRUFBWkEsWUFEbUM7a0JBRW5DQyxZQUFZLEVBQVpBO2dCQUZtQyxDQUF4QixFQUdWck0sUUEvRE87Z0JBZ0VWb0osTUFBTSxDQUFDOEMsY0FBUCxDQUFzQkssSUFBdEI7O2NBaEVVO2NBQUE7Z0JBQUE7WUFBQTtVQUFBO1FBQUE7TUFBQSxDQXhiSzs7TUFBQTtRQUFBO01BQUE7SUFBQTtJQUFBLHNHQTRmQyxVQUFBeE8sS0FBSyxFQUFJO01BQzNCLElBQVFFLE1BQVIsR0FBbUJGLEtBQW5CLENBQVFFLE1BQVI7TUFDQSxJQUFRK0IsUUFBUixHQUFxQi9CLE1BQU0sQ0FBQ04sS0FBNUIsQ0FBUXFDLFFBQVI7O01BRUEsSUFBSSxDQUFDL0IsTUFBTSxDQUFDRixLQUFQLENBQWEyTyxXQUFkLElBQTZCMU0sUUFBUSxDQUFDeEMsSUFBVCxLQUFrQixFQUEvQyxJQUFxRHdDLFFBQVEsQ0FBQzhCLEtBQVQsQ0FBZTZLLElBQWYsS0FBd0IsQ0FBakYsRUFBb0Y7UUFDbEYsT0FBTyxLQUFQO01BQ0Q7O01BRUQsb0JBQ0U7UUFDRSxlQUFlLEVBQUUsS0FEbkI7UUFFRSxLQUFLLEVBQUU7VUFDTEMsT0FBTyxFQUFFLGNBREo7VUFFTEMsS0FBSyxFQUFFLGFBRkY7VUFFaUI7VUFDdEJDLFFBQVEsRUFBRSxNQUhMO1VBSUxDLFVBQVUsRUFBRSxRQUpQO1VBS0xDLE9BQU8sRUFBRSxNQUxKO1VBTUxDLGFBQWEsRUFBRSxNQU5WO1VBT0xDLFVBQVUsRUFBRTtRQVBQO01BRlQsR0FZR2pQLE1BQU0sQ0FBQ0YsS0FBUCxDQUFhMk8sV0FaaEIsQ0FERjtJQWdCRCxDQXBoQmtCO0lBRWpCLE1BQUs5RyxLQUFMLEdBQWE7TUFDWGpJLEtBQUssRUFBRUksTUFBSyxDQUFDSixLQURGO01BRVhnSCxXQUFXLEVBQUVELGlCQUFpQixDQUFDM0csTUFBSyxDQUFDNEcsV0FBUDtJQUZuQixDQUFiOztJQUtBLE1BQUt3SSxRQUFMLEdBQWdCLFlBQU07TUFDcEJwUCxNQUFLLENBQUNpSixRQUFOLENBQWUsTUFBS3BCLEtBQUwsQ0FBV2pJLEtBQTFCLEVBQWlDLElBQWpDO0lBQ0QsQ0FGRDs7SUFJQSxNQUFLeVAsYUFBTCxDQUFtQixNQUFLclAsS0FBeEI7O0lBWGlCO0VBWWxCOzs7O1dBa0ZELDZCQUFvQjtNQUFBOztNQUNsQjtNQUNBLEtBQUtBLEtBQUwsQ0FBV3NQLEtBQVgsQ0FBaUIsSUFBakI7TUFFQUMsTUFBTSxDQUFDaEUsZ0JBQVAsQ0FBd0IsUUFBeEIsRUFBa0MsS0FBSzZELFFBQXZDOztNQUVBLElBQUksS0FBS2xQLE1BQUwsSUFBZSxLQUFLRixLQUFMLENBQVd3UCxTQUE5QixFQUF5QztRQUN2Q3JGLE9BQU8sQ0FBQ0osT0FBUixHQUFrQkcsSUFBbEIsQ0FBdUIsWUFBTTtVQUMzQixJQUFJLE1BQUksQ0FBQ2hLLE1BQVQsRUFBaUI7WUFDZixJQUFNcUssU0FBUyxHQUFHdEksUUFBUSxDQUFDdUksYUFBVCx1QkFDRixNQUFJLENBQUN0SyxNQUFMLENBQVlOLEtBQVosQ0FBa0JxQyxRQUFsQixDQUEyQmQsR0FEekIsU0FBbEI7O1lBSUEsSUFBSW9KLFNBQUosRUFBZTtjQUNiQSxTQUFTLENBQUN2QixLQUFWO1lBQ0Q7VUFDRjtRQUNGLENBVkQ7TUFXRDtJQUNGOzs7V0FFRCxtQ0FBMEJ5RyxTQUExQixFQUFxQztNQUNuQyxJQUFRN0ksV0FBUixHQUF3QixLQUFLaUIsS0FBN0IsQ0FBUWpCLFdBQVI7TUFDQSxJQUFNOEksY0FBYyxHQUFHL0ksaUJBQWlCLENBQUM4SSxTQUFTLENBQUM3SSxXQUFYLENBQXhDOztNQUVBLElBQUksQ0FBQyxJQUFBK0ksbUJBQUEsRUFBUUQsY0FBUixFQUF3QjlJLFdBQXhCLENBQUwsRUFBMkM7UUFDekMsS0FBSzBDLFFBQUwsQ0FBYztVQUNaMUMsV0FBVyxFQUFFOEk7UUFERCxDQUFkO01BR0Q7O01BRUQsSUFBSSxDQUFDLElBQUFDLG1CQUFBLEVBQVFGLFNBQVMsQ0FBQzNHLHVCQUFsQixFQUEyQyxLQUFLOUksS0FBTCxDQUFXOEksdUJBQXRELENBQUwsRUFBcUY7UUFDbkYsS0FBS3VHLGFBQUwsQ0FBbUJJLFNBQW5CO01BQ0Q7SUFDRjs7O1dBRUQsOEJBQXFCO01BQ25CO01BQ0E7TUFDQSxJQUFNRyxZQUFZLEdBQUczTixRQUFRLENBQUM0TixnQkFBVCxDQUEwQiw2QkFBMUIsQ0FBckI7TUFFQWhNLEtBQUssQ0FBQ0MsSUFBTixDQUFXOEwsWUFBWCxFQUF5QkUsT0FBekIsQ0FBaUMsVUFBQUMsRUFBRSxFQUFJO1FBQ3JDQSxFQUFFLENBQUN0TCxLQUFILENBQVN1TCxRQUFULEdBQW9CLEtBQXBCO1FBQ0FELEVBQUUsQ0FBQ3RMLEtBQUgsQ0FBU29LLE9BQVQsR0FBbUIsY0FBbkI7TUFDRCxDQUhEO0lBSUQ7Ozs7SUFnREQ7QUFDRjtBQUNBO0lBQ0UsZ0NBQXVCO01BQ3JCVSxNQUFNLENBQUN0RSxtQkFBUCxDQUEyQixRQUEzQixFQUFxQyxLQUFLbUUsUUFBMUM7SUFDRCxDLENBRUQ7Ozs7V0FxTEEsMENBQWlDcFAsS0FBakMsRUFBd0M7TUFDdEMsSUFBSSxDQUFDLElBQUEyUCxtQkFBQSxFQUFRM1AsS0FBSyxDQUFDSixLQUFkLEVBQXFCLEtBQUtJLEtBQUwsQ0FBV0osS0FBaEMsQ0FBTCxFQUE2QztRQUMzQyxLQUFLMEosUUFBTCxDQUFjO1VBQ1pOLEtBQUssRUFBRSxLQURLO1VBRVpwSixLQUFLLEVBQUVJLEtBQUssQ0FBQ0o7UUFGRCxDQUFkO01BSUQ7SUFDRjs7O1dBd0JELDBCQUFpQjtNQUNmLGtCQUFnRCxLQUFLSSxLQUFyRDtNQUFBLElBQVE4TyxLQUFSLGVBQVFBLEtBQVI7TUFBQSxJQUFlbUIsU0FBZixlQUFlQSxTQUFmO01BQUEsSUFBMEJDLE1BQTFCLGVBQTBCQSxNQUExQjtNQUFBLElBQWtDQyxTQUFsQyxlQUFrQ0EsU0FBbEM7TUFFQSxPQUFPO1FBQ0xyQixLQUFLLEVBQUUsS0FBS3NCLFdBQUwsQ0FBaUJ0QixLQUFqQixDQURGO1FBRUxvQixNQUFNLEVBQUUsS0FBS0UsV0FBTCxDQUFpQkYsTUFBakIsQ0FGSDtRQUdMRCxTQUFTLEVBQUUsS0FBS0csV0FBTCxDQUFpQkgsU0FBakIsQ0FITjtRQUlMRSxTQUFTLEVBQUUsS0FBS0MsV0FBTCxDQUFpQkQsU0FBakI7TUFKTixDQUFQO0lBTUQ7OztXQXVIRCxrQkFBUztNQUFBO01BQUE7O01BQ1AsbUJBU0ksS0FBS25RLEtBVFQ7TUFBQSxJQUNFcVEsUUFERixnQkFDRUEsUUFERjtNQUFBLElBRUVDLFVBRkYsZ0JBRUVBLFVBRkY7TUFBQSxJQUdFQyxjQUhGLGdCQUdFQSxjQUhGO01BQUEsSUFJRUMsT0FKRixnQkFJRUEsT0FKRjtNQUFBLElBS0UzRixTQUxGLGdCQUtFQSxTQUxGO01BQUEsSUFNRThELFdBTkYsZ0JBTUVBLFdBTkY7TUFBQSxJQU9FOEIsV0FQRixnQkFPRUEsV0FQRjtNQUFBLElBUUV4UCxTQVJGLGdCQVFFQSxTQVJGO01BV0EsbUJBQTRDLEtBQUs0RyxLQUFqRDtNQUFBLElBQVFqSSxLQUFSLGdCQUFRQSxLQUFSO01BQUEsSUFBZTJKLFdBQWYsZ0JBQWVBLFdBQWY7TUFBQSxJQUE0QjNDLFdBQTVCLGdCQUE0QkEsV0FBNUI7TUFFQWQsR0FBRyxDQUFDLGtCQUFELEVBQXFCbEcsS0FBckIsQ0FBSDtNQUNBLElBQU04USxTQUFTLEdBQUcsS0FBS0MsY0FBTCxFQUFsQjtNQUNBLElBQU1DLEtBQUssR0FBRyxJQUFBQyxzQkFBQSxtRUFFVEwsT0FBTyxDQUFDTSxNQUZDLEVBRVFQLGNBRlIsaURBR1RDLE9BQU8sQ0FBQ08sWUFIQyxFQUdjbkssV0FBVyxDQUFDVCxhQUFaLElBQTZCUyxXQUFXLENBQUNYLFFBQVosS0FBeUIsS0FIcEUsaUJBS1o0RSxTQUxZLEVBTVoyRixPQUFPLENBQUNRLFdBTkksQ0FBZDtNQVNBLG9CQUNFO1FBQ0UsR0FBRyxFQUFFLGFBQUFDLEtBQUc7VUFBQSxPQUFLLE1BQUksQ0FBQ3ZHLFVBQUwsR0FBa0J1RyxLQUF2QjtRQUFBLENBRFY7UUFFRSxLQUFLLEVBQUU7VUFBRW5DLEtBQUssRUFBRTRCLFNBQVMsQ0FBQzVCO1FBQW5CLENBRlQ7UUFHRSxTQUFTLEVBQUU4QjtNQUhiLGdCQUtFLGdDQUFDLFdBQUQ7UUFDRSxPQUFPLEVBQUUsS0FBSy9RLE9BRGhCO1FBRUUsVUFBVSxFQUFFLG9CQUFBcVIsQ0FBQyxFQUFJO1VBQ2YsSUFBSUEsQ0FBSixFQUFPO1lBQ0wsTUFBSSxDQUFDbkcsVUFBTCxHQUFrQm1HLENBQWxCO1VBQ0Q7UUFDRixDQU5IO1FBT0UsUUFBUSxFQUFFLEtBQUtsUixLQUFMLENBQVdZLFFBUHZCO1FBUUUsS0FBSyxFQUFFaEIsS0FSVDtRQVNFLEtBQUssRUFBRSxLQUFLb0osS0FUZDtRQVVFLFNBQVMsRUFBRS9ILFNBVmI7UUFXRSxRQUFRLEVBQUUsS0FBS2dJLFFBWGpCO1FBWUUsZUFBZSxFQUFFLEtBQUtrSSxlQVp4QjtRQWFFLE1BQU0sRUFBRSxLQUFLdFAsTUFiZjtRQWNFLE1BQU0sRUFBRSxnQkFBQ1gsS0FBRCxFQUFRaEIsTUFBUjtVQUFBLE9BQW1CLE1BQUksQ0FBQ2tSLFdBQUwsQ0FBaUJsUSxLQUFqQixFQUF3QmhCLE1BQXhCLEVBQWdDLElBQWhDLENBQW5CO1FBQUEsQ0FkVjtRQWVFLE9BQU8sRUFBRSxpQkFBQ2dCLEtBQUQsRUFBUWhCLE1BQVI7VUFBQSxPQUFtQixNQUFJLENBQUNrUixXQUFMLENBQWlCbFEsS0FBakIsRUFBd0JoQixNQUF4QixDQUFuQjtRQUFBLENBZlg7UUFnQkUsT0FBTyxFQUFFLEtBQUswQixPQWhCaEI7UUFpQkUsYUFBYSxFQUFFLEtBQUtrSSxhQWpCdEI7UUFrQkUsTUFBTSxFQUFFLEtBQUszSCxNQWxCZjtRQW1CRSxXQUFXLEVBQUVvSCxXQW5CZjtRQW9CRSxTQUFTLEVBQUUsS0FBS3hJLFNBcEJsQjtRQXFCRSxRQUFRLEVBQUVzUCxRQXJCWjtRQXNCRSxVQUFVLEVBQUVDLFVBdEJkO1FBdUJFLFNBQVMsRUFBRSxJQUFBTyxzQkFBQSx1Q0FFTkwsT0FBTyxDQUFDYSxTQUZGLEVBRWN6SyxXQUFXLElBQUlBLFdBQVcsQ0FBQzBLLFFBRnpDLEdBSVRkLE9BQU8sQ0FBQ1EsV0FKQyxDQXZCYjtRQTZCRSxLQUFLLEVBQUU7VUFDTGYsU0FBUyxFQUFFUyxTQUFTLENBQUNULFNBRGhCO1VBRUxDLE1BQU0sRUFBRVEsU0FBUyxDQUFDUixNQUZiO1VBR0xDLFNBQVMsRUFBRU8sU0FBUyxDQUFDUDtRQUhoQixDQTdCVDtRQWtDRSxXQUFXLEVBQUVNLFdBbENmO1FBbUNFLFdBQVcsRUFBRTdKLFdBbkNmO1FBb0NFLFdBQVcsRUFBRStILFdBcENmO1FBcUNFLGlCQUFpQixFQUFFLEtBQUs0QztNQXJDMUIsRUFMRixDQURGO01BZ0RBLG9CQUNFO1FBQ0UsR0FBRyxFQUFFLGFBQUFOLEtBQUc7VUFBQSxPQUFLLE1BQUksQ0FBQ3ZHLFVBQUwsR0FBa0J1RyxLQUF2QjtRQUFBLENBRFY7UUFFRSxLQUFLLEVBQUU7VUFBRW5DLEtBQUssRUFBRTRCLFNBQVMsQ0FBQzVCO1FBQW5CLENBRlQ7UUFHRSxTQUFTLEVBQUU4QjtNQUhiLGdCQUtFLGdDQUFDLGtCQUFEO1FBQ0UsT0FBTyxFQUFFLEtBQUsvUSxPQURoQjtRQUVFLFVBQVUsRUFBRSxvQkFBQXFSLENBQUMsRUFBSTtVQUNmLElBQUlBLENBQUosRUFBTztZQUNMLE1BQUksQ0FBQ25HLFVBQUwsR0FBa0JtRyxDQUFsQjtVQUNEO1FBQ0YsQ0FOSDtRQU9FLEtBQUssRUFBRXRSLEtBUFQ7UUFRRSxLQUFLLEVBQUUsS0FBS29KLEtBUmQ7UUFTRSxTQUFTLEVBQUUvSCxTQVRiO1FBVUUsUUFBUSxFQUFFLEtBQUtnSSxRQVZqQjtRQVdFLGVBQWUsRUFBRSxLQUFLa0ksZUFYeEI7UUFZRSxNQUFNLEVBQUUsS0FBS3RQLE1BWmY7UUFhRSxNQUFNLEVBQUUsZ0JBQUNYLEtBQUQsRUFBUWhCLE1BQVI7VUFBQSxPQUFtQixNQUFJLENBQUNrUixXQUFMLENBQWlCbFEsS0FBakIsRUFBd0JoQixNQUF4QixFQUFnQyxJQUFoQyxDQUFuQjtRQUFBLENBYlY7UUFjRSxPQUFPLEVBQUUsaUJBQUNnQixLQUFELEVBQVFoQixNQUFSO1VBQUEsT0FBbUIsTUFBSSxDQUFDa1IsV0FBTCxDQUFpQmxRLEtBQWpCLEVBQXdCaEIsTUFBeEIsQ0FBbkI7UUFBQSxDQWRYO1FBZUUsT0FBTyxFQUFFLEtBQUswQixPQWZoQjtRQWdCRSxhQUFhLEVBQUUsS0FBS2tJLGFBaEJ0QjtRQWlCRSxXQUFXLEVBQUVQLFdBakJmO1FBa0JFLFNBQVMsRUFBRSxLQUFLeEksU0FsQmxCO1FBbUJFLFFBQVEsRUFBRXNQLFFBbkJaO1FBb0JFLFVBQVUsRUFBRUMsVUFwQmQ7UUFxQkUsU0FBUyxFQUFFLElBQUFPLHNCQUFBLHVDQUVOTCxPQUFPLENBQUNhLFNBRkYsRUFFY3pLLFdBQVcsSUFBSUEsV0FBVyxDQUFDMEssUUFGekMsR0FJVGQsT0FBTyxDQUFDUSxXQUpDLENBckJiO1FBMkJFLEtBQUssRUFBRTtVQUNMZixTQUFTLEVBQUVTLFNBQVMsQ0FBQ1QsU0FEaEI7VUFFTEMsTUFBTSxFQUFFUSxTQUFTLENBQUNSLE1BRmI7VUFHTEMsU0FBUyxFQUFFTyxTQUFTLENBQUNQO1FBSGhCLENBM0JUO1FBZ0NFLFdBQVcsRUFBRU0sV0FoQ2Y7UUFpQ0UsV0FBVyxFQUFFN0osV0FqQ2Y7UUFrQ0UsV0FBVyxFQUFFK0gsV0FsQ2Y7UUFtQ0UsaUJBQWlCLEVBQUUsS0FBSzRDO01BbkMxQixFQUxGLENBREY7SUE2Q0Q7OztFQS90QmtDQyxpQkFBQSxDQUFNQyxTLEdBa3VCM0M7Ozs7aUNBbHVCYTVLLGUsZUFDUTtFQUNqQjJJLFNBQVMsRUFBRWtDLHFCQUFBLENBQVVDLElBREo7RUFFakJyQyxLQUFLLEVBQUVvQyxxQkFBQSxDQUFVRSxJQUFWLENBQWVDLFVBRkw7RUFHakI1SSxRQUFRLEVBQUV5SSxxQkFBQSxDQUFVRSxJQUFWLENBQWVDLFVBSFI7RUFJakJqUixRQUFRLEVBQUU4USxxQkFBQSxDQUFVRSxJQUpIO0VBS2pCaFEsT0FBTyxFQUFFOFAscUJBQUEsQ0FBVUUsSUFMRjtFQU1qQi9QLE1BQU0sRUFBRTZQLHFCQUFBLENBQVVFLElBTkQ7RUFPakIzUSxTQUFTLEVBQUV5USxxQkFBQSxDQUFVRSxJQVBKO0VBUWpCaFMsS0FBSyxFQUFFOFIscUJBQUEsQ0FBVUksT0FBVixDQUNMSixxQkFBQSxDQUFVSyxLQUFWLENBQWdCO0lBQ2QzUyxJQUFJLEVBQUVzUyxxQkFBQSxDQUFVdkYsTUFERjtJQUVkOU0sUUFBUSxFQUFFcVMscUJBQUEsQ0FBVU0sS0FGTjtJQUdkMVMsSUFBSSxFQUFFb1MscUJBQUEsQ0FBVS9FO0VBSEYsQ0FBaEIsQ0FESyxDQVJVO0VBZWpCbEYsWUFBWSxFQUFFaUsscUJBQUEsQ0FBVS9FLE1BZlA7RUFnQmpCekQsa0JBQWtCLEVBQUV3SSxxQkFBQSxDQUFVSyxLQUFWLENBQWdCO0lBQ2xDOUosR0FBRyxFQUFFeUoscUJBQUEsQ0FBVUUsSUFEbUI7SUFFbEMsVUFBUUYscUJBQUEsQ0FBVUU7RUFGZ0IsQ0FBaEIsQ0FoQkg7RUFvQmpCM0YsZUFBZSxFQUFFeUYscUJBQUEsQ0FBVU8sTUFwQlY7RUFxQmpCbkQsS0FBSyxFQUFFNEMscUJBQUEsQ0FBVVEsU0FBVixDQUFvQixDQUFDUixxQkFBQSxDQUFVdkYsTUFBWCxFQUFtQnVGLHFCQUFBLENBQVVPLE1BQTdCLENBQXBCLENBckJVO0VBc0JqQi9CLE1BQU0sRUFBRXdCLHFCQUFBLENBQVVRLFNBQVYsQ0FBb0IsQ0FBQ1IscUJBQUEsQ0FBVXZGLE1BQVgsRUFBbUJ1RixxQkFBQSxDQUFVTyxNQUE3QixDQUFwQixDQXRCUztFQXVCakJoQyxTQUFTLEVBQUV5QixxQkFBQSxDQUFVUSxTQUFWLENBQW9CLENBQUNSLHFCQUFBLENBQVV2RixNQUFYLEVBQW1CdUYscUJBQUEsQ0FBVU8sTUFBN0IsQ0FBcEIsQ0F2Qk07RUF3QmpCOUIsU0FBUyxFQUFFdUIscUJBQUEsQ0FBVVEsU0FBVixDQUFvQixDQUFDUixxQkFBQSxDQUFVdkYsTUFBWCxFQUFtQnVGLHFCQUFBLENBQVVPLE1BQTdCLENBQXBCLENBeEJNO0VBeUJqQnpCLE9BQU8sRUFBRWtCLHFCQUFBLENBQVUvRSxNQUFWLENBQWlCa0YsVUF6QlQ7RUEwQmpCdEIsY0FBYyxFQUFFbUIscUJBQUEsQ0FBVUMsSUExQlQ7RUEyQmpCdEIsUUFBUSxFQUFFcUIscUJBQUEsQ0FBVUMsSUEzQkg7RUE0QmpCckIsVUFBVSxFQUFFb0IscUJBQUEsQ0FBVUMsSUE1Qkw7RUE2QmpCL0gsUUFBUSxFQUFFOEgscUJBQUEsQ0FBVUMsSUE3Qkg7RUE4QmpCdEosZ0JBQWdCLEVBQUVxSixxQkFBQSxDQUFVQyxJQTlCWDtFQStCakJySixnQkFBZ0IsRUFBRW9KLHFCQUFBLENBQVVDLElBL0JYO0VBZ0NqQm5KLGdCQUFnQixFQUFFa0oscUJBQUEsQ0FBVUMsSUFoQ1g7RUFpQ2pCbEIsV0FBVyxFQUFFaUIscUJBQUEsQ0FBVVMsR0FqQ047RUFrQ2pCeEQsV0FBVyxFQUFFK0MscUJBQUEsQ0FBVXZGLE1BbENOO0VBbUNqQnBGLGlCQUFpQixFQUFFMksscUJBQUEsQ0FBVUssS0FBVixDQUFnQjtJQUNqQzNTLElBQUksRUFBRXNTLHFCQUFBLENBQVVVLEtBQVYsQ0FBZ0IsQ0FDcEIsK0JBRG9CLEVBRXBCLGlCQUZvQixFQUdwQixtQkFIb0IsQ0FBaEIsQ0FEMkI7SUFNakM3TCxPQUFPLEVBQUVtTCxxQkFBQSxDQUFVL0UsTUFOYztJQU9qQ25HLGVBQWUsRUFBRWtMLHFCQUFBLENBQVVFLElBUE07SUFRakNuTCxrQkFBa0IsRUFBRWlMLHFCQUFBLENBQVVFO0VBUkcsQ0FBaEIsQ0FuQ0Y7RUE2Q2pCOUksdUJBQXVCLEVBQUU0SSxxQkFBQSxDQUFVSSxPQUFWLENBQ3ZCSixxQkFBQSxDQUFVSyxLQUFWLENBQWdCO0lBQ2RNLFFBQVEsRUFBRVgscUJBQUEsQ0FBVXZGLE1BRE47SUFFZG1HLGFBQWEsRUFBRVoscUJBQUEsQ0FBVXZGLE1BRlg7SUFHZG9HLFVBQVUsRUFBRWIscUJBQUEsQ0FBVUksT0FBVixDQUFrQkoscUJBQUEsQ0FBVUksT0FBVixDQUFrQkoscUJBQUEsQ0FBVXZGLE1BQTVCLENBQWxCO0VBSEUsQ0FBaEIsQ0FEdUIsQ0E3Q1I7RUFvRGpCdkYsV0FBVyxFQUFFOEsscUJBQUEsQ0FBVUssS0FBVixDQUFnQjtJQUMzQjlMLFFBQVEsRUFBRXlMLHFCQUFBLENBQVVVLEtBQVYsQ0FBZ0IsQ0FBQyxRQUFELEVBQVcsS0FBWCxDQUFoQixDQURpQjtJQUUzQmxNLFNBQVMsRUFBRXdMLHFCQUFBLENBQVVVLEtBQVYsQ0FBZ0IsQ0FBQyxNQUFELEVBQVMsT0FBVCxDQUFoQixDQUZnQjtJQUczQmpNLGFBQWEsRUFBRXVMLHFCQUFBLENBQVVDLElBSEU7SUFJM0J2TCxRQUFRLEVBQUVzTCxxQkFBQSxDQUFVQyxJQUpPO0lBSzNCdEwsTUFBTSxFQUFFcUwscUJBQUEsQ0FBVXZGO0VBTFMsQ0FBaEIsQ0FwREk7RUEyRGpCbEYsYUFBYSxFQUFFeUsscUJBQUEsQ0FBVUksT0FBVixDQUFrQixVQUFBVSxNQUFNLEVBQUk7SUFDekMsSUFBTUMsUUFBUSxHQUFHRCxNQUFNLENBQUNFLEtBQVAsQ0FBYSxVQUFBbkcsQ0FBQztNQUFBLE9BQUlvRyxvQkFBQSxDQUFZblEsUUFBWixDQUFxQitKLENBQXJCLENBQUo7SUFBQSxDQUFkLENBQWpCO0lBRUEsT0FDRSxDQUFDa0csUUFBRCxJQUNBLElBQUlHLEtBQUosMkJBQTZCSixNQUE3QixzQ0FBK0RHLG9CQUFBLENBQVlFLElBQVosQ0FBaUIsR0FBakIsQ0FBL0QsT0FGRjtFQUlELENBUGMsQ0EzREU7RUFtRWpCaEksU0FBUyxFQUFFNkcscUJBQUEsQ0FBVXZGLE1BbkVKO0VBb0VqQmpFLGFBQWEsRUFBRXdKLHFCQUFBLENBQVVPLE1BcEVSO0VBcUVqQjlKLGNBQWMsRUFBRXVKLHFCQUFBLENBQVVPO0FBckVULEM7aUNBRFJwTCxlLGtCQXlFVztFQUNwQnlCLGdCQUFnQixFQUFFLElBREU7RUFFcEIxRyxPQUFPLEVBQUUsbUJBQU0sQ0FBRSxDQUZHO0VBR3BCQyxNQUFNLEVBQUUsa0JBQU0sQ0FBRSxDQUhJO0VBSXBCWixTQUFTLEVBQUUscUJBQU0sQ0FBRSxDQUpDO0VBS3BCMkYsV0FBVyxFQUFFWixrQkFMTztFQU1wQmUsaUJBQWlCLEVBQUVULHdCQU5DO0VBT3BCd0MsdUJBQXVCLEVBQUVwQztBQVBMLEM7QUEwcEJ4QixJQUFNb00sTUFBTSxHQUFHO0VBQ2JoQyxNQUFNLEVBQUU7SUFDTmlDLGVBQWUsRUFBRTtFQURYLENBREs7RUFJYi9CLFdBQVcsRUFBRTtJQUNYZ0MsVUFBVSxFQUFFLG9CQUREO0lBR1gsV0FBVztNQUNUQyxXQUFXLEVBQUUsT0FESjtNQUVUbkUsS0FBSyxFQUFFLE1BRkU7TUFHVG9FLGNBQWMsRUFBRSxVQUhQO01BSVRDLEtBQUssRUFBRUEsZUFBQSxDQUFNMVQsSUFBTixFQUpFO01BS1RzVCxlQUFlLEVBQUVJLGVBQUEsQ0FBTUMsVUFBTjtJQUxSLENBSEE7SUFVWCxnQ0FBZ0M7TUFDOUJDLFNBQVMsRUFBRSxtQkFEbUIsQ0FFOUI7TUFDQTtNQUNBO01BQ0E7O0lBTDhCLENBVnJCO0lBaUJYLFlBQVk7TUFDVkMsT0FBTyxFQUFFLFVBREM7TUFFVjVPLFNBQVMsRUFBRTtJQUZELENBakJEO0lBcUJYLG9DQUFvQztNQUNsQzZPLE1BQU0sRUFBRTtJQUQwQjtFQXJCekIsQ0FKQTtFQTZCYnhDLFlBQVksRUFBRTtJQUNaeUMsU0FBUyxFQUFFO0VBREMsQ0E3QkQ7RUFnQ2JuQyxTQUFTLEVBQUU7SUFDVGlDLE9BQU8sRUFBRTtFQURBO0FBaENFLENBQWY7O2VBcUNlLElBQUFHLGtCQUFBLEVBQVdYLE1BQVgsRUFBbUJqTSxlQUFuQixDIn0=