botframework-webchat 4.13.0 → 4.15.0
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 -104
- package/.prettierrc.yml +1 -1
- package/README.md +33 -36
- package/babel.config.json +2 -2
- package/babel.sanitize-html.config.json +10 -0
- package/lib/AddFullBundle.d.ts +30 -0
- package/lib/AddFullBundle.d.ts.map +1 -0
- package/lib/AddFullBundle.js +76 -0
- package/lib/FullComposer.d.ts +8 -0
- package/lib/FullComposer.d.ts.map +1 -0
- package/lib/FullComposer.js +6 -16
- package/lib/FullReactWebChat.d.ts +8 -0
- package/lib/FullReactWebChat.d.ts.map +1 -0
- package/lib/FullReactWebChat.js +8 -23
- package/lib/adaptiveCards/AdaptiveCardsComposer.d.ts +10 -0
- package/lib/adaptiveCards/AdaptiveCardsComposer.d.ts.map +1 -0
- package/lib/adaptiveCards/AdaptiveCardsComposer.js +6 -2
- package/lib/adaptiveCards/AdaptiveCardsContext.d.ts +8 -0
- package/lib/adaptiveCards/AdaptiveCardsContext.d.ts.map +1 -0
- package/lib/adaptiveCards/AdaptiveCardsContext.js +3 -3
- package/lib/adaptiveCards/AdaptiveCardsStyleOptions.d.ts +5 -3
- package/lib/adaptiveCards/AdaptiveCardsStyleOptions.d.ts.map +1 -1
- package/lib/adaptiveCards/AdaptiveCardsStyleSet.d.ts +7 -0
- package/lib/adaptiveCards/AdaptiveCardsStyleSet.d.ts.map +1 -0
- package/lib/{FullBundleStyleOptions.js → adaptiveCards/AdaptiveCardsStyleSet.js} +0 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardAttachment.d.ts +9 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardAttachment.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardAttachment.js +1 -1
- package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.d.ts +28 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.js +13 -6
- package/lib/adaptiveCards/Attachment/AdaptiveCardContent.d.ts +9 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardContent.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardContent.js +8 -4
- package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.d.ts +12 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.js +310 -85
- package/lib/adaptiveCards/Attachment/AnimationCardContent.d.ts +10 -0
- package/lib/adaptiveCards/Attachment/AnimationCardContent.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AnimationCardContent.js +1 -1
- package/lib/adaptiveCards/Attachment/AudioCardContent.d.ts +10 -0
- package/lib/adaptiveCards/Attachment/AudioCardContent.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AudioCardContent.js +1 -1
- package/lib/adaptiveCards/Attachment/CommonCard.js +11 -6
- package/lib/adaptiveCards/Attachment/HeroCardContent.d.ts +10 -0
- package/lib/adaptiveCards/Attachment/HeroCardContent.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/HeroCardContent.js +11 -6
- package/lib/adaptiveCards/Attachment/OAuthCardContent.d.ts +10 -0
- package/lib/adaptiveCards/Attachment/OAuthCardContent.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/OAuthCardContent.js +11 -6
- package/lib/adaptiveCards/Attachment/ReceiptCardContent.d.ts +10 -0
- package/lib/adaptiveCards/Attachment/ReceiptCardContent.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/ReceiptCardContent.js +11 -6
- package/lib/adaptiveCards/Attachment/SignInCardContent.d.ts +10 -0
- package/lib/adaptiveCards/Attachment/SignInCardContent.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/SignInCardContent.js +1 -1
- package/lib/adaptiveCards/Attachment/ThumbnailCardContent.d.ts +10 -0
- package/lib/adaptiveCards/Attachment/ThumbnailCardContent.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/ThumbnailCardContent.js +11 -6
- package/lib/adaptiveCards/Attachment/VideoCardContent.d.ts +20 -0
- package/lib/adaptiveCards/Attachment/VideoCardContent.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/VideoCardContent.js +7 -5
- package/lib/adaptiveCards/AttachmentForScreenReader/AdaptiveCardAttachment.js +7 -3
- package/lib/adaptiveCards/AttachmentForScreenReader/RichCardAttachment.js +1 -1
- package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.d.ts +59 -0
- package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.d.ts.map +1 -0
- package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.js +8 -1
- package/lib/adaptiveCards/Styles/adaptiveCardHostConfig.d.ts +126 -0
- package/lib/adaptiveCards/Styles/adaptiveCardHostConfig.d.ts.map +1 -0
- package/lib/adaptiveCards/Styles/adaptiveCardHostConfig.js +29 -9
- package/lib/adaptiveCards/Styles/createAdaptiveCardsStyleSet.d.ts +5 -0
- package/lib/adaptiveCards/Styles/createAdaptiveCardsStyleSet.d.ts.map +1 -0
- package/lib/adaptiveCards/Styles/createAdaptiveCardsStyleSet.js +2 -2
- package/lib/adaptiveCards/createAdaptiveCardsAttachmentForScreenReaderMiddleware.d.ts +3 -0
- package/lib/adaptiveCards/createAdaptiveCardsAttachmentForScreenReaderMiddleware.d.ts.map +1 -0
- package/lib/adaptiveCards/createAdaptiveCardsAttachmentForScreenReaderMiddleware.js +5 -11
- package/lib/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.d.ts +3 -0
- package/lib/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.d.ts.map +1 -0
- package/lib/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.js +2 -15
- package/lib/adaptiveCards/defaultStyleOptions.d.ts +4 -0
- package/lib/adaptiveCards/defaultStyleOptions.d.ts.map +1 -0
- package/lib/adaptiveCards/defaultStyleOptions.js +3 -2
- package/lib/adaptiveCards/hooks/internal/useAdaptiveCardsContext.d.ts +3 -0
- package/lib/adaptiveCards/hooks/internal/useAdaptiveCardsContext.d.ts.map +1 -0
- package/lib/adaptiveCards/hooks/internal/useAdaptiveCardsContext.js +1 -1
- package/lib/adaptiveCards/hooks/internal/useParseAdaptiveCardJSON.d.ts +2 -0
- package/lib/adaptiveCards/hooks/internal/useParseAdaptiveCardJSON.d.ts.map +1 -0
- package/lib/adaptiveCards/hooks/internal/useParseAdaptiveCardJSON.js +7 -5
- package/lib/adaptiveCards/hooks/internal/useUniqueId.js +1 -1
- package/lib/adaptiveCards/hooks/useAdaptiveCardsHostConfig.d.ts +2 -0
- package/lib/adaptiveCards/hooks/useAdaptiveCardsHostConfig.d.ts.map +1 -0
- package/lib/adaptiveCards/hooks/useAdaptiveCardsHostConfig.js +3 -5
- package/lib/adaptiveCards/hooks/useAdaptiveCardsPackage.d.ts +3 -0
- package/lib/adaptiveCards/hooks/useAdaptiveCardsPackage.d.ts.map +1 -0
- package/lib/adaptiveCards/hooks/useAdaptiveCardsPackage.js +1 -1
- package/lib/adaptiveCards/normalizeStyleOptions.d.ts +3 -0
- package/lib/adaptiveCards/normalizeStyleOptions.d.ts.map +1 -0
- package/lib/adaptiveCards/normalizeStyleOptions.js +1 -1
- package/lib/addVersion.js +2 -2
- package/lib/createBrowserWebSpeechPonyfillFactory.d.ts +3 -0
- package/lib/createBrowserWebSpeechPonyfillFactory.d.ts.map +1 -0
- package/lib/createBrowserWebSpeechPonyfillFactory.js +7 -4
- package/lib/createCognitiveServicesSpeechServicesPonyfillFactory.d.ts +17 -0
- package/lib/createCognitiveServicesSpeechServicesPonyfillFactory.d.ts.map +1 -0
- package/lib/createCognitiveServicesSpeechServicesPonyfillFactory.js +17 -11
- package/lib/createDirectLine.d.ts +17 -0
- package/lib/createDirectLine.d.ts.map +1 -0
- package/lib/createDirectLine.js +3 -2
- package/lib/createDirectLineAppServiceExtension.d.ts +7 -0
- package/lib/createDirectLineAppServiceExtension.d.ts.map +1 -0
- package/lib/createDirectLineAppServiceExtension.js +1 -1
- package/lib/createDirectLineSpeechAdapters.d.ts +25 -0
- package/lib/createDirectLineSpeechAdapters.d.ts.map +1 -0
- package/lib/createDirectLineSpeechAdapters.js +57 -3
- package/lib/createFullStyleSet.d.ts +1375 -0
- package/lib/createFullStyleSet.d.ts.map +1 -0
- package/lib/createFullStyleSet.js +2 -2
- package/lib/fullBundleDefaultStyleOptions.js +4 -4
- package/lib/hooks/useStyleOptions.d.ts +3 -0
- package/lib/hooks/useStyleOptions.d.ts.map +1 -0
- package/lib/hooks/useStyleOptions.js +21 -0
- package/lib/index-es5.d.ts +4 -20
- package/lib/index-es5.d.ts.map +1 -1
- package/lib/index-es5.js +3 -43
- package/lib/index-minimal.d.ts +9 -6
- package/lib/index-minimal.d.ts.map +1 -1
- package/lib/index-minimal.js +27 -21
- package/lib/index.d.ts +164 -18
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +19 -12
- 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 +6 -0
- package/lib/renderMarkdown.d.ts.map +1 -0
- package/lib/renderMarkdown.js +36 -5
- package/lib/renderWebChat.d.ts +3 -0
- package/lib/renderWebChat.d.ts.map +1 -0
- package/lib/renderWebChat.js +1 -1
- package/lib/speech/CustomAudioInputStream.d.ts +94 -0
- package/lib/speech/CustomAudioInputStream.d.ts.map +1 -0
- package/lib/speech/CustomAudioInputStream.js +441 -0
- package/lib/speech/bytesPerSample.d.ts +2 -0
- package/lib/speech/bytesPerSample.d.ts.map +1 -0
- package/lib/speech/bytesPerSample.js +12 -0
- package/lib/speech/createAudioConfig.d.ts +23 -0
- package/lib/speech/createAudioConfig.d.ts.map +1 -0
- package/lib/speech/createAudioConfig.js +90 -0
- package/lib/speech/createAudioContext.d.ts +3 -0
- package/lib/speech/createAudioContext.d.ts.map +1 -0
- package/lib/speech/createAudioContext.js +22 -0
- package/lib/speech/createMicrophoneAudioConfigAndAudioContext.d.ts +9 -0
- package/lib/speech/createMicrophoneAudioConfigAndAudioContext.d.ts.map +1 -0
- package/lib/speech/createMicrophoneAudioConfigAndAudioContext.js +161 -0
- package/lib/speech/getUserMedia.d.ts +2 -0
- package/lib/speech/getUserMedia.d.ts.map +1 -0
- package/lib/speech/getUserMedia.js +25 -0
- package/lib/types/AdaptiveCardsPackage.d.ts +13 -0
- package/lib/types/AdaptiveCardsPackage.d.ts.map +1 -0
- package/lib/types/AdaptiveCardsPackage.js +2 -0
- package/lib/types/CognitiveServicesAudioOutputFormat.d.ts +3 -0
- package/lib/types/CognitiveServicesAudioOutputFormat.d.ts.map +1 -0
- package/lib/types/CognitiveServicesAudioOutputFormat.js +2 -0
- package/lib/types/CognitiveServicesCredentials.d.ts +18 -0
- package/lib/types/CognitiveServicesCredentials.d.ts.map +1 -0
- package/lib/types/CognitiveServicesCredentials.js +2 -0
- package/lib/types/CognitiveServicesTextNormalization.d.ts +3 -0
- package/lib/types/CognitiveServicesTextNormalization.d.ts.map +1 -0
- package/lib/types/CognitiveServicesTextNormalization.js +2 -0
- package/lib/{FullBundleStyleOptions.d.ts → types/FullBundleStyleOptions.d.ts} +1 -1
- package/lib/types/FullBundleStyleOptions.d.ts.map +1 -0
- package/lib/types/FullBundleStyleOptions.js +2 -0
- package/lib/useComposerProps.d.ts +22 -0
- package/lib/useComposerProps.d.ts.map +1 -0
- package/lib/useComposerProps.js +6 -8
- package/package.json +46 -48
- package/src/AddFullBundle.tsx +93 -0
- package/src/FullComposer.tsx +38 -0
- package/src/FullReactWebChat.tsx +32 -0
- package/src/__tests__/createDirectLine.spec.js +2 -0
- package/src/__tests__/renderMarkdown.spec.js +1 -1
- package/src/__tests__/versionTag.es5.spec.js +3 -0
- package/src/__tests__/versionTag.full.spec.js +3 -0
- package/src/__tests__/versionTag.minimal.spec.js +3 -0
- package/src/adaptiveCards/{AdaptiveCardsComposer.js → AdaptiveCardsComposer.tsx} +17 -5
- package/src/adaptiveCards/AdaptiveCardsContext.ts +12 -0
- package/src/adaptiveCards/AdaptiveCardsStyleOptions.ts +5 -3
- package/src/adaptiveCards/AdaptiveCardsStyleSet.ts +7 -0
- package/src/adaptiveCards/Attachment/{AdaptiveCardAttachment.js → AdaptiveCardAttachment.tsx} +8 -2
- package/src/adaptiveCards/Attachment/AdaptiveCardBuilder.ts +27 -17
- package/src/adaptiveCards/Attachment/{AdaptiveCardContent.js → AdaptiveCardContent.tsx} +8 -2
- package/src/adaptiveCards/Attachment/AdaptiveCardRenderer.tsx +768 -0
- package/src/adaptiveCards/Attachment/{AnimationCardContent.js → AnimationCardContent.tsx} +9 -2
- package/src/adaptiveCards/Attachment/{AudioCardContent.js → AudioCardContent.tsx} +9 -2
- package/src/adaptiveCards/Attachment/CommonCard.js +2 -1
- package/src/adaptiveCards/Attachment/{HeroCardContent.js → HeroCardContent.tsx} +12 -3
- package/src/adaptiveCards/Attachment/{OAuthCardContent.js → OAuthCardContent.tsx} +11 -3
- package/src/adaptiveCards/Attachment/{ReceiptCardContent.js → ReceiptCardContent.tsx} +58 -28
- package/src/adaptiveCards/Attachment/{SignInCardContent.js → SignInCardContent.tsx} +9 -2
- package/src/adaptiveCards/Attachment/{ThumbnailCardContent.js → ThumbnailCardContent.tsx} +12 -3
- package/src/adaptiveCards/Attachment/{VideoCardContent.js → VideoCardContent.tsx} +15 -3
- package/src/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.ts +9 -1
- package/src/adaptiveCards/Styles/adaptiveCardHostConfig.ts +28 -8
- package/src/adaptiveCards/Styles/createAdaptiveCardsStyleSet.spec.js +2 -0
- package/src/adaptiveCards/Styles/createAdaptiveCardsStyleSet.ts +7 -4
- package/src/adaptiveCards/{createAdaptiveCardsAttachmentForScreenReaderMiddleware.js → createAdaptiveCardsAttachmentForScreenReaderMiddleware.tsx} +16 -15
- package/src/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.tsx +44 -0
- package/src/adaptiveCards/defaultStyleOptions.ts +2 -1
- package/src/adaptiveCards/hooks/internal/{useAdaptiveCardsContext.js → useAdaptiveCardsContext.ts} +1 -1
- package/src/adaptiveCards/hooks/internal/{useParseAdaptiveCardJSON.js → useParseAdaptiveCardJSON.ts} +5 -2
- package/src/adaptiveCards/hooks/internal/{useUniqueId.js → useUniqueId.ts} +1 -1
- package/src/adaptiveCards/hooks/{useAdaptiveCardsHostConfig.js → useAdaptiveCardsHostConfig.ts} +6 -8
- package/src/adaptiveCards/hooks/{useAdaptiveCardsPackage.js → useAdaptiveCardsPackage.ts} +2 -1
- package/src/createBrowserWebSpeechPonyfillFactory.ts +21 -0
- package/src/createCognitiveServicesSpeechServicesPonyfillFactory.spec.js +36 -6
- package/src/createCognitiveServicesSpeechServicesPonyfillFactory.ts +78 -0
- package/src/createDirectLine.ts +65 -0
- package/src/createDirectLineAppServiceExtension.ts +22 -0
- package/src/createDirectLineSpeechAdapters.ts +84 -0
- package/src/createFullStyleSet.ts +2 -2
- package/src/fullBundleDefaultStyleOptions.ts +3 -3
- package/src/hooks/useStyleOptions.ts +9 -0
- package/src/index-es5.ts +3 -28
- package/src/index-minimal.ts +3 -2
- package/src/index.ts +22 -10
- package/src/polyfill.ts +29 -0
- package/src/renderMarkdown.ts +140 -0
- package/src/renderWebChat.tsx +6 -0
- package/src/speech/CustomAudioInputStream.ts +356 -0
- package/src/speech/bytesPerSample.ts +4 -0
- package/src/speech/createAudioConfig.spec.js +23 -0
- package/src/speech/createAudioConfig.ts +77 -0
- package/src/speech/createAudioContext.ts +16 -0
- package/src/speech/createMicrophoneAudioConfigAndAudioContext.ts +146 -0
- package/src/speech/getUserMedia.ts +14 -0
- package/src/tsconfig.json +1 -1
- package/src/types/AdaptiveCardsPackage.ts +23 -0
- package/src/types/CognitiveServicesAudioOutputFormat.ts +28 -0
- package/src/types/CognitiveServicesCredentials.ts +28 -0
- package/src/types/CognitiveServicesTextNormalization.ts +3 -0
- package/src/{FullBundleStyleOptions.ts → types/FullBundleStyleOptions.ts} +1 -1
- package/src/{useComposerProps.js → useComposerProps.ts} +21 -11
- package/webpack.config.js +46 -6
- package/.eslintignore +0 -9
- package/lib/FullBundleStyleOptions.d.ts.map +0 -1
- package/src/FullComposer.js +0 -40
- package/src/FullReactWebChat.js +0 -47
- package/src/adaptiveCards/AdaptiveCardsContext.js +0 -5
- package/src/adaptiveCards/Attachment/AdaptiveCardRenderer.js +0 -492
- package/src/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.js +0 -41
- package/src/createBrowserWebSpeechPonyfillFactory.js +0 -16
- package/src/createCognitiveServicesSpeechServicesPonyfillFactory.js +0 -58
- package/src/createDirectLine.js +0 -38
- package/src/createDirectLineAppServiceExtension.js +0 -12
- package/src/createDirectLineSpeechAdapters.js +0 -5
- package/src/index-es5.tsx +0 -49
- package/src/index-minimal.tsx +0 -9
- package/src/index.tsx +0 -45
- package/src/renderMarkdown.js +0 -97
- package/src/renderWebChat.js +0 -6
|
@@ -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
|
});
|
|
@@ -171,7 +252,7 @@ function disableInputElementsWithUndo(element) {
|
|
|
171
252
|
var observer = new MutationObserver(function (mutations) {
|
|
172
253
|
return mutations.forEach(function (_ref) {
|
|
173
254
|
var addedNodes = _ref.addedNodes;
|
|
174
|
-
return undoStack.push.apply(undoStack, (0, _toConsumableArray2.default)(
|
|
255
|
+
return undoStack.push.apply(undoStack, (0, _toConsumableArray2.default)([].map.call(addedNodes, function (addedNode) {
|
|
175
256
|
return disableInputElementsWithUndo(addedNode, false);
|
|
176
257
|
})));
|
|
177
258
|
});
|
|
@@ -185,9 +266,151 @@ function disableInputElementsWithUndo(element) {
|
|
|
185
266
|
});
|
|
186
267
|
}
|
|
187
268
|
|
|
269
|
+
return bunchUndos.apply(void 0, (0, _toConsumableArray2.default)(undoStack));
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Gets the value of an attribute from an element.
|
|
273
|
+
*
|
|
274
|
+
* @returns {false | string} The value of the attribute. `false` if the attribute was not set.
|
|
275
|
+
*/
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
function getAttribute(element, qualifiedName) {
|
|
279
|
+
return !!element && element.hasAttribute(qualifiedName) && (element.getAttribute(qualifiedName) || '');
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Sets or removes an attribute from an element.
|
|
283
|
+
*
|
|
284
|
+
* @param {HTMLElement} element - The element to set or remove attribute from.
|
|
285
|
+
* @param {string} qualifiedName - The name of the attribute.
|
|
286
|
+
* @param {false | string} value - The value of the attribute. When passing `false`, remove the attribute.
|
|
287
|
+
*/
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
function setOrRemoveAttribute(element, qualifiedName, value) {
|
|
291
|
+
if (value === false) {
|
|
292
|
+
element === null || element === void 0 ? void 0 : element.removeAttribute(qualifiedName);
|
|
293
|
+
} else {
|
|
294
|
+
element === null || element === void 0 ? void 0 : element.setAttribute(qualifiedName, value);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Sets or removes an attribute from an element with an undo function.
|
|
299
|
+
*
|
|
300
|
+
* @param {HTMLElement} element - The element to set or remove attribute from.
|
|
301
|
+
* @param {string} qualifiedName - The name of the attribute.
|
|
302
|
+
* @param {false | string} value - The value of the attribute. When passing `false`, remove the attribute.
|
|
303
|
+
*
|
|
304
|
+
* @returns {() => void} The undo function, when called, will undo all manipulations by restoring values recorded at the time of the function call.
|
|
305
|
+
*/
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
function setOrRemoveAttributeWithUndo(element, qualifiedName, value) {
|
|
309
|
+
if (!element) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
var prevValue = getAttribute(element, qualifiedName);
|
|
314
|
+
setOrRemoveAttribute(element, qualifiedName, value);
|
|
315
|
+
return function () {
|
|
316
|
+
return setOrRemoveAttribute(element, qualifiedName, prevValue);
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Finds the first ancestor that fulfill the predicate.
|
|
321
|
+
*
|
|
322
|
+
* @param {HTMLElement} element - The starting element. This element will not be checked against the predicate.
|
|
323
|
+
* @param {(ancestor: HTMLElement) => boolean} predicate - The predicate to fulfill.
|
|
324
|
+
*
|
|
325
|
+
* @returns {HTMLElement | undefined} The first ancestor that fulfill the predicate, otherwise, `undefined`.
|
|
326
|
+
*/
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
function findAncestor(element, predicate) {
|
|
330
|
+
var current = element;
|
|
331
|
+
|
|
332
|
+
while (current = current.parentElement) {
|
|
333
|
+
if (predicate.call(element, current)) {
|
|
334
|
+
return current;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Indicates the action selected by performing a series of manipulations, with undo:
|
|
340
|
+
*
|
|
341
|
+
* - Accessibility: set `aria-pressed` to `true`
|
|
342
|
+
* - Applies `styleOptions.actionPerformedClassName`
|
|
343
|
+
*
|
|
344
|
+
* @param {HTMLElement[]} selectedActionElements - An array of elements that are representing the action and is selected.
|
|
345
|
+
* @param {string?} actionPerformedClassName - The name of the class to apply to all elements.
|
|
346
|
+
*
|
|
347
|
+
* @returns {() => void} The undo function, when called, will undo all manipulations by restoring values recorded at the time of the function call.
|
|
348
|
+
*/
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
function indicateActionSelectionWithUndo(selectedActionElements, actionPerformedClassName) {
|
|
352
|
+
if (!(selectedActionElements !== null && selectedActionElements !== void 0 && selectedActionElements.length)) {
|
|
353
|
+
return;
|
|
354
|
+
} // Verify all input elements are "ac-pushButton", could belongs to ActionSet or "card actions".
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
if (selectedActionElements.some(function (actionElement) {
|
|
358
|
+
return !actionElement.classList.contains('ac-pushButton');
|
|
359
|
+
})) {
|
|
360
|
+
console.warn('botframework-webchat: Cannot mark selected action in the card, some elements are not an "ac-pushButton".');
|
|
361
|
+
return;
|
|
362
|
+
} // A distinct set of action set containers which has selections, excluding containers without actions.
|
|
363
|
+
// Multiple submission in an Adaptive Card is still a vague area and TBD.
|
|
364
|
+
// We might want to disable the whole card, just buttons in same container, or do nothing (today).
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
var actionSetElements = new Set();
|
|
368
|
+
selectedActionElements.forEach(function (selectedActionElement) {
|
|
369
|
+
var actionSetElement = findAncestor(selectedActionElement, function (ancestor) {
|
|
370
|
+
return ancestor.getAttribute('role') === 'menubar';
|
|
371
|
+
});
|
|
372
|
+
actionSetElement && actionSetElements.add(actionSetElement);
|
|
373
|
+
});
|
|
374
|
+
var undoStack = [];
|
|
375
|
+
actionSetElements.forEach(function (actionSetElement) {
|
|
376
|
+
// Remove "role" from every "ac-actionSet" container.
|
|
377
|
+
undoStack.push(setOrRemoveAttributeWithUndo(actionSetElement, 'role', false)); // Modify "role" of every actions in the container.
|
|
378
|
+
|
|
379
|
+
Array.from(actionSetElement.querySelectorAll('.ac-pushButton')).forEach(function (actionElement) {
|
|
380
|
+
if (selectedActionElements.includes(actionElement)) {
|
|
381
|
+
// Add "aria-pressed" and set "role" attribute to "button" (which is required by "aria-pressed").
|
|
382
|
+
undoStack.push(setOrRemoveAttributeWithUndo(actionElement, 'aria-pressed', 'true'));
|
|
383
|
+
undoStack.push(setOrRemoveAttributeWithUndo(actionElement, 'role', 'button')); // Highlight actions by applying `styleOptions.actionPerformedClassName`.
|
|
384
|
+
|
|
385
|
+
actionPerformedClassName && undoStack.push(addPersistentClassWithUndo(actionElement, actionPerformedClassName));
|
|
386
|
+
} else {
|
|
387
|
+
// We removed "role=menubar" from the container, we must remove "role=menuitem" from unselected actions.
|
|
388
|
+
undoStack.push(setOrRemoveAttributeWithUndo(actionElement, 'role', false));
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
return bunchUndos.apply(void 0, undoStack);
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Fixes accessibility issues from Adaptive Card, with undo.
|
|
396
|
+
*
|
|
397
|
+
* @returns {() => void} The undo function, when called, will undo all manipulations by restoring values recorded at the time of the function call.
|
|
398
|
+
*/
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
function fixAccessibilityIssuesWithUndo(element) {
|
|
402
|
+
if (!element) {
|
|
403
|
+
return;
|
|
404
|
+
} // These hacks should be done in Adaptive Cards library instead.
|
|
405
|
+
// Related to #3949: All action buttons inside role="menubar" should be role="menuitem".
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
var undoStack = Array.from(element.querySelectorAll('.ac-actionSet[role="menubar"] [role="button"]')).map(function (actionButton) {
|
|
409
|
+
return setAttributeWithUndo(actionButton, 'role', 'menuitem');
|
|
410
|
+
});
|
|
188
411
|
return function () {
|
|
189
412
|
return undoStack.forEach(function (undo) {
|
|
190
|
-
return undo
|
|
413
|
+
return undo === null || undo === void 0 ? void 0 : undo();
|
|
191
414
|
});
|
|
192
415
|
};
|
|
193
416
|
}
|
|
@@ -200,8 +423,9 @@ function getFocusableElements(element) {
|
|
|
200
423
|
}
|
|
201
424
|
|
|
202
425
|
function restoreActiveElementIndex(element, activeElementIndex) {
|
|
203
|
-
var
|
|
204
|
-
|
|
426
|
+
var _getFocusableElements;
|
|
427
|
+
|
|
428
|
+
(_getFocusableElements = getFocusableElements(element)[+activeElementIndex]) === null || _getFocusableElements === void 0 ? void 0 : _getFocusableElements.focus();
|
|
205
429
|
}
|
|
206
430
|
|
|
207
431
|
function saveActiveElementIndex(element) {
|
|
@@ -211,15 +435,17 @@ function saveActiveElementIndex(element) {
|
|
|
211
435
|
function restoreInputValues(element, inputValues) {
|
|
212
436
|
var inputs = element.querySelectorAll('input, select, textarea');
|
|
213
437
|
[].forEach.call(inputs, function (input, index) {
|
|
214
|
-
var value = inputValues[index];
|
|
438
|
+
var value = inputValues[+index];
|
|
215
439
|
|
|
216
440
|
if (typeof value !== 'undefined') {
|
|
217
441
|
var tagName = input.tagName,
|
|
218
442
|
type = input.type;
|
|
219
443
|
|
|
220
444
|
if (tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
|
|
221
|
-
|
|
222
|
-
|
|
445
|
+
if (typeof value === 'boolean') {
|
|
446
|
+
input.checked = value;
|
|
447
|
+
}
|
|
448
|
+
} else if (typeof value === 'string') {
|
|
223
449
|
input.value = value;
|
|
224
450
|
}
|
|
225
451
|
}
|
|
@@ -228,25 +454,22 @@ function restoreInputValues(element, inputValues) {
|
|
|
228
454
|
|
|
229
455
|
function saveInputValues(element) {
|
|
230
456
|
var inputs = element.querySelectorAll('input, select, textarea');
|
|
231
|
-
return [].map.call(inputs, function (
|
|
232
|
-
var
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
if (tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
|
|
238
|
-
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;
|
|
239
462
|
}
|
|
240
463
|
|
|
241
|
-
return value;
|
|
464
|
+
return input.value;
|
|
242
465
|
});
|
|
243
466
|
}
|
|
244
467
|
|
|
245
|
-
var AdaptiveCardRenderer = function AdaptiveCardRenderer(
|
|
246
|
-
var actionPerformedClassName =
|
|
247
|
-
adaptiveCard =
|
|
248
|
-
disabledFromProps =
|
|
249
|
-
tapAction =
|
|
468
|
+
var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
|
|
469
|
+
var actionPerformedClassName = _ref2.actionPerformedClassName,
|
|
470
|
+
adaptiveCard = _ref2.adaptiveCard,
|
|
471
|
+
disabledFromProps = _ref2.disabled,
|
|
472
|
+
tapAction = _ref2.tapAction;
|
|
250
473
|
|
|
251
474
|
var _useStyleSet = useStyleSet(),
|
|
252
475
|
_useStyleSet2 = (0, _slicedToArray2.default)(_useStyleSet, 1),
|
|
@@ -293,9 +516,10 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
|
|
|
293
516
|
// The null check for "tapAction" is in "handleClickAndKeyPressForTapAction".
|
|
294
517
|
|
|
295
518
|
var handleClickAndKeyPress = (0, _react.useCallback)(function (event) {
|
|
296
|
-
var
|
|
297
|
-
|
|
298
|
-
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
|
|
299
523
|
|
|
300
524
|
var current = contentRef.current;
|
|
301
525
|
var adaptiveCardRoot = current.querySelector('.ac-adaptiveCard[tabindex="0"]');
|
|
@@ -341,32 +565,39 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
|
|
|
341
565
|
|
|
342
566
|
addActionsPerformed(action);
|
|
343
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.
|
|
344
571
|
|
|
345
572
|
if (actionTypeName === 'Action.OpenUrl') {
|
|
573
|
+
var _ref4 = action,
|
|
574
|
+
value = _ref4.url;
|
|
346
575
|
performCardAction({
|
|
576
|
+
image: image,
|
|
577
|
+
title: title,
|
|
347
578
|
type: 'openUrl',
|
|
348
|
-
value:
|
|
579
|
+
value: value
|
|
349
580
|
});
|
|
350
581
|
} else if (actionTypeName === 'Action.Submit') {
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
var displayText = cardAction.displayText,
|
|
357
|
-
text = cardAction.text,
|
|
358
|
-
type = cardAction.type,
|
|
359
|
-
value = cardAction.value;
|
|
582
|
+
var _ref5 = action,
|
|
583
|
+
data = _ref5.data;
|
|
584
|
+
|
|
585
|
+
if (typeof data !== 'undefined') {
|
|
586
|
+
if (typeof data === 'string') {
|
|
360
587
|
performCardAction({
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
type:
|
|
364
|
-
value:
|
|
588
|
+
image: image,
|
|
589
|
+
title: title,
|
|
590
|
+
type: 'imBack',
|
|
591
|
+
value: data
|
|
365
592
|
});
|
|
593
|
+
} else if (data.__isBotFrameworkCardAction) {
|
|
594
|
+
performCardAction(data.cardAction);
|
|
366
595
|
} else {
|
|
367
596
|
performCardAction({
|
|
368
|
-
|
|
369
|
-
|
|
597
|
+
image: image,
|
|
598
|
+
title: title,
|
|
599
|
+
type: 'postBack',
|
|
600
|
+
value: data
|
|
370
601
|
});
|
|
371
602
|
}
|
|
372
603
|
}
|
|
@@ -387,9 +618,11 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
|
|
|
387
618
|
// TODO: [P3] Checks if we could make the "renderMarkdownAsHTML" per card
|
|
388
619
|
// This could be limitations from Adaptive Cards package (not supported as of 1.2.5)
|
|
389
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
|
|
390
623
|
|
|
391
624
|
|
|
392
|
-
adaptiveCard.constructor
|
|
625
|
+
adaptiveCard.constructor['onProcessMarkdown'] = function (text, result) {
|
|
393
626
|
if (renderMarkdownAsHTML) {
|
|
394
627
|
result.outputHtml = renderMarkdownAsHTML(text);
|
|
395
628
|
result.didProcess = true;
|
|
@@ -407,8 +640,8 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
|
|
|
407
640
|
validationEvents = _adaptiveCard$validat.validationEvents;
|
|
408
641
|
|
|
409
642
|
if (validationEvents.length) {
|
|
410
|
-
return setErrors(validationEvents.reduce(function (items,
|
|
411
|
-
var message =
|
|
643
|
+
return setErrors(validationEvents.reduce(function (items, _ref6) {
|
|
644
|
+
var message = _ref6.message;
|
|
412
645
|
return [].concat((0, _toConsumableArray2.default)(items), [new Error(message)]);
|
|
413
646
|
}, []));
|
|
414
647
|
}
|
|
@@ -444,45 +677,33 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
|
|
|
444
677
|
// Set onExecuteAction without causing unnecessary re-render.
|
|
445
678
|
adaptiveCard.onExecuteAction = disabled ? undefined : handleExecuteAction;
|
|
446
679
|
}, [adaptiveCard, disabled, handleExecuteAction]);
|
|
680
|
+
(0, _react.useEffect)(function () {
|
|
681
|
+
return fixAccessibilityIssuesWithUndo(adaptiveCardElementRef.current);
|
|
682
|
+
}, [adaptiveCardElementRef, lastRender]);
|
|
447
683
|
(0, _react.useEffect)(function () {
|
|
448
684
|
// If the Adaptive Card get re-rendered, re-disable elements as needed.
|
|
449
685
|
if (disabled) {
|
|
450
686
|
return disableInputElementsWithUndo(adaptiveCardElementRef.current);
|
|
451
687
|
}
|
|
452
|
-
}, [disabled, lastRender]);
|
|
688
|
+
}, [adaptiveCardElementRef, disabled, lastRender]);
|
|
453
689
|
(0, _react.useEffect)(function () {
|
|
454
690
|
// If the Adaptive Card changed, reset all actions performed.
|
|
455
691
|
setActionsPerformed([]);
|
|
456
692
|
}, [adaptiveCard]);
|
|
457
693
|
(0, _react.useEffect)(function () {
|
|
458
|
-
//
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
}); // Add developers to highlight actions when they have been clicked.
|
|
467
|
-
|
|
468
|
-
if (!actionPerformedClassName) {
|
|
469
|
-
return;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
var undoStack = actionsPerformed.map(function (_ref6) {
|
|
473
|
-
var renderedElement = _ref6.renderedElement;
|
|
474
|
-
return renderedElement && adaptiveCardElementRef.current.contains(renderedElement) && addPersistentClassWithUndo(renderedElement, actionPerformedClassName);
|
|
475
|
-
});
|
|
476
|
-
return function () {
|
|
477
|
-
return undoStack.forEach(function (undo) {
|
|
478
|
-
return undo && undo();
|
|
479
|
-
});
|
|
480
|
-
};
|
|
694
|
+
return indicateActionSelectionWithUndo( // Actions that do not have "renderedElement" means it is the Adaptive Card itself, such as "selectAction" (AC) or "tapAction" (rich cards).
|
|
695
|
+
// We do not need to mark the whole card as performed.
|
|
696
|
+
actionsPerformed.map(function (_ref7) {
|
|
697
|
+
var renderedElement = _ref7.renderedElement;
|
|
698
|
+
return renderedElement;
|
|
699
|
+
}).filter(function (renderedElement) {
|
|
700
|
+
return renderedElement;
|
|
701
|
+
}), actionPerformedClassName);
|
|
481
702
|
}, [actionsPerformed, actionPerformedClassName, lastRender]);
|
|
482
|
-
return errors.length ? node_env === 'development'
|
|
703
|
+
return errors.length ? node_env === 'development' && /*#__PURE__*/_react.default.createElement(ErrorBox, {
|
|
483
704
|
error: errors[0],
|
|
484
705
|
type: localize('ADAPTIVE_CARD_ERROR_BOX_TITLE_RENDER')
|
|
485
|
-
}) :
|
|
706
|
+
}) : /*#__PURE__*/_react.default.createElement("div", {
|
|
486
707
|
className: (0, _classnames.default)(adaptiveCardRendererStyleSet + '', 'webchat__adaptive-card-renderer'),
|
|
487
708
|
onClick: handleClickAndKeyPressForTapAction,
|
|
488
709
|
onKeyPress: handleClickAndKeyPressForTapAction,
|
|
@@ -499,11 +720,15 @@ AdaptiveCardRenderer.propTypes = {
|
|
|
499
720
|
actionPerformedClassName: _propTypes.default.string,
|
|
500
721
|
adaptiveCard: _propTypes.default.any.isRequired,
|
|
501
722
|
disabled: _propTypes.default.bool,
|
|
723
|
+
// TypeScript class is not mappable to PropTypes.func
|
|
724
|
+
// @ts-ignore
|
|
502
725
|
tapAction: _propTypes.default.shape({
|
|
726
|
+
image: _propTypes.default.string,
|
|
727
|
+
title: _propTypes.default.string,
|
|
503
728
|
type: _propTypes.default.string.isRequired,
|
|
504
729
|
value: _propTypes.default.string
|
|
505
730
|
})
|
|
506
731
|
};
|
|
507
732
|
var _default = AdaptiveCardRenderer;
|
|
508
733
|
exports.default = _default;
|
|
509
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIuanMiXSwibmFtZXMiOlsiRXJyb3JCb3giLCJDb21wb25lbnRzIiwidXNlRGlzYWJsZWQiLCJob29rcyIsInVzZUxvY2FsaXplciIsInVzZVBlcmZvcm1DYXJkQWN0aW9uIiwidXNlUmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJ1c2VTY3JvbGxUb0VuZCIsInVzZVN0eWxlU2V0Iiwibm9kZV9lbnYiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJhZGRDbGFzcyIsImVsZW1lbnQiLCJjbGFzc05hbWUiLCJjbGFzc05hbWVzIiwiU2V0Iiwic3BsaXQiLCJoYXMiLCJhZGQiLCJBcnJheSIsImZyb20iLCJqb2luIiwiYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8iLCJvYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJvYnNlcnZlIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUZpbHRlciIsImRlbGV0ZSIsImRpc2Nvbm5lY3QiLCJpc1BsYWluT2JqZWN0Iiwib2JqIiwiT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJwcm90b3R5cGUiLCJzZXRBdHRyaWJ1dGVXaXRoVW5kbyIsInF1YWxpZmllZE5hbWUiLCJuZXh0VmFsdWUiLCJ2YWx1ZSIsImdldEF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsImRpc2FibGVkSGFuZGxlciIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzdG9wUHJvcGFnYXRpb24iLCJhZGRFdmVudExpc3RlbmVyT25jZVdpdGhVbmRvIiwibmFtZSIsImhhbmRsZXIiLCJkZXRhY2giLCJkZXRhY2hpbmdIYW5kbGVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJvbmNlIiwiYWRkRXZlbnRMaXN0ZW5lcldpdGhVbmRvIiwiZGlzYWJsZUVsZW1lbnRXaXRoVW5kbyIsInVuZG9TdGFjayIsImlzQWN0aXZlIiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwidGFnIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsInB1c2giLCJtYXAiLCJjYWxsIiwicXVlcnlTZWxlY3RvckFsbCIsIm9wdGlvbiIsImZvckVhY2giLCJ1bmRvIiwiZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyIsIm9ic2VydmVTdWJ0cmVlIiwibXV0YXRpb25zIiwiYWRkZWROb2RlcyIsImFkZGVkTm9kZSIsImNoaWxkTGlzdCIsInN1YnRyZWUiLCJnZXRGb2N1c2FibGVFbGVtZW50cyIsImZpbHRlciIsInRhYkluZGV4IiwicmVzdG9yZUFjdGl2ZUVsZW1lbnRJbmRleCIsImFjdGl2ZUVsZW1lbnRJbmRleCIsImZvY3VzYWJsZSIsImZvY3VzIiwic2F2ZUFjdGl2ZUVsZW1lbnRJbmRleCIsImluZGV4T2YiLCJyZXN0b3JlSW5wdXRWYWx1ZXMiLCJpbnB1dFZhbHVlcyIsImlucHV0cyIsImlucHV0IiwiaW5kZXgiLCJ0YWdOYW1lIiwidHlwZSIsImNoZWNrZWQiLCJzYXZlSW5wdXRWYWx1ZXMiLCJBZGFwdGl2ZUNhcmRSZW5kZXJlciIsImFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSIsImFkYXB0aXZlQ2FyZCIsImRpc2FibGVkRnJvbVByb3BzIiwiZGlzYWJsZWQiLCJ0YXBBY3Rpb24iLCJhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IiwiYWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJHbG9iYWxTZXR0aW5ncyIsIkhvc3RDb25maWciLCJhY3Rpb25zUGVyZm9ybWVkIiwic2V0QWN0aW9uc1BlcmZvcm1lZCIsImFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIiwiZGlzYWJsZWRGcm9tQ29tcG9zZXIiLCJlcnJvcnMiLCJzZXRFcnJvcnMiLCJsYXN0UmVuZGVyIiwic2V0TGFzdFJlbmRlciIsImFjdGl2ZUVsZW1lbnRJbmRleFJlZiIsImFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYiLCJjb250ZW50UmVmIiwiaW5wdXRWYWx1ZXNSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3MiLCJrZXkiLCJ0YXJnZXQiLCJjdXJyZW50IiwiYWRhcHRpdmVDYXJkUm9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJjb25zb2xlIiwid2FybiIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJhZGRBY3Rpb25zUGVyZm9ybWVkIiwiYWN0aW9uIiwiaGFuZGxlRXhlY3V0ZUFjdGlvbiIsImFjdGlvblR5cGVOYW1lIiwiZ2V0SnNvblR5cGVOYW1lIiwidXJsIiwiZGF0YSIsImFjdGlvbkRhdGEiLCJfX2lzQm90RnJhbWV3b3JrQ2FyZEFjdGlvbiIsImNhcmRBY3Rpb24iLCJkaXNwbGF5VGV4dCIsInRleHQiLCJlcnJvciIsImNvbnN0cnVjdG9yIiwib25Qcm9jZXNzTWFya2Rvd24iLCJyZXN1bHQiLCJvdXRwdXRIdG1sIiwiZGlkUHJvY2VzcyIsImhvc3RDb25maWciLCJzZXRUYWJJbmRleEF0Q2FyZFJvb3QiLCJ2YWxpZGF0ZVByb3BlcnRpZXMiLCJ2YWxpZGF0aW9uRXZlbnRzIiwibGVuZ3RoIiwicmVkdWNlIiwiaXRlbXMiLCJtZXNzYWdlIiwiRXJyb3IiLCJyZW5kZXIiLCJhcHBlbmRDaGlsZCIsIkRhdGUiLCJub3ciLCJyZW1vdmVDaGlsZCIsIm9uRXhlY3V0ZUFjdGlvbiIsInJlbmRlcmVkRWxlbWVudCIsImNvbnRhaW5zIiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiYW55IiwiaXNSZXF1aXJlZCIsImJvb2wiLCJzaGFwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBUkE7SUFVUUEsUSxHQUFhQyx3QyxD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d0UsU0FBckIsR0FBaUM7QUFDL0J2RSxFQUFBQSx3QkFBd0IsRUFBRXdFLG1CQUFVQyxNQURMO0FBRS9CeEUsRUFBQUEsWUFBWSxFQUFFdUUsbUJBQVVFLEdBQVYsQ0FBY0MsVUFGRztBQUcvQnhFLEVBQUFBLFFBQVEsRUFBRXFFLG1CQUFVSSxJQUhXO0FBSS9CeEUsRUFBQUEsU0FBUyxFQUFFb0UsbUJBQVVLLEtBQVYsQ0FBZ0I7QUFDekJqRixJQUFBQSxJQUFJLEVBQUU0RSxtQkFBVUMsTUFBVixDQUFpQkUsVUFERTtBQUV6QnRJLElBQUFBLEtBQUssRUFBRW1JLG1CQUFVQztBQUZRLEdBQWhCO0FBSm9CLENBQWpDO2VBVWUxRSxvQiIsInNvdXJjZVJvb3QiOiJidW5kbGU6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLW1hZ2ljLW51bWJlcnM6IFtcImVycm9yXCIsIHsgXCJpZ25vcmVcIjogWy0xLCAwLCAyXSB9XSAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnRzLCBnZXRUYWJJbmRleCwgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb21wb25lbnQnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHVzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIGZyb20gJy4uL2hvb2tzL3VzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnJztcbmltcG9ydCB1c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSBmcm9tICcuLi9ob29rcy91c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSc7XG5cbmNvbnN0IHsgRXJyb3JCb3ggfSA9IENvbXBvbmVudHM7XG5jb25zdCB7IHVzZURpc2FibGVkLCB1c2VMb2NhbGl6ZXIsIHVzZVBlcmZvcm1DYXJkQWN0aW9uLCB1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCwgdXNlU2Nyb2xsVG9FbmQsIHVzZVN0eWxlU2V0IH0gPSBob29rcztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5jb25zdCBub2RlX2VudiA9IHByb2Nlc3MuZW52Lm5vZGVfZW52IHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WO1xuXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgY29uc3QgY2xhc3NOYW1lcyA9IG5ldyBTZXQoZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKSk7XG5cbiAgaWYgKCFjbGFzc05hbWVzLmhhcyhjbGFzc05hbWUpKSB7XG4gICAgY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTtcblxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gQXJyYXkuZnJvbShjbGFzc05hbWVzKS5qb2luKCcgJyk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8oZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gIGlmIChhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKSB7XG4gICAgLy8gQWZ0ZXIgd2UgYWRkIHRoZSBjbGFzcywga2VlcCBvYnNlcnZpbmcgdGhlIGVsZW1lbnQgdG8gbWFrZSBzdXJlIHRoZSBjbGFzcyBpcyBub3QgcmVtb3ZlZC5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkpO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBuZXcgU2V0KGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykpO1xuXG4gICAgICBjbGFzc05hbWVzLmRlbGV0ZShjbGFzc05hbWUpO1xuXG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IEFycmF5LmZyb20oY2xhc3NOYW1lcykuam9pbignICcpO1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCBxdWFsaWZpZWROYW1lLCBuZXh0VmFsdWUpIHtcbiAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcblxuICBpZiAodmFsdWUgIT09IG5leHRWYWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIG5leHRWYWx1ZSk7XG5cbiAgICByZXR1cm4gKCkgPT4gKHZhbHVlID8gZWxlbWVudC5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpIDogZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkpO1xuICB9XG59XG5cbmNvbnN0IGRpc2FibGVkSGFuZGxlciA9IGV2ZW50ID0+IHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufTtcblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyhlbGVtZW50LCBuYW1lLCBoYW5kbGVyKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QgKi9cbiAgbGV0IGRldGFjaDtcbiAgY29uc3QgZGV0YWNoaW5nSGFuZGxlciA9IGV2ZW50ID0+IHtcbiAgICB0cnkge1xuICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCB7IG9uY2U6IHRydWUgfSwgc28gd2UgbmVlZCB0byBkZXRhY2ggbWFudWFsbHkuXG4gICAgICBkZXRhY2goKTtcbiAgICB9XG4gIH07XG5cbiAgZGV0YWNoID0gKCkgPT4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGRldGFjaGluZ0hhbmRsZXIpO1xuXG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBkZXRhY2hpbmdIYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgcmV0dXJuIGRldGFjaDtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcldpdGhVbmRvKGVsZW1lbnQsIG5hbWUsIGhhbmRsZXIpIHtcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIpO1xuXG4gIHJldHVybiAoKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcik7XG59XG5cbmZ1bmN0aW9uIGRpc2FibGVFbGVtZW50V2l0aFVuZG8oZWxlbWVudCkge1xuICBjb25zdCB1bmRvU3RhY2sgPSBbXTtcbiAgY29uc3QgaXNBY3RpdmUgPSBlbGVtZW50ID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBjb25zdCB0YWcgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlZmF1bHQtY2FzZSAqL1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpKTtcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKFxuICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXJPbmNlV2l0aFVuZG8oZWxlbWVudCwgJ2JsdXInLCAoKSA9PlxuICAgICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJykge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChhZGRFdmVudExpc3RlbmVyV2l0aFVuZG8oZWxlbWVudCwgJ2NsaWNrJywgZGlzYWJsZWRIYW5kbGVyKSk7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICdyZWFkb25seScsICdyZWFkb25seScpKTtcbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChcbiAgICAgICAgICAuLi5bXS5tYXAuY2FsbChlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpLCBvcHRpb24gPT5cbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZVdpdGhVbmRvKG9wdGlvbiwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJylcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuICgpID0+IHVuZG9TdGFjay5mb3JFYWNoKHVuZG8gPT4gdW5kbyAmJiB1bmRvKCkpO1xufVxuXG5mdW5jdGlvbiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGVsZW1lbnQsIG9ic2VydmVTdWJ0cmVlID0gdHJ1ZSkge1xuICBjb25zdCB1bmRvU3RhY2sgPSBbXS5tYXAuY2FsbChlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKSwgZWxlbWVudCA9PlxuICAgIGRpc2FibGVFbGVtZW50V2l0aFVuZG8oZWxlbWVudClcbiAgKTtcblxuICBjb25zdCB0YWcgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gT25seSBzZXQgdGFiaW5kZXg9XCItMVwiIG9uIGZvY3VzYWJsZSBlbGVtZW50LiBPdGhlcndpc2UsIHdlIHdpbGwgbWFrZSA8ZGl2PiBmb2N1c2FibGUgYnkgbW91c2UuXG4gICh0YWcgPT09ICdhJyB8fCB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJykgJiZcbiAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAndGFiaW5kZXgnLCAnLTEnKSk7XG5cbiAgaWYgKG9ic2VydmVTdWJ0cmVlKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT5cbiAgICAgIG11dGF0aW9ucy5mb3JFYWNoKCh7IGFkZGVkTm9kZXMgfSkgPT5cbiAgICAgICAgdW5kb1N0YWNrLnB1c2goLi4uYWRkZWROb2Rlcy5tYXAoYWRkZWROb2RlID0+IGRpc2FibGVJbnB1dEVsZW1lbnRzV2l0aFVuZG8oYWRkZWROb2RlLCBmYWxzZSkpKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuXG4gICAgdW5kb1N0YWNrLnB1c2goKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpKTtcbiAgfVxuXG4gIHJldHVybiAoKSA9PiB1bmRvU3RhY2suZm9yRWFjaCh1bmRvID0+IHVuZG8gJiYgdW5kbygpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoZWxlbWVudCkge1xuICByZXR1cm4gW10uZmlsdGVyLmNhbGwoXG4gICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgW1xuICAgICAgICAnYScsXG4gICAgICAgICdib2R5JyxcbiAgICAgICAgJ2J1dHRvbicsXG4gICAgICAgICdmcmFtZScsXG4gICAgICAgICdpZnJhbWUnLFxuICAgICAgICAnaW1nJyxcbiAgICAgICAgJ2lucHV0JyxcbiAgICAgICAgJ2lzaW5kZXgnLFxuICAgICAgICAnb2JqZWN0JyxcbiAgICAgICAgJ3NlbGVjdCcsXG4gICAgICAgICd0ZXh0YXJlYScsXG4gICAgICAgICdbdGFiaW5kZXhdJ1xuICAgICAgXS5qb2luKCcsICcpXG4gICAgKSxcbiAgICBlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgoZWxlbWVudCk7XG5cbiAgICAgIHJldHVybiB0eXBlb2YgdGFiSW5kZXggPT09ICdudW1iZXInICYmIHRhYkluZGV4ID49IDA7XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQsIGFjdGl2ZUVsZW1lbnRJbmRleCkge1xuICBjb25zdCBmb2N1c2FibGUgPSBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KVthY3RpdmVFbGVtZW50SW5kZXhdO1xuXG4gIGZvY3VzYWJsZSAmJiBmb2N1c2FibGUuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gc2F2ZUFjdGl2ZUVsZW1lbnRJbmRleChlbGVtZW50KSB7XG4gIHJldHVybiBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KS5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlSW5wdXRWYWx1ZXMoZWxlbWVudCwgaW5wdXRWYWx1ZXMpIHtcbiAgY29uc3QgaW5wdXRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuXG4gIFtdLmZvckVhY2guY2FsbChpbnB1dHMsIChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGlucHV0VmFsdWVzW2luZGV4XTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCB7IHRhZ05hbWUsIHR5cGUgfSA9IGlucHV0O1xuXG4gICAgICBpZiAodGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKSkge1xuICAgICAgICBpbnB1dC5jaGVja2VkID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNhdmVJbnB1dFZhbHVlcyhlbGVtZW50KSB7XG4gIGNvbnN0IGlucHV0cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcblxuICByZXR1cm4gW10ubWFwLmNhbGwoaW5wdXRzLCAoeyBjaGVja2VkLCB0YWdOYW1lLCB0eXBlLCB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKHRhZ05hbWUgPT09ICdJTlBVVCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJykpIHtcbiAgICAgIHJldHVybiBjaGVja2VkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59XG5cbmNvbnN0IEFkYXB0aXZlQ2FyZFJlbmRlcmVyID0gKHsgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lLCBhZGFwdGl2ZUNhcmQsIGRpc2FibGVkOiBkaXNhYmxlZEZyb21Qcm9wcywgdGFwQWN0aW9uIH0pID0+IHtcbiAgY29uc3QgW3sgYWRhcHRpdmVDYXJkUmVuZGVyZXI6IGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBHbG9iYWxTZXR0aW5ncywgSG9zdENvbmZpZyB9XSA9IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlKCk7XG4gIGNvbnN0IFthY3Rpb25zUGVyZm9ybWVkLCBzZXRBY3Rpb25zUGVyZm9ybWVkXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2FkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnXSA9IHVzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKCk7XG4gIGNvbnN0IFtkaXNhYmxlZEZyb21Db21wb3Nlcl0gPSB1c2VEaXNhYmxlZCgpO1xuICBjb25zdCBbZXJyb3JzLCBzZXRFcnJvcnNdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbbGFzdFJlbmRlciwgc2V0TGFzdFJlbmRlcl0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3QgYWN0aXZlRWxlbWVudEluZGV4UmVmID0gdXNlUmVmKC0xKTtcbiAgY29uc3QgYWRhcHRpdmVDYXJkRWxlbWVudFJlZiA9IHVzZVJlZigpO1xuICBjb25zdCBjb250ZW50UmVmID0gdXNlUmVmKCk7XG4gIGNvbnN0IGlucHV0VmFsdWVzUmVmID0gdXNlUmVmKFtdKTtcbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3QgcGVyZm9ybUNhcmRBY3Rpb24gPSB1c2VQZXJmb3JtQ2FyZEFjdGlvbigpO1xuICBjb25zdCByZW5kZXJNYXJrZG93bkFzSFRNTCA9IHVzZVJlbmRlck1hcmtkb3duQXNIVE1MKCk7XG4gIGNvbnN0IHNjcm9sbFRvRW5kID0gdXNlU2Nyb2xsVG9FbmQoKTtcblxuICBjb25zdCBkaXNhYmxlZCA9IGRpc2FibGVkRnJvbUNvbXBvc2VyIHx8IGRpc2FibGVkRnJvbVByb3BzO1xuXG4gIC8vIFRPRE86IFtQMl0gIzMxOTkgV2Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGBhZGFwdGl2ZUNhcmQuc2VsZWN0QWN0aW9uYCBpbnN0ZWFkLlxuICAvLyBUaGUgbnVsbCBjaGVjayBmb3IgXCJ0YXBBY3Rpb25cIiBpcyBpbiBcImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb25cIi5cbiAgY29uc3QgaGFuZGxlQ2xpY2tBbmRLZXlQcmVzcyA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHsga2V5LCB0YXJnZXQsIHR5cGUgfSA9IGV2ZW50O1xuXG4gICAgICAvLyBTb21lIGl0ZW1zLCBlLmcuIHRhcHBhYmxlIHRleHQsIGNhbm5vdCBiZSBkaXNhYmxlZCB0aHJ1IERPTSBhdHRyaWJ1dGVzXG4gICAgICBjb25zdCB7IGN1cnJlbnQgfSA9IGNvbnRlbnRSZWY7XG4gICAgICBjb25zdCBhZGFwdGl2ZUNhcmRSb290ID0gY3VycmVudC5xdWVyeVNlbGVjdG9yKCcuYWMtYWRhcHRpdmVDYXJkW3RhYmluZGV4PVwiMFwiXScpO1xuXG4gICAgICBpZiAoIWFkYXB0aXZlQ2FyZFJvb3QpIHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnYm90ZnJhbWV3b3JrLXdlYmNoYXQ6IE5vIEFkYXB0aXZlIENhcmQgcm9vdCBjb250YWluZXIgY2FuIGJlIGZvdW5kOyB0aGUgY2FyZCBpcyBwcm9iYWJseSBvbiBhbiB1bnN1cHBvcnRlZCBBZGFwdGl2ZSBDYXJkIHZlcnNpb24uJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgXCJrZXlwcmVzc1wiIGV2ZW50LCB3ZSBvbmx5IGxpc3RlbiB0byBFTlRFUiBhbmQgU1BBQ0VCQVIga2V5LlxuICAgICAgaWYgKHR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gJ0VudGVyJyAmJiBrZXkgIT09ICcgJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIHdpbGwgY2FsbCBwZXJmb3JtQ2FyZEFjdGlvbiBpZiBlaXRoZXI6XG4gICAgICAvLyAxLiBXZSBhcmUgb24gdGhlIHRhcmdldCwgb3JcbiAgICAgIC8vIDIuIFRoZSBldmVudC1kaXNwYXRjaGluZyBlbGVtZW50IGlzIG5vdCBpbnRlcmFjdGl2ZVxuICAgICAgaWYgKHRhcmdldCAhPT0gYWRhcHRpdmVDYXJkUm9vdCkge1xuICAgICAgICBjb25zdCB0YWJJbmRleCA9IGdldFRhYkluZGV4KHRhcmdldCk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgaXMgY2xpY2tpbmcgb24gc29tZXRoaW5nIHRoYXQgaXMgYWxyZWFkeSBjbGlja2FibGUsIGRvIG5vdCBhbGxvdyB0aGVtIHRvIGNsaWNrIHRoZSBjYXJkLlxuICAgICAgICAvLyBFLmcuIGEgaGVybyBjYXJkIGNhbiBiZSB0YXBwYWJsZSwgYW5kIGltYWdlIGFuZCBidXR0b25zIGluc2lkZSB0aGUgaGVybyBjYXJkIGNhbiBhbHNvIGJlIHRhcHBhYmxlLlxuICAgICAgICBpZiAodHlwZW9mIHRhYkluZGV4ID09PSAnbnVtYmVyJyAmJiB0YWJJbmRleCA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHRhcEFjdGlvbik7XG4gICAgICBzY3JvbGxUb0VuZCgpO1xuICAgIH0sXG4gICAgW2NvbnRlbnRSZWYsIHBlcmZvcm1DYXJkQWN0aW9uLCBzY3JvbGxUb0VuZCwgdGFwQWN0aW9uXVxuICApO1xuXG4gIC8vIE9ubHkgbGlzdGVuIHRvIGV2ZW50IGlmIGl0IGlzIG5vdCBkaXNhYmxlZCBhbmQgaGF2ZSBcInRhcEFjdGlvblwiIHByb3AuXG4gIGNvbnN0IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24gPSAhZGlzYWJsZWQgJiYgdGFwQWN0aW9uID8gaGFuZGxlQ2xpY2tBbmRLZXlQcmVzcyA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBhZGRBY3Rpb25zUGVyZm9ybWVkID0gdXNlQ2FsbGJhY2soXG4gICAgYWN0aW9uID0+ICF+YWN0aW9uc1BlcmZvcm1lZC5pbmRleE9mKGFjdGlvbikgJiYgc2V0QWN0aW9uc1BlcmZvcm1lZChbLi4uYWN0aW9uc1BlcmZvcm1lZCwgYWN0aW9uXSksXG4gICAgW2FjdGlvbnNQZXJmb3JtZWQsIHNldEFjdGlvbnNQZXJmb3JtZWRdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlRXhlY3V0ZUFjdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgIGFjdGlvbiA9PiB7XG4gICAgICAvLyBTb21lIGl0ZW1zLCBlLmcuIHRhcHBhYmxlIGltYWdlLCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYWRkQWN0aW9uc1BlcmZvcm1lZChhY3Rpb24pO1xuXG4gICAgICBjb25zdCBhY3Rpb25UeXBlTmFtZSA9IGFjdGlvbi5nZXRKc29uVHlwZU5hbWUoKTtcblxuICAgICAgaWYgKGFjdGlvblR5cGVOYW1lID09PSAnQWN0aW9uLk9wZW5VcmwnKSB7XG4gICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHtcbiAgICAgICAgICB0eXBlOiAnb3BlblVybCcsXG4gICAgICAgICAgdmFsdWU6IGFjdGlvbi51cmxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGFjdGlvblR5cGVOYW1lID09PSAnQWN0aW9uLlN1Ym1pdCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBjb25zdCB7IGRhdGE6IGFjdGlvbkRhdGEgfSA9IGFjdGlvbjtcblxuICAgICAgICAgIGlmIChhY3Rpb25EYXRhICYmIGFjdGlvbkRhdGEuX19pc0JvdEZyYW1ld29ya0NhcmRBY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FyZEFjdGlvbiB9ID0gYWN0aW9uRGF0YTtcbiAgICAgICAgICAgIGNvbnN0IHsgZGlzcGxheVRleHQsIHRleHQsIHR5cGUsIHZhbHVlIH0gPSBjYXJkQWN0aW9uO1xuXG4gICAgICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7IGRpc3BsYXlUZXh0LCB0ZXh0LCB0eXBlLCB2YWx1ZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oe1xuICAgICAgICAgICAgICB0eXBlOiB0eXBlb2YgYWN0aW9uLmRhdGEgPT09ICdzdHJpbmcnID8gJ2ltQmFjaycgOiAncG9zdEJhY2snLFxuICAgICAgICAgICAgICB2YWx1ZTogYWN0aW9uLmRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNjcm9sbFRvRW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBXZWIgQ2hhdDogcmVjZWl2ZWQgdW5rbm93biBhY3Rpb24gZnJvbSBBZGFwdGl2ZSBDYXJkc2ApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGFjdGlvbik7XG4gICAgICB9XG4gICAgfSxcbiAgICBbYWRkQWN0aW9uc1BlcmZvcm1lZCwgZGlzYWJsZWQsIHBlcmZvcm1DYXJkQWN0aW9uLCBzY3JvbGxUb0VuZF1cbiAgKTtcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHsgY3VycmVudCB9ID0gY29udGVudFJlZjtcblxuICAgIGlmICghY3VycmVudCB8fCAhYWRhcHRpdmVDYXJkKSB7XG4gICAgICBhY3RpdmVFbGVtZW50SW5kZXhSZWYuY3VycmVudCA9IC0xO1xuICAgICAgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCA9IFtdO1xuICAgIH1cblxuICAgIC8vIEN1cnJlbnRseSwgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgTWFya2Rvd24gZW5naW5lIGlzIHRvIHNldCBpdCB0aHJ1IHN0YXRpYyBtZW1iZXIgb2YgQWRhcHRpdmVDYXJkIGNsYXNzXG5cbiAgICAvLyBUT0RPOiBbUDNdIENoZWNrcyBpZiB3ZSBjb3VsZCBtYWtlIHRoZSBcInJlbmRlck1hcmtkb3duQXNIVE1MXCIgcGVyIGNhcmRcbiAgICAvLyAgICAgICBUaGlzIGNvdWxkIGJlIGxpbWl0YXRpb25zIGZyb20gQWRhcHRpdmUgQ2FyZHMgcGFja2FnZSAobm90IHN1cHBvcnRlZCBhcyBvZiAxLjIuNSlcbiAgICAvLyAgICAgICBCZWNhdXNlIHRoZXJlIGNvdWxkIGJlIHRpbWluZyBkaWZmZXJlbmNlIGJldHdlZW4gLnBhcnNlIGFuZCAucmVuZGVyLCB3ZSBjb3VsZCBiZSB1c2luZyB3cm9uZyBNYXJrZG93biBlbmdpbmVcblxuICAgIGFkYXB0aXZlQ2FyZC5jb25zdHJ1Y3Rvci5vblByb2Nlc3NNYXJrZG93biA9ICh0ZXh0LCByZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZW5kZXJNYXJrZG93bkFzSFRNTCkge1xuICAgICAgICByZXN1bHQub3V0cHV0SHRtbCA9IHJlbmRlck1hcmtkb3duQXNIVE1MKHRleHQpO1xuICAgICAgICByZXN1bHQuZGlkUHJvY2VzcyA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZykge1xuICAgICAgYWRhcHRpdmVDYXJkLmhvc3RDb25maWcgPSBpc1BsYWluT2JqZWN0KGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKVxuICAgICAgICA/IG5ldyBIb3N0Q29uZmlnKGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKVxuICAgICAgICA6IGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnO1xuICAgIH1cblxuICAgIC8vIEZvciBhY2Nlc3NpYmlsaXR5IGlzc3VlICMxMzQwLCBgdGFiaW5kZXg9XCIwXCJgIG11c3Qgbm90IGJlIHNldCBmb3IgdGhlIHJvb3QgY29udGFpbmVyIGlmIGl0IGlzIG5vdCBpbnRlcmFjdGl2ZS5cbiAgICBHbG9iYWxTZXR0aW5ncy5zZXRUYWJJbmRleEF0Q2FyZFJvb3QgPSAhIXRhcEFjdGlvbjtcblxuICAgIGNvbnN0IHsgdmFsaWRhdGlvbkV2ZW50cyB9ID0gYWRhcHRpdmVDYXJkLnZhbGlkYXRlUHJvcGVydGllcygpO1xuXG4gICAgaWYgKHZhbGlkYXRpb25FdmVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gc2V0RXJyb3JzKHZhbGlkYXRpb25FdmVudHMucmVkdWNlKChpdGVtcywgeyBtZXNzYWdlIH0pID0+IFsuLi5pdGVtcywgbmV3IEVycm9yKG1lc3NhZ2UpXSwgW10pKTtcbiAgICB9XG5cbiAgICBsZXQgZWxlbWVudDtcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50ID0gYWRhcHRpdmVDYXJkLnJlbmRlcigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gc2V0RXJyb3JzKFtlcnJvcl0pO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyhbbmV3IEVycm9yKCdBZGFwdGl2ZSBDYXJkIHJlbmRlcmVkIGFzIGVtcHR5IGVsZW1lbnQnKV0pO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGVycm9ycyBvbiBuZXh0IHJlbmRlclxuICAgIHNldEVycm9ycyhbXSk7XG5cbiAgICByZXN0b3JlSW5wdXRWYWx1ZXMoZWxlbWVudCwgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCk7XG5cbiAgICBjdXJyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBGb2N1cyBjYW4gb25seSBiZSByZXN0b3JlZCBhZnRlciB0aGUgRE9NIGlzIGF0dGFjaGVkLlxuICAgIHJlc3RvcmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCwgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQpO1xuXG4gICAgc2V0TGFzdFJlbmRlcihEYXRlLm5vdygpKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmVFbGVtZW50SW5kZXhSZWYuY3VycmVudCA9IHNhdmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCk7XG4gICAgICBpbnB1dFZhbHVlc1JlZi5jdXJyZW50ID0gc2F2ZUlucHV0VmFsdWVzKGVsZW1lbnQpO1xuXG4gICAgICBjdXJyZW50LnJlbW92ZUNoaWxkKGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCk7XG5cbiAgICAgIGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9LCBbXG4gICAgYWRhcHRpdmVDYXJkLFxuICAgIGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnLFxuICAgIGNvbnRlbnRSZWYsXG4gICAgR2xvYmFsU2V0dGluZ3MsXG4gICAgSG9zdENvbmZpZyxcbiAgICByZW5kZXJNYXJrZG93bkFzSFRNTCxcbiAgICBzZXRFcnJvcnMsXG4gICAgdGFwQWN0aW9uXG4gIF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gU2V0IG9uRXhlY3V0ZUFjdGlvbiB3aXRob3V0IGNhdXNpbmcgdW5uZWNlc3NhcnkgcmUtcmVuZGVyLlxuICAgIGFkYXB0aXZlQ2FyZC5vbkV4ZWN1dGVBY3Rpb24gPSBkaXNhYmxlZCA/IHVuZGVmaW5lZCA6IGhhbmRsZUV4ZWN1dGVBY3Rpb247XG4gIH0sIFthZGFwdGl2ZUNhcmQsIGRpc2FibGVkLCBoYW5kbGVFeGVjdXRlQWN0aW9uXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBJZiB0aGUgQWRhcHRpdmUgQ2FyZCBnZXQgcmUtcmVuZGVyZWQsIHJlLWRpc2FibGUgZWxlbWVudHMgYXMgbmVlZGVkLlxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIGRpc2FibGVJbnB1dEVsZW1lbnRzV2l0aFVuZG8oYWRhcHRpdmVDYXJkRWxlbWVudFJlZi5jdXJyZW50KTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlZCwgbGFzdFJlbmRlcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gSWYgdGhlIEFkYXB0aXZlIENhcmQgY2hhbmdlZCwgcmVzZXQgYWxsIGFjdGlvbnMgcGVyZm9ybWVkLlxuICAgIHNldEFjdGlvbnNQZXJmb3JtZWQoW10pO1xuICB9LCBbYWRhcHRpdmVDYXJkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBBZGQgYXJpYS1wcmVzc2VkIGFuZCByb2xlIGF0dHJpYnV0ZSB0byB0aGUgQUMgYWN0aW9uIGJ1dHRvbiBzZWxlY3RlZCBieSB0aGUgdXNlci5cbiAgICBhY3Rpb25zUGVyZm9ybWVkLmZvckVhY2goKHsgcmVuZGVyZWRFbGVtZW50IH0pID0+IHtcbiAgICAgIGlmIChyZW5kZXJlZEVsZW1lbnQgJiYgYWRhcHRpdmVDYXJkRWxlbWVudFJlZi5jdXJyZW50LmNvbnRhaW5zKHJlbmRlcmVkRWxlbWVudCkpIHtcbiAgICAgICAgc2V0QXR0cmlidXRlV2l0aFVuZG8ocmVuZGVyZWRFbGVtZW50LCAnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICAgICAgc2V0QXR0cmlidXRlV2l0aFVuZG8ocmVuZGVyZWRFbGVtZW50LCAncm9sZScsICdidXR0b24nKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFkZCBkZXZlbG9wZXJzIHRvIGhpZ2hsaWdodCBhY3Rpb25zIHdoZW4gdGhleSBoYXZlIGJlZW4gY2xpY2tlZC5cbiAgICBpZiAoIWFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVuZG9TdGFjayA9IGFjdGlvbnNQZXJmb3JtZWQubWFwKFxuICAgICAgKHsgcmVuZGVyZWRFbGVtZW50IH0pID0+XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudCAmJlxuICAgICAgICBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQuY29udGFpbnMocmVuZGVyZWRFbGVtZW50KSAmJlxuICAgICAgICBhZGRQZXJzaXN0ZW50Q2xhc3NXaXRoVW5kbyhyZW5kZXJlZEVsZW1lbnQsIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSlcbiAgICApO1xuXG4gICAgcmV0dXJuICgpID0+IHVuZG9TdGFjay5mb3JFYWNoKHVuZG8gPT4gdW5kbyAmJiB1bmRvKCkpO1xuICB9LCBbYWN0aW9uc1BlcmZvcm1lZCwgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lLCBsYXN0UmVuZGVyXSk7XG5cbiAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyAoXG4gICAgbm9kZV9lbnYgPT09ICdkZXZlbG9wbWVudCcgPyAoXG4gICAgICA8RXJyb3JCb3ggZXJyb3I9e2Vycm9yc1swXX0gdHlwZT17bG9jYWxpemUoJ0FEQVBUSVZFX0NBUkRfRVJST1JfQk9YX1RJVExFX1JFTkRFUicpfSAvPlxuICAgICkgOiAoXG4gICAgICBmYWxzZVxuICAgIClcbiAgKSA6IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCArICcnLCAnd2ViY2hhdF9fYWRhcHRpdmUtY2FyZC1yZW5kZXJlcicpfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvbn1cbiAgICAgIG9uS2V5UHJlc3M9e2hhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb259XG4gICAgICByZWY9e2NvbnRlbnRSZWZ9XG4gICAgLz5cbiAgKTtcbn07XG5cbkFkYXB0aXZlQ2FyZFJlbmRlcmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lOiAnJyxcbiAgZGlzYWJsZWQ6IHVuZGVmaW5lZCxcbiAgdGFwQWN0aW9uOiB1bmRlZmluZWRcbn07XG5cbkFkYXB0aXZlQ2FyZFJlbmRlcmVyLnByb3BUeXBlcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBhZGFwdGl2ZUNhcmQ6IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICB0YXBBY3Rpb246IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nXG4gIH0pXG59O1xuXG5leHBvcnQgZGVmYXVsdCBBZGFwdGl2ZUNhcmRSZW5kZXJlcjtcbiJdfQ==
|
|
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
|