botframework-webchat 4.14.0 → 4.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.yml +5 -109
- package/.prettierrc.yml +1 -1
- package/README.md +1 -1
- package/babel.config.json +2 -2
- package/babel.sanitize-html.config.json +10 -0
- package/lib/AddFullBundle.d.ts.map +1 -1
- package/lib/AddFullBundle.js +1 -2
- package/lib/FullComposer.js +2 -2
- package/lib/FullReactWebChat.js +1 -1
- package/lib/adaptiveCards/AdaptiveCardsComposer.d.ts.map +1 -1
- package/lib/adaptiveCards/AdaptiveCardsComposer.js +6 -2
- package/lib/adaptiveCards/AdaptiveCardsContext.d.ts +0 -1
- package/lib/adaptiveCards/AdaptiveCardsContext.d.ts.map +1 -1
- package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.d.ts +7 -7
- package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.d.ts.map +1 -1
- package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.js +10 -3
- package/lib/adaptiveCards/Attachment/AdaptiveCardContent.js +8 -4
- package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.d.ts +9 -22
- package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.d.ts.map +1 -1
- package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.js +175 -95
- package/lib/adaptiveCards/Attachment/AnimationCardContent.js +1 -1
- package/lib/adaptiveCards/Attachment/AudioCardContent.js +1 -1
- package/lib/adaptiveCards/Attachment/CommonCard.js +7 -3
- package/lib/adaptiveCards/Attachment/HeroCardContent.js +7 -3
- package/lib/adaptiveCards/Attachment/OAuthCardContent.js +7 -3
- package/lib/adaptiveCards/Attachment/ReceiptCardContent.js +7 -3
- package/lib/adaptiveCards/Attachment/SignInCardContent.js +1 -1
- package/lib/adaptiveCards/Attachment/ThumbnailCardContent.js +7 -3
- package/lib/adaptiveCards/Attachment/VideoCardContent.js +1 -1
- package/lib/adaptiveCards/AttachmentForScreenReader/AdaptiveCardAttachment.js +7 -3
- package/lib/adaptiveCards/AttachmentForScreenReader/RichCardAttachment.js +1 -1
- package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.d.ts +3 -0
- package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.d.ts.map +1 -1
- package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.js +8 -1
- package/lib/adaptiveCards/Styles/adaptiveCardHostConfig.js +2 -2
- package/lib/adaptiveCards/Styles/createAdaptiveCardsStyleSet.js +1 -1
- package/lib/adaptiveCards/createAdaptiveCardsAttachmentForScreenReaderMiddleware.d.ts.map +1 -1
- package/lib/adaptiveCards/createAdaptiveCardsAttachmentForScreenReaderMiddleware.js +1 -1
- package/lib/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.d.ts.map +1 -1
- package/lib/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.js +1 -3
- package/lib/adaptiveCards/hooks/internal/useParseAdaptiveCardJSON.js +1 -1
- package/lib/adaptiveCards/hooks/useAdaptiveCardsHostConfig.js +1 -1
- package/lib/adaptiveCards/hooks/useAdaptiveCardsPackage.js +1 -1
- package/lib/adaptiveCards/normalizeStyleOptions.js +1 -1
- package/lib/addVersion.js +2 -2
- package/lib/createCognitiveServicesSpeechServicesPonyfillFactory.js +1 -1
- package/lib/createFullStyleSet.d.ts +324 -55
- package/lib/createFullStyleSet.d.ts.map +1 -1
- package/lib/createFullStyleSet.js +1 -1
- package/lib/fullBundleDefaultStyleOptions.js +1 -1
- package/lib/hooks/useStyleOptions.js +1 -1
- package/lib/index-es5.d.ts +1 -21
- package/lib/index-es5.d.ts.map +1 -1
- package/lib/index-es5.js +3 -43
- package/lib/index-minimal.js +27 -21
- package/lib/index.d.ts +10 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +10 -7
- package/lib/polyfill.d.ts +23 -0
- package/lib/polyfill.d.ts.map +1 -0
- package/lib/polyfill.js +46 -0
- package/lib/renderMarkdown.d.ts.map +1 -1
- package/lib/renderMarkdown.js +34 -6
- package/lib/speech/CustomAudioInputStream.d.ts.map +1 -1
- package/lib/speech/CustomAudioInputStream.js +40 -15
- package/lib/speech/createAudioConfig.d.ts.map +1 -1
- package/lib/speech/createAudioConfig.js +9 -3
- package/lib/speech/createMicrophoneAudioConfigAndAudioContext.d.ts.map +1 -1
- package/lib/speech/createMicrophoneAudioConfigAndAudioContext.js +6 -1
- package/lib/speech/getUserMedia.js +1 -1
- package/lib/useComposerProps.js +1 -1
- package/package.json +35 -41
- package/src/AddFullBundle.tsx +0 -1
- package/src/__tests__/createDirectLine.spec.js +2 -0
- package/src/__tests__/renderMarkdown.spec.js +1 -1
- package/src/__tests__/versionTag.es5.spec.js +1 -0
- package/src/__tests__/versionTag.full.spec.js +1 -0
- package/src/__tests__/versionTag.minimal.spec.js +1 -0
- package/src/adaptiveCards/AdaptiveCardsComposer.tsx +4 -3
- package/src/adaptiveCards/Attachment/AdaptiveCardBuilder.ts +16 -12
- package/src/adaptiveCards/Attachment/AdaptiveCardRenderer.tsx +226 -96
- package/src/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.ts +8 -0
- package/src/adaptiveCards/Styles/createAdaptiveCardsStyleSet.spec.js +2 -0
- package/src/adaptiveCards/createAdaptiveCardsAttachmentForScreenReaderMiddleware.tsx +14 -12
- package/src/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.tsx +26 -25
- package/src/adaptiveCards/hooks/useAdaptiveCardsHostConfig.ts +4 -4
- package/src/createCognitiveServicesSpeechServicesPonyfillFactory.spec.js +5 -5
- package/src/index-es5.ts +3 -26
- package/src/polyfill.ts +29 -0
- package/src/renderMarkdown.ts +40 -4
- package/src/speech/CustomAudioInputStream.ts +39 -10
- package/src/speech/createAudioConfig.spec.js +1 -1
- package/src/speech/createAudioConfig.ts +9 -6
- package/src/speech/createMicrophoneAudioConfigAndAudioContext.ts +1 -3
- package/src/useComposerProps.ts +4 -4
- package/webpack.config.js +24 -4
- package/.eslintignore +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
4
|
-
|
|
5
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
6
4
|
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
7
|
Object.defineProperty(exports, "__esModule", {
|
|
8
8
|
value: true
|
|
9
9
|
});
|
|
@@ -25,6 +25,10 @@ var _useAdaptiveCardsHostConfig = _interopRequireDefault(require("../hooks/useAd
|
|
|
25
25
|
|
|
26
26
|
var _useAdaptiveCardsPackage = _interopRequireDefault(require("../hooks/useAdaptiveCardsPackage"));
|
|
27
27
|
|
|
28
|
+
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
|
+
|
|
30
|
+
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; }
|
|
31
|
+
|
|
28
32
|
/* eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 2] }] */
|
|
29
33
|
var ErrorBox = _botframeworkWebchatComponent.Components.ErrorBox;
|
|
30
34
|
var useDisabled = _botframeworkWebchatComponent.hooks.useDisabled,
|
|
@@ -32,23 +36,45 @@ var useDisabled = _botframeworkWebchatComponent.hooks.useDisabled,
|
|
|
32
36
|
usePerformCardAction = _botframeworkWebchatComponent.hooks.usePerformCardAction,
|
|
33
37
|
useRenderMarkdownAsHTML = _botframeworkWebchatComponent.hooks.useRenderMarkdownAsHTML,
|
|
34
38
|
useScrollToEnd = _botframeworkWebchatComponent.hooks.useScrollToEnd,
|
|
35
|
-
useStyleSet = _botframeworkWebchatComponent.hooks.useStyleSet;
|
|
39
|
+
useStyleSet = _botframeworkWebchatComponent.hooks.useStyleSet;
|
|
40
|
+
var node_env = undefined || "production";
|
|
41
|
+
|
|
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
|
+
*/
|
|
36
56
|
|
|
37
|
-
var node_env = process.env.node_env || process.env.NODE_ENV;
|
|
38
57
|
|
|
39
58
|
function addClass(element, className) {
|
|
40
|
-
var
|
|
59
|
+
var classList = element.classList;
|
|
41
60
|
|
|
42
|
-
if (!
|
|
43
|
-
|
|
44
|
-
element.className = Array.from(classNames).join(' ');
|
|
61
|
+
if (!classList.contains(className)) {
|
|
62
|
+
classList.add(className);
|
|
45
63
|
return true;
|
|
46
64
|
}
|
|
47
|
-
|
|
48
|
-
return false;
|
|
49
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
|
+
|
|
50
72
|
|
|
51
73
|
function addPersistentClassWithUndo(element, className) {
|
|
74
|
+
if (!element) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
52
78
|
if (addClass(element, className)) {
|
|
53
79
|
// After we add the class, keep observing the element to make sure the class is not removed.
|
|
54
80
|
var observer = new MutationObserver(function () {
|
|
@@ -66,12 +92,26 @@ function addPersistentClassWithUndo(element, className) {
|
|
|
66
92
|
};
|
|
67
93
|
}
|
|
68
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Returns `true`, if the object is a plain object and not a class, otherwise, `false`.
|
|
97
|
+
*/
|
|
98
|
+
|
|
69
99
|
|
|
70
100
|
function isPlainObject(obj) {
|
|
71
101
|
return Object.getPrototypeOf(obj) === Object.prototype;
|
|
72
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Sets an attribute.
|
|
105
|
+
*
|
|
106
|
+
* @returns {function} A function, when called, will restore to previous state.
|
|
107
|
+
*/
|
|
108
|
+
|
|
73
109
|
|
|
74
110
|
function setAttributeWithUndo(element, qualifiedName, nextValue) {
|
|
111
|
+
if (!element) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
75
115
|
var value = element.getAttribute(qualifiedName);
|
|
76
116
|
|
|
77
117
|
if (value !== nextValue) {
|
|
@@ -81,15 +121,28 @@ function setAttributeWithUndo(element, qualifiedName, nextValue) {
|
|
|
81
121
|
};
|
|
82
122
|
}
|
|
83
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* An event handler for disabling event bubbling and propagation.
|
|
126
|
+
*/
|
|
127
|
+
|
|
84
128
|
|
|
85
129
|
var disabledHandler = function disabledHandler(event) {
|
|
86
130
|
event.preventDefault();
|
|
87
131
|
event.stopImmediatePropagation();
|
|
88
132
|
event.stopPropagation();
|
|
89
133
|
};
|
|
134
|
+
/**
|
|
135
|
+
* Listens to event once. Returns a function, when called, will stop listening.
|
|
136
|
+
*/
|
|
137
|
+
|
|
90
138
|
|
|
91
139
|
function addEventListenerOnceWithUndo(element, name, handler) {
|
|
140
|
+
if (!element) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
92
143
|
/* eslint-disable-next-line prefer-const */
|
|
144
|
+
|
|
145
|
+
|
|
93
146
|
var detach;
|
|
94
147
|
|
|
95
148
|
var detachingHandler = function detachingHandler(event) {
|
|
@@ -110,15 +163,33 @@ function addEventListenerOnceWithUndo(element, name, handler) {
|
|
|
110
163
|
});
|
|
111
164
|
return detach;
|
|
112
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Listens to event. Returns a function, when called, will stop listening.
|
|
168
|
+
*/
|
|
169
|
+
|
|
113
170
|
|
|
114
171
|
function addEventListenerWithUndo(element, name, handler) {
|
|
172
|
+
if (!element) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
115
176
|
element.addEventListener(name, handler);
|
|
116
177
|
return function () {
|
|
117
178
|
return element.removeEventListener(name, handler);
|
|
118
179
|
};
|
|
119
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Disables an element with undo function.
|
|
183
|
+
*
|
|
184
|
+
* @returns {function} A function, when called, will restore to previous state.
|
|
185
|
+
*/
|
|
186
|
+
|
|
120
187
|
|
|
121
188
|
function disableElementWithUndo(element) {
|
|
189
|
+
if (!element) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
122
193
|
var undoStack = [];
|
|
123
194
|
var isActive = element === document.activeElement;
|
|
124
195
|
var tag = element.nodeName.toLowerCase();
|
|
@@ -151,15 +222,25 @@ function disableElementWithUndo(element) {
|
|
|
151
222
|
break;
|
|
152
223
|
}
|
|
153
224
|
|
|
154
|
-
return
|
|
155
|
-
return undoStack.forEach(function (undo) {
|
|
156
|
-
return undo && undo();
|
|
157
|
-
});
|
|
158
|
-
};
|
|
225
|
+
return bunchUndos.apply(void 0, undoStack);
|
|
159
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
|
+
|
|
160
236
|
|
|
161
237
|
function disableInputElementsWithUndo(element) {
|
|
162
238
|
var observeSubtree = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
239
|
+
|
|
240
|
+
if (!element) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
|
|
163
244
|
var undoStack = [].map.call(element.querySelectorAll('button, input, select, textarea'), function (element) {
|
|
164
245
|
return disableElementWithUndo(element);
|
|
165
246
|
});
|
|
@@ -185,23 +266,7 @@ function disableInputElementsWithUndo(element) {
|
|
|
185
266
|
});
|
|
186
267
|
}
|
|
187
268
|
|
|
188
|
-
return
|
|
189
|
-
return undoStack.forEach(function (undo) {
|
|
190
|
-
return undo && undo();
|
|
191
|
-
});
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Checks if an element contains a class.
|
|
196
|
-
*
|
|
197
|
-
* @param {HTMLElement} element - The element to check for the class.
|
|
198
|
-
* @param {string} className - The name of the class to check for.
|
|
199
|
-
* @returns {boolean} `true` if the element contains the class, otherwise, `false`.
|
|
200
|
-
*/
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
function containsClassName(element, className) {
|
|
204
|
-
return (element.className || '').split(' ').includes(className);
|
|
269
|
+
return bunchUndos.apply(void 0, (0, _toConsumableArray2.default)(undoStack));
|
|
205
270
|
}
|
|
206
271
|
/**
|
|
207
272
|
* Gets the value of an attribute from an element.
|
|
@@ -211,7 +276,7 @@ function containsClassName(element, className) {
|
|
|
211
276
|
|
|
212
277
|
|
|
213
278
|
function getAttribute(element, qualifiedName) {
|
|
214
|
-
return element.hasAttribute(qualifiedName) && element.getAttribute(qualifiedName);
|
|
279
|
+
return !!element && element.hasAttribute(qualifiedName) && (element.getAttribute(qualifiedName) || '');
|
|
215
280
|
}
|
|
216
281
|
/**
|
|
217
282
|
* Sets or removes an attribute from an element.
|
|
@@ -224,9 +289,9 @@ function getAttribute(element, qualifiedName) {
|
|
|
224
289
|
|
|
225
290
|
function setOrRemoveAttribute(element, qualifiedName, value) {
|
|
226
291
|
if (value === false) {
|
|
227
|
-
element.removeAttribute(qualifiedName);
|
|
292
|
+
element === null || element === void 0 ? void 0 : element.removeAttribute(qualifiedName);
|
|
228
293
|
} else {
|
|
229
|
-
element.setAttribute(qualifiedName, value);
|
|
294
|
+
element === null || element === void 0 ? void 0 : element.setAttribute(qualifiedName, value);
|
|
230
295
|
}
|
|
231
296
|
}
|
|
232
297
|
/**
|
|
@@ -241,6 +306,10 @@ function setOrRemoveAttribute(element, qualifiedName, value) {
|
|
|
241
306
|
|
|
242
307
|
|
|
243
308
|
function setOrRemoveAttributeWithUndo(element, qualifiedName, value) {
|
|
309
|
+
if (!element) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
|
|
244
313
|
var prevValue = getAttribute(element, qualifiedName);
|
|
245
314
|
setOrRemoveAttribute(element, qualifiedName, value);
|
|
246
315
|
return function () {
|
|
@@ -258,14 +327,12 @@ function setOrRemoveAttributeWithUndo(element, qualifiedName, value) {
|
|
|
258
327
|
|
|
259
328
|
|
|
260
329
|
function findAncestor(element, predicate) {
|
|
261
|
-
var current = element
|
|
330
|
+
var current = element;
|
|
262
331
|
|
|
263
|
-
while (current) {
|
|
332
|
+
while (current = current.parentElement) {
|
|
264
333
|
if (predicate.call(element, current)) {
|
|
265
334
|
return current;
|
|
266
335
|
}
|
|
267
|
-
|
|
268
|
-
current = current.parentElement;
|
|
269
336
|
}
|
|
270
337
|
}
|
|
271
338
|
/**
|
|
@@ -282,13 +349,13 @@ function findAncestor(element, predicate) {
|
|
|
282
349
|
|
|
283
350
|
|
|
284
351
|
function indicateActionSelectionWithUndo(selectedActionElements, actionPerformedClassName) {
|
|
285
|
-
if (!selectedActionElements.length) {
|
|
352
|
+
if (!(selectedActionElements !== null && selectedActionElements !== void 0 && selectedActionElements.length)) {
|
|
286
353
|
return;
|
|
287
354
|
} // Verify all input elements are "ac-pushButton", could belongs to ActionSet or "card actions".
|
|
288
355
|
|
|
289
356
|
|
|
290
357
|
if (selectedActionElements.some(function (actionElement) {
|
|
291
|
-
return !
|
|
358
|
+
return !actionElement.classList.contains('ac-pushButton');
|
|
292
359
|
})) {
|
|
293
360
|
console.warn('botframework-webchat: Cannot mark selected action in the card, some elements are not an "ac-pushButton".');
|
|
294
361
|
return;
|
|
@@ -322,11 +389,7 @@ function indicateActionSelectionWithUndo(selectedActionElements, actionPerformed
|
|
|
322
389
|
}
|
|
323
390
|
});
|
|
324
391
|
});
|
|
325
|
-
return
|
|
326
|
-
return undoStack.forEach(function (undo) {
|
|
327
|
-
return undo();
|
|
328
|
-
});
|
|
329
|
-
};
|
|
392
|
+
return bunchUndos.apply(void 0, undoStack);
|
|
330
393
|
}
|
|
331
394
|
/**
|
|
332
395
|
* Fixes accessibility issues from Adaptive Card, with undo.
|
|
@@ -336,15 +399,18 @@ function indicateActionSelectionWithUndo(selectedActionElements, actionPerformed
|
|
|
336
399
|
|
|
337
400
|
|
|
338
401
|
function fixAccessibilityIssuesWithUndo(element) {
|
|
339
|
-
|
|
340
|
-
|
|
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
|
+
|
|
341
407
|
|
|
342
|
-
undoStack
|
|
408
|
+
var undoStack = Array.from(element.querySelectorAll('.ac-actionSet[role="menubar"] [role="button"]')).map(function (actionButton) {
|
|
343
409
|
return setAttributeWithUndo(actionButton, 'role', 'menuitem');
|
|
344
|
-
})
|
|
410
|
+
});
|
|
345
411
|
return function () {
|
|
346
412
|
return undoStack.forEach(function (undo) {
|
|
347
|
-
return undo();
|
|
413
|
+
return undo === null || undo === void 0 ? void 0 : undo();
|
|
348
414
|
});
|
|
349
415
|
};
|
|
350
416
|
}
|
|
@@ -357,8 +423,9 @@ function getFocusableElements(element) {
|
|
|
357
423
|
}
|
|
358
424
|
|
|
359
425
|
function restoreActiveElementIndex(element, activeElementIndex) {
|
|
360
|
-
var
|
|
361
|
-
|
|
426
|
+
var _getFocusableElements;
|
|
427
|
+
|
|
428
|
+
(_getFocusableElements = getFocusableElements(element)[+activeElementIndex]) === null || _getFocusableElements === void 0 ? void 0 : _getFocusableElements.focus();
|
|
362
429
|
}
|
|
363
430
|
|
|
364
431
|
function saveActiveElementIndex(element) {
|
|
@@ -368,15 +435,17 @@ function saveActiveElementIndex(element) {
|
|
|
368
435
|
function restoreInputValues(element, inputValues) {
|
|
369
436
|
var inputs = element.querySelectorAll('input, select, textarea');
|
|
370
437
|
[].forEach.call(inputs, function (input, index) {
|
|
371
|
-
var value = inputValues[index];
|
|
438
|
+
var value = inputValues[+index];
|
|
372
439
|
|
|
373
440
|
if (typeof value !== 'undefined') {
|
|
374
441
|
var tagName = input.tagName,
|
|
375
442
|
type = input.type;
|
|
376
443
|
|
|
377
444
|
if (tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
|
|
378
|
-
|
|
379
|
-
|
|
445
|
+
if (typeof value === 'boolean') {
|
|
446
|
+
input.checked = value;
|
|
447
|
+
}
|
|
448
|
+
} else if (typeof value === 'string') {
|
|
380
449
|
input.value = value;
|
|
381
450
|
}
|
|
382
451
|
}
|
|
@@ -385,25 +454,22 @@ function restoreInputValues(element, inputValues) {
|
|
|
385
454
|
|
|
386
455
|
function saveInputValues(element) {
|
|
387
456
|
var inputs = element.querySelectorAll('input, select, textarea');
|
|
388
|
-
return [].map.call(inputs, function (
|
|
389
|
-
var
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
if (tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
|
|
395
|
-
return checked;
|
|
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;
|
|
396
462
|
}
|
|
397
463
|
|
|
398
|
-
return value;
|
|
464
|
+
return input.value;
|
|
399
465
|
});
|
|
400
466
|
}
|
|
401
467
|
|
|
402
|
-
var AdaptiveCardRenderer = function AdaptiveCardRenderer(
|
|
403
|
-
var actionPerformedClassName =
|
|
404
|
-
adaptiveCard =
|
|
405
|
-
disabledFromProps =
|
|
406
|
-
tapAction =
|
|
468
|
+
var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
|
|
469
|
+
var actionPerformedClassName = _ref2.actionPerformedClassName,
|
|
470
|
+
adaptiveCard = _ref2.adaptiveCard,
|
|
471
|
+
disabledFromProps = _ref2.disabled,
|
|
472
|
+
tapAction = _ref2.tapAction;
|
|
407
473
|
|
|
408
474
|
var _useStyleSet = useStyleSet(),
|
|
409
475
|
_useStyleSet2 = (0, _slicedToArray2.default)(_useStyleSet, 1),
|
|
@@ -450,9 +516,10 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
|
|
|
450
516
|
// The null check for "tapAction" is in "handleClickAndKeyPressForTapAction".
|
|
451
517
|
|
|
452
518
|
var handleClickAndKeyPress = (0, _react.useCallback)(function (event) {
|
|
453
|
-
var
|
|
454
|
-
|
|
455
|
-
type =
|
|
519
|
+
var _ref3 = event,
|
|
520
|
+
key = _ref3.key,
|
|
521
|
+
type = _ref3.type;
|
|
522
|
+
var target = event.target; // Some items, e.g. tappable text, cannot be disabled thru DOM attributes
|
|
456
523
|
|
|
457
524
|
var current = contentRef.current;
|
|
458
525
|
var adaptiveCardRoot = current.querySelector('.ac-adaptiveCard[tabindex="0"]');
|
|
@@ -498,32 +565,39 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
|
|
|
498
565
|
|
|
499
566
|
addActionsPerformed(action);
|
|
500
567
|
var actionTypeName = action.getJsonTypeName();
|
|
568
|
+
var image = action.iconUrl,
|
|
569
|
+
title = action.title; // We cannot use "instanceof" check here, because web devs may bring their own version of Adaptive Cards package.
|
|
570
|
+
// We need to check using "getJsonTypeName()" instead.
|
|
501
571
|
|
|
502
572
|
if (actionTypeName === 'Action.OpenUrl') {
|
|
573
|
+
var _ref4 = action,
|
|
574
|
+
value = _ref4.url;
|
|
503
575
|
performCardAction({
|
|
576
|
+
image: image,
|
|
577
|
+
title: title,
|
|
504
578
|
type: 'openUrl',
|
|
505
|
-
value:
|
|
579
|
+
value: value
|
|
506
580
|
});
|
|
507
581
|
} else if (actionTypeName === 'Action.Submit') {
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
var displayText = cardAction.displayText,
|
|
514
|
-
text = cardAction.text,
|
|
515
|
-
type = cardAction.type,
|
|
516
|
-
value = cardAction.value;
|
|
582
|
+
var _ref5 = action,
|
|
583
|
+
data = _ref5.data;
|
|
584
|
+
|
|
585
|
+
if (typeof data !== 'undefined') {
|
|
586
|
+
if (typeof data === 'string') {
|
|
517
587
|
performCardAction({
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
type:
|
|
521
|
-
value:
|
|
588
|
+
image: image,
|
|
589
|
+
title: title,
|
|
590
|
+
type: 'imBack',
|
|
591
|
+
value: data
|
|
522
592
|
});
|
|
593
|
+
} else if (data.__isBotFrameworkCardAction) {
|
|
594
|
+
performCardAction(data.cardAction);
|
|
523
595
|
} else {
|
|
524
596
|
performCardAction({
|
|
525
|
-
|
|
526
|
-
|
|
597
|
+
image: image,
|
|
598
|
+
title: title,
|
|
599
|
+
type: 'postBack',
|
|
600
|
+
value: data
|
|
527
601
|
});
|
|
528
602
|
}
|
|
529
603
|
}
|
|
@@ -544,9 +618,11 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
|
|
|
544
618
|
// TODO: [P3] Checks if we could make the "renderMarkdownAsHTML" per card
|
|
545
619
|
// This could be limitations from Adaptive Cards package (not supported as of 1.2.5)
|
|
546
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
|
|
547
623
|
|
|
548
624
|
|
|
549
|
-
adaptiveCard.constructor
|
|
625
|
+
adaptiveCard.constructor['onProcessMarkdown'] = function (text, result) {
|
|
550
626
|
if (renderMarkdownAsHTML) {
|
|
551
627
|
result.outputHtml = renderMarkdownAsHTML(text);
|
|
552
628
|
result.didProcess = true;
|
|
@@ -564,8 +640,8 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
|
|
|
564
640
|
validationEvents = _adaptiveCard$validat.validationEvents;
|
|
565
641
|
|
|
566
642
|
if (validationEvents.length) {
|
|
567
|
-
return setErrors(validationEvents.reduce(function (items,
|
|
568
|
-
var message =
|
|
643
|
+
return setErrors(validationEvents.reduce(function (items, _ref6) {
|
|
644
|
+
var message = _ref6.message;
|
|
569
645
|
return [].concat((0, _toConsumableArray2.default)(items), [new Error(message)]);
|
|
570
646
|
}, []));
|
|
571
647
|
}
|
|
@@ -617,8 +693,8 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
|
|
|
617
693
|
(0, _react.useEffect)(function () {
|
|
618
694
|
return indicateActionSelectionWithUndo( // Actions that do not have "renderedElement" means it is the Adaptive Card itself, such as "selectAction" (AC) or "tapAction" (rich cards).
|
|
619
695
|
// We do not need to mark the whole card as performed.
|
|
620
|
-
actionsPerformed.map(function (
|
|
621
|
-
var renderedElement =
|
|
696
|
+
actionsPerformed.map(function (_ref7) {
|
|
697
|
+
var renderedElement = _ref7.renderedElement;
|
|
622
698
|
return renderedElement;
|
|
623
699
|
}).filter(function (renderedElement) {
|
|
624
700
|
return renderedElement;
|
|
@@ -644,11 +720,15 @@ AdaptiveCardRenderer.propTypes = {
|
|
|
644
720
|
actionPerformedClassName: _propTypes.default.string,
|
|
645
721
|
adaptiveCard: _propTypes.default.any.isRequired,
|
|
646
722
|
disabled: _propTypes.default.bool,
|
|
723
|
+
// TypeScript class is not mappable to PropTypes.func
|
|
724
|
+
// @ts-ignore
|
|
647
725
|
tapAction: _propTypes.default.shape({
|
|
726
|
+
image: _propTypes.default.string,
|
|
727
|
+
title: _propTypes.default.string,
|
|
648
728
|
type: _propTypes.default.string.isRequired,
|
|
649
729
|
value: _propTypes.default.string
|
|
650
730
|
})
|
|
651
731
|
};
|
|
652
732
|
var _default = AdaptiveCardRenderer;
|
|
653
733
|
exports.default = _default;
|
|
654
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIudHN4Il0sIm5hbWVzIjpbIkVycm9yQm94IiwiQ29tcG9uZW50cyIsInVzZURpc2FibGVkIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VQZXJmb3JtQ2FyZEFjdGlvbiIsInVzZVJlbmRlck1hcmtkb3duQXNIVE1MIiwidXNlU2Nyb2xsVG9FbmQiLCJ1c2VTdHlsZVNldCIsIm5vZGVfZW52IiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiYWRkQ2xhc3MiLCJlbGVtZW50IiwiY2xhc3NOYW1lIiwiY2xhc3NOYW1lcyIsIlNldCIsInNwbGl0IiwiaGFzIiwiYWRkIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImFkZFBlcnNpc3RlbnRDbGFzc1dpdGhVbmRvIiwib2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwib2JzZXJ2ZSIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVGaWx0ZXIiLCJkZWxldGUiLCJkaXNjb25uZWN0IiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwic2V0QXR0cmlidXRlV2l0aFVuZG8iLCJxdWFsaWZpZWROYW1lIiwibmV4dFZhbHVlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJkaXNhYmxlZEhhbmRsZXIiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyIsIm5hbWUiLCJoYW5kbGVyIiwiZGV0YWNoIiwiZGV0YWNoaW5nSGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyIsImRpc2FibGVFbGVtZW50V2l0aFVuZG8iLCJ1bmRvU3RhY2siLCJpc0FjdGl2ZSIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsInRhZyIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwibWFwIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvcHRpb24iLCJmb3JFYWNoIiwidW5kbyIsImRpc2FibGVJbnB1dEVsZW1lbnRzV2l0aFVuZG8iLCJvYnNlcnZlU3VidHJlZSIsIm11dGF0aW9ucyIsImFkZGVkTm9kZXMiLCJhZGRlZE5vZGUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwiY29udGFpbnNDbGFzc05hbWUiLCJpbmNsdWRlcyIsImhhc0F0dHJpYnV0ZSIsInNldE9yUmVtb3ZlQXR0cmlidXRlIiwic2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyIsInByZXZWYWx1ZSIsImZpbmRBbmNlc3RvciIsInByZWRpY2F0ZSIsImN1cnJlbnQiLCJwYXJlbnRFbGVtZW50IiwiaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyIsInNlbGVjdGVkQWN0aW9uRWxlbWVudHMiLCJhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUiLCJsZW5ndGgiLCJzb21lIiwiYWN0aW9uRWxlbWVudCIsImNvbnNvbGUiLCJ3YXJuIiwiYWN0aW9uU2V0RWxlbWVudHMiLCJzZWxlY3RlZEFjdGlvbkVsZW1lbnQiLCJhY3Rpb25TZXRFbGVtZW50IiwiYW5jZXN0b3IiLCJmaXhBY2Nlc3NpYmlsaXR5SXNzdWVzV2l0aFVuZG8iLCJhY3Rpb25CdXR0b24iLCJnZXRGb2N1c2FibGVFbGVtZW50cyIsImZpbHRlciIsInRhYkluZGV4IiwicmVzdG9yZUFjdGl2ZUVsZW1lbnRJbmRleCIsImFjdGl2ZUVsZW1lbnRJbmRleCIsImZvY3VzYWJsZSIsImZvY3VzIiwic2F2ZUFjdGl2ZUVsZW1lbnRJbmRleCIsImluZGV4T2YiLCJyZXN0b3JlSW5wdXRWYWx1ZXMiLCJpbnB1dFZhbHVlcyIsImlucHV0cyIsImlucHV0IiwiaW5kZXgiLCJ0YWdOYW1lIiwidHlwZSIsImNoZWNrZWQiLCJzYXZlSW5wdXRWYWx1ZXMiLCJBZGFwdGl2ZUNhcmRSZW5kZXJlciIsImFkYXB0aXZlQ2FyZCIsImRpc2FibGVkRnJvbVByb3BzIiwiZGlzYWJsZWQiLCJ0YXBBY3Rpb24iLCJhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IiwiYWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJHbG9iYWxTZXR0aW5ncyIsIkhvc3RDb25maWciLCJhY3Rpb25zUGVyZm9ybWVkIiwic2V0QWN0aW9uc1BlcmZvcm1lZCIsImFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIiwiZGlzYWJsZWRGcm9tQ29tcG9zZXIiLCJlcnJvcnMiLCJzZXRFcnJvcnMiLCJsYXN0UmVuZGVyIiwic2V0TGFzdFJlbmRlciIsImFjdGl2ZUVsZW1lbnRJbmRleFJlZiIsImFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYiLCJjb250ZW50UmVmIiwiaW5wdXRWYWx1ZXNSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3MiLCJrZXkiLCJ0YXJnZXQiLCJhZGFwdGl2ZUNhcmRSb290IiwicXVlcnlTZWxlY3RvciIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJhZGRBY3Rpb25zUGVyZm9ybWVkIiwiYWN0aW9uIiwiaGFuZGxlRXhlY3V0ZUFjdGlvbiIsImFjdGlvblR5cGVOYW1lIiwiZ2V0SnNvblR5cGVOYW1lIiwidXJsIiwiZGF0YSIsImFjdGlvbkRhdGEiLCJfX2lzQm90RnJhbWV3b3JrQ2FyZEFjdGlvbiIsImNhcmRBY3Rpb24iLCJkaXNwbGF5VGV4dCIsInRleHQiLCJlcnJvciIsImNvbnN0cnVjdG9yIiwib25Qcm9jZXNzTWFya2Rvd24iLCJyZXN1bHQiLCJvdXRwdXRIdG1sIiwiZGlkUHJvY2VzcyIsImhvc3RDb25maWciLCJzZXRUYWJJbmRleEF0Q2FyZFJvb3QiLCJ2YWxpZGF0ZVByb3BlcnRpZXMiLCJ2YWxpZGF0aW9uRXZlbnRzIiwicmVkdWNlIiwiaXRlbXMiLCJtZXNzYWdlIiwiRXJyb3IiLCJyZW5kZXIiLCJhcHBlbmRDaGlsZCIsIkRhdGUiLCJub3ciLCJyZW1vdmVDaGlsZCIsIm9uRXhlY3V0ZUFjdGlvbiIsInJlbmRlcmVkRWxlbWVudCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImFueSIsImlzUmVxdWlyZWQiLCJib29sIiwic2hhcGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQVJBO0lBVVFBLFEsR0FBYUMsd0MsQ0FBYkQsUTtJQUNBRSxXLEdBQTBHQyxtQyxDQUExR0QsVztJQUFhRSxZLEdBQTZGRCxtQyxDQUE3RkMsWTtJQUFjQyxvQixHQUErRUYsbUMsQ0FBL0VFLG9CO0lBQXNCQyx1QixHQUF5REgsbUMsQ0FBekRHLHVCO0lBQXlCQyxjLEdBQWdDSixtQyxDQUFoQ0ksYztJQUFnQkMsVyxHQUFnQkwsbUMsQ0FBaEJLLFcsRUFFbEc7O0FBQ0EsSUFBTUMsUUFBUSxHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsUUFBWixJQUF3QkMsT0FBTyxDQUFDQyxHQUFSLENBQVlDLFFBQXJEOztBQUVBLFNBQVNDLFFBQVQsQ0FBa0JDLE9BQWxCLEVBQTJCQyxTQUEzQixFQUFzQztBQUNwQyxNQUFNQyxVQUFVLEdBQUcsSUFBSUMsR0FBSixDQUFRSCxPQUFPLENBQUNDLFNBQVIsQ0FBa0JHLEtBQWxCLENBQXdCLEdBQXhCLENBQVIsQ0FBbkI7O0FBRUEsTUFBSSxDQUFDRixVQUFVLENBQUNHLEdBQVgsQ0FBZUosU0FBZixDQUFMLEVBQWdDO0FBQzlCQyxJQUFBQSxVQUFVLENBQUNJLEdBQVgsQ0FBZUwsU0FBZjtBQUVBRCxJQUFBQSxPQUFPLENBQUNDLFNBQVIsR0FBb0JNLEtBQUssQ0FBQ0MsSUFB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bnQiOlsiLyogZXNsaW50IG5vLW1hZ2ljLW51bWJlcnM6IFtcImVycm9yXCIsIHsgXCJpZ25vcmVcIjogWy0xLCAwLCAyXSB9XSAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnRzLCBnZXRUYWJJbmRleCwgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb21wb25lbnQnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHVzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIGZyb20gJy4uL2hvb2tzL3VzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnJztcbmltcG9ydCB1c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSBmcm9tICcuLi9ob29rcy91c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSc7XG5cbmNvbnN0IHsgRXJyb3JCb3ggfSA9IENvbXBvbmVudHM7XG5jb25zdCB7IHVzZURpc2FibGVkLCB1c2VMb2NhbGl6ZXIsIHVzZVBlcmZvcm1DYXJkQWN0aW9uLCB1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCwgdXNlU2Nyb2xsVG9FbmQsIHVzZVN0eWxlU2V0IH0gPSBob29rcztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5jb25zdCBub2RlX2VudiA9IHByb2Nlc3MuZW52Lm5vZGVfZW52IHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WO1xuXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgY29uc3QgY2xhc3NOYW1lcyA9IG5ldyBTZXQoZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKSk7XG5cbiAgaWYgKCFjbGFzc05hbWVzLmhhcyhjbGFzc05hbWUpKSB7XG4gICAgY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTtcblxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gQXJyYXkuZnJvbShjbGFzc05hbWVzKS5qb2luKCcgJyk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8oZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gIGlmIChhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKSB7XG4gICAgLy8gQWZ0ZXIgd2UgYWRkIHRoZSBjbGFzcywga2VlcCBvYnNlcnZpbmcgdGhlIGVsZW1lbnQgdG8gbWFrZSBzdXJlIHRoZSBjbGFzcyBpcyBub3QgcmVtb3ZlZC5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkpO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBuZXcgU2V0KGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykpO1xuXG4gICAgICBjbGFzc05hbWVzLmRlbGV0ZShjbGFzc05hbWUpO1xuXG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IEFycmF5LmZyb20oY2xhc3NOYW1lcykuam9pbignICcpO1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCBxdWFsaWZpZWROYW1lLCBuZXh0VmFsdWUpIHtcbiAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcblxuICBpZiAodmFsdWUgIT09IG5leHRWYWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIG5leHRWYWx1ZSk7XG5cbiAgICByZXR1cm4gKCkgPT4gKHZhbHVlID8gZWxlbWVudC5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpIDogZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkpO1xuICB9XG59XG5cbmNvbnN0IGRpc2FibGVkSGFuZGxlciA9IGV2ZW50ID0+IHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufTtcblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyhlbGVtZW50LCBuYW1lLCBoYW5kbGVyKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QgKi9cbiAgbGV0IGRldGFjaDtcbiAgY29uc3QgZGV0YWNoaW5nSGFuZGxlciA9IGV2ZW50ID0+IHtcbiAgICB0cnkge1xuICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCB7IG9uY2U6IHRydWUgfSwgc28gd2UgbmVlZCB0byBkZXRhY2ggbWFudWFsbHkuXG4gICAgICBkZXRhY2goKTtcbiAgICB9XG4gIH07XG5cbiAgZGV0YWNoID0gKCkgPT4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGRldGFjaGluZ0hhbmRsZXIpO1xuXG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBkZXRhY2hpbmdIYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgcmV0dXJuIGRldGFjaDtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcldpdGhVbmRvKGVsZW1lbnQsIG5hbWUsIGhhbmRsZXIpIHtcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIpO1xuXG4gIHJldHVybiAoKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcik7XG59XG5cbmZ1bmN0aW9uIGRpc2FibGVFbGVtZW50V2l0aFVuZG8oZWxlbWVudCkge1xuICBjb25zdCB1bmRvU3RhY2sgPSBbXTtcbiAgY29uc3QgaXNBY3RpdmUgPSBlbGVtZW50ID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBjb25zdCB0YWcgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlZmF1bHQtY2FzZSAqL1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpKTtcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKFxuICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXJPbmNlV2l0aFVuZG8oZWxlbWVudCwgJ2JsdXInLCAoKSA9PlxuICAgICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJykge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChhZGRFdmVudExpc3RlbmVyV2l0aFVuZG8oZWxlbWVudCwgJ2NsaWNrJywgZGlzYWJsZWRIYW5kbGVyKSk7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICdyZWFkb25seScsICdyZWFkb25seScpKTtcbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChcbiAgICAgICAgICAuLi5bXS5tYXAuY2FsbChlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpLCBvcHRpb24gPT5cbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZVdpdGhVbmRvKG9wdGlvbiwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJylcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuICgpID0+IHVuZG9TdGFjay5mb3JFYWNoKHVuZG8gPT4gdW5kbyAmJiB1bmRvKCkpO1xufVxuXG5mdW5jdGlvbiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvYnNlcnZlU3VidHJlZSA9IHRydWUpIHtcbiAgY29uc3QgdW5kb1N0YWNrID0gW10ubWFwLmNhbGwoZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhJyksIGVsZW1lbnQgPT5cbiAgICBkaXNhYmxlRWxlbWVudFdpdGhVbmRvKGVsZW1lbnQpXG4gICk7XG5cbiAgY29uc3QgdGFnID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIE9ubHkgc2V0IHRhYmluZGV4PVwiLTFcIiBvbiBmb2N1c2FibGUgZWxlbWVudC4gT3RoZXJ3aXNlLCB3ZSB3aWxsIG1ha2UgPGRpdj4gZm9jdXNhYmxlIGJ5IG1vdXNlLlxuICAodGFnID09PSAnYScgfHwgdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYScpICYmXG4gICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ3RhYmluZGV4JywgJy0xJykpO1xuXG4gIGlmIChvYnNlcnZlU3VidHJlZSkge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+XG4gICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBhZGRlZE5vZGVzIH0pID0+XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKC4uLltdLm1hcC5jYWxsKGFkZGVkTm9kZXMsIGFkZGVkTm9kZSA9PiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGFkZGVkTm9kZSwgZmFsc2UpKSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgIHVuZG9TdGFjay5wdXNoKCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gIH1cblxuICByZXR1cm4gKCkgPT4gdW5kb1N0YWNrLmZvckVhY2godW5kbyA9PiB1bmRvICYmIHVuZG8oKSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgY29udGFpbnMgYSBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gY2hlY2sgZm9yIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY2hlY2sgZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZWxlbWVudCBjb250YWlucyB0aGUgY2xhc3MsIG90aGVyd2lzZSwgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNDbGFzc05hbWUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoZWxlbWVudC5jbGFzc05hbWUgfHwgJycpLnNwbGl0KCcgJykuaW5jbHVkZXMoY2xhc3NOYW1lKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50LlxuICpcbiAqIEByZXR1cm5zIHtmYWxzZSB8IHN0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIGBmYWxzZWAgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgbm90IHNldC5cbiAqL1xuZnVuY3Rpb24gZ2V0QXR0cmlidXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBxdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBmYWxzZSB8IHN0cmluZyB7XG4gIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcbn1cblxuLyoqXG4gKiBTZXRzIG9yIHJlbW92ZXMgYW4gYXR0cmlidXRlIGZyb20gYW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc2V0IG9yIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7ZmFsc2UgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIFdoZW4gcGFzc2luZyBgZmFsc2VgLCByZW1vdmUgdGhlIGF0dHJpYnV0ZS5cbiAqL1xuZnVuY3Rpb24gc2V0T3JSZW1vdmVBdHRyaWJ1dGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHF1YWxpZmllZE5hbWU6IHN0cmluZywgdmFsdWU6IGZhbHNlIHwgc3RyaW5nKTogdm9pZCB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXRzIG9yIHJlbW92ZXMgYW4gYXR0cmlidXRlIGZyb20gYW4gZWxlbWVudCB3aXRoIGFuIHVuZG8gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHNldCBvciByZW1vdmUgYXR0cmlidXRlIGZyb20uXG4gKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge2ZhbHNlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBXaGVuIHBhc3NpbmcgYGZhbHNlYCwgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUuXG4gKlxuICogQHJldHVybnMgeygpID0+IHZvaWR9IFRoZSB1bmRvIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCB1bmRvIGFsbCBtYW5pcHVsYXRpb25zIGJ5IHJlc3RvcmluZyB2YWx1ZXMgcmVjb3JkZWQgYXQgdGhlIHRpbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIHNldE9yUmVtb3ZlQXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudDogSFRNTEVsZW1lbnQsIHF1YWxpZmllZE5hbWU6IHN0cmluZywgdmFsdWU6IGZhbHNlIHwgc3RyaW5nKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHByZXZWYWx1ZSA9IGdldEF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lKTtcblxuICBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lLCB2YWx1ZSk7XG5cbiAgcmV0dXJuICgpID0+IHNldE9yUmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIHF1YWxpZmllZE5hbWUsIHByZXZWYWx1ZSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGZpcnN0IGFuY2VzdG9yIHRoYXQgZnVsZmlsbCB0aGUgcHJlZGljYXRlLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgc3RhcnRpbmcgZWxlbWVudC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgcHJlZGljYXRlLlxuICogQHBhcmFtIHsoYW5jZXN0b3I6IEhUTUxFbGVtZW50KSA9PiBib29sZWFufSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIHRvIGZ1bGZpbGwuXG4gKlxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgdW5kZWZpbmVkfSBUaGUgZmlyc3QgYW5jZXN0b3IgdGhhdCBmdWxmaWxsIHRoZSBwcmVkaWNhdGUsIG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRBbmNlc3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJlZGljYXRlOiAoYW5jZXN0b3I6IEhUTUxFbGVtZW50KSA9PiBib29sZWFuKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICB3aGlsZSAoY3VycmVudCkge1xuICAgIGlmIChwcmVkaWNhdGUuY2FsbChlbGVtZW50LCBjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgYWN0aW9uIHNlbGVjdGVkIGJ5IHBlcmZvcm1pbmcgYSBzZXJpZXMgb2YgbWFuaXB1bGF0aW9ucywgd2l0aCB1bmRvOlxuICpcbiAqIC0gQWNjZXNzaWJpbGl0eTogc2V0IGBhcmlhLXByZXNzZWRgIHRvIGB0cnVlYFxuICogLSBBcHBsaWVzIGBzdHlsZU9wdGlvbnMuYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lYFxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXX0gc2VsZWN0ZWRBY3Rpb25FbGVtZW50cyAtIEFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHJlcHJlc2VudGluZyB0aGUgYWN0aW9uIGFuZCBpcyBzZWxlY3RlZC5cbiAqIEBwYXJhbSB7c3RyaW5nP30gYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGFwcGx5IHRvIGFsbCBlbGVtZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyhcbiAgc2VsZWN0ZWRBY3Rpb25FbGVtZW50czogSFRNTEVsZW1lbnRbXSxcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lPzogc3RyaW5nXG4pOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQge1xuICBpZiAoIXNlbGVjdGVkQWN0aW9uRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVmVyaWZ5IGFsbCBpbnB1dCBlbGVtZW50cyBhcmUgXCJhYy1wdXNoQnV0dG9uXCIsIGNvdWxkIGJlbG9uZ3MgdG8gQWN0aW9uU2V0IG9yIFwiY2FyZCBhY3Rpb25zXCIuXG4gIGlmIChzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLnNvbWUoYWN0aW9uRWxlbWVudCA9PiAhY29udGFpbnNDbGFzc05hbWUoYWN0aW9uRWxlbWVudCwgJ2FjLXB1c2hCdXR0b24nKSkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnYm90ZnJhbWV3b3JrLXdlYmNoYXQ6IENhbm5vdCBtYXJrIHNlbGVjdGVkIGFjdGlvbiBpbiB0aGUgY2FyZCwgc29tZSBlbGVtZW50cyBhcmUgbm90IGFuIFwiYWMtcHVzaEJ1dHRvblwiLidcbiAgICApO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQSBkaXN0aW5jdCBzZXQgb2YgYWN0aW9uIHNldCBjb250YWluZXJzIHdoaWNoIGhhcyBzZWxlY3Rpb25zLCBleGNsdWRpbmcgY29udGFpbmVycyB3aXRob3V0IGFjdGlvbnMuXG4gIC8vIE11bHRpcGxlIHN1Ym1pc3Npb24gaW4gYW4gQWRhcHRpdmUgQ2FyZCBpcyBzdGlsbCBhIHZhZ3VlIGFyZWEgYW5kIFRCRC5cbiAgLy8gV2UgbWlnaHQgd2FudCB0byBkaXNhYmxlIHRoZSB3aG9sZSBjYXJkLCBqdXN0IGJ1dHRvbnMgaW4gc2FtZSBjb250YWluZXIsIG9yIGRvIG5vdGhpbmcgKHRvZGF5KS5cbiAgY29uc3QgYWN0aW9uU2V0RWxlbWVudHMgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuXG4gIHNlbGVjdGVkQWN0aW9uRWxlbWVudHMuZm9yRWFjaChzZWxlY3RlZEFjdGlvbkVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGFjdGlvblNldEVsZW1lbnQgPSBmaW5kQW5jZXN0b3IoXG4gICAgICBzZWxlY3RlZEFjdGlvbkVsZW1lbnQsXG4gICAgICBhbmNlc3RvciA9PiBhbmNlc3Rvci5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ21lbnViYXInXG4gICAgKTtcblxuICAgIGFjdGlvblNldEVsZW1lbnQgJiYgYWN0aW9uU2V0RWxlbWVudHMuYWRkKGFjdGlvblNldEVsZW1lbnQpO1xuICB9KTtcblxuICBjb25zdCB1bmRvU3RhY2s6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgYWN0aW9uU2V0RWxlbWVudHMuZm9yRWFjaChhY3Rpb25TZXRFbGVtZW50ID0+IHtcbiAgICAvLyBSZW1vdmUgXCJyb2xlXCIgZnJvbSBldmVyeSBcImFjLWFjdGlvblNldFwiIGNvbnRhaW5lci5cbiAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvblNldEVsZW1lbnQsICdyb2xlJywgZmFsc2UpKTtcblxuICAgIC8vIE1vZGlmeSBcInJvbGVcIiBvZiBldmVyeSBhY3Rpb25zIGluIHRoZSBjb250YWluZXIuXG4gICAgQXJyYXkuZnJvbShhY3Rpb25TZXRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hYy1wdXNoQnV0dG9uJykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4pLmZvckVhY2goXG4gICAgICBhY3Rpb25FbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkQWN0aW9uRWxlbWVudHMuaW5jbHVkZXMoYWN0aW9uRWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBBZGQgXCJhcmlhLXByZXNzZWRcIiBhbmQgc2V0IFwicm9sZVwiIGF0dHJpYnV0ZSB0byBcImJ1dHRvblwiICh3aGljaCBpcyByZXF1aXJlZCBieSBcImFyaWEtcHJlc3NlZFwiKS5cbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdhcmlhLXByZXNzZWQnLCAndHJ1ZScpKTtcbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdyb2xlJywgJ2J1dHRvbicpKTtcblxuICAgICAgICAgIC8vIEhpZ2hsaWdodCBhY3Rpb25zIGJ5IGFwcGx5aW5nIGBzdHlsZU9wdGlvbnMuYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lYC5cbiAgICAgICAgICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUgJiZcbiAgICAgICAgICAgIHVuZG9TdGFjay5wdXNoKGFkZFBlcnNpc3RlbnRDbGFzc1dpdGhVbmRvKGFjdGlvbkVsZW1lbnQsIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlIHJlbW92ZWQgXCJyb2xlPW1lbnViYXJcIiBmcm9tIHRoZSBjb250YWluZXIsIHdlIG11c3QgcmVtb3ZlIFwicm9sZT1tZW51aXRlbVwiIGZyb20gdW5zZWxlY3RlZCBhY3Rpb25zLlxuICAgICAgICAgIHVuZG9TdGFjay5wdXNoKHNldE9yUmVtb3ZlQXR0cmlidXRlV2l0aFVuZG8oYWN0aW9uRWxlbWVudCwgJ3JvbGUnLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuICgpID0+IHVuZG9TdGFjay5mb3JFYWNoKHVuZG8gPT4gdW5kbygpKTtcbn1cblxuLyoqXG4gKiBGaXhlcyBhY2Nlc3NpYmlsaXR5IGlzc3VlcyBmcm9tIEFkYXB0aXZlIENhcmQsIHdpdGggdW5kby5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZml4QWNjZXNzaWJpbGl0eUlzc3Vlc1dpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogKCkgPT4gdm9pZCB7XG4gIC8vIFRoZXNlIGhhY2tzIHNob3VsZCBiZSBkb25lIGluIEFkYXB0aXZlIENhcmRzIGxpYnJhcnkgaW5zdGVhZC5cbiAgY29uc3QgdW5kb1N0YWNrOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIC8vIFJlbGF0ZWQgdG8gIzM5NDk6IEFsbCBhY3Rpb24gYnV0dG9ucyBpbnNpZGUgcm9sZT1cIm1lbnViYXJcIiBzaG91bGQgYmUgcm9sZT1cIm1lbnVpdGVtXCIuXG4gIHVuZG9TdGFjay5wdXNoKFxuICAgIC4uLkFycmF5LmZyb20oZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWMtYWN0aW9uU2V0W3JvbGU9XCJtZW51YmFyXCJdIFtyb2xlPVwiYnV0dG9uXCJdJykpLm1hcChhY3Rpb25CdXR0b24gPT5cbiAgICAgIHNldEF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkJ1dHRvbiwgJ3JvbGUnLCAnbWVudWl0ZW0nKVxuICAgIClcbiAgKTtcblxuICByZXR1cm4gKCkgPT4gdW5kb1N0YWNrLmZvckVhY2godW5kbyA9PiB1bmRvKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KSB7XG4gIHJldHVybiBbXS5maWx0ZXIuY2FsbChcbiAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBbXG4gICAgICAgICdhJyxcbiAgICAgICAgJ2JvZHknLFxuICAgICAgICAnYnV0dG9uJyxcbiAgICAgICAgJ2ZyYW1lJyxcbiAgICAgICAgJ2lmcmFtZScsXG4gICAgICAgICdpbWcnLFxuICAgICAgICAnaW5wdXQnLFxuICAgICAgICAnaXNpbmRleCcsXG4gICAgICAgICdvYmplY3QnLFxuICAgICAgICAnc2VsZWN0JyxcbiAgICAgICAgJ3RleHRhcmVhJyxcbiAgICAgICAgJ1t0YWJpbmRleF0nXG4gICAgICBdLmpvaW4oJywgJylcbiAgICApLFxuICAgIGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleChlbGVtZW50KTtcblxuICAgICAgcmV0dXJuIHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMDtcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCwgYWN0aXZlRWxlbWVudEluZGV4KSB7XG4gIGNvbnN0IGZvY3VzYWJsZSA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKGVsZW1lbnQpW2FjdGl2ZUVsZW1lbnRJbmRleF07XG5cbiAgZm9jdXNhYmxlICYmIGZvY3VzYWJsZS5mb2N1cygpO1xufVxuXG5mdW5jdGlvbiBzYXZlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldEZvY3VzYWJsZUVsZW1lbnRzKGVsZW1lbnQpLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVJbnB1dFZhbHVlcyhlbGVtZW50LCBpbnB1dFZhbHVlcykge1xuICBjb25zdCBpbnB1dHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG5cbiAgW10uZm9yRWFjaC5jYWxsKGlucHV0cywgKGlucHV0LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gaW5wdXRWYWx1ZXNbaW5kZXhdO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IHsgdGFnTmFtZSwgdHlwZSB9ID0gaW5wdXQ7XG5cbiAgICAgIGlmICh0YWdOYW1lID09PSAnSU5QVVQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpKSB7XG4gICAgICAgIGlucHV0LmNoZWNrZWQgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2F2ZUlucHV0VmFsdWVzKGVsZW1lbnQpIHtcbiAgY29uc3QgaW5wdXRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuXG4gIHJldHVybiBbXS5tYXAuY2FsbChpbnB1dHMsICh7IGNoZWNrZWQsIHRhZ05hbWUsIHR5cGUsIHZhbHVlIH0pID0+IHtcbiAgICBpZiAodGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKSkge1xuICAgICAgcmV0dXJuIGNoZWNrZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9KTtcbn1cblxuY29uc3QgQWRhcHRpdmVDYXJkUmVuZGVyZXIgPSAoeyBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsIGFkYXB0aXZlQ2FyZCwgZGlzYWJsZWQ6IGRpc2FibGVkRnJvbVByb3BzLCB0YXBBY3Rpb24gfSkgPT4ge1xuICBjb25zdCBbeyBhZGFwdGl2ZUNhcmRSZW5kZXJlcjogYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCB9XSA9IHVzZVN0eWxlU2V0KCk7XG4gIGNvbnN0IFt7IEdsb2JhbFNldHRpbmdzLCBIb3N0Q29uZmlnIH1dID0gdXNlQWRhcHRpdmVDYXJkc1BhY2thZ2UoKTtcbiAgY29uc3QgW2FjdGlvbnNQZXJmb3JtZWQsIHNldEFjdGlvbnNQZXJmb3JtZWRdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbYWRhcHRpdmVDYXJkc0hvc3RDb25maWddID0gdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcoKTtcbiAgY29uc3QgW2Rpc2FibGVkRnJvbUNvbXBvc2VyXSA9IHVzZURpc2FibGVkKCk7XG4gIGNvbnN0IFtlcnJvcnMsIHNldEVycm9yc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtsYXN0UmVuZGVyLCBzZXRMYXN0UmVuZGVyXSA9IHVzZVN0YXRlKDApO1xuICBjb25zdCBhY3RpdmVFbGVtZW50SW5kZXhSZWYgPSB1c2VSZWYoLTEpO1xuICBjb25zdCBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmID0gdXNlUmVmPEhUTUxFbGVtZW50PigpO1xuICBjb25zdCBjb250ZW50UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuICBjb25zdCBpbnB1dFZhbHVlc1JlZiA9IHVzZVJlZihbXSk7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IHBlcmZvcm1DYXJkQWN0aW9uID0gdXNlUGVyZm9ybUNhcmRBY3Rpb24oKTtcbiAgY29uc3QgcmVuZGVyTWFya2Rvd25Bc0hUTUwgPSB1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCgpO1xuICBjb25zdCBzY3JvbGxUb0VuZCA9IHVzZVNjcm9sbFRvRW5kKCk7XG5cbiAgY29uc3QgZGlzYWJsZWQgPSBkaXNhYmxlZEZyb21Db21wb3NlciB8fCBkaXNhYmxlZEZyb21Qcm9wcztcblxuICAvLyBUT0RPOiBbUDJdICMzMTk5IFdlIHNob3VsZCBjb25zaWRlciB1c2luZyBgYWRhcHRpdmVDYXJkLnNlbGVjdEFjdGlvbmAgaW5zdGVhZC5cbiAgLy8gVGhlIG51bGwgY2hlY2sgZm9yIFwidGFwQWN0aW9uXCIgaXMgaW4gXCJoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uXCIuXG4gIGNvbnN0IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3MgPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IGtleSwgdGFyZ2V0LCB0eXBlIH0gPSBldmVudDtcblxuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSB0ZXh0LCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSBjb250ZW50UmVmO1xuICAgICAgY29uc3QgYWRhcHRpdmVDYXJkUm9vdCA9IGN1cnJlbnQucXVlcnlTZWxlY3RvcignLmFjLWFkYXB0aXZlQ2FyZFt0YWJpbmRleD1cIjBcIl0nKTtcblxuICAgICAgaWYgKCFhZGFwdGl2ZUNhcmRSb290KSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBObyBBZGFwdGl2ZSBDYXJkIHJvb3QgY29udGFpbmVyIGNhbiBiZSBmb3VuZDsgdGhlIGNhcmQgaXMgcHJvYmFibHkgb24gYW4gdW5zdXBwb3J0ZWQgQWRhcHRpdmUgQ2FyZCB2ZXJzaW9uLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFwia2V5cHJlc3NcIiBldmVudCwgd2Ugb25seSBsaXN0ZW4gdG8gRU5URVIgYW5kIFNQQUNFQkFSIGtleS5cbiAgICAgIGlmICh0eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdFbnRlcicgJiYga2V5ICE9PSAnICcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSB3aWxsIGNhbGwgcGVyZm9ybUNhcmRBY3Rpb24gaWYgZWl0aGVyOlxuICAgICAgLy8gMS4gV2UgYXJlIG9uIHRoZSB0YXJnZXQsIG9yXG4gICAgICAvLyAyLiBUaGUgZXZlbnQtZGlzcGF0Y2hpbmcgZWxlbWVudCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgIGlmICh0YXJnZXQgIT09IGFkYXB0aXZlQ2FyZFJvb3QpIHtcbiAgICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleCh0YXJnZXQpO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGNsaWNraW5nIG9uIHNvbWV0aGluZyB0aGF0IGlzIGFscmVhZHkgY2xpY2thYmxlLCBkbyBub3QgYWxsb3cgdGhlbSB0byBjbGljayB0aGUgY2FyZC5cbiAgICAgICAgLy8gRS5nLiBhIGhlcm8gY2FyZCBjYW4gYmUgdGFwcGFibGUsIGFuZCBpbWFnZSBhbmQgYnV0dG9ucyBpbnNpZGUgdGhlIGhlcm8gY2FyZCBjYW4gYWxzbyBiZSB0YXBwYWJsZS5cbiAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwZXJmb3JtQ2FyZEFjdGlvbih0YXBBY3Rpb24pO1xuICAgICAgc2Nyb2xsVG9FbmQoKTtcbiAgICB9LFxuICAgIFtjb250ZW50UmVmLCBwZXJmb3JtQ2FyZEFjdGlvbiwgc2Nyb2xsVG9FbmQsIHRhcEFjdGlvbl1cbiAgKTtcblxuICAvLyBPbmx5IGxpc3RlbiB0byBldmVudCBpZiBpdCBpcyBub3QgZGlzYWJsZWQgYW5kIGhhdmUgXCJ0YXBBY3Rpb25cIiBwcm9wLlxuICBjb25zdCBoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uID0gIWRpc2FibGVkICYmIHRhcEFjdGlvbiA/IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3MgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYWRkQWN0aW9uc1BlcmZvcm1lZCA9IHVzZUNhbGxiYWNrKFxuICAgIGFjdGlvbiA9PiAhfmFjdGlvbnNQZXJmb3JtZWQuaW5kZXhPZihhY3Rpb24pICYmIHNldEFjdGlvbnNQZXJmb3JtZWQoWy4uLmFjdGlvbnNQZXJmb3JtZWQsIGFjdGlvbl0pLFxuICAgIFthY3Rpb25zUGVyZm9ybWVkLCBzZXRBY3Rpb25zUGVyZm9ybWVkXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUV4ZWN1dGVBY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhY3Rpb24gPT4ge1xuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSBpbWFnZSwgY2Fubm90IGJlIGRpc2FibGVkIHRocnUgRE9NIGF0dHJpYnV0ZXNcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFkZEFjdGlvbnNQZXJmb3JtZWQoYWN0aW9uKTtcblxuICAgICAgY29uc3QgYWN0aW9uVHlwZU5hbWUgPSBhY3Rpb24uZ2V0SnNvblR5cGVOYW1lKCk7XG5cbiAgICAgIGlmIChhY3Rpb25UeXBlTmFtZSA9PT0gJ0FjdGlvbi5PcGVuVXJsJykge1xuICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7XG4gICAgICAgICAgdHlwZTogJ29wZW5VcmwnLFxuICAgICAgICAgIHZhbHVlOiBhY3Rpb24udXJsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChhY3Rpb25UeXBlTmFtZSA9PT0gJ0FjdGlvbi5TdWJtaXQnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgY29uc3QgeyBkYXRhOiBhY3Rpb25EYXRhIH0gPSBhY3Rpb247XG5cbiAgICAgICAgICBpZiAoYWN0aW9uRGF0YSAmJiBhY3Rpb25EYXRhLl9faXNCb3RGcmFtZXdvcmtDYXJkQWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCB7IGNhcmRBY3Rpb24gfSA9IGFjdGlvbkRhdGE7XG4gICAgICAgICAgICBjb25zdCB7IGRpc3BsYXlUZXh0LCB0ZXh0LCB0eXBlLCB2YWx1ZSB9ID0gY2FyZEFjdGlvbjtcblxuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oeyBkaXNwbGF5VGV4dCwgdGV4dCwgdHlwZSwgdmFsdWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHtcbiAgICAgICAgICAgICAgdHlwZTogdHlwZW9mIGFjdGlvbi5kYXRhID09PSAnc3RyaW5nJyA/ICdpbUJhY2snIDogJ3Bvc3RCYWNrJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGFjdGlvbi5kYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY3JvbGxUb0VuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2ViIENoYXQ6IHJlY2VpdmVkIHVua25vd24gYWN0aW9uIGZyb20gQWRhcHRpdmUgQ2FyZHNgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihhY3Rpb24pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZEFjdGlvbnNQZXJmb3JtZWQsIGRpc2FibGVkLCBwZXJmb3JtQ2FyZEFjdGlvbiwgc2Nyb2xsVG9FbmRdXG4gICk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IGN1cnJlbnQgfSA9IGNvbnRlbnRSZWY7XG5cbiAgICBpZiAoIWN1cnJlbnQgfHwgIWFkYXB0aXZlQ2FyZCkge1xuICAgICAgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgIGlucHV0VmFsdWVzUmVmLmN1cnJlbnQgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDdXJyZW50bHksIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIE1hcmtkb3duIGVuZ2luZSBpcyB0byBzZXQgaXQgdGhydSBzdGF0aWMgbWVtYmVyIG9mIEFkYXB0aXZlQ2FyZCBjbGFzc1xuXG4gICAgLy8gVE9ETzogW1AzXSBDaGVja3MgaWYgd2UgY291bGQgbWFrZSB0aGUgXCJyZW5kZXJNYXJrZG93bkFzSFRNTFwiIHBlciBjYXJkXG4gICAgLy8gICAgICAgVGhpcyBjb3VsZCBiZSBsaW1pdGF0aW9ucyBmcm9tIEFkYXB0aXZlIENhcmRzIHBhY2thZ2UgKG5vdCBzdXBwb3J0ZWQgYXMgb2YgMS4yLjUpXG4gICAgLy8gICAgICAgQmVjYXVzZSB0aGVyZSBjb3VsZCBiZSB0aW1pbmcgZGlmZmVyZW5jZSBiZXR3ZWVuIC5wYXJzZSBhbmQgLnJlbmRlciwgd2UgY291bGQgYmUgdXNpbmcgd3JvbmcgTWFya2Rvd24gZW5naW5lXG5cbiAgICBhZGFwdGl2ZUNhcmQuY29uc3RydWN0b3Iub25Qcm9jZXNzTWFya2Rvd24gPSAodGV4dCwgcmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVuZGVyTWFya2Rvd25Bc0hUTUwpIHtcbiAgICAgICAgcmVzdWx0Lm91dHB1dEh0bWwgPSByZW5kZXJNYXJrZG93bkFzSFRNTCh0ZXh0KTtcbiAgICAgICAgcmVzdWx0LmRpZFByb2Nlc3MgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoYWRhcHRpdmVDYXJkc0hvc3RDb25maWcpIHtcbiAgICAgIGFkYXB0aXZlQ2FyZC5ob3N0Q29uZmlnID0gaXNQbGFpbk9iamVjdChhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZylcbiAgICAgICAgPyBuZXcgSG9zdENvbmZpZyhhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZylcbiAgICAgICAgOiBhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZztcbiAgICB9XG5cbiAgICAvLyBGb3IgYWNjZXNzaWJpbGl0eSBpc3N1ZSAjMTM0MCwgYHRhYmluZGV4PVwiMFwiYCBtdXN0IG5vdCBiZSBzZXQgZm9yIHRoZSByb290IGNvbnRhaW5lciBpZiBpdCBpcyBub3QgaW50ZXJhY3RpdmUuXG4gICAgR2xvYmFsU2V0dGluZ3Muc2V0VGFiSW5kZXhBdENhcmRSb290ID0gISF0YXBBY3Rpb247XG5cbiAgICBjb25zdCB7IHZhbGlkYXRpb25FdmVudHMgfSA9IGFkYXB0aXZlQ2FyZC52YWxpZGF0ZVByb3BlcnRpZXMoKTtcblxuICAgIGlmICh2YWxpZGF0aW9uRXZlbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyh2YWxpZGF0aW9uRXZlbnRzLnJlZHVjZSgoaXRlbXMsIHsgbWVzc2FnZSB9KSA9PiBbLi4uaXRlbXMsIG5ldyBFcnJvcihtZXNzYWdlKV0sIFtdKSk7XG4gICAgfVxuXG4gICAgbGV0IGVsZW1lbnQ7XG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudCA9IGFkYXB0aXZlQ2FyZC5yZW5kZXIoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyhbZXJyb3JdKTtcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBzZXRFcnJvcnMoW25ldyBFcnJvcignQWRhcHRpdmUgQ2FyZCByZW5kZXJlZCBhcyBlbXB0eSBlbGVtZW50JyldKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBlcnJvcnMgb24gbmV4dCByZW5kZXJcbiAgICBzZXRFcnJvcnMoW10pO1xuXG4gICAgcmVzdG9yZUlucHV0VmFsdWVzKGVsZW1lbnQsIGlucHV0VmFsdWVzUmVmLmN1cnJlbnQpO1xuXG4gICAgY3VycmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQgPSBlbGVtZW50O1xuXG4gICAgLy8gRm9jdXMgY2FuIG9ubHkgYmUgcmVzdG9yZWQgYWZ0ZXIgdGhlIERPTSBpcyBhdHRhY2hlZC5cbiAgICByZXN0b3JlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQsIGFjdGl2ZUVsZW1lbnRJbmRleFJlZi5jdXJyZW50KTtcblxuICAgIHNldExhc3RSZW5kZXIoRGF0ZS5ub3coKSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQgPSBzYXZlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQpO1xuICAgICAgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCA9IHNhdmVJbnB1dFZhbHVlcyhlbGVtZW50KTtcblxuICAgICAgY3VycmVudC5yZW1vdmVDaGlsZChhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpO1xuXG4gICAgICBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgfSwgW1xuICAgIGFkYXB0aXZlQ2FyZCxcbiAgICBhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZyxcbiAgICBjb250ZW50UmVmLFxuICAgIEdsb2JhbFNldHRpbmdzLFxuICAgIEhvc3RDb25maWcsXG4gICAgcmVuZGVyTWFya2Rvd25Bc0hUTUwsXG4gICAgc2V0RXJyb3JzLFxuICAgIHRhcEFjdGlvblxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIFNldCBvbkV4ZWN1dGVBY3Rpb24gd2l0aG91dCBjYXVzaW5nIHVubmVjZXNzYXJ5IHJlLXJlbmRlci5cbiAgICBhZGFwdGl2ZUNhcmQub25FeGVjdXRlQWN0aW9uID0gZGlzYWJsZWQgPyB1bmRlZmluZWQgOiBoYW5kbGVFeGVjdXRlQWN0aW9uO1xuICB9LCBbYWRhcHRpdmVDYXJkLCBkaXNhYmxlZCwgaGFuZGxlRXhlY3V0ZUFjdGlvbl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBmaXhBY2Nlc3NpYmlsaXR5SXNzdWVzV2l0aFVuZG8oYWRhcHRpdmVDYXJkRWxlbWVudFJlZi5jdXJyZW50KSwgW2FkYXB0aXZlQ2FyZEVsZW1lbnRSZWYsIGxhc3RSZW5kZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIElmIHRoZSBBZGFwdGl2ZSBDYXJkIGdldCByZS1yZW5kZXJlZCwgcmUtZGlzYWJsZSBlbGVtZW50cyBhcyBuZWVkZWQuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyhhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgfSwgW2FkYXB0aXZlQ2FyZEVsZW1lbnRSZWYsIGRpc2FibGVkLCBsYXN0UmVuZGVyXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBJZiB0aGUgQWRhcHRpdmUgQ2FyZCBjaGFuZ2VkLCByZXNldCBhbGwgYWN0aW9ucyBwZXJmb3JtZWQuXG4gICAgc2V0QWN0aW9uc1BlcmZvcm1lZChbXSk7XG4gIH0sIFthZGFwdGl2ZUNhcmRdKTtcblxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT5cbiAgICAgIGluZGljYXRlQWN0aW9uU2VsZWN0aW9uV2l0aFVuZG8oXG4gICAgICAgIC8vIEFjdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBcInJlbmRlcmVkRWxlbWVudFwiIG1lYW5zIGl0IGlzIHRoZSBBZGFwdGl2ZSBDYXJkIGl0c2VsZiwgc3VjaCBhcyBcInNlbGVjdEFjdGlvblwiIChBQykgb3IgXCJ0YXBBY3Rpb25cIiAocmljaCBjYXJkcykuXG4gICAgICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRvIG1hcmsgdGhlIHdob2xlIGNhcmQgYXMgcGVyZm9ybWVkLlxuICAgICAgICBhY3Rpb25zUGVyZm9ybWVkLm1hcCgoeyByZW5kZXJlZEVsZW1lbnQgfSkgPT4gcmVuZGVyZWRFbGVtZW50KS5maWx0ZXIocmVuZGVyZWRFbGVtZW50ID0+IHJlbmRlcmVkRWxlbWVudCksXG4gICAgICAgIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZVxuICAgICAgKSxcbiAgICBbYWN0aW9uc1BlcmZvcm1lZCwgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lLCBsYXN0UmVuZGVyXVxuICApO1xuXG4gIHJldHVybiBlcnJvcnMubGVuZ3RoID8gKFxuICAgIG5vZGVfZW52ID09PSAnZGV2ZWxvcG1lbnQnICYmIDxFcnJvckJveCBlcnJvcj17ZXJyb3JzWzBdfSB0eXBlPXtsb2NhbGl6ZSgnQURBUFRJVkVfQ0FSRF9FUlJPUl9CT1hfVElUTEVfUkVOREVSJyl9IC8+XG4gICkgOiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgKyAnJywgJ3dlYmNoYXRfX2FkYXB0aXZlLWNhcmQtcmVuZGVyZXInKX1cbiAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb259XG4gICAgICBvbktleVByZXNzPXtoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9ufVxuICAgICAgcmVmPXtjb250ZW50UmVmfVxuICAgIC8+XG4gICk7XG59O1xuXG5BZGFwdGl2ZUNhcmRSZW5kZXJlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZTogJycsXG4gIGRpc2FibGVkOiB1bmRlZmluZWQsXG4gIHRhcEFjdGlvbjogdW5kZWZpbmVkXG59O1xuXG5BZGFwdGl2ZUNhcmRSZW5kZXJlci5wcm9wVHlwZXMgPSB7XG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgYWRhcHRpdmVDYXJkOiBQcm9wVHlwZXMuYW55LmlzUmVxdWlyZWQsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgdGFwQWN0aW9uOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZ1xuICB9KVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWRhcHRpdmVDYXJkUmVuZGVyZXI7XG4iXX0=
|
|
734
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIudHN4Il0sIm5hbWVzIjpbIkVycm9yQm94IiwiQ29tcG9uZW50cyIsInVzZURpc2FibGVkIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VQZXJmb3JtQ2FyZEFjdGlvbiIsInVzZVJlbmRlck1hcmtkb3duQXNIVE1MIiwidXNlU2Nyb2xsVG9FbmQiLCJ1c2VTdHlsZVNldCIsIm5vZGVfZW52IiwiYnVuY2hVbmRvcyIsImZucyIsImZvckVhY2giLCJmbiIsImFkZENsYXNzIiwiZWxlbWVudCIsImNsYXNzTmFtZSIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiYWRkIiwiYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8iLCJvYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJvYnNlcnZlIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUZpbHRlciIsImNsYXNzTmFtZXMiLCJTZXQiLCJzcGxpdCIsImRlbGV0ZSIsIkFycmF5IiwiZnJvbSIsImpvaW4iLCJkaXNjb25uZWN0IiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwic2V0QXR0cmlidXRlV2l0aFVuZG8iLCJxdWFsaWZpZWROYW1lIiwibmV4dFZhbHVlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJkaXNhYmxlZEhhbmRsZXIiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyIsIm5hbWUiLCJoYW5kbGVyIiwiZGV0YWNoIiwiZGV0YWNoaW5nSGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyIsImRpc2FibGVFbGVtZW50V2l0aFVuZG8iLCJ1bmRvU3RhY2siLCJpc0FjdGl2ZSIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsInRhZyIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwibWFwIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvcHRpb24iLCJkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvIiwib2JzZXJ2ZVN1YnRyZWUiLCJtdXRhdGlvbnMiLCJhZGRlZE5vZGVzIiwiYWRkZWROb2RlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsImhhc0F0dHJpYnV0ZSIsInNldE9yUmVtb3ZlQXR0cmlidXRlIiwic2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyIsInByZXZWYWx1ZSIsImZpbmRBbmNlc3RvciIsInByZWRpY2F0ZSIsImN1cnJlbnQiLCJwYXJlbnRFbGVtZW50IiwiaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyIsInNlbGVjdGVkQWN0aW9uRWxlbWVudHMiLCJhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUiLCJsZW5ndGgiLCJzb21lIiwiYWN0aW9uRWxlbWVudCIsImNvbnNvbGUiLCJ3YXJuIiwiYWN0aW9uU2V0RWxlbWVudHMiLCJzZWxlY3RlZEFjdGlvbkVsZW1lbnQiLCJhY3Rpb25TZXRFbGVtZW50IiwiYW5jZXN0b3IiLCJpbmNsdWRlcyIsImZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyIsImFjdGlvbkJ1dHRvbiIsInVuZG8iLCJnZXRGb2N1c2FibGVFbGVtZW50cyIsImZpbHRlciIsInRhYkluZGV4IiwicmVzdG9yZUFjdGl2ZUVsZW1lbnRJbmRleCIsImFjdGl2ZUVsZW1lbnRJbmRleCIsImZvY3VzIiwic2F2ZUFjdGl2ZUVsZW1lbnRJbmRleCIsImluZGV4T2YiLCJyZXN0b3JlSW5wdXRWYWx1ZXMiLCJpbnB1dFZhbHVlcyIsImlucHV0cyIsImlucHV0IiwiaW5kZXgiLCJ0YWdOYW1lIiwidHlwZSIsImNoZWNrZWQiLCJzYXZlSW5wdXRWYWx1ZXMiLCJBZGFwdGl2ZUNhcmRSZW5kZXJlciIsImFkYXB0aXZlQ2FyZCIsImRpc2FibGVkRnJvbVByb3BzIiwiZGlzYWJsZWQiLCJ0YXBBY3Rpb24iLCJhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IiwiYWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJHbG9iYWxTZXR0aW5ncyIsIkhvc3RDb25maWciLCJhY3Rpb25zUGVyZm9ybWVkIiwic2V0QWN0aW9uc1BlcmZvcm1lZCIsImFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIiwiZGlzYWJsZWRGcm9tQ29tcG9zZXIiLCJlcnJvcnMiLCJzZXRFcnJvcnMiLCJsYXN0UmVuZGVyIiwic2V0TGFzdFJlbmRlciIsImFjdGl2ZUVsZW1lbnRJbmRleFJlZiIsImFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYiLCJjb250ZW50UmVmIiwiaW5wdXRWYWx1ZXNSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3MiLCJrZXkiLCJ0YXJnZXQiLCJhZGFwdGl2ZUNhcmRSb290IiwicXVlcnlTZWxlY3RvciIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJhZGRBY3Rpb25zUGVyZm9ybWVkIiwiYWN0aW9uIiwiaGFuZGxlRXhlY3V0ZUFjdGlvbiIsImFjdGlvblR5cGVOYW1lIiwiZ2V0SnNvblR5cGVOYW1lIiwiaW1hZ2UiLCJpY29uVXJsIiwidGl0bGUiLCJ1cmwiLCJkYXRhIiwiX19pc0JvdEZyYW1ld29ya0NhcmRBY3Rpb24iLCJjYXJkQWN0aW9uIiwiZXJyb3IiLCJjb25zdHJ1Y3RvciIsInRleHQiLCJyZXN1bHQiLCJvdXRwdXRIdG1sIiwiZGlkUHJvY2VzcyIsImhvc3RDb25maWciLCJzZXRUYWJJbmRleEF0Q2FyZFJvb3QiLCJ2YWxpZGF0ZVByb3BlcnRpZXMiLCJ2YWxpZGF0aW9uRXZlbnRzIiwicmVkdWNlIiwiaXRlbXMiLCJtZXNzYWdlIiwiRXJyb3IiLCJyZW5kZXIiLCJhcHBlbmRDaGlsZCIsIkRhdGUiLCJub3ciLCJyZW1vdmVDaGlsZCIsIm9uRXhlY3V0ZUFjdGlvbiIsInJlbmRlcmVkRWxlbWVudCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImFueSIsImlzUmVxdWlyZWQiLCJib29sIiwic2hhcGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVNBOztBQUVBOztBQUNBOztBQUNBOztBQVlBOztBQUNBOzs7Ozs7QUExQkE7QUE0QkEsSUFBUUEsUUFBUixHQUFxQkMsd0NBQXJCLENBQVFELFFBQVI7QUFDQSxJQUFRRSxXQUFSLEdBQWtIQyxtQ0FBbEgsQ0FBUUQsV0FBUjtBQUFBLElBQXFCRSxZQUFyQixHQUFrSEQsbUNBQWxILENBQXFCQyxZQUFyQjtBQUFBLElBQW1DQyxvQkFBbkMsR0FBa0hGLG1DQUFsSCxDQUFtQ0Usb0JBQW5DO0FBQUEsSUFBeURDLHVCQUF6RCxHQUFrSEgsbUNBQWxILENBQXlERyx1QkFBekQ7QUFBQSxJQUFrRkMsY0FBbEYsR0FBa0hKLG1DQUFsSCxDQUFrRkksY0FBbEY7QUFBQSxJQUFrR0MsV0FBbEcsR0FBa0hMLG1DQUFsSCxDQUFrR0ssV0FBbEc7QUFFQSxJQUFNQyxRQUFRLEdBQUcseUJBQWpCOztBQUlBLFNBQVNDLFVBQVQsR0FBMEQ7QUFBQSxvQ0FBbkNDLEdBQW1DO0FBQW5DQSxJQUFBQSxHQUFtQztBQUFBOztBQUN4RCxTQUFPO0FBQUEsV0FBTUEsR0FBRyxDQUFDQyxPQUFKLENBQVksVUFBQUMsRUFBRTtBQUFBLGFBQUlBLEVBQUosYUFBSUEsRUFBSix1QkFBSUEsRUFBRSxFQUFOO0FBQUEsS0FBZCxDQUFOO0FBQUEsR0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQSxTQUFTQyxRQUFULENBQWtCQyxPQUFsQixFQUF3Q0MsU0FBeEMsRUFBNkU7QUFD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WUFBWSxFQUFFa0UsbUJBQVVFLEdBQVYsQ0FBY0MsVUFGRztBQUcvQm5FLEVBQUFBLFFBQVEsRUFBRWdFLG1CQUFVSSxJQUhXO0FBSy9CO0FBQ0E7QUFDQW5FLEVBQUFBLFNBQVMsRUFBRStELG1CQUFVSyxLQUFWLENBQWdCO0FBQ3pCbkMsSUFBQUEsS0FBSyxFQUFFOEIsbUJBQVVDLE1BRFE7QUFFekI3QixJQUFBQSxLQUFLLEVBQUU0QixtQkFBVUMsTUFGUTtBQUd6QnZFLElBQUFBLElBQUksRUFBRXNFLG1CQUFVQyxNQUFWLENBQWlCRSxVQUhFO0FBSXpCckosSUFBQUEsS0FBSyxFQUFFa0osbUJBQVVDO0FBSlEsR0FBaEI7QUFQb0IsQ0FBakM7ZUFlZXBFLG9CIiwic291cmNlUm9vdCI6ImJ1bmRsZTovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTEsIDAsIDJdIH1dICovXG5cbmltcG9ydCB7XG4gIEFjdGlvbiBhcyBBZGFwdGl2ZUNhcmRBY3Rpb24sXG4gIEFkYXB0aXZlQ2FyZCxcbiAgSU1hcmtkb3duUHJvY2Vzc2luZ1Jlc3VsdCxcbiAgT3BlblVybEFjdGlvbixcbiAgU3VibWl0QWN0aW9uXG59IGZyb20gJ2FkYXB0aXZlY2FyZHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50cywgZ2V0VGFiSW5kZXgsIGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29tcG9uZW50JztcbmltcG9ydCB7IERpcmVjdExpbmVDYXJkQWN0aW9uIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29yZSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHtcbiAgS2V5Ym9hcmRFdmVudEhhbmRsZXIsXG4gIE1vdXNlRXZlbnRIYW5kbGVyLFxuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VMYXlvdXRFZmZlY3QsXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG4gIFZGQ1xufSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEJvdEZyYW1ld29ya0NhcmRBY3Rpb24gfSBmcm9tICcuL0FkYXB0aXZlQ2FyZEJ1aWxkZXInO1xuaW1wb3J0IHVzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIGZyb20gJy4uL2hvb2tzL3VzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnJztcbmltcG9ydCB1c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSBmcm9tICcuLi9ob29rcy91c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSc7XG5cbmNvbnN0IHsgRXJyb3JCb3ggfSA9IENvbXBvbmVudHM7XG5jb25zdCB7IHVzZURpc2FibGVkLCB1c2VMb2NhbGl6ZXIsIHVzZVBlcmZvcm1DYXJkQWN0aW9uLCB1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCwgdXNlU2Nyb2xsVG9FbmQsIHVzZVN0eWxlU2V0IH0gPSBob29rcztcblxuY29uc3Qgbm9kZV9lbnYgPSBwcm9jZXNzLmVudi5ub2RlX2VudiB8fCBwcm9jZXNzLmVudi5OT0RFX0VOVjtcblxudHlwZSBVbmRvRnVuY3Rpb24gPSAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGJ1bmNoVW5kb3MoLi4uZm5zOiBVbmRvRnVuY3Rpb25bXSk6IFVuZG9GdW5jdGlvbiB7XG4gIHJldHVybiAoKSA9PiBmbnMuZm9yRWFjaChmbiA9PiBmbj8uKCkpO1xufVxuXG4vKipcbiAqIEFkZHMgYSBjbGFzcyB0byB0aGUgYEhUTUxFbGVtZW50YC4gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNsYXNzIGlzIGFkZGVkLCBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiB0cnVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBjbGFzc0xpc3QgfSA9IGVsZW1lbnQ7XG5cbiAgaWYgKCFjbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkge1xuICAgIGNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQWRkcyBhIGNsYXNzIHRvIHRoZSBgSFRNTEVsZW1lbnRgIGFuZCByZS1hZGQgb24gbXV0YXRpb25zLlxuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgcmVzdG9yZSB0byBwcmV2aW91cyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8oZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsIGNsYXNzTmFtZTogc3RyaW5nKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkpIHtcbiAgICAvLyBBZnRlciB3ZSBhZGQgdGhlIGNsYXNzLCBrZWVwIG9ic2VydmluZyB0aGUgZWxlbWVudCB0byBtYWtlIHN1cmUgdGhlIGNsYXNzIGlzIG5vdCByZW1vdmVkLlxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSk7XG5cbiAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2NsYXNzJ10gfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IG5ldyBTZXQoZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKSk7XG5cbiAgICAgIGNsYXNzTmFtZXMuZGVsZXRlKGNsYXNzTmFtZSk7XG5cbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gQXJyYXkuZnJvbShjbGFzc05hbWVzKS5qb2luKCcgJyk7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgLCBpZiB0aGUgb2JqZWN0IGlzIGEgcGxhaW4gb2JqZWN0IGFuZCBub3QgYSBjbGFzcywgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5cbi8qKlxuICogU2V0cyBhbiBhdHRyaWJ1dGUuXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVXaXRoVW5kbyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gIHF1YWxpZmllZE5hbWU6IHN0cmluZyxcbiAgbmV4dFZhbHVlOiBzdHJpbmdcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7XG5cbiAgaWYgKHZhbHVlICE9PSBuZXh0VmFsdWUpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lLCBuZXh0VmFsdWUpO1xuXG4gICAgcmV0dXJuICgpID0+ICh2YWx1ZSA/IGVsZW1lbnQuc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIHZhbHVlKSA6IGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGV2ZW50IGhhbmRsZXIgZm9yIGRpc2FibGluZyBldmVudCBidWJibGluZyBhbmQgcHJvcGFnYXRpb24uXG4gKi9cbmNvbnN0IGRpc2FibGVkSGFuZGxlciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufTtcblxuLyoqXG4gKiBMaXN0ZW5zIHRvIGV2ZW50IG9uY2UuIFJldHVybnMgYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgc3RvcCBsaXN0ZW5pbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJPbmNlV2l0aFVuZG8oXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxuICBuYW1lOiBzdHJpbmcsXG4gIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXJcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QgKi9cbiAgbGV0IGRldGFjaDogKCkgPT4gdm9pZDtcbiAgY29uc3QgZGV0YWNoaW5nSGFuZGxlciA9IGV2ZW50ID0+IHtcbiAgICB0cnkge1xuICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCB7IG9uY2U6IHRydWUgfSwgc28gd2UgbmVlZCB0byBkZXRhY2ggbWFudWFsbHkuXG4gICAgICBkZXRhY2goKTtcbiAgICB9XG4gIH07XG5cbiAgZGV0YWNoID0gKCkgPT4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGRldGFjaGluZ0hhbmRsZXIpO1xuXG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBkZXRhY2hpbmdIYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgcmV0dXJuIGRldGFjaDtcbn1cblxuLyoqXG4gKiBMaXN0ZW5zIHRvIGV2ZW50LiBSZXR1cm5zIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHN0b3AgbGlzdGVuaW5nLlxuICovXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyV2l0aFVuZG8oXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxuICBuYW1lOiBzdHJpbmcsXG4gIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXJcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyKTtcblxuICByZXR1cm4gKCkgPT4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIpO1xufVxuXG4vKipcbiAqIERpc2FibGVzIGFuIGVsZW1lbnQgd2l0aCB1bmRvIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgcmVzdG9yZSB0byBwcmV2aW91cyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCk6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHVuZG9TdGFjazogVW5kb0Z1bmN0aW9uW10gPSBbXTtcbiAgY29uc3QgaXNBY3RpdmUgPSBlbGVtZW50ID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBjb25zdCB0YWcgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlZmF1bHQtY2FzZSAqL1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpKTtcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKFxuICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXJPbmNlV2l0aFVuZG8oZWxlbWVudCwgJ2JsdXInLCAoKSA9PlxuICAgICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJykge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChhZGRFdmVudExpc3RlbmVyV2l0aFVuZG8oZWxlbWVudCwgJ2NsaWNrJywgZGlzYWJsZWRIYW5kbGVyKSk7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICdyZWFkb25seScsICdyZWFkb25seScpKTtcbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChcbiAgICAgICAgICAuLi5bXS5tYXAuY2FsbChlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpLCBvcHRpb24gPT5cbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZVdpdGhVbmRvKG9wdGlvbiwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJylcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGJ1bmNoVW5kb3MoLi4udW5kb1N0YWNrKTtcbn1cblxuLyoqXG4gKiBEaXNhYmxlcyBhbGwgaW5wdXR0YWJsZSBkZXNjZW5kYW50cy5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50IHwgdW5kZWZpbmVkfSBlbGVtZW50IENvbnRhaW5lciBlbGVtZW50IHRvIHN0YXJ0IGxvb2tpbmcgZm9yIGlucHV0dGFibGUgZGVzY2VuZGFudHMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9ic2VydmVTdWJ0cmVlIGB0cnVlYCB0byBhcHBsaWVzIHRvIGFsbCBmdXR1cmUgaW5wdXR0YWJsZSBkZXNjZW5kYW50cywgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgcmVzdG9yZSB0byBwcmV2aW91cyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCwgb2JzZXJ2ZVN1YnRyZWUgPSB0cnVlKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdW5kb1N0YWNrOiAoKCkgPT4gdm9pZClbXSA9IFtdLm1hcC5jYWxsKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpLCBlbGVtZW50ID0+XG4gICAgZGlzYWJsZUVsZW1lbnRXaXRoVW5kbyhlbGVtZW50KVxuICApO1xuXG4gIGNvbnN0IHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBPbmx5IHNldCB0YWJpbmRleD1cIi0xXCIgb24gZm9jdXNhYmxlIGVsZW1lbnQuIE90aGVyd2lzZSwgd2Ugd2lsbCBtYWtlIDxkaXY+IGZvY3VzYWJsZSBieSBtb3VzZS5cbiAgKHRhZyA9PT0gJ2EnIHx8IHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSAmJlxuICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICd0YWJpbmRleCcsICctMScpKTtcblxuICBpZiAob2JzZXJ2ZVN1YnRyZWUpIHtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PlxuICAgICAgbXV0YXRpb25zLmZvckVhY2goKHsgYWRkZWROb2RlcyB9KSA9PlxuICAgICAgICB1bmRvU3RhY2sucHVzaCguLi5bXS5tYXAuY2FsbChhZGRlZE5vZGVzLCBhZGRlZE5vZGUgPT4gZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyhhZGRlZE5vZGUsIGZhbHNlKSkpXG4gICAgICApXG4gICAgKTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICB1bmRvU3RhY2sucHVzaCgoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KCkpO1xuICB9XG5cbiAgcmV0dXJuIGJ1bmNoVW5kb3MoLi4udW5kb1N0YWNrKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50LlxuICpcbiAqIEByZXR1cm5zIHtmYWxzZSB8IHN0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIGBmYWxzZWAgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgbm90IHNldC5cbiAqL1xuZnVuY3Rpb24gZ2V0QXR0cmlidXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBxdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBmYWxzZSB8IHN0cmluZyB7XG4gIHJldHVybiAhIWVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgJiYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8ICcnKTtcbn1cblxuLyoqXG4gKiBTZXRzIG9yIHJlbW92ZXMgYW4gYXR0cmlidXRlIGZyb20gYW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc2V0IG9yIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7ZmFsc2UgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIFdoZW4gcGFzc2luZyBgZmFsc2VgLCByZW1vdmUgdGhlIGF0dHJpYnV0ZS5cbiAqL1xuZnVuY3Rpb24gc2V0T3JSZW1vdmVBdHRyaWJ1dGUoZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsIHF1YWxpZmllZE5hbWU6IHN0cmluZywgdmFsdWU6IGZhbHNlIHwgc3RyaW5nKTogdm9pZCB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICBlbGVtZW50Py5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudD8uc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldHMgb3IgcmVtb3ZlcyBhbiBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50IHdpdGggYW4gdW5kbyBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc2V0IG9yIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7ZmFsc2UgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIFdoZW4gcGFzc2luZyBgZmFsc2VgLCByZW1vdmUgdGhlIGF0dHJpYnV0ZS5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gIHF1YWxpZmllZE5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IGZhbHNlIHwgc3RyaW5nXG4pOiBVbmRvRnVuY3Rpb24ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwcmV2VmFsdWUgPSBnZXRBdHRyaWJ1dGUoZWxlbWVudCwgcXVhbGlmaWVkTmFtZSk7XG5cbiAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgcXVhbGlmaWVkTmFtZSwgdmFsdWUpO1xuXG4gIHJldHVybiAoKSA9PiBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lLCBwcmV2VmFsdWUpO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBhbmNlc3RvciB0aGF0IGZ1bGZpbGwgdGhlIHByZWRpY2F0ZS5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIHN0YXJ0aW5nIGVsZW1lbnQuIFRoaXMgZWxlbWVudCB3aWxsIG5vdCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIHByZWRpY2F0ZS5cbiAqIEBwYXJhbSB7KGFuY2VzdG9yOiBIVE1MRWxlbWVudCkgPT4gYm9vbGVhbn0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSB0byBmdWxmaWxsLlxuICpcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IHVuZGVmaW5lZH0gVGhlIGZpcnN0IGFuY2VzdG9yIHRoYXQgZnVsZmlsbCB0aGUgcHJlZGljYXRlLCBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBmaW5kQW5jZXN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQsIHByZWRpY2F0ZTogKGFuY2VzdG9yOiBIVE1MRWxlbWVudCkgPT4gYm9vbGVhbik6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQgPSBlbGVtZW50O1xuXG4gIHdoaWxlICgoY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudCkpIHtcbiAgICBpZiAocHJlZGljYXRlLmNhbGwoZWxlbWVudCwgY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgYWN0aW9uIHNlbGVjdGVkIGJ5IHBlcmZvcm1pbmcgYSBzZXJpZXMgb2YgbWFuaXB1bGF0aW9ucywgd2l0aCB1bmRvOlxuICpcbiAqIC0gQWNjZXNzaWJpbGl0eTogc2V0IGBhcmlhLXByZXNzZWRgIHRvIGB0cnVlYFxuICogLSBBcHBsaWVzIGBzdHlsZU9wdGlvbnMuYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lYFxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXX0gc2VsZWN0ZWRBY3Rpb25FbGVtZW50cyAtIEFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHJlcHJlc2VudGluZyB0aGUgYWN0aW9uIGFuZCBpcyBzZWxlY3RlZC5cbiAqIEBwYXJhbSB7c3RyaW5nP30gYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGFwcGx5IHRvIGFsbCBlbGVtZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyhcbiAgc2VsZWN0ZWRBY3Rpb25FbGVtZW50czogSFRNTEVsZW1lbnRbXSB8IHVuZGVmaW5lZCxcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lPzogc3RyaW5nXG4pOiBVbmRvRnVuY3Rpb24ge1xuICBpZiAoIXNlbGVjdGVkQWN0aW9uRWxlbWVudHM/Lmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFZlcmlmeSBhbGwgaW5wdXQgZWxlbWVudHMgYXJlIFwiYWMtcHVzaEJ1dHRvblwiLCBjb3VsZCBiZWxvbmdzIHRvIEFjdGlvblNldCBvciBcImNhcmQgYWN0aW9uc1wiLlxuICBpZiAoc2VsZWN0ZWRBY3Rpb25FbGVtZW50cy5zb21lKGFjdGlvbkVsZW1lbnQgPT4gIWFjdGlvbkVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhYy1wdXNoQnV0dG9uJykpKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBDYW5ub3QgbWFyayBzZWxlY3RlZCBhY3Rpb24gaW4gdGhlIGNhcmQsIHNvbWUgZWxlbWVudHMgYXJlIG5vdCBhbiBcImFjLXB1c2hCdXR0b25cIi4nXG4gICAgKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEEgZGlzdGluY3Qgc2V0IG9mIGFjdGlvbiBzZXQgY29udGFpbmVycyB3aGljaCBoYXMgc2VsZWN0aW9ucywgZXhjbHVkaW5nIGNvbnRhaW5lcnMgd2l0aG91dCBhY3Rpb25zLlxuICAvLyBNdWx0aXBsZSBzdWJtaXNzaW9uIGluIGFuIEFkYXB0aXZlIENhcmQgaXMgc3RpbGwgYSB2YWd1ZSBhcmVhIGFuZCBUQkQuXG4gIC8vIFdlIG1pZ2h0IHdhbnQgdG8gZGlzYWJsZSB0aGUgd2hvbGUgY2FyZCwganVzdCBidXR0b25zIGluIHNhbWUgY29udGFpbmVyLCBvciBkbyBub3RoaW5nICh0b2RheSkuXG4gIGNvbnN0IGFjdGlvblNldEVsZW1lbnRzID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICBzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLmZvckVhY2goc2VsZWN0ZWRBY3Rpb25FbGVtZW50ID0+IHtcbiAgICBjb25zdCBhY3Rpb25TZXRFbGVtZW50ID0gZmluZEFuY2VzdG9yKFxuICAgICAgc2VsZWN0ZWRBY3Rpb25FbGVtZW50LFxuICAgICAgYW5jZXN0b3IgPT4gYW5jZXN0b3IuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdtZW51YmFyJ1xuICAgICk7XG5cbiAgICBhY3Rpb25TZXRFbGVtZW50ICYmIGFjdGlvblNldEVsZW1lbnRzLmFkZChhY3Rpb25TZXRFbGVtZW50KTtcbiAgfSk7XG5cbiAgY29uc3QgdW5kb1N0YWNrOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIGFjdGlvblNldEVsZW1lbnRzLmZvckVhY2goYWN0aW9uU2V0RWxlbWVudCA9PiB7XG4gICAgLy8gUmVtb3ZlIFwicm9sZVwiIGZyb20gZXZlcnkgXCJhYy1hY3Rpb25TZXRcIiBjb250YWluZXIuXG4gICAgdW5kb1N0YWNrLnB1c2goc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhhY3Rpb25TZXRFbGVtZW50LCAncm9sZScsIGZhbHNlKSk7XG5cbiAgICAvLyBNb2RpZnkgXCJyb2xlXCIgb2YgZXZlcnkgYWN0aW9ucyBpbiB0aGUgY29udGFpbmVyLlxuICAgIEFycmF5LmZyb20oYWN0aW9uU2V0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWMtcHVzaEJ1dHRvbicpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+KS5mb3JFYWNoKFxuICAgICAgYWN0aW9uRWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLmluY2x1ZGVzKGFjdGlvbkVsZW1lbnQpKSB7XG4gICAgICAgICAgLy8gQWRkIFwiYXJpYS1wcmVzc2VkXCIgYW5kIHNldCBcInJvbGVcIiBhdHRyaWJ1dGUgdG8gXCJidXR0b25cIiAod2hpY2ggaXMgcmVxdWlyZWQgYnkgXCJhcmlhLXByZXNzZWRcIikuXG4gICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhhY3Rpb25FbGVtZW50LCAnYXJpYS1wcmVzc2VkJywgJ3RydWUnKSk7XG4gICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhhY3Rpb25FbGVtZW50LCAncm9sZScsICdidXR0b24nKSk7XG5cbiAgICAgICAgICAvLyBIaWdobGlnaHQgYWN0aW9ucyBieSBhcHBseWluZyBgc3R5bGVPcHRpb25zLmFjdGlvblBlcmZvcm1lZENsYXNzTmFtZWAuXG4gICAgICAgICAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lICYmXG4gICAgICAgICAgICB1bmRvU3RhY2sucHVzaChhZGRQZXJzaXN0ZW50Q2xhc3NXaXRoVW5kbyhhY3Rpb25FbGVtZW50LCBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSByZW1vdmVkIFwicm9sZT1tZW51YmFyXCIgZnJvbSB0aGUgY29udGFpbmVyLCB3ZSBtdXN0IHJlbW92ZSBcInJvbGU9bWVudWl0ZW1cIiBmcm9tIHVuc2VsZWN0ZWQgYWN0aW9ucy5cbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdyb2xlJywgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiBidW5jaFVuZG9zKC4uLnVuZG9TdGFjayk7XG59XG5cbi8qKlxuICogRml4ZXMgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgZnJvbSBBZGFwdGl2ZSBDYXJkLCB3aXRoIHVuZG8uXG4gKlxuICogQHJldHVybnMgeygpID0+IHZvaWR9IFRoZSB1bmRvIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCB1bmRvIGFsbCBtYW5pcHVsYXRpb25zIGJ5IHJlc3RvcmluZyB2YWx1ZXMgcmVjb3JkZWQgYXQgdGhlIHRpbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZXNlIGhhY2tzIHNob3VsZCBiZSBkb25lIGluIEFkYXB0aXZlIENhcmRzIGxpYnJhcnkgaW5zdGVhZC5cbiAgLy8gUmVsYXRlZCB0byAjMzk0OTogQWxsIGFjdGlvbiBidXR0b25zIGluc2lkZSByb2xlPVwibWVudWJhclwiIHNob3VsZCBiZSByb2xlPVwibWVudWl0ZW1cIi5cbiAgY29uc3QgdW5kb1N0YWNrOiBVbmRvRnVuY3Rpb25bXSA9IEFycmF5LmZyb20oXG4gICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWMtYWN0aW9uU2V0W3JvbGU9XCJtZW51YmFyXCJdIFtyb2xlPVwiYnV0dG9uXCJdJykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD5cbiAgKS5tYXAoYWN0aW9uQnV0dG9uID0+IHNldEF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkJ1dHRvbiwgJ3JvbGUnLCAnbWVudWl0ZW0nKSk7XG5cbiAgcmV0dXJuICgpID0+IHVuZG9TdGFjay5mb3JFYWNoKHVuZG8gPT4gdW5kbz8uKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICByZXR1cm4gW10uZmlsdGVyLmNhbGwoXG4gICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgW1xuICAgICAgICAnYScsXG4gICAgICAgICdib2R5JyxcbiAgICAgICAgJ2J1dHRvbicsXG4gICAgICAgICdmcmFtZScsXG4gICAgICAgICdpZnJhbWUnLFxuICAgICAgICAnaW1nJyxcbiAgICAgICAgJ2lucHV0JyxcbiAgICAgICAgJ2lzaW5kZXgnLFxuICAgICAgICAnb2JqZWN0JyxcbiAgICAgICAgJ3NlbGVjdCcsXG4gICAgICAgICd0ZXh0YXJlYScsXG4gICAgICAgICdbdGFiaW5kZXhdJ1xuICAgICAgXS5qb2luKCcsICcpXG4gICAgKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PixcbiAgICBlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgoZWxlbWVudCk7XG5cbiAgICAgIHJldHVybiB0eXBlb2YgdGFiSW5kZXggPT09ICdudW1iZXInICYmIHRhYkluZGV4ID49IDA7XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhY3RpdmVFbGVtZW50SW5kZXg6IG51bWJlcikge1xuICBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KVsrYWN0aXZlRWxlbWVudEluZGV4XT8uZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gc2F2ZUFjdGl2ZUVsZW1lbnRJbmRleChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICByZXR1cm4gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoZWxlbWVudCkuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gcmVzdG9yZUlucHV0VmFsdWVzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpbnB1dFZhbHVlczogKGJvb2xlYW4gfCBzdHJpbmcpW10pIHtcbiAgY29uc3QgaW5wdXRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpIGFzIE5vZGVMaXN0T2Y8XG4gICAgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICA+O1xuXG4gIFtdLmZvckVhY2guY2FsbChpbnB1dHMsIChpbnB1dDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gaW5wdXRWYWx1ZXNbK2luZGV4XTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCB7IHRhZ05hbWUsIHR5cGUgfSA9IGlucHV0O1xuXG4gICAgICBpZiAodGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAoaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzYXZlSW5wdXRWYWx1ZXMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiAoYm9vbGVhbiB8IHN0cmluZylbXSB7XG4gIGNvbnN0IGlucHV0cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKSBhcyBOb2RlTGlzdE9mPFxuICAgIEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MU2VsZWN0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnRcbiAgPjtcblxuICByZXR1cm4gW10ubWFwLmNhbGwoaW5wdXRzLCAoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MU2VsZWN0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQpID0+IHtcbiAgICBjb25zdCB7IHR5cGUgfSA9IGlucHV0O1xuXG4gICAgaWYgKGlucHV0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJykpIHtcbiAgICAgIHJldHVybiAoaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXQudmFsdWU7XG4gIH0pO1xufVxuXG50eXBlIEFkYXB0aXZlQ2FyZFJlbmRlcmVyUHJvcHMgPSB7XG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZT86IHN0cmluZztcbiAgYWRhcHRpdmVDYXJkOiBBZGFwdGl2ZUNhcmQ7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdGFwQWN0aW9uPzogRGlyZWN0TGluZUNhcmRBY3Rpb247XG59O1xuXG5jb25zdCBBZGFwdGl2ZUNhcmRSZW5kZXJlcjogVkZDPEFkYXB0aXZlQ2FyZFJlbmRlcmVyUHJvcHM+ID0gKHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lLFxuICBhZGFwdGl2ZUNhcmQsXG4gIGRpc2FibGVkOiBkaXNhYmxlZEZyb21Qcm9wcyxcbiAgdGFwQWN0aW9uXG59KSA9PiB7XG4gIGNvbnN0IFt7IGFkYXB0aXZlQ2FyZFJlbmRlcmVyOiBhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IH1dID0gdXNlU3R5bGVTZXQoKTtcbiAgY29uc3QgW3sgR2xvYmFsU2V0dGluZ3MsIEhvc3RDb25maWcgfV0gPSB1c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSgpO1xuICBjb25zdCBbYWN0aW9uc1BlcmZvcm1lZCwgc2V0QWN0aW9uc1BlcmZvcm1lZF0gPSB1c2VTdGF0ZTxBZGFwdGl2ZUNhcmRBY3Rpb25bXT4oW10pO1xuICBjb25zdCBbYWRhcHRpdmVDYXJkc0hvc3RDb25maWddID0gdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcoKTtcbiAgY29uc3QgW2Rpc2FibGVkRnJvbUNvbXBvc2VyXSA9IHVzZURpc2FibGVkKCk7XG4gIGNvbnN0IFtlcnJvcnMsIHNldEVycm9yc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtsYXN0UmVuZGVyLCBzZXRMYXN0UmVuZGVyXSA9IHVzZVN0YXRlKDApO1xuICBjb25zdCBhY3RpdmVFbGVtZW50SW5kZXhSZWYgPSB1c2VSZWYoLTEpO1xuICBjb25zdCBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmID0gdXNlUmVmPEhUTUxFbGVtZW50PigpO1xuICBjb25zdCBjb250ZW50UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuICBjb25zdCBpbnB1dFZhbHVlc1JlZiA9IHVzZVJlZjwoYm9vbGVhbiB8IHN0cmluZylbXT4oW10pO1xuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCBwZXJmb3JtQ2FyZEFjdGlvbiA9IHVzZVBlcmZvcm1DYXJkQWN0aW9uKCk7XG4gIGNvbnN0IHJlbmRlck1hcmtkb3duQXNIVE1MID0gdXNlUmVuZGVyTWFya2Rvd25Bc0hUTUwoKTtcbiAgY29uc3Qgc2Nyb2xsVG9FbmQgPSB1c2VTY3JvbGxUb0VuZCgpO1xuXG4gIGNvbnN0IGRpc2FibGVkID0gZGlzYWJsZWRGcm9tQ29tcG9zZXIgfHwgZGlzYWJsZWRGcm9tUHJvcHM7XG5cbiAgLy8gVE9ETzogW1AyXSAjMzE5OSBXZSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYGFkYXB0aXZlQ2FyZC5zZWxlY3RBY3Rpb25gIGluc3RlYWQuXG4gIC8vIFRoZSBudWxsIGNoZWNrIGZvciBcInRhcEFjdGlvblwiIGlzIGluIFwiaGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvblwiLlxuICBjb25zdCBoYW5kbGVDbGlja0FuZEtleVByZXNzID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgeyBrZXksIHR5cGUgfSA9IGV2ZW50IGFzIEtleWJvYXJkRXZlbnQ7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQ7XG5cbiAgICAgIC8vIFNvbWUgaXRlbXMsIGUuZy4gdGFwcGFibGUgdGV4dCwgY2Fubm90IGJlIGRpc2FibGVkIHRocnUgRE9NIGF0dHJpYnV0ZXNcbiAgICAgIGNvbnN0IHsgY3VycmVudCB9ID0gY29udGVudFJlZjtcbiAgICAgIGNvbnN0IGFkYXB0aXZlQ2FyZFJvb3QgPSBjdXJyZW50LnF1ZXJ5U2VsZWN0b3IoJy5hYy1hZGFwdGl2ZUNhcmRbdGFiaW5kZXg9XCIwXCJdJyk7XG5cbiAgICAgIGlmICghYWRhcHRpdmVDYXJkUm9vdCkge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKFxuICAgICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm8gQWRhcHRpdmUgQ2FyZCByb290IGNvbnRhaW5lciBjYW4gYmUgZm91bmQ7IHRoZSBjYXJkIGlzIHByb2JhYmx5IG9uIGFuIHVuc3VwcG9ydGVkIEFkYXB0aXZlIENhcmQgdmVyc2lvbi4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBcImtleXByZXNzXCIgZXZlbnQsIHdlIG9ubHkgbGlzdGVuIHRvIEVOVEVSIGFuZCBTUEFDRUJBUiBrZXkuXG4gICAgICBpZiAodHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgICBpZiAoa2V5ICE9PSAnRW50ZXInICYmIGtleSAhPT0gJyAnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugd2lsbCBjYWxsIHBlcmZvcm1DYXJkQWN0aW9uIGlmIGVpdGhlcjpcbiAgICAgIC8vIDEuIFdlIGFyZSBvbiB0aGUgdGFyZ2V0LCBvclxuICAgICAgLy8gMi4gVGhlIGV2ZW50LWRpc3BhdGNoaW5nIGVsZW1lbnQgaXMgbm90IGludGVyYWN0aXZlXG4gICAgICBpZiAodGFyZ2V0ICE9PSBhZGFwdGl2ZUNhcmRSb290KSB7XG4gICAgICAgIGNvbnN0IHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgodGFyZ2V0KTtcblxuICAgICAgICAvLyBJZiB0aGUgdXNlciBpcyBjbGlja2luZyBvbiBzb21ldGhpbmcgdGhhdCBpcyBhbHJlYWR5IGNsaWNrYWJsZSwgZG8gbm90IGFsbG93IHRoZW0gdG8gY2xpY2sgdGhlIGNhcmQuXG4gICAgICAgIC8vIEUuZy4gYSBoZXJvIGNhcmQgY2FuIGJlIHRhcHBhYmxlLCBhbmQgaW1hZ2UgYW5kIGJ1dHRvbnMgaW5zaWRlIHRoZSBoZXJvIGNhcmQgY2FuIGFsc28gYmUgdGFwcGFibGUuXG4gICAgICAgIGlmICh0eXBlb2YgdGFiSW5kZXggPT09ICdudW1iZXInICYmIHRhYkluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGVyZm9ybUNhcmRBY3Rpb24odGFwQWN0aW9uKTtcbiAgICAgIHNjcm9sbFRvRW5kKCk7XG4gICAgfSxcbiAgICBbY29udGVudFJlZiwgcGVyZm9ybUNhcmRBY3Rpb24sIHNjcm9sbFRvRW5kLCB0YXBBY3Rpb25dXG4gICk7XG5cbiAgLy8gT25seSBsaXN0ZW4gdG8gZXZlbnQgaWYgaXQgaXMgbm90IGRpc2FibGVkIGFuZCBoYXZlIFwidGFwQWN0aW9uXCIgcHJvcC5cbiAgY29uc3QgaGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvbiA9ICFkaXNhYmxlZCAmJiB0YXBBY3Rpb24gPyBoYW5kbGVDbGlja0FuZEtleVByZXNzIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFkZEFjdGlvbnNQZXJmb3JtZWQgPSB1c2VDYWxsYmFjayhcbiAgICAoYWN0aW9uOiBBZGFwdGl2ZUNhcmRBY3Rpb24pOiB2b2lkID0+XG4gICAgICAhfmFjdGlvbnNQZXJmb3JtZWQuaW5kZXhPZihhY3Rpb24pICYmIHNldEFjdGlvbnNQZXJmb3JtZWQoWy4uLmFjdGlvbnNQZXJmb3JtZWQsIGFjdGlvbl0pLFxuICAgIFthY3Rpb25zUGVyZm9ybWVkLCBzZXRBY3Rpb25zUGVyZm9ybWVkXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUV4ZWN1dGVBY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICAoYWN0aW9uOiBBZGFwdGl2ZUNhcmRBY3Rpb24pOiB2b2lkID0+IHtcbiAgICAgIC8vIFNvbWUgaXRlbXMsIGUuZy4gdGFwcGFibGUgaW1hZ2UsIGNhbm5vdCBiZSBkaXNhYmxlZCB0aHJ1IERPTSBhdHRyaWJ1dGVzXG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhZGRBY3Rpb25zUGVyZm9ybWVkKGFjdGlvbik7XG5cbiAgICAgIGNvbnN0IGFjdGlvblR5cGVOYW1lID0gYWN0aW9uLmdldEpzb25UeXBlTmFtZSgpO1xuICAgICAgY29uc3QgeyBpY29uVXJsOiBpbWFnZSwgdGl0bGUgfSA9IGFjdGlvbjtcblxuICAgICAgLy8gV2UgY2Fubm90IHVzZSBcImluc3RhbmNlb2ZcIiBjaGVjayBoZXJlLCBiZWNhdXNlIHdlYiBkZXZzIG1heSBicmluZyB0aGVpciBvd24gdmVyc2lvbiBvZiBBZGFwdGl2ZSBDYXJkcyBwYWNrYWdlLlxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB1c2luZyBcImdldEpzb25UeXBlTmFtZSgpXCIgaW5zdGVhZC5cbiAgICAgIGlmIChhY3Rpb25UeXBlTmFtZSA9PT0gJ0FjdGlvbi5PcGVuVXJsJykge1xuICAgICAgICBjb25zdCB7IHVybDogdmFsdWUgfSA9IGFjdGlvbiBhcyBPcGVuVXJsQWN0aW9uO1xuXG4gICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHtcbiAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICB0eXBlOiAnb3BlblVybCcsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGFjdGlvblR5cGVOYW1lID09PSAnQWN0aW9uLlN1Ym1pdCcpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhY3Rpb24gYXMgU3VibWl0QWN0aW9uIGFzIHtcbiAgICAgICAgICBkYXRhOiBzdHJpbmcgfCBCb3RGcmFtZXdvcmtDYXJkQWN0aW9uO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7XG4gICAgICAgICAgICAgIGltYWdlLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgdHlwZTogJ2ltQmFjaycsXG4gICAgICAgICAgICAgIHZhbHVlOiBkYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuX19pc0JvdEZyYW1ld29ya0NhcmRBY3Rpb24pIHtcbiAgICAgICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKGRhdGEuY2FyZEFjdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHtcbiAgICAgICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICB0eXBlOiAncG9zdEJhY2snLFxuICAgICAgICAgICAgICB2YWx1ZTogZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2Nyb2xsVG9FbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFdlYiBDaGF0OiByZWNlaXZlZCB1bmtub3duIGFjdGlvbiBmcm9tIEFkYXB0aXZlIENhcmRzYCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZGRBY3Rpb25zUGVyZm9ybWVkLCBkaXNhYmxlZCwgcGVyZm9ybUNhcmRBY3Rpb24sIHNjcm9sbFRvRW5kXVxuICApO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgeyBjdXJyZW50IH0gPSBjb250ZW50UmVmO1xuXG4gICAgaWYgKCFjdXJyZW50IHx8ICFhZGFwdGl2ZUNhcmQpIHtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbmRleFJlZi5jdXJyZW50ID0gLTE7XG4gICAgICBpbnB1dFZhbHVlc1JlZi5jdXJyZW50ID0gW107XG4gICAgfVxuXG4gICAgLy8gQ3VycmVudGx5LCB0aGUgb25seSB3YXkgdG8gc2V0IHRoZSBNYXJrZG93biBlbmdpbmUgaXMgdG8gc2V0IGl0IHRocnUgc3RhdGljIG1lbWJlciBvZiBBZGFwdGl2ZUNhcmQgY2xhc3NcblxuICAgIC8vIFRPRE86IFtQM10gQ2hlY2tzIGlmIHdlIGNvdWxkIG1ha2UgdGhlIFwicmVuZGVyTWFya2Rvd25Bc0hUTUxcIiBwZXIgY2FyZFxuICAgIC8vICAgICAgIFRoaXMgY291bGQgYmUgbGltaXRhdGlvbnMgZnJvbSBBZGFwdGl2ZSBDYXJkcyBwYWNrYWdlIChub3Qgc3VwcG9ydGVkIGFzIG9mIDEuMi41KVxuICAgIC8vICAgICAgIEJlY2F1c2UgdGhlcmUgY291bGQgYmUgdGltaW5nIGRpZmZlcmVuY2UgYmV0d2VlbiAucGFyc2UgYW5kIC5yZW5kZXIsIHdlIGNvdWxkIGJlIHVzaW5nIHdyb25nIE1hcmtkb3duIGVuZ2luZVxuXG4gICAgLy8gXCJvblByb2Nlc3NNYXJrZG93blwiIGlzIGEgc3RhdGljIGZ1bmN0aW9uIGJ1dCB3ZSBhcmUgdHJ5aW5nIHRvIHNjb3BlIGl0IHRvIHRoZSBjdXJyZW50IG9iamVjdCBpbnN0ZWFkLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkb3Qtbm90YXRpb25cbiAgICBhZGFwdGl2ZUNhcmQuY29uc3RydWN0b3JbJ29uUHJvY2Vzc01hcmtkb3duJ10gPSAodGV4dDogc3RyaW5nLCByZXN1bHQ6IElNYXJrZG93blByb2Nlc3NpbmdSZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZW5kZXJNYXJrZG93bkFzSFRNTCkge1xuICAgICAgICByZXN1bHQub3V0cHV0SHRtbCA9IHJlbmRlck1hcmtkb3duQXNIVE1MKHRleHQpO1xuICAgICAgICByZXN1bHQuZGlkUHJvY2VzcyA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZykge1xuICAgICAgYWRhcHRpdmVDYXJkLmhvc3RDb25maWcgPSBpc1BsYWluT2JqZWN0KGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKVxuICAgICAgICA/IG5ldyBIb3N0Q29uZmlnKGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKVxuICAgICAgICA6IGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnO1xuICAgIH1cblxuICAgIC8vIEZvciBhY2Nlc3NpYmlsaXR5IGlzc3VlICMxMzQwLCBgdGFiaW5kZXg9XCIwXCJgIG11c3Qgbm90IGJlIHNldCBmb3IgdGhlIHJvb3QgY29udGFpbmVyIGlmIGl0IGlzIG5vdCBpbnRlcmFjdGl2ZS5cbiAgICBHbG9iYWxTZXR0aW5ncy5zZXRUYWJJbmRleEF0Q2FyZFJvb3QgPSAhIXRhcEFjdGlvbjtcblxuICAgIGNvbnN0IHsgdmFsaWRhdGlvbkV2ZW50cyB9ID0gYWRhcHRpdmVDYXJkLnZhbGlkYXRlUHJvcGVydGllcygpO1xuXG4gICAgaWYgKHZhbGlkYXRpb25FdmVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gc2V0RXJyb3JzKHZhbGlkYXRpb25FdmVudHMucmVkdWNlKChpdGVtcywgeyBtZXNzYWdlIH0pID0+IFsuLi5pdGVtcywgbmV3IEVycm9yKG1lc3NhZ2UpXSwgW10pKTtcbiAgICB9XG5cbiAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudCA9IGFkYXB0aXZlQ2FyZC5yZW5kZXIoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyhbZXJyb3JdKTtcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBzZXRFcnJvcnMoW25ldyBFcnJvcignQWRhcHRpdmUgQ2FyZCByZW5kZXJlZCBhcyBlbXB0eSBlbGVtZW50JyldKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBlcnJvcnMgb24gbmV4dCByZW5kZXJcbiAgICBzZXRFcnJvcnMoW10pO1xuXG4gICAgcmVzdG9yZUlucHV0VmFsdWVzKGVsZW1lbnQsIGlucHV0VmFsdWVzUmVmLmN1cnJlbnQpO1xuXG4gICAgY3VycmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQgPSBlbGVtZW50O1xuXG4gICAgLy8gRm9jdXMgY2FuIG9ubHkgYmUgcmVzdG9yZWQgYWZ0ZXIgdGhlIERPTSBpcyBhdHRhY2hlZC5cbiAgICByZXN0b3JlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQsIGFjdGl2ZUVsZW1lbnRJbmRleFJlZi5jdXJyZW50KTtcblxuICAgIHNldExhc3RSZW5kZXIoRGF0ZS5ub3coKSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQgPSBzYXZlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQpO1xuICAgICAgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCA9IHNhdmVJbnB1dFZhbHVlcyhlbGVtZW50KTtcblxuICAgICAgY3VycmVudC5yZW1vdmVDaGlsZChhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpO1xuXG4gICAgICBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgfSwgW1xuICAgIGFkYXB0aXZlQ2FyZCxcbiAgICBhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZyxcbiAgICBjb250ZW50UmVmLFxuICAgIEdsb2JhbFNldHRpbmdzLFxuICAgIEhvc3RDb25maWcsXG4gICAgcmVuZGVyTWFya2Rvd25Bc0hUTUwsXG4gICAgc2V0RXJyb3JzLFxuICAgIHRhcEFjdGlvblxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIFNldCBvbkV4ZWN1dGVBY3Rpb24gd2l0aG91dCBjYXVzaW5nIHVubmVjZXNzYXJ5IHJlLXJlbmRlci5cbiAgICBhZGFwdGl2ZUNhcmQub25FeGVjdXRlQWN0aW9uID0gZGlzYWJsZWQgPyB1bmRlZmluZWQgOiBoYW5kbGVFeGVjdXRlQWN0aW9uO1xuICB9LCBbYWRhcHRpdmVDYXJkLCBkaXNhYmxlZCwgaGFuZGxlRXhlY3V0ZUFjdGlvbl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBmaXhBY2Nlc3NpYmlsaXR5SXNzdWVzV2l0aFVuZG8oYWRhcHRpdmVDYXJkRWxlbWVudFJlZi5jdXJyZW50KSwgW2FkYXB0aXZlQ2FyZEVsZW1lbnRSZWYsIGxhc3RSZW5kZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIElmIHRoZSBBZGFwdGl2ZSBDYXJkIGdldCByZS1yZW5kZXJlZCwgcmUtZGlzYWJsZSBlbGVtZW50cyBhcyBuZWVkZWQuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyhhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgfSwgW2FkYXB0aXZlQ2FyZEVsZW1lbnRSZWYsIGRpc2FibGVkLCBsYXN0UmVuZGVyXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBJZiB0aGUgQWRhcHRpdmUgQ2FyZCBjaGFuZ2VkLCByZXNldCBhbGwgYWN0aW9ucyBwZXJmb3JtZWQuXG4gICAgc2V0QWN0aW9uc1BlcmZvcm1lZChbXSk7XG4gIH0sIFthZGFwdGl2ZUNhcmRdKTtcblxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT5cbiAgICAgIGluZGljYXRlQWN0aW9uU2VsZWN0aW9uV2l0aFVuZG8oXG4gICAgICAgIC8vIEFjdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBcInJlbmRlcmVkRWxlbWVudFwiIG1lYW5zIGl0IGlzIHRoZSBBZGFwdGl2ZSBDYXJkIGl0c2VsZiwgc3VjaCBhcyBcInNlbGVjdEFjdGlvblwiIChBQykgb3IgXCJ0YXBBY3Rpb25cIiAocmljaCBjYXJkcykuXG4gICAgICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRvIG1hcmsgdGhlIHdob2xlIGNhcmQgYXMgcGVyZm9ybWVkLlxuICAgICAgICBhY3Rpb25zUGVyZm9ybWVkLm1hcCgoeyByZW5kZXJlZEVsZW1lbnQgfSkgPT4gcmVuZGVyZWRFbGVtZW50KS5maWx0ZXIocmVuZGVyZWRFbGVtZW50ID0+IHJlbmRlcmVkRWxlbWVudCksXG4gICAgICAgIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZVxuICAgICAgKSxcbiAgICBbYWN0aW9uc1BlcmZvcm1lZCwgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lLCBsYXN0UmVuZGVyXVxuICApO1xuXG4gIHJldHVybiBlcnJvcnMubGVuZ3RoID8gKFxuICAgIG5vZGVfZW52ID09PSAnZGV2ZWxvcG1lbnQnICYmIDxFcnJvckJveCBlcnJvcj17ZXJyb3JzWzBdfSB0eXBlPXtsb2NhbGl6ZSgnQURBUFRJVkVfQ0FSRF9FUlJPUl9CT1hfVElUTEVfUkVOREVSJyl9IC8+XG4gICkgOiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgKyAnJywgJ3dlYmNoYXRfX2FkYXB0aXZlLWNhcmQtcmVuZGVyZXInKX1cbiAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24gYXMgdW5rbm93biBhcyBNb3VzZUV2ZW50SGFuZGxlcjxIVE1MRGl2RWxlbWVudD59XG4gICAgICBvbktleVByZXNzPXtoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uIGFzIHVua25vd24gYXMgS2V5Ym9hcmRFdmVudEhhbmRsZXI8SFRNTERpdkVsZW1lbnQ+fVxuICAgICAgcmVmPXtjb250ZW50UmVmfVxuICAgIC8+XG4gICk7XG59O1xuXG5BZGFwdGl2ZUNhcmRSZW5kZXJlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZTogJycsXG4gIGRpc2FibGVkOiB1bmRlZmluZWQsXG4gIHRhcEFjdGlvbjogdW5kZWZpbmVkXG59O1xuXG5BZGFwdGl2ZUNhcmRSZW5kZXJlci5wcm9wVHlwZXMgPSB7XG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgYWRhcHRpdmVDYXJkOiBQcm9wVHlwZXMuYW55LmlzUmVxdWlyZWQsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvLyBUeXBlU2NyaXB0IGNsYXNzIGlzIG5vdCBtYXBwYWJsZSB0byBQcm9wVHlwZXMuZnVuY1xuICAvLyBAdHMtaWdub3JlXG4gIHRhcEFjdGlvbjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBpbWFnZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgdmFsdWU6IFByb3BUeXBlcy5zdHJpbmdcbiAgfSlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFkYXB0aXZlQ2FyZFJlbmRlcmVyO1xuIl19
|