botframework-webchat 4.15.3-main.20220706.75d867c → 4.15.3-main.20220728.008aa26

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 (97) hide show
  1. package/dist/webchat-es5.js +1 -1
  2. package/dist/webchat-minimal.js +1 -1
  3. package/dist/webchat.js +1 -1
  4. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/closest.d.ts +2 -0
  5. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/closest.d.ts.map +1 -0
  6. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/closest.js +25 -0
  7. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/findDOMNodeOwner.d.ts +3 -0
  8. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/findDOMNodeOwner.d.ts.map +1 -0
  9. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/findDOMNodeOwner.js +32 -0
  10. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useAdaptiveCardModEffect.d.ts +13 -0
  11. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useAdaptiveCardModEffect.d.ts.map +1 -0
  12. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useAdaptiveCardModEffect.js +132 -0
  13. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useLazyRef.d.ts +3 -0
  14. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useLazyRef.d.ts.map +1 -0
  15. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useLazyRef.js +21 -0
  16. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/usePrevious.d.ts +2 -0
  17. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/usePrevious.d.ts.map +1 -0
  18. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/usePrevious.js +18 -0
  19. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useValueRef.d.ts +3 -0
  20. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useValueRef.d.ts.map +1 -0
  21. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useValueRef.js +15 -0
  22. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionSetShouldNotBeMenuBarModEffect.d.ts +16 -0
  23. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionSetShouldNotBeMenuBarModEffect.d.ts.map +1 -0
  24. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionSetShouldNotBeMenuBarModEffect.js +45 -0
  25. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionShouldBePushButtonModEffect.d.ts +15 -0
  26. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionShouldBePushButtonModEffect.d.ts.map +1 -0
  27. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionShouldBePushButtonModEffect.js +93 -0
  28. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActiveElementModEffect.d.ts +6 -0
  29. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActiveElementModEffect.d.ts.map +1 -0
  30. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActiveElementModEffect.js +44 -0
  31. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useDisabledModEffect.d.ts +9 -0
  32. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useDisabledModEffect.d.ts.map +1 -0
  33. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useDisabledModEffect.js +50 -0
  34. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/usePersistValuesModEffect.d.ts +6 -0
  35. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/usePersistValuesModEffect.d.ts.map +1 -0
  36. package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/usePersistValuesModEffect.js +103 -0
  37. package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.d.ts.map +1 -1
  38. package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.js +97 -557
  39. package/lib/adaptiveCards/Attachment/private/renderAdaptiveCard.d.ts +15 -0
  40. package/lib/adaptiveCards/Attachment/private/renderAdaptiveCard.d.ts.map +1 -0
  41. package/lib/adaptiveCards/Attachment/private/renderAdaptiveCard.js +79 -0
  42. package/lib/adaptiveCards/DOMManipulationWithUndo/addEventListenerWithUndo.d.ts +6 -0
  43. package/lib/adaptiveCards/DOMManipulationWithUndo/addEventListenerWithUndo.d.ts.map +1 -0
  44. package/lib/adaptiveCards/DOMManipulationWithUndo/addEventListenerWithUndo.js +25 -0
  45. package/lib/adaptiveCards/DOMManipulationWithUndo/bunchUndos.d.ts +3 -0
  46. package/lib/adaptiveCards/DOMManipulationWithUndo/bunchUndos.d.ts.map +1 -0
  47. package/lib/adaptiveCards/DOMManipulationWithUndo/bunchUndos.js +23 -0
  48. package/lib/adaptiveCards/DOMManipulationWithUndo/durableAddClassWithUndo.d.ts +8 -0
  49. package/lib/adaptiveCards/DOMManipulationWithUndo/durableAddClassWithUndo.d.ts.map +1 -0
  50. package/lib/adaptiveCards/DOMManipulationWithUndo/durableAddClassWithUndo.js +38 -0
  51. package/lib/adaptiveCards/DOMManipulationWithUndo/durableDisableInputElementAccessiblyWithUndo.d.ts +22 -0
  52. package/lib/adaptiveCards/DOMManipulationWithUndo/durableDisableInputElementAccessiblyWithUndo.d.ts.map +1 -0
  53. package/lib/adaptiveCards/DOMManipulationWithUndo/durableDisableInputElementAccessiblyWithUndo.js +96 -0
  54. package/lib/adaptiveCards/DOMManipulationWithUndo/private/addClass.d.ts +5 -0
  55. package/lib/adaptiveCards/DOMManipulationWithUndo/private/addClass.d.ts.map +1 -0
  56. package/lib/adaptiveCards/DOMManipulationWithUndo/private/addClass.js +19 -0
  57. package/lib/adaptiveCards/DOMManipulationWithUndo/private/getAttributeOrFalse.d.ts +7 -0
  58. package/lib/adaptiveCards/DOMManipulationWithUndo/private/getAttributeOrFalse.d.ts.map +1 -0
  59. package/lib/adaptiveCards/DOMManipulationWithUndo/private/getAttributeOrFalse.js +16 -0
  60. package/lib/adaptiveCards/DOMManipulationWithUndo/private/noOp.d.ts +3 -0
  61. package/lib/adaptiveCards/DOMManipulationWithUndo/private/noOp.d.ts.map +1 -0
  62. package/lib/adaptiveCards/DOMManipulationWithUndo/private/noOp.js +14 -0
  63. package/lib/adaptiveCards/DOMManipulationWithUndo/private/setOrRemoveAttributeIfFalse.d.ts +9 -0
  64. package/lib/adaptiveCards/DOMManipulationWithUndo/private/setOrRemoveAttributeIfFalse.d.ts.map +1 -0
  65. package/lib/adaptiveCards/DOMManipulationWithUndo/private/setOrRemoveAttributeIfFalse.js +22 -0
  66. package/lib/adaptiveCards/DOMManipulationWithUndo/setOrRemoveAttributeIfFalseWithUndo.d.ts +12 -0
  67. package/lib/adaptiveCards/DOMManipulationWithUndo/setOrRemoveAttributeIfFalseWithUndo.d.ts.map +1 -0
  68. package/lib/adaptiveCards/DOMManipulationWithUndo/setOrRemoveAttributeIfFalseWithUndo.js +41 -0
  69. package/lib/adaptiveCards/DOMManipulationWithUndo/types/UndoFunction.d.ts +3 -0
  70. package/lib/adaptiveCards/DOMManipulationWithUndo/types/UndoFunction.d.ts.map +1 -0
  71. package/lib/adaptiveCards/DOMManipulationWithUndo/types/UndoFunction.js +2 -0
  72. package/lib/addVersion.js +1 -1
  73. package/lib/createFullStyleSet.d.ts +2 -2
  74. package/package.json +7 -7
  75. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/closest.ts +17 -0
  76. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/findDOMNodeOwner.ts +25 -0
  77. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/useAdaptiveCardModEffect.ts +93 -0
  78. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/useLazyRef.ts +15 -0
  79. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/usePrevious.ts +12 -0
  80. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/useValueRef.ts +11 -0
  81. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/useActionSetShouldNotBeMenuBarModEffect.ts +39 -0
  82. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/useActionShouldBePushButtonModEffect.ts +105 -0
  83. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/useActiveElementModEffect.ts +35 -0
  84. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/useDisabledModEffect.ts +45 -0
  85. package/src/adaptiveCards/Attachment/AdaptiveCardHacks/usePersistValuesModEffect.ts +110 -0
  86. package/src/adaptiveCards/Attachment/AdaptiveCardRenderer.tsx +83 -582
  87. package/src/adaptiveCards/Attachment/private/renderAdaptiveCard.ts +75 -0
  88. package/src/adaptiveCards/DOMManipulationWithUndo/addEventListenerWithUndo.ts +21 -0
  89. package/src/adaptiveCards/DOMManipulationWithUndo/bunchUndos.tsx +12 -0
  90. package/src/adaptiveCards/DOMManipulationWithUndo/durableAddClassWithUndo.ts +28 -0
  91. package/src/adaptiveCards/DOMManipulationWithUndo/durableDisableInputElementAccessiblyWithUndo.ts +84 -0
  92. package/src/adaptiveCards/DOMManipulationWithUndo/private/addClass.tsx +13 -0
  93. package/src/adaptiveCards/DOMManipulationWithUndo/private/getAttributeOrFalse.ts +8 -0
  94. package/src/adaptiveCards/DOMManipulationWithUndo/private/noOp.ts +5 -0
  95. package/src/adaptiveCards/DOMManipulationWithUndo/private/setOrRemoveAttributeIfFalse.ts +18 -0
  96. package/src/adaptiveCards/DOMManipulationWithUndo/setOrRemoveAttributeIfFalseWithUndo.ts +34 -0
  97. package/src/adaptiveCards/DOMManipulationWithUndo/types/UndoFunction.ts +3 -0
@@ -11,8 +11,6 @@ exports.default = void 0;
11
11
 
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
13
 
14
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
-
16
14
  var _botframeworkWebchatComponent = require("botframework-webchat-component");
17
15
 
18
16
  var _classnames = _interopRequireDefault(require("classnames"));
@@ -21,10 +19,24 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
21
19
 
22
20
  var _react = _interopRequireWildcard(require("react"));
23
21
 
22
+ var _renderAdaptiveCard = _interopRequireDefault(require("./private/renderAdaptiveCard"));
23
+
24
+ var _useActionSetShouldNotBeMenuBarModEffect = _interopRequireDefault(require("./AdaptiveCardHacks/useActionSetShouldNotBeMenuBarModEffect"));
25
+
26
+ var _useActionShouldBePushButtonModEffect = _interopRequireDefault(require("./AdaptiveCardHacks/useActionShouldBePushButtonModEffect"));
27
+
28
+ var _useActiveElementModEffect = _interopRequireDefault(require("./AdaptiveCardHacks/useActiveElementModEffect"));
29
+
24
30
  var _useAdaptiveCardsHostConfig = _interopRequireDefault(require("../hooks/useAdaptiveCardsHostConfig"));
25
31
 
26
32
  var _useAdaptiveCardsPackage = _interopRequireDefault(require("../hooks/useAdaptiveCardsPackage"));
27
33
 
34
+ var _useDisabledModEffect3 = _interopRequireDefault(require("./AdaptiveCardHacks/useDisabledModEffect"));
35
+
36
+ var _usePersistValuesModEffect = _interopRequireDefault(require("./AdaptiveCardHacks/usePersistValuesModEffect"));
37
+
38
+ var _useValueRef = _interopRequireDefault(require("./AdaptiveCardHacks/private/useValueRef"));
39
+
28
40
  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); }
29
41
 
30
42
  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; }
@@ -39,437 +51,11 @@ var useDisabled = _botframeworkWebchatComponent.hooks.useDisabled,
39
51
  useStyleSet = _botframeworkWebchatComponent.hooks.useStyleSet;
40
52
  var node_env = undefined || "production";
41
53
 
42
- function bunchUndos() {
43
- for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {
44
- fns[_key] = arguments[_key];
45
- }
46
-
47
- return function () {
48
- return fns.forEach(function (fn) {
49
- return fn === null || fn === void 0 ? void 0 : fn();
50
- });
51
- };
52
- }
53
- /**
54
- * Adds a class to the `HTMLElement`. Returns `true` if the class is added, otherwise, `undefined`.
55
- */
56
-
57
-
58
- function addClass(element, className) {
59
- var classList = element.classList;
60
-
61
- if (!classList.contains(className)) {
62
- classList.add(className);
63
- return true;
64
- }
65
- }
66
- /**
67
- * Adds a class to the `HTMLElement` and re-add on mutations.
68
- *
69
- * @returns {function} A function, when called, will restore to previous state.
70
- */
71
-
72
-
73
- function addPersistentClassWithUndo(element, className) {
74
- if (!element) {
75
- return;
76
- }
77
-
78
- if (addClass(element, className)) {
79
- // After we add the class, keep observing the element to make sure the class is not removed.
80
- var observer = new MutationObserver(function () {
81
- return addClass(element, className);
82
- });
83
- observer.observe(element, {
84
- attributes: true,
85
- attributeFilter: ['class']
86
- });
87
- return function () {
88
- var classNames = new Set(element.className.split(' '));
89
- classNames.delete(className);
90
- element.className = Array.from(classNames).join(' ');
91
- observer.disconnect();
92
- };
93
- }
94
- }
95
- /**
96
- * Returns `true`, if the object is a plain object and not a class, otherwise, `false`.
97
- */
98
-
99
-
100
- function isPlainObject(obj) {
101
- return Object.getPrototypeOf(obj) === Object.prototype;
102
- }
103
- /**
104
- * Sets an attribute.
105
- *
106
- * @returns {function} A function, when called, will restore to previous state.
107
- */
108
-
109
-
110
- function setAttributeWithUndo(element, qualifiedName, nextValue) {
111
- if (!element) {
112
- return;
113
- }
114
-
115
- var value = element.getAttribute(qualifiedName);
116
-
117
- if (value !== nextValue) {
118
- element.setAttribute(qualifiedName, nextValue);
119
- return function () {
120
- return value ? element.setAttribute(qualifiedName, value) : element.removeAttribute(qualifiedName);
121
- };
122
- }
123
- }
124
- /**
125
- * An event handler for disabling event bubbling and propagation.
126
- */
127
-
128
-
129
- var disabledHandler = function disabledHandler(event) {
130
- event.preventDefault();
131
- event.stopImmediatePropagation();
132
- event.stopPropagation();
133
- };
134
- /**
135
- * Listens to event once. Returns a function, when called, will stop listening.
136
- */
137
-
138
-
139
- function addEventListenerOnceWithUndo(element, name, handler) {
140
- if (!element) {
141
- return;
142
- }
143
- /* eslint-disable-next-line prefer-const */
144
-
145
-
146
- var detach;
147
-
148
- var detachingHandler = function detachingHandler(event) {
149
- try {
150
- handler(event);
151
- } finally {
152
- // IE11 does not support { once: true }, so we need to detach manually.
153
- detach();
154
- }
155
- };
156
-
157
- detach = function detach() {
158
- return element.removeEventListener(name, detachingHandler);
159
- };
160
-
161
- element.addEventListener(name, detachingHandler, {
162
- once: true
163
- });
164
- return detach;
165
- }
166
- /**
167
- * Listens to event. Returns a function, when called, will stop listening.
168
- */
169
-
170
-
171
- function addEventListenerWithUndo(element, name, handler) {
172
- if (!element) {
173
- return;
174
- }
175
-
176
- element.addEventListener(name, handler);
177
- return function () {
178
- return element.removeEventListener(name, handler);
179
- };
180
- }
181
- /**
182
- * Disables an element with undo function.
183
- *
184
- * @returns {function} A function, when called, will restore to previous state.
185
- */
186
-
187
-
188
- function disableElementWithUndo(element) {
189
- if (!element) {
190
- return;
191
- }
192
-
193
- var undoStack = [];
194
- var isActive = element === document.activeElement;
195
- var tag = element.nodeName.toLowerCase();
196
- /* eslint-disable-next-line default-case */
197
-
198
- switch (tag) {
199
- case 'button':
200
- case 'input':
201
- case 'select':
202
- case 'textarea':
203
- undoStack.push(setAttributeWithUndo(element, 'aria-disabled', 'true'));
204
-
205
- if (isActive) {
206
- undoStack.push(addEventListenerOnceWithUndo(element, 'blur', function () {
207
- return undoStack.push(setAttributeWithUndo(element, 'disabled', 'disabled'));
208
- }));
209
- } else {
210
- undoStack.push(setAttributeWithUndo(element, 'disabled', 'disabled'));
211
- }
212
-
213
- if (tag === 'input' || tag === 'textarea') {
214
- undoStack.push(addEventListenerWithUndo(element, 'click', disabledHandler));
215
- undoStack.push(setAttributeWithUndo(element, 'readonly', 'readonly'));
216
- } else if (tag === 'select') {
217
- undoStack.push.apply(undoStack, (0, _toConsumableArray2.default)([].map.call(element.querySelectorAll('option'), function (option) {
218
- return setAttributeWithUndo(option, 'disabled', 'disabled');
219
- })));
220
- }
221
-
222
- break;
223
- }
224
-
225
- return bunchUndos.apply(void 0, undoStack);
226
- }
227
- /**
228
- * Disables all inputtable descendants.
229
- *
230
- * @param {HTMLElement | undefined} element Container element to start looking for inputtable descendants.
231
- * @param {boolean} observeSubtree `true` to applies to all future inputtable descendants, otherwise, `false`.
232
- *
233
- * @returns {function} A function, when called, will restore to previous state.
234
- */
235
-
236
-
237
- function disableInputElementsWithUndo(element) {
238
- var observeSubtree = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
239
-
240
- if (!element) {
241
- return;
242
- }
243
-
244
- var undoStack = [].map.call(element.querySelectorAll('button, input, select, textarea'), function (element) {
245
- return disableElementWithUndo(element);
246
- });
247
- var tag = element.nodeName.toLowerCase(); // Only set tabindex="-1" on focusable element. Otherwise, we will make <div> focusable by mouse.
248
-
249
- (tag === 'a' || tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea') && undoStack.push(setAttributeWithUndo(element, 'tabindex', '-1'));
250
-
251
- if (observeSubtree) {
252
- var observer = new MutationObserver(function (mutations) {
253
- return mutations.forEach(function (_ref) {
254
- var addedNodes = _ref.addedNodes;
255
- return undoStack.push.apply(undoStack, (0, _toConsumableArray2.default)([].map.call(addedNodes, function (addedNode) {
256
- return disableInputElementsWithUndo(addedNode, false);
257
- })));
258
- });
259
- });
260
- observer.observe(element, {
261
- childList: true,
262
- subtree: true
263
- });
264
- undoStack.push(function () {
265
- return observer.disconnect();
266
- });
267
- }
268
-
269
- return bunchUndos.apply(void 0, (0, _toConsumableArray2.default)(undoStack));
270
- }
271
- /**
272
- * Gets the value of an attribute from an element.
273
- *
274
- * @returns {false | string} The value of the attribute. `false` if the attribute was not set.
275
- */
276
-
277
-
278
- function getAttribute(element, qualifiedName) {
279
- return !!element && element.hasAttribute(qualifiedName) && (element.getAttribute(qualifiedName) || '');
280
- }
281
- /**
282
- * Sets or removes an attribute from an element.
283
- *
284
- * @param {HTMLElement} element - The element to set or remove attribute from.
285
- * @param {string} qualifiedName - The name of the attribute.
286
- * @param {false | string} value - The value of the attribute. When passing `false`, remove the attribute.
287
- */
288
-
289
-
290
- function setOrRemoveAttribute(element, qualifiedName, value) {
291
- if (value === false) {
292
- element === null || element === void 0 ? void 0 : element.removeAttribute(qualifiedName);
293
- } else {
294
- element === null || element === void 0 ? void 0 : element.setAttribute(qualifiedName, value);
295
- }
296
- }
297
- /**
298
- * Sets or removes an attribute from an element with an undo function.
299
- *
300
- * @param {HTMLElement} element - The element to set or remove attribute from.
301
- * @param {string} qualifiedName - The name of the attribute.
302
- * @param {false | string} value - The value of the attribute. When passing `false`, remove the attribute.
303
- *
304
- * @returns {() => void} The undo function, when called, will undo all manipulations by restoring values recorded at the time of the function call.
305
- */
306
-
307
-
308
- function setOrRemoveAttributeWithUndo(element, qualifiedName, value) {
309
- if (!element) {
310
- return;
311
- }
312
-
313
- var prevValue = getAttribute(element, qualifiedName);
314
- setOrRemoveAttribute(element, qualifiedName, value);
315
- return function () {
316
- return setOrRemoveAttribute(element, qualifiedName, prevValue);
317
- };
318
- }
319
- /**
320
- * Finds the first ancestor that fulfill the predicate.
321
- *
322
- * @param {HTMLElement} element - The starting element. This element will not be checked against the predicate.
323
- * @param {(ancestor: HTMLElement) => boolean} predicate - The predicate to fulfill.
324
- *
325
- * @returns {HTMLElement | undefined} The first ancestor that fulfill the predicate, otherwise, `undefined`.
326
- */
327
-
328
-
329
- function findAncestor(element, predicate) {
330
- var current = element;
331
-
332
- while (current = current.parentElement) {
333
- if (predicate.call(element, current)) {
334
- return current;
335
- }
336
- }
337
- }
338
- /**
339
- * Indicates the action selected by performing a series of manipulations, with undo:
340
- *
341
- * - Accessibility: set `aria-pressed` to `true`
342
- * - Applies `styleOptions.actionPerformedClassName`
343
- *
344
- * @param {HTMLElement[]} selectedActionElements - An array of elements that are representing the action and is selected.
345
- * @param {string?} actionPerformedClassName - The name of the class to apply to all elements.
346
- *
347
- * @returns {() => void} The undo function, when called, will undo all manipulations by restoring values recorded at the time of the function call.
348
- */
349
-
350
-
351
- function indicateActionSelectionWithUndo(selectedActionElements, actionPerformedClassName) {
352
- if (!(selectedActionElements !== null && selectedActionElements !== void 0 && selectedActionElements.length)) {
353
- return;
354
- } // Verify all input elements are "ac-pushButton", could belongs to ActionSet or "card actions".
355
-
356
-
357
- if (selectedActionElements.some(function (actionElement) {
358
- return !actionElement.classList.contains('ac-pushButton');
359
- })) {
360
- console.warn('botframework-webchat: Cannot mark selected action in the card, some elements are not an "ac-pushButton".');
361
- return;
362
- } // A distinct set of action set containers which has selections, excluding containers without actions.
363
- // Multiple submission in an Adaptive Card is still a vague area and TBD.
364
- // We might want to disable the whole card, just buttons in same container, or do nothing (today).
365
-
366
-
367
- var actionSetElements = new Set();
368
- selectedActionElements.forEach(function (selectedActionElement) {
369
- var actionSetElement = findAncestor(selectedActionElement, function (ancestor) {
370
- return ancestor.getAttribute('role') === 'menubar';
371
- });
372
- actionSetElement && actionSetElements.add(actionSetElement);
373
- });
374
- var undoStack = [];
375
- actionSetElements.forEach(function (actionSetElement) {
376
- // Remove "role" from every "ac-actionSet" container.
377
- undoStack.push(setOrRemoveAttributeWithUndo(actionSetElement, 'role', false)); // Modify "role" of every actions in the container.
378
-
379
- Array.from(actionSetElement.querySelectorAll('.ac-pushButton')).forEach(function (actionElement) {
380
- if (selectedActionElements.includes(actionElement)) {
381
- // Add "aria-pressed" and set "role" attribute to "button" (which is required by "aria-pressed").
382
- undoStack.push(setOrRemoveAttributeWithUndo(actionElement, 'aria-pressed', 'true'));
383
- undoStack.push(setOrRemoveAttributeWithUndo(actionElement, 'role', 'button')); // Highlight actions by applying `styleOptions.actionPerformedClassName`.
384
-
385
- actionPerformedClassName && undoStack.push(addPersistentClassWithUndo(actionElement, actionPerformedClassName));
386
- } else {
387
- // We removed "role=menubar" from the container, we must remove "role=menuitem" from unselected actions.
388
- undoStack.push(setOrRemoveAttributeWithUndo(actionElement, 'role', false));
389
- }
390
- });
391
- });
392
- return bunchUndos.apply(void 0, undoStack);
393
- }
394
- /**
395
- * Fixes accessibility issues from Adaptive Card, with undo.
396
- *
397
- * @returns {() => void} The undo function, when called, will undo all manipulations by restoring values recorded at the time of the function call.
398
- */
399
-
400
-
401
- function fixAccessibilityIssuesWithUndo(element) {
402
- if (!element) {
403
- return;
404
- } // These hacks should be done in Adaptive Cards library instead.
405
- // Related to #3949: All action buttons inside role="menubar" should be role="menuitem".
406
-
407
-
408
- var undoStack = Array.from(element.querySelectorAll('.ac-actionSet[role="menubar"] [role="button"]')).map(function (actionButton) {
409
- return setAttributeWithUndo(actionButton, 'role', 'menuitem');
410
- });
411
- return function () {
412
- return undoStack.forEach(function (undo) {
413
- return undo === null || undo === void 0 ? void 0 : undo();
414
- });
415
- };
416
- }
417
-
418
- function getFocusableElements(element) {
419
- return [].filter.call(element.querySelectorAll(['a', 'body', 'button', 'frame', 'iframe', 'img', 'input', 'isindex', 'object', 'select', 'textarea', '[tabindex]'].join(', ')), function (element) {
420
- var tabIndex = (0, _botframeworkWebchatComponent.getTabIndex)(element);
421
- return typeof tabIndex === 'number' && tabIndex >= 0;
422
- });
423
- }
424
-
425
- function restoreActiveElementIndex(element, activeElementIndex) {
426
- var _getFocusableElements;
427
-
428
- (_getFocusableElements = getFocusableElements(element)[+activeElementIndex]) === null || _getFocusableElements === void 0 ? void 0 : _getFocusableElements.focus();
429
- }
430
-
431
- function saveActiveElementIndex(element) {
432
- return getFocusableElements(element).indexOf(document.activeElement);
433
- }
434
-
435
- function restoreInputValues(element, inputValues) {
436
- var inputs = element.querySelectorAll('input, select, textarea');
437
- [].forEach.call(inputs, function (input, index) {
438
- var value = inputValues[+index];
439
-
440
- if (typeof value !== 'undefined') {
441
- var tagName = input.tagName,
442
- type = input.type;
443
-
444
- if (tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
445
- if (typeof value === 'boolean') {
446
- input.checked = value;
447
- }
448
- } else if (typeof value === 'string') {
449
- input.value = value;
450
- }
451
- }
452
- });
453
- }
454
-
455
- function saveInputValues(element) {
456
- var inputs = element.querySelectorAll('input, select, textarea');
457
- return [].map.call(inputs, function (input) {
458
- var type = input.type;
459
-
460
- if (input.tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
461
- return input.checked;
462
- }
463
-
464
- return input.value;
465
- });
466
- }
467
-
468
- var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
469
- var actionPerformedClassName = _ref2.actionPerformedClassName,
470
- adaptiveCard = _ref2.adaptiveCard,
471
- disabledFromProps = _ref2.disabled,
472
- tapAction = _ref2.tapAction;
54
+ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref) {
55
+ var actionPerformedClassName = _ref.actionPerformedClassName,
56
+ adaptiveCard = _ref.adaptiveCard,
57
+ disabledFromProps = _ref.disabled,
58
+ tapAction = _ref.tapAction;
473
59
 
474
60
  var _useStyleSet = useStyleSet(),
475
61
  _useStyleSet2 = (0, _slicedToArray2.default)(_useStyleSet, 1),
@@ -481,11 +67,6 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
481
67
  GlobalSettings = _useAdaptiveCardsPack3.GlobalSettings,
482
68
  HostConfig = _useAdaptiveCardsPack3.HostConfig;
483
69
 
484
- var _useState = (0, _react.useState)([]),
485
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
486
- actionsPerformed = _useState2[0],
487
- setActionsPerformed = _useState2[1];
488
-
489
70
  var _useAdaptiveCardsHost = (0, _useAdaptiveCardsHostConfig.default)(),
490
71
  _useAdaptiveCardsHost2 = (0, _slicedToArray2.default)(_useAdaptiveCardsHost, 1),
491
72
  adaptiveCardsHostConfig = _useAdaptiveCardsHost2[0];
@@ -494,31 +75,20 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
494
75
  _useDisabled2 = (0, _slicedToArray2.default)(_useDisabled, 1),
495
76
  disabledFromComposer = _useDisabled2[0];
496
77
 
497
- var _useState3 = (0, _react.useState)([]),
498
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
499
- errors = _useState4[0],
500
- setErrors = _useState4[1];
501
-
502
- var _useState5 = (0, _react.useState)(0),
503
- _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
504
- lastRender = _useState6[0],
505
- setLastRender = _useState6[1];
506
-
507
- var activeElementIndexRef = (0, _react.useRef)(-1);
508
- var adaptiveCardElementRef = (0, _react.useRef)();
509
78
  var contentRef = (0, _react.useRef)();
510
- var inputValuesRef = (0, _react.useRef)([]);
511
79
  var localize = useLocalizer();
512
80
  var performCardAction = usePerformCardAction();
513
81
  var renderMarkdownAsHTML = useRenderMarkdownAsHTML();
514
82
  var scrollToEnd = useScrollToEnd();
515
- var disabled = disabledFromComposer || disabledFromProps; // TODO: [P2] #3199 We should consider using `adaptiveCard.selectAction` instead.
83
+ var disabled = disabledFromComposer || disabledFromProps;
84
+ var tapActionRef = (0, _useValueRef.default)(tapAction);
85
+ var disabledRef = (0, _useValueRef.default)(disabled); // TODO: [P2] #3199 We should consider using `adaptiveCard.selectAction` instead.
516
86
  // The null check for "tapAction" is in "handleClickAndKeyPressForTapAction".
517
87
 
518
88
  var handleClickAndKeyPress = (0, _react.useCallback)(function (event) {
519
- var _ref3 = event,
520
- key = _ref3.key,
521
- type = _ref3.type;
89
+ var _ref2 = event,
90
+ key = _ref2.key,
91
+ type = _ref2.type;
522
92
  var target = event.target; // Some items, e.g. tappable text, cannot be disabled thru DOM attributes
523
93
 
524
94
  var current = contentRef.current;
@@ -549,29 +119,25 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
549
119
  }
550
120
  }
551
121
 
552
- performCardAction(tapAction);
122
+ performCardAction(tapActionRef.current);
553
123
  scrollToEnd();
554
- }, [contentRef, performCardAction, scrollToEnd, tapAction]); // Only listen to event if it is not disabled and have "tapAction" prop.
124
+ }, [contentRef, performCardAction, scrollToEnd, tapActionRef]); // Only listen to event if it is not disabled and have "tapAction" prop.
555
125
 
556
126
  var handleClickAndKeyPressForTapAction = !disabled && tapAction ? handleClickAndKeyPress : undefined;
557
- var addActionsPerformed = (0, _react.useCallback)(function (action) {
558
- return !~actionsPerformed.indexOf(action) && setActionsPerformed([].concat((0, _toConsumableArray2.default)(actionsPerformed), [action]));
559
- }, [actionsPerformed, setActionsPerformed]);
560
127
  var handleExecuteAction = (0, _react.useCallback)(function (action) {
561
128
  // Some items, e.g. tappable image, cannot be disabled thru DOM attributes
562
- if (disabled) {
129
+ if (disabledRef.current) {
563
130
  return;
564
131
  }
565
132
 
566
- addActionsPerformed(action);
567
133
  var actionTypeName = action.getJsonTypeName();
568
134
  var image = action.iconUrl,
569
135
  title = action.title; // We cannot use "instanceof" check here, because web devs may bring their own version of Adaptive Cards package.
570
136
  // We need to check using "getJsonTypeName()" instead.
571
137
 
572
138
  if (actionTypeName === 'Action.OpenUrl') {
573
- var _ref4 = action,
574
- value = _ref4.url;
139
+ var _ref3 = action,
140
+ value = _ref3.url;
575
141
  performCardAction({
576
142
  image: image,
577
143
  title: title,
@@ -579,8 +145,8 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
579
145
  value: value
580
146
  });
581
147
  } else if (actionTypeName === 'Action.Submit') {
582
- var _ref5 = action,
583
- data = _ref5.data;
148
+ var _ref4 = action,
149
+ data = _ref4.data;
584
150
 
585
151
  if (typeof data !== 'undefined') {
586
152
  if (typeof data === 'string') {
@@ -607,100 +173,74 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
607
173
  console.error("Web Chat: received unknown action from Adaptive Cards");
608
174
  console.error(action);
609
175
  }
610
- }, [addActionsPerformed, disabled, performCardAction, scrollToEnd]);
176
+ }, [disabledRef, performCardAction, scrollToEnd]); // For accessibility issue #1340, `tabindex="0"` must not be set for the root container if it is not interactive.
177
+
178
+ var setTabIndexAtCardRoot = !!tapAction;
179
+
180
+ var _useActionShouldBePus = (0, _useActionShouldBePushButtonModEffect.default)(adaptiveCard),
181
+ _useActionShouldBePus2 = (0, _slicedToArray2.default)(_useActionShouldBePus, 2),
182
+ applyActionShouldBePushButtonMod = _useActionShouldBePus2[0],
183
+ undoActionShouldBePushButtonMod = _useActionShouldBePus2[1];
184
+
185
+ var _useActionSetShouldNo = (0, _useActionSetShouldNotBeMenuBarModEffect.default)(adaptiveCard),
186
+ _useActionSetShouldNo2 = (0, _slicedToArray2.default)(_useActionSetShouldNo, 2),
187
+ applyActionSetShouldNotBeMenuBarMod = _useActionSetShouldNo2[0],
188
+ undoActionSetShouldNotBeMenuBarMod = _useActionSetShouldNo2[1];
189
+
190
+ var _useActiveElementModE = (0, _useActiveElementModEffect.default)(adaptiveCard),
191
+ _useActiveElementModE2 = (0, _slicedToArray2.default)(_useActiveElementModE, 2),
192
+ applyActiveElementMod = _useActiveElementModE2[0],
193
+ undoActiveElementMod = _useActiveElementModE2[1];
194
+
195
+ var _useDisabledModEffect = (0, _useDisabledModEffect3.default)(adaptiveCard),
196
+ _useDisabledModEffect2 = (0, _slicedToArray2.default)(_useDisabledModEffect, 2),
197
+ applyDisabledMod = _useDisabledModEffect2[0],
198
+ undoDisabledMod = _useDisabledModEffect2[1];
199
+
200
+ var _usePersistValuesModE = (0, _usePersistValuesModEffect.default)(adaptiveCard),
201
+ _usePersistValuesModE2 = (0, _slicedToArray2.default)(_usePersistValuesModE, 2),
202
+ applyPersistValuesMod = _usePersistValuesModE2[0],
203
+ undoPersistValuesMod = _usePersistValuesModE2[1];
204
+
205
+ var _useMemo = (0, _react.useMemo)(function () {
206
+ undoActionShouldBePushButtonMod();
207
+ undoActionSetShouldNotBeMenuBarMod();
208
+ undoActiveElementMod();
209
+ undoDisabledMod();
210
+ undoPersistValuesMod();
211
+ return (0, _renderAdaptiveCard.default)(adaptiveCard, {
212
+ adaptiveCardsHostConfig: adaptiveCardsHostConfig,
213
+ adaptiveCardsPackage: {
214
+ GlobalSettings: GlobalSettings,
215
+ HostConfig: HostConfig
216
+ },
217
+ renderMarkdownAsHTML: renderMarkdownAsHTML,
218
+ setTabIndexAtCardRoot: setTabIndexAtCardRoot
219
+ });
220
+ }, [adaptiveCard, adaptiveCardsHostConfig, GlobalSettings, HostConfig, renderMarkdownAsHTML, setTabIndexAtCardRoot, undoActionShouldBePushButtonMod, undoActionSetShouldNotBeMenuBarMod, undoActiveElementMod, undoDisabledMod, undoPersistValuesMod]),
221
+ element = _useMemo.element,
222
+ errors = _useMemo.errors;
223
+
224
+ (0, _react.useMemo)(function () {
225
+ adaptiveCard.onExecuteAction = handleExecuteAction;
226
+ }, [adaptiveCard, handleExecuteAction]);
611
227
  (0, _react.useLayoutEffect)(function () {
612
228
  var current = contentRef.current;
613
-
614
- if (!current || !adaptiveCard) {
615
- activeElementIndexRef.current = -1;
616
- inputValuesRef.current = [];
617
- } // Currently, the only way to set the Markdown engine is to set it thru static member of AdaptiveCard class
618
- // TODO: [P3] Checks if we could make the "renderMarkdownAsHTML" per card
619
- // This could be limitations from Adaptive Cards package (not supported as of 1.2.5)
620
- // Because there could be timing difference between .parse and .render, we could be using wrong Markdown engine
621
- // "onProcessMarkdown" is a static function but we are trying to scope it to the current object instead.
622
- // eslint-disable-next-line dot-notation
623
-
624
-
625
- adaptiveCard.constructor['onProcessMarkdown'] = function (text, result) {
626
- if (renderMarkdownAsHTML) {
627
- result.outputHtml = renderMarkdownAsHTML(text);
628
- result.didProcess = true;
629
- }
630
- };
631
-
632
- if (adaptiveCardsHostConfig) {
633
- adaptiveCard.hostConfig = isPlainObject(adaptiveCardsHostConfig) ? new HostConfig(adaptiveCardsHostConfig) : adaptiveCardsHostConfig;
634
- } // For accessibility issue #1340, `tabindex="0"` must not be set for the root container if it is not interactive.
635
-
636
-
637
- GlobalSettings.setTabIndexAtCardRoot = !!tapAction;
638
-
639
- var _adaptiveCard$validat = adaptiveCard.validateProperties(),
640
- validationEvents = _adaptiveCard$validat.validationEvents;
641
-
642
- if (validationEvents.length) {
643
- return setErrors(validationEvents.reduce(function (items, _ref6) {
644
- var message = _ref6.message;
645
- return [].concat((0, _toConsumableArray2.default)(items), [new Error(message)]);
646
- }, []));
647
- }
648
-
649
- var element;
650
-
651
- try {
652
- element = adaptiveCard.render();
653
- } catch (error) {
654
- return setErrors([error]);
655
- }
656
-
657
- if (!element) {
658
- return setErrors([new Error('Adaptive Card rendered as empty element')]);
659
- } // Clear errors on next render
660
-
661
-
662
- setErrors([]);
663
- restoreInputValues(element, inputValuesRef.current);
664
- current.appendChild(element);
665
- adaptiveCardElementRef.current = element; // Focus can only be restored after the DOM is attached.
666
-
667
- restoreActiveElementIndex(element, activeElementIndexRef.current);
668
- setLastRender(Date.now());
229
+ current === null || current === void 0 ? void 0 : current.appendChild(element);
669
230
  return function () {
670
- activeElementIndexRef.current = saveActiveElementIndex(element);
671
- inputValuesRef.current = saveInputValues(element);
672
- current.removeChild(adaptiveCardElementRef.current);
673
- adaptiveCardElementRef.current = undefined;
231
+ current === null || current === void 0 ? void 0 : current.removeChild(element);
674
232
  };
675
- }, [adaptiveCard, adaptiveCardsHostConfig, contentRef, GlobalSettings, HostConfig, renderMarkdownAsHTML, setErrors, tapAction]);
676
- (0, _react.useEffect)(function () {
677
- // Set onExecuteAction without causing unnecessary re-render.
678
- adaptiveCard.onExecuteAction = disabled ? undefined : handleExecuteAction;
679
- }, [adaptiveCard, disabled, handleExecuteAction]);
680
- (0, _react.useEffect)(function () {
681
- return fixAccessibilityIssuesWithUndo(adaptiveCardElementRef.current);
682
- }, [adaptiveCardElementRef, lastRender]);
683
- (0, _react.useEffect)(function () {
684
- // If the Adaptive Card get re-rendered, re-disable elements as needed.
685
- if (disabled) {
686
- return disableInputElementsWithUndo(adaptiveCardElementRef.current);
687
- }
688
- }, [adaptiveCardElementRef, disabled, lastRender]);
689
- (0, _react.useEffect)(function () {
690
- // If the Adaptive Card changed, reset all actions performed.
691
- setActionsPerformed([]);
692
- }, [adaptiveCard]);
693
- (0, _react.useEffect)(function () {
694
- return indicateActionSelectionWithUndo( // Actions that do not have "renderedElement" means it is the Adaptive Card itself, such as "selectAction" (AC) or "tapAction" (rich cards).
695
- // We do not need to mark the whole card as performed.
696
- actionsPerformed.map(function (_ref7) {
697
- var renderedElement = _ref7.renderedElement;
698
- return renderedElement;
699
- }).filter(function (renderedElement) {
700
- return renderedElement;
701
- }), actionPerformedClassName);
702
- }, [actionsPerformed, actionPerformedClassName, lastRender]);
703
- return errors.length ? node_env === 'development' && /*#__PURE__*/_react.default.createElement(ErrorBox, {
233
+ }, [contentRef, element]); // Apply all mods regardless whether the element changed or not.
234
+ // This is because we have undoed mods when we call the `useXXXModEffect` hook.
235
+
236
+ (0, _react.useLayoutEffect)(function () {
237
+ applyActionShouldBePushButtonMod(element, actionPerformedClassName);
238
+ applyActionSetShouldNotBeMenuBarMod(element);
239
+ applyActiveElementMod(element);
240
+ applyDisabledMod(element, disabled);
241
+ applyPersistValuesMod(element);
242
+ }, [actionPerformedClassName, applyActionShouldBePushButtonMod, applyActionSetShouldNotBeMenuBarMod, applyActiveElementMod, applyDisabledMod, applyPersistValuesMod, disabled, element]);
243
+ return errors !== null && errors !== void 0 && errors.length ? node_env === 'development' && /*#__PURE__*/_react.default.createElement(ErrorBox, {
704
244
  error: errors[0],
705
245
  type: localize('ADAPTIVE_CARD_ERROR_BOX_TITLE_RENDER')
706
246
  }) : /*#__PURE__*/_react.default.createElement("div", {
@@ -731,4 +271,4 @@ AdaptiveCardRenderer.propTypes = {
731
271
  };
732
272
  var _default = AdaptiveCardRenderer;
733
273
  exports.default = _default;
734
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIudHN4Il0sIm5hbWVzIjpbIkVycm9yQm94IiwiQ29tcG9uZW50cyIsInVzZURpc2FibGVkIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VQZXJmb3JtQ2FyZEFjdGlvbiIsInVzZVJlbmRlck1hcmtkb3duQXNIVE1MIiwidXNlU2Nyb2xsVG9FbmQiLCJ1c2VTdHlsZVNldCIsIm5vZGVfZW52IiwiYnVuY2hVbmRvcyIsImZucyIsImZvckVhY2giLCJmbiIsImFkZENsYXNzIiwiZWxlbWVudCIsImNsYXNzTmFtZSIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiYWRkIiwiYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8iLCJvYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJvYnNlcnZlIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUZpbHRlciIsImNsYXNzTmFtZXMiLCJTZXQiLCJzcGxpdCIsImRlbGV0ZSIsIkFycmF5IiwiZnJvbSIsImpvaW4iLCJkaXNjb25uZWN0IiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwic2V0QXR0cmlidXRlV2l0aFVuZG8iLCJxdWFsaWZpZWROYW1lIiwibmV4dFZhbHVlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJkaXNhYmxlZEhhbmRsZXIiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyIsIm5hbWUiLCJoYW5kbGVyIiwiZGV0YWNoIiwiZGV0YWNoaW5nSGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyIsImRpc2FibGVFbGVtZW50V2l0aFVuZG8iLCJ1bmRvU3RhY2siLCJpc0FjdGl2ZSIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsInRhZyIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwibWFwIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvcHRpb24iLCJkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvIiwib2JzZXJ2ZVN1YnRyZWUiLCJtdXRhdGlvbnMiLCJhZGRlZE5vZGVzIiwiYWRkZWROb2RlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsImhhc0F0dHJpYnV0ZSIsInNldE9yUmVtb3ZlQXR0cmlidXRlIiwic2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyIsInByZXZWYWx1ZSIsImZpbmRBbmNlc3RvciIsInByZWRpY2F0ZSIsImN1cnJlbnQiLCJwYXJlbnRFbGVtZW50IiwiaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyIsInNlbGVjdGVkQWN0aW9uRWxlbWVudHMiLCJhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUiLCJsZW5ndGgiLCJzb21lIiwiYWN0aW9uRWxlbWVudCIsImNvbnNvbGUiLCJ3YXJuIiwiYWN0aW9uU2V0RWxlbWVudHMiLCJzZWxlY3RlZEFjdGlvbkVsZW1lbnQiLCJhY3Rpb25TZXRFbGVtZW50IiwiYW5jZXN0b3IiLCJpbmNsdWRlcyIsImZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyIsImFjdGlvbkJ1dHRvbiIsInVuZG8iLCJnZXRGb2N1c2FibGVFbGVtZW50cyIsImZpbHRlciIsInRhYkluZGV4IiwicmVzdG9yZUFjdGl2ZUVsZW1lbnRJbmRleCIsImFjdGl2ZUVsZW1lbnRJbmRleCIsImZvY3VzIiwic2F2ZUFjdGl2ZUVsZW1lbnRJbmRleCIsImluZGV4T2YiLCJyZXN0b3JlSW5wdXRWYWx1ZXMiLCJpbnB1dFZhbHVlcyIsImlucHV0cyIsImlucHV0IiwiaW5kZXgiLCJ0YWdOYW1lIiwidHlwZSIsImNoZWNrZWQiLCJzYXZlSW5wdXRWYWx1ZXMiLCJBZGFwdGl2ZUNhcmRSZW5kZXJlciIsImFkYXB0aXZlQ2FyZCIsImRpc2FibGVkRnJvbVByb3BzIiwiZGlzYWJsZWQiLCJ0YXBBY3Rpb24iLCJhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IiwiYWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJHbG9iYWxTZXR0aW5ncyIsIkhvc3RDb25maWciLCJhY3Rpb25zUGVyZm9ybWVkIiwic2V0QWN0aW9uc1BlcmZvcm1lZCIsImFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIiwiZGlzYWJsZWRGcm9tQ29tcG9zZXIiLCJlcnJvcnMiLCJzZXRFcnJvcnMiLCJsYXN0UmVuZGVyIiwic2V0TGFzdFJlbmRlciIsImFjdGl2ZUVsZW1lbnRJbmRleFJlZiIsImFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYiLCJjb250ZW50UmVmIiwiaW5wdXRWYWx1ZXNSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3MiLCJrZXkiLCJ0YXJnZXQiLCJhZGFwdGl2ZUNhcmRSb290IiwicXVlcnlTZWxlY3RvciIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJhZGRBY3Rpb25zUGVyZm9ybWVkIiwiYWN0aW9uIiwiaGFuZGxlRXhlY3V0ZUFjdGlvbiIsImFjdGlvblR5cGVOYW1lIiwiZ2V0SnNvblR5cGVOYW1lIiwiaW1hZ2UiLCJpY29uVXJsIiwidGl0bGUiLCJ1cmwiLCJkYXRhIiwiX19pc0JvdEZyYW1ld29ya0NhcmRBY3Rpb24iLCJjYXJkQWN0aW9uIiwiZXJyb3IiLCJjb25zdHJ1Y3RvciIsInRleHQiLCJyZXN1bHQiLCJvdXRwdXRIdG1sIiwiZGlkUHJvY2VzcyIsImhvc3RDb25maWciLCJzZXRUYWJJbmRleEF0Q2FyZFJvb3QiLCJ2YWxpZGF0ZVByb3BlcnRpZXMiLCJ2YWxpZGF0aW9uRXZlbnRzIiwicmVkdWNlIiwiaXRlbXMiLCJtZXNzYWdlIiwiRXJyb3IiLCJyZW5kZXIiLCJhcHBlbmRDaGlsZCIsIkRhdGUiLCJub3ciLCJyZW1vdmVDaGlsZCIsIm9uRXhlY3V0ZUFjdGlvbiIsInJlbmRlcmVkRWxlbWVudCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImFueSIsImlzUmVxdWlyZWQiLCJib29sIiwic2hhcGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVNBOztBQUNBOztBQUNBOztBQUNBOztBQWFBOztBQUNBOzs7Ozs7QUExQkE7QUE0QkEsSUFBUUEsUUFBUixHQUFxQkMsd0NBQXJCLENBQVFELFFBQVI7QUFDQSxJQUFRRSxXQUFSLEdBQWtIQyxtQ0FBbEgsQ0FBUUQsV0FBUjtBQUFBLElBQXFCRSxZQUFyQixHQUFrSEQsbUNBQWxILENBQXFCQyxZQUFyQjtBQUFBLElBQW1DQyxvQkFBbkMsR0FBa0hGLG1DQUFsSCxDQUFtQ0Usb0JBQW5DO0FBQUEsSUFBeURDLHVCQUF6RCxHQUFrSEgsbUNBQWxILENBQXlERyx1QkFBekQ7QUFBQSxJQUFrRkMsY0FBbEYsR0FBa0hKLG1DQUFsSCxDQUFrRkksY0FBbEY7QUFBQSxJQUFrR0MsV0FBbEcsR0FBa0hMLG1DQUFsSCxDQUFrR0ssV0FBbEc7QUFFQSxJQUFNQyxRQUFRLEdBQUcseUJBQWpCOztBQUlBLFNBQVNDLFVBQVQsR0FBMEQ7QUFBQSxvQ0FBbkNDLEdBQW1DO0FBQW5DQSxJQUFBQSxHQUFtQztBQUFBOztBQUN4RCxTQUFPO0FBQUEsV0FBTUEsR0FBRyxDQUFDQyxPQUFKLENBQVksVUFBQUMsRUFBRTtBQUFBLGFBQUlBLEVBQUosYUFBSUEsRUFBSix1QkFBSUEsRUFBRSxFQUFOO0FBQUEsS0FBZCxDQUFOO0FBQUEsR0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQSxTQUFTQyxRQUFULENBQWtCQyxPQUFsQixFQUF3Q0MsU0FBeEMsRUFBNkU7QUFD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WUFBWSxFQUFFa0UsbUJBQVVFLEdBQVYsQ0FBY0MsVUFGRztBQUcvQm5FLEVBQUFBLFFBQVEsRUFBRWdFLG1CQUFVSSxJQUhXO0FBSy9CO0FBQ0E7QUFDQW5FLEVBQUFBLFNBQVMsRUFBRStELG1CQUFVSyxLQUFWLENBQWdCO0FBQ3pCbkMsSUFBQUEsS0FBSyxFQUFFOEIsbUJBQVVDLE1BRFE7QUFFekI3QixJQUFBQSxLQUFLLEVBQUU0QixtQkFBVUMsTUFGUTtBQUd6QnZFLElBQUFBLElBQUksRUFBRXNFLG1CQUFVQyxNQUFWLENBQWlCRSxVQUhFO0FBSXpCckosSUFBQUEsS0FBSyxFQUFFa0osbUJBQVVDO0FBSlEsR0FBaEI7QUFQb0IsQ0FBakM7ZUFlZXBFLG9CIiwic291cmNlUm9vdCI6ImJ1bmRsZTovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTEsIDAsIDJdIH1dICovXG5cbmltcG9ydCB7XG4gIEFjdGlvbiBhcyBBZGFwdGl2ZUNhcmRBY3Rpb24sXG4gIEFkYXB0aXZlQ2FyZCxcbiAgSU1hcmtkb3duUHJvY2Vzc2luZ1Jlc3VsdCxcbiAgT3BlblVybEFjdGlvbixcbiAgU3VibWl0QWN0aW9uXG59IGZyb20gJ2FkYXB0aXZlY2FyZHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50cywgZ2V0VGFiSW5kZXgsIGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29tcG9uZW50JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwge1xuICBLZXlib2FyZEV2ZW50SGFuZGxlcixcbiAgTW91c2VFdmVudEhhbmRsZXIsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbiAgVkZDXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRGlyZWN0TGluZUNhcmRBY3Rpb24gfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb3JlJztcblxuaW1wb3J0IHsgQm90RnJhbWV3b3JrQ2FyZEFjdGlvbiB9IGZyb20gJy4vQWRhcHRpdmVDYXJkQnVpbGRlcic7XG5pbXBvcnQgdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcgZnJvbSAnLi4vaG9va3MvdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcnO1xuaW1wb3J0IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlIGZyb20gJy4uL2hvb2tzL3VzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlJztcblxuY29uc3QgeyBFcnJvckJveCB9ID0gQ29tcG9uZW50cztcbmNvbnN0IHsgdXNlRGlzYWJsZWQsIHVzZUxvY2FsaXplciwgdXNlUGVyZm9ybUNhcmRBY3Rpb24sIHVzZVJlbmRlck1hcmtkb3duQXNIVE1MLCB1c2VTY3JvbGxUb0VuZCwgdXNlU3R5bGVTZXQgfSA9IGhvb2tzO1xuXG5jb25zdCBub2RlX2VudiA9IHByb2Nlc3MuZW52Lm5vZGVfZW52IHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WO1xuXG50eXBlIFVuZG9GdW5jdGlvbiA9ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gYnVuY2hVbmRvcyguLi5mbnM6IFVuZG9GdW5jdGlvbltdKTogVW5kb0Z1bmN0aW9uIHtcbiAgcmV0dXJuICgpID0+IGZucy5mb3JFYWNoKGZuID0+IGZuPy4oKSk7XG59XG5cbi8qKlxuICogQWRkcyBhIGNsYXNzIHRvIHRoZSBgSFRNTEVsZW1lbnRgLiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY2xhc3MgaXMgYWRkZWQsIG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IHRydWUgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGNsYXNzTGlzdCB9ID0gZWxlbWVudDtcblxuICBpZiAoIWNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIGEgY2xhc3MgdG8gdGhlIGBIVE1MRWxlbWVudGAgYW5kIHJlLWFkZCBvbiBtdXRhdGlvbnMuXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBhZGRQZXJzaXN0ZW50Q2xhc3NXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBVbmRvRnVuY3Rpb24ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSkge1xuICAgIC8vIEFmdGVyIHdlIGFkZCB0aGUgY2xhc3MsIGtlZXAgb2JzZXJ2aW5nIHRoZSBlbGVtZW50IHRvIG1ha2Ugc3VyZSB0aGUgY2xhc3MgaXMgbm90IHJlbW92ZWQuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnY2xhc3MnXSB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzID0gbmV3IFNldChlbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpKTtcblxuICAgICAgY2xhc3NOYW1lcy5kZWxldGUoY2xhc3NOYW1lKTtcblxuICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBBcnJheS5mcm9tKGNsYXNzTmFtZXMpLmpvaW4oJyAnKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBvYmplY3QgaXMgYSBwbGFpbiBvYmplY3QgYW5kIG5vdCBhIGNsYXNzLCBvdGhlcndpc2UsIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cblxuLyoqXG4gKiBTZXRzIGFuIGF0dHJpYnV0ZS5cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHJlc3RvcmUgdG8gcHJldmlvdXMgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZVdpdGhVbmRvKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcbiAgcXVhbGlmaWVkTmFtZTogc3RyaW5nLFxuICBuZXh0VmFsdWU6IHN0cmluZ1xuKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcblxuICBpZiAodmFsdWUgIT09IG5leHRWYWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIG5leHRWYWx1ZSk7XG5cbiAgICByZXR1cm4gKCkgPT4gKHZhbHVlID8gZWxlbWVudC5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpIDogZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkpO1xuICB9XG59XG5cbi8qKlxuICogQW4gZXZlbnQgaGFuZGxlciBmb3IgZGlzYWJsaW5nIGV2ZW50IGJ1YmJsaW5nIGFuZCBwcm9wYWdhdGlvbi5cbiAqL1xuY29uc3QgZGlzYWJsZWRIYW5kbGVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59O1xuXG4vKipcbiAqIExpc3RlbnMgdG8gZXZlbnQgb25jZS4gUmV0dXJucyBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCBzdG9wIGxpc3RlbmluZy5cbiAqL1xuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gIG5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogRXZlbnRMaXN0ZW5lclxuKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCAqL1xuICBsZXQgZGV0YWNoOiAoKSA9PiB2b2lkO1xuICBjb25zdCBkZXRhY2hpbmdIYW5kbGVyID0gZXZlbnQgPT4ge1xuICAgIHRyeSB7XG4gICAgICBoYW5kbGVyKGV2ZW50KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHsgb25jZTogdHJ1ZSB9LCBzbyB3ZSBuZWVkIHRvIGRldGFjaCBtYW51YWxseS5cbiAgICAgIGRldGFjaCgpO1xuICAgIH1cbiAgfTtcblxuICBkZXRhY2ggPSAoKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgZGV0YWNoaW5nSGFuZGxlcik7XG5cbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGRldGFjaGluZ0hhbmRsZXIsIHsgb25jZTogdHJ1ZSB9KTtcblxuICByZXR1cm4gZGV0YWNoO1xufVxuXG4vKipcbiAqIExpc3RlbnMgdG8gZXZlbnQuIFJldHVybnMgYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgc3RvcCBsaXN0ZW5pbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gIG5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogRXZlbnRMaXN0ZW5lclxuKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIpO1xuXG4gIHJldHVybiAoKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcik7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgYW4gZWxlbWVudCB3aXRoIHVuZG8gZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBkaXNhYmxlRWxlbWVudFdpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdW5kb1N0YWNrOiBVbmRvRnVuY3Rpb25bXSA9IFtdO1xuICBjb25zdCBpc0FjdGl2ZSA9IGVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGNvbnN0IHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlICovXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAnYXJpYS1kaXNhYmxlZCcsICd0cnVlJykpO1xuXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goXG4gICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyhlbGVtZW50LCAnYmx1cicsICgpID0+XG4gICAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKGFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyhlbGVtZW50LCAnY2xpY2snLCBkaXNhYmxlZEhhbmRsZXIpKTtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ3JlYWRvbmx5JywgJ3JlYWRvbmx5JykpO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKFxuICAgICAgICAgIC4uLltdLm1hcC5jYWxsKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJyksIG9wdGlvbiA9PlxuICAgICAgICAgICAgc2V0QXR0cmlidXRlV2l0aFVuZG8ob3B0aW9uLCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gYnVuY2hVbmRvcyguLi51bmRvU3RhY2spO1xufVxuXG4vKipcbiAqIERpc2FibGVzIGFsbCBpbnB1dHRhYmxlIGRlc2NlbmRhbnRzLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnQgfCB1bmRlZmluZWR9IGVsZW1lbnQgQ29udGFpbmVyIGVsZW1lbnQgdG8gc3RhcnQgbG9va2luZyBmb3IgaW5wdXR0YWJsZSBkZXNjZW5kYW50cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb2JzZXJ2ZVN1YnRyZWUgYHRydWVgIHRvIGFwcGxpZXMgdG8gYWxsIGZ1dHVyZSBpbnB1dHRhYmxlIGRlc2NlbmRhbnRzLCBvdGhlcndpc2UsIGBmYWxzZWAuXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLCBvYnNlcnZlU3VidHJlZSA9IHRydWUpOiBVbmRvRnVuY3Rpb24ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB1bmRvU3RhY2s6ICgoKSA9PiB2b2lkKVtdID0gW10ubWFwLmNhbGwoZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhJyksIGVsZW1lbnQgPT5cbiAgICBkaXNhYmxlRWxlbWVudFdpdGhVbmRvKGVsZW1lbnQpXG4gICk7XG5cbiAgY29uc3QgdGFnID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIE9ubHkgc2V0IHRhYmluZGV4PVwiLTFcIiBvbiBmb2N1c2FibGUgZWxlbWVudC4gT3RoZXJ3aXNlLCB3ZSB3aWxsIG1ha2UgPGRpdj4gZm9jdXNhYmxlIGJ5IG1vdXNlLlxuICAodGFnID09PSAnYScgfHwgdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYScpICYmXG4gICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ3RhYmluZGV4JywgJy0xJykpO1xuXG4gIGlmIChvYnNlcnZlU3VidHJlZSkge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+XG4gICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBhZGRlZE5vZGVzIH0pID0+XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKC4uLltdLm1hcC5jYWxsKGFkZGVkTm9kZXMsIGFkZGVkTm9kZSA9PiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGFkZGVkTm9kZSwgZmFsc2UpKSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgIHVuZG9TdGFjay5wdXNoKCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gIH1cblxuICByZXR1cm4gYnVuY2hVbmRvcyguLi51bmRvU3RhY2spO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQuXG4gKlxuICogQHJldHVybnMge2ZhbHNlIHwgc3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gYGZhbHNlYCBpZiB0aGUgYXR0cmlidXRlIHdhcyBub3Qgc2V0LlxuICovXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHF1YWxpZmllZE5hbWU6IHN0cmluZyk6IGZhbHNlIHwgc3RyaW5nIHtcbiAgcmV0dXJuICEhZWxlbWVudCAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSAmJiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHwgJycpO1xufVxuXG4vKipcbiAqIFNldHMgb3IgcmVtb3ZlcyBhbiBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzZXQgb3IgcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICogQHBhcmFtIHtmYWxzZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gV2hlbiBwYXNzaW5nIGBmYWxzZWAsIHJlbW92ZSB0aGUgYXR0cmlidXRlLlxuICovXG5mdW5jdGlvbiBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCwgcXVhbGlmaWVkTmFtZTogc3RyaW5nLCB2YWx1ZTogZmFsc2UgfCBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIGVsZW1lbnQ/LnJlbW92ZUF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBlbGVtZW50Py5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogU2V0cyBvciByZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQgd2l0aCBhbiB1bmRvIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzZXQgb3IgcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICogQHBhcmFtIHtmYWxzZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gV2hlbiBwYXNzaW5nIGBmYWxzZWAsIHJlbW92ZSB0aGUgYXR0cmlidXRlLlxuICpcbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBUaGUgdW5kbyBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgdW5kbyBhbGwgbWFuaXB1bGF0aW9ucyBieSByZXN0b3JpbmcgdmFsdWVzIHJlY29yZGVkIGF0IHRoZSB0aW1lIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxuICovXG5mdW5jdGlvbiBzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcbiAgcXVhbGlmaWVkTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogZmFsc2UgfCBzdHJpbmdcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHByZXZWYWx1ZSA9IGdldEF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lKTtcblxuICBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lLCB2YWx1ZSk7XG5cbiAgcmV0dXJuICgpID0+IHNldE9yUmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIHF1YWxpZmllZE5hbWUsIHByZXZWYWx1ZSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGZpcnN0IGFuY2VzdG9yIHRoYXQgZnVsZmlsbCB0aGUgcHJlZGljYXRlLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgc3RhcnRpbmcgZWxlbWVudC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgcHJlZGljYXRlLlxuICogQHBhcmFtIHsoYW5jZXN0b3I6IEhUTUxFbGVtZW50KSA9PiBib29sZWFufSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIHRvIGZ1bGZpbGwuXG4gKlxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgdW5kZWZpbmVkfSBUaGUgZmlyc3QgYW5jZXN0b3IgdGhhdCBmdWxmaWxsIHRoZSBwcmVkaWNhdGUsIG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRBbmNlc3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJlZGljYXRlOiAoYW5jZXN0b3I6IEhUTUxFbGVtZW50KSA9PiBib29sZWFuKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudCA9IGVsZW1lbnQ7XG5cbiAgd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50KSkge1xuICAgIGlmIChwcmVkaWNhdGUuY2FsbChlbGVtZW50LCBjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBhY3Rpb24gc2VsZWN0ZWQgYnkgcGVyZm9ybWluZyBhIHNlcmllcyBvZiBtYW5pcHVsYXRpb25zLCB3aXRoIHVuZG86XG4gKlxuICogLSBBY2Nlc3NpYmlsaXR5OiBzZXQgYGFyaWEtcHJlc3NlZGAgdG8gYHRydWVgXG4gKiAtIEFwcGxpZXMgYHN0eWxlT3B0aW9ucy5hY3Rpb25QZXJmb3JtZWRDbGFzc05hbWVgXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudFtdfSBzZWxlY3RlZEFjdGlvbkVsZW1lbnRzIC0gQW4gYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgcmVwcmVzZW50aW5nIHRoZSBhY3Rpb24gYW5kIGlzIHNlbGVjdGVkLlxuICogQHBhcmFtIHtzdHJpbmc/fSBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYXBwbHkgdG8gYWxsIGVsZW1lbnRzLlxuICpcbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBUaGUgdW5kbyBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgdW5kbyBhbGwgbWFuaXB1bGF0aW9ucyBieSByZXN0b3JpbmcgdmFsdWVzIHJlY29yZGVkIGF0IHRoZSB0aW1lIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxuICovXG5mdW5jdGlvbiBpbmRpY2F0ZUFjdGlvblNlbGVjdGlvbldpdGhVbmRvKFxuICBzZWxlY3RlZEFjdGlvbkVsZW1lbnRzOiBIVE1MRWxlbWVudFtdIHwgdW5kZWZpbmVkLFxuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWU/OiBzdHJpbmdcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghc2VsZWN0ZWRBY3Rpb25FbGVtZW50cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVmVyaWZ5IGFsbCBpbnB1dCBlbGVtZW50cyBhcmUgXCJhYy1wdXNoQnV0dG9uXCIsIGNvdWxkIGJlbG9uZ3MgdG8gQWN0aW9uU2V0IG9yIFwiY2FyZCBhY3Rpb25zXCIuXG4gIGlmIChzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLnNvbWUoYWN0aW9uRWxlbWVudCA9PiAhYWN0aW9uRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjLXB1c2hCdXR0b24nKSkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnYm90ZnJhbWV3b3JrLXdlYmNoYXQ6IENhbm5vdCBtYXJrIHNlbGVjdGVkIGFjdGlvbiBpbiB0aGUgY2FyZCwgc29tZSBlbGVtZW50cyBhcmUgbm90IGFuIFwiYWMtcHVzaEJ1dHRvblwiLidcbiAgICApO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQSBkaXN0aW5jdCBzZXQgb2YgYWN0aW9uIHNldCBjb250YWluZXJzIHdoaWNoIGhhcyBzZWxlY3Rpb25zLCBleGNsdWRpbmcgY29udGFpbmVycyB3aXRob3V0IGFjdGlvbnMuXG4gIC8vIE11bHRpcGxlIHN1Ym1pc3Npb24gaW4gYW4gQWRhcHRpdmUgQ2FyZCBpcyBzdGlsbCBhIHZhZ3VlIGFyZWEgYW5kIFRCRC5cbiAgLy8gV2UgbWlnaHQgd2FudCB0byBkaXNhYmxlIHRoZSB3aG9sZSBjYXJkLCBqdXN0IGJ1dHRvbnMgaW4gc2FtZSBjb250YWluZXIsIG9yIGRvIG5vdGhpbmcgKHRvZGF5KS5cbiAgY29uc3QgYWN0aW9uU2V0RWxlbWVudHMgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuXG4gIHNlbGVjdGVkQWN0aW9uRWxlbWVudHMuZm9yRWFjaChzZWxlY3RlZEFjdGlvbkVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGFjdGlvblNldEVsZW1lbnQgPSBmaW5kQW5jZXN0b3IoXG4gICAgICBzZWxlY3RlZEFjdGlvbkVsZW1lbnQsXG4gICAgICBhbmNlc3RvciA9PiBhbmNlc3Rvci5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ21lbnViYXInXG4gICAgKTtcblxuICAgIGFjdGlvblNldEVsZW1lbnQgJiYgYWN0aW9uU2V0RWxlbWVudHMuYWRkKGFjdGlvblNldEVsZW1lbnQpO1xuICB9KTtcblxuICBjb25zdCB1bmRvU3RhY2s6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgYWN0aW9uU2V0RWxlbWVudHMuZm9yRWFjaChhY3Rpb25TZXRFbGVtZW50ID0+IHtcbiAgICAvLyBSZW1vdmUgXCJyb2xlXCIgZnJvbSBldmVyeSBcImFjLWFjdGlvblNldFwiIGNvbnRhaW5lci5cbiAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvblNldEVsZW1lbnQsICdyb2xlJywgZmFsc2UpKTtcblxuICAgIC8vIE1vZGlmeSBcInJvbGVcIiBvZiBldmVyeSBhY3Rpb25zIGluIHRoZSBjb250YWluZXIuXG4gICAgQXJyYXkuZnJvbShhY3Rpb25TZXRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hYy1wdXNoQnV0dG9uJykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4pLmZvckVhY2goXG4gICAgICBhY3Rpb25FbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkQWN0aW9uRWxlbWVudHMuaW5jbHVkZXMoYWN0aW9uRWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBBZGQgXCJhcmlhLXByZXNzZWRcIiBhbmQgc2V0IFwicm9sZVwiIGF0dHJpYnV0ZSB0byBcImJ1dHRvblwiICh3aGljaCBpcyByZXF1aXJlZCBieSBcImFyaWEtcHJlc3NlZFwiKS5cbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdhcmlhLXByZXNzZWQnLCAndHJ1ZScpKTtcbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdyb2xlJywgJ2J1dHRvbicpKTtcblxuICAgICAgICAgIC8vIEhpZ2hsaWdodCBhY3Rpb25zIGJ5IGFwcGx5aW5nIGBzdHlsZU9wdGlvbnMuYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lYC5cbiAgICAgICAgICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUgJiZcbiAgICAgICAgICAgIHVuZG9TdGFjay5wdXNoKGFkZFBlcnNpc3RlbnRDbGFzc1dpdGhVbmRvKGFjdGlvbkVsZW1lbnQsIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlIHJlbW92ZWQgXCJyb2xlPW1lbnViYXJcIiBmcm9tIHRoZSBjb250YWluZXIsIHdlIG11c3QgcmVtb3ZlIFwicm9sZT1tZW51aXRlbVwiIGZyb20gdW5zZWxlY3RlZCBhY3Rpb25zLlxuICAgICAgICAgIHVuZG9TdGFjay5wdXNoKHNldE9yUmVtb3ZlQXR0cmlidXRlV2l0aFVuZG8oYWN0aW9uRWxlbWVudCwgJ3JvbGUnLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJ1bmNoVW5kb3MoLi4udW5kb1N0YWNrKTtcbn1cblxuLyoqXG4gKiBGaXhlcyBhY2Nlc3NpYmlsaXR5IGlzc3VlcyBmcm9tIEFkYXB0aXZlIENhcmQsIHdpdGggdW5kby5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZml4QWNjZXNzaWJpbGl0eUlzc3Vlc1dpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVGhlc2UgaGFja3Mgc2hvdWxkIGJlIGRvbmUgaW4gQWRhcHRpdmUgQ2FyZHMgbGlicmFyeSBpbnN0ZWFkLlxuICAvLyBSZWxhdGVkIHRvICMzOTQ5OiBBbGwgYWN0aW9uIGJ1dHRvbnMgaW5zaWRlIHJvbGU9XCJtZW51YmFyXCIgc2hvdWxkIGJlIHJvbGU9XCJtZW51aXRlbVwiLlxuICBjb25zdCB1bmRvU3RhY2s6IFVuZG9GdW5jdGlvbltdID0gQXJyYXkuZnJvbShcbiAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hYy1hY3Rpb25TZXRbcm9sZT1cIm1lbnViYXJcIl0gW3JvbGU9XCJidXR0b25cIl0nKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PlxuICApLm1hcChhY3Rpb25CdXR0b24gPT4gc2V0QXR0cmlidXRlV2l0aFVuZG8oYWN0aW9uQnV0dG9uLCAncm9sZScsICdtZW51aXRlbScpKTtcblxuICByZXR1cm4gKCkgPT4gdW5kb1N0YWNrLmZvckVhY2godW5kbyA9PiB1bmRvPy4oKSk7XG59XG5cbmZ1bmN0aW9uIGdldEZvY3VzYWJsZUVsZW1lbnRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIHJldHVybiBbXS5maWx0ZXIuY2FsbChcbiAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBbXG4gICAgICAgICdhJyxcbiAgICAgICAgJ2JvZHknLFxuICAgICAgICAnYnV0dG9uJyxcbiAgICAgICAgJ2ZyYW1lJyxcbiAgICAgICAgJ2lmcmFtZScsXG4gICAgICAgICdpbWcnLFxuICAgICAgICAnaW5wdXQnLFxuICAgICAgICAnaXNpbmRleCcsXG4gICAgICAgICdvYmplY3QnLFxuICAgICAgICAnc2VsZWN0JyxcbiAgICAgICAgJ3RleHRhcmVhJyxcbiAgICAgICAgJ1t0YWJpbmRleF0nXG4gICAgICBdLmpvaW4oJywgJylcbiAgICApIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+LFxuICAgIGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleChlbGVtZW50KTtcblxuICAgICAgcmV0dXJuIHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMDtcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudDogSFRNTEVsZW1lbnQsIGFjdGl2ZUVsZW1lbnRJbmRleDogbnVtYmVyKSB7XG4gIGdldEZvY3VzYWJsZUVsZW1lbnRzKGVsZW1lbnQpWythY3RpdmVFbGVtZW50SW5kZXhdPy5mb2N1cygpO1xufVxuXG5mdW5jdGlvbiBzYXZlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIHJldHVybiBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KS5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlSW5wdXRWYWx1ZXMoZWxlbWVudDogSFRNTEVsZW1lbnQsIGlucHV0VmFsdWVzOiAoYm9vbGVhbiB8IHN0cmluZylbXSkge1xuICBjb25zdCBpbnB1dHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykgYXMgTm9kZUxpc3RPZjxcbiAgICBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gID47XG5cbiAgW10uZm9yRWFjaC5jYWxsKGlucHV0cywgKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFZhbHVlc1sraW5kZXhdO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IHsgdGFnTmFtZSwgdHlwZSB9ID0gaW5wdXQ7XG5cbiAgICAgIGlmICh0YWdOYW1lID09PSAnSU5QVVQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIChpbnB1dCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNhdmVJbnB1dFZhbHVlcyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IChib29sZWFuIHwgc3RyaW5nKVtdIHtcbiAgY29uc3QgaW5wdXRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpIGFzIE5vZGVMaXN0T2Y8XG4gICAgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICA+O1xuXG4gIHJldHVybiBbXS5tYXAuY2FsbChpbnB1dHMsIChpbnB1dDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gaW5wdXQ7XG5cbiAgICBpZiAoaW5wdXQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKSkge1xuICAgICAgcmV0dXJuIChpbnB1dCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICAgIH1cblxuICAgIHJldHVybiBpbnB1dC52YWx1ZTtcbiAgfSk7XG59XG5cbnR5cGUgQWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lPzogc3RyaW5nO1xuICBhZGFwdGl2ZUNhcmQ6IEFkYXB0aXZlQ2FyZDtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0YXBBY3Rpb24/OiBEaXJlY3RMaW5lQ2FyZEFjdGlvbjtcbn07XG5cbmNvbnN0IEFkYXB0aXZlQ2FyZFJlbmRlcmVyOiBWRkM8QWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcz4gPSAoe1xuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsXG4gIGFkYXB0aXZlQ2FyZCxcbiAgZGlzYWJsZWQ6IGRpc2FibGVkRnJvbVByb3BzLFxuICB0YXBBY3Rpb25cbn0pID0+IHtcbiAgY29uc3QgW3sgYWRhcHRpdmVDYXJkUmVuZGVyZXI6IGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBHbG9iYWxTZXR0aW5ncywgSG9zdENvbmZpZyB9XSA9IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlKCk7XG4gIGNvbnN0IFthY3Rpb25zUGVyZm9ybWVkLCBzZXRBY3Rpb25zUGVyZm9ybWVkXSA9IHVzZVN0YXRlPEFkYXB0aXZlQ2FyZEFjdGlvbltdPihbXSk7XG4gIGNvbnN0IFthZGFwdGl2ZUNhcmRzSG9zdENvbmZpZ10gPSB1c2VBZGFwdGl2ZUNhcmRzSG9zdENvbmZpZygpO1xuICBjb25zdCBbZGlzYWJsZWRGcm9tQ29tcG9zZXJdID0gdXNlRGlzYWJsZWQoKTtcbiAgY29uc3QgW2Vycm9ycywgc2V0RXJyb3JzXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2xhc3RSZW5kZXIsIHNldExhc3RSZW5kZXJdID0gdXNlU3RhdGUoMCk7XG4gIGNvbnN0IGFjdGl2ZUVsZW1lbnRJbmRleFJlZiA9IHVzZVJlZigtMSk7XG4gIGNvbnN0IGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYgPSB1c2VSZWY8SFRNTEVsZW1lbnQ+KCk7XG4gIGNvbnN0IGNvbnRlbnRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG4gIGNvbnN0IGlucHV0VmFsdWVzUmVmID0gdXNlUmVmPChib29sZWFuIHwgc3RyaW5nKVtdPihbXSk7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IHBlcmZvcm1DYXJkQWN0aW9uID0gdXNlUGVyZm9ybUNhcmRBY3Rpb24oKTtcbiAgY29uc3QgcmVuZGVyTWFya2Rvd25Bc0hUTUwgPSB1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCgpO1xuICBjb25zdCBzY3JvbGxUb0VuZCA9IHVzZVNjcm9sbFRvRW5kKCk7XG5cbiAgY29uc3QgZGlzYWJsZWQgPSBkaXNhYmxlZEZyb21Db21wb3NlciB8fCBkaXNhYmxlZEZyb21Qcm9wcztcblxuICAvLyBUT0RPOiBbUDJdICMzMTk5IFdlIHNob3VsZCBjb25zaWRlciB1c2luZyBgYWRhcHRpdmVDYXJkLnNlbGVjdEFjdGlvbmAgaW5zdGVhZC5cbiAgLy8gVGhlIG51bGwgY2hlY2sgZm9yIFwidGFwQWN0aW9uXCIgaXMgaW4gXCJoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uXCIuXG4gIGNvbnN0IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3MgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IGtleSwgdHlwZSB9ID0gZXZlbnQgYXMgS2V5Ym9hcmRFdmVudDtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudDtcblxuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSB0ZXh0LCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSBjb250ZW50UmVmO1xuICAgICAgY29uc3QgYWRhcHRpdmVDYXJkUm9vdCA9IGN1cnJlbnQucXVlcnlTZWxlY3RvcignLmFjLWFkYXB0aXZlQ2FyZFt0YWJpbmRleD1cIjBcIl0nKTtcblxuICAgICAgaWYgKCFhZGFwdGl2ZUNhcmRSb290KSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBObyBBZGFwdGl2ZSBDYXJkIHJvb3QgY29udGFpbmVyIGNhbiBiZSBmb3VuZDsgdGhlIGNhcmQgaXMgcHJvYmFibHkgb24gYW4gdW5zdXBwb3J0ZWQgQWRhcHRpdmUgQ2FyZCB2ZXJzaW9uLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFwia2V5cHJlc3NcIiBldmVudCwgd2Ugb25seSBsaXN0ZW4gdG8gRU5URVIgYW5kIFNQQUNFQkFSIGtleS5cbiAgICAgIGlmICh0eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdFbnRlcicgJiYga2V5ICE9PSAnICcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSB3aWxsIGNhbGwgcGVyZm9ybUNhcmRBY3Rpb24gaWYgZWl0aGVyOlxuICAgICAgLy8gMS4gV2UgYXJlIG9uIHRoZSB0YXJnZXQsIG9yXG4gICAgICAvLyAyLiBUaGUgZXZlbnQtZGlzcGF0Y2hpbmcgZWxlbWVudCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgIGlmICh0YXJnZXQgIT09IGFkYXB0aXZlQ2FyZFJvb3QpIHtcbiAgICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleCh0YXJnZXQpO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGNsaWNraW5nIG9uIHNvbWV0aGluZyB0aGF0IGlzIGFscmVhZHkgY2xpY2thYmxlLCBkbyBub3QgYWxsb3cgdGhlbSB0byBjbGljayB0aGUgY2FyZC5cbiAgICAgICAgLy8gRS5nLiBhIGhlcm8gY2FyZCBjYW4gYmUgdGFwcGFibGUsIGFuZCBpbWFnZSBhbmQgYnV0dG9ucyBpbnNpZGUgdGhlIGhlcm8gY2FyZCBjYW4gYWxzbyBiZSB0YXBwYWJsZS5cbiAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwZXJmb3JtQ2FyZEFjdGlvbih0YXBBY3Rpb24pO1xuICAgICAgc2Nyb2xsVG9FbmQoKTtcbiAgICB9LFxuICAgIFtjb250ZW50UmVmLCBwZXJmb3JtQ2FyZEFjdGlvbiwgc2Nyb2xsVG9FbmQsIHRhcEFjdGlvbl1cbiAgKTtcblxuICAvLyBPbmx5IGxpc3RlbiB0byBldmVudCBpZiBpdCBpcyBub3QgZGlzYWJsZWQgYW5kIGhhdmUgXCJ0YXBBY3Rpb25cIiBwcm9wLlxuICBjb25zdCBoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uID0gIWRpc2FibGVkICYmIHRhcEFjdGlvbiA/IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3MgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYWRkQWN0aW9uc1BlcmZvcm1lZCA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpb246IEFkYXB0aXZlQ2FyZEFjdGlvbik6IHZvaWQgPT5cbiAgICAgICF+YWN0aW9uc1BlcmZvcm1lZC5pbmRleE9mKGFjdGlvbikgJiYgc2V0QWN0aW9uc1BlcmZvcm1lZChbLi4uYWN0aW9uc1BlcmZvcm1lZCwgYWN0aW9uXSksXG4gICAgW2FjdGlvbnNQZXJmb3JtZWQsIHNldEFjdGlvbnNQZXJmb3JtZWRdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlRXhlY3V0ZUFjdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpb246IEFkYXB0aXZlQ2FyZEFjdGlvbik6IHZvaWQgPT4ge1xuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSBpbWFnZSwgY2Fubm90IGJlIGRpc2FibGVkIHRocnUgRE9NIGF0dHJpYnV0ZXNcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFkZEFjdGlvbnNQZXJmb3JtZWQoYWN0aW9uKTtcblxuICAgICAgY29uc3QgYWN0aW9uVHlwZU5hbWUgPSBhY3Rpb24uZ2V0SnNvblR5cGVOYW1lKCk7XG4gICAgICBjb25zdCB7IGljb25Vcmw6IGltYWdlLCB0aXRsZSB9ID0gYWN0aW9uO1xuXG4gICAgICAvLyBXZSBjYW5ub3QgdXNlIFwiaW5zdGFuY2VvZlwiIGNoZWNrIGhlcmUsIGJlY2F1c2Ugd2ViIGRldnMgbWF5IGJyaW5nIHRoZWlyIG93biB2ZXJzaW9uIG9mIEFkYXB0aXZlIENhcmRzIHBhY2thZ2UuXG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHVzaW5nIFwiZ2V0SnNvblR5cGVOYW1lKClcIiBpbnN0ZWFkLlxuICAgICAgaWYgKGFjdGlvblR5cGVOYW1lID09PSAnQWN0aW9uLk9wZW5VcmwnKSB7XG4gICAgICAgIGNvbnN0IHsgdXJsOiB2YWx1ZSB9ID0gYWN0aW9uIGFzIE9wZW5VcmxBY3Rpb247XG5cbiAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oe1xuICAgICAgICAgIGltYWdlLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHR5cGU6ICdvcGVuVXJsJyxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uVHlwZU5hbWUgPT09ICdBY3Rpb24uU3VibWl0Jykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGFjdGlvbiBhcyBTdWJtaXRBY3Rpb24gYXMge1xuICAgICAgICAgIGRhdGE6IHN0cmluZyB8IEJvdEZyYW1ld29ya0NhcmRBY3Rpb247XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHtcbiAgICAgICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICB0eXBlOiAnaW1CYWNrJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5fX2lzQm90RnJhbWV3b3JrQ2FyZEFjdGlvbikge1xuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oZGF0YS5jYXJkQWN0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oe1xuICAgICAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIHR5cGU6ICdwb3N0QmFjaycsXG4gICAgICAgICAgICAgIHZhbHVlOiBkYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY3JvbGxUb0VuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2ViIENoYXQ6IHJlY2VpdmVkIHVua25vd24gYWN0aW9uIGZyb20gQWRhcHRpdmUgQ2FyZHNgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihhY3Rpb24pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZEFjdGlvbnNQZXJmb3JtZWQsIGRpc2FibGVkLCBwZXJmb3JtQ2FyZEFjdGlvbiwgc2Nyb2xsVG9FbmRdXG4gICk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IGN1cnJlbnQgfSA9IGNvbnRlbnRSZWY7XG5cbiAgICBpZiAoIWN1cnJlbnQgfHwgIWFkYXB0aXZlQ2FyZCkge1xuICAgICAgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgIGlucHV0VmFsdWVzUmVmLmN1cnJlbnQgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDdXJyZW50bHksIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIE1hcmtkb3duIGVuZ2luZSBpcyB0byBzZXQgaXQgdGhydSBzdGF0aWMgbWVtYmVyIG9mIEFkYXB0aXZlQ2FyZCBjbGFzc1xuXG4gICAgLy8gVE9ETzogW1AzXSBDaGVja3MgaWYgd2UgY291bGQgbWFrZSB0aGUgXCJyZW5kZXJNYXJrZG93bkFzSFRNTFwiIHBlciBjYXJkXG4gICAgLy8gICAgICAgVGhpcyBjb3VsZCBiZSBsaW1pdGF0aW9ucyBmcm9tIEFkYXB0aXZlIENhcmRzIHBhY2thZ2UgKG5vdCBzdXBwb3J0ZWQgYXMgb2YgMS4yLjUpXG4gICAgLy8gICAgICAgQmVjYXVzZSB0aGVyZSBjb3VsZCBiZSB0aW1pbmcgZGlmZmVyZW5jZSBiZXR3ZWVuIC5wYXJzZSBhbmQgLnJlbmRlciwgd2UgY291bGQgYmUgdXNpbmcgd3JvbmcgTWFya2Rvd24gZW5naW5lXG5cbiAgICAvLyBcIm9uUHJvY2Vzc01hcmtkb3duXCIgaXMgYSBzdGF0aWMgZnVuY3Rpb24gYnV0IHdlIGFyZSB0cnlpbmcgdG8gc2NvcGUgaXQgdG8gdGhlIGN1cnJlbnQgb2JqZWN0IGluc3RlYWQuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvblxuICAgIGFkYXB0aXZlQ2FyZC5jb25zdHJ1Y3Rvclsnb25Qcm9jZXNzTWFya2Rvd24nXSA9ICh0ZXh0OiBzdHJpbmcsIHJlc3VsdDogSU1hcmtkb3duUHJvY2Vzc2luZ1Jlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlbmRlck1hcmtkb3duQXNIVE1MKSB7XG4gICAgICAgIHJlc3VsdC5vdXRwdXRIdG1sID0gcmVuZGVyTWFya2Rvd25Bc0hUTUwodGV4dCk7XG4gICAgICAgIHJlc3VsdC5kaWRQcm9jZXNzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKSB7XG4gICAgICBhZGFwdGl2ZUNhcmQuaG9zdENvbmZpZyA9IGlzUGxhaW5PYmplY3QoYWRhcHRpdmVDYXJkc0hvc3RDb25maWcpXG4gICAgICAgID8gbmV3IEhvc3RDb25maWcoYWRhcHRpdmVDYXJkc0hvc3RDb25maWcpXG4gICAgICAgIDogYWRhcHRpdmVDYXJkc0hvc3RDb25maWc7XG4gICAgfVxuXG4gICAgLy8gRm9yIGFjY2Vzc2liaWxpdHkgaXNzdWUgIzEzNDAsIGB0YWJpbmRleD1cIjBcImAgbXVzdCBub3QgYmUgc2V0IGZvciB0aGUgcm9vdCBjb250YWluZXIgaWYgaXQgaXMgbm90IGludGVyYWN0aXZlLlxuICAgIEdsb2JhbFNldHRpbmdzLnNldFRhYkluZGV4QXRDYXJkUm9vdCA9ICEhdGFwQWN0aW9uO1xuXG4gICAgY29uc3QgeyB2YWxpZGF0aW9uRXZlbnRzIH0gPSBhZGFwdGl2ZUNhcmQudmFsaWRhdGVQcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAodmFsaWRhdGlvbkV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBzZXRFcnJvcnModmFsaWRhdGlvbkV2ZW50cy5yZWR1Y2UoKGl0ZW1zLCB7IG1lc3NhZ2UgfSkgPT4gWy4uLml0ZW1zLCBuZXcgRXJyb3IobWVzc2FnZSldLCBbXSkpO1xuICAgIH1cblxuICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50ID0gYWRhcHRpdmVDYXJkLnJlbmRlcigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gc2V0RXJyb3JzKFtlcnJvcl0pO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyhbbmV3IEVycm9yKCdBZGFwdGl2ZSBDYXJkIHJlbmRlcmVkIGFzIGVtcHR5IGVsZW1lbnQnKV0pO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGVycm9ycyBvbiBuZXh0IHJlbmRlclxuICAgIHNldEVycm9ycyhbXSk7XG5cbiAgICByZXN0b3JlSW5wdXRWYWx1ZXMoZWxlbWVudCwgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCk7XG5cbiAgICBjdXJyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBGb2N1cyBjYW4gb25seSBiZSByZXN0b3JlZCBhZnRlciB0aGUgRE9NIGlzIGF0dGFjaGVkLlxuICAgIHJlc3RvcmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCwgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQpO1xuXG4gICAgc2V0TGFzdFJlbmRlcihEYXRlLm5vdygpKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmVFbGVtZW50SW5kZXhSZWYuY3VycmVudCA9IHNhdmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCk7XG4gICAgICBpbnB1dFZhbHVlc1JlZi5jdXJyZW50ID0gc2F2ZUlucHV0VmFsdWVzKGVsZW1lbnQpO1xuXG4gICAgICBjdXJyZW50LnJlbW92ZUNoaWxkKGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCk7XG5cbiAgICAgIGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9LCBbXG4gICAgYWRhcHRpdmVDYXJkLFxuICAgIGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnLFxuICAgIGNvbnRlbnRSZWYsXG4gICAgR2xvYmFsU2V0dGluZ3MsXG4gICAgSG9zdENvbmZpZyxcbiAgICByZW5kZXJNYXJrZG93bkFzSFRNTCxcbiAgICBzZXRFcnJvcnMsXG4gICAgdGFwQWN0aW9uXG4gIF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gU2V0IG9uRXhlY3V0ZUFjdGlvbiB3aXRob3V0IGNhdXNpbmcgdW5uZWNlc3NhcnkgcmUtcmVuZGVyLlxuICAgIGFkYXB0aXZlQ2FyZC5vbkV4ZWN1dGVBY3Rpb24gPSBkaXNhYmxlZCA/IHVuZGVmaW5lZCA6IGhhbmRsZUV4ZWN1dGVBY3Rpb247XG4gIH0sIFthZGFwdGl2ZUNhcmQsIGRpc2FibGVkLCBoYW5kbGVFeGVjdXRlQWN0aW9uXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IGZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyhhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpLCBbYWRhcHRpdmVDYXJkRWxlbWVudFJlZiwgbGFzdFJlbmRlcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gSWYgdGhlIEFkYXB0aXZlIENhcmQgZ2V0IHJlLXJlbmRlcmVkLCByZS1kaXNhYmxlIGVsZW1lbnRzIGFzIG5lZWRlZC5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbYWRhcHRpdmVDYXJkRWxlbWVudFJlZiwgZGlzYWJsZWQsIGxhc3RSZW5kZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIElmIHRoZSBBZGFwdGl2ZSBDYXJkIGNoYW5nZWQsIHJlc2V0IGFsbCBhY3Rpb25zIHBlcmZvcm1lZC5cbiAgICBzZXRBY3Rpb25zUGVyZm9ybWVkKFtdKTtcbiAgfSwgW2FkYXB0aXZlQ2FyZF0pO1xuXG4gIHVzZUVmZmVjdChcbiAgICAoKSA9PlxuICAgICAgaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyhcbiAgICAgICAgLy8gQWN0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIFwicmVuZGVyZWRFbGVtZW50XCIgbWVhbnMgaXQgaXMgdGhlIEFkYXB0aXZlIENhcmQgaXRzZWxmLCBzdWNoIGFzIFwic2VsZWN0QWN0aW9uXCIgKEFDKSBvciBcInRhcEFjdGlvblwiIChyaWNoIGNhcmRzKS5cbiAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdG8gbWFyayB0aGUgd2hvbGUgY2FyZCBhcyBwZXJmb3JtZWQuXG4gICAgICAgIGFjdGlvbnNQZXJmb3JtZWQubWFwKCh7IHJlbmRlcmVkRWxlbWVudCB9KSA9PiByZW5kZXJlZEVsZW1lbnQpLmZpbHRlcihyZW5kZXJlZEVsZW1lbnQgPT4gcmVuZGVyZWRFbGVtZW50KSxcbiAgICAgICAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lXG4gICAgICApLFxuICAgIFthY3Rpb25zUGVyZm9ybWVkLCBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsIGxhc3RSZW5kZXJdXG4gICk7XG5cbiAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyAoXG4gICAgbm9kZV9lbnYgPT09ICdkZXZlbG9wbWVudCcgJiYgPEVycm9yQm94IGVycm9yPXtlcnJvcnNbMF19IHR5cGU9e2xvY2FsaXplKCdBREFQVElWRV9DQVJEX0VSUk9SX0JPWF9USVRMRV9SRU5ERVInKX0gLz5cbiAgKSA6IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCArICcnLCAnd2ViY2hhdF9fYWRhcHRpdmUtY2FyZC1yZW5kZXJlcicpfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvbiBhcyB1bmtub3duIGFzIE1vdXNlRXZlbnRIYW5kbGVyPEhUTUxEaXZFbGVtZW50Pn1cbiAgICAgIG9uS2V5UHJlc3M9e2hhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24gYXMgdW5rbm93biBhcyBLZXlib2FyZEV2ZW50SGFuZGxlcjxIVE1MRGl2RWxlbWVudD59XG4gICAgICByZWY9e2NvbnRlbnRSZWZ9XG4gICAgLz5cbiAgKTtcbn07XG5cbkFkYXB0aXZlQ2FyZFJlbmRlcmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lOiAnJyxcbiAgZGlzYWJsZWQ6IHVuZGVmaW5lZCxcbiAgdGFwQWN0aW9uOiB1bmRlZmluZWRcbn07XG5cbkFkYXB0aXZlQ2FyZFJlbmRlcmVyLnByb3BUeXBlcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBhZGFwdGl2ZUNhcmQ6IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8vIFR5cGVTY3JpcHQgY2xhc3MgaXMgbm90IG1hcHBhYmxlIHRvIFByb3BUeXBlcy5mdW5jXG4gIC8vIEB0cy1pZ25vcmVcbiAgdGFwQWN0aW9uOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGltYWdlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZ1xuICB9KVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWRhcHRpdmVDYXJkUmVuZGVyZXI7XG4iXX0=
274
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIudHN4Il0sIm5hbWVzIjpbIkVycm9yQm94IiwiQ29tcG9uZW50cyIsInVzZURpc2FibGVkIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VQZXJmb3JtQ2FyZEFjdGlvbiIsInVzZVJlbmRlck1hcmtkb3duQXNIVE1MIiwidXNlU2Nyb2xsVG9FbmQiLCJ1c2VTdHlsZVNldCIsIm5vZGVfZW52IiwiQWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUiLCJhZGFwdGl2ZUNhcmQiLCJkaXNhYmxlZEZyb21Qcm9wcyIsImRpc2FibGVkIiwidGFwQWN0aW9uIiwiYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCIsImFkYXB0aXZlQ2FyZFJlbmRlcmVyIiwiR2xvYmFsU2V0dGluZ3MiLCJIb3N0Q29uZmlnIiwiYWRhcHRpdmVDYXJkc0hvc3RDb25maWciLCJkaXNhYmxlZEZyb21Db21wb3NlciIsImNvbnRlbnRSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsInRhcEFjdGlvblJlZiIsImRpc2FibGVkUmVmIiwiaGFuZGxlQ2xpY2tBbmRLZXlQcmVzcyIsImV2ZW50Iiwia2V5IiwidHlwZSIsInRhcmdldCIsImN1cnJlbnQiLCJhZGFwdGl2ZUNhcmRSb290IiwicXVlcnlTZWxlY3RvciIsImNvbnNvbGUiLCJ3YXJuIiwicHJldmVudERlZmF1bHQiLCJ0YWJJbmRleCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJoYW5kbGVFeGVjdXRlQWN0aW9uIiwiYWN0aW9uIiwiYWN0aW9uVHlwZU5hbWUiLCJnZXRKc29uVHlwZU5hbWUiLCJpbWFnZSIsImljb25VcmwiLCJ0aXRsZSIsInZhbHVlIiwidXJsIiwiZGF0YSIsIl9faXNCb3RGcmFtZXdvcmtDYXJkQWN0aW9uIiwiY2FyZEFjdGlvbiIsImVycm9yIiwic2V0VGFiSW5kZXhBdENhcmRSb290IiwiYXBwbHlBY3Rpb25TaG91bGRCZVB1c2hCdXR0b25Nb2QiLCJ1bmRvQWN0aW9uU2hvdWxkQmVQdXNoQnV0dG9uTW9kIiwiYXBwbHlBY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2QiLCJ1bmRvQWN0aW9uU2V0U2hvdWxkTm90QmVNZW51QmFyTW9kIiwiYXBwbHlBY3RpdmVFbGVtZW50TW9kIiwidW5kb0FjdGl2ZUVsZW1lbnRNb2QiLCJhcHBseURpc2FibGVkTW9kIiwidW5kb0Rpc2FibGVkTW9kIiwiYXBwbHlQZXJzaXN0VmFsdWVzTW9kIiwidW5kb1BlcnNpc3RWYWx1ZXNNb2QiLCJhZGFwdGl2ZUNhcmRzUGFja2FnZSIsImVsZW1lbnQiLCJlcnJvcnMiLCJvbkV4ZWN1dGVBY3Rpb24iLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwibGVuZ3RoIiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiYW55IiwiaXNSZXF1aXJlZCIsImJvb2wiLCJzaGFwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQVlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUExQkE7QUE0QkEsSUFBUUEsUUFBUixHQUFxQkMsd0NBQXJCLENBQVFELFFBQVI7QUFDQSxJQUFRRSxXQUFSLEdBQWtIQyxtQ0FBbEgsQ0FBUUQsV0FBUjtBQUFBLElBQXFCRSxZQUFyQixHQUFrSEQsbUNBQWxILENBQXFCQyxZQUFyQjtBQUFBLElBQW1DQyxvQkFBbkMsR0FBa0hGLG1DQUFsSCxDQUFtQ0Usb0JBQW5DO0FBQUEsSUFBeURDLHVCQUF6RCxHQUFrSEgsbUNBQWxILENBQXlERyx1QkFBekQ7QUFBQSxJQUFrRkMsY0FBbEYsR0FBa0hKLG1D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Q0E7QUFDQWpFLEVBQUFBLFNBQVMsRUFBRTZELG1CQUFVSyxLQUFWLENBQWdCO0FBQ3pCbEMsSUFBQUEsS0FBSyxFQUFFNkIsbUJBQVVDLE1BRFE7QUFFekI1QixJQUFBQSxLQUFLLEVBQUUyQixtQkFBVUMsTUFGUTtBQUd6QjdDLElBQUFBLElBQUksRUFBRTRDLG1CQUFVQyxNQUFWLENBQWlCRSxVQUhFO0FBSXpCN0IsSUFBQUEsS0FBSyxFQUFFMEIsbUJBQVVDO0FBSlEsR0FBaEI7QUFQb0IsQ0FBakM7ZUFlZW5FLG9CIiwic291cmNlUm9vdCI6ImJ1bmRsZTovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTEsIDAsIDJdIH1dICovXG5cbmltcG9ydCB7IEFjdGlvbiBhcyBBZGFwdGl2ZUNhcmRBY3Rpb24sIEFkYXB0aXZlQ2FyZCwgT3BlblVybEFjdGlvbiwgU3VibWl0QWN0aW9uIH0gZnJvbSAnYWRhcHRpdmVjYXJkcyc7XG5pbXBvcnQgeyBDb21wb25lbnRzLCBnZXRUYWJJbmRleCwgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb21wb25lbnQnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7XG4gIEtleWJvYXJkRXZlbnRIYW5kbGVyLFxuICBNb3VzZUV2ZW50SGFuZGxlcixcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICBWRkNcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBEaXJlY3RMaW5lQ2FyZEFjdGlvbiB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWNvcmUnO1xuXG5pbXBvcnQgeyBCb3RGcmFtZXdvcmtDYXJkQWN0aW9uIH0gZnJvbSAnLi9BZGFwdGl2ZUNhcmRCdWlsZGVyJztcbmltcG9ydCByZW5kZXJBZGFwdGl2ZUNhcmQgZnJvbSAnLi9wcml2YXRlL3JlbmRlckFkYXB0aXZlQ2FyZCc7XG5pbXBvcnQgdXNlQWN0aW9uU2V0U2hvdWxkTm90QmVNZW51QmFyTW9kRWZmZWN0IGZyb20gJy4vQWRhcHRpdmVDYXJkSGFja3MvdXNlQWN0aW9uU2V0U2hvdWxkTm90QmVNZW51QmFyTW9kRWZmZWN0JztcbmltcG9ydCB1c2VBY3Rpb25TaG91bGRCZVB1c2hCdXR0b25Nb2RFZmZlY3QgZnJvbSAnLi9BZGFwdGl2ZUNhcmRIYWNrcy91c2VBY3Rpb25TaG91bGRCZVB1c2hCdXR0b25Nb2RFZmZlY3QnO1xuaW1wb3J0IHVzZUFjdGl2ZUVsZW1lbnRNb2RFZmZlY3QgZnJvbSAnLi9BZGFwdGl2ZUNhcmRIYWNrcy91c2VBY3RpdmVFbGVtZW50TW9kRWZmZWN0JztcbmltcG9ydCB1c2VBZGFwdGl2ZUNhcmRzSG9zdENvbmZpZyBmcm9tICcuLi9ob29rcy91c2VBZGFwdGl2ZUNhcmRzSG9zdENvbmZpZyc7XG5pbXBvcnQgdXNlQWRhcHRpdmVDYXJkc1BhY2thZ2UgZnJvbSAnLi4vaG9va3MvdXNlQWRhcHRpdmVDYXJkc1BhY2thZ2UnO1xuaW1wb3J0IHVzZURpc2FibGVkTW9kRWZmZWN0IGZyb20gJy4vQWRhcHRpdmVDYXJkSGFja3MvdXNlRGlzYWJsZWRNb2RFZmZlY3QnO1xuaW1wb3J0IHVzZVBlcnNpc3RWYWx1ZXNNb2RFZmZlY3QgZnJvbSAnLi9BZGFwdGl2ZUNhcmRIYWNrcy91c2VQZXJzaXN0VmFsdWVzTW9kRWZmZWN0JztcbmltcG9ydCB1c2VWYWx1ZVJlZiBmcm9tICcuL0FkYXB0aXZlQ2FyZEhhY2tzL3ByaXZhdGUvdXNlVmFsdWVSZWYnO1xuXG5jb25zdCB7IEVycm9yQm94IH0gPSBDb21wb25lbnRzO1xuY29uc3QgeyB1c2VEaXNhYmxlZCwgdXNlTG9jYWxpemVyLCB1c2VQZXJmb3JtQ2FyZEFjdGlvbiwgdXNlUmVuZGVyTWFya2Rvd25Bc0hUTUwsIHVzZVNjcm9sbFRvRW5kLCB1c2VTdHlsZVNldCB9ID0gaG9va3M7XG5cbmNvbnN0IG5vZGVfZW52ID0gcHJvY2Vzcy5lbnYubm9kZV9lbnYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlY7XG5cbnR5cGUgQWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lPzogc3RyaW5nO1xuICBhZGFwdGl2ZUNhcmQ6IEFkYXB0aXZlQ2FyZDtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0YXBBY3Rpb24/OiBEaXJlY3RMaW5lQ2FyZEFjdGlvbjtcbn07XG5cbmNvbnN0IEFkYXB0aXZlQ2FyZFJlbmRlcmVyOiBWRkM8QWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcz4gPSAoe1xuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsXG4gIGFkYXB0aXZlQ2FyZCxcbiAgZGlzYWJsZWQ6IGRpc2FibGVkRnJvbVByb3BzLFxuICB0YXBBY3Rpb25cbn0pID0+IHtcbiAgY29uc3QgW3sgYWRhcHRpdmVDYXJkUmVuZGVyZXI6IGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBHbG9iYWxTZXR0aW5ncywgSG9zdENvbmZpZyB9XSA9IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlKCk7XG4gIGNvbnN0IFthZGFwdGl2ZUNhcmRzSG9zdENvbmZpZ10gPSB1c2VBZGFwdGl2ZUNhcmRzSG9zdENvbmZpZygpO1xuICBjb25zdCBbZGlzYWJsZWRGcm9tQ29tcG9zZXJdID0gdXNlRGlzYWJsZWQoKTtcbiAgY29uc3QgY29udGVudFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3QgcGVyZm9ybUNhcmRBY3Rpb24gPSB1c2VQZXJmb3JtQ2FyZEFjdGlvbigpO1xuICBjb25zdCByZW5kZXJNYXJrZG93bkFzSFRNTCA9IHVzZVJlbmRlck1hcmtkb3duQXNIVE1MKCk7XG4gIGNvbnN0IHNjcm9sbFRvRW5kID0gdXNlU2Nyb2xsVG9FbmQoKTtcblxuICBjb25zdCBkaXNhYmxlZCA9IGRpc2FibGVkRnJvbUNvbXBvc2VyIHx8IGRpc2FibGVkRnJvbVByb3BzO1xuICBjb25zdCB0YXBBY3Rpb25SZWYgPSB1c2VWYWx1ZVJlZih0YXBBY3Rpb24pO1xuXG4gIGNvbnN0IGRpc2FibGVkUmVmID0gdXNlVmFsdWVSZWYoZGlzYWJsZWQpO1xuXG4gIC8vIFRPRE86IFtQMl0gIzMxOTkgV2Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGBhZGFwdGl2ZUNhcmQuc2VsZWN0QWN0aW9uYCBpbnN0ZWFkLlxuICAvLyBUaGUgbnVsbCBjaGVjayBmb3IgXCJ0YXBBY3Rpb25cIiBpcyBpbiBcImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb25cIi5cbiAgY29uc3QgaGFuZGxlQ2xpY2tBbmRLZXlQcmVzcyA9IHVzZUNhbGxiYWNrPEtleWJvYXJkRXZlbnRIYW5kbGVyPEhUTUxEaXZFbGVtZW50PiB8IE1vdXNlRXZlbnRIYW5kbGVyPEhUTUxEaXZFbGVtZW50Pj4oXG4gICAgKGV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IGtleSwgdHlwZSB9ID0gZXZlbnQgYXMgS2V5Ym9hcmRFdmVudDtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudDtcblxuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSB0ZXh0LCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSBjb250ZW50UmVmO1xuICAgICAgY29uc3QgYWRhcHRpdmVDYXJkUm9vdCA9IGN1cnJlbnQucXVlcnlTZWxlY3RvcignLmFjLWFkYXB0aXZlQ2FyZFt0YWJpbmRleD1cIjBcIl0nKTtcblxuICAgICAgaWYgKCFhZGFwdGl2ZUNhcmRSb290KSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBObyBBZGFwdGl2ZSBDYXJkIHJvb3QgY29udGFpbmVyIGNhbiBiZSBmb3VuZDsgdGhlIGNhcmQgaXMgcHJvYmFibHkgb24gYW4gdW5zdXBwb3J0ZWQgQWRhcHRpdmUgQ2FyZCB2ZXJzaW9uLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFwia2V5cHJlc3NcIiBldmVudCwgd2Ugb25seSBsaXN0ZW4gdG8gRU5URVIgYW5kIFNQQUNFQkFSIGtleS5cbiAgICAgIGlmICh0eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdFbnRlcicgJiYga2V5ICE9PSAnICcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSB3aWxsIGNhbGwgcGVyZm9ybUNhcmRBY3Rpb24gaWYgZWl0aGVyOlxuICAgICAgLy8gMS4gV2UgYXJlIG9uIHRoZSB0YXJnZXQsIG9yXG4gICAgICAvLyAyLiBUaGUgZXZlbnQtZGlzcGF0Y2hpbmcgZWxlbWVudCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgIGlmICh0YXJnZXQgIT09IGFkYXB0aXZlQ2FyZFJvb3QpIHtcbiAgICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleCh0YXJnZXQpO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGNsaWNraW5nIG9uIHNvbWV0aGluZyB0aGF0IGlzIGFscmVhZHkgY2xpY2thYmxlLCBkbyBub3QgYWxsb3cgdGhlbSB0byBjbGljayB0aGUgY2FyZC5cbiAgICAgICAgLy8gRS5nLiBhIGhlcm8gY2FyZCBjYW4gYmUgdGFwcGFibGUsIGFuZCBpbWFnZSBhbmQgYnV0dG9ucyBpbnNpZGUgdGhlIGhlcm8gY2FyZCBjYW4gYWxzbyBiZSB0YXBwYWJsZS5cbiAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwZXJmb3JtQ2FyZEFjdGlvbih0YXBBY3Rpb25SZWYuY3VycmVudCk7XG4gICAgICBzY3JvbGxUb0VuZCgpO1xuICAgIH0sXG4gICAgW2NvbnRlbnRSZWYsIHBlcmZvcm1DYXJkQWN0aW9uLCBzY3JvbGxUb0VuZCwgdGFwQWN0aW9uUmVmXVxuICApO1xuXG4gIC8vIE9ubHkgbGlzdGVuIHRvIGV2ZW50IGlmIGl0IGlzIG5vdCBkaXNhYmxlZCBhbmQgaGF2ZSBcInRhcEFjdGlvblwiIHByb3AuXG4gIGNvbnN0IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24gPSAhZGlzYWJsZWQgJiYgdGFwQWN0aW9uID8gaGFuZGxlQ2xpY2tBbmRLZXlQcmVzcyA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBoYW5kbGVFeGVjdXRlQWN0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKGFjdGlvbjogQWRhcHRpdmVDYXJkQWN0aW9uKTogdm9pZCA9PiB7XG4gICAgICAvLyBTb21lIGl0ZW1zLCBlLmcuIHRhcHBhYmxlIGltYWdlLCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgaWYgKGRpc2FibGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3Rpb25UeXBlTmFtZSA9IGFjdGlvbi5nZXRKc29uVHlwZU5hbWUoKTtcbiAgICAgIGNvbnN0IHsgaWNvblVybDogaW1hZ2UsIHRpdGxlIH0gPSBhY3Rpb247XG5cbiAgICAgIC8vIFdlIGNhbm5vdCB1c2UgXCJpbnN0YW5jZW9mXCIgY2hlY2sgaGVyZSwgYmVjYXVzZSB3ZWIgZGV2cyBtYXkgYnJpbmcgdGhlaXIgb3duIHZlcnNpb24gb2YgQWRhcHRpdmUgQ2FyZHMgcGFja2FnZS5cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgdXNpbmcgXCJnZXRKc29uVHlwZU5hbWUoKVwiIGluc3RlYWQuXG4gICAgICBpZiAoYWN0aW9uVHlwZU5hbWUgPT09ICdBY3Rpb24uT3BlblVybCcpIHtcbiAgICAgICAgY29uc3QgeyB1cmw6IHZhbHVlIH0gPSBhY3Rpb24gYXMgT3BlblVybEFjdGlvbjtcblxuICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7XG4gICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgdHlwZTogJ29wZW5VcmwnLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChhY3Rpb25UeXBlTmFtZSA9PT0gJ0FjdGlvbi5TdWJtaXQnKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYWN0aW9uIGFzIFN1Ym1pdEFjdGlvbiBhcyB7XG4gICAgICAgICAgZGF0YTogc3RyaW5nIHwgQm90RnJhbWV3b3JrQ2FyZEFjdGlvbjtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oe1xuICAgICAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIHR5cGU6ICdpbUJhY2snLFxuICAgICAgICAgICAgICB2YWx1ZTogZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhLl9faXNCb3RGcmFtZXdvcmtDYXJkQWN0aW9uKSB7XG4gICAgICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbihkYXRhLmNhcmRBY3Rpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7XG4gICAgICAgICAgICAgIGltYWdlLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgdHlwZTogJ3Bvc3RCYWNrJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNjcm9sbFRvRW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBXZWIgQ2hhdDogcmVjZWl2ZWQgdW5rbm93biBhY3Rpb24gZnJvbSBBZGFwdGl2ZSBDYXJkc2ApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGFjdGlvbik7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZGlzYWJsZWRSZWYsIHBlcmZvcm1DYXJkQWN0aW9uLCBzY3JvbGxUb0VuZF1cbiAgKTtcblxuICAvLyBGb3IgYWNjZXNzaWJpbGl0eSBpc3N1ZSAjMTM0MCwgYHRhYmluZGV4PVwiMFwiYCBtdXN0IG5vdCBiZSBzZXQgZm9yIHRoZSByb290IGNvbnRhaW5lciBpZiBpdCBpcyBub3QgaW50ZXJhY3RpdmUuXG4gIGNvbnN0IHNldFRhYkluZGV4QXRDYXJkUm9vdCA9ICEhdGFwQWN0aW9uO1xuXG4gIGNvbnN0IFthcHBseUFjdGlvblNob3VsZEJlUHVzaEJ1dHRvbk1vZCwgdW5kb0FjdGlvblNob3VsZEJlUHVzaEJ1dHRvbk1vZF0gPVxuICAgIHVzZUFjdGlvblNob3VsZEJlUHVzaEJ1dHRvbk1vZEVmZmVjdChhZGFwdGl2ZUNhcmQpO1xuICBjb25zdCBbYXBwbHlBY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2QsIHVuZG9BY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2RdID1cbiAgICB1c2VBY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2RFZmZlY3QoYWRhcHRpdmVDYXJkKTtcbiAgY29uc3QgW2FwcGx5QWN0aXZlRWxlbWVudE1vZCwgdW5kb0FjdGl2ZUVsZW1lbnRNb2RdID0gdXNlQWN0aXZlRWxlbWVudE1vZEVmZmVjdChhZGFwdGl2ZUNhcmQpO1xuICBjb25zdCBbYXBwbHlEaXNhYmxlZE1vZCwgdW5kb0Rpc2FibGVkTW9kXSA9IHVzZURpc2FibGVkTW9kRWZmZWN0KGFkYXB0aXZlQ2FyZCk7XG4gIGNvbnN0IFthcHBseVBlcnNpc3RWYWx1ZXNNb2QsIHVuZG9QZXJzaXN0VmFsdWVzTW9kXSA9IHVzZVBlcnNpc3RWYWx1ZXNNb2RFZmZlY3QoYWRhcHRpdmVDYXJkKTtcblxuICBjb25zdCB7IGVsZW1lbnQsIGVycm9ycyB9OiB7IGVsZW1lbnQ/OiBIVE1MRWxlbWVudDsgZXJyb3JzPzogRXJyb3JbXSB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgdW5kb0FjdGlvblNob3VsZEJlUHVzaEJ1dHRvbk1vZCgpO1xuICAgIHVuZG9BY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2QoKTtcbiAgICB1bmRvQWN0aXZlRWxlbWVudE1vZCgpO1xuICAgIHVuZG9EaXNhYmxlZE1vZCgpO1xuICAgIHVuZG9QZXJzaXN0VmFsdWVzTW9kKCk7XG5cbiAgICByZXR1cm4gcmVuZGVyQWRhcHRpdmVDYXJkKGFkYXB0aXZlQ2FyZCwge1xuICAgICAgYWRhcHRpdmVDYXJkc0hvc3RDb25maWcsXG4gICAgICBhZGFwdGl2ZUNhcmRzUGFja2FnZTogeyBHbG9iYWxTZXR0aW5ncywgSG9zdENvbmZpZyB9LFxuICAgICAgcmVuZGVyTWFya2Rvd25Bc0hUTUwsXG4gICAgICBzZXRUYWJJbmRleEF0Q2FyZFJvb3RcbiAgICB9KTtcbiAgfSwgW1xuICAgIGFkYXB0aXZlQ2FyZCxcbiAgICBhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZyxcbiAgICBHbG9iYWxTZXR0aW5ncyxcbiAgICBIb3N0Q29uZmlnLFxuICAgIHJlbmRlck1hcmtkb3duQXNIVE1MLFxuICAgIHNldFRhYkluZGV4QXRDYXJkUm9vdCxcbiAgICB1bmRvQWN0aW9uU2hvdWxkQmVQdXNoQnV0dG9uTW9kLFxuICAgIHVuZG9BY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2QsXG4gICAgdW5kb0FjdGl2ZUVsZW1lbnRNb2QsXG4gICAgdW5kb0Rpc2FibGVkTW9kLFxuICAgIHVuZG9QZXJzaXN0VmFsdWVzTW9kXG4gIF0pO1xuXG4gIHVzZU1lbW8oKCkgPT4ge1xuICAgIGFkYXB0aXZlQ2FyZC5vbkV4ZWN1dGVBY3Rpb24gPSBoYW5kbGVFeGVjdXRlQWN0aW9uO1xuICB9LCBbYWRhcHRpdmVDYXJkLCBoYW5kbGVFeGVjdXRlQWN0aW9uXSk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IGN1cnJlbnQgfSA9IGNvbnRlbnRSZWY7XG5cbiAgICBjdXJyZW50Py5hcHBlbmRDaGlsZChlbGVtZW50KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjdXJyZW50Py5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICB9O1xuICB9LCBbY29udGVudFJlZiwgZWxlbWVudF0pO1xuXG4gIC8vIEFwcGx5IGFsbCBtb2RzIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgZWxlbWVudCBjaGFuZ2VkIG9yIG5vdC5cbiAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGhhdmUgdW5kb2VkIG1vZHMgd2hlbiB3ZSBjYWxsIHRoZSBgdXNlWFhYTW9kRWZmZWN0YCBob29rLlxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGFwcGx5QWN0aW9uU2hvdWxkQmVQdXNoQnV0dG9uTW9kKGVsZW1lbnQsIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSk7XG4gICAgYXBwbHlBY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2QoZWxlbWVudCk7XG4gICAgYXBwbHlBY3RpdmVFbGVtZW50TW9kKGVsZW1lbnQpO1xuICAgIGFwcGx5RGlzYWJsZWRNb2QoZWxlbWVudCwgZGlzYWJsZWQpO1xuICAgIGFwcGx5UGVyc2lzdFZhbHVlc01vZChlbGVtZW50KTtcbiAgfSwgW1xuICAgIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSxcbiAgICBhcHBseUFjdGlvblNob3VsZEJlUHVzaEJ1dHRvbk1vZCxcbiAgICBhcHBseUFjdGlvblNldFNob3VsZE5vdEJlTWVudUJhck1vZCxcbiAgICBhcHBseUFjdGl2ZUVsZW1lbnRNb2QsXG4gICAgYXBwbHlEaXNhYmxlZE1vZCxcbiAgICBhcHBseVBlcnNpc3RWYWx1ZXNNb2QsXG4gICAgZGlzYWJsZWQsXG4gICAgZWxlbWVudFxuICBdKTtcblxuICByZXR1cm4gZXJyb3JzPy5sZW5ndGggPyAoXG4gICAgbm9kZV9lbnYgPT09ICdkZXZlbG9wbWVudCcgJiYgPEVycm9yQm94IGVycm9yPXtlcnJvcnNbMF19IHR5cGU9e2xvY2FsaXplKCdBREFQVElWRV9DQVJEX0VSUk9SX0JPWF9USVRMRV9SRU5ERVInKX0gLz5cbiAgKSA6IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCArICcnLCAnd2ViY2hhdF9fYWRhcHRpdmUtY2FyZC1yZW5kZXJlcicpfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvbiBhcyBNb3VzZUV2ZW50SGFuZGxlcjxIVE1MRGl2RWxlbWVudD59XG4gICAgICBvbktleVByZXNzPXtoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uIGFzIEtleWJvYXJkRXZlbnRIYW5kbGVyPEhUTUxEaXZFbGVtZW50Pn1cbiAgICAgIHJlZj17Y29udGVudFJlZn1cbiAgICAvPlxuICApO1xufTtcblxuQWRhcHRpdmVDYXJkUmVuZGVyZXIuZGVmYXVsdFByb3BzID0ge1xuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWU6ICcnLFxuICBkaXNhYmxlZDogdW5kZWZpbmVkLFxuICB0YXBBY3Rpb246IHVuZGVmaW5lZFxufTtcblxuQWRhcHRpdmVDYXJkUmVuZGVyZXIucHJvcFR5cGVzID0ge1xuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGFkYXB0aXZlQ2FyZDogUHJvcFR5cGVzLmFueS5pc1JlcXVpcmVkLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLy8gVHlwZVNjcmlwdCBjbGFzcyBpcyBub3QgbWFwcGFibGUgdG8gUHJvcFR5cGVzLmZ1bmNcbiAgLy8gQHRzLWlnbm9yZVxuICB0YXBBY3Rpb246IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgaW1hZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nXG4gIH0pXG59O1xuXG5leHBvcnQgZGVmYXVsdCBBZGFwdGl2ZUNhcmRSZW5kZXJlcjtcbiJdfQ==