@sapui5/sap.fe.test 1.124.0 → 1.125.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/package.json +1 -1
- package/src/sap/fe/test/.library +1 -1
- package/src/sap/fe/test/JestTemplatingHelper.js +64 -12
- package/src/sap/fe/test/JestTemplatingHelper.tsx +70 -17
- package/src/sap/fe/test/ObjectPage.js +1 -1
- package/src/sap/fe/test/api/HeaderActions.js +12 -10
- package/src/sap/fe/test/api/HeaderActionsLR.js +15 -9
- package/src/sap/fe/test/api/HeaderAssertions.js +24 -32
- package/src/sap/fe/test/api/HeaderAssertionsLR.js +24 -32
- package/src/sap/fe/test/internal/ConsoleErrorChecker.js +1 -1
- package/src/sap/fe/test/internal/ConsoleErrorChecker.ts +2 -4
- package/src/sap/fe/test/internal/FEJourneyRunner.js +10 -0
- package/src/sap/fe/test/library.js +1 -1
package/package.json
CHANGED
package/src/sap/fe/test/.library
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log", "sap/base/util/LoaderExtensions", "sap/base/util/merge", "sap/base/util/uid", "sap/fe/core/AppComponent", "sap/fe/core/TemplateModel", "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/
|
|
5
|
+
sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log", "sap/base/util/LoaderExtensions", "sap/base/util/merge", "sap/base/util/uid", "sap/fe/base/jsx-runtime/jsx", "sap/fe/core/AppComponent", "sap/fe/core/TemplateModel", "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/test/UI5MockHelper", "sap/m/Page", "sap/ui/base/BindingParser", "sap/ui/base/ManagedObject", "sap/ui/base/ManagedObjectMetadata", "sap/ui/core/Component", "sap/ui/core/InvisibleText", "sap/ui/core/XMLTemplateProcessor", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/util/serializer/Serializer", "sap/ui/fl/Utils", "sap/ui/fl/apply/_internal/flexState/FlexState", "sap/ui/fl/apply/_internal/flexState/Loader", "sap/ui/fl/apply/_internal/preprocessors/XmlPreprocessor", "sap/ui/fl/initial/_internal/Storage", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "xpath", "./JestFlexibilityHelper", "sap/fe/base/jsx-runtime/jsx"], function (compiler, fs, htmljs_parser, path, Log, LoaderExtensions, merge, uid, jsx, AppComponent, TemplateModel, BuildingBlockTemplateProcessor, ConverterContext, MetaModelConverter, SideEffectsFactory, UI5MockHelper, Page, BindingParser, ManagedObject, ManagedObjectMetadata, Component, InvisibleText, XMLTemplateProcessor, XMLPreprocessor, Serializer, Utils, FlexState, Loader, XmlPreprocessor, AppStorage, JSONModel, ODataMetaModel, _MetadataRequestor, xpath, JestFlexibilityHelper, _jsx) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
@@ -36,7 +36,9 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
|
|
|
36
36
|
u: "sap.ui.unified",
|
|
37
37
|
macroMicroChart: "sap.fe.macros.microchart",
|
|
38
38
|
microChart: "sap.suite.ui.microchart",
|
|
39
|
-
macroTable: "sap.fe.macros.table"
|
|
39
|
+
macroTable: "sap.fe.macros.table",
|
|
40
|
+
mdcvc: "sap.ui.mdc.valuehelp.content",
|
|
41
|
+
mdcv: "sap.ui.mdc.valuehelp"
|
|
40
42
|
};
|
|
41
43
|
const reveseNamespaceMap = Object.keys(nameSpaceMap).reduce((reverseMap, currentName) => {
|
|
42
44
|
reverseMap[nameSpaceMap[currentName]] = currentName;
|
|
@@ -619,7 +621,10 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
|
|
|
619
621
|
}
|
|
620
622
|
_exports.processFragment = processFragment;
|
|
621
623
|
function serializeControl(controlToSerialize) {
|
|
624
|
+
let showCustomStyleClasses = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
622
625
|
let tabCount = 0;
|
|
626
|
+
const UID = /uid--id-\d{13}-\d{1,3}/;
|
|
627
|
+
const CONTROLID = /id-\d{13}-\d{1,3}/;
|
|
623
628
|
function getTab() {
|
|
624
629
|
let toAdd = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
|
625
630
|
let tab = "";
|
|
@@ -647,25 +652,47 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
|
|
|
647
652
|
return "})";
|
|
648
653
|
},
|
|
649
654
|
middle: function (control) {
|
|
650
|
-
|
|
655
|
+
var _id, _id$replace, _control$aCustomStyle;
|
|
656
|
+
let id = control.getId();
|
|
657
|
+
id = typeof id === "string" ? (_id = id) === null || _id === void 0 ? void 0 : (_id$replace = _id.replace) === null || _id$replace === void 0 ? void 0 : _id$replace.call(_id, CONTROLID, "id") : id;
|
|
651
658
|
let data = `{id: ${ManagedObjectMetadata.isGeneratedId(id) ? "__dynamicId" : id}`;
|
|
652
659
|
for (const oControlKey in control.mProperties) {
|
|
653
660
|
if (control.mProperties.hasOwnProperty(oControlKey)) {
|
|
654
|
-
|
|
661
|
+
var _propertyValue, _propertyValue$replac, _propertyValue2, _propertyValue3, _propertyValue3$repla, _propertyValue4;
|
|
662
|
+
let propertyValue = control.mProperties[oControlKey];
|
|
663
|
+
propertyValue = typeof propertyValue === "string" ? (_propertyValue = propertyValue) === null || _propertyValue === void 0 ? void 0 : (_propertyValue$replac = (_propertyValue2 = _propertyValue).replace) === null || _propertyValue$replac === void 0 ? void 0 : _propertyValue$replac.call(_propertyValue2, UID, "uid--id") : propertyValue;
|
|
664
|
+
propertyValue = typeof propertyValue === "string" ? (_propertyValue3 = propertyValue) === null || _propertyValue3 === void 0 ? void 0 : (_propertyValue3$repla = (_propertyValue4 = _propertyValue3).replace) === null || _propertyValue3$repla === void 0 ? void 0 : _propertyValue3$repla.call(_propertyValue4, CONTROLID, "id") : propertyValue;
|
|
665
|
+
propertyValue = typeof propertyValue === "object" ? JSON.stringify(propertyValue) : propertyValue;
|
|
666
|
+
data += `,\n${getTab()} ${oControlKey}: ${propertyValue}`;
|
|
655
667
|
} else if (control.mBindingInfos.hasOwnProperty(oControlKey)) {
|
|
668
|
+
var _bindingDetail$type;
|
|
656
669
|
const bindingDetail = control.mBindingInfos[oControlKey];
|
|
670
|
+
if ((_bindingDetail$type = bindingDetail.type) !== null && _bindingDetail$type !== void 0 && _bindingDetail$type.oOutputFormat) {
|
|
671
|
+
delete bindingDetail.type.oOutputFormat;
|
|
672
|
+
}
|
|
657
673
|
data += `,\n${getTab()} ${oControlKey}: ${JSON.stringify(bindingDetail)}`;
|
|
658
674
|
}
|
|
659
675
|
}
|
|
660
676
|
for (const oControlKey in control.mAssociations) {
|
|
661
677
|
if (control.mAssociations.hasOwnProperty(oControlKey)) {
|
|
662
|
-
var
|
|
663
|
-
|
|
678
|
+
var _associationValue, _associationValue$joi, _associationValue2;
|
|
679
|
+
let associationValue = control.mAssociations[oControlKey];
|
|
680
|
+
if (!Array.isArray(associationValue)) {
|
|
681
|
+
associationValue = [associationValue];
|
|
682
|
+
}
|
|
683
|
+
associationValue = associationValue.map(associationValueElement => {
|
|
684
|
+
var _associationValueElem;
|
|
685
|
+
return typeof associationValueElement === "string" ? associationValueElement === null || associationValueElement === void 0 ? void 0 : (_associationValueElem = associationValueElement.replace) === null || _associationValueElem === void 0 ? void 0 : _associationValueElem.call(associationValueElement, CONTROLID, "id") : associationValueElement;
|
|
686
|
+
});
|
|
687
|
+
data += `,\n${getTab()} ${oControlKey}: ${(((_associationValue = associationValue) === null || _associationValue === void 0 ? void 0 : (_associationValue$joi = (_associationValue2 = _associationValue).join) === null || _associationValue$joi === void 0 ? void 0 : _associationValue$joi.call(_associationValue2, ",")) ?? associationValue) || undefined}`;
|
|
664
688
|
}
|
|
665
689
|
}
|
|
690
|
+
if (showCustomStyleClasses && ((_control$aCustomStyle = control.aCustomStyleClasses) === null || _control$aCustomStyle === void 0 ? void 0 : _control$aCustomStyle.length) > 0) {
|
|
691
|
+
data += `,\n${getTab()} customStyleClasses : ${control.aCustomStyleClasses.join(", ")}`;
|
|
692
|
+
}
|
|
666
693
|
for (const oControlKey in control.mEventRegistry) {
|
|
667
694
|
if (control.mEventRegistry.hasOwnProperty(oControlKey)) {
|
|
668
|
-
data += `,\n${getTab()} ${oControlKey}: true
|
|
695
|
+
data += `,\n${getTab()} ${oControlKey}: true`;
|
|
669
696
|
}
|
|
670
697
|
}
|
|
671
698
|
data += ``;
|
|
@@ -747,16 +774,20 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
|
|
|
747
774
|
* @param options.cdsFile The path to the CDS file to use for the appComponent
|
|
748
775
|
* @param options.mainContextPath The main context path to use for the appComponent
|
|
749
776
|
* @param options.pageContent The page content to use for the appComponent
|
|
777
|
+
* @param options.content The content to use for the app Component
|
|
778
|
+
* @param name The name to use for the appComponent
|
|
779
|
+
* @param viewLevel The view level to use for the appComponent
|
|
750
780
|
* @returns The appcomponent and templateComponent to use for testing
|
|
751
781
|
*/
|
|
752
782
|
_exports.registerMockFragments = registerMockFragments;
|
|
753
|
-
async function initializeAppComponent(options) {
|
|
783
|
+
async function initializeAppComponent(options, name, viewLevel) {
|
|
754
784
|
var _load, _ref2;
|
|
755
785
|
let cdsFile = options === null || options === void 0 ? void 0 : options.cdsFile;
|
|
756
786
|
if (!cdsFile) {
|
|
757
787
|
cdsFile = compileCDS(path.join(__dirname, "./data/Products.cds"));
|
|
758
788
|
}
|
|
759
789
|
const guid = uid();
|
|
790
|
+
const id = (options === null || options === void 0 ? void 0 : options.componentId) ?? `sap.fe.test.${guid}`;
|
|
760
791
|
const cdsContent = fs.readFileSync(cdsFile).toString();
|
|
761
792
|
sap.jest.registerFakeFragment(`/sap/fe/core/mock/${guid}/$metadata?sap-language=EN`, cdsContent);
|
|
762
793
|
sap.ui.define(`sap/fe/test/${guid}/Component`, ["sap/fe/core/AppComponent"], function (_AppComponent) {
|
|
@@ -789,13 +820,15 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
|
|
|
789
820
|
targets: {
|
|
790
821
|
Default: {
|
|
791
822
|
type: "Component",
|
|
792
|
-
name: "sap.fe.core.fpm",
|
|
823
|
+
name: name ?? "sap.fe.core.fpm",
|
|
793
824
|
id: "Default",
|
|
825
|
+
viewLevel: viewLevel,
|
|
794
826
|
options: {
|
|
795
827
|
settings: {
|
|
796
828
|
contextPath: (options === null || options === void 0 ? void 0 : options.mainContextPath) ?? "/Products",
|
|
797
829
|
viewType: "JSX",
|
|
798
|
-
viewContent: (options === null || options === void 0 ? void 0 : options.pageContent) ?? (() => _jsx(Page, {}))
|
|
830
|
+
viewContent: (options === null || options === void 0 ? void 0 : options.pageContent) ?? (() => _jsx(Page, {})),
|
|
831
|
+
content: options === null || options === void 0 ? void 0 : options.content
|
|
799
832
|
}
|
|
800
833
|
}
|
|
801
834
|
}
|
|
@@ -812,7 +845,8 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
|
|
|
812
845
|
});
|
|
813
846
|
});
|
|
814
847
|
const mockAppComponent = await Component.create({
|
|
815
|
-
name: `sap.fe.test.${guid}
|
|
848
|
+
name: `sap.fe.test.${guid}`,
|
|
849
|
+
id: id
|
|
816
850
|
});
|
|
817
851
|
await mockAppComponent.initialized;
|
|
818
852
|
const v = await ((_load = (_ref2 = mockAppComponent.getRouter().getTarget("Default")).load) === null || _load === void 0 ? void 0 : _load.call(_ref2));
|
|
@@ -821,7 +855,25 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
|
|
|
821
855
|
templateComponent: v.object
|
|
822
856
|
};
|
|
823
857
|
}
|
|
858
|
+
|
|
859
|
+
/**
|
|
860
|
+
* Find an element in a collection that matches the given selector.
|
|
861
|
+
*
|
|
862
|
+
* @param collection
|
|
863
|
+
* @param selector
|
|
864
|
+
* @returns The element that matches the selector or undefined if no element matches the selector
|
|
865
|
+
*/
|
|
824
866
|
_exports.initializeAppComponent = initializeAppComponent;
|
|
867
|
+
function findElement(collection, selector) {
|
|
868
|
+
for (let i = 0; i < collection.length; i++) {
|
|
869
|
+
const element = collection.item(i);
|
|
870
|
+
if (selector(element)) {
|
|
871
|
+
return element;
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
return undefined;
|
|
875
|
+
}
|
|
876
|
+
_exports.findElement = findElement;
|
|
825
877
|
return _exports;
|
|
826
878
|
}, false);
|
|
827
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMb2ciLCJzZXRMZXZlbCIsImplc3QiLCJzZXRUaW1lb3V0IiwibmFtZVNwYWNlTWFwIiwibWFjcm8iLCJtYWNyb3MiLCJmZUJCIiwibWFjcm9GaWVsZCIsIm1hY3JvZGF0YSIsImxvZyIsImNvbnRyb2wiLCJjb250cm9scyIsImNvcmUiLCJkdCIsIm0iLCJmIiwiZmwiLCJpbnRlcm5hbE1hY3JvIiwibWRjIiwibWRjYXQiLCJtZGNGaWVsZCIsIm1kY1RhYmxlIiwidSIsIm1hY3JvTWljcm9DaGFydCIsIm1pY3JvQ2hhcnQiLCJtYWNyb1RhYmxlIiwicmV2ZXNlTmFtZXNwYWNlTWFwIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsInJldmVyc2VNYXAiLCJjdXJyZW50TmFtZSIsInNlbGVjdCIsInhwYXRoIiwidXNlTmFtZXNwYWNlcyIsImRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UiLCJjb21wdXRlRmllbGRHcm91cElkcyIsIl9nZXRUZW1wbGF0ZWRTZWxlY3RvciIsInhtbGRvbSIsInNlbGVjdG9yIiwicm9vdFBhdGgiLCJub2RlTmFtZSIsInN0YXJ0c1dpdGgiLCJfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyIsInNNZXRhZGF0YVVybCIsIm1CaW5kaW5nQ29udGV4dHMiLCJtTW9kZWxzIiwiZmFrZVNpZGVFZmZlY3RTZXJ2aWNlIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImhhc093blByb3BlcnR5IiwiYXNzaWduIiwiY29udmVydGVyQ29udGV4dCIsIlRlbXBsYXRlTW9kZWwiLCJmb3JFYWNoIiwic01vZGVsTmFtZSIsImlzVGVtcGxhdGVNb2RlbCIsImRhdGEiLCJzZXR0aW5ncyIsIm1vZGVscyIsIm1ldGFNb2RlbCIsImJpbmRpbmdDb250ZXh0cyIsImFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImZuIiwiZ2V0RGlhZ25vc3RpY3MiLCJ1bmRlZmluZWQiLCJnZXRTaGVsbFNlcnZpY2VzIiwibW9ja1JldHVyblZhbHVlIiwic0tleSIsImV4cGVjdCIsImdldE9iamVjdCIsInRvQmVEZWZpbmVkIiwib01vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJfbG9hZFJlc291cmNlVmlldyIsInZpZXdOYW1lIiwibmFtZSIsInJlcGxhY2UiLCJ2aWV3IiwiTG9hZGVyRXh0ZW5zaW9ucyIsImxvYWRSZXNvdXJjZSIsImRvY3VtZW50RWxlbWVudCIsInJ1blhQYXRoUXVlcnkiLCJleHRlbmQiLCJ0b0hhdmVDb250cm9sIiwibm9kZXMiLCJtZXNzYWdlIiwib3V0cHV0WG1sIiwic2VyaWFsaXplWE1MIiwicGFzcyIsImxlbmd0aCIsInRvTm90SGF2ZUNvbnRyb2wiLCJ0b0hhdmVUZW1wbGF0aW5nRXJyb3JzIiwieG1sIiwieG1sVGV4dCIsImJhc2U2NEVudHJpZXMiLCJtYXRjaCIsImVycm9yTWVzc2FnZXMiLCJtYXAiLCJhdG9iIiwic2xpY2UiLCJqb2luIiwiZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCIsInhtbFN0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImZvcm1hdFhNTCIsImdldENvbnRyb2xBdHRyaWJ1dGUiLCJjb250cm9sU2VsZWN0b3IiLCJhdHRyaWJ1dGVOYW1lIiwieG1sRG9tIiwic2VyaWFsaXplciIsIndpbmRvdyIsIlhNTFNlcmlhbGl6ZXIiLCJub2RlIiwic2VyaWFsaXplVG9TdHJpbmciLCJTVEFSVCIsIkVORCIsIlVJRCIsImxpbmVzIiwiY3VycmVudExpbmUiLCJsZXZlbCIsImF0dHJpYnV0ZXMiLCJuZXdsaW5lIiwicHVzaCIsInJlcGVhdCIsImFwcGVuZEF0dHJpYnV0ZXMiLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiaW5jbHVkZXMiLCJhdHRyaWJ1dGUiLCJ2YWx1ZSIsImFwcGVuZCIsInBhcnNlciIsInJlYWQiLCJjcmVhdGVQYXJzZXIiLCJvbk9wZW5UYWdTdGFydCIsIm9uT3BlblRhZ05hbWUiLCJvbkF0dHJOYW1lIiwidW5zaGlmdCIsIm9uQXR0clZhbHVlIiwib25PcGVuVGFnRW5kIiwic2VsZkNsb3NlZCIsIm9uQ2xvc2VUYWdTdGFydCIsIm9uQ2xvc2VUYWdOYW1lIiwib25DbG9zZVRhZ0VuZCIsInBhcnNlIiwidHJpbSIsImNvbXBpbGVDRFMiLCJjZHNVcmwiLCJvcHRpb25zIiwiY2RzU3RyaW5nIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJlZG14Q29udGVudCIsImNkczJlZG14IiwiZGlyIiwicGF0aCIsInJlc29sdmUiLCJhbGxPcHRpb25zIiwiZW50cmllcyIsImVkbXhGaWxlTmFtZSIsImZpbGVuYW1lIiwib3B0aW9uS2V5Iiwib3B0aW9uVmFsdWUiLCJ0b1N0cmluZyIsImJhc2VuYW1lIiwiZWRteEZpbGVQYXRoIiwibWtkaXJTeW5jIiwicmVjdXJzaXZlIiwid3JpdGVGaWxlU3luYyIsImNkcyIsInNlcnZpY2UiLCJzb3VyY2VzIiwicmVxdWlyZSIsImNzbiIsImNvbXBpbGVyIiwiY29tcGlsZVNvdXJjZXMiLCJlZG14T3B0aW9ucyIsIm9kYXRhRm9yZWlnbktleXMiLCJvZGF0YUZvcm1hdCIsIm9kYXRhQ29udGFpbm1lbnQiLCJlZG14IiwidG8iLCJFcnJvciIsImdldEZha2VTaWRlRWZmZWN0c1NlcnZpY2UiLCJjbGFzc05hbWVPRGF0YU1vZGVsIiwic2NvcGVPYmplY3QiLCJnZXRNb2RlbCIsImlzQSIsImdldFNlcnZpY2VVcmwiLCJnZXRTZXJ2aWNlIiwiZ2V0Q2FwYWJpbGl0aWVzIiwic2VydmljZUluc3RhbmNlIiwiU2lkZUVmZmVjdHNGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJzY29wZVR5cGUiLCJnZXRJbnRlcmZhY2UiLCJnZXRGYWtlRGlhZ25vc3RpY3MiLCJpc3N1ZXMiLCJhZGRJc3N1ZSIsImlzc3VlQ2F0ZWdvcnkiLCJpc3N1ZVNldmVyaXR5IiwiZGV0YWlscyIsImdldElzc3VlcyIsImNoZWNrSWZJc3N1ZUV4aXN0cyIsImZpbmQiLCJpc3N1ZSIsImdldENvbnZlcnRlckNvbnRleHRGb3JUZXN0IiwibWFuaWZlc3RTZXR0aW5ncyIsImNvbnZlcnRlZFR5cGVzIiwiY29udmVydFR5cGVzIiwiZGF0YU1vZGVsUGF0aCIsImNvbnRleHRQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZW50aXR5U2V0IiwiQ29udmVydGVyQ29udGV4dCIsIm1lcmdlIiwibWV0YU1vZGVsQ2FjaGUiLCJvUmVxdWVzdG9yIiwiX01ldGFkYXRhUmVxdWVzdG9yIiwiY3JlYXRlIiwiT0RhdGFNZXRhTW9kZWwiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsImdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYXJncyIsImZvcm1hdHRlciIsImFwcGx5IiwiZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsIiwibW9kZWxDb250ZW50IiwibmFtZWRNb2RlbHNDb250ZW50IiwidGV4dCIsIkludmlzaWJsZVRleHQiLCJiaW5kUHJvcGVydHkiLCJkZWZhdWx0TW9kZWwiLCJKU09OTW9kZWwiLCJzZXRNb2RlbCIsInNldEJpbmRpbmdDb250ZXh0IiwiY29udGVudCIsIm1vZGVsIiwiZ2V0VGV4dCIsIlRFU1RWSUVXSUQiLCJhcHBseUZsZXhDaGFuZ2VzIiwiZmxleENoYW5nZXMiLCJyZXN1bHRYTUwiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaWQiLCJjaGFuZ2VzIiwiY3JlYXRlRmxleGliaWxpdHlDaGFuZ2VzT2JqZWN0IiwiYXBwSWQiLCJvTWFuaWZlc3QiLCJ0eXBlIiwiY3Jvc3NOYXZpZ2F0aW9uIiwib3V0Ym91bmRzIiwib0FwcENvbXBvbmVudCIsImdldENvbXBvbmVudERhdGEiLCJnZXRNYW5pZmVzdE9iamVjdCIsImdldEVudHJ5IiwiZ2V0TG9jYWxJZCIsInNJZCIsInNweU9uIiwiQXBwU3RvcmFnZSIsIlByb21pc2UiLCJMb2FkZXIiLCJDb21wb25lbnQiLCJVdGlscyIsIkZsZXhTdGF0ZSIsImluaXRpYWxpemUiLCJjb21wb25lbnRJZCIsIlhtbFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJjaGFuZ2VzQXBwbGllZCIsImdldENoYW5nZXNGcm9tWE1MIiwidG9CZSIsInZhcmlhbnREZXBlbmRlbnRDb250cm9sQ2hhbmdlcyIsImZsYXRNYXAiLCJlIiwiZmlsdGVyIiwiYXR0ciIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsImNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsIiwidGVtcGxhdGVkWG1sIiwiRE9NUGFyc2VyIiwieG1sRG9jIiwicGFyc2VGcm9tU3RyaW5nIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwiWE1MUHJlcHJvY2Vzc29yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJnZXRUZW1wbGF0ZWRYTUwiLCJqc3giLCJkZWZpbmVYTUxOYW1lc3BhY2VNYXAiLCJ0ZW1wbGF0ZWRYTUwiLCJzZXJpYWxpZWRYTUwiLCJub3QiLCJwcm9jZXNzVmlldyIsIm9WaWV3RG9jdW1lbnQiLCJvUHJlcHJvY2Vzc2VkVmlldyIsImFzRWxlbWVudCIsImFzU3RyaW5nIiwib3V0ZXJIVE1MIiwicHJvY2Vzc0ZyYWdtZW50IiwidGVzdERhdGEiLCJpbnB1dFhtbCIsImlucHV0RG9jIiwianNvbk1vZGVsIiwic2V0RGF0YSIsInJlc3VsdERvYyIsImZyYWdtZW50cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZnJhZ21lbnQiLCJpbm5lckhUTUwiLCJ4bWxSZXN1bHQiLCJjaGlsZHJlbiIsInNlcmlhbGl6ZUNvbnRyb2wiLCJjb250cm9sVG9TZXJpYWxpemUiLCJ0YWJDb3VudCIsImdldFRhYiIsInRvQWRkIiwidGFiIiwiaSIsInNlcmlhbGl6ZURlbGVnYXRlIiwic3RhcnQiLCJzQWdncmVnYXRpb25OYW1lIiwiY29udHJvbERldGFpbCIsImdldFBhcmVudCIsImluZGV4SW5QYXJlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImluZGV4T2YiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJlbmQiLCJtaWRkbGUiLCJnZXRJZCIsIk1hbmFnZWRPYmplY3RNZXRhZGF0YSIsImlzR2VuZXJhdGVkSWQiLCJvQ29udHJvbEtleSIsIm1Qcm9wZXJ0aWVzIiwibUJpbmRpbmdJbmZvcyIsImJpbmRpbmdEZXRhaWwiLCJKU09OIiwic3RyaW5naWZ5IiwibUFzc29jaWF0aW9ucyIsIm1FdmVudFJlZ2lzdHJ5Iiwic3RhcnRBZ2dyZWdhdGlvbiIsInNOYW1lIiwib3V0IiwiZW5kQWdncmVnYXRpb24iLCJjb250cm9sVG9SZW5kZXIiLCJTZXJpYWxpemVyIiwic2VyaWFsaXplIiwiY3JlYXRlQXdhaXRlciIsImZuUmVzb2x2ZSIsIm15UHJvbWlzZSIsInByb21pc2UiLCJyZW5kZXJCdWlsZGluZ0Jsb2NrV2l0aE1vZGVscyIsImJ1aWxkaW5nQmxvY2siLCJNYW5hZ2VkT2JqZWN0IiwicnVuV2l0aFByZXByb2Nlc3NvcnMiLCJnZXRDb250ZW50IiwiY29udHJvbFNldHRpbmdzIiwicmVnaXN0ZXJNb2NrRnJhZ21lbnRzIiwib3JpZ2luYWxMb2FkVGVtcGxhdGUiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZVByb21pc2UiLCJsb2FkVGVtcGxhdGVTdHViIiwibW9ja0ltcGxlbWVudGF0aW9uIiwidGVtcGxhdGVOYW1lIiwiZXh0ZW5zaW9uIiwicGFyc2VYTUxTdHJpbmciLCJpbml0aWFsaXplQXBwQ29tcG9uZW50IiwiY2RzRmlsZSIsIl9fZGlybmFtZSIsImd1aWQiLCJ1aWQiLCJjZHNDb250ZW50Iiwic2FwIiwicmVnaXN0ZXJGYWtlRnJhZ21lbnQiLCJ1aSIsImRlZmluZSIsIl9BcHBDb21wb25lbnQiLCJBcHBDb21wb25lbnQiLCJtZXRhZGF0YSIsIm1hbmlmZXN0IiwiZGF0YVNvdXJjZXMiLCJtYWluU2VydmljZSIsInVyaSIsIm9kYXRhVmVyc2lvbiIsImRhdGFTb3VyY2UiLCJzeW5jaHJvbml6YXRpb25Nb2RlIiwicm91dGluZyIsInRhcmdldHMiLCJEZWZhdWx0IiwibWFpbkNvbnRleHRQYXRoIiwidmlld1R5cGUiLCJ2aWV3Q29udGVudCIsInBhZ2VDb250ZW50Iiwicm91dGVzIiwicGF0dGVybiIsInRhcmdldCIsIm1vY2tBcHBDb21wb25lbnQiLCJpbml0aWFsaXplZCIsInYiLCJnZXRSb3V0ZXIiLCJnZXRUYXJnZXQiLCJsb2FkIiwidGVtcGxhdGVDb21wb25lbnQiLCJvYmplY3QiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFueUFubm90YXRpb24sIENvbnZlcnRlZE1ldGFkYXRhLCBFbnRpdHlTZXQsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgY29tcGlsZXIgZnJvbSBcIkBzYXAvY2RzLWNvbXBpbGVyXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB0eXBlIHsgUmFuZ2UsIFJhbmdlcyB9IGZyb20gXCJodG1sanMtcGFyc2VyXCI7XG5pbXBvcnQgeyBjcmVhdGVQYXJzZXIgfSBmcm9tIFwiaHRtbGpzLXBhcnNlclwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgTG9hZGVyRXh0ZW5zaW9ucyBmcm9tIFwic2FwL2Jhc2UvdXRpbC9Mb2FkZXJFeHRlbnNpb25zXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IFRlbXBsYXRlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlTW9kZWxcIjtcbmltcG9ydCB7IHBhcnNlWE1MU3RyaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzLCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IElEaWFnbm9zdGljcywgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQganN4IGZyb20gXCJzYXAvZmUvY29yZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTaWRlRWZmZWN0c0ZhY3RvcnkgZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS90ZXN0L1VJNU1vY2tIZWxwZXJcIjtcbmltcG9ydCBQYWdlIGZyb20gXCJzYXAvbS9QYWdlXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEludmlzaWJsZVRleHQgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVRleHRcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgU2VyaWFsaXplciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9zZXJpYWxpemVyL1NlcmlhbGl6ZXJcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwic2FwL3VpL2ZsL1V0aWxzXCI7XG5pbXBvcnQgRmxleFN0YXRlIGZyb20gXCJzYXAvdWkvZmwvYXBwbHkvX2ludGVybmFsL2ZsZXhTdGF0ZS9GbGV4U3RhdGVcIjtcbmltcG9ydCBMb2FkZXIgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvZmxleFN0YXRlL0xvYWRlclwiO1xuaW1wb3J0IFhtbFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L19pbnRlcm5hbC9wcmVwcm9jZXNzb3JzL1htbFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEFwcFN0b3JhZ2UgZnJvbSBcInNhcC91aS9mbC9pbml0aWFsL19pbnRlcm5hbC9TdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvbWRjL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9NZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBfTWV0YWRhdGFSZXF1ZXN0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9saWIvX01ldGFkYXRhUmVxdWVzdG9yXCI7XG5pbXBvcnQgeHBhdGggZnJvbSBcInhwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRPYmplY3RFeCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi90eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUZsZXhpYmlsaXR5Q2hhbmdlc09iamVjdCB9IGZyb20gXCIuL0plc3RGbGV4aWJpbGl0eUhlbHBlclwiO1xuXG50eXBlIFByZVByb2Nlc3NvclNldHRpbmdzVHlwZSA9IHtcblx0bW9kZWxzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IEpTT05Nb2RlbCB8IE9EYXRhTWV0YU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRbbmFtZTogc3RyaW5nXTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0fTtcbn07XG50eXBlIE1vY2tGcmFnbWVudCA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRjb250ZW50OiBzdHJpbmc7XG59O1xuXG50eXBlIEplc3RUZW1wbGF0ZWRWaWV3ID0ge1xuXHRhc0VsZW1lbnQ6IEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cdGFzU3RyaW5nOiBzdHJpbmc7XG59O1xuXG5Mb2cuc2V0TGV2ZWwoMSBhcyBhbnksIFwic2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3JcIik7XG5qZXN0LnNldFRpbWVvdXQoNDAwMDApO1xuXG5jb25zdCBuYW1lU3BhY2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG5cdG1hY3JvOiBcInNhcC5mZS5tYWNyb3NcIixcblx0bWFjcm9zOiBcInNhcC5mZS5tYWNyb3NcIixcblx0ZmVCQjogXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy50ZW1wbGF0aW5nXCIsXG5cdG1hY3JvRmllbGQ6IFwic2FwLmZlLm1hY3Jvcy5maWVsZFwiLFxuXHRtYWNyb2RhdGE6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRsb2c6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRjb250cm9sOiBcInNhcC5mZS5jb3JlLmNvbnRyb2xzXCIsXG5cdGNvbnRyb2xzOiBcInNhcC5mZS5tYWNyb3MuY29udHJvbHNcIixcblx0Y29yZTogXCJzYXAudWkuY29yZVwiLFxuXHRkdDogXCJzYXAudWkuZHRcIixcblx0bTogXCJzYXAubVwiLFxuXHRmOiBcInNhcC51aS5sYXlvdXQuZm9ybVwiLFxuXHRmbDogXCJzYXAudWkuZmxcIixcblx0aW50ZXJuYWxNYWNybzogXCJzYXAuZmUubWFjcm9zLmludGVybmFsXCIsXG5cdG1kYzogXCJzYXAudWkubWRjXCIsXG5cdG1kY2F0OiBcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhclwiLFxuXHRtZGNGaWVsZDogXCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdG1kY1RhYmxlOiBcInNhcC51aS5tZGMudGFibGVcIixcblx0dTogXCJzYXAudWkudW5pZmllZFwiLFxuXHRtYWNyb01pY3JvQ2hhcnQ6IFwic2FwLmZlLm1hY3Jvcy5taWNyb2NoYXJ0XCIsXG5cdG1pY3JvQ2hhcnQ6IFwic2FwLnN1aXRlLnVpLm1pY3JvY2hhcnRcIixcblx0bWFjcm9UYWJsZTogXCJzYXAuZmUubWFjcm9zLnRhYmxlXCJcbn07XG5jb25zdCByZXZlc2VOYW1lc3BhY2VNYXAgPSBPYmplY3Qua2V5cyhuYW1lU3BhY2VNYXApLnJlZHVjZSgocmV2ZXJzZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY3VycmVudE5hbWUpID0+IHtcblx0cmV2ZXJzZU1hcFtuYW1lU3BhY2VNYXBbY3VycmVudE5hbWVdXSA9IGN1cnJlbnROYW1lO1xuXHRyZXR1cm4gcmV2ZXJzZU1hcDtcbn0sIHt9KTtcbmNvbnN0IHNlbGVjdCA9IHhwYXRoLnVzZU5hbWVzcGFjZXMobmFtZVNwYWNlTWFwKTtcblxuY29uc3QgZGVmYXVsdEZha2VTaWRlRWZmZWN0U2VydmljZSA9IHsgY29tcHV0ZUZpZWxkR3JvdXBJZHM6ICgpID0+IFtdIH07XG5cbmZ1bmN0aW9uIF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb206IE5vZGUsIHNlbGVjdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvKipcblx0ICogaWYgYSByb290IGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgZHVyaW5nIHRoZSB0ZW1wbGF0aW5nIGJ5IG91ciBKZXN0IFRlbXBsYXRpbmcgbWV0aG9kc1xuXHQgKiB0aGUgcm9vdCBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBzZWxlY3RvciBwYXRoLlxuXHQgKi9cblx0Y29uc3Qgcm9vdFBhdGggPSBcIi9yb290XCI7XG5cdHJldHVybiBgJHt4bWxkb20ubm9kZU5hbWUgPT09IFwicm9vdFwiICYmICFzZWxlY3Rvci5zdGFydHNXaXRoKHJvb3RQYXRoKSA/IHJvb3RQYXRoIDogXCJcIn0ke3NlbGVjdG9yfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzKFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuXHRmYWtlU2lkZUVmZmVjdFNlcnZpY2U/OiB1bmtub3duXG4pOiBQcm9taXNlPFByZVByb2Nlc3NvclNldHRpbmdzVHlwZT4ge1xuXHRsZXQgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdGlmIChzTWV0YWRhdGFVcmwpIHtcblx0XHRvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdFx0Ly8gVG8gZW5zdXJlIG91ciBtYWNybyBjYW4gdXNlICNzZXRCaW5kaW5nQ29udGV4dCB3ZSBlbnN1cmUgdGhlcmUgaXMgYSBwcmUgZXhpc3RpbmcgSlNPTk1vZGVsIGZvciBjb252ZXJ0ZXJDb250ZXh0XG5cdFx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cdFx0aWYgKCFtTW9kZWxzLmhhc093blByb3BlcnR5KFwiY29udmVydGVyQ29udGV4dFwiKSkge1xuXHRcdFx0bU1vZGVscyA9IE9iamVjdC5hc3NpZ24obU1vZGVscywgeyBjb252ZXJ0ZXJDb250ZXh0OiBuZXcgVGVtcGxhdGVNb2RlbCh7fSwgb01ldGFNb2RlbCEpIH0pO1xuXHRcdH1cblxuXHRcdE9iamVjdC5rZXlzKG1Nb2RlbHMpLmZvckVhY2goZnVuY3Rpb24gKHNNb2RlbE5hbWUpIHtcblx0XHRcdGlmIChtTW9kZWxzW3NNb2RlbE5hbWVdICYmIG1Nb2RlbHNbc01vZGVsTmFtZV0uaXNUZW1wbGF0ZU1vZGVsKSB7XG5cdFx0XHRcdG1Nb2RlbHNbc01vZGVsTmFtZV0gPSBuZXcgVGVtcGxhdGVNb2RlbChtTW9kZWxzW3NNb2RlbE5hbWVdLmRhdGEsIG9NZXRhTW9kZWwhKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGNvbnN0IHNldHRpbmdzOiBhbnkgPSB7XG5cdFx0bW9kZWxzOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRtTW9kZWxzXG5cdFx0KSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9LFxuXHRcdGFwcENvbXBvbmVudDogeyBnZXRTaWRlRWZmZWN0c1NlcnZpY2U6IGplc3QuZm4oKSwgZ2V0RGlhZ25vc3RpY3M6ICgpID0+IHVuZGVmaW5lZCwgZ2V0U2hlbGxTZXJ2aWNlczogamVzdC5mbigpIH1cblx0fTtcblxuXHRzZXR0aW5ncy5hcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlLm1vY2tSZXR1cm5WYWx1ZShmYWtlU2lkZUVmZmVjdFNlcnZpY2UgPz8gZGVmYXVsdEZha2VTaWRlRWZmZWN0U2VydmljZSk7XG5cdC8vSW5qZWN0IG1vZGVscyBhbmQgYmluZGluZ0NvbnRleHRzXG5cdE9iamVjdC5rZXlzKG1CaW5kaW5nQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXkpIHtcblx0XHQvKiBBc3NlcnQgdG8gbWFrZSBzdXJlIHRoZSBhbm5vdGF0aW9ucyBhcmUgaW4gdGhlIHRlc3QgbWV0YWRhdGEgLT4gYXZvaWQgbWlzbGVhZGluZyB0ZXN0cyAqL1xuXHRcdGV4cGVjdCh0eXBlb2Ygb01ldGFNb2RlbD8uZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0tleV0gPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQobUJpbmRpbmdDb250ZXh0c1tzS2V5XSk7IC8vVmFsdWUgaXMgc1BhdGhcblx0XHRzZXR0aW5ncy5tb2RlbHNbc0tleV0gPSBvTW9kZWw7XG5cdH0pO1xuXHRyZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIF9sb2FkUmVzb3VyY2VWaWV3KHZpZXdOYW1lOiBzdHJpbmcpOiBFbGVtZW50IHtcblx0Y29uc3QgbmFtZSA9IHZpZXdOYW1lLnJlcGxhY2UoL1xcLi9nLCBcIi9cIikgKyBcIi52aWV3LnhtbFwiO1xuXHRjb25zdCB2aWV3ID0gTG9hZGVyRXh0ZW5zaW9ucy5sb2FkUmVzb3VyY2UobmFtZSk7XG5cdHJldHVybiB2aWV3LmRvY3VtZW50RWxlbWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IHJ1blhQYXRoUXVlcnkgPSBmdW5jdGlvbiAoc2VsZWN0b3I6IHN0cmluZywgeG1sZG9tOiBOb2RlIHwgdW5kZWZpbmVkKSB7XG5cdHJldHVybiBzZWxlY3Qoc2VsZWN0b3IsIHhtbGRvbSk7XG59O1xuXG5leHBlY3QuZXh0ZW5kKHtcblx0dG9IYXZlQ29udHJvbCh4bWxkb20sIHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb20sIHNlbGVjdG9yKSwgeG1sZG9tKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvdXRwdXRYbWwgPSBzZXJpYWxpemVYTUwoeG1sZG9tKTtcblx0XHRcdFx0cmV0dXJuIGBkaWQgbm90IGZpbmQgY29udHJvbHMgbWF0Y2hpbmcgJHtzZWxlY3Rvcn0gaW4gZ2VuZXJhdGVkIHhtbDpcXG4gJHtvdXRwdXRYbWx9YDtcblx0XHRcdH0sXG5cdFx0XHRwYXNzOiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPj0gMVxuXHRcdH07XG5cdH0sXG5cdHRvTm90SGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tLCBzZWxlY3RvciksIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgVGhlcmUgaXMgYSBjb250cm9sIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID09PSAwXG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrcyBmb3IgZXJyb3JzIGluIGB4bWxgIGNyZWF0ZWQgZHVyaW5nIHRlbXBsYXRpbmcgb2YgYW4gWE1MIHN0cmluZyBvclxuXHQgKiBhbiBYTUwgbm9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBjaGVja2VzIGZvciB0aGUgeG1sIGVycm9ycyBjcmVhdGVkIGJ5IHRoZVxuXHQgKiBmdW5jdGlvbiBbQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yLmNyZWF0ZUVycm9yWE1MXXtAbGluayBzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy50ZW1wbGF0aW5nLkJ1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvciNjcmVhdGVFcnJvclhNTH0uXG5cdCAqXG5cdCAqIEBwYXJhbSB4bWwgWE1MIFN0cmluZyBvciBYTUwgTm9kZSB0byBiZSB0ZXN0ZWQgZm9yIGVycm9yc1xuXHQgKiBAcmV0dXJucyBKZXN0IE1hdGNoZXIgcmVzdWx0IG9iamVjdFxuXHQgKi9cblx0dG9IYXZlVGVtcGxhdGluZ0Vycm9ycyh4bWw6IHN0cmluZyB8IE5vZGUpIHtcblx0XHRjb25zdCB4bWxUZXh0ID0gdHlwZW9mIHhtbCA9PT0gXCJzdHJpbmdcIiA/IHhtbCA6IHNlcmlhbGl6ZVhNTCh4bWwpO1xuXHRcdGNvbnN0IGJhc2U2NEVudHJpZXM6IHN0cmluZ1tdID0geG1sVGV4dC5tYXRjaCgvQkJGXFwuYmFzZTY0RGVjb2RlXFwoJyhbXiddKiknXFwpL2dtKSB8fCAoW10gYXMgc3RyaW5nW10pO1xuXHRcdGNvbnN0IGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdID0gYmFzZTY0RW50cmllcy5tYXAoKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuXHRcdFx0aWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBhdG9iKG1lc3NhZ2UubWF0Y2goLygnW14nXSopLyk/LlswXT8uc2xpY2UoMSkgfHwgXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9KTtcblx0XHRpZiAoZXJyb3JNZXNzYWdlcy5sZW5ndGggPD0gMCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWVzc2FnZTogKCkgPT4gYFhNTCBUZW1wbGF0aW5nIHdpdGhvdXQgZXJyb3JzYCxcblx0XHRcdFx0cGFzczogZmFsc2Vcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1lc3NhZ2U6ICgpID0+IGVycm9yTWVzc2FnZXMuam9pbihcIlxcblwiKSxcblx0XHRcdFx0cGFzczogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoeG1sU3RyaW5nKSkge1xuXHRcdHhtbFN0cmluZyA9IHhtbFN0cmluZy5qb2luKFwiXCIpO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoeG1sU3RyaW5nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250cm9sQXR0cmlidXRlID0gZnVuY3Rpb24gKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoJHtfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sRG9tLCBjb250cm9sU2VsZWN0b3IpfS9AJHthdHRyaWJ1dGVOYW1lfSlgO1xuXHRyZXR1cm4gcnVuWFBhdGhRdWVyeShzZWxlY3RvciwgeG1sRG9tKTtcbn07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBwYXJ0cyBvciB0aGUgY29tcGxldGUgZ2l2ZW4gWE1MIERPTSB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHhtbERvbSBET00gbm9kZSB0aGF0IGlzIHRvIGJlIHNlcmlhbGl6ZWQuXG4gKiBAcGFyYW0gc2VsZWN0b3IgT3B0aW9uYWwgc2VsZWN0b3Igb2Ygc3ViIG5vZGVzXG4gKiBAcmV0dXJucyBYTUwgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVYTUwgPSBmdW5jdGlvbiAoeG1sRG9tOiBOb2RlLCBzZWxlY3Rvcj86IHN0cmluZykge1xuXHRjb25zdCBzZXJpYWxpemVyID0gbmV3IHdpbmRvdy5YTUxTZXJpYWxpemVyKCk7XG5cdGxldCB4bWxTdHJpbmc6IHN0cmluZztcblx0aWYgKHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KHNlbGVjdG9yLCB4bWxEb20pIGFzIE5vZGVbXTtcblx0XHR4bWxTdHJpbmcgPSBub2Rlcy5tYXAoKG5vZGUpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcobm9kZSkpLmpvaW4oXCJcXG5cIik7XG5cdH0gZWxzZSB7XG5cdFx0eG1sU3RyaW5nID0gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoeG1sU3RyaW5nKTtcbn07XG5cbi8qKlxuICogRm9ybWF0cyBhIHN0cmluZyBjb250YWluaW5nIGFuIFhNTCBkb2N1bWVudC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIG9ubHkgY29uc2lkZXJzIFhNTCB0YWdzIGFuZCBhdHRyaWJ1dGVzLCBpZ25vcmluZyBldmVyeXRoaW5nIGVsc2UgKHRleHQsIGNvbW1lbnRzKS4gQWRkaXRpb25hbGx5LFxuICogYXR0cmlidXRlIHZhbHVlcyBjb250YWluaW5nIGEgdmFyeWluZyBVSUQgYXJlIHJlcGxhY2VkIHdpdGggYSBjb25zdGFudCB2YWx1ZS5cbiAqXG4gKiBBbiBcIlhNTFwiIHN0cmluZyBjb250YWluaW5nIG11bHRpcGxlIHJvb3QgZWxlbWVudHMgY2FuIGJlLlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgIFRoZSBpbnB1dCBYTUwgc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGFsc28gYWNjZXB0cyBcIlhNTFwiIHN0cmluZ3Mgd2l0aCBtdWx0aXBsZSByb290IGVsZW1lbnRzLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBYTUwgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0WE1MID0gZnVuY3Rpb24gKHhtbFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgU1RBUlQgPSBcIjxfX1hNTF9fPlwiLFxuXHRcdEVORCA9IFwiPC9fX1hNTF9fPlwiLFxuXHRcdFVJRCA9IC91aWQtLWlkLVxcZHsxM30tXFxkezEsM30vLFxuXHRcdGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdGxldCBjdXJyZW50TGluZSA9IFwiXCIsXG5cdFx0bGV2ZWwgPSAtMSxcblx0XHRhdHRyaWJ1dGVzOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfVtdID0gW107XG5cblx0ZnVuY3Rpb24gbmV3bGluZSgpIHtcblx0XHRpZiAoY3VycmVudExpbmUgJiYgY3VycmVudExpbmUgIT09IFNUQVJUKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcblx0XHR9XG5cblx0XHRjdXJyZW50TGluZSA9IGxldmVsID4gMCA/IFwiICBcIi5yZXBlYXQobGV2ZWwpIDogXCJcIjtcblx0fVxuXG5cdGZ1bmN0aW9uIGFwcGVuZEF0dHJpYnV0ZXMoKSB7XG5cdFx0aWYgKGF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0YXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuc29ydCgoYSwgYikgPT4ge1xuXHRcdFx0XHRpZiAoYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiAhYi5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdFx0fSBlbHNlIGlmICghYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiBiLm5hbWUuc3RhcnRzV2l0aChcInhtbG5zXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiBiLm5hbWUuc3RhcnRzV2l0aChcInhtbG5zXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYS5uYW1lLmluY2x1ZGVzKFwiOlwiKSAmJiAhYi5uYW1lLmluY2x1ZGVzKFwiOlwiKSkge1xuXHRcdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdFx0fSBlbHNlIGlmICghYS5uYW1lLmluY2x1ZGVzKFwiOlwiKSAmJiBiLm5hbWUuaW5jbHVkZXMoXCI6XCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRsZXZlbCsrO1xuXHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuXHRcdFx0XHRuZXdsaW5lKCk7XG5cdFx0XHRcdGN1cnJlbnRMaW5lICs9IGF0dHJpYnV0ZS5uYW1lO1xuXHRcdFx0XHRpZiAoYXR0cmlidXRlLnZhbHVlKSBjdXJyZW50TGluZSArPSBhdHRyaWJ1dGUudmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRsZXZlbC0tO1xuXHRcdFx0YXR0cmlidXRlcyA9IFtdO1xuXHRcdFx0bmV3bGluZSgpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGFwcGVuZChkYXRhOiBSYW5nZSkge1xuXHRcdGN1cnJlbnRMaW5lICs9IHBhcnNlci5yZWFkKGRhdGEpO1xuXHR9XG5cblx0Y29uc3QgcGFyc2VyID0gY3JlYXRlUGFyc2VyKHtcblx0XHRvbk9wZW5UYWdTdGFydChkYXRhOiBSYW5nZSkge1xuXHRcdFx0bmV3bGluZSgpO1xuXHRcdFx0YXBwZW5kKGRhdGEpO1xuXHRcdH0sXG5cblx0XHRvbk9wZW5UYWdOYW1lOiBhcHBlbmQsXG5cblx0XHRvbkF0dHJOYW1lKGRhdGE6IFJhbmdlKSB7XG5cdFx0XHRhdHRyaWJ1dGVzLnVuc2hpZnQoeyBuYW1lOiBwYXJzZXIucmVhZChkYXRhKSB9KTtcblx0XHR9LFxuXG5cdFx0b25BdHRyVmFsdWUoZGF0YTogUmFuZ2VzLkF0dHJWYWx1ZSkge1xuXHRcdFx0YXR0cmlidXRlc1swXS52YWx1ZSA9IHBhcnNlci5yZWFkKGRhdGEpLnJlcGxhY2UoVUlELCBcInVpZC0taWRcIik7IC8vIHJlcGxhY2UgdmFyeWluZyBVSURzIHdpdGggYSBjb25zdGFudCB2YWx1ZVxuXHRcdH0sXG5cblx0XHRvbk9wZW5UYWdFbmQoZGF0YTogUmFuZ2VzLk9wZW5UYWdFbmQpIHtcblx0XHRcdGFwcGVuZEF0dHJpYnV0ZXMoKTtcblx0XHRcdGFwcGVuZChkYXRhKTtcblx0XHRcdGlmICghZGF0YS5zZWxmQ2xvc2VkKSBsZXZlbCsrO1xuXHRcdH0sXG5cblx0XHRvbkNsb3NlVGFnU3RhcnQoZGF0YTogUmFuZ2UpIHtcblx0XHRcdGxldmVsLS07XG5cdFx0XHRuZXdsaW5lKCk7XG5cdFx0XHRhcHBlbmQoZGF0YSk7XG5cdFx0fSxcblxuXHRcdG9uQ2xvc2VUYWdOYW1lOiBhcHBlbmQsXG5cdFx0b25DbG9zZVRhZ0VuZDogYXBwZW5kXG5cdH0pO1xuXG5cdHBhcnNlci5wYXJzZShTVEFSVCArIHhtbFN0cmluZyArIEVORCk7XG5cdHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBhIENEUyBmaWxlIGludG8gYW4gRURNWCBmaWxlLlxuICpcbiAqIEBwYXJhbSBjZHNVcmwgVGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgQ0RTIGRlZmluaXRpb24uIFRoaXMgZmlsZSBtdXN0IGRlY2xhcmUgdGhlIG5hbWVzcGFjZVxuICogc2FwLmZlLnRlc3QgYW5kIGEgc2VydmljZSBKZXN0U2VydmljZVxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIEVETVggb3V0cHV0XG4gKiBAcmV0dXJucyBUaGUgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIEVETVhcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBpbGVDRFMgPSBmdW5jdGlvbiAoY2RzVXJsOiBzdHJpbmcsIG9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGNkc1N0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhjZHNVcmwsIFwidXRmLThcIik7XG5cdGNvbnN0IGVkbXhDb250ZW50ID0gY2RzMmVkbXgoY2RzU3RyaW5nLCBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIsIG9wdGlvbnMpO1xuXHRjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUoY2RzVXJsLCBcIi4uXCIsIFwiZ2VuXCIpO1xuXG5cdC8vIElmIHRoZSBjYWxsZXIgcHJvdmlkZWQgQ0RTIGNvbXBpbGVyIG9wdGlvbnM6IEluY2x1ZGUgdGhlbSBpbiB0aGUgZmlsZW5hbWUuIFRoaXMgcHJldmVudHMgdW5wcmVkaWN0YWJsZSByZXN1bHRzIGlmIHRoZSBzYW1lIENEUyBzb3VyY2Vcblx0Ly8gZmlsZSBpcyB1c2VkIHNpbXVsdGFuZW91c2x5IHdpdGggYSBkaWZmZXJlbnQgc2V0IG9mIG9wdGlvbnMgKGUuZy4gaW4gYSB0ZXN0IHJ1bm5pbmcgaW4gcGFyYWxsZWwpXG5cdGNvbnN0IGFsbE9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKTtcblx0YWxsT3B0aW9ucy5zb3J0KChhLCBiKSA9PiBiWzBdLmxvY2FsZUNvbXBhcmUoYVswXSkpO1xuXG5cdGNvbnN0IGVkbXhGaWxlTmFtZSA9XG5cdFx0YWxsT3B0aW9ucy5yZWR1Y2UoXG5cdFx0XHQoZmlsZW5hbWUsIFtvcHRpb25LZXksIG9wdGlvblZhbHVlXSkgPT4gYCR7ZmlsZW5hbWV9IyR7b3B0aW9uS2V5fT0ke29wdGlvblZhbHVlLnRvU3RyaW5nKCl9I2AsXG5cdFx0XHRwYXRoLmJhc2VuYW1lKGNkc1VybCkucmVwbGFjZShcIi5jZHNcIiwgXCJcIilcblx0XHQpICsgXCIueG1sXCI7XG5cblx0Y29uc3QgZWRteEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpciwgZWRteEZpbGVOYW1lKTtcblxuXHRmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuXHRmcy53cml0ZUZpbGVTeW5jKGVkbXhGaWxlUGF0aCwgZWRteENvbnRlbnQpO1xuXHRyZXR1cm4gZWRteEZpbGVQYXRoO1xufTtcblxuLyoqXG4gKiBDb21waWxlIENEUyB0byBFRE1YLlxuICpcbiAqIEBwYXJhbSBjZHMgVGhlIENEUyBtb2RlbC4gSXQgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIHNlcnZpY2UuXG4gKiBAcGFyYW0gc2VydmljZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gYmUgY29tcGlsZWQuIERlZmF1bHRzIHRvIFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIi5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBFRE1YIG91dHB1dFxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHNlcnZpY2UgbW9kZWwgYXMgRURNWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNkczJlZG14KGNkczogc3RyaW5nLCBzZXJ2aWNlID0gXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBcInNvdXJjZS5jZHNcIjogY2RzIH07XG5cblx0Ly8gYWxsb3cgdG8gaW5jbHVkZSBzdHVmZiBmcm9tIEBzYXAvY2RzL2NvbW1vblxuXHRpZiAoY2RzLmluY2x1ZGVzKFwiJ0BzYXAvY2RzL2NvbW1vbidcIikpIHtcblx0XHRzb3VyY2VzW1wiY29tbW9uLmNkc1wiXSA9IGZzLnJlYWRGaWxlU3luYyhyZXF1aXJlLnJlc29sdmUoXCJAc2FwL2Nkcy9jb21tb24uY2RzXCIpLCBcInV0Zi04XCIpO1xuXHR9XG5cblx0Y29uc3QgY3NuID0gY29tcGlsZXIuY29tcGlsZVNvdXJjZXMoc291cmNlcywge30pO1xuXG5cdGNvbnN0IGVkbXhPcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7XG5cdFx0b2RhdGFGb3JlaWduS2V5czogdHJ1ZSxcblx0XHRvZGF0YUZvcm1hdDogXCJzdHJ1Y3R1cmVkXCIsXG5cdFx0b2RhdGFDb250YWlubWVudDogdHJ1ZSxcblx0XHQuLi5vcHRpb25zLFxuXHRcdHNlcnZpY2U6IHNlcnZpY2Vcblx0fTtcblxuXHRjb25zdCBlZG14ID0gY29tcGlsZXIudG8uZWRteChjc24sIGVkbXhPcHRpb25zKTtcblx0aWYgKCFlZG14KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBDb21waWxhdGlvbiBmYWlsZWQuIEhpbnQ6IE1ha2Ugc3VyZSB0aGF0IHRoZSBDRFMgbW9kZWwgZGVmaW5lcyBzZXJ2aWNlICR7c2VydmljZX0uYCk7XG5cdH1cblx0cmV0dXJuIGVkbXg7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRjbGFzc05hbWVPRGF0YU1vZGVsID0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiXG4pOiBQcm9taXNlPFNpZGVFZmZlY3RzU2VydmljZT4ge1xuXHRjb25zdCBzY29wZU9iamVjdCA9IHtcblx0XHRnZXRNb2RlbDogKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aXNBOiAoKSA9PiBjbGFzc05hbWVPRGF0YU1vZGVsID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIsXG5cdFx0XHRcdGdldE1ldGFNb2RlbDogKCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBtZXRhTW9kZWw7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldFNlcnZpY2VVcmw6ICgpID0+IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGdldFNlcnZpY2U6ICgpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGdldENhcGFiaWxpdGllczogKCkgPT4gdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblx0Y29uc3Qgc2VydmljZUluc3RhbmNlID0gYXdhaXQgbmV3IFNpZGVFZmZlY3RzRmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlKHsgc2NvcGVPYmplY3QsIHNjb3BlVHlwZTogXCJcIiwgc2V0dGluZ3M6IHt9IH0pO1xuXHRyZXR1cm4gc2VydmljZUluc3RhbmNlLmdldEludGVyZmFjZSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VEaWFnbm9zdGljcyA9IGZ1bmN0aW9uICgpOiBJRGlhZ25vc3RpY3Mge1xuXHRjb25zdCBpc3N1ZXM6IGFueVtdID0gW107XG5cdHJldHVybiB7XG5cdFx0YWRkSXNzdWUoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRcdGlzc3VlQ2F0ZWdvcnksXG5cdFx0XHRcdGlzc3VlU2V2ZXJpdHksXG5cdFx0XHRcdGRldGFpbHNcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0Z2V0SXNzdWVzKCk6IGFueVtdIHtcblx0XHRcdHJldHVybiBpc3N1ZXM7XG5cdFx0fSxcblx0XHRjaGVja0lmSXNzdWVFeGlzdHMoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzLmZpbmQoKGlzc3VlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBpc3N1ZS5pc3N1ZUNhdGVnb3J5ID09PSBpc3N1ZUNhdGVnb3J5ICYmIGlzc3VlLmlzc3VlU2V2ZXJpdHkgPT09IGlzc3VlU2V2ZXJpdHkgJiYgaXNzdWUuZGV0YWlscyA9PT0gZGV0YWlscztcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yVGVzdCA9IGZ1bmN0aW9uIChcblx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0bWFuaWZlc3RTZXR0aW5nczogTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MgfCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5nc1xuKSB7XG5cdGNvbnN0IGNvbnZlcnRlZFR5cGVzID0gY29udmVydFR5cGVzKG1ldGFNb2RlbCk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBtYW5pZmVzdFNldHRpbmdzLmNvbnRleHRQYXRoXG5cdFx0PyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PihtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQobWFuaWZlc3RTZXR0aW5ncy5jb250ZXh0UGF0aCkgYXMgQ29udGV4dClcblx0XHQ6IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0czxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgLyR7bWFuaWZlc3RTZXR0aW5ncy5lbnRpdHlTZXR9YCkpO1xuXHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pihjb252ZXJ0ZWRUeXBlcywgbWFuaWZlc3RTZXR0aW5ncywgZ2V0RmFrZURpYWdub3N0aWNzKCksIG1lcmdlLCBkYXRhTW9kZWxQYXRoKTtcbn07XG5jb25zdCBtZXRhTW9kZWxDYWNoZTogYW55ID0ge307XG5leHBvcnQgY29uc3QgZ2V0TWV0YU1vZGVsID0gYXN5bmMgZnVuY3Rpb24gKHNNZXRhZGF0YVVybDogc3RyaW5nKSB7XG5cdGNvbnN0IG9SZXF1ZXN0b3IgPSBfTWV0YWRhdGFSZXF1ZXN0b3IuY3JlYXRlKHt9LCBcIjQuMFwiLCB1bmRlZmluZWQsIHt9KTtcblx0aWYgKCFtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdKSB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG5ldyAoT0RhdGFNZXRhTW9kZWwgYXMgYW55KShvUmVxdWVzdG9yLCBzTWV0YWRhdGFVcmwsIHVuZGVmaW5lZCwgbnVsbCk7XG5cdFx0YXdhaXQgb01ldGFNb2RlbC5mZXRjaEVudGl0eUNvbnRhaW5lcigpO1xuXHRcdG1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0gPSBvTWV0YU1vZGVsO1xuXHR9XG5cblx0cmV0dXJuIG1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5ID0gZnVuY3Rpb24gPFQgPSBQcm9wZXJ0eSB8IEVudGl0eVNldCB8IEFueUFubm90YXRpb24+KFxuXHRlbnRpdHlTZXQ6IEVudGl0eVNldCxcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRwcm9wZXJ0eT86IFRcbik6IERhdGFNb2RlbE9iamVjdFBhdGg8VD4ge1xuXHRjb25zdCB0YXJnZXRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFQ+ID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdHRhcmdldE9iamVjdDogcHJvcGVydHksXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogZW50aXR5U2V0LmVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVkVHlwZXM6IGNvbnZlcnRlZFR5cGVzXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aCBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldD47XG5cdHJldHVybiB0YXJnZXRQYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZyA9IGZ1bmN0aW9uIChiaW5kaW5nU3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRyZXR1cm4gYmluZGluZ0VsZW1lbnQuZm9ybWF0dGVyLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG59O1xuXG50eXBlIE1vZGVsQ29udGVudCA9IHtcblx0W25hbWU6IHN0cmluZ106IGFueTtcbn07XG5cbi8qKlxuICogRXZhbHVhdGUgYSBiaW5kaW5nIGFnYWluc3QgYSBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gYmluZGluZ1N0cmluZyBUaGUgYmluZGluZyBzdHJpbmcuXG4gKiBAcGFyYW0gbW9kZWxDb250ZW50IENvbnRlbnQgb2YgdGhlIGRlZmF1bHQgbW9kZWwgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIG5hbWVkTW9kZWxzQ29udGVudCBDb250ZW50cyBvZiBhZGRpdGlvbmFsLCBuYW1lZCBtb2RlbHMgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIGV2YWx1YXRlZCBiaW5kaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsKFxuXHRiaW5kaW5nU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1vZGVsQ29udGVudDogTW9kZWxDb250ZW50LFxuXHRuYW1lZE1vZGVsc0NvbnRlbnQ/OiB7IFttb2RlbE5hbWU6IHN0cmluZ106IE1vZGVsQ29udGVudCB9XG4pOiBzdHJpbmcge1xuXHRjb25zdCBiaW5kaW5nRWxlbWVudCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihiaW5kaW5nU3RyaW5nKTtcblx0Y29uc3QgdGV4dCA9IG5ldyBJbnZpc2libGVUZXh0KCk7XG5cdHRleHQuYmluZFByb3BlcnR5KFwidGV4dFwiLCBiaW5kaW5nRWxlbWVudCk7XG5cblx0Y29uc3QgZGVmYXVsdE1vZGVsID0gbmV3IEpTT05Nb2RlbChtb2RlbENvbnRlbnQpO1xuXHR0ZXh0LnNldE1vZGVsKGRlZmF1bHRNb2RlbCk7XG5cdHRleHQuc2V0QmluZGluZ0NvbnRleHQoZGVmYXVsdE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSk7XG5cblx0aWYgKG5hbWVkTW9kZWxzQ29udGVudCkge1xuXHRcdGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVkTW9kZWxzQ29udGVudCkpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gbmV3IEpTT05Nb2RlbChjb250ZW50KTtcblx0XHRcdHRleHQuc2V0TW9kZWwobW9kZWwsIG5hbWUpO1xuXHRcdFx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChtb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiksIG5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0ZXh0LmdldFRleHQoKTtcbn1cblxuY29uc3QgVEVTVFZJRVdJRCA9IFwidGVzdFZpZXdJZFwiO1xuXG5jb25zdCBhcHBseUZsZXhDaGFuZ2VzID0gYXN5bmMgZnVuY3Rpb24gKGZsZXhDaGFuZ2VzOiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9LCBvTWV0YU1vZGVsOiBNZXRhTW9kZWwsIHJlc3VsdFhNTDogYW55KSB7XG5cdC8vIHByZWZpeCBJZHNcblx0Wy4uLnJlc3VsdFhNTC5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkXVwiKV0uZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdG5vZGUuaWQgPSBgJHtURVNUVklFV0lEfS0tJHtub2RlLmlkfWA7XG5cdH0pO1xuXHRjb25zdCBjaGFuZ2VzID0gY3JlYXRlRmxleGliaWxpdHlDaGFuZ2VzT2JqZWN0KFRFU1RWSUVXSUQsIGZsZXhDaGFuZ2VzKTtcblx0Y29uc3QgYXBwSWQgPSBcInNvbWVDb21wb25lbnRcIjtcblx0Y29uc3Qgb01hbmlmZXN0ID0ge1xuXHRcdFwic2FwLmFwcFwiOiB7XG5cdFx0XHRpZDogYXBwSWQsXG5cdFx0XHR0eXBlOiBcImFwcGxpY2F0aW9uXCIsXG5cdFx0XHRjcm9zc05hdmlnYXRpb246IHtcblx0XHRcdFx0b3V0Ym91bmRzOiBbXVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3Qgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50ID0ge1xuXHRcdGdldERpYWdub3N0aWNzOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKGdldEZha2VEaWFnbm9zdGljcygpKSxcblx0XHRnZXRNb2RlbDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7XG5cdFx0XHRnZXRNZXRhTW9kZWw6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUob01ldGFNb2RlbClcblx0XHR9KSxcblx0XHRnZXRDb21wb25lbnREYXRhOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHt9KSxcblx0XHRnZXRNYW5pZmVzdE9iamVjdDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7XG5cdFx0XHRnZXRFbnRyeTogZnVuY3Rpb24gKG5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRyZXR1cm4gKG9NYW5pZmVzdCBhcyBhbnkpW25hbWVdO1xuXHRcdFx0fVxuXHRcdH0pLFxuXHRcdGdldExvY2FsSWQ6IGplc3QuZm4oKHNJZCkgPT4gc0lkKVxuXHR9IGFzIHVua25vd24gYXMgQXBwQ29tcG9uZW50O1xuXHQvL2Zha2UgY2hhbmdlc1xuXHRqZXN0LnNweU9uKEFwcFN0b3JhZ2UsIFwibG9hZEZsZXhEYXRhXCIpLm1vY2tSZXR1cm5WYWx1ZShQcm9taXNlLnJlc29sdmUoY2hhbmdlcykpO1xuXHRqZXN0LnNweU9uKExvYWRlciwgXCJsb2FkRmxleERhdGFcIikubW9ja1JldHVyblZhbHVlKFByb21pc2UucmVzb2x2ZShjaGFuZ2VzKSk7XG5cblx0amVzdC5zcHlPbihDb21wb25lbnQgYXMgdW5rbm93biBhcyB7IGdldENvbXBvbmVudEJ5SWQ6ICgpID0+IEFwcENvbXBvbmVudCB9LCBcImdldENvbXBvbmVudEJ5SWRcIikubW9ja1JldHVyblZhbHVlKG9BcHBDb21wb25lbnQpO1xuXHRqZXN0LnNweU9uKFV0aWxzLCBcImdldEFwcENvbXBvbmVudEZvckNvbnRyb2xcIikubW9ja1JldHVyblZhbHVlKG9BcHBDb21wb25lbnQpO1xuXHRhd2FpdCBGbGV4U3RhdGUuaW5pdGlhbGl6ZSh7XG5cdFx0Y29tcG9uZW50SWQ6IGFwcElkXG5cdH0pO1xuXHRyZXN1bHRYTUwgPSBhd2FpdCBYbWxQcmVwcm9jZXNzb3IucHJvY2VzcyhyZXN1bHRYTUwsIHsgbmFtZTogXCJUZXN0IEZyYWdtZW50XCIsIGNvbXBvbmVudElkOiBhcHBJZCwgaWQ6IFRFU1RWSUVXSUQgfSk7XG5cblx0Ly9Bc3NlcnQgdGhhdCBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gYXBwbGllZFxuXHRjb25zdCBjaGFuZ2VzQXBwbGllZCA9IGdldENoYW5nZXNGcm9tWE1MKHJlc3VsdFhNTCk7XG5cdGV4cGVjdChjaGFuZ2VzQXBwbGllZC5sZW5ndGgpLnRvQmUoZmxleENoYW5nZXM/LmNoYW5nZXM/Lmxlbmd0aCA/PyAwICsgZmxleENoYW5nZXM/LnZhcmlhbnREZXBlbmRlbnRDb250cm9sQ2hhbmdlcz8ubGVuZ3RoID8/IDApO1xuXHRyZXR1cm4gcmVzdWx0WE1MO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENoYW5nZXNGcm9tWE1MID0gKHhtbDogYW55KSA9PlxuXHRbLi4ueG1sLnF1ZXJ5U2VsZWN0b3JBbGwoXCIqXCIpXVxuXHRcdC5mbGF0TWFwKChlKSA9PiBbLi4uZS5hdHRyaWJ1dGVzXS5tYXAoKGEpID0+IGEubmFtZSkpXG5cdFx0LmZpbHRlcigoYXR0cikgPT4gYXR0ci5pbmNsdWRlcyhcInNhcC51aS5mbC5hcHBsaWVkQ2hhbmdlc1wiKSk7XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0aW5nUmVzdWx0ID0gYXN5bmMgZnVuY3Rpb24gKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogYW55OyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfSxcblx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlPzogdW5rbm93blxuKSB7XG5cdGlmICghbU1vZGVsc1tcInNhcC5mZS5pMThuXCJdKSB7XG5cdFx0bU1vZGVsc1tcInNhcC5mZS5pMThuXCJdID0gY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwoKTtcblx0fVxuXG5cdGNvbnN0IHRlbXBsYXRlZFhtbCA9IGA8cm9vdD4ke3htbElucHV0fTwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCB4bWxEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRlbXBsYXRlZFhtbCwgXCJ0ZXh0L3htbFwiKTtcblx0Ly8gVG8gZW5zdXJlIG91ciBtYWNybyBjYW4gdXNlICNzZXRCaW5kaW5nQ29udGV4dCB3ZSBlbnN1cmUgdGhlcmUgaXMgYSBwcmUgZXhpc3RpbmcgSlNPTk1vZGVsIGZvciBjb252ZXJ0ZXJDb250ZXh0XG5cdC8vIGlmIG5vdCBhbHJlYWR5IHBhc3NlZCB0byB0ZWggdGVtcGxhdGluZ1xuXG5cdGNvbnN0IG9QcmVwcm9jZXNzb3JTZXR0aW5ncyA9IGF3YWl0IF9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzKHNNZXRhZGF0YVVybCwgbUJpbmRpbmdDb250ZXh0cywgbU1vZGVscywgZmFrZVNpZGVFZmZlY3RTZXJ2aWNlKTtcblxuXHQvL1RoaXMgY29udGV4dCBmb3IgbWFjcm8gdGVzdGluZ1xuXHRpZiAob1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tcInRoaXNcIl0pIHtcblx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW1widGhpc1wiXSA9IG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0fVxuXG5cdGxldCByZXN1bHRYTUwgPSAoYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoeG1sRG9jLmZpcnN0RWxlbWVudENoaWxkISwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpKSBhcyBhbnk7XG5cblx0aWYgKHNNZXRhZGF0YVVybCAmJiBmbGV4Q2hhbmdlcykge1xuXHRcdC8vIGFwcGx5IGZsZXggY2hhbmdlc1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcblx0XHRyZXN1bHRYTUwgPSBhd2FpdCBhcHBseUZsZXhDaGFuZ2VzKGZsZXhDaGFuZ2VzLCBvTWV0YU1vZGVsLCByZXN1bHRYTUwpO1xuXHR9XG5cdHJldHVybiByZXN1bHRYTUw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGVtcGxhdGVkWE1MID0gYXN5bmMgZnVuY3Rpb24gKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuXHRmbGV4Q2hhbmdlcz86IHsgW3g6IHN0cmluZ106IG9iamVjdFtdIH0sXG5cdGZha2VTaWRlRWZmZWN0U2VydmljZT86IHVua25vd25cbik6IFByb21pc2U8c3RyaW5nPiB7XG5cdHJldHVybiBqc3guZGVmaW5lWE1MTmFtZXNwYWNlTWFwKHJldmVzZU5hbWVzcGFjZU1hcCwgYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IHRlbXBsYXRlZFhNTCA9IGF3YWl0IGdldFRlbXBsYXRpbmdSZXN1bHQoXG5cdFx0XHR4bWxJbnB1dCxcblx0XHRcdHNNZXRhZGF0YVVybCxcblx0XHRcdG1CaW5kaW5nQ29udGV4dHMsXG5cdFx0XHRtTW9kZWxzLFxuXHRcdFx0ZmxleENoYW5nZXMsXG5cdFx0XHRmYWtlU2lkZUVmZmVjdFNlcnZpY2Vcblx0XHQpO1xuXHRcdGNvbnN0IHNlcmlhbGllZFhNTCA9IHNlcmlhbGl6ZVhNTCh0ZW1wbGF0ZWRYTUwsIHVuZGVmaW5lZCk7XG5cdFx0ZXhwZWN0KHNlcmlhbGllZFhNTCkubm90LnRvSGF2ZVRlbXBsYXRpbmdFcnJvcnMoKTtcblx0XHRyZXR1cm4gc2VyaWFsaWVkWE1MO1xuXHR9KSBhcyB1bmtub3duIGFzIFByb21pc2U8c3RyaW5nPjtcbn07XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgcmVxdWVzdGVkIHZpZXcgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdmlldyB0byBiZSB0ZXN0ZWQuXG4gKiBAcGFyYW0gc01ldGFkYXRhVXJsIFVybCBvZiB0aGUgbWV0YWRhdGEuXG4gKiBAcGFyYW0gbUJpbmRpbmdDb250ZXh0cyBNYXAgb2YgdGhlIGJpbmRpbmdDb250ZXh0cyB0byBzZXQgb24gdGhlIG1vZGVscy5cbiAqIEBwYXJhbSBtTW9kZWxzIE1hcCBvZiB0aGUgbW9kZWxzLlxuICogQHBhcmFtIGZsZXhDaGFuZ2VzIE9iamVjdCB3aXRoIFVJIGNoYW5nZXMgbGlrZSAnY2hhbmdlcycgb3IgJ3ZhcmlhbnREZXBlbmRlbnRDb250cm9sQ2hhbmdlcydcbiAqIEByZXR1cm5zIFRlbXBsYXRlZCB2aWV3IGFzIHN0cmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1ZpZXcoXG5cdG5hbWU6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9XG4pOiBQcm9taXNlPEplc3RUZW1wbGF0ZWRWaWV3PiB7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcblx0Y29uc3Qgb1ZpZXdEb2N1bWVudCA9IF9sb2FkUmVzb3VyY2VWaWV3KG5hbWUpO1xuXHRjb25zdCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSBhd2FpdCBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMpO1xuXHRsZXQgb1ByZXByb2Nlc3NlZFZpZXcgPSBhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2VzcyhvVmlld0RvY3VtZW50LCB7IG5hbWU6IG5hbWUgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKTtcblx0aWYgKGZsZXhDaGFuZ2VzKSB7XG5cdFx0b1ByZXByb2Nlc3NlZFZpZXcgPSBhd2FpdCBhcHBseUZsZXhDaGFuZ2VzKGZsZXhDaGFuZ2VzID8/IFtdLCBvTWV0YU1vZGVsLCBvUHJlcHJvY2Vzc2VkVmlldyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRhc0VsZW1lbnQ6IG9QcmVwcm9jZXNzZWRWaWV3LFxuXHRcdGFzU3RyaW5nOiBmb3JtYXRYTUwob1ByZXByb2Nlc3NlZFZpZXc/Lm91dGVySFRNTCB8fCBcIlwiKVxuXHR9O1xufVxuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCBYTUwgZnJhZ21lbnQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHRlc3REYXRhIFRlc3QgZGF0YSBjb25zaXN0aW5nXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgZnJhZ21lbnQgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhZ21lbnQobmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogeyBbbW9kZWw6IHN0cmluZ106IG9iamVjdCB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0Y29uc3QgaW5wdXRYbWwgPSBgPHJvb3Q+PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwiJHtuYW1lfVwiIHR5cGU9XCJYTUxcIiB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIiAvPjwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCBpbnB1dERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaW5wdXRYbWwsIFwidGV4dC94bWxcIik7XG5cblx0Ly8gYnVpbGQgbW9kZWwgYW5kIGJpbmRpbmdzIGZvciBnaXZlbiB0ZXN0IGRhdGFcblx0Y29uc3Qgc2V0dGluZ3MgPSB7XG5cdFx0bW9kZWxzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWwgfSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IG9iamVjdCB9LFxuXHRcdGFwcENvbXBvbmVudDogeyBnZXRTaWRlRWZmZWN0c1NlcnZpY2U6IGplc3QuZm4oKSwgZ2V0RGlhZ25vc3RpY3M6ICgpID0+IHVuZGVmaW5lZCB9XG5cdH07XG5cdGZvciAoY29uc3QgbW9kZWwgaW4gdGVzdERhdGEpIHtcblx0XHRjb25zdCBqc29uTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0anNvbk1vZGVsLnNldERhdGEodGVzdERhdGFbbW9kZWxdKTtcblx0XHRzZXR0aW5ncy5tb2RlbHNbbW9kZWxdID0ganNvbk1vZGVsO1xuXHRcdHNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1ttb2RlbF0gPSBzZXR0aW5ncy5tb2RlbHNbbW9kZWxdLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0fVxuXHRzZXR0aW5ncy5hcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlLm1vY2tSZXR1cm5WYWx1ZShkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlKTtcblxuXHQvLyBleGVjdXRlIHRoZSBwcmUtcHJvY2Vzc29yXG5cdGNvbnN0IHJlc3VsdERvYyA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0RG9jLmZpcnN0RWxlbWVudENoaWxkLCB7IG5hbWUgfSwgc2V0dGluZ3MpO1xuXG5cdC8vIGV4Y2x1ZGUgbmVzdGVkIGZyYWdtZW50cyBmcm9tIHRlc3Qgc25hcHNob3RzXG5cdGNvbnN0IGZyYWdtZW50cyA9IHJlc3VsdERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvcmU6RnJhZ21lbnRcIikgYXMgYW55O1xuXHRpZiAoZnJhZ21lbnRzPy5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yIChjb25zdCBmcmFnbWVudCBvZiBmcmFnbWVudHMpIHtcblx0XHRcdGZyYWdtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0fVxuXHR9XG5cblx0Ly8gS2VlcCB0aGUgZnJhZ21lbnQgcmVzdWx0IGFzIGNoaWxkIG9mIHJvb3Qgbm9kZSB3aGVuIGZyYWdtZW50IGdlbmVyYXRlcyBtdWx0aXBsZSByb290IGNvbnRyb2xzXG5cdGNvbnN0IHhtbFJlc3VsdCA9IHJlc3VsdERvYy5jaGlsZHJlbi5sZW5ndGggPiAxID8gcmVzdWx0RG9jLm91dGVySFRNTCA6IHJlc3VsdERvYy5pbm5lckhUTUw7XG5cblx0cmV0dXJuIGZvcm1hdFhNTCh4bWxSZXN1bHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQ29udHJvbChjb250cm9sVG9TZXJpYWxpemU/OiBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdKSB7XG5cdGxldCB0YWJDb3VudCA9IDA7XG5cdGZ1bmN0aW9uIGdldFRhYih0b0FkZCA9IDApIHtcblx0XHRsZXQgdGFiID0gXCJcIjtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRhYkNvdW50ICsgdG9BZGQ7IGkrKykge1xuXHRcdFx0dGFiICs9IFwiXFx0XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0YWI7XG5cdH1cblx0Y29uc3Qgc2VyaWFsaXplRGVsZWdhdGUgPSB7XG5cdFx0c3RhcnQ6IGZ1bmN0aW9uIChjb250cm9sOiBhbnksIHNBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdFx0bGV0IGNvbnRyb2xEZXRhaWwgPSBcIlwiO1xuXHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wuZ2V0UGFyZW50KCkpIHtcblx0XHRcdFx0XHRjb25zdCBpbmRleEluUGFyZW50ID0gKGNvbnRyb2wuZ2V0UGFyZW50KCkuZ2V0QWdncmVnYXRpb24oc0FnZ3JlZ2F0aW9uTmFtZSkgYXMgTWFuYWdlZE9iamVjdFtdKT8uaW5kZXhPZj8uKGNvbnRyb2wpO1xuXHRcdFx0XHRcdGlmIChpbmRleEluUGFyZW50ID4gMCkge1xuXHRcdFx0XHRcdFx0Y29udHJvbERldGFpbCArPSBgLFxcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYCR7Y29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX0oYDtcblx0XHRcdHJldHVybiBjb250cm9sRGV0YWlsO1xuXHRcdH0sXG5cdFx0ZW5kOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gXCJ9KVwiO1xuXHRcdH0sXG5cdFx0bWlkZGxlOiBmdW5jdGlvbiAoY29udHJvbDogYW55KSB7XG5cdFx0XHRjb25zdCBpZCA9IGNvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdGxldCBkYXRhID0gYHtpZDogJHtNYW5hZ2VkT2JqZWN0TWV0YWRhdGEuaXNHZW5lcmF0ZWRJZChpZCkgPyBcIl9fZHluYW1pY0lkXCIgOiBpZH1gO1xuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1Qcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1Qcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogJHtjb250cm9sLm1Qcm9wZXJ0aWVzW29Db250cm9sS2V5XX1gO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvcy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRjb25zdCBiaW5kaW5nRGV0YWlsID0gY29udHJvbC5tQmluZGluZ0luZm9zW29Db250cm9sS2V5XTtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06ICR7SlNPTi5zdHJpbmdpZnkoYmluZGluZ0RldGFpbCl9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1Bc3NvY2lhdGlvbnMpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubUFzc29jaWF0aW9ucy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06ICR7XG5cdFx0XHRcdFx0XHQoY29udHJvbC5tQXNzb2NpYXRpb25zW29Db250cm9sS2V5XT8uam9pbj8uKFwiLFwiKSA/PyBjb250cm9sLm1Bc3NvY2lhdGlvbnNbb0NvbnRyb2xLZXldKSB8fCB1bmRlZmluZWRcblx0XHRcdFx0XHR9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1FdmVudFJlZ2lzdHJ5KSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1FdmVudFJlZ2lzdHJ5Lmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogdHJ1ZX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRkYXRhICs9IGBgO1xuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fSxcblx0XHRzdGFydEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogeyBtQmluZGluZ0luZm9zOiBSZWNvcmQ8c3RyaW5nLCBBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvPiB9LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRsZXQgb3V0ID0gYCxcXG4ke2dldFRhYigpfSR7c05hbWV9YDtcblx0XHRcdHRhYkNvdW50Kys7XG5cblx0XHRcdGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdKSB7XG5cdFx0XHRcdG91dCArPSBgPXsgcGF0aDonJHtjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdLnBhdGh9JywgdGVtcGxhdGU6XFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0ICs9IGA9W1xcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvdXQ7XG5cdFx0fSxcblx0XHRlbmRBZ2dyZWdhdGlvbjogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSwgc05hbWU6IHN0cmluZykge1xuXHRcdFx0dGFiQ291bnQtLTtcblx0XHRcdGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdKSB7XG5cdFx0XHRcdHJldHVybiBgXFxuJHtnZXRUYWIoKX19YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBgXFxuJHtnZXRUYWIoKX1dYDtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xUb1NlcmlhbGl6ZSkpIHtcblx0XHRyZXR1cm4gY29udHJvbFRvU2VyaWFsaXplLm1hcCgoY29udHJvbFRvUmVuZGVyOiBVSTVFbGVtZW50KSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IFNlcmlhbGl6ZXIoY29udHJvbFRvUmVuZGVyLCBzZXJpYWxpemVEZWxlZ2F0ZSkuc2VyaWFsaXplKCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1NlcmlhbGl6ZSwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBd2FpdGVyKCkge1xuXHRsZXQgZm5SZXNvbHZlITogRnVuY3Rpb247XG5cdGNvbnN0IG15UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0Zm5SZXNvbHZlID0gcmVzb2x2ZTtcblx0fSk7XG5cdHJldHVybiB7IHByb21pc2U6IG15UHJvbWlzZSwgcmVzb2x2ZTogZm5SZXNvbHZlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJCdWlsZGluZ0Jsb2NrV2l0aE1vZGVscyhidWlsZGluZ0Jsb2NrOiB7IGdldENvbnRlbnQ6IEZ1bmN0aW9uIH0sIG1vZGVsczogeyBba2V5OiBzdHJpbmddOiBNb2RlbCB9KTogQ29udHJvbCB7XG5cdHJldHVybiAoTWFuYWdlZE9iamVjdCBhcyBNYW5hZ2VkT2JqZWN0RXgpLnJ1bldpdGhQcmVwcm9jZXNzb3JzKFxuXHRcdCgpID0+IHtcblx0XHRcdHJldHVybiBidWlsZGluZ0Jsb2NrLmdldENvbnRlbnQoKTtcblx0XHR9LFxuXHRcdHtcblx0XHRcdHNldHRpbmdzOiBmdW5jdGlvbiAoY29udHJvbFNldHRpbmdzOiB7IG1vZGVsczogdW5rbm93biB9KSB7XG5cdFx0XHRcdGNvbnRyb2xTZXR0aW5ncy5tb2RlbHMgPSBtb2RlbHM7XG5cdFx0XHRcdHJldHVybiBjb250cm9sU2V0dGluZ3M7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2NrRnJhZ21lbnRzKC4uLmZyYWdtZW50czogTW9ja0ZyYWdtZW50W10pOiBqZXN0LlNweUluc3RhbmNlIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3Qgb3JpZ2luYWxMb2FkVGVtcGxhdGUgPSAoWE1MVGVtcGxhdGVQcm9jZXNzb3IgYXMgYW55KS5sb2FkVGVtcGxhdGVQcm9taXNlO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRjb25zdCBsb2FkVGVtcGxhdGVTdHViID0gamVzdC5zcHlPbihYTUxUZW1wbGF0ZVByb2Nlc3NvciBhcyBhbnksIFwibG9hZFRlbXBsYXRlUHJvbWlzZVwiKTtcblx0bG9hZFRlbXBsYXRlU3R1Yi5tb2NrSW1wbGVtZW50YXRpb24oKCh0ZW1wbGF0ZU5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpID0+IHtcblx0XHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuXHRcdFx0aWYgKGZyYWdtZW50Lm5hbWUgPT09IHRlbXBsYXRlTmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VYTUxTdHJpbmcoZnJhZ21lbnQuY29udGVudClbMF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvcmlnaW5hbExvYWRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIGV4dGVuc2lvbik7XG5cdH0pIGFzICgoKSA9PiBFbGVtZW50KSB8IHVuZGVmaW5lZCk7XG5cdHJldHVybiBsb2FkVGVtcGxhdGVTdHViO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gYXBwQ29tcG9uZW50IGFuZCB0ZW1wbGF0ZUNvbXBvbmVudCB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gb3B0aW9ucy5jZHNGaWxlIFRoZSBwYXRoIHRvIHRoZSBDRFMgZmlsZSB0byB1c2UgZm9yIHRoZSBhcHBDb21wb25lbnRcbiAqIEBwYXJhbSBvcHRpb25zLm1haW5Db250ZXh0UGF0aCBUaGUgbWFpbiBjb250ZXh0IHBhdGggdG8gdXNlIGZvciB0aGUgYXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gb3B0aW9ucy5wYWdlQ29udGVudCBUaGUgcGFnZSBjb250ZW50IHRvIHVzZSBmb3IgdGhlIGFwcENvbXBvbmVudFxuICogQHJldHVybnMgVGhlIGFwcGNvbXBvbmVudCBhbmQgdGVtcGxhdGVDb21wb25lbnQgdG8gdXNlIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplQXBwQ29tcG9uZW50KG9wdGlvbnM/OiB7XG5cdGNkc0ZpbGU/OiBzdHJpbmc7XG5cdG1haW5Db250ZXh0UGF0aD86IHN0cmluZztcblx0cGFnZUNvbnRlbnQ/OiBGdW5jdGlvbjtcbn0pOiBQcm9taXNlPHsgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7IHRlbXBsYXRlQ29tcG9uZW50OiBUZW1wbGF0ZUNvbXBvbmVudCB9PiB7XG5cdGxldCBjZHNGaWxlID0gb3B0aW9ucz8uY2RzRmlsZTtcblx0aWYgKCFjZHNGaWxlKSB7XG5cdFx0Y2RzRmlsZSA9IGNvbXBpbGVDRFMocGF0aC5qb2luKF9fZGlybmFtZSwgXCIuL2RhdGEvUHJvZHVjdHMuY2RzXCIpKTtcblx0fVxuXHRjb25zdCBndWlkID0gdWlkKCk7XG5cdGNvbnN0IGNkc0NvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY2RzRmlsZSkudG9TdHJpbmcoKTtcblx0c2FwLmplc3QucmVnaXN0ZXJGYWtlRnJhZ21lbnQoYC9zYXAvZmUvY29yZS9tb2NrLyR7Z3VpZH0vJG1ldGFkYXRhP3NhcC1sYW5ndWFnZT1FTmAsIGNkc0NvbnRlbnQpO1xuXG5cdHNhcC51aS5kZWZpbmUoYHNhcC9mZS90ZXN0LyR7Z3VpZH0vQ29tcG9uZW50YCwgW1wic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCJdLCBmdW5jdGlvbiAoX0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0XHRyZXR1cm4gQXBwQ29tcG9uZW50LmV4dGVuZChgc2FwLmZlLnRlc3QuJHtndWlkfS5Db21wb25lbnRgLCB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHRtYW5pZmVzdDoge1xuXHRcdFx0XHRcdFwic2FwLmFwcFwiOiB7XG5cdFx0XHRcdFx0XHRkYXRhU291cmNlczoge1xuXHRcdFx0XHRcdFx0XHRtYWluU2VydmljZToge1xuXHRcdFx0XHRcdFx0XHRcdHVyaTogYC9zYXAvZmUvY29yZS9tb2NrLyR7Z3VpZH0vYCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcIk9EYXRhXCIsXG5cdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdFx0XHRcdG9kYXRhVmVyc2lvbjogXCI0LjBcIlxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XCJzYXAudWk1XCI6IHtcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRcIlwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YVNvdXJjZTogXCJtYWluU2VydmljZVwiLFxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzeW5jaHJvbml6YXRpb25Nb2RlOiBcIk5vbmVcIlxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHJvdXRpbmc6IHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0czoge1xuXHRcdFx0XHRcdFx0XHRcdERlZmF1bHQ6IHtcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiQ29tcG9uZW50XCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRuYW1lOiBcInNhcC5mZS5jb3JlLmZwbVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0aWQ6IFwiRGVmYXVsdFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvcHRpb25zPy5tYWluQ29udGV4dFBhdGggPz8gXCIvUHJvZHVjdHNcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2aWV3VHlwZTogXCJKU1hcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2aWV3Q29udGVudDogb3B0aW9ucz8ucGFnZUNvbnRlbnQgPz8gKCgpID0+IDxQYWdlPjwvUGFnZT4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHJvdXRlczogW1xuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IFwiOj9xdWVyeTpcIixcblx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6IFwiRGVmYXVsdFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBcIkRlZmF1bHRcIlxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblx0Y29uc3QgbW9ja0FwcENvbXBvbmVudCA9IChhd2FpdCBDb21wb25lbnQuY3JlYXRlKHsgbmFtZTogYHNhcC5mZS50ZXN0LiR7Z3VpZH1gIH0pKSBhcyBBcHBDb21wb25lbnQ7XG5cblx0YXdhaXQgbW9ja0FwcENvbXBvbmVudC5pbml0aWFsaXplZDtcblx0Y29uc3QgdiA9IGF3YWl0IChtb2NrQXBwQ29tcG9uZW50LmdldFJvdXRlcigpLmdldFRhcmdldChcIkRlZmF1bHRcIikgYXMgeyBsb2FkPzogRnVuY3Rpb24gfSkubG9hZD8uKCk7XG5cdHJldHVybiB7IGFwcENvbXBvbmVudDogbW9ja0FwcENvbXBvbmVudCwgdGVtcGxhdGVDb21wb25lbnQ6IHYub2JqZWN0IH07XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0VBcUVBQSxHQUFHLENBQUNDLFFBQVEsQ0FBQyxDQUFDLEVBQVMsa0NBQWtDLENBQUM7RUFDMURDLElBQUksQ0FBQ0MsVUFBVSxDQUFDLEtBQUssQ0FBQztFQUV0QixNQUFNQyxZQUFvQyxHQUFHO0lBQzVDQyxLQUFLLEVBQUUsZUFBZTtJQUN0QkMsTUFBTSxFQUFFLGVBQWU7SUFDdkJDLElBQUksRUFBRSx1Q0FBdUM7SUFDN0NDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakNDLFNBQVMsRUFBRSxrRUFBa0U7SUFDN0VDLEdBQUcsRUFBRSxrRUFBa0U7SUFDdkVDLE9BQU8sRUFBRSxzQkFBc0I7SUFDL0JDLFFBQVEsRUFBRSx3QkFBd0I7SUFDbENDLElBQUksRUFBRSxhQUFhO0lBQ25CQyxFQUFFLEVBQUUsV0FBVztJQUNmQyxDQUFDLEVBQUUsT0FBTztJQUNWQyxDQUFDLEVBQUUsb0JBQW9CO0lBQ3ZCQyxFQUFFLEVBQUUsV0FBVztJQUNmQyxhQUFhLEVBQUUsd0JBQXdCO0lBQ3ZDQyxHQUFHLEVBQUUsWUFBWTtJQUNqQkMsS0FBSyxFQUFFLDBCQUEw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
|
|
879
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMb2ciLCJzZXRMZXZlbCIsImplc3QiLCJzZXRUaW1lb3V0IiwibmFtZVNwYWNlTWFwIiwibWFjcm8iLCJtYWNyb3MiLCJmZUJCIiwibWFjcm9GaWVsZCIsIm1hY3JvZGF0YSIsImxvZyIsImNvbnRyb2wiLCJjb250cm9scyIsImNvcmUiLCJkdCIsIm0iLCJmIiwiZmwiLCJpbnRlcm5hbE1hY3JvIiwibWRjIiwibWRjYXQiLCJtZGNGaWVsZCIsIm1kY1RhYmxlIiwidSIsIm1hY3JvTWljcm9DaGFydCIsIm1pY3JvQ2hhcnQiLCJtYWNyb1RhYmxlIiwibWRjdmMiLCJtZGN2IiwicmV2ZXNlTmFtZXNwYWNlTWFwIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsInJldmVyc2VNYXAiLCJjdXJyZW50TmFtZSIsInNlbGVjdCIsInhwYXRoIiwidXNlTmFtZXNwYWNlcyIsImRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UiLCJjb21wdXRlRmllbGRHcm91cElkcyIsIl9nZXRUZW1wbGF0ZWRTZWxlY3RvciIsInhtbGRvbSIsInNlbGVjdG9yIiwicm9vdFBhdGgiLCJub2RlTmFtZSIsInN0YXJ0c1dpdGgiLCJfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyIsInNNZXRhZGF0YVVybCIsIm1CaW5kaW5nQ29udGV4dHMiLCJtTW9kZWxzIiwiZmFrZVNpZGVFZmZlY3RTZXJ2aWNlIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImhhc093blByb3BlcnR5IiwiYXNzaWduIiwiY29udmVydGVyQ29udGV4dCIsIlRlbXBsYXRlTW9kZWwiLCJmb3JFYWNoIiwic01vZGVsTmFtZSIsImlzVGVtcGxhdGVNb2RlbCIsImRhdGEiLCJzZXR0aW5ncyIsIm1vZGVscyIsIm1ldGFNb2RlbCIsImJpbmRpbmdDb250ZXh0cyIsImFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImZuIiwiZ2V0RGlhZ25vc3RpY3MiLCJ1bmRlZmluZWQiLCJnZXRTaGVsbFNlcnZpY2VzIiwibW9ja1JldHVyblZhbHVlIiwic0tleSIsImV4cGVjdCIsImdldE9iamVjdCIsInRvQmVEZWZpbmVkIiwib01vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJfbG9hZFJlc291cmNlVmlldyIsInZpZXdOYW1lIiwibmFtZSIsInJlcGxhY2UiLCJ2aWV3IiwiTG9hZGVyRXh0ZW5zaW9ucyIsImxvYWRSZXNvdXJjZSIsImRvY3VtZW50RWxlbWVudCIsInJ1blhQYXRoUXVlcnkiLCJleHRlbmQiLCJ0b0hhdmVDb250cm9sIiwibm9kZXMiLCJtZXNzYWdlIiwib3V0cHV0WG1sIiwic2VyaWFsaXplWE1MIiwicGFzcyIsImxlbmd0aCIsInRvTm90SGF2ZUNvbnRyb2wiLCJ0b0hhdmVUZW1wbGF0aW5nRXJyb3JzIiwieG1sIiwieG1sVGV4dCIsImJhc2U2NEVudHJpZXMiLCJtYXRjaCIsImVycm9yTWVzc2FnZXMiLCJtYXAiLCJhdG9iIiwic2xpY2UiLCJqb2luIiwiZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCIsInhtbFN0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImZvcm1hdFhNTCIsImdldENvbnRyb2xBdHRyaWJ1dGUiLCJjb250cm9sU2VsZWN0b3IiLCJhdHRyaWJ1dGVOYW1lIiwieG1sRG9tIiwic2VyaWFsaXplciIsIndpbmRvdyIsIlhNTFNlcmlhbGl6ZXIiLCJub2RlIiwic2VyaWFsaXplVG9TdHJpbmciLCJTVEFSVCIsIkVORCIsIlVJRCIsImxpbmVzIiwiY3VycmVudExpbmUiLCJsZXZlbCIsImF0dHJpYnV0ZXMiLCJuZXdsaW5lIiwicHVzaCIsInJlcGVhdCIsImFwcGVuZEF0dHJpYnV0ZXMiLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiaW5jbHVkZXMiLCJhdHRyaWJ1dGUiLCJ2YWx1ZSIsImFwcGVuZCIsInBhcnNlciIsInJlYWQiLCJjcmVhdGVQYXJzZXIiLCJvbk9wZW5UYWdTdGFydCIsIm9uT3BlblRhZ05hbWUiLCJvbkF0dHJOYW1lIiwidW5zaGlmdCIsIm9uQXR0clZhbHVlIiwib25PcGVuVGFnRW5kIiwic2VsZkNsb3NlZCIsIm9uQ2xvc2VUYWdTdGFydCIsIm9uQ2xvc2VUYWdOYW1lIiwib25DbG9zZVRhZ0VuZCIsInBhcnNlIiwidHJpbSIsImNvbXBpbGVDRFMiLCJjZHNVcmwiLCJvcHRpb25zIiwiY2RzU3RyaW5nIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJlZG14Q29udGVudCIsImNkczJlZG14IiwiZGlyIiwicGF0aCIsInJlc29sdmUiLCJhbGxPcHRpb25zIiwiZW50cmllcyIsImVkbXhGaWxlTmFtZSIsImZpbGVuYW1lIiwib3B0aW9uS2V5Iiwib3B0aW9uVmFsdWUiLCJ0b1N0cmluZyIsImJhc2VuYW1lIiwiZWRteEZpbGVQYXRoIiwibWtkaXJTeW5jIiwicmVjdXJzaXZlIiwid3JpdGVGaWxlU3luYyIsImNkcyIsInNlcnZpY2UiLCJzb3VyY2VzIiwicmVxdWlyZSIsImNzbiIsImNvbXBpbGVyIiwiY29tcGlsZVNvdXJjZXMiLCJlZG14T3B0aW9ucyIsIm9kYXRhRm9yZWlnbktleXMiLCJvZGF0YUZvcm1hdCIsIm9kYXRhQ29udGFpbm1lbnQiLCJlZG14IiwidG8iLCJFcnJvciIsImdldEZha2VTaWRlRWZmZWN0c1NlcnZpY2UiLCJjbGFzc05hbWVPRGF0YU1vZGVsIiwic2NvcGVPYmplY3QiLCJnZXRNb2RlbCIsImlzQSIsImdldFNlcnZpY2VVcmwiLCJnZXRTZXJ2aWNlIiwiZ2V0Q2FwYWJpbGl0aWVzIiwic2VydmljZUluc3RhbmNlIiwiU2lkZUVmZmVjdHNGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJzY29wZVR5cGUiLCJnZXRJbnRlcmZhY2UiLCJnZXRGYWtlRGlhZ25vc3RpY3MiLCJpc3N1ZXMiLCJhZGRJc3N1ZSIsImlzc3VlQ2F0ZWdvcnkiLCJpc3N1ZVNldmVyaXR5IiwiZGV0YWlscyIsImdldElzc3VlcyIsImNoZWNrSWZJc3N1ZUV4aXN0cyIsImZpbmQiLCJpc3N1ZSIsImdldENvbnZlcnRlckNvbnRleHRGb3JUZXN0IiwibWFuaWZlc3RTZXR0aW5ncyIsImNvbnZlcnRlZFR5cGVzIiwiY29udmVydFR5cGVzIiwiZGF0YU1vZGVsUGF0aCIsImNvbnRleHRQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZW50aXR5U2V0IiwiQ29udmVydGVyQ29udGV4dCIsIm1lcmdlIiwibWV0YU1vZGVsQ2FjaGUiLCJvUmVxdWVzdG9yIiwiX01ldGFkYXRhUmVxdWVzdG9yIiwiY3JlYXRlIiwiT0RhdGFNZXRhTW9kZWwiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsImdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYXJncyIsImZvcm1hdHRlciIsImFwcGx5IiwiZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsIiwibW9kZWxDb250ZW50IiwibmFtZWRNb2RlbHNDb250ZW50IiwidGV4dCIsIkludmlzaWJsZVRleHQiLCJiaW5kUHJvcGVydHkiLCJkZWZhdWx0TW9kZWwiLCJKU09OTW9kZWwiLCJzZXRNb2RlbCIsInNldEJpbmRpbmdDb250ZXh0IiwiY29udGVudCIsIm1vZGVsIiwiZ2V0VGV4dCIsIlRFU1RWSUVXSUQiLCJhcHBseUZsZXhDaGFuZ2VzIiwiZmxleENoYW5nZXMiLCJyZXN1bHRYTUwiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaWQiLCJjaGFuZ2VzIiwiY3JlYXRlRmxleGliaWxpdHlDaGFuZ2VzT2JqZWN0IiwiYXBwSWQiLCJvTWFuaWZlc3QiLCJ0eXBlIiwiY3Jvc3NOYXZpZ2F0aW9uIiwib3V0Ym91bmRzIiwib0FwcENvbXBvbmVudCIsImdldENvbXBvbmVudERhdGEiLCJnZXRNYW5pZmVzdE9iamVjdCIsImdldEVudHJ5IiwiZ2V0TG9jYWxJZCIsInNJZCIsInNweU9uIiwiQXBwU3RvcmFnZSIsIlByb21pc2UiLCJMb2FkZXIiLCJDb21wb25lbnQiLCJVdGlscyIsIkZsZXhTdGF0ZSIsImluaXRpYWxpemUiLCJjb21wb25lbnRJZCIsIlhtbFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJjaGFuZ2VzQXBwbGllZCIsImdldENoYW5nZXNGcm9tWE1MIiwidG9CZSIsInZhcmlhbnREZXBlbmRlbnRDb250cm9sQ2hhbmdlcyIsImZsYXRNYXAiLCJlIiwiZmlsdGVyIiwiYXR0ciIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsImNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsIiwidGVtcGxhdGVkWG1sIiwiRE9NUGFyc2VyIiwieG1sRG9jIiwicGFyc2VGcm9tU3RyaW5nIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwiWE1MUHJlcHJvY2Vzc29yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJnZXRUZW1wbGF0ZWRYTUwiLCJqc3giLCJkZWZpbmVYTUxOYW1lc3BhY2VNYXAiLCJ0ZW1wbGF0ZWRYTUwiLCJzZXJpYWxpZWRYTUwiLCJub3QiLCJwcm9jZXNzVmlldyIsIm9WaWV3RG9jdW1lbnQiLCJvUHJlcHJvY2Vzc2VkVmlldyIsImFzRWxlbWVudCIsImFzU3RyaW5nIiwib3V0ZXJIVE1MIiwicHJvY2Vzc0ZyYWdtZW50IiwidGVzdERhdGEiLCJpbnB1dFhtbCIsImlucHV0RG9jIiwianNvbk1vZGVsIiwic2V0RGF0YSIsInJlc3VsdERvYyIsImZyYWdtZW50cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZnJhZ21lbnQiLCJpbm5lckhUTUwiLCJ4bWxSZXN1bHQiLCJjaGlsZHJlbiIsInNlcmlhbGl6ZUNvbnRyb2wiLCJjb250cm9sVG9TZXJpYWxpemUiLCJzaG93Q3VzdG9tU3R5bGVDbGFzc2VzIiwidGFiQ291bnQiLCJDT05UUk9MSUQiLCJnZXRUYWIiLCJ0b0FkZCIsInRhYiIsImkiLCJzZXJpYWxpemVEZWxlZ2F0ZSIsInN0YXJ0Iiwic0FnZ3JlZ2F0aW9uTmFtZSIsImNvbnRyb2xEZXRhaWwiLCJnZXRQYXJlbnQiLCJpbmRleEluUGFyZW50IiwiZ2V0QWdncmVnYXRpb24iLCJpbmRleE9mIiwiZ2V0TWV0YWRhdGEiLCJnZXROYW1lIiwiZW5kIiwibWlkZGxlIiwiZ2V0SWQiLCJNYW5hZ2VkT2JqZWN0TWV0YWRhdGEiLCJpc0dlbmVyYXRlZElkIiwib0NvbnRyb2xLZXkiLCJtUHJvcGVydGllcyIsInByb3BlcnR5VmFsdWUiLCJKU09OIiwic3RyaW5naWZ5IiwibUJpbmRpbmdJbmZvcyIsImJpbmRpbmdEZXRhaWwiLCJvT3V0cHV0Rm9ybWF0IiwibUFzc29jaWF0aW9ucyIsImFzc29jaWF0aW9uVmFsdWUiLCJhc3NvY2lhdGlvblZhbHVlRWxlbWVudCIsImFDdXN0b21TdHlsZUNsYXNzZXMiLCJtRXZlbnRSZWdpc3RyeSIsInN0YXJ0QWdncmVnYXRpb24iLCJzTmFtZSIsIm91dCIsImVuZEFnZ3JlZ2F0aW9uIiwiY29udHJvbFRvUmVuZGVyIiwiU2VyaWFsaXplciIsInNlcmlhbGl6ZSIsImNyZWF0ZUF3YWl0ZXIiLCJmblJlc29sdmUiLCJteVByb21pc2UiLCJwcm9taXNlIiwicmVuZGVyQnVpbGRpbmdCbG9ja1dpdGhNb2RlbHMiLCJidWlsZGluZ0Jsb2NrIiwiTWFuYWdlZE9iamVjdCIsInJ1bldpdGhQcmVwcm9jZXNzb3JzIiwiZ2V0Q29udGVudCIsImNvbnRyb2xTZXR0aW5ncyIsInJlZ2lzdGVyTW9ja0ZyYWdtZW50cyIsIm9yaWdpbmFsTG9hZFRlbXBsYXRlIiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGVQcm9taXNlIiwibG9hZFRlbXBsYXRlU3R1YiIsIm1vY2tJbXBsZW1lbnRhdGlvbiIsInRlbXBsYXRlTmFtZSIsImV4dGVuc2lvbiIsInBhcnNlWE1MU3RyaW5nIiwiaW5pdGlhbGl6ZUFwcENvbXBvbmVudCIsInZpZXdMZXZlbCIsImNkc0ZpbGUiLCJfX2Rpcm5hbWUiLCJndWlkIiwidWlkIiwiY2RzQ29udGVudCIsInNhcCIsInJlZ2lzdGVyRmFrZUZyYWdtZW50IiwidWkiLCJkZWZpbmUiLCJfQXBwQ29tcG9uZW50IiwiQXBwQ29tcG9uZW50IiwibWV0YWRhdGEiLCJtYW5pZmVzdCIsImRhdGFTb3VyY2VzIiwibWFpblNlcnZpY2UiLCJ1cmkiLCJvZGF0YVZlcnNpb24iLCJkYXRhU291cmNlIiwic3luY2hyb25pemF0aW9uTW9kZSIsInJvdXRpbmciLCJ0YXJnZXRzIiwiRGVmYXVsdCIsIm1haW5Db250ZXh0UGF0aCIsInZpZXdUeXBlIiwidmlld0NvbnRlbnQiLCJwYWdlQ29udGVudCIsInJvdXRlcyIsInBhdHRlcm4iLCJ0YXJnZXQiLCJtb2NrQXBwQ29tcG9uZW50IiwiaW5pdGlhbGl6ZWQiLCJ2IiwiZ2V0Um91dGVyIiwiZ2V0VGFyZ2V0IiwibG9hZCIsInRlbXBsYXRlQ29tcG9uZW50Iiwib2JqZWN0IiwiZmluZEVsZW1lbnQiLCJjb2xsZWN0aW9uIiwiZWxlbWVudCIsIml0ZW0iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFueUFubm90YXRpb24sIENvbnZlcnRlZE1ldGFkYXRhLCBFbnRpdHlTZXQsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgY29tcGlsZXIgZnJvbSBcIkBzYXAvY2RzLWNvbXBpbGVyXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB0eXBlIHsgUmFuZ2UsIFJhbmdlcyB9IGZyb20gXCJodG1sanMtcGFyc2VyXCI7XG5pbXBvcnQgeyBjcmVhdGVQYXJzZXIgfSBmcm9tIFwiaHRtbGpzLXBhcnNlclwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgTG9hZGVyRXh0ZW5zaW9ucyBmcm9tIFwic2FwL2Jhc2UvdXRpbC9Mb2FkZXJFeHRlbnNpb25zXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQganN4IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgVGVtcGxhdGVNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVNb2RlbFwiO1xuaW1wb3J0IHsgcGFyc2VYTUxTdHJpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MsIE9iamVjdFBhZ2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgSURpYWdub3N0aWNzLCBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTaWRlRWZmZWN0c0ZhY3RvcnkgZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS90ZXN0L1VJNU1vY2tIZWxwZXJcIjtcbmltcG9ydCBQYWdlIGZyb20gXCJzYXAvbS9QYWdlXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEludmlzaWJsZVRleHQgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVRleHRcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgU2VyaWFsaXplciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9zZXJpYWxpemVyL1NlcmlhbGl6ZXJcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwic2FwL3VpL2ZsL1V0aWxzXCI7XG5pbXBvcnQgRmxleFN0YXRlIGZyb20gXCJzYXAvdWkvZmwvYXBwbHkvX2ludGVybmFsL2ZsZXhTdGF0ZS9GbGV4U3RhdGVcIjtcbmltcG9ydCBMb2FkZXIgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvZmxleFN0YXRlL0xvYWRlclwiO1xuaW1wb3J0IFhtbFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L19pbnRlcm5hbC9wcmVwcm9jZXNzb3JzL1htbFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEFwcFN0b3JhZ2UgZnJvbSBcInNhcC91aS9mbC9pbml0aWFsL19pbnRlcm5hbC9TdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvbWRjL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9NZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBfTWV0YWRhdGFSZXF1ZXN0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9saWIvX01ldGFkYXRhUmVxdWVzdG9yXCI7XG5pbXBvcnQgeHBhdGggZnJvbSBcInhwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRPYmplY3RFeCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi90eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUZsZXhpYmlsaXR5Q2hhbmdlc09iamVjdCB9IGZyb20gXCIuL0plc3RGbGV4aWJpbGl0eUhlbHBlclwiO1xuXG50eXBlIFByZVByb2Nlc3NvclNldHRpbmdzVHlwZSA9IHtcblx0bW9kZWxzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IEpTT05Nb2RlbCB8IE9EYXRhTWV0YU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRbbmFtZTogc3RyaW5nXTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0fTtcbn07XG50eXBlIE1vY2tGcmFnbWVudCA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRjb250ZW50OiBzdHJpbmc7XG59O1xuXG50eXBlIEplc3RUZW1wbGF0ZWRWaWV3ID0ge1xuXHRhc0VsZW1lbnQ6IEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cdGFzU3RyaW5nOiBzdHJpbmc7XG59O1xuXG5Mb2cuc2V0TGV2ZWwoMSBhcyBhbnksIFwic2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3JcIik7XG5qZXN0LnNldFRpbWVvdXQoNDAwMDApO1xuXG5jb25zdCBuYW1lU3BhY2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG5cdG1hY3JvOiBcInNhcC5mZS5tYWNyb3NcIixcblx0bWFjcm9zOiBcInNhcC5mZS5tYWNyb3NcIixcblx0ZmVCQjogXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy50ZW1wbGF0aW5nXCIsXG5cdG1hY3JvRmllbGQ6IFwic2FwLmZlLm1hY3Jvcy5maWVsZFwiLFxuXHRtYWNyb2RhdGE6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRsb2c6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRjb250cm9sOiBcInNhcC5mZS5jb3JlLmNvbnRyb2xzXCIsXG5cdGNvbnRyb2xzOiBcInNhcC5mZS5tYWNyb3MuY29udHJvbHNcIixcblx0Y29yZTogXCJzYXAudWkuY29yZVwiLFxuXHRkdDogXCJzYXAudWkuZHRcIixcblx0bTogXCJzYXAubVwiLFxuXHRmOiBcInNhcC51aS5sYXlvdXQuZm9ybVwiLFxuXHRmbDogXCJzYXAudWkuZmxcIixcblx0aW50ZXJuYWxNYWNybzogXCJzYXAuZmUubWFjcm9zLmludGVybmFsXCIsXG5cdG1kYzogXCJzYXAudWkubWRjXCIsXG5cdG1kY2F0OiBcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhclwiLFxuXHRtZGNGaWVsZDogXCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdG1kY1RhYmxlOiBcInNhcC51aS5tZGMudGFibGVcIixcblx0dTogXCJzYXAudWkudW5pZmllZFwiLFxuXHRtYWNyb01pY3JvQ2hhcnQ6IFwic2FwLmZlLm1hY3Jvcy5taWNyb2NoYXJ0XCIsXG5cdG1pY3JvQ2hhcnQ6IFwic2FwLnN1aXRlLnVpLm1pY3JvY2hhcnRcIixcblx0bWFjcm9UYWJsZTogXCJzYXAuZmUubWFjcm9zLnRhYmxlXCIsXG5cdG1kY3ZjOiBcInNhcC51aS5tZGMudmFsdWVoZWxwLmNvbnRlbnRcIixcblx0bWRjdjogXCJzYXAudWkubWRjLnZhbHVlaGVscFwiXG59O1xuY29uc3QgcmV2ZXNlTmFtZXNwYWNlTWFwID0gT2JqZWN0LmtleXMobmFtZVNwYWNlTWFwKS5yZWR1Y2UoKHJldmVyc2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGN1cnJlbnROYW1lKSA9PiB7XG5cdHJldmVyc2VNYXBbbmFtZVNwYWNlTWFwW2N1cnJlbnROYW1lXV0gPSBjdXJyZW50TmFtZTtcblx0cmV0dXJuIHJldmVyc2VNYXA7XG59LCB7fSk7XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmNvbnN0IGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UgPSB7IGNvbXB1dGVGaWVsZEdyb3VwSWRzOiAoKSA9PiBbXSB9O1xuXG5mdW5jdGlvbiBfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tOiBOb2RlLCBzZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcblx0LyoqXG5cdCAqIGlmIGEgcm9vdCBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIGR1cmluZyB0aGUgdGVtcGxhdGluZyBieSBvdXIgSmVzdCBUZW1wbGF0aW5nIG1ldGhvZHNcblx0ICogdGhlIHJvb3QgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgc2VsZWN0b3IgcGF0aC5cblx0ICovXG5cdGNvbnN0IHJvb3RQYXRoID0gXCIvcm9vdFwiO1xuXHRyZXR1cm4gYCR7eG1sZG9tLm5vZGVOYW1lID09PSBcInJvb3RcIiAmJiAhc2VsZWN0b3Iuc3RhcnRzV2l0aChyb290UGF0aCkgPyByb290UGF0aCA6IFwiXCJ9JHtzZWxlY3Rvcn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlPzogdW5rbm93blxuKTogUHJvbWlzZTxQcmVQcm9jZXNzb3JTZXR0aW5nc1R5cGU+IHtcblx0bGV0IG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsIHwgdW5kZWZpbmVkO1xuXHRpZiAoc01ldGFkYXRhVXJsKSB7XG5cdFx0b01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRcdC8vIFRvIGVuc3VyZSBvdXIgbWFjcm8gY2FuIHVzZSAjc2V0QmluZGluZ0NvbnRleHQgd2UgZW5zdXJlIHRoZXJlIGlzIGEgcHJlIGV4aXN0aW5nIEpTT05Nb2RlbCBmb3IgY29udmVydGVyQ29udGV4dFxuXHRcdC8vIGlmIG5vdCBhbHJlYWR5IHBhc3NlZCB0byB0ZWggdGVtcGxhdGluZ1xuXHRcdGlmICghbU1vZGVscy5oYXNPd25Qcm9wZXJ0eShcImNvbnZlcnRlckNvbnRleHRcIikpIHtcblx0XHRcdG1Nb2RlbHMgPSBPYmplY3QuYXNzaWduKG1Nb2RlbHMsIHsgY29udmVydGVyQ29udGV4dDogbmV3IFRlbXBsYXRlTW9kZWwoe30sIG9NZXRhTW9kZWwhKSB9KTtcblx0XHR9XG5cblx0XHRPYmplY3Qua2V5cyhtTW9kZWxzKS5mb3JFYWNoKGZ1bmN0aW9uIChzTW9kZWxOYW1lKSB7XG5cdFx0XHRpZiAobU1vZGVsc1tzTW9kZWxOYW1lXSAmJiBtTW9kZWxzW3NNb2RlbE5hbWVdLmlzVGVtcGxhdGVNb2RlbCkge1xuXHRcdFx0XHRtTW9kZWxzW3NNb2RlbE5hbWVdID0gbmV3IFRlbXBsYXRlTW9kZWwobU1vZGVsc1tzTW9kZWxOYW1lXS5kYXRhLCBvTWV0YU1vZGVsISk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRjb25zdCBzZXR0aW5nczogYW55ID0ge1xuXHRcdG1vZGVsczogT2JqZWN0LmFzc2lnbihcblx0XHRcdHtcblx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsXG5cdFx0XHR9LFxuXHRcdFx0bU1vZGVsc1xuXHRcdCksXG5cdFx0YmluZGluZ0NvbnRleHRzOiB7fSxcblx0XHRhcHBDb21wb25lbnQ6IHsgZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlOiBqZXN0LmZuKCksIGdldERpYWdub3N0aWNzOiAoKSA9PiB1bmRlZmluZWQsIGdldFNoZWxsU2VydmljZXM6IGplc3QuZm4oKSB9XG5cdH07XG5cblx0c2V0dGluZ3MuYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZS5tb2NrUmV0dXJuVmFsdWUoZmFrZVNpZGVFZmZlY3RTZXJ2aWNlID8/IGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXHQvL0luamVjdCBtb2RlbHMgYW5kIGJpbmRpbmdDb250ZXh0c1xuXHRPYmplY3Qua2V5cyhtQmluZGluZ0NvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWw/LmdldE9iamVjdChtQmluZGluZ0NvbnRleHRzW3NLZXldKSkudG9CZURlZmluZWQoKTtcblx0XHRjb25zdCBvTW9kZWwgPSBtTW9kZWxzW3NLZXldIHx8IG9NZXRhTW9kZWw7XG5cdFx0c2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NLZXldID0gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pOyAvL1ZhbHVlIGlzIHNQYXRoXG5cdFx0c2V0dGluZ3MubW9kZWxzW3NLZXldID0gb01vZGVsO1xuXHR9KTtcblx0cmV0dXJuIHNldHRpbmdzO1xufVxuXG5mdW5jdGlvbiBfbG9hZFJlc291cmNlVmlldyh2aWV3TmFtZTogc3RyaW5nKTogRWxlbWVudCB7XG5cdGNvbnN0IG5hbWUgPSB2aWV3TmFtZS5yZXBsYWNlKC9cXC4vZywgXCIvXCIpICsgXCIudmlldy54bWxcIjtcblx0Y29uc3QgdmlldyA9IExvYWRlckV4dGVuc2lvbnMubG9hZFJlc291cmNlKG5hbWUpO1xuXHRyZXR1cm4gdmlldy5kb2N1bWVudEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBydW5YUGF0aFF1ZXJ5ID0gZnVuY3Rpb24gKHNlbGVjdG9yOiBzdHJpbmcsIHhtbGRvbTogTm9kZSB8IHVuZGVmaW5lZCkge1xuXHRyZXR1cm4gc2VsZWN0KHNlbGVjdG9yLCB4bWxkb20pO1xufTtcblxuZXhwZWN0LmV4dGVuZCh7XG5cdHRvSGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tLCBzZWxlY3RvciksIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgZGlkIG5vdCBmaW5kIGNvbnRyb2xzIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID49IDFcblx0XHR9O1xuXHR9LFxuXHR0b05vdEhhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoX2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbGRvbSwgc2VsZWN0b3IpLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYFRoZXJlIGlzIGEgY29udHJvbCBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA9PT0gMFxuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBDaGVja3MgZm9yIGVycm9ycyBpbiBgeG1sYCBjcmVhdGVkIGR1cmluZyB0ZW1wbGF0aW5nIG9mIGFuIFhNTCBzdHJpbmcgb3Jcblx0ICogYW4gWE1MIG5vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2hlY2tlcyBmb3IgdGhlIHhtbCBlcnJvcnMgY3JlYXRlZCBieSB0aGVcblx0ICogZnVuY3Rpb24gW0J1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3Nvci5jcmVhdGVFcnJvclhNTF17QGxpbmsgc2FwLmZlLmNvcmUuYnVpbGRpbmdCbG9ja3MudGVtcGxhdGluZy5CdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3IjY3JlYXRlRXJyb3JYTUx9LlxuXHQgKlxuXHQgKiBAcGFyYW0geG1sIFhNTCBTdHJpbmcgb3IgWE1MIE5vZGUgdG8gYmUgdGVzdGVkIGZvciBlcnJvcnNcblx0ICogQHJldHVybnMgSmVzdCBNYXRjaGVyIHJlc3VsdCBvYmplY3Rcblx0ICovXG5cdHRvSGF2ZVRlbXBsYXRpbmdFcnJvcnMoeG1sOiBzdHJpbmcgfCBOb2RlKSB7XG5cdFx0Y29uc3QgeG1sVGV4dCA9IHR5cGVvZiB4bWwgPT09IFwic3RyaW5nXCIgPyB4bWwgOiBzZXJpYWxpemVYTUwoeG1sKTtcblx0XHRjb25zdCBiYXNlNjRFbnRyaWVzOiBzdHJpbmdbXSA9IHhtbFRleHQubWF0Y2goL0JCRlxcLmJhc2U2NERlY29kZVxcKCcoW14nXSopJ1xcKS9nbSkgfHwgKFtdIGFzIHN0cmluZ1tdKTtcblx0XHRjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IGJhc2U2NEVudHJpZXMubWFwKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmIChtZXNzYWdlICYmIG1lc3NhZ2UubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gYXRvYihtZXNzYWdlLm1hdGNoKC8oJ1teJ10qKS8pPy5bMF0/LnNsaWNlKDEpIHx8IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSk7XG5cdFx0aWYgKGVycm9yTWVzc2FnZXMubGVuZ3RoIDw9IDApIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1lc3NhZ2U6ICgpID0+IGBYTUwgVGVtcGxhdGluZyB3aXRob3V0IGVycm9yc2AsXG5cdFx0XHRcdHBhc3M6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtZXNzYWdlOiAoKSA9PiBlcnJvck1lc3NhZ2VzLmpvaW4oXCJcXG5cIiksXG5cdFx0XHRcdHBhc3M6IHRydWVcblx0XHRcdH07XG5cdFx0fVxuXHR9XG59KTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEJ1aWxkaW5nQmxvY2tYTUwgPSBmdW5jdGlvbiAoeG1sU3RyaW5nOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGlmIChBcnJheS5pc0FycmF5KHhtbFN0cmluZykpIHtcblx0XHR4bWxTdHJpbmcgPSB4bWxTdHJpbmcuam9pbihcIlwiKTtcblx0fVxuXHRyZXR1cm4gZm9ybWF0WE1MKHhtbFN0cmluZyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJvbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChjb250cm9sU2VsZWN0b3I6IHN0cmluZywgYXR0cmlidXRlTmFtZTogc3RyaW5nLCB4bWxEb206IE5vZGUpIHtcblx0Y29uc3Qgc2VsZWN0b3IgPSBgc3RyaW5nKCR7X2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbERvbSwgY29udHJvbFNlbGVjdG9yKX0vQCR7YXR0cmlidXRlTmFtZX0pYDtcblx0cmV0dXJuIHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSk7XG59O1xuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgcGFydHMgb3IgdGhlIGNvbXBsZXRlIGdpdmVuIFhNTCBET00gdG8gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB4bWxEb20gRE9NIG5vZGUgdGhhdCBpcyB0byBiZSBzZXJpYWxpemVkLlxuICogQHBhcmFtIHNlbGVjdG9yIE9wdGlvbmFsIHNlbGVjdG9yIG9mIHN1YiBub2Rlc1xuICogQHJldHVybnMgWE1MIHN0cmluZ1xuICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplWE1MID0gZnVuY3Rpb24gKHhtbERvbTogTm9kZSwgc2VsZWN0b3I/OiBzdHJpbmcpIHtcblx0Y29uc3Qgc2VyaWFsaXplciA9IG5ldyB3aW5kb3cuWE1MU2VyaWFsaXplcigpO1xuXHRsZXQgeG1sU3RyaW5nOiBzdHJpbmc7XG5cdGlmIChzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShzZWxlY3RvciwgeG1sRG9tKSBhcyBOb2RlW107XG5cdFx0eG1sU3RyaW5nID0gbm9kZXMubWFwKChub2RlKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKG5vZGUpKS5qb2luKFwiXFxuXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHhtbFN0cmluZyA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoeG1sRG9tKTtcblx0fVxuXHRyZXR1cm4gZm9ybWF0WE1MKHhtbFN0cmluZyk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHMgYSBzdHJpbmcgY29udGFpbmluZyBhbiBYTUwgZG9jdW1lbnQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBvbmx5IGNvbnNpZGVycyBYTUwgdGFncyBhbmQgYXR0cmlidXRlcywgaWdub3JpbmcgZXZlcnl0aGluZyBlbHNlICh0ZXh0LCBjb21tZW50cykuIEFkZGl0aW9uYWxseSxcbiAqIGF0dHJpYnV0ZSB2YWx1ZXMgY29udGFpbmluZyBhIHZhcnlpbmcgVUlEIGFyZSByZXBsYWNlZCB3aXRoIGEgY29uc3RhbnQgdmFsdWUuXG4gKlxuICogQW4gXCJYTUxcIiBzdHJpbmcgY29udGFpbmluZyBtdWx0aXBsZSByb290IGVsZW1lbnRzIGNhbiBiZS5cbiAqXG4gKiBAcGFyYW0geG1sU3RyaW5nICBUaGUgaW5wdXQgWE1MIHN0cmluZy4gVGhpcyBmdW5jdGlvbiBhbHNvIGFjY2VwdHMgXCJYTUxcIiBzdHJpbmdzIHdpdGggbXVsdGlwbGUgcm9vdCBlbGVtZW50cy5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgWE1MIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdFhNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IFNUQVJUID0gXCI8X19YTUxfXz5cIixcblx0XHRFTkQgPSBcIjwvX19YTUxfXz5cIixcblx0XHRVSUQgPSAvdWlkLS1pZC1cXGR7MTN9LVxcZHsxLDN9Lyxcblx0XHRsaW5lczogc3RyaW5nW10gPSBbXTtcblxuXHRsZXQgY3VycmVudExpbmUgPSBcIlwiLFxuXHRcdGxldmVsID0gLTEsXG5cdFx0YXR0cmlidXRlczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdGZ1bmN0aW9uIG5ld2xpbmUoKSB7XG5cdFx0aWYgKGN1cnJlbnRMaW5lICYmIGN1cnJlbnRMaW5lICE9PSBTVEFSVCkge1xuXHRcdFx0bGluZXMucHVzaChjdXJyZW50TGluZSk7XG5cdFx0fVxuXG5cdFx0Y3VycmVudExpbmUgPSBsZXZlbCA+IDAgPyBcIiAgXCIucmVwZWF0KGxldmVsKSA6IFwiXCI7XG5cdH1cblxuXHRmdW5jdGlvbiBhcHBlbmRBdHRyaWJ1dGVzKCkge1xuXHRcdGlmIChhdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLnNvcnQoKGEsIGIpID0+IHtcblx0XHRcdFx0aWYgKGEubmFtZS5zdGFydHNXaXRoKFwieG1sbnNcIikgJiYgIWIubmFtZS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIWEubmFtZS5zdGFydHNXaXRoKFwieG1sbnNcIikgJiYgYi5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGEubmFtZS5zdGFydHNXaXRoKFwieG1sbnNcIikgJiYgYi5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0XHRcdHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGEubmFtZS5pbmNsdWRlcyhcIjpcIikgJiYgIWIubmFtZS5pbmNsdWRlcyhcIjpcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIWEubmFtZS5pbmNsdWRlcyhcIjpcIikgJiYgYi5uYW1lLmluY2x1ZGVzKFwiOlwiKSkge1xuXHRcdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bGV2ZWwrKztcblx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0bmV3bGluZSgpO1xuXHRcdFx0XHRjdXJyZW50TGluZSArPSBhdHRyaWJ1dGUubmFtZTtcblx0XHRcdFx0aWYgKGF0dHJpYnV0ZS52YWx1ZSkgY3VycmVudExpbmUgKz0gYXR0cmlidXRlLnZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0bGV2ZWwtLTtcblx0XHRcdGF0dHJpYnV0ZXMgPSBbXTtcblx0XHRcdG5ld2xpbmUoKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBhcHBlbmQoZGF0YTogUmFuZ2UpIHtcblx0XHRjdXJyZW50TGluZSArPSBwYXJzZXIucmVhZChkYXRhKTtcblx0fVxuXG5cdGNvbnN0IHBhcnNlciA9IGNyZWF0ZVBhcnNlcih7XG5cdFx0b25PcGVuVGFnU3RhcnQoZGF0YTogUmFuZ2UpIHtcblx0XHRcdG5ld2xpbmUoKTtcblx0XHRcdGFwcGVuZChkYXRhKTtcblx0XHR9LFxuXG5cdFx0b25PcGVuVGFnTmFtZTogYXBwZW5kLFxuXG5cdFx0b25BdHRyTmFtZShkYXRhOiBSYW5nZSkge1xuXHRcdFx0YXR0cmlidXRlcy51bnNoaWZ0KHsgbmFtZTogcGFyc2VyLnJlYWQoZGF0YSkgfSk7XG5cdFx0fSxcblxuXHRcdG9uQXR0clZhbHVlKGRhdGE6IFJhbmdlcy5BdHRyVmFsdWUpIHtcblx0XHRcdGF0dHJpYnV0ZXNbMF0udmFsdWUgPSBwYXJzZXIucmVhZChkYXRhKS5yZXBsYWNlKFVJRCwgXCJ1aWQtLWlkXCIpOyAvLyByZXBsYWNlIHZhcnlpbmcgVUlEcyB3aXRoIGEgY29uc3RhbnQgdmFsdWVcblx0XHR9LFxuXG5cdFx0b25PcGVuVGFnRW5kKGRhdGE6IFJhbmdlcy5PcGVuVGFnRW5kKSB7XG5cdFx0XHRhcHBlbmRBdHRyaWJ1dGVzKCk7XG5cdFx0XHRhcHBlbmQoZGF0YSk7XG5cdFx0XHRpZiAoIWRhdGEuc2VsZkNsb3NlZCkgbGV2ZWwrKztcblx0XHR9LFxuXG5cdFx0b25DbG9zZVRhZ1N0YXJ0KGRhdGE6IFJhbmdlKSB7XG5cdFx0XHRsZXZlbC0tO1xuXHRcdFx0bmV3bGluZSgpO1xuXHRcdFx0YXBwZW5kKGRhdGEpO1xuXHRcdH0sXG5cblx0XHRvbkNsb3NlVGFnTmFtZTogYXBwZW5kLFxuXHRcdG9uQ2xvc2VUYWdFbmQ6IGFwcGVuZFxuXHR9KTtcblxuXHRwYXJzZXIucGFyc2UoU1RBUlQgKyB4bWxTdHJpbmcgKyBFTkQpO1xuXHRyZXR1cm4gbGluZXMuam9pbihcIlxcblwiKS50cmltKCk7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgYSBDRFMgZmlsZSBpbnRvIGFuIEVETVggZmlsZS5cbiAqXG4gKiBAcGFyYW0gY2RzVXJsIFRoZSBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIENEUyBkZWZpbml0aW9uLiBUaGlzIGZpbGUgbXVzdCBkZWNsYXJlIHRoZSBuYW1lc3BhY2VcbiAqIHNhcC5mZS50ZXN0IGFuZCBhIHNlcnZpY2UgSmVzdFNlcnZpY2VcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBFRE1YIG91dHB1dFxuICogQHJldHVybnMgVGhlIHBhdGggb2YgdGhlIGdlbmVyYXRlZCBFRE1YXG4gKi9cbmV4cG9ydCBjb25zdCBjb21waWxlQ0RTID0gZnVuY3Rpb24gKGNkc1VybDogc3RyaW5nLCBvcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBjZHNTdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoY2RzVXJsLCBcInV0Zi04XCIpO1xuXHRjb25zdCBlZG14Q29udGVudCA9IGNkczJlZG14KGNkc1N0cmluZywgXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zKTtcblx0Y29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKGNkc1VybCwgXCIuLlwiLCBcImdlblwiKTtcblxuXHQvLyBJZiB0aGUgY2FsbGVyIHByb3ZpZGVkIENEUyBjb21waWxlciBvcHRpb25zOiBJbmNsdWRlIHRoZW0gaW4gdGhlIGZpbGVuYW1lLiBUaGlzIHByZXZlbnRzIHVucHJlZGljdGFibGUgcmVzdWx0cyBpZiB0aGUgc2FtZSBDRFMgc291cmNlXG5cdC8vIGZpbGUgaXMgdXNlZCBzaW11bHRhbmVvdXNseSB3aXRoIGEgZGlmZmVyZW50IHNldCBvZiBvcHRpb25zIChlLmcuIGluIGEgdGVzdCBydW5uaW5nIGluIHBhcmFsbGVsKVxuXHRjb25zdCBhbGxPcHRpb25zID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucyk7XG5cdGFsbE9wdGlvbnMuc29ydCgoYSwgYikgPT4gYlswXS5sb2NhbGVDb21wYXJlKGFbMF0pKTtcblxuXHRjb25zdCBlZG14RmlsZU5hbWUgPVxuXHRcdGFsbE9wdGlvbnMucmVkdWNlKFxuXHRcdFx0KGZpbGVuYW1lLCBbb3B0aW9uS2V5LCBvcHRpb25WYWx1ZV0pID0+IGAke2ZpbGVuYW1lfSMke29wdGlvbktleX09JHtvcHRpb25WYWx1ZS50b1N0cmluZygpfSNgLFxuXHRcdFx0cGF0aC5iYXNlbmFtZShjZHNVcmwpLnJlcGxhY2UoXCIuY2RzXCIsIFwiXCIpXG5cdFx0KSArIFwiLnhtbFwiO1xuXG5cdGNvbnN0IGVkbXhGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXIsIGVkbXhGaWxlTmFtZSk7XG5cblx0ZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0ZnMud3JpdGVGaWxlU3luYyhlZG14RmlsZVBhdGgsIGVkbXhDb250ZW50KTtcblx0cmV0dXJuIGVkbXhGaWxlUGF0aDtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBDRFMgdG8gRURNWC5cbiAqXG4gKiBAcGFyYW0gY2RzIFRoZSBDRFMgbW9kZWwuIEl0IG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBzZXJ2aWNlLlxuICogQHBhcmFtIHNlcnZpY2UgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGJlIGNvbXBpbGVkLiBEZWZhdWx0cyB0byBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBjcmVhdGluZyB0aGUgRURNWCBvdXRwdXRcbiAqIEByZXR1cm5zIFRoZSBjb21waWxlZCBzZXJ2aWNlIG1vZGVsIGFzIEVETVguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZHMyZWRteChjZHM6IHN0cmluZywgc2VydmljZSA9IFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIiwgb3B0aW9uczogY29tcGlsZXIuT0RhdGFPcHRpb25zID0ge30pIHtcblx0Y29uc3Qgc291cmNlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgXCJzb3VyY2UuY2RzXCI6IGNkcyB9O1xuXG5cdC8vIGFsbG93IHRvIGluY2x1ZGUgc3R1ZmYgZnJvbSBAc2FwL2Nkcy9jb21tb25cblx0aWYgKGNkcy5pbmNsdWRlcyhcIidAc2FwL2Nkcy9jb21tb24nXCIpKSB7XG5cdFx0c291cmNlc1tcImNvbW1vbi5jZHNcIl0gPSBmcy5yZWFkRmlsZVN5bmMocmVxdWlyZS5yZXNvbHZlKFwiQHNhcC9jZHMvY29tbW9uLmNkc1wiKSwgXCJ1dGYtOFwiKTtcblx0fVxuXG5cdGNvbnN0IGNzbiA9IGNvbXBpbGVyLmNvbXBpbGVTb3VyY2VzKHNvdXJjZXMsIHt9KTtcblxuXHRjb25zdCBlZG14T3B0aW9uczogY29tcGlsZXIuT0RhdGFPcHRpb25zID0ge1xuXHRcdG9kYXRhRm9yZWlnbktleXM6IHRydWUsXG5cdFx0b2RhdGFGb3JtYXQ6IFwic3RydWN0dXJlZFwiLFxuXHRcdG9kYXRhQ29udGFpbm1lbnQ6IHRydWUsXG5cdFx0Li4ub3B0aW9ucyxcblx0XHRzZXJ2aWNlOiBzZXJ2aWNlXG5cdH07XG5cblx0Y29uc3QgZWRteCA9IGNvbXBpbGVyLnRvLmVkbXgoY3NuLCBlZG14T3B0aW9ucyk7XG5cdGlmICghZWRteCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgQ29tcGlsYXRpb24gZmFpbGVkLiBIaW50OiBNYWtlIHN1cmUgdGhhdCB0aGUgQ0RTIG1vZGVsIGRlZmluZXMgc2VydmljZSAke3NlcnZpY2V9LmApO1xuXHR9XG5cdHJldHVybiBlZG14O1xufVxuXG5leHBvcnQgY29uc3QgZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSA9IGFzeW5jIGZ1bmN0aW9uIChcblx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0Y2xhc3NOYW1lT0RhdGFNb2RlbCA9IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIlxuKTogUHJvbWlzZTxTaWRlRWZmZWN0c1NlcnZpY2U+IHtcblx0Y29uc3Qgc2NvcGVPYmplY3QgPSB7XG5cdFx0Z2V0TW9kZWw6ICgpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlzQTogKCkgPT4gY2xhc3NOYW1lT0RhdGFNb2RlbCA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiLFxuXHRcdFx0XHRnZXRNZXRhTW9kZWw6ICgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbWV0YU1vZGVsO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXRTZXJ2aWNlVXJsOiAoKSA9PiB1bmRlZmluZWRcblx0XHRcdH07XG5cdFx0fSxcblx0XHRnZXRTZXJ2aWNlOiAoKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRnZXRDYXBhYmlsaXRpZXM6ICgpID0+IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHNlcnZpY2VJbnN0YW5jZSA9IGF3YWl0IG5ldyBTaWRlRWZmZWN0c0ZhY3RvcnkoKS5jcmVhdGVJbnN0YW5jZSh7IHNjb3BlT2JqZWN0LCBzY29wZVR5cGU6IFwiXCIsIHNldHRpbmdzOiB7fSB9KTtcblx0cmV0dXJuIHNlcnZpY2VJbnN0YW5jZS5nZXRJbnRlcmZhY2UoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlRGlhZ25vc3RpY3MgPSBmdW5jdGlvbiAoKTogSURpYWdub3N0aWNzIHtcblx0Y29uc3QgaXNzdWVzOiBhbnlbXSA9IFtdO1xuXHRyZXR1cm4ge1xuXHRcdGFkZElzc3VlKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0aXNzdWVzLnB1c2goe1xuXHRcdFx0XHRpc3N1ZUNhdGVnb3J5LFxuXHRcdFx0XHRpc3N1ZVNldmVyaXR5LFxuXHRcdFx0XHRkZXRhaWxzXG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGdldElzc3VlcygpOiBhbnlbXSB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzO1xuXHRcdH0sXG5cdFx0Y2hlY2tJZklzc3VlRXhpc3RzKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIGlzc3Vlcy5maW5kKChpc3N1ZSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gaXNzdWUuaXNzdWVDYXRlZ29yeSA9PT0gaXNzdWVDYXRlZ29yeSAmJiBpc3N1ZS5pc3N1ZVNldmVyaXR5ID09PSBpc3N1ZVNldmVyaXR5ICYmIGlzc3VlLmRldGFpbHMgPT09IGRldGFpbHM7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QgPSBmdW5jdGlvbiAoXG5cdG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdG1hbmlmZXN0U2V0dGluZ3M6IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzIHwgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3Ncbikge1xuXHRjb25zdCBjb252ZXJ0ZWRUeXBlcyA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gbWFuaWZlc3RTZXR0aW5ncy5jb250ZXh0UGF0aFxuXHRcdD8gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4obWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1hbmlmZXN0U2V0dGluZ3MuY29udGV4dFBhdGgpIGFzIENvbnRleHQpXG5cdFx0OiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PihtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke21hbmlmZXN0U2V0dGluZ3MuZW50aXR5U2V0fWApKTtcblx0cmV0dXJuIG5ldyBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4oY29udmVydGVkVHlwZXMsIG1hbmlmZXN0U2V0dGluZ3MsIGdldEZha2VEaWFnbm9zdGljcygpLCBtZXJnZSwgZGF0YU1vZGVsUGF0aCk7XG59O1xuY29uc3QgbWV0YU1vZGVsQ2FjaGU6IGFueSA9IHt9O1xuZXhwb3J0IGNvbnN0IGdldE1ldGFNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIChzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwgdW5kZWZpbmVkLCB7fSk7XG5cdGlmICghbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBuZXcgKE9EYXRhTWV0YU1vZGVsIGFzIGFueSkob1JlcXVlc3Rvciwgc01ldGFkYXRhVXJsLCB1bmRlZmluZWQsIG51bGwpO1xuXHRcdGF3YWl0IG9NZXRhTW9kZWwuZmV0Y2hFbnRpdHlDb250YWluZXIoKTtcblx0XHRtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdID0gb01ldGFNb2RlbDtcblx0fVxuXG5cdHJldHVybiBtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uIDxUID0gUHJvcGVydHkgfCBFbnRpdHlTZXQgfCBBbnlBbm5vdGF0aW9uPihcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0cHJvcGVydHk/OiBUXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoPFQ+IHtcblx0Y29uc3QgdGFyZ2V0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxUPiA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHR0YXJnZXRPYmplY3Q6IHByb3BlcnR5LFxuXHRcdHRhcmdldEVudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGVudGl0eVNldC5lbnRpdHlUeXBlLFxuXHRcdGNvbnZlcnRlZFR5cGVzOiBjb252ZXJ0ZWRUeXBlc1xuXHR9O1xuXHR0YXJnZXRQYXRoLmNvbnRleHRMb2NhdGlvbiA9IHRhcmdldFBhdGggYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxFbnRpdHlTZXQ+O1xuXHRyZXR1cm4gdGFyZ2V0UGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBldmFsdWF0ZUJpbmRpbmcgPSBmdW5jdGlvbiAoYmluZGluZ1N0cmluZzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuXHRjb25zdCBiaW5kaW5nRWxlbWVudCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihiaW5kaW5nU3RyaW5nKTtcblx0cmV0dXJuIGJpbmRpbmdFbGVtZW50LmZvcm1hdHRlci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xufTtcblxudHlwZSBNb2RlbENvbnRlbnQgPSB7XG5cdFtuYW1lOiBzdHJpbmddOiBhbnk7XG59O1xuXG4vKipcbiAqIEV2YWx1YXRlIGEgYmluZGluZyBhZ2FpbnN0IGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIGJpbmRpbmdTdHJpbmcgVGhlIGJpbmRpbmcgc3RyaW5nLlxuICogQHBhcmFtIG1vZGVsQ29udGVudCBDb250ZW50IG9mIHRoZSBkZWZhdWx0IG1vZGVsIHRvIHVzZSBmb3IgZXZhbHVhdGlvbi5cbiAqIEBwYXJhbSBuYW1lZE1vZGVsc0NvbnRlbnQgQ29udGVudHMgb2YgYWRkaXRpb25hbCwgbmFtZWQgbW9kZWxzIHRvIHVzZS5cbiAqIEByZXR1cm5zIFRoZSBldmFsdWF0ZWQgYmluZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbChcblx0YmluZGluZ1N0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtb2RlbENvbnRlbnQ6IE1vZGVsQ29udGVudCxcblx0bmFtZWRNb2RlbHNDb250ZW50PzogeyBbbW9kZWxOYW1lOiBzdHJpbmddOiBNb2RlbENvbnRlbnQgfVxuKTogc3RyaW5nIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdGNvbnN0IHRleHQgPSBuZXcgSW52aXNpYmxlVGV4dCgpO1xuXHR0ZXh0LmJpbmRQcm9wZXJ0eShcInRleHRcIiwgYmluZGluZ0VsZW1lbnQpO1xuXG5cdGNvbnN0IGRlZmF1bHRNb2RlbCA9IG5ldyBKU09OTW9kZWwobW9kZWxDb250ZW50KTtcblx0dGV4dC5zZXRNb2RlbChkZWZhdWx0TW9kZWwpO1xuXHR0ZXh0LnNldEJpbmRpbmdDb250ZXh0KGRlZmF1bHRNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikpO1xuXG5cdGlmIChuYW1lZE1vZGVsc0NvbnRlbnQpIHtcblx0XHRmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhuYW1lZE1vZGVsc0NvbnRlbnQpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IG5ldyBKU09OTW9kZWwoY29udGVudCk7XG5cdFx0XHR0ZXh0LnNldE1vZGVsKG1vZGVsLCBuYW1lKTtcblx0XHRcdHRleHQuc2V0QmluZGluZ0NvbnRleHQobW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpLCBuYW1lKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGV4dC5nZXRUZXh0KCk7XG59XG5cbmNvbnN0IFRFU1RWSUVXSUQgPSBcInRlc3RWaWV3SWRcIjtcblxuY29uc3QgYXBwbHlGbGV4Q2hhbmdlcyA9IGFzeW5jIGZ1bmN0aW9uIChmbGV4Q2hhbmdlczogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfSwgb01ldGFNb2RlbDogTWV0YU1vZGVsLCByZXN1bHRYTUw6IGFueSkge1xuXHQvLyBwcmVmaXggSWRzXG5cdFsuLi5yZXN1bHRYTUwucXVlcnlTZWxlY3RvckFsbChcIltpZF1cIildLmZvckVhY2goKG5vZGUpID0+IHtcblx0XHRub2RlLmlkID0gYCR7VEVTVFZJRVdJRH0tLSR7bm9kZS5pZH1gO1xuXHR9KTtcblx0Y29uc3QgY2hhbmdlcyA9IGNyZWF0ZUZsZXhpYmlsaXR5Q2hhbmdlc09iamVjdChURVNUVklFV0lELCBmbGV4Q2hhbmdlcyk7XG5cdGNvbnN0IGFwcElkID0gXCJzb21lQ29tcG9uZW50XCI7XG5cdGNvbnN0IG9NYW5pZmVzdCA9IHtcblx0XHRcInNhcC5hcHBcIjoge1xuXHRcdFx0aWQ6IGFwcElkLFxuXHRcdFx0dHlwZTogXCJhcHBsaWNhdGlvblwiLFxuXHRcdFx0Y3Jvc3NOYXZpZ2F0aW9uOiB7XG5cdFx0XHRcdG91dGJvdW5kczogW11cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGNvbnN0IG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCA9IHtcblx0XHRnZXREaWFnbm9zdGljczogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShnZXRGYWtlRGlhZ25vc3RpY3MoKSksXG5cdFx0Z2V0TW9kZWw6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe1xuXHRcdFx0Z2V0TWV0YU1vZGVsOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG9NZXRhTW9kZWwpXG5cdFx0fSksXG5cdFx0Z2V0Q29tcG9uZW50RGF0YTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7fSksXG5cdFx0Z2V0TWFuaWZlc3RPYmplY3Q6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe1xuXHRcdFx0Z2V0RW50cnk6IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIChvTWFuaWZlc3QgYXMgYW55KVtuYW1lXTtcblx0XHRcdH1cblx0XHR9KSxcblx0XHRnZXRMb2NhbElkOiBqZXN0LmZuKChzSWQpID0+IHNJZClcblx0fSBhcyB1bmtub3duIGFzIEFwcENvbXBvbmVudDtcblx0Ly9mYWtlIGNoYW5nZXNcblx0amVzdC5zcHlPbihBcHBTdG9yYWdlLCBcImxvYWRGbGV4RGF0YVwiKS5tb2NrUmV0dXJuVmFsdWUoUHJvbWlzZS5yZXNvbHZlKGNoYW5nZXMpKTtcblx0amVzdC5zcHlPbihMb2FkZXIsIFwibG9hZEZsZXhEYXRhXCIpLm1vY2tSZXR1cm5WYWx1ZShQcm9taXNlLnJlc29sdmUoY2hhbmdlcykpO1xuXG5cdGplc3Quc3B5T24oQ29tcG9uZW50IGFzIHVua25vd24gYXMgeyBnZXRDb21wb25lbnRCeUlkOiAoKSA9PiBBcHBDb21wb25lbnQgfSwgXCJnZXRDb21wb25lbnRCeUlkXCIpLm1vY2tSZXR1cm5WYWx1ZShvQXBwQ29tcG9uZW50KTtcblx0amVzdC5zcHlPbihVdGlscywgXCJnZXRBcHBDb21wb25lbnRGb3JDb250cm9sXCIpLm1vY2tSZXR1cm5WYWx1ZShvQXBwQ29tcG9uZW50KTtcblx0YXdhaXQgRmxleFN0YXRlLmluaXRpYWxpemUoe1xuXHRcdGNvbXBvbmVudElkOiBhcHBJZFxuXHR9KTtcblx0cmVzdWx0WE1MID0gYXdhaXQgWG1sUHJlcHJvY2Vzc29yLnByb2Nlc3MocmVzdWx0WE1MLCB7IG5hbWU6IFwiVGVzdCBGcmFnbWVudFwiLCBjb21wb25lbnRJZDogYXBwSWQsIGlkOiBURVNUVklFV0lEIH0pO1xuXG5cdC8vQXNzZXJ0IHRoYXQgYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIGFwcGxpZWRcblx0Y29uc3QgY2hhbmdlc0FwcGxpZWQgPSBnZXRDaGFuZ2VzRnJvbVhNTChyZXN1bHRYTUwpO1xuXHRleHBlY3QoY2hhbmdlc0FwcGxpZWQubGVuZ3RoKS50b0JlKGZsZXhDaGFuZ2VzPy5jaGFuZ2VzPy5sZW5ndGggPz8gMCArIGZsZXhDaGFuZ2VzPy52YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXM/Lmxlbmd0aCA/PyAwKTtcblx0cmV0dXJuIHJlc3VsdFhNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDaGFuZ2VzRnJvbVhNTCA9ICh4bWw6IGFueSkgPT5cblx0Wy4uLnhtbC5xdWVyeVNlbGVjdG9yQWxsKFwiKlwiKV1cblx0XHQuZmxhdE1hcCgoZSkgPT4gWy4uLmUuYXR0cmlidXRlc10ubWFwKChhKSA9PiBhLm5hbWUpKVxuXHRcdC5maWx0ZXIoKGF0dHIpID0+IGF0dHIuaW5jbHVkZXMoXCJzYXAudWkuZmwuYXBwbGllZENoYW5nZXNcIikpO1xuXG5leHBvcnQgY29uc3QgZ2V0VGVtcGxhdGluZ1Jlc3VsdCA9IGFzeW5jIGZ1bmN0aW9uIChcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IGFueTsgZW50aXR5U2V0Pzogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuXHRmbGV4Q2hhbmdlcz86IHsgW3g6IHN0cmluZ106IG9iamVjdFtdIH0sXG5cdGZha2VTaWRlRWZmZWN0U2VydmljZT86IHVua25vd25cbikge1xuXHRpZiAoIW1Nb2RlbHNbXCJzYXAuZmUuaTE4blwiXSkge1xuXHRcdG1Nb2RlbHNbXCJzYXAuZmUuaTE4blwiXSA9IGNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsKCk7XG5cdH1cblxuXHRjb25zdCB0ZW1wbGF0ZWRYbWwgPSBgPHJvb3Q+JHt4bWxJbnB1dH08L3Jvb3Q+YDtcblx0Y29uc3QgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblx0Y29uc3QgeG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0ZW1wbGF0ZWRYbWwsIFwidGV4dC94bWxcIik7XG5cdC8vIFRvIGVuc3VyZSBvdXIgbWFjcm8gY2FuIHVzZSAjc2V0QmluZGluZ0NvbnRleHQgd2UgZW5zdXJlIHRoZXJlIGlzIGEgcHJlIGV4aXN0aW5nIEpTT05Nb2RlbCBmb3IgY29udmVydGVyQ29udGV4dFxuXHQvLyBpZiBub3QgYWxyZWFkeSBwYXNzZWQgdG8gdGVoIHRlbXBsYXRpbmdcblxuXHRjb25zdCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSBhd2FpdCBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMsIGZha2VTaWRlRWZmZWN0U2VydmljZSk7XG5cblx0Ly9UaGlzIGNvbnRleHQgZm9yIG1hY3JvIHRlc3Rpbmdcblx0aWYgKG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdKSB7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tcInRoaXNcIl0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHRsZXQgcmVzdWx0WE1MID0gKGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKHhtbERvYy5maXJzdEVsZW1lbnRDaGlsZCEsIHsgbmFtZTogXCJUZXN0IEZyYWdtZW50XCIgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKSkgYXMgYW55O1xuXG5cdGlmIChzTWV0YWRhdGFVcmwgJiYgZmxleENoYW5nZXMpIHtcblx0XHQvLyBhcHBseSBmbGV4IGNoYW5nZXNcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdFx0cmVzdWx0WE1MID0gYXdhaXQgYXBwbHlGbGV4Q2hhbmdlcyhmbGV4Q2hhbmdlcywgb01ldGFNb2RlbCwgcmVzdWx0WE1MKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0WE1MO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRlZFhNTCA9IGFzeW5jIGZ1bmN0aW9uIChcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9LFxuXHRmYWtlU2lkZUVmZmVjdFNlcnZpY2U/OiB1bmtub3duXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRyZXR1cm4ganN4LmRlZmluZVhNTE5hbWVzcGFjZU1hcChyZXZlc2VOYW1lc3BhY2VNYXAsIGFzeW5jICgpID0+IHtcblx0XHRjb25zdCB0ZW1wbGF0ZWRYTUwgPSBhd2FpdCBnZXRUZW1wbGF0aW5nUmVzdWx0KFxuXHRcdFx0eG1sSW5wdXQsXG5cdFx0XHRzTWV0YWRhdGFVcmwsXG5cdFx0XHRtQmluZGluZ0NvbnRleHRzLFxuXHRcdFx0bU1vZGVscyxcblx0XHRcdGZsZXhDaGFuZ2VzLFxuXHRcdFx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlXG5cdFx0KTtcblx0XHRjb25zdCBzZXJpYWxpZWRYTUwgPSBzZXJpYWxpemVYTUwodGVtcGxhdGVkWE1MLCB1bmRlZmluZWQpO1xuXHRcdGV4cGVjdChzZXJpYWxpZWRYTUwpLm5vdC50b0hhdmVUZW1wbGF0aW5nRXJyb3JzKCk7XG5cdFx0cmV0dXJuIHNlcmlhbGllZFhNTDtcblx0fSkgYXMgdW5rbm93biBhcyBQcm9taXNlPHN0cmluZz47XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCB2aWV3IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHZpZXcgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHNNZXRhZGF0YVVybCBVcmwgb2YgdGhlIG1ldGFkYXRhLlxuICogQHBhcmFtIG1CaW5kaW5nQ29udGV4dHMgTWFwIG9mIHRoZSBiaW5kaW5nQ29udGV4dHMgdG8gc2V0IG9uIHRoZSBtb2RlbHMuXG4gKiBAcGFyYW0gbU1vZGVscyBNYXAgb2YgdGhlIG1vZGVscy5cbiAqIEBwYXJhbSBmbGV4Q2hhbmdlcyBPYmplY3Qgd2l0aCBVSSBjaGFuZ2VzIGxpa2UgJ2NoYW5nZXMnIG9yICd2YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMnXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgdmlldyBhcyBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NWaWV3KFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfVxuKTogUHJvbWlzZTxKZXN0VGVtcGxhdGVkVmlldz4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGNvbnN0IG9WaWV3RG9jdW1lbnQgPSBfbG9hZFJlc291cmNlVmlldyhuYW1lKTtcblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gYXdhaXQgX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3Moc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzKTtcblx0bGV0IG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3Mob1ZpZXdEb2N1bWVudCwgeyBuYW1lOiBuYW1lIH0sIG9QcmVwcm9jZXNzb3JTZXR0aW5ncyk7XG5cdGlmIChmbGV4Q2hhbmdlcykge1xuXHRcdG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgYXBwbHlGbGV4Q2hhbmdlcyhmbGV4Q2hhbmdlcyA/PyBbXSwgb01ldGFNb2RlbCwgb1ByZXByb2Nlc3NlZFZpZXcpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0YXNFbGVtZW50OiBvUHJlcHJvY2Vzc2VkVmlldyxcblx0XHRhc1N0cmluZzogZm9ybWF0WE1MKG9QcmVwcm9jZXNzZWRWaWV3Py5vdXRlckhUTUwgfHwgXCJcIilcblx0fTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgWE1MIGZyYWdtZW50IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGJlIHRlc3RlZC5cbiAqIEBwYXJhbSB0ZXN0RGF0YSBUZXN0IGRhdGEgY29uc2lzdGluZ1xuICogQHJldHVybnMgVGVtcGxhdGVkIGZyYWdtZW50IGFzIHN0cmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZyYWdtZW50KG5hbWU6IHN0cmluZywgdGVzdERhdGE6IHsgW21vZGVsOiBzdHJpbmddOiBvYmplY3QgfSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdGNvbnN0IGlucHV0WG1sID0gYDxyb290Pjxjb3JlOkZyYWdtZW50IGZyYWdtZW50TmFtZT1cIiR7bmFtZX1cIiB0eXBlPVwiWE1MXCIgeG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCIgLz48L3Jvb3Q+YDtcblx0Y29uc3QgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblxuXHRjb25zdCBpbnB1dERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaW5wdXRYbWwsIFwidGV4dC94bWxcIik7XG5cblx0Ly8gYnVpbGQgbW9kZWwgYW5kIGJpbmRpbmdzIGZvciBnaXZlbiB0ZXN0IGRhdGFcblx0Y29uc3Qgc2V0dGluZ3MgPSB7XG5cdFx0bW9kZWxzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWwgfSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IG9iamVjdCB9LFxuXHRcdGFwcENvbXBvbmVudDogeyBnZXRTaWRlRWZmZWN0c1NlcnZpY2U6IGplc3QuZm4oKSwgZ2V0RGlhZ25vc3RpY3M6ICgpID0+IHVuZGVmaW5lZCB9XG5cdH07XG5cdGZvciAoY29uc3QgbW9kZWwgaW4gdGVzdERhdGEpIHtcblx0XHRjb25zdCBqc29uTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0anNvbk1vZGVsLnNldERhdGEodGVzdERhdGFbbW9kZWxdKTtcblx0XHRzZXR0aW5ncy5tb2RlbHNbbW9kZWxdID0ganNvbk1vZGVsO1xuXHRcdHNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1ttb2RlbF0gPSBzZXR0aW5ncy5tb2RlbHNbbW9kZWxdLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0fVxuXHRzZXR0aW5ncy5hcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlLm1vY2tSZXR1cm5WYWx1ZShkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlKTtcblxuXHQvLyBleGVjdXRlIHRoZSBwcmUtcHJvY2Vzc29yXG5cdGNvbnN0IHJlc3VsdERvYyA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0RG9jLmZpcnN0RWxlbWVudENoaWxkLCB7IG5hbWUgfSwgc2V0dGluZ3MpO1xuXG5cdC8vIGV4Y2x1ZGUgbmVzdGVkIGZyYWdtZW50cyBmcm9tIHRlc3Qgc25hcHNob3RzXG5cdGNvbnN0IGZyYWdtZW50cyA9IHJlc3VsdERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvcmU6RnJhZ21lbnRcIikgYXMgYW55O1xuXHRpZiAoZnJhZ21lbnRzPy5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yIChjb25zdCBmcmFnbWVudCBvZiBmcmFnbWVudHMpIHtcblx0XHRcdGZyYWdtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0fVxuXHR9XG5cblx0Ly8gS2VlcCB0aGUgZnJhZ21lbnQgcmVzdWx0IGFzIGNoaWxkIG9mIHJvb3Qgbm9kZSB3aGVuIGZyYWdtZW50IGdlbmVyYXRlcyBtdWx0aXBsZSByb290IGNvbnRyb2xzXG5cdGNvbnN0IHhtbFJlc3VsdCA9IHJlc3VsdERvYy5jaGlsZHJlbi5sZW5ndGggPiAxID8gcmVzdWx0RG9jLm91dGVySFRNTCA6IHJlc3VsdERvYy5pbm5lckhUTUw7XG5cblx0cmV0dXJuIGZvcm1hdFhNTCh4bWxSZXN1bHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQ29udHJvbChjb250cm9sVG9TZXJpYWxpemU/OiBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdLCBzaG93Q3VzdG9tU3R5bGVDbGFzc2VzID0gZmFsc2UpIHtcblx0bGV0IHRhYkNvdW50ID0gMDtcblx0Y29uc3QgVUlEID0gL3VpZC0taWQtXFxkezEzfS1cXGR7MSwzfS87XG5cdGNvbnN0IENPTlRST0xJRCA9IC9pZC1cXGR7MTN9LVxcZHsxLDN9Lztcblx0ZnVuY3Rpb24gZ2V0VGFiKHRvQWRkID0gMCkge1xuXHRcdGxldCB0YWIgPSBcIlwiO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGFiQ291bnQgKyB0b0FkZDsgaSsrKSB7XG5cdFx0XHR0YWIgKz0gXCJcXHRcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRhYjtcblx0fVxuXHRjb25zdCBzZXJpYWxpemVEZWxlZ2F0ZSA9IHtcblx0XHRzdGFydDogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSwgc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRsZXQgY29udHJvbERldGFpbCA9IFwiXCI7XG5cdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZSkge1xuXHRcdFx0XHRpZiAoY29udHJvbC5nZXRQYXJlbnQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4SW5QYXJlbnQgPSAoY29udHJvbC5nZXRQYXJlbnQoKS5nZXRBZ2dyZWdhdGlvbihzQWdncmVnYXRpb25OYW1lKSBhcyBNYW5hZ2VkT2JqZWN0W10pPy5pbmRleE9mPy4oY29udHJvbCk7XG5cdFx0XHRcdFx0aWYgKGluZGV4SW5QYXJlbnQgPiAwKSB7XG5cdFx0XHRcdFx0XHRjb250cm9sRGV0YWlsICs9IGAsXFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29udHJvbERldGFpbCArPSBgJHtjb250cm9sLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfShgO1xuXHRcdFx0cmV0dXJuIGNvbnRyb2xEZXRhaWw7XG5cdFx0fSxcblx0XHRlbmQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBcIn0pXCI7XG5cdFx0fSxcblx0XHRtaWRkbGU6IGZ1bmN0aW9uIChjb250cm9sOiBhbnkpIHtcblx0XHRcdGxldCBpZCA9IGNvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdGlkID0gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiID8gaWQ/LnJlcGxhY2U/LihDT05UUk9MSUQsIFwiaWRcIikgOiBpZDtcblx0XHRcdGxldCBkYXRhID0gYHtpZDogJHtNYW5hZ2VkT2JqZWN0TWV0YWRhdGEuaXNHZW5lcmF0ZWRJZChpZCkgPyBcIl9fZHluYW1pY0lkXCIgOiBpZH1gO1xuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1Qcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1Qcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGxldCBwcm9wZXJ0eVZhbHVlID0gY29udHJvbC5tUHJvcGVydGllc1tvQ29udHJvbEtleV07XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlID09PSBcInN0cmluZ1wiID8gcHJvcGVydHlWYWx1ZT8ucmVwbGFjZT8uKFVJRCwgXCJ1aWQtLWlkXCIpIDogcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwic3RyaW5nXCIgPyBwcm9wZXJ0eVZhbHVlPy5yZXBsYWNlPy4oQ09OVFJPTElELCBcImlkXCIpIDogcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeShwcm9wZXJ0eVZhbHVlKSA6IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAke3Byb3BlcnR5VmFsdWV9YDtcblx0XHRcdFx0fSBlbHNlIGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3MuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYmluZGluZ0RldGFpbCA9IGNvbnRyb2wubUJpbmRpbmdJbmZvc1tvQ29udHJvbEtleV07XG5cdFx0XHRcdFx0aWYgKGJpbmRpbmdEZXRhaWwudHlwZT8ub091dHB1dEZvcm1hdCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGJpbmRpbmdEZXRhaWwudHlwZS5vT3V0cHV0Rm9ybWF0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06ICR7SlNPTi5zdHJpbmdpZnkoYmluZGluZ0RldGFpbCl9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1Bc3NvY2lhdGlvbnMpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubUFzc29jaWF0aW9ucy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRsZXQgYXNzb2NpYXRpb25WYWx1ZSA9IGNvbnRyb2wubUFzc29jaWF0aW9uc1tvQ29udHJvbEtleV07XG5cdFx0XHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KGFzc29jaWF0aW9uVmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRhc3NvY2lhdGlvblZhbHVlID0gW2Fzc29jaWF0aW9uVmFsdWVdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhc3NvY2lhdGlvblZhbHVlID0gYXNzb2NpYXRpb25WYWx1ZS5tYXAoKGFzc29jaWF0aW9uVmFsdWVFbGVtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0eXBlb2YgYXNzb2NpYXRpb25WYWx1ZUVsZW1lbnQgPT09IFwic3RyaW5nXCJcblx0XHRcdFx0XHRcdFx0PyBhc3NvY2lhdGlvblZhbHVlRWxlbWVudD8ucmVwbGFjZT8uKENPTlRST0xJRCwgXCJpZFwiKVxuXHRcdFx0XHRcdFx0XHQ6IGFzc29jaWF0aW9uVmFsdWVFbGVtZW50O1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAkeyhhc3NvY2lhdGlvblZhbHVlPy5qb2luPy4oXCIsXCIpID8/IGFzc29jaWF0aW9uVmFsdWUpIHx8IHVuZGVmaW5lZH1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2hvd0N1c3RvbVN0eWxlQ2xhc3NlcyAmJiBjb250cm9sLmFDdXN0b21TdHlsZUNsYXNzZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9IGN1c3RvbVN0eWxlQ2xhc3NlcyA6ICR7Y29udHJvbC5hQ3VzdG9tU3R5bGVDbGFzc2VzLmpvaW4oXCIsIFwiKX1gO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1FdmVudFJlZ2lzdHJ5KSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1FdmVudFJlZ2lzdHJ5Lmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogdHJ1ZWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGRhdGEgKz0gYGA7XG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9LFxuXHRcdHN0YXJ0QWdncmVnYXRpb246IGZ1bmN0aW9uIChjb250cm9sOiB7IG1CaW5kaW5nSW5mb3M6IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0aW9uQmluZGluZ0luZm8+IH0sIHNOYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBvdXQgPSBgLFxcbiR7Z2V0VGFiKCl9JHtzTmFtZX1gO1xuXHRcdFx0dGFiQ291bnQrKztcblxuXHRcdFx0aWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0pIHtcblx0XHRcdFx0b3V0ICs9IGA9eyBwYXRoOicke2NvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0ucGF0aH0nLCB0ZW1wbGF0ZTpcXG4ke2dldFRhYigpfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXQgKz0gYD1bXFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG91dDtcblx0XHR9LFxuXHRcdGVuZEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHR0YWJDb3VudC0tO1xuXHRcdFx0aWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0pIHtcblx0XHRcdFx0cmV0dXJuIGBcXG4ke2dldFRhYigpfX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGBcXG4ke2dldFRhYigpfV1gO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKEFycmF5LmlzQXJyYXkoY29udHJvbFRvU2VyaWFsaXplKSkge1xuXHRcdHJldHVybiBjb250cm9sVG9TZXJpYWxpemUubWFwKChjb250cm9sVG9SZW5kZXI6IFVJNUVsZW1lbnQpID0+IHtcblx0XHRcdHJldHVybiBuZXcgU2VyaWFsaXplcihjb250cm9sVG9SZW5kZXIsIHNlcmlhbGl6ZURlbGVnYXRlKS5zZXJpYWxpemUoKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbmV3IFNlcmlhbGl6ZXIoY29udHJvbFRvU2VyaWFsaXplLCBzZXJpYWxpemVEZWxlZ2F0ZSkuc2VyaWFsaXplKCk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF3YWl0ZXIoKSB7XG5cdGxldCBmblJlc29sdmUhOiBGdW5jdGlvbjtcblx0Y29uc3QgbXlQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRmblJlc29sdmUgPSByZXNvbHZlO1xuXHR9KTtcblx0cmV0dXJuIHsgcHJvbWlzZTogbXlQcm9taXNlLCByZXNvbHZlOiBmblJlc29sdmUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckJ1aWxkaW5nQmxvY2tXaXRoTW9kZWxzKGJ1aWxkaW5nQmxvY2s6IHsgZ2V0Q29udGVudDogRnVuY3Rpb24gfSwgbW9kZWxzOiB7IFtrZXk6IHN0cmluZ106IE1vZGVsIH0pOiBDb250cm9sIHtcblx0cmV0dXJuIChNYW5hZ2VkT2JqZWN0IGFzIE1hbmFnZWRPYmplY3RFeCkucnVuV2l0aFByZXByb2Nlc3NvcnMoXG5cdFx0KCkgPT4ge1xuXHRcdFx0cmV0dXJuIGJ1aWxkaW5nQmxvY2suZ2V0Q29udGVudCgpO1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0c2V0dGluZ3M6IGZ1bmN0aW9uIChjb250cm9sU2V0dGluZ3M6IHsgbW9kZWxzOiB1bmtub3duIH0pIHtcblx0XHRcdFx0Y29udHJvbFNldHRpbmdzLm1vZGVscyA9IG1vZGVscztcblx0XHRcdFx0cmV0dXJuIGNvbnRyb2xTZXR0aW5ncztcblx0XHRcdH1cblx0XHR9XG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1vY2tGcmFnbWVudHMoLi4uZnJhZ21lbnRzOiBNb2NrRnJhZ21lbnRbXSk6IGplc3QuU3B5SW5zdGFuY2Uge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRjb25zdCBvcmlnaW5hbExvYWRUZW1wbGF0ZSA9IChYTUxUZW1wbGF0ZVByb2Nlc3NvciBhcyBhbnkpLmxvYWRUZW1wbGF0ZVByb21pc2U7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdGNvbnN0IGxvYWRUZW1wbGF0ZVN0dWIgPSBqZXN0LnNweU9uKFhNTFRlbXBsYXRlUHJvY2Vzc29yIGFzIGFueSwgXCJsb2FkVGVtcGxhdGVQcm9taXNlXCIpO1xuXHRsb2FkVGVtcGxhdGVTdHViLm1vY2tJbXBsZW1lbnRhdGlvbigoKHRlbXBsYXRlTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZykgPT4ge1xuXHRcdGZvciAoY29uc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7XG5cdFx0XHRpZiAoZnJhZ21lbnQubmFtZSA9PT0gdGVtcGxhdGVOYW1lKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZVhNTFN0cmluZyhmcmFnbWVudC5jb250ZW50KVswXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9yaWdpbmFsTG9hZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgZXh0ZW5zaW9uKTtcblx0fSkgYXMgKCgpID0+IEVsZW1lbnQpIHwgdW5kZWZpbmVkKTtcblx0cmV0dXJuIGxvYWRUZW1wbGF0ZVN0dWI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBhcHBDb21wb25lbnQgYW5kIHRlbXBsYXRlQ29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBvcHRpb25zLmNkc0ZpbGUgVGhlIHBhdGggdG8gdGhlIENEUyBmaWxlIHRvIHVzZSBmb3IgdGhlIGFwcENvbXBvbmVudFxuICogQHBhcmFtIG9wdGlvbnMubWFpbkNvbnRleHRQYXRoIFRoZSBtYWluIGNvbnRleHQgcGF0aCB0byB1c2UgZm9yIHRoZSBhcHBDb21wb25lbnRcbiAqIEBwYXJhbSBvcHRpb25zLnBhZ2VDb250ZW50IFRoZSBwYWdlIGNvbnRlbnQgdG8gdXNlIGZvciB0aGUgYXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gb3B0aW9ucy5jb250ZW50IFRoZSBjb250ZW50IHRvIHVzZSBmb3IgdGhlIGFwcCBDb21wb25lbnRcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGFwcENvbXBvbmVudFxuICogQHBhcmFtIHZpZXdMZXZlbCBUaGUgdmlldyBsZXZlbCB0byB1c2UgZm9yIHRoZSBhcHBDb21wb25lbnRcbiAqIEByZXR1cm5zIFRoZSBhcHBjb21wb25lbnQgYW5kIHRlbXBsYXRlQ29tcG9uZW50IHRvIHVzZSBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcENvbXBvbmVudChcblx0b3B0aW9ucz86IHtcblx0XHRjZHNGaWxlPzogc3RyaW5nO1xuXHRcdGNvbXBvbmVudElkPzogc3RyaW5nO1xuXHRcdG1haW5Db250ZXh0UGF0aD86IHN0cmluZztcblx0XHRwYWdlQ29udGVudD86IEZ1bmN0aW9uO1xuXHRcdGNvbnRlbnQ/OiB7fTtcblx0fSxcblx0bmFtZT86IHN0cmluZyxcblx0dmlld0xldmVsPzogbnVtYmVyXG4pOiBQcm9taXNlPHsgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7IHRlbXBsYXRlQ29tcG9uZW50OiBUZW1wbGF0ZUNvbXBvbmVudCB9PiB7XG5cdGxldCBjZHNGaWxlID0gb3B0aW9ucz8uY2RzRmlsZTtcblx0aWYgKCFjZHNGaWxlKSB7XG5cdFx0Y2RzRmlsZSA9IGNvbXBpbGVDRFMocGF0aC5qb2luKF9fZGlybmFtZSwgXCIuL2RhdGEvUHJvZHVjdHMuY2RzXCIpKTtcblx0fVxuXHRjb25zdCBndWlkID0gdWlkKCk7XG5cdGNvbnN0IGlkID0gb3B0aW9ucz8uY29tcG9uZW50SWQgPz8gYHNhcC5mZS50ZXN0LiR7Z3VpZH1gO1xuXHRjb25zdCBjZHNDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGNkc0ZpbGUpLnRvU3RyaW5nKCk7XG5cdHNhcC5qZXN0LnJlZ2lzdGVyRmFrZUZyYWdtZW50KGAvc2FwL2ZlL2NvcmUvbW9jay8ke2d1aWR9LyRtZXRhZGF0YT9zYXAtbGFuZ3VhZ2U9RU5gLCBjZHNDb250ZW50KTtcblxuXHRzYXAudWkuZGVmaW5lKGBzYXAvZmUvdGVzdC8ke2d1aWR9L0NvbXBvbmVudGAsIFtcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiXSwgZnVuY3Rpb24gKF9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRcdFwidXNlIHN0cmljdFwiO1xuXG5cdFx0cmV0dXJuIEFwcENvbXBvbmVudC5leHRlbmQoYHNhcC5mZS50ZXN0LiR7Z3VpZH0uQ29tcG9uZW50YCwge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0bWFuaWZlc3Q6IHtcblx0XHRcdFx0XHRcInNhcC5hcHBcIjoge1xuXHRcdFx0XHRcdFx0ZGF0YVNvdXJjZXM6IHtcblx0XHRcdFx0XHRcdFx0bWFpblNlcnZpY2U6IHtcblx0XHRcdFx0XHRcdFx0XHR1cmk6IGAvc2FwL2ZlL2NvcmUvbW9jay8ke2d1aWR9L2AsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJPRGF0YVwiLFxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvZGF0YVZlcnNpb246IFwiNC4wXCJcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwic2FwLnVpNVwiOiB7XG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0XCJcIjoge1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFTb3VyY2U6IFwibWFpblNlcnZpY2VcIixcblx0XHRcdFx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0c3luY2hyb25pemF0aW9uTW9kZTogXCJOb25lXCJcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRyb3V0aW5nOiB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldHM6IHtcblx0XHRcdFx0XHRcdFx0XHREZWZhdWx0OiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcIkNvbXBvbmVudFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogbmFtZSA/PyBcInNhcC5mZS5jb3JlLmZwbVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0aWQ6IFwiRGVmYXVsdFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmlld0xldmVsOiB2aWV3TGV2ZWwsXG5cdFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9wdGlvbnM/Lm1haW5Db250ZXh0UGF0aCA/PyBcIi9Qcm9kdWN0c1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZpZXdUeXBlOiBcIkpTWFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZpZXdDb250ZW50OiBvcHRpb25zPy5wYWdlQ29udGVudCA/PyAoKCkgPT4gPFBhZ2U+PC9QYWdlPiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudDogb3B0aW9ucz8uY29udGVudFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRyb3V0ZXM6IFtcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiBcIjo/cXVlcnk6XCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRuYW1lOiBcIkRlZmF1bHRcIixcblx0XHRcdFx0XHRcdFx0XHRcdHRhcmdldDogXCJEZWZhdWx0XCJcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG5cdGNvbnN0IG1vY2tBcHBDb21wb25lbnQgPSAoYXdhaXQgQ29tcG9uZW50LmNyZWF0ZSh7IG5hbWU6IGBzYXAuZmUudGVzdC4ke2d1aWR9YCwgaWQ6IGlkIH0pKSBhcyBBcHBDb21wb25lbnQ7XG5cblx0YXdhaXQgbW9ja0FwcENvbXBvbmVudC5pbml0aWFsaXplZDtcblx0Y29uc3QgdiA9IGF3YWl0IChtb2NrQXBwQ29tcG9uZW50LmdldFJvdXRlcigpLmdldFRhcmdldChcIkRlZmF1bHRcIikgYXMgeyBsb2FkPzogRnVuY3Rpb24gfSkubG9hZD8uKCk7XG5cdHJldHVybiB7IGFwcENvbXBvbmVudDogbW9ja0FwcENvbXBvbmVudCwgdGVtcGxhdGVDb21wb25lbnQ6IHYub2JqZWN0IH07XG59XG5cbi8qKlxuICogRmluZCBhbiBlbGVtZW50IGluIGEgY29sbGVjdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSBjb2xsZWN0aW9uXG4gKiBAcGFyYW0gc2VsZWN0b3JcbiAqIEByZXR1cm5zIFRoZSBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3Igb3IgdW5kZWZpbmVkIGlmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFbGVtZW50KGNvbGxlY3Rpb246IEhUTUxDb2xsZWN0aW9uLCBzZWxlY3RvcjogKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBib29sZWFuKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBlbGVtZW50ID0gY29sbGVjdGlvbi5pdGVtKGkpIGFzIEhUTUxFbGVtZW50O1xuXHRcdGlmIChzZWxlY3RvcihlbGVtZW50KSkge1xuXHRcdFx0cmV0dXJuIGVsZW1lbnQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0VBcUVBQSxHQUFHLENBQUNDLFFBQVEsQ0FBQyxDQUFDLEVBQVMsa0NBQWtDLENBQUM7RUFDMURDLElBQUksQ0FBQ0MsVUFBVSxDQUFDLEtBQUssQ0FBQztFQUV0QixNQUFNQyxZQUFvQyxHQUFHO0lBQzVDQyxLQUFLLEVBQUUsZUFBZTtJQUN0QkMsTUFBTSxFQUFFLGVBQWU7SUFDdkJDLElBQUksRUFBRSx1Q0FBdUM7SUFDN0NDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakNDLFNBQVMsRUFBRSxrRUFBa0U7SUFDN0VDLEdBQUcsRUFBRSxrRUFBa0U7SUFDdkVDLE9BQU8sRUFBRSxzQkFBc0I7SUFDL0JDLFFBQVEsRUFBRSx3QkFBd0I7SUFDbENDLElBQUksRUFBRSxhQUFhO0lBQ25CQyxFQUFFLEVBQUUsV0FBVztJQUNmQyxDQUFDLEVBQUUsT0FBTztJQUNWQyxDQUFDLEVBQUUsb0JBQW9CO0lBQ3ZCQyxFQUFFLEVBQUUsV0FBVztJQUNmQyxhQUFhLEVBQUUsd0JBQXdCO0lBQ3ZDQyxHQUFHLEVBQUUsWUFBWTtJQUNqQkMsS0FBSyxFQUFFLDBCQUEwQjtJQUNqQ0MsUUFBUSxFQUFFLGtCQUFrQjtJQUM1QkMsUUFBUSxFQUFFLGtCQUFrQjtJQUM1QkMsQ0FBQyxFQUFFLGdCQUFnQjtJQUNuQkMsZUFBZSxF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
|
|
@@ -8,6 +8,7 @@ import Log from "sap/base/Log";
|
|
|
8
8
|
import LoaderExtensions from "sap/base/util/LoaderExtensions";
|
|
9
9
|
import merge from "sap/base/util/merge";
|
|
10
10
|
import uid from "sap/base/util/uid";
|
|
11
|
+
import jsx from "sap/fe/base/jsx-runtime/jsx";
|
|
11
12
|
import AppComponent from "sap/fe/core/AppComponent";
|
|
12
13
|
import type TemplateComponent from "sap/fe/core/TemplateComponent";
|
|
13
14
|
import TemplateModel from "sap/fe/core/TemplateModel";
|
|
@@ -17,7 +18,6 @@ import type { ListReportManifestSettings, ObjectPageManifestSettings } from "sap
|
|
|
17
18
|
import { convertTypes, getInvolvedDataModelObjects } from "sap/fe/core/converters/MetaModelConverter";
|
|
18
19
|
import type { IDiagnostics, PageContextPathTarget } from "sap/fe/core/converters/TemplateConverter";
|
|
19
20
|
import type { IssueCategory, IssueSeverity } from "sap/fe/core/converters/helpers/IssueManager";
|
|
20
|
-
import jsx from "sap/fe/core/jsx-runtime/jsx";
|
|
21
21
|
import type { SideEffectsService } from "sap/fe/core/services/SideEffectsServiceFactory";
|
|
22
22
|
import SideEffectsFactory from "sap/fe/core/services/SideEffectsServiceFactory";
|
|
23
23
|
import type { DataModelObjectPath } from "sap/fe/core/templating/DataModelPathHelper";
|
|
@@ -92,7 +92,9 @@ const nameSpaceMap: Record<string, string> = {
|
|
|
92
92
|
u: "sap.ui.unified",
|
|
93
93
|
macroMicroChart: "sap.fe.macros.microchart",
|
|
94
94
|
microChart: "sap.suite.ui.microchart",
|
|
95
|
-
macroTable: "sap.fe.macros.table"
|
|
95
|
+
macroTable: "sap.fe.macros.table",
|
|
96
|
+
mdcvc: "sap.ui.mdc.valuehelp.content",
|
|
97
|
+
mdcv: "sap.ui.mdc.valuehelp"
|
|
96
98
|
};
|
|
97
99
|
const reveseNamespaceMap = Object.keys(nameSpaceMap).reduce((reverseMap: Record<string, string>, currentName) => {
|
|
98
100
|
reverseMap[nameSpaceMap[currentName]] = currentName;
|
|
@@ -691,6 +693,7 @@ export async function processView(
|
|
|
691
693
|
export async function processFragment(name: string, testData: { [model: string]: object }): Promise<string> {
|
|
692
694
|
const inputXml = `<root><core:Fragment fragmentName="${name}" type="XML" xmlns:core="sap.ui.core" /></root>`;
|
|
693
695
|
const parser = new window.DOMParser();
|
|
696
|
+
|
|
694
697
|
const inputDoc = parser.parseFromString(inputXml, "text/xml");
|
|
695
698
|
|
|
696
699
|
// build model and bindings for given test data
|
|
@@ -724,8 +727,10 @@ export async function processFragment(name: string, testData: { [model: string]:
|
|
|
724
727
|
return formatXML(xmlResult);
|
|
725
728
|
}
|
|
726
729
|
|
|
727
|
-
export function serializeControl(controlToSerialize?: UI5Element | UI5Element[]) {
|
|
730
|
+
export function serializeControl(controlToSerialize?: UI5Element | UI5Element[], showCustomStyleClasses = false) {
|
|
728
731
|
let tabCount = 0;
|
|
732
|
+
const UID = /uid--id-\d{13}-\d{1,3}/;
|
|
733
|
+
const CONTROLID = /id-\d{13}-\d{1,3}/;
|
|
729
734
|
function getTab(toAdd = 0) {
|
|
730
735
|
let tab = "";
|
|
731
736
|
for (let i = 0; i < tabCount + toAdd; i++) {
|
|
@@ -751,26 +756,45 @@ export function serializeControl(controlToSerialize?: UI5Element | UI5Element[])
|
|
|
751
756
|
return "})";
|
|
752
757
|
},
|
|
753
758
|
middle: function (control: any) {
|
|
754
|
-
|
|
759
|
+
let id = control.getId();
|
|
760
|
+
id = typeof id === "string" ? id?.replace?.(CONTROLID, "id") : id;
|
|
755
761
|
let data = `{id: ${ManagedObjectMetadata.isGeneratedId(id) ? "__dynamicId" : id}`;
|
|
756
762
|
for (const oControlKey in control.mProperties) {
|
|
757
763
|
if (control.mProperties.hasOwnProperty(oControlKey)) {
|
|
758
|
-
|
|
764
|
+
let propertyValue = control.mProperties[oControlKey];
|
|
765
|
+
propertyValue = typeof propertyValue === "string" ? propertyValue?.replace?.(UID, "uid--id") : propertyValue;
|
|
766
|
+
propertyValue = typeof propertyValue === "string" ? propertyValue?.replace?.(CONTROLID, "id") : propertyValue;
|
|
767
|
+
propertyValue = typeof propertyValue === "object" ? JSON.stringify(propertyValue) : propertyValue;
|
|
768
|
+
data += `,\n${getTab()} ${oControlKey}: ${propertyValue}`;
|
|
759
769
|
} else if (control.mBindingInfos.hasOwnProperty(oControlKey)) {
|
|
760
770
|
const bindingDetail = control.mBindingInfos[oControlKey];
|
|
771
|
+
if (bindingDetail.type?.oOutputFormat) {
|
|
772
|
+
delete bindingDetail.type.oOutputFormat;
|
|
773
|
+
}
|
|
761
774
|
data += `,\n${getTab()} ${oControlKey}: ${JSON.stringify(bindingDetail)}`;
|
|
762
775
|
}
|
|
763
776
|
}
|
|
764
777
|
for (const oControlKey in control.mAssociations) {
|
|
765
778
|
if (control.mAssociations.hasOwnProperty(oControlKey)) {
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
779
|
+
let associationValue = control.mAssociations[oControlKey];
|
|
780
|
+
if (!Array.isArray(associationValue)) {
|
|
781
|
+
associationValue = [associationValue];
|
|
782
|
+
}
|
|
783
|
+
associationValue = associationValue.map((associationValueElement: string) => {
|
|
784
|
+
return typeof associationValueElement === "string"
|
|
785
|
+
? associationValueElement?.replace?.(CONTROLID, "id")
|
|
786
|
+
: associationValueElement;
|
|
787
|
+
});
|
|
788
|
+
|
|
789
|
+
data += `,\n${getTab()} ${oControlKey}: ${(associationValue?.join?.(",") ?? associationValue) || undefined}`;
|
|
769
790
|
}
|
|
770
791
|
}
|
|
792
|
+
if (showCustomStyleClasses && control.aCustomStyleClasses?.length > 0) {
|
|
793
|
+
data += `,\n${getTab()} customStyleClasses : ${control.aCustomStyleClasses.join(", ")}`;
|
|
794
|
+
}
|
|
771
795
|
for (const oControlKey in control.mEventRegistry) {
|
|
772
796
|
if (control.mEventRegistry.hasOwnProperty(oControlKey)) {
|
|
773
|
-
data += `,\n${getTab()} ${oControlKey}: true
|
|
797
|
+
data += `,\n${getTab()} ${oControlKey}: true`;
|
|
774
798
|
}
|
|
775
799
|
}
|
|
776
800
|
data += ``;
|
|
@@ -850,18 +874,28 @@ export function registerMockFragments(...fragments: MockFragment[]): jest.SpyIns
|
|
|
850
874
|
* @param options.cdsFile The path to the CDS file to use for the appComponent
|
|
851
875
|
* @param options.mainContextPath The main context path to use for the appComponent
|
|
852
876
|
* @param options.pageContent The page content to use for the appComponent
|
|
877
|
+
* @param options.content The content to use for the app Component
|
|
878
|
+
* @param name The name to use for the appComponent
|
|
879
|
+
* @param viewLevel The view level to use for the appComponent
|
|
853
880
|
* @returns The appcomponent and templateComponent to use for testing
|
|
854
881
|
*/
|
|
855
|
-
export async function initializeAppComponent(
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
882
|
+
export async function initializeAppComponent(
|
|
883
|
+
options?: {
|
|
884
|
+
cdsFile?: string;
|
|
885
|
+
componentId?: string;
|
|
886
|
+
mainContextPath?: string;
|
|
887
|
+
pageContent?: Function;
|
|
888
|
+
content?: {};
|
|
889
|
+
},
|
|
890
|
+
name?: string,
|
|
891
|
+
viewLevel?: number
|
|
892
|
+
): Promise<{ appComponent: AppComponent; templateComponent: TemplateComponent }> {
|
|
860
893
|
let cdsFile = options?.cdsFile;
|
|
861
894
|
if (!cdsFile) {
|
|
862
895
|
cdsFile = compileCDS(path.join(__dirname, "./data/Products.cds"));
|
|
863
896
|
}
|
|
864
897
|
const guid = uid();
|
|
898
|
+
const id = options?.componentId ?? `sap.fe.test.${guid}`;
|
|
865
899
|
const cdsContent = fs.readFileSync(cdsFile).toString();
|
|
866
900
|
sap.jest.registerFakeFragment(`/sap/fe/core/mock/${guid}/$metadata?sap-language=EN`, cdsContent);
|
|
867
901
|
|
|
@@ -895,13 +929,15 @@ export async function initializeAppComponent(options?: {
|
|
|
895
929
|
targets: {
|
|
896
930
|
Default: {
|
|
897
931
|
type: "Component",
|
|
898
|
-
name: "sap.fe.core.fpm",
|
|
932
|
+
name: name ?? "sap.fe.core.fpm",
|
|
899
933
|
id: "Default",
|
|
934
|
+
viewLevel: viewLevel,
|
|
900
935
|
options: {
|
|
901
936
|
settings: {
|
|
902
937
|
contextPath: options?.mainContextPath ?? "/Products",
|
|
903
938
|
viewType: "JSX",
|
|
904
|
-
viewContent: options?.pageContent ?? (() => <Page></Page>)
|
|
939
|
+
viewContent: options?.pageContent ?? (() => <Page></Page>),
|
|
940
|
+
content: options?.content
|
|
905
941
|
}
|
|
906
942
|
}
|
|
907
943
|
}
|
|
@@ -919,9 +955,26 @@ export async function initializeAppComponent(options?: {
|
|
|
919
955
|
}
|
|
920
956
|
});
|
|
921
957
|
});
|
|
922
|
-
const mockAppComponent = (await Component.create({ name: `sap.fe.test.${guid}
|
|
958
|
+
const mockAppComponent = (await Component.create({ name: `sap.fe.test.${guid}`, id: id })) as AppComponent;
|
|
923
959
|
|
|
924
960
|
await mockAppComponent.initialized;
|
|
925
961
|
const v = await (mockAppComponent.getRouter().getTarget("Default") as { load?: Function }).load?.();
|
|
926
962
|
return { appComponent: mockAppComponent, templateComponent: v.object };
|
|
927
963
|
}
|
|
964
|
+
|
|
965
|
+
/**
|
|
966
|
+
* Find an element in a collection that matches the given selector.
|
|
967
|
+
*
|
|
968
|
+
* @param collection
|
|
969
|
+
* @param selector
|
|
970
|
+
* @returns The element that matches the selector or undefined if no element matches the selector
|
|
971
|
+
*/
|
|
972
|
+
export function findElement(collection: HTMLCollection, selector: (element: HTMLElement) => boolean): HTMLElement | undefined {
|
|
973
|
+
for (let i = 0; i < collection.length; i++) {
|
|
974
|
+
const element = collection.item(i) as HTMLElement;
|
|
975
|
+
if (selector(element)) {
|
|
976
|
+
return element;
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
return undefined;
|
|
980
|
+
}
|
|
@@ -175,7 +175,7 @@ sap.ui.define(
|
|
|
175
175
|
OPHeaderId = "fe::HeaderFacet",
|
|
176
176
|
OPHeaderContentId = "fe::ObjectPage-OPHeaderContent",
|
|
177
177
|
OPHeaderContentContainerId = ViewId + "--fe::HeaderContentContainer",
|
|
178
|
-
OPFooterId = "fe::FooterBar",
|
|
178
|
+
OPFooterId = "fe::FooterBar::_fc",
|
|
179
179
|
OPSectionIdPrefix = "fe::FacetSection",
|
|
180
180
|
OPSubSectionIdPrefix = "fe::FacetSubSection",
|
|
181
181
|
OPFormIdPrefix = "fe::Form",
|
|
@@ -177,15 +177,16 @@ sap.ui.define(
|
|
|
177
177
|
* @ui5-restricted
|
|
178
178
|
*/
|
|
179
179
|
HeaderActions.prototype.iExecuteSaveAsTile = function (sBookmarkTitle) {
|
|
180
|
-
var
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
180
|
+
var oShareButtonProperties = {
|
|
181
|
+
icon: "sap-icon://action"
|
|
182
|
+
};
|
|
183
|
+
var oShareBuilder = FEBuilder.create(this.getOpaInstance());
|
|
184
184
|
|
|
185
185
|
return this.prepareResult(
|
|
186
|
-
|
|
187
|
-
.
|
|
188
|
-
.
|
|
186
|
+
oShareBuilder
|
|
187
|
+
.hasProperties(oShareButtonProperties)
|
|
188
|
+
.do(OpaBuilder.Actions.press())
|
|
189
|
+
.description(Utils.formatMessage("Open share menu"))
|
|
189
190
|
.success(APIHelper.createSaveAsTileExecutorBuilder(sBookmarkTitle))
|
|
190
191
|
.execute()
|
|
191
192
|
);
|
|
@@ -202,11 +203,12 @@ sap.ui.define(
|
|
|
202
203
|
var oShareProperties = {
|
|
203
204
|
icon: "sap-icon://action"
|
|
204
205
|
},
|
|
205
|
-
|
|
206
|
+
oShareBuilder = FEBuilder.create(this.getOpaInstance());
|
|
206
207
|
|
|
207
208
|
return this.prepareResult(
|
|
208
|
-
|
|
209
|
-
.
|
|
209
|
+
oShareBuilder
|
|
210
|
+
.hasProperties(oShareProperties)
|
|
211
|
+
.do(OpaBuilder.Actions.press())
|
|
210
212
|
.description(Utils.formatMessage("Pressing header '{0}' Share button", this.getIdentifier()))
|
|
211
213
|
.success(APIHelper.createSendEmailExecutorBuilder())
|
|
212
214
|
.execute()
|
|
@@ -53,13 +53,16 @@ sap.ui.define(
|
|
|
53
53
|
* @ui5-restricted
|
|
54
54
|
*/
|
|
55
55
|
HeaderActionsLR.prototype.iExecuteSaveAsTile = function (sBookmarkTitle) {
|
|
56
|
-
var
|
|
57
|
-
|
|
56
|
+
var oShareButtonProperties = {
|
|
57
|
+
icon: "sap-icon://action"
|
|
58
|
+
};
|
|
59
|
+
var oShareBuilder = FEBuilder.create(this.getOpaInstance());
|
|
58
60
|
|
|
59
61
|
return this.prepareResult(
|
|
60
|
-
|
|
61
|
-
.
|
|
62
|
-
.
|
|
62
|
+
oShareBuilder
|
|
63
|
+
.hasProperties(oShareButtonProperties)
|
|
64
|
+
.do(OpaBuilder.Actions.press())
|
|
65
|
+
.description(Utils.formatMessage("Open share menu"))
|
|
63
66
|
.success(APIHelper.createSaveAsTileExecutorBuilder(sBookmarkTitle))
|
|
64
67
|
.execute()
|
|
65
68
|
);
|
|
@@ -72,12 +75,15 @@ sap.ui.define(
|
|
|
72
75
|
* @ui5-restricted
|
|
73
76
|
*/
|
|
74
77
|
HeaderActionsLR.prototype.iExecuteSendEmail = function () {
|
|
75
|
-
var
|
|
76
|
-
|
|
78
|
+
var oShareProperties = {
|
|
79
|
+
icon: "sap-icon://action"
|
|
80
|
+
},
|
|
81
|
+
oShareBuilder = FEBuilder.create(this.getOpaInstance());
|
|
77
82
|
|
|
78
83
|
return this.prepareResult(
|
|
79
|
-
|
|
80
|
-
.
|
|
84
|
+
oShareBuilder
|
|
85
|
+
.hasProperties(oShareProperties)
|
|
86
|
+
.do(OpaBuilder.Actions.press())
|
|
81
87
|
.description(Utils.formatMessage("Pressing header '{0}' Share button", this.getIdentifier()))
|
|
82
88
|
.success(APIHelper.createSendEmailExecutorBuilder())
|
|
83
89
|
.execute()
|
|
@@ -420,23 +420,19 @@ sap.ui.define(
|
|
|
420
420
|
* @public
|
|
421
421
|
*/
|
|
422
422
|
HeaderAssertions.prototype.iCheckSaveAsTile = function (mState) {
|
|
423
|
-
var
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
423
|
+
var oShareButtonProperties = {
|
|
424
|
+
icon: "sap-icon://action"
|
|
425
|
+
};
|
|
426
|
+
var oShareBuilder = FEBuilder.create(this.getOpaInstance());
|
|
427
427
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
.
|
|
431
|
-
.
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
.
|
|
435
|
-
|
|
436
|
-
.success(APIHelper.createSaveAsTileCheckBuilder(mState));
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
return this.prepareResult(oOverflowToolbarBuilder.execute());
|
|
428
|
+
return this.prepareResult(
|
|
429
|
+
oShareBuilder
|
|
430
|
+
.hasProperties(oShareButtonProperties)
|
|
431
|
+
.do(OpaBuilder.Actions.press())
|
|
432
|
+
.description(Utils.formatMessage("Open share menu"))
|
|
433
|
+
.success(APIHelper.createSaveAsTileCheckBuilder(mState))
|
|
434
|
+
.execute()
|
|
435
|
+
);
|
|
440
436
|
};
|
|
441
437
|
|
|
442
438
|
/**
|
|
@@ -447,23 +443,19 @@ sap.ui.define(
|
|
|
447
443
|
* @public
|
|
448
444
|
*/
|
|
449
445
|
HeaderAssertions.prototype.iCheckSendEmail = function (mState) {
|
|
450
|
-
var
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
446
|
+
var oShareButtonProperties = {
|
|
447
|
+
icon: "sap-icon://action"
|
|
448
|
+
};
|
|
449
|
+
var oShareBuilder = FEBuilder.create(this.getOpaInstance());
|
|
454
450
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
.
|
|
458
|
-
.
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
.
|
|
462
|
-
|
|
463
|
-
.success(APIHelper.createSendEmailCheckBuilder(mState));
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
return this.prepareResult(oOverflowToolbarBuilder.execute());
|
|
451
|
+
return this.prepareResult(
|
|
452
|
+
oShareBuilder
|
|
453
|
+
.hasProperties(oShareButtonProperties)
|
|
454
|
+
.do(OpaBuilder.Actions.press())
|
|
455
|
+
.description(Utils.formatMessage("Open share menu"))
|
|
456
|
+
.success(APIHelper.createSendEmailCheckBuilder(mState))
|
|
457
|
+
.execute()
|
|
458
|
+
);
|
|
467
459
|
};
|
|
468
460
|
|
|
469
461
|
/**
|
|
@@ -61,23 +61,19 @@ sap.ui.define(
|
|
|
61
61
|
* @public
|
|
62
62
|
*/
|
|
63
63
|
HeaderAssertionsLR.prototype.iCheckSaveAsTile = function (mState) {
|
|
64
|
-
var
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
var oShareButtonProperties = {
|
|
65
|
+
icon: "sap-icon://action"
|
|
66
|
+
};
|
|
67
|
+
var oShareBuilder = FEBuilder.create(this.getOpaInstance());
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
.
|
|
72
|
-
.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
.
|
|
76
|
-
|
|
77
|
-
.success(APIHelper.createSaveAsTileCheckBuilder(mState));
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return this.prepareResult(oOverflowToolbarBuilder.execute());
|
|
69
|
+
return this.prepareResult(
|
|
70
|
+
oShareBuilder
|
|
71
|
+
.hasProperties(oShareButtonProperties)
|
|
72
|
+
.do(OpaBuilder.Actions.press())
|
|
73
|
+
.description(Utils.formatMessage("Open share menu"))
|
|
74
|
+
.success(APIHelper.createSaveAsTileCheckBuilder(mState))
|
|
75
|
+
.execute()
|
|
76
|
+
);
|
|
81
77
|
};
|
|
82
78
|
|
|
83
79
|
/**
|
|
@@ -88,23 +84,19 @@ sap.ui.define(
|
|
|
88
84
|
* @public
|
|
89
85
|
*/
|
|
90
86
|
HeaderAssertionsLR.prototype.iCheckSendEmail = function (mState) {
|
|
91
|
-
var
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
87
|
+
var oShareButtonProperties = {
|
|
88
|
+
icon: "sap-icon://action"
|
|
89
|
+
};
|
|
90
|
+
var oShareBuilder = FEBuilder.create(this.getOpaInstance());
|
|
95
91
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
.
|
|
99
|
-
.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
.
|
|
103
|
-
|
|
104
|
-
.success(APIHelper.createSendEmailCheckBuilder(mState));
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return this.prepareResult(oOverflowToolbarBuilder.execute());
|
|
92
|
+
return this.prepareResult(
|
|
93
|
+
oShareBuilder
|
|
94
|
+
.hasProperties(oShareButtonProperties)
|
|
95
|
+
.do(OpaBuilder.Actions.press())
|
|
96
|
+
.description(Utils.formatMessage("Open share menu"))
|
|
97
|
+
.success(APIHelper.createSendEmailCheckBuilder(mState))
|
|
98
|
+
.execute()
|
|
99
|
+
);
|
|
108
100
|
};
|
|
109
101
|
|
|
110
102
|
return HeaderAssertionsLR;
|
|
@@ -193,4 +193,4 @@ sap.ui.define([], function () {
|
|
|
193
193
|
}();
|
|
194
194
|
return ConsoleErrorChecker.getInstance(window);
|
|
195
195
|
}, false);
|
|
196
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3cmFwUGF0dGVybnMiLCJwYXR0ZXJuIiwiUmVnRXhwIiwibWVzc2FnZSIsIm1hdGNoIiwiaW5jbHVkZXMiLCJHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlMiLCJtYXAiLCJDb25zb2xlRXJyb3JDaGVja2VyIiwid2luZG93IiwibWF0Y2hlcnMiLCJtZXNzYWdlcyIsIm9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm9wYUZyYW1lIiwicmVkdWNlIiwiaUZyYW1lIiwibXV0YXRpb24iLCJub2RlIiwiQXJyYXkiLCJmcm9tIiwiYWRkZWROb2RlcyIsIkVsZW1lbnQiLCJlbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIkhUTUxJRnJhbWVFbGVtZW50IiwiY29udGVudFdpbmRvdyIsInByZXBhcmVXaW5kb3ciLCJRVW5pdCIsIm1vZHVsZVN0YXJ0Iiwib2JzZXJ2ZSIsImRvY3VtZW50IiwiYm9keSIsImNoaWxkTGlzdCIsIm1vZHVsZURvbmUiLCJkaXNjb25uZWN0IiwidGVzdFN0YXJ0IiwicmVzZXQiLCJsb2ciLCJoYW5kbGVGYWlsZWRNZXNzYWdlcyIsImthcm1hIiwiX19rYXJtYV9fIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwibG9jYXRpb24iLCJ1cmxQYXJhbSIsImdldCIsImlzU3RyaWN0IiwiY29uZmlnIiwidWk1Iiwic3RyaWN0Y29uc29sZWVycm9ycyIsImZhaWxlZE1lc3NhZ2VzIiwibGVuZ3RoIiwiYXNzZXJ0IiwicHVzaFJlc3VsdCIsInJlc3VsdCIsInNvdXJjZSIsImFjdHVhbCIsImV4cGVjdGVkIiwic2V0QWNjZXB0ZWRFcnJvclBhdHRlcm5zIiwicGF0dGVybnMiLCJjb25jYXQiLCJjaGVja0FuZExvZyIsInR5cGUiLCJkYXRhIiwibWVzc2FnZVRleHQiLCJpc0FsbG93ZWQiLCJzb21lIiwibWF0Y2hlciIsInB1c2giLCJ3cmFwcGVkRGF0YSIsImQiLCJjb25zb2xlIiwicGF0Y2hDb25zb2xlTWV0aG9kIiwibWV0aG9kIiwiZm5PcmlnaW5hbCIsImFwcGx5IiwiY29uZGl0aW9uIiwiZmlyc3QiLCJ1bnNoaWZ0IiwiZXJyb3IiLCJvblByb21pc2VSZWplY3Rpb24iLCJldmVudCIsInJlYXNvbiIsInN0YWNrIiwib25FcnJvciIsImZpbGVuYW1lIiwiYWRkRXZlbnRMaXN0ZW5lciIsImJpbmQiLCJwYXNzaXZlIiwiZ2V0SW5zdGFuY2UiLCJzYXBGRUNvbnNvbGVFcnJvckNoZWNrZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbnNvbGVFcnJvckNoZWNrZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCcm93c2VyQ29uc29sZUxvZ09wdGlvbnMgfSBmcm9tIFwia2FybWFcIjtcblxudHlwZSBNZXNzYWdlTWF0Y2hlckZ1bmN0aW9uID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gYm9vbGVhbjtcbnR5cGUgS2FybWEgPSB7XG5cdGxvZzogKGxldmVsOiBCcm93c2VyQ29uc29sZUxvZ09wdGlvbnNbXCJsZXZlbFwiXSwgLi4uZGF0YTogYW55W10pID0+IHZvaWQ7XG5cdGNvbmZpZzoge1xuXHRcdHVpNT86IHtcblx0XHRcdGNvbmZpZzoge1xuXHRcdFx0XHRzdHJpY3Rjb25zb2xlZXJyb3JzPzogYm9vbGVhbjsgLy8gS2FybWEgb3B0aW9ucyBhcmUgYWxsIGxvd2VyY2FzZSBhdCBydW50aW1lIVxuXHRcdFx0fTtcblx0XHR9O1xuXHR9O1xufTtcblxuZnVuY3Rpb24gd3JhcFBhdHRlcm5zKHBhdHRlcm46IFJlZ0V4cCB8IHN0cmluZyk6IE1lc3NhZ2VNYXRjaGVyRnVuY3Rpb24ge1xuXHRpZiAocGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuXHRcdHJldHVybiAobWVzc2FnZSkgPT4gbWVzc2FnZS5tYXRjaChwYXR0ZXJuKSAhPT0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gKG1lc3NhZ2UpID0+IG1lc3NhZ2UuaW5jbHVkZXMocGF0dGVybik7XG5cdH1cbn1cblxuLyoqXG4gKiBMaXN0IG9mIGVycm9yIG1lc3NhZ2UgcGF0dGVybnMgdGhhdCBhcmUgYWx3YXlzIGFjY2VwdGVkLlxuICovXG5jb25zdCBHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlMgPSBbXG5cdC9saWJyYXJ5LXByZWxvYWRcXC4oanNvbnxqcykvLCAvLyBhY2NlcHQgZXJyb3JzIHJlbGF0ZWQgdG8gZmlsZXMgdGhhdCBhcmUgbm90IHRoZXJlIHdoZW4gcnVubmluZyBmcm9tIHNvdXJjZSB0byBwcmV2ZW50IGZhbHNlIHBvc2l0aXZlc1xuXHRcIi9yZXNvdXJjZXMvc2FwL2ZlL21hY3Jvcy9tYW5pZmVzdC5qc29uXCIgLy8gc2VlIGFib3ZlXG5dLm1hcCh3cmFwUGF0dGVybnMpO1xuXG5jbGFzcyBDb25zb2xlRXJyb3JDaGVja2VyIHtcblx0cHJpdmF0ZSBtYXRjaGVyczogTWVzc2FnZU1hdGNoZXJGdW5jdGlvbltdID0gW107XG5cblx0cHJpdmF0ZSBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGthcm1hOiBLYXJtYSB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGlzU3RyaWN0OiBib29sZWFuO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG5cdFx0Y29uc3Qgb3BhRnJhbWUgPSBtdXRhdGlvbnMucmVkdWNlKChpRnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCwgbXV0YXRpb246IE11dGF0aW9uUmVjb3JkKSA9PiB7XG5cdFx0XHRpZiAoaUZyYW1lICE9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBpRnJhbWU7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpKSB7XG5cdFx0XHRcdGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuXHRcdFx0XHRcdGNvbnN0IGVsZW1lbnQgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoXCIjT3BhRnJhbWVcIik7XG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCAmJiBlbGVtZW50LmNvbnRlbnRXaW5kb3cpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaUZyYW1lO1xuXHRcdH0sIG51bGwpO1xuXG5cdFx0aWYgKG9wYUZyYW1lICYmIG9wYUZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcblx0XHRcdHRoaXMucHJlcGFyZVdpbmRvdyhvcGFGcmFtZS5jb250ZW50V2luZG93KTtcblx0XHR9XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKHdpbmRvdzogV2luZG93ICYgeyBfX2thcm1hX18/OiBLYXJtYSB9KSB7XG5cdFx0UVVuaXQubW9kdWxlU3RhcnQoKCkgPT4ge1xuXHRcdFx0dGhpcy5vYnNlcnZlci5vYnNlcnZlKHdpbmRvdy5kb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcblx0XHR9KTtcblxuXHRcdFFVbml0Lm1vZHVsZURvbmUoKCkgPT4ge1xuXHRcdFx0dGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0fSk7XG5cblx0XHRRVW5pdC50ZXN0U3RhcnQoKCkgPT4ge1xuXHRcdFx0dGhpcy5yZXNldCgpO1xuXHRcdH0pO1xuXG5cdFx0UVVuaXQubG9nKCgpID0+IHtcblx0XHRcdHRoaXMuaGFuZGxlRmFpbGVkTWVzc2FnZXMoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMua2FybWEgPSB3aW5kb3cuX19rYXJtYV9fO1xuXG5cdFx0Ly8gZWl0aGVyIGdvIGZvciBLYXJtYSBjb25maWcgb3B0aW9uIFwidWk1LmNvbmZpZy5zdHJpY3RDb25zb2xlRXJyb3JzXCIgb3IgdXNlIFVSTCBxdWVyeSBwYXJhbWV0ZXIgXCJzdHJpY3RcIlxuXHRcdGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cdFx0Y29uc3QgdXJsUGFyYW0gPSBzZWFyY2guZ2V0KFwic3RyaWN0Q29uc29sZUVycm9yc1wiKTtcblx0XHRpZiAodXJsUGFyYW0gIT09IG51bGwpIHtcblx0XHRcdHRoaXMuaXNTdHJpY3QgPSB1cmxQYXJhbSA9PT0gXCJ0cnVlXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuaXNTdHJpY3QgPSB0aGlzLmthcm1hPy5jb25maWcudWk1Py5jb25maWcuc3RyaWN0Y29uc29sZWVycm9ycyA/PyBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLnJlc2V0KCk7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZUZhaWxlZE1lc3NhZ2VzKCkge1xuXHRcdGNvbnN0IGZhaWxlZE1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcztcblx0XHR0aGlzLm1lc3NhZ2VzID0gW107XG5cblx0XHRpZiAoZmFpbGVkTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0UVVuaXQuYXNzZXJ0LnB1c2hSZXN1bHQoe1xuXHRcdFx0XHRyZXN1bHQ6IGZhbHNlLFxuXHRcdFx0XHRzb3VyY2U6IFwiRkUgQ29uc29sZSBMb2cgQ2hlY2tcIixcblx0XHRcdFx0bWVzc2FnZTogYFRoZXJlIHdlcmUgJHtmYWlsZWRNZXNzYWdlcy5sZW5ndGh9IHVuZXhwZWN0ZWQgY29uc29sZSBlcnJvcnNgLFxuXHRcdFx0XHRhY3R1YWw6IGZhaWxlZE1lc3NhZ2VzLFxuXHRcdFx0XHRleHBlY3RlZDogW11cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcmVzZXQoKSB7XG5cdFx0dGhpcy5tZXNzYWdlcyA9IFtdO1xuXG5cdFx0Ly8gdGhpcyBzZXRzIHRoZSBkZWZhdWx0IHRvIGFwcGx5IGlmIG5vIGFsbG93ZWQgcGF0dGVybnMgYXJlIHNldCB2aWEgc2V0QWNjZXB0ZWRFcnJvclBhdHRlcm5zKCkuXG5cdFx0aWYgKHRoaXMuaXNTdHJpY3QpIHtcblx0XHRcdHRoaXMubWF0Y2hlcnMgPSBHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubWF0Y2hlcnMgPSBbKCkgPT4gdHJ1ZV07XG5cdFx0fVxuXHR9XG5cblx0c2V0QWNjZXB0ZWRFcnJvclBhdHRlcm5zKHBhdHRlcm5zPzogKFJlZ0V4cCB8IHN0cmluZylbXSkge1xuXHRcdGlmICghcGF0dGVybnMgfHwgcGF0dGVybnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aGlzLm1hdGNoZXJzID0gR0xPQkFMTFlfQUNDRVBURURfRVJST1JTO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm1hdGNoZXJzID0gcGF0dGVybnMubWFwKHdyYXBQYXR0ZXJucykuY29uY2F0KEdMT0JBTExZX0FDQ0VQVEVEX0VSUk9SUyk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBjaGVja0FuZExvZyh0eXBlOiBCcm93c2VyQ29uc29sZUxvZ09wdGlvbnNbXCJsZXZlbFwiXSwgLi4uZGF0YTogYW55W10pIHtcblx0XHQvLyBvbmx5IGNoZWNrIHRoZSBlcnJvciBtZXNzYWdlc1xuXHRcdGlmICh0eXBlID09PSBcImVycm9yXCIpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2VUZXh0ID0gZGF0YVswXTtcblx0XHRcdGNvbnN0IGlzQWxsb3dlZCA9IHRoaXMubWF0Y2hlcnMuc29tZSgobWF0Y2hlcikgPT4gbWF0Y2hlcihtZXNzYWdlVGV4dCkpO1xuXHRcdFx0aWYgKCFpc0FsbG93ZWQpIHtcblx0XHRcdFx0dGhpcy5tZXNzYWdlcy5wdXNoKG1lc3NhZ2VUZXh0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5rYXJtYSkge1xuXHRcdFx0Ly8gd3JhcCB0aGUgZGF0YSB0byBmYWNpbGl0YXRlIHBhcnNpbmcgaW4gdGhlIGJhY2tlbmRcblx0XHRcdGNvbnN0IHdyYXBwZWREYXRhID0gZGF0YS5tYXAoKGQpID0+IFtkXSk7XG5cdFx0XHR0aGlzLmthcm1hLmxvZyh0eXBlLCB3cmFwcGVkRGF0YSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBwcmVwYXJlV2luZG93KHdpbmRvdzogV2luZG93KSB7XG5cdFx0Y29uc3QgY29uc29sZTogQ29uc29sZSA9ICh3aW5kb3cgYXMgYW55KS5jb25zb2xlO1xuXG5cdFx0Ly8gY2FwdHVyZSBjb25zb2xlLmxvZygpLCBjb25zb2xlLmRlYnVnKCksIGV0Yy5cblx0XHRjb25zdCBwYXRjaENvbnNvbGVNZXRob2QgPSAobWV0aG9kOiBcImxvZ1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIiB8IFwiZGVidWdcIikgPT4ge1xuXHRcdFx0Y29uc3QgZm5PcmlnaW5hbCA9IGNvbnNvbGVbbWV0aG9kXTtcblx0XHRcdGNvbnNvbGVbbWV0aG9kXSA9ICguLi5kYXRhOiBhbnlbXSk6IHZvaWQgPT4ge1xuXHRcdFx0XHR0aGlzLmNoZWNrQW5kTG9nKG1ldGhvZCwgLi4uZGF0YSk7XG5cdFx0XHRcdHJldHVybiBmbk9yaWdpbmFsLmFwcGx5KGNvbnNvbGUsIGRhdGEpO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0cGF0Y2hDb25zb2xlTWV0aG9kKFwibG9nXCIpO1xuXHRcdHBhdGNoQ29uc29sZU1ldGhvZChcImRlYnVnXCIpO1xuXHRcdHBhdGNoQ29uc29sZU1ldGhvZChcImluZm9cIik7XG5cdFx0cGF0Y2hDb25zb2xlTWV0aG9kKFwid2FyblwiKTtcblx0XHRwYXRjaENvbnNvbGVNZXRob2QoXCJlcnJvclwiKTtcblxuXHRcdC8vIGNhcHR1cmUgY29uc29sZS5hc3NlcnQoKVxuXHRcdC8vIHNlZSBodHRwczovL2NvbnNvbGUuc3BlYy53aGF0d2cub3JnLyNhc3NlcnRcblx0XHRjb25zb2xlLmFzc2VydCA9IGZ1bmN0aW9uIChjb25kaXRpb24gPSBmYWxzZSwgLi4uZGF0YTogYW55W10pIHtcblx0XHRcdGlmIChjb25kaXRpb24pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtZXNzYWdlID0gXCJBc3NlcnRpb24gZmFpbGVkXCI7XG5cdFx0XHRpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0ZGF0YS5wdXNoKG1lc3NhZ2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGV0IGZpcnN0ID0gZGF0YVswXTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmaXJzdCAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdGRhdGEudW5zaGlmdChtZXNzYWdlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmaXJzdCA9IGAke21lc3NhZ2V9OiAke2ZpcnN0fWA7XG5cdFx0XHRcdFx0ZGF0YVswXSA9IGZpcnN0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoLi4uZGF0YSk7XG5cdFx0fTtcblxuXHRcdC8vIGNhcHR1cmUgZXJyb3JzXG5cdFx0ZnVuY3Rpb24gb25Qcm9taXNlUmVqZWN0aW9uKHRoaXM6IENvbnNvbGVFcnJvckNoZWNrZXIsIGV2ZW50OiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBgVU5IQU5ETEVEIFBST01JU0UgUkVKRUNUSU9OOiAke2V2ZW50LnJlYXNvbn1gO1xuXHRcdFx0dGhpcy5jaGVja0FuZExvZyhcImVycm9yXCIsIG1lc3NhZ2UsIGV2ZW50LnJlYXNvbj8uc3RhY2spO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIG9uRXJyb3IodGhpczogQ29uc29sZUVycm9yQ2hlY2tlciwgZXZlbnQ6IEVycm9yRXZlbnQpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBldmVudC5tZXNzYWdlO1xuXHRcdFx0dGhpcy5jaGVja0FuZExvZyhcImVycm9yXCIsIG1lc3NhZ2UsIGV2ZW50LmZpbGVuYW1lKTtcblx0XHR9XG5cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidW5oYW5kbGVkcmVqZWN0aW9uXCIsIG9uUHJvbWlzZVJlamVjdGlvbi5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0SW5zdGFuY2Uod2luZG93OiBXaW5kb3cgJiB7IHNhcEZFQ29uc29sZUVycm9yQ2hlY2tlcj86IENvbnNvbGVFcnJvckNoZWNrZXIgfSk6IENvbnNvbGVFcnJvckNoZWNrZXIge1xuXHRcdC8vIHRoZSBnbG9iYWwgaW5zdGFuY2UgaXMgbmVlZGVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgdGVzdHMgaW4gYSByb3cgKGluIEthcm1hKVxuXHRcdGlmICghd2luZG93LnNhcEZFQ29uc29sZUVycm9yQ2hlY2tlcikge1xuXHRcdFx0d2luZG93LnNhcEZFQ29uc29sZUVycm9yQ2hlY2tlciA9IG5ldyBDb25zb2xlRXJyb3JDaGVja2VyKHdpbmRvdyk7XG5cdFx0fVxuXHRcdHJldHVybiB3aW5kb3cuc2FwRkVDb25zb2xlRXJyb3JDaGVja2VyO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbnNvbGVFcnJvckNoZWNrZXIuZ2V0SW5zdGFuY2Uod2luZG93KTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQWNBLFNBQVNBLFlBQVksQ0FBQ0MsT0FBd0IsRUFBMEI7SUFDdkUsSUFBSUEsT0FBTyxZQUFZQyxNQUFNLEVBQUU7TUFDOUIsT0FBUUMsT0FBTyxJQUFLQSxPQUFPLENBQUNDLEtBQUssQ0FBQ0gsT0FBTyxDQUFDLEtBQUssSUFBSTtJQUNwRCxDQUFDLE1BQU07TUFDTixPQUFRRSxPQUFPLElBQUtBLE9BQU8sQ0FBQ0UsUUFBUSxDQUFDSixPQUFPLENBQUM7SUFDOUM7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7RUFDQSxNQUFNSyx3QkFBd0IsR0FBRyxDQUNoQyw0QkFBNEI7RUFBRTtFQUM5Qix3Q0FBd0MsQ0FBQztFQUFBLENBQ3pDLENBQUNDLEdBQUcsQ0FBQ1AsWUFBWSxDQUFDO0VBQUMsSUFFZFEsbUJBQW1CO0lBZ0N4Qiw2QkFBWUMs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
|
|
196
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3cmFwUGF0dGVybnMiLCJwYXR0ZXJuIiwiUmVnRXhwIiwibWVzc2FnZSIsIm1hdGNoIiwiaW5jbHVkZXMiLCJHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlMiLCJtYXAiLCJDb25zb2xlRXJyb3JDaGVja2VyIiwid2luZG93IiwibWF0Y2hlcnMiLCJtZXNzYWdlcyIsIm9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm9wYUZyYW1lIiwicmVkdWNlIiwiaUZyYW1lIiwibXV0YXRpb24iLCJub2RlIiwiQXJyYXkiLCJmcm9tIiwiYWRkZWROb2RlcyIsIkVsZW1lbnQiLCJlbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIkhUTUxJRnJhbWVFbGVtZW50IiwiY29udGVudFdpbmRvdyIsInByZXBhcmVXaW5kb3ciLCJRVW5pdCIsIm1vZHVsZVN0YXJ0Iiwib2JzZXJ2ZSIsImRvY3VtZW50IiwiYm9keSIsImNoaWxkTGlzdCIsIm1vZHVsZURvbmUiLCJkaXNjb25uZWN0IiwidGVzdFN0YXJ0IiwicmVzZXQiLCJsb2ciLCJoYW5kbGVGYWlsZWRNZXNzYWdlcyIsImthcm1hIiwiX19rYXJtYV9fIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwibG9jYXRpb24iLCJ1cmxQYXJhbSIsImdldCIsImlzU3RyaWN0IiwiY29uZmlnIiwidWk1Iiwic3RyaWN0Y29uc29sZWVycm9ycyIsImZhaWxlZE1lc3NhZ2VzIiwibGVuZ3RoIiwiYXNzZXJ0IiwicHVzaFJlc3VsdCIsInJlc3VsdCIsInNvdXJjZSIsImFjdHVhbCIsImV4cGVjdGVkIiwic2V0QWNjZXB0ZWRFcnJvclBhdHRlcm5zIiwicGF0dGVybnMiLCJjb25jYXQiLCJjaGVja0FuZExvZyIsInR5cGUiLCJkYXRhIiwibWVzc2FnZVRleHQiLCJpc0FsbG93ZWQiLCJzb21lIiwibWF0Y2hlciIsInB1c2giLCJ3cmFwcGVkRGF0YSIsImQiLCJjb25zb2xlIiwicGF0Y2hDb25zb2xlTWV0aG9kIiwibWV0aG9kIiwiZm5PcmlnaW5hbCIsImFwcGx5IiwiY29uZGl0aW9uIiwiZmlyc3QiLCJ1bnNoaWZ0IiwiZXJyb3IiLCJvblByb21pc2VSZWplY3Rpb24iLCJldmVudCIsInJlYXNvbiIsInN0YWNrIiwib25FcnJvciIsImZpbGVuYW1lIiwiYWRkRXZlbnRMaXN0ZW5lciIsImJpbmQiLCJwYXNzaXZlIiwiZ2V0SW5zdGFuY2UiLCJzYXBGRUNvbnNvbGVFcnJvckNoZWNrZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbnNvbGVFcnJvckNoZWNrZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsidHlwZSBNZXNzYWdlTWF0Y2hlckZ1bmN0aW9uID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gYm9vbGVhbjtcbnR5cGUgS2FybWEgPSB7XG5cdGxvZzogKGxldmVsOiBhbnksIC4uLmRhdGE6IGFueVtdKSA9PiB2b2lkO1xuXHRjb25maWc6IHtcblx0XHR1aTU/OiB7XG5cdFx0XHRjb25maWc6IHtcblx0XHRcdFx0c3RyaWN0Y29uc29sZWVycm9ycz86IGJvb2xlYW47IC8vIEthcm1hIG9wdGlvbnMgYXJlIGFsbCBsb3dlcmNhc2UgYXQgcnVudGltZSFcblx0XHRcdH07XG5cdFx0fTtcblx0fTtcbn07XG5cbmZ1bmN0aW9uIHdyYXBQYXR0ZXJucyhwYXR0ZXJuOiBSZWdFeHAgfCBzdHJpbmcpOiBNZXNzYWdlTWF0Y2hlckZ1bmN0aW9uIHtcblx0aWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcblx0XHRyZXR1cm4gKG1lc3NhZ2UpID0+IG1lc3NhZ2UubWF0Y2gocGF0dGVybikgIT09IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIChtZXNzYWdlKSA9PiBtZXNzYWdlLmluY2x1ZGVzKHBhdHRlcm4pO1xuXHR9XG59XG5cbi8qKlxuICogTGlzdCBvZiBlcnJvciBtZXNzYWdlIHBhdHRlcm5zIHRoYXQgYXJlIGFsd2F5cyBhY2NlcHRlZC5cbiAqL1xuY29uc3QgR0xPQkFMTFlfQUNDRVBURURfRVJST1JTID0gW1xuXHQvbGlicmFyeS1wcmVsb2FkXFwuKGpzb258anMpLywgLy8gYWNjZXB0IGVycm9ycyByZWxhdGVkIHRvIGZpbGVzIHRoYXQgYXJlIG5vdCB0aGVyZSB3aGVuIHJ1bm5pbmcgZnJvbSBzb3VyY2UgdG8gcHJldmVudCBmYWxzZSBwb3NpdGl2ZXNcblx0XCIvcmVzb3VyY2VzL3NhcC9mZS9tYWNyb3MvbWFuaWZlc3QuanNvblwiIC8vIHNlZSBhYm92ZVxuXS5tYXAod3JhcFBhdHRlcm5zKTtcblxuY2xhc3MgQ29uc29sZUVycm9yQ2hlY2tlciB7XG5cdHByaXZhdGUgbWF0Y2hlcnM6IE1lc3NhZ2VNYXRjaGVyRnVuY3Rpb25bXSA9IFtdO1xuXG5cdHByaXZhdGUgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG5cblx0cHJpdmF0ZSByZWFkb25seSBrYXJtYTogS2FybWEgfCB1bmRlZmluZWQ7XG5cblx0cHJpdmF0ZSByZWFkb25seSBpc1N0cmljdDogYm9vbGVhbjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuXHRcdGNvbnN0IG9wYUZyYW1lID0gbXV0YXRpb25zLnJlZHVjZSgoaUZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCB8IG51bGwsIG11dGF0aW9uOiBNdXRhdGlvblJlY29yZCkgPT4ge1xuXHRcdFx0aWYgKGlGcmFtZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gaUZyYW1lO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgQXJyYXkuZnJvbShtdXRhdGlvbi5hZGRlZE5vZGVzKSkge1xuXHRcdFx0XHRpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcblx0XHRcdFx0XHRjb25zdCBlbGVtZW50ID0gbm9kZS5xdWVyeVNlbGVjdG9yKFwiI09wYUZyYW1lXCIpO1xuXHRcdFx0XHRcdGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQgJiYgZWxlbWVudC5jb250ZW50V2luZG93KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbWVudDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGlGcmFtZTtcblx0XHR9LCBudWxsKTtcblxuXHRcdGlmIChvcGFGcmFtZSAmJiBvcGFGcmFtZS5jb250ZW50V2luZG93KSB7XG5cdFx0XHR0aGlzLnByZXBhcmVXaW5kb3cob3BhRnJhbWUuY29udGVudFdpbmRvdyk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdHJ1Y3Rvcih3aW5kb3c6IFdpbmRvdyAmIHsgX19rYXJtYV9fPzogS2FybWEgfSkge1xuXHRcdFFVbml0Lm1vZHVsZVN0YXJ0KCgpID0+IHtcblx0XHRcdHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh3aW5kb3cuZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG5cdFx0fSk7XG5cblx0XHRRVW5pdC5tb2R1bGVEb25lKCgpID0+IHtcblx0XHRcdHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdH0pO1xuXG5cdFx0UVVuaXQudGVzdFN0YXJ0KCgpID0+IHtcblx0XHRcdHRoaXMucmVzZXQoKTtcblx0XHR9KTtcblxuXHRcdFFVbml0LmxvZygoKSA9PiB7XG5cdFx0XHR0aGlzLmhhbmRsZUZhaWxlZE1lc3NhZ2VzKCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmthcm1hID0gd2luZG93Ll9fa2FybWFfXztcblxuXHRcdC8vIGVpdGhlciBnbyBmb3IgS2FybWEgY29uZmlnIG9wdGlvbiBcInVpNS5jb25maWcuc3RyaWN0Q29uc29sZUVycm9yc1wiIG9yIHVzZSBVUkwgcXVlcnkgcGFyYW1ldGVyIFwic3RyaWN0XCJcblx0XHRjb25zdCBzZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXHRcdGNvbnN0IHVybFBhcmFtID0gc2VhcmNoLmdldChcInN0cmljdENvbnNvbGVFcnJvcnNcIik7XG5cdFx0aWYgKHVybFBhcmFtICE9PSBudWxsKSB7XG5cdFx0XHR0aGlzLmlzU3RyaWN0ID0gdXJsUGFyYW0gPT09IFwidHJ1ZVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmlzU3RyaWN0ID0gdGhpcy5rYXJtYT8uY29uZmlnLnVpNT8uY29uZmlnLnN0cmljdGNvbnNvbGVlcnJvcnMgPz8gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5yZXNldCgpO1xuXHR9XG5cblx0cHJpdmF0ZSBoYW5kbGVGYWlsZWRNZXNzYWdlcygpIHtcblx0XHRjb25zdCBmYWlsZWRNZXNzYWdlcyA9IHRoaXMubWVzc2FnZXM7XG5cdFx0dGhpcy5tZXNzYWdlcyA9IFtdO1xuXG5cdFx0aWYgKGZhaWxlZE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFFVbml0LmFzc2VydC5wdXNoUmVzdWx0KHtcblx0XHRcdFx0cmVzdWx0OiBmYWxzZSxcblx0XHRcdFx0c291cmNlOiBcIkZFIENvbnNvbGUgTG9nIENoZWNrXCIsXG5cdFx0XHRcdG1lc3NhZ2U6IGBUaGVyZSB3ZXJlICR7ZmFpbGVkTWVzc2FnZXMubGVuZ3RofSB1bmV4cGVjdGVkIGNvbnNvbGUgZXJyb3JzYCxcblx0XHRcdFx0YWN0dWFsOiBmYWlsZWRNZXNzYWdlcyxcblx0XHRcdFx0ZXhwZWN0ZWQ6IFtdXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHJlc2V0KCkge1xuXHRcdHRoaXMubWVzc2FnZXMgPSBbXTtcblxuXHRcdC8vIHRoaXMgc2V0cyB0aGUgZGVmYXVsdCB0byBhcHBseSBpZiBubyBhbGxvd2VkIHBhdHRlcm5zIGFyZSBzZXQgdmlhIHNldEFjY2VwdGVkRXJyb3JQYXR0ZXJucygpLlxuXHRcdGlmICh0aGlzLmlzU3RyaWN0KSB7XG5cdFx0XHR0aGlzLm1hdGNoZXJzID0gR0xPQkFMTFlfQUNDRVBURURfRVJST1JTO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm1hdGNoZXJzID0gWygpID0+IHRydWVdO1xuXHRcdH1cblx0fVxuXG5cdHNldEFjY2VwdGVkRXJyb3JQYXR0ZXJucyhwYXR0ZXJucz86IChSZWdFeHAgfCBzdHJpbmcpW10pIHtcblx0XHRpZiAoIXBhdHRlcm5zIHx8IHBhdHRlcm5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5tYXRjaGVycyA9IEdMT0JBTExZX0FDQ0VQVEVEX0VSUk9SUztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5tYXRjaGVycyA9IHBhdHRlcm5zLm1hcCh3cmFwUGF0dGVybnMpLmNvbmNhdChHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlMpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgY2hlY2tBbmRMb2codHlwZTogYW55LCAuLi5kYXRhOiBhbnlbXSkge1xuXHRcdC8vIG9ubHkgY2hlY2sgdGhlIGVycm9yIG1lc3NhZ2VzXG5cdFx0aWYgKHR5cGUgPT09IFwiZXJyb3JcIikge1xuXHRcdFx0Y29uc3QgbWVzc2FnZVRleHQgPSBkYXRhWzBdO1xuXHRcdFx0Y29uc3QgaXNBbGxvd2VkID0gdGhpcy5tYXRjaGVycy5zb21lKChtYXRjaGVyKSA9PiBtYXRjaGVyKG1lc3NhZ2VUZXh0KSk7XG5cdFx0XHRpZiAoIWlzQWxsb3dlZCkge1xuXHRcdFx0XHR0aGlzLm1lc3NhZ2VzLnB1c2gobWVzc2FnZVRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmthcm1hKSB7XG5cdFx0XHQvLyB3cmFwIHRoZSBkYXRhIHRvIGZhY2lsaXRhdGUgcGFyc2luZyBpbiB0aGUgYmFja2VuZFxuXHRcdFx0Y29uc3Qgd3JhcHBlZERhdGEgPSBkYXRhLm1hcCgoZCkgPT4gW2RdKTtcblx0XHRcdHRoaXMua2FybWEubG9nKHR5cGUsIHdyYXBwZWREYXRhKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHByZXBhcmVXaW5kb3cod2luZG93OiBXaW5kb3cpIHtcblx0XHRjb25zdCBjb25zb2xlOiBDb25zb2xlID0gKHdpbmRvdyBhcyBhbnkpLmNvbnNvbGU7XG5cblx0XHQvLyBjYXB0dXJlIGNvbnNvbGUubG9nKCksIGNvbnNvbGUuZGVidWcoKSwgZXRjLlxuXHRcdGNvbnN0IHBhdGNoQ29uc29sZU1ldGhvZCA9IChtZXRob2Q6IFwibG9nXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiIHwgXCJkZWJ1Z1wiKSA9PiB7XG5cdFx0XHRjb25zdCBmbk9yaWdpbmFsID0gY29uc29sZVttZXRob2RdO1xuXHRcdFx0Y29uc29sZVttZXRob2RdID0gKC4uLmRhdGE6IGFueVtdKTogdm9pZCA9PiB7XG5cdFx0XHRcdHRoaXMuY2hlY2tBbmRMb2cobWV0aG9kLCAuLi5kYXRhKTtcblx0XHRcdFx0cmV0dXJuIGZuT3JpZ2luYWwuYXBwbHkoY29uc29sZSwgZGF0YSk7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHRwYXRjaENvbnNvbGVNZXRob2QoXCJsb2dcIik7XG5cdFx0cGF0Y2hDb25zb2xlTWV0aG9kKFwiZGVidWdcIik7XG5cdFx0cGF0Y2hDb25zb2xlTWV0aG9kKFwiaW5mb1wiKTtcblx0XHRwYXRjaENvbnNvbGVNZXRob2QoXCJ3YXJuXCIpO1xuXHRcdHBhdGNoQ29uc29sZU1ldGhvZChcImVycm9yXCIpO1xuXG5cdFx0Ly8gY2FwdHVyZSBjb25zb2xlLmFzc2VydCgpXG5cdFx0Ly8gc2VlIGh0dHBzOi8vY29uc29sZS5zcGVjLndoYXR3Zy5vcmcvI2Fzc2VydFxuXHRcdGNvbnNvbGUuYXNzZXJ0ID0gZnVuY3Rpb24gKGNvbmRpdGlvbiA9IGZhbHNlLCAuLi5kYXRhOiBhbnlbXSkge1xuXHRcdFx0aWYgKGNvbmRpdGlvbikge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBcIkFzc2VydGlvbiBmYWlsZWRcIjtcblx0XHRcdGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRkYXRhLnB1c2gobWVzc2FnZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsZXQgZmlyc3QgPSBkYXRhWzBdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZpcnN0ICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0ZGF0YS51bnNoaWZ0KG1lc3NhZ2UpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZpcnN0ID0gYCR7bWVzc2FnZX06ICR7Zmlyc3R9YDtcblx0XHRcdFx0XHRkYXRhWzBdID0gZmlyc3Q7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc29sZS5lcnJvciguLi5kYXRhKTtcblx0XHR9O1xuXG5cdFx0Ly8gY2FwdHVyZSBlcnJvcnNcblx0XHRmdW5jdGlvbiBvblByb21pc2VSZWplY3Rpb24odGhpczogQ29uc29sZUVycm9yQ2hlY2tlciwgZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGBVTkhBTkRMRUQgUFJPTUlTRSBSRUpFQ1RJT046ICR7ZXZlbnQucmVhc29ufWA7XG5cdFx0XHR0aGlzLmNoZWNrQW5kTG9nKFwiZXJyb3JcIiwgbWVzc2FnZSwgZXZlbnQucmVhc29uPy5zdGFjayk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gb25FcnJvcih0aGlzOiBDb25zb2xlRXJyb3JDaGVja2VyLCBldmVudDogRXJyb3JFdmVudCkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGV2ZW50Lm1lc3NhZ2U7XG5cdFx0XHR0aGlzLmNoZWNrQW5kTG9nKFwiZXJyb3JcIiwgbWVzc2FnZSwgZXZlbnQuZmlsZW5hbWUpO1xuXHRcdH1cblxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvci5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgb25Qcm9taXNlUmVqZWN0aW9uLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fVxuXG5cdHN0YXRpYyBnZXRJbnN0YW5jZSh3aW5kb3c6IFdpbmRvdyAmIHsgc2FwRkVDb25zb2xlRXJyb3JDaGVja2VyPzogQ29uc29sZUVycm9yQ2hlY2tlciB9KTogQ29uc29sZUVycm9yQ2hlY2tlciB7XG5cdFx0Ly8gdGhlIGdsb2JhbCBpbnN0YW5jZSBpcyBuZWVkZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSB0ZXN0cyBpbiBhIHJvdyAoaW4gS2FybWEpXG5cdFx0aWYgKCF3aW5kb3cuc2FwRkVDb25zb2xlRXJyb3JDaGVja2VyKSB7XG5cdFx0XHR3aW5kb3cuc2FwRkVDb25zb2xlRXJyb3JDaGVja2VyID0gbmV3IENvbnNvbGVFcnJvckNoZWNrZXIod2luZG93KTtcblx0XHR9XG5cdFx0cmV0dXJuIHdpbmRvdy5zYXBGRUNvbnNvbGVFcnJvckNoZWNrZXI7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29uc29sZUVycm9yQ2hlY2tlci5nZXRJbnN0YW5jZSh3aW5kb3cpO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBWUEsU0FBU0EsWUFBWSxDQUFDQyxPQUF3QixFQUEwQjtJQUN2RSxJQUFJQSxPQUFPLFlBQVlDLE1BQU0sRUFBRTtNQUM5QixPQUFRQyxPQUFPLElBQUtBLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDSCxPQUFPLENBQUMsS0FBSyxJQUFJO0lBQ3BELENBQUMsTUFBTTtNQUNOLE9BQVFFLE9BQU8sSUFBS0EsT0FBTyxDQUFDRSxRQUFRLENBQUNKLE9BQU8sQ0FBQztJQUM5QztFQUNEOztFQUVBO0FBQ0E7QUFDQTtFQUNBLE1BQU1LLHdCQUF3QixHQUFHLENBQ2hDLDRCQUE0QjtFQUFFO0VBQzlCLHdDQUF3QyxDQUFDO0VBQUEsQ0FDekMsQ0FBQ0MsR0FBRyxDQUFDUCxZQUFZLENBQUM7RUFBQyxJQUVkUSxtQkFBbUI7SUFnQ3hCLDZCQUFZQyxNQUFzQyxFQUFFO01BQUEsS0EvQjVDQyxRQUFRLEdBQTZCLEVBQUU7TUFBQSxLQUV2Q0MsUUFBUSxHQUFhLEVBQUU7TUFBQSxLQU1kQyxRQUFRLEdBQUcsSUFBSUMsZ0JBQWdCLENBQUVDLFNBQVMsSUFBSztRQUMvRCxNQUFNQyxRQUFRLEdBQUdELFNBQVMsQ0FBQ0UsTUFBTSxDQUFDLENBQUNDLE1BQWdDLEVBQUVDLFFBQXdCLEtBQUs7VUFDakcsSUFBSUQsTUFBTSxLQUFLLElBQUksRUFBRTtZQUNwQixPQUFPQSxNQUFNO1VBQ2Q7VUFFQSxLQUFLLE1BQU1FLElBQUksSUFBSUMsS0FBSyxDQUFDQyxJQUFJLENBQUNILFFBQVEsQ0FBQ0ksVUFBVSxDQUFDLEVBQUU7WUFDbkQsSUFBSUgsSUFBSSxZQUFZSSxPQUFPLEVBQUU7Y0FDNUIsTUFBTUMsT0FBTyxHQUFHTCxJQUFJLENBQUNNLGFBQWEsQ0FBQyxXQUFXLENBQUM7Y0FDL0MsSUFBSUQsT0FBTyxZQUFZRSxpQkFBaUIsSUFBSUYsT0FBTyxDQUFDRyxhQUFhLEVBQUU7Z0JBQ2xFLE9BQU9ILE9BQU87Y0FDZjtZQUNEO1VBQ0Q7VUFFQSxPQUFPUCxNQUFNO1FBQ2QsQ0FBQyxFQUFFLElBQUksQ0FBQztRQUVSLElBQUlGLFFBQVEsSUFBSUEsUUFBUSxDQUFDWSxhQUFhLEVBQUU7VUFDdkMsSUFBSSxDQUFDQyxhQUFhLENBQUNiLFFBQVEsQ0FBQ1ksYUFBYSxDQUFDO1FBQzNDO01BQ0QsQ0FBQyxDQUFDO01BR0RFLEtBQUssQ0FBQ0MsV0FBVyxDQUFDLE1BQU07UUFDdkIsSUFBSSxDQUFDbEIsUUFBUSxDQUFDbUIsT0FBTyxDQUFDdEIsTUFBTSxDQUFDdUIsUUFBUSxDQUFDQyxJQUFJLEVBQUU7VUFBRUMsU0FBUyxFQUFFO1FBQUssQ0FBQyxDQUFDO01BQ2pFLENBQUMsQ0FBQztNQUVGTCxLQUFLLENBQUNNLFVBQVUsQ0FBQyxNQUFNO1FBQ3RCLElBQUksQ0FBQ3ZCLFFBQVEsQ0FBQ3dCLFVBQVUsRUFBRTtNQUMzQixDQUFDLENBQUM7TUFFRlAsS0FBSyxDQUFDUSxTQUFTLENBQUMsTUFBTTtRQUNyQixJQUFJLENBQUNDLEtBQUssRUFBRTtNQUNiLENBQUMsQ0FBQztNQUVGVCxLQUFLLENBQUNVLEdBQUcsQ0FBQyxNQUFNO1FBQ2YsSUFBSSxDQUFDQyxvQkFBb0IsRUFBRTtNQUM1QixDQUFDLENBQUM7TUFFRixJQUFJLENBQUNDLEtBQUssR0FBR2hDLE1BQU0sQ0FBQ2lDLFNBQVM7O01BRTdCO01BQ0EsTUFBTUMsTUFBTSxHQUFHLElBQUlDLGVBQWUsQ0FBQ25DLE1BQU0sQ0FBQ29DLFFBQVEsQ0FBQ0YsTUFBTSxDQUFDO01BQzFELE1BQU1HLFFBQVEsR0FBR0gsTUFBTSxDQUFDSSxHQUFHLENBQUMscUJBQXFCLENBQUM7TUFDbEQsSUFBSUQsUUFBUSxLQUFLLElBQUksRUFBRTtRQUN0QixJQUFJLENBQUNFLFFBQVEsR0FBR0YsUUFBUSxLQUFLLE1BQU07TUFDcEMsQ0FBQyxNQUFNO1FBQUE7UUFDTixJQUFJLENBQUNFLFFBQVEsR0FBRyxvQkFBSSxDQUFDUCxLQUFLLHlFQUFWLFlBQVlRLE1BQU0sQ0FBQ0MsR0FBRywwREFBdEIsc0JBQXdCRCxNQUFNLENBQUNFLG1CQUFtQixLQUFJLEtBQUs7TUFDNUU7TUFFQSxJQUFJLENBQUNiLEtBQUssRUFBRTtJQUNiO0lBQUM7SUFBQSxPQUVPRSxvQkFBb0IsR0FBNUIsZ0NBQStCO01BQzlCLE1BQU1ZLGNBQWMsR0FBRyxJQUFJLENBQUN6QyxRQUFRO01BQ3BDLElBQUksQ0FBQ0EsUUFBUSxHQUFHLEVBQUU7TUFFbEIsSUFBSXlDLGNBQWMsQ0FBQ0MsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUM5QnhCLEtBQUssQ0FBQ3lCLE1BQU0sQ0FBQ0MsVUFBVSxDQUFDO1VBQ3ZCQyxNQUFNLEVBQUUsS0FBSztVQUNiQyxNQUFNLEVBQUUsc0JBQXNCO1VBQzlCdEQsT0FBTyxFQUFHLGNBQWFpRCxjQUFjLENBQUNDLE1BQU8sNEJBQTJCO1VBQ3hFSyxNQUFNLEVBQUVOLGNBQWM7VUFDdEJPLFFBQVEsRUFBRTtRQUNYLENBQUMsQ0FBQztNQUNIO0lBQ0QsQ0FBQztJQUFBLE9BRU9yQixLQUFLLEdBQWIsaUJBQWdCO01BQ2YsSUFBSSxDQUFDM0IsUUFBUSxHQUFHLEVBQUU7O01BRWxCO01BQ0EsSUFBSSxJQUFJLENBQUNxQyxRQUFRLEVBQUU7UUFDbEIsSUFBSSxDQUFDdEMsUUFBUSxHQUFHSix3QkFBd0I7TUFDekMsQ0FBQyxNQUFNO1FBQ04sSUFBSSxDQUFDSSxRQUFRLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQztNQUM3QjtJQUNELENBQUM7SUFBQSxPQUVEa0Qsd0JBQXdCLEdBQXhCLGtDQUF5QkMsUUFBOEIsRUFBRTtNQUN4RCxJQUFJLENBQUNBLFFBQVEsSUFBSUEsUUFBUSxDQUFDUixNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3ZDLElBQUksQ0FBQzNDLFFBQVEsR0FBR0osd0JBQXdCO01BQ3pDLENBQUMsTUFBTTtRQUNOLElBQUksQ0FBQ0ksUUFBUSxHQUFHbUQsUUFBUSxDQUFDdEQsR0FBRyxDQUFDUCxZQUFZLENBQUMsQ0FBQzhELE1BQU0sQ0FBQ3hELHdCQUF3QixDQUFDO01BQzVFO0lBQ0QsQ0FBQztJQUFBLE9BRU95RCxXQUFXLEdBQW5CLHFCQUFvQkMsSUFBUyxFQUFrQjtNQUFBLGtDQUFiQyxJQUFJO1FBQUpBLElBQUk7TUFBQTtNQUNyQztNQUNBLElBQUlELElBQUksS0FBSyxPQUFPLEVBQUU7UUFDckIsTUFBTUUsV0FBVyxHQUFHRCxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU1FLFNBQVMsR0FBRyxJQUFJLENBQUN6RCxRQUFRLENBQUMwRCxJQUFJLENBQUVDLE9BQU8sSUFBS0EsT0FBTyxDQUFDSCxXQUFXLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUNDLFNBQVMsRUFBRTtVQUNmLElBQUksQ0FBQ3hELFFBQVEsQ0FBQzJELElBQUksQ0FBQ0osV0FBVyxDQUFDO1FBQ2hDO01BQ0Q7TUFFQSxJQUFJLElBQUksQ0FBQ3pCLEtBQUssRUFBRTtRQUNmO1FBQ0EsTUFBTThCLFdBQVcsR0FBR04sSUFBSSxDQUFDMUQsR0FBRyxDQUFFaUUsQ0FBQyxJQUFLLENBQUNBLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQy9CLEtBQUssQ0FBQ0YsR0FBRyxDQUFDeUIsSUFBSSxFQUFFTyxXQUFXLENBQUM7TUFDbEM7SUFDRCxDQUFDO0lBQUEsT0FFTzNDLGFBQWEsR0FBckIsdUJBQXNCbkIsTUFBYyxFQUFFO01BQUE7TUFDckMsTUFBTWdFLE9BQWdCLEdBQUloRSxNQUFNLENBQVNnRSxPQUFPOztNQUVoRDtNQUNBLE1BQU1DLGtCQUFrQixHQUFJQyxNQUFtRCxJQUFLO1FBQ25GLE1BQU1DLFVBQVUsR0FBR0gsT0FBTyxDQUFDRSxNQUFNLENBQUM7UUFDbENGLE9BQU8sQ0FBQ0UsTUFBTSxDQUFDLEdBQUcsWUFBMEI7VUFBQSxtQ0FBdEJWLElBQUk7WUFBSkEsSUFBSTtVQUFBO1VBQ3pCLEtBQUksQ0FBQ0YsV0FBVyxDQUFDWSxNQUFNLEVBQUUsR0FBR1YsSUFBSSxDQUFDO1VBQ2pDLE9BQU9XLFVBQVUsQ0FBQ0MsS0FBSyxDQUFDSixPQUFPLEVBQUVSLElBQUksQ0FBQztRQUN2QyxDQUFDO01BQ0YsQ0FBQztNQUVEUyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7TUFDekJBLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztNQUMzQkEsa0JBQWtCLENBQUMsTUFBTSxDQUFDO01BQzFCQSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7TUFDMUJBLGtCQUFrQixDQUFDLE9BQU8sQ0FBQzs7TUFFM0I7TUFDQTtNQUNBRCxPQUFPLENBQUNuQixNQUFNLEdBQUcsWUFBNkM7UUFBQSxJQUFuQ3dCLFNBQVMsdUVBQUcsS0FBSztRQUMzQyxJQUFJQSxTQUFTLEVBQUU7VUFDZDtRQUNEO1FBRUEsTUFBTTNFLE9BQU8sR0FBRyxrQkFBa0I7UUFBQyxtQ0FMYThELElBQUk7VUFBSkEsSUFBSTtRQUFBO1FBTXBELElBQUlBLElBQUksQ0FBQ1osTUFBTSxLQUFLLENBQUMsRUFBRTtVQUN0QlksSUFBSSxDQUFDSyxJQUFJLENBQUNuRSxPQUFPLENBQUM7UUFDbkIsQ0FBQyxNQUFNO1VBQ04sSUFBSTRFLEtBQUssR0FBR2QsSUFBSSxDQUFDLENBQUMsQ0FBQztVQUNuQixJQUFJLE9BQU9jLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDOUJkLElBQUksQ0FBQ2UsT0FBTyxDQUFDN0UsT0FBTyxDQUFDO1VBQ3RCLENBQUMsTUFBTTtZQUNONEUsS0FBSyxHQUFJLEdBQUU1RSxPQUFRLEtBQUk0RSxLQUFNLEVBQUM7WUFDOUJkLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBR2MsS0FBSztVQUNoQjtRQUNEO1FBRUFOLE9BQU8sQ0FBQ1EsS0FBSyxDQUFDLEdBQUdoQixJQUFJLENBQUM7TUFDdkIsQ0FBQzs7TUFFRDtNQUNBLFNBQVNpQixrQkFBa0IsQ0FBNEJDLEtBQTRCLEVBQUU7UUFBQTtRQUNwRixNQUFNaEYsT0FBTyxHQUFJLGdDQUErQmdGLEtBQUssQ0FBQ0MsTUFBTyxFQUFDO1FBQzlELElBQUksQ0FBQ3JCLFdBQVcsQ0FBQyxPQUFPLEVBQUU1RCxPQUFPLG1CQUFFZ0YsS0FBSyxDQUFDQyxNQUFNLGtEQUFaLGNBQWNDLEtBQUssQ0FBQztNQUN4RDtNQUVBLFNBQVNDLE9BQU8sQ0FBNEJILEtBQWlCLEVBQUU7UUFDOUQsTUFBTWhGLE9BQU8sR0FBR2dGLEtBQUssQ0FBQ2hGLE9BQU87UUFDN0IsSUFBSSxDQUFDNEQsV0FBVyxDQUFDLE9BQU8sRUFBRTVELE9BQU8sRUFBRWdGLEtBQUssQ0FBQ0ksUUFBUSxDQUFDO01BQ25EO01BRUE5RSxNQUFNLENBQUMrRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUVGLE9BQU8sQ0FBQ0csSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQUVDLE9BQU8sRUFBRTtNQUFLLENBQUMsQ0FBQztNQUN2RWpGLE1BQU0sQ0FBQytFLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFTixrQkFBa0IsQ0FBQ08sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQUVDLE9BQU8sRUFBRTtNQUFLLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBQUEsb0JBRU1DLFdBQVcsR0FBbEIscUJBQW1CbEYsTUFBbUUsRUFBdUI7TUFDNUc7TUFDQSxJQUFJLENBQUNBLE1BQU0sQ0FBQ21GLHdCQUF3QixFQUFFO1FBQ3JDbkYsTUFBTSxDQUFDbUYsd0JBQXdCLEdBQUcsSUFBSXBGLG1CQUFtQixDQUFDQyxNQUFNLENBQUM7TUFDbEU7TUFDQSxPQUFPQSxNQUFNLENBQUNtRix3QkFBd0I7SUFDdkMsQ0FBQztJQUFBO0VBQUE7RUFBQSxPQUdhcEYsbUJBQW1CLENBQUNtRixXQUFXLENBQUNsRixNQUFNLENBQUM7QUFBQSJ9
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import type { BrowserConsoleLogOptions } from "karma";
|
|
2
|
-
|
|
3
1
|
type MessageMatcherFunction = (message: string) => boolean;
|
|
4
2
|
type Karma = {
|
|
5
|
-
log: (level:
|
|
3
|
+
log: (level: any, ...data: any[]) => void;
|
|
6
4
|
config: {
|
|
7
5
|
ui5?: {
|
|
8
6
|
config: {
|
|
@@ -125,7 +123,7 @@ class ConsoleErrorChecker {
|
|
|
125
123
|
}
|
|
126
124
|
}
|
|
127
125
|
|
|
128
|
-
private checkAndLog(type:
|
|
126
|
+
private checkAndLog(type: any, ...data: any[]) {
|
|
129
127
|
// only check the error messages
|
|
130
128
|
if (type === "error") {
|
|
131
129
|
const messageText = data[0];
|
|
@@ -11,6 +11,16 @@ sap.ui.define(
|
|
|
11
11
|
|
|
12
12
|
var FERunner = JourneyRunner.extend("sap.fe.test.internal.FEJourneyRunner", {
|
|
13
13
|
constructor: function (mSettings) {
|
|
14
|
+
if (window.QUnit) {
|
|
15
|
+
const fn = window.QUnit.test;
|
|
16
|
+
window.QUnit.test = function (name, options, callback) {
|
|
17
|
+
if (callback === undefined) {
|
|
18
|
+
callback = options;
|
|
19
|
+
}
|
|
20
|
+
return fn(name, callback);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
14
24
|
var defaultSettings = {
|
|
15
25
|
launchUrl: "test-resources/sap/fe/templates/internal/demokit/flpSandbox.html",
|
|
16
26
|
launchParameters: {
|
|
@@ -22,7 +22,7 @@ sap.ui.define(["sap/ui/core/Lib", "sap/ui/core/library"], function (Library, _li
|
|
|
22
22
|
controls: [],
|
|
23
23
|
elements: [],
|
|
24
24
|
// eslint-disable-next-line no-template-curly-in-string
|
|
25
|
-
version: "1.
|
|
25
|
+
version: "1.125.0",
|
|
26
26
|
noLibraryCSS: true
|
|
27
27
|
});
|
|
28
28
|
return thisLib;
|