ts2famix 2.1.0-beta.1 → 2.1.0-beta.2
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/dist/analyze.js +18 -8
- package/dist/analyze_functions/process_functions.js +18 -8
- package/dist/famix_functions/EntityDictionary.js +20 -10
- package/dist/famix_functions/helpers_creation.js +18 -8
- package/dist/lib/famix/famix_repository.js +18 -8
- package/dist/lib/famix/index.js +18 -8
- package/dist/refactorer/refactor-getter-setter.js +18 -8
- package/dist/ts2famix-cli-wrapper.js +18 -8
- package/dist/ts2famix-cli.js +18 -8
- package/dist/ts2famix-tsconfig.js +18 -8
- package/package.json +1 -1
|
@@ -20,13 +20,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
20
20
|
}) : function(o, v) {
|
|
21
21
|
o["default"] = v;
|
|
22
22
|
});
|
|
23
|
-
var __importStar = (this && this.__importStar) || function (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
};
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
30
40
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
41
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
42
|
};
|
|
@@ -1682,14 +1692,14 @@ function initFQN(sourceElement, famixElement) {
|
|
|
1682
1692
|
let fqn = FQNFunctions.getFQN(sourceElement);
|
|
1683
1693
|
// using regex, replace [blah] with [blahType]
|
|
1684
1694
|
fqn = fqn.replace(/\[([^\]]+)\]/g, "[$1Type]");
|
|
1685
|
-
analyze_1.logger.
|
|
1695
|
+
analyze_1.logger.debug("Setting fully qualified name for " + famixElement.getJSON() + " to " + fqn);
|
|
1686
1696
|
famixElement.fullyQualifiedName = fqn;
|
|
1687
1697
|
return;
|
|
1688
1698
|
}
|
|
1689
1699
|
// catch all (except comments)
|
|
1690
1700
|
if (!(sourceElement instanceof ts_morph_1.CommentRange)) {
|
|
1691
1701
|
const fqn = FQNFunctions.getFQN(sourceElement);
|
|
1692
|
-
analyze_1.logger.
|
|
1702
|
+
analyze_1.logger.debug("Setting fully qualified name for " + famixElement.getJSON() + " to " + fqn);
|
|
1693
1703
|
famixElement.fullyQualifiedName = fqn;
|
|
1694
1704
|
}
|
|
1695
1705
|
}
|
|
@@ -1790,4 +1800,4 @@ function resolveSymbolToInterfaceDeclaration(symbol) {
|
|
|
1790
1800
|
// }
|
|
1791
1801
|
// return interfaceDeclaration;
|
|
1792
1802
|
// }
|
|
1793
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW50aXR5RGljdGlvbmFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYW1peF9mdW5jdGlvbnMvRW50aXR5RGljdGlvbmFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvMERILDBDQVlDO0FBNzBERCx1Q0FBNmtCO0FBQzdrQiw4RUFBZ0Y7QUFDaEYsZ0VBQWtEO0FBQ2xELG9FQUFnRTtBQUNoRSx3Q0FBNEM7QUFDNUMsb0RBQW9EO0FBQ3BELGlFQUFpRTtBQUNqRSxzREFBdUQ7QUFDdkQsNERBQThDO0FBQzlDLHFEQUF1QztBQUN2QyxnREFBd0I7QUFleEIsTUFBYSxnQkFBZ0I7SUFxQnpCO1FBbkJPLGFBQVEsR0FBRyxJQUFJLGtDQUFlLEVBQUUsQ0FBQztRQUNoQyxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDLENBQUMsNENBQTRDO1FBQzFGLGdCQUFXLEdBQUcsSUFBSSxHQUFHLEVBQStDLENBQUMsQ0FBQyw0REFBNEQ7UUFDbEksb0JBQWUsR0FBRyxJQUFJLEdBQUcsRUFBdUQsQ0FBQyxDQUFDLGdEQUFnRDtRQUNsSSxpQkFBWSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDLENBQUMsZ0RBQWdEO1FBQzNHLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBNkMsQ0FBQyxDQUFDLGtEQUFrRDtRQUNySCxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQTRELENBQUMsQ0FBQyxtREFBbUQ7UUFDckksd0JBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQStCLENBQUMsQ0FBQyxxREFBcUQ7UUFDbkgsNEJBQXVCLEdBQUcsSUFBSSxHQUE4RixDQUFDLENBQUMsK0NBQStDO1FBQzdLLHdCQUFtQixHQUFHLElBQUksR0FBZ0MsQ0FBQyxDQUFDLCtDQUErQztRQUMzRyxvQkFBZSxHQUFHLElBQUksR0FBRyxFQUF5QyxDQUFDLENBQUMsMkNBQTJDO1FBQy9H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bUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDL0QsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxpSUFBaUk7QUFDakksb0JBQW9CO0FBQ3BCLG9FQUFvRTtBQUNwRSx5Q0FBeUM7QUFFekMsZ0RBQWdEO0FBQ2hELHNGQUFzRjtBQUV0RixxQkFBcUI7QUFDckIsNklBQTZJO0FBQzdJLHlGQUF5RjtBQUN6Riw2QkFBNkI7QUFDN0Isb0ZBQW9GO0FBQ3BGLFlBQVk7QUFDWiwyQ0FBMkM7QUFDM0MseUJBQXlCO0FBQ3pCLGdGQUFnRjtBQUNoRixZQUFZO0FBQ1osUUFBUTtBQUVSLGlFQUFpRTtBQUNqRSxxREFBcUQ7QUFFckQsaURBQWlEO0FBQ2pELHNKQUFzSjtBQUV0SixtQ0FBbUM7QUFDbkMsMkZBQTJGO0FBQzNGLFFBQVE7QUFFUixtQ0FBbUM7QUFDbkMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBhIGZ1bmN0aW9uIGdldE9yQ3JlYXRlWFR5cGUgdGFrZXMgYXJndW1lbnRzIG5hbWU6IHN0cmluZyBhbmQgZWxlbWVudDogdHMtbW9ycGgtdHlwZSBhbmQgcmV0dXJucyBhIEZhbWl4LlR5cGVcclxuICogVGhlIGdvYWwgaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgdHlwZXMgKGUuZy4sIGEgbWV0aG9kJ3MgZGVmaW5lZFR5cGUpLCBmb3IgdGhlIG1vZGVsLlxyXG4gKiBUaGUgbmFtZSBkb2Vzbid0IG5lZWQgdG8gYmUgZnVsbHkgcXVhbGlmaWVkIChpdCdzIHRoZSBuYW1lIHVzZWQgaW4gdGhlIHNvdXJjZSBjb2RlLCBvciB0aGUgRmFtaXggbW9kZWwpLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgeyBDbGFzc0RlY2xhcmF0aW9uLCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBGdW5jdGlvbkRlY2xhcmF0aW9uLCBJZGVudGlmaWVyLCBJbnRlcmZhY2VEZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24sIE1ldGhvZFNpZ25hdHVyZSwgTW9kdWxlRGVjbGFyYXRpb24sIFByb3BlcnR5RGVjbGFyYXRpb24sIFByb3BlcnR5U2lnbmF0dXJlLCBTb3VyY2VGaWxlLCBUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb24sIFBhcmFtZXRlckRlY2xhcmF0aW9uLCBEZWNvcmF0b3IsIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sIEltcG9ydFNwZWNpZmllciwgQ29tbWVudFJhbmdlLCBFbnVtRGVjbGFyYXRpb24sIEVudW1NZW1iZXIsIFR5cGVBbGlhc0RlY2xhcmF0aW9uLCBGdW5jdGlvbkV4cHJlc3Npb24sIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cywgSW1wb3J0RGVjbGFyYXRpb24sIEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uLCBTeW50YXhLaW5kLCBFeHByZXNzaW9uLCBUeXBlTm9kZSwgU2NvcGUsIEFycm93RnVuY3Rpb24gfSBmcm9tIFwidHMtbW9ycGhcIjtcclxuaW1wb3J0IHsgaXNBbWJpZW50LCBpc05hbWVzcGFjZSB9IGZyb20gXCIuLi9hbmFseXplX2Z1bmN0aW9ucy9wcm9jZXNzX2Z1bmN0aW9uc1wiO1xyXG5pbXBvcnQgKiBhcyBGYW1peCBmcm9tIFwiLi4vbGliL2ZhbWl4L21vZGVsL2ZhbWl4XCI7XHJcbmltcG9ydCB7IEZhbWl4UmVwb3NpdG9yeSB9IGZyb20gXCIuLi9saWIvZmFtaXgvZmFtaXhfcmVwb3NpdG9yeVwiO1xyXG5pbXBvcnQgeyBsb2dnZXIsIGNvbmZpZyB9IGZyb20gXCIuLi9hbmFseXplXCI7XHJcbi8vIGltcG9ydCBHcmFwaGVtZVNwbGl0dGVyIGZyb20gXCJncmFwaGVtZS1zcGxpdHRlclwiO1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xyXG5pbXBvcnQgR3JhcGhlbWVTcGxpdHRlciA9IHJlcXVpcmUoJ2dyYXBoZW1lLXNwbGl0dGVyJyk7XHJcbmltcG9ydCAqIGFzIEhlbHBlcnMgZnJvbSBcIi4vaGVscGVyc19jcmVhdGlvblwiO1xyXG5pbXBvcnQgKiBhcyBGUU5GdW5jdGlvbnMgZnJvbSBcIi4uL2ZxblwiO1xyXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xyXG4vLyBpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuZXhwb3J0IHR5cGUgVFNNb3JwaE9iamVjdFR5cGUgPSBJbXBvcnREZWNsYXJhdGlvbiB8IEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uIHwgU291cmNlRmlsZSB8IE1vZHVsZURlY2xhcmF0aW9uIHwgQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IFBhcmFtZXRlckRlY2xhcmF0aW9uIHwgVmFyaWFibGVEZWNsYXJhdGlvbiB8IFByb3BlcnR5RGVjbGFyYXRpb24gfCBQcm9wZXJ0eVNpZ25hdHVyZSB8IFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IElkZW50aWZpZXIgfCBEZWNvcmF0b3IgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEltcG9ydFNwZWNpZmllciB8IENvbW1lbnRSYW5nZSB8IEVudW1EZWNsYXJhdGlvbiB8IEVudW1NZW1iZXIgfCBUeXBlQWxpYXNEZWNsYXJhdGlvbiB8IEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cyB8IFRTTW9ycGhQYXJhbWV0cmljVHlwZTtcclxuXHJcbmV4cG9ydCB0eXBlIFRTTW9ycGhUeXBlRGVjbGFyYXRpb24gPSBUeXBlQWxpYXNEZWNsYXJhdGlvbiB8IFByb3BlcnR5RGVjbGFyYXRpb24gfCBQcm9wZXJ0eVNpZ25hdHVyZSB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IFBhcmFtZXRlckRlY2xhcmF0aW9uIHwgVmFyaWFibGVEZWNsYXJhdGlvbiB8IEVudW1NZW1iZXIgfCBJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiB8IFRTTW9ycGhQYXJhbWV0cmljVHlwZSB8IFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjtcclxuXHJcbmV4cG9ydCB0eXBlIFRTTW9ycGhQYXJhbWV0cmljVHlwZSA9IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IEFycm93RnVuY3Rpb247XHJcblxyXG4vLyB0eXBlIFBhcmFtZXRyaWNWYXJpYW50VHlwZSA9IEZhbWl4LlBhcmFtZXRyaWNDbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljTWV0aG9kO1xyXG5cclxuLy8gdHlwZSBDb25jcmV0ZUVsZW1lbnRUU01vcnBoVHlwZSA9IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbjtcclxuXHJcbmV4cG9ydCB0eXBlIEludm9jYWJsZVR5cGUgPSBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBBcnJvd0Z1bmN0aW9uO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVudGl0eURpY3Rpb25hcnkge1xyXG4gICAgXHJcbiAgICBwdWJsaWMgZmFtaXhSZXAgPSBuZXcgRmFtaXhSZXBvc2l0b3J5KCk7XHJcbiAgICBwcml2YXRlIGZteEFsaWFzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZhbWl4LkFsaWFzPigpOyAvLyBNYXBzIHRoZSBhbGlhcyBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxyXG4gICAgcHJpdmF0ZSBmbXhDbGFzc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5DbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNDbGFzcz4oKTsgLy8gTWFwcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXHJcbiAgICBwcml2YXRlIGZteEludGVyZmFjZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5JbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlPigpOyAvLyBNYXBzIHRoZSBpbnRlcmZhY2UgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgZm14TW9kdWxlTWFwID0gbmV3IE1hcDxNb2R1bGVEZWNsYXJhdGlvbiwgRmFtaXguTW9kdWxlPigpOyAvLyBNYXBzIHRoZSBuYW1lc3BhY2UgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgZm14RmlsZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5TY3JpcHRFbnRpdHkgfCBGYW1peC5Nb2R1bGU+KCk7IC8vIE1hcHMgdGhlIHNvdXJjZSBmaWxlIG5hbWVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXHJcbiAgICBwcml2YXRlIGZteFR5cGVNYXAgPSBuZXcgTWFwPFRTTW9ycGhUeXBlRGVjbGFyYXRpb24sIEZhbWl4LlR5cGUgfCBGYW1peC5QYXJhbWV0ZXJUeXBlPigpOyAvLyBNYXBzIHRoZSB0eXBlcyBkZWNsYXJhdGlvbnMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgZm14UHJpbWl0aXZlVHlwZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5QcmltaXRpdmVUeXBlPigpOyAvLyBNYXBzIHRoZSBwcmltaXRpdmUgdHlwZSBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxyXG4gICAgcHJpdmF0ZSBmbXhGdW5jdGlvbkFuZE1ldGhvZE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5GdW5jdGlvbiB8IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbiB8IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LlBhcmFtZXRyaWNNZXRob2Q+OyAvLyBNYXBzIHRoZSBmdW5jdGlvbiBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxyXG4gICAgcHJpdmF0ZSBmbXhBcnJvd0Z1bmN0aW9uTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZhbWl4LkFycm93RnVuY3Rpb24+OyAvLyBNYXBzIHRoZSBmdW5jdGlvbiBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxyXG4gICAgcHJpdmF0ZSBmbXhQYXJhbWV0ZXJNYXAgPSBuZXcgTWFwPFBhcmFtZXRlckRlY2xhcmF0aW9uLCBGYW1peC5QYXJhbWV0ZXI+KCk7IC8vIE1hcHMgdGhlIHBhcmFtZXRlcnMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgZm14VmFyaWFibGVNYXAgPSBuZXcgTWFwPFZhcmlhYmxlRGVjbGFyYXRpb24sIEZhbWl4LlZhcmlhYmxlPigpOyAvLyBNYXBzIHRoZSB2YXJpYWJsZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgZm14SW1wb3J0Q2xhdXNlTWFwID0gbmV3IE1hcDxJbXBvcnREZWNsYXJhdGlvbiB8IEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uLCBGYW1peC5JbXBvcnRDbGF1c2U+KCk7IC8vIE1hcHMgdGhlIGltcG9ydCBjbGF1c2VzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXHJcbiAgICBwcml2YXRlIGZteEVudW1NYXAgPSBuZXcgTWFwPEVudW1EZWNsYXJhdGlvbiwgRmFtaXguRW51bT4oKTsgLy8gTWFwcyB0aGUgZW51bSBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxyXG4gICAgcHJpdmF0ZSBmbXhJbmhlcml0YW5jZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5Jbmhlcml0YW5jZT4oKTsgLy8gTWFwcyB0aGUgaW5oZXJpdGFuY2UgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgVU5LTk9XTl9WQUxVRSA9ICcodW5rbm93biBkdWUgdG8gcGFyc2luZyBlcnJvciknOyAvLyBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gYSBuYW1lIGlzIG5vdCB1c2FibGVcclxuICAgIHB1YmxpYyBmbXhFbGVtZW50T2JqZWN0TWFwID0gbmV3IE1hcDxGYW1peC5FbnRpdHksVFNNb3JwaE9iamVjdFR5cGU+KCk7XHJcbiAgICBwdWJsaWMgdHNNb3JwaEVsZW1lbnRPYmplY3RNYXAgPSBuZXcgTWFwPFRTTW9ycGhPYmplY3RUeXBlLEZhbWl4LkVudGl0eT4oKTtcclxuICAgICAgICAgICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmZhbWl4UmVwLnNldEZteEVsZW1lbnRPYmplY3RNYXAodGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwKTsgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkU291cmNlQW5jaG9yKGZteDogRmFtaXguU291cmNlZEVudGl0eSwgbm9kZTogVFNNb3JwaE9iamVjdFR5cGUpOiBGYW1peC5JbmRleGVkRmlsZUFuY2hvciB7XHJcbiAgICAgICAgY29uc3Qgc291cmNlQW5jaG9yOiBGYW1peC5JbmRleGVkRmlsZUFuY2hvciA9IG5ldyBGYW1peC5JbmRleGVkRmlsZUFuY2hvcigpO1xyXG4gICAgICAgIGxldCBzb3VyY2VTdGFydCwgc291cmNlRW5kOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKGZteCAmJiBub2RlKSB7XHJcbiAgICAgICAgICAgIC8vIGZpbmQgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIG9mIHRoZSBzb3VyY2UgZWxlbWVudFxyXG4gICAgICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgQ29tbWVudFJhbmdlKSkge1xyXG4gICAgICAgICAgICAgICAgc291cmNlU3RhcnQgPSBub2RlLmdldFN0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2VFbmQgPSBub2RlLmdldEVuZCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc291cmNlU3RhcnQgPSBub2RlLmdldFBvcygpO1xyXG4gICAgICAgICAgICAgICAgc291cmNlRW5kID0gbm9kZS5nZXRFbmQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIGlmIChjb25maWcuZXhwZWN0R3JhcGhlbWVzKSB7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgbG9naWMgaGFuZGxlcyB0aGUgY2FzZSBvZiBtdWx0aS1jb2RlIHBvaW50IGNoYXJhY3RlcnMgKGUuZy4gZW1vamkpIGluIHRoZSBzb3VyY2UgdGV4dC5cclxuICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgUGhhcm8vU21hbGx0YWxrIHRyZWF0cyBtdWx0aS1jb2RlIHBvaW50IGNoYXJhY3RlcnMgYXMgYSBzaW5nbGUgY2hhcmFjdGVyLCBcclxuICAgICAgICAgICAgICAgICAqIGJ1dCBKYXZhU2NyaXB0IHRyZWF0cyB0aGVtIGFzIG11bHRpcGxlIGNoYXJhY3RlcnMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnNcclxuICAgICAgICAgICAgICAgICAqIG9mIGEgc291cmNlIGVsZW1lbnQgaW4gUGhhcm8vU21hbGx0YWxrIHdpbGwgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIG9mIHRoZVxyXG4gICAgICAgICAgICAgICAgICogc2FtZSBzb3VyY2UgZWxlbWVudCBpbiBKYXZhU2NyaXB0LiBUaGlzIGxvZ2ljIGZpbmRzIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGUgc291cmNlXHJcbiAgICAgICAgICAgICAgICAgKiBlbGVtZW50IGluIEphdmFTY3JpcHQgYW5kIHRoZW4gdXNlcyB0aG9zZSBwb3NpdGlvbnMgdG8gc2V0IHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGVcclxuICAgICAgICAgICAgICAgICAqIEZhbWl4IGluZGV4IGZpbGUgYW5jaG9yLlxyXG4gICAgICAgICAgICAgICAgICogSXQgZGVwZW5kcyBvbiBjb2RlIGluIHRoZSAnZ3JhcGhlbWUtc3BsaXR0ZXInIHBhY2thZ2UgaW4gbnBtLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzcGxpdHRlciA9IG5ldyBHcmFwaGVtZVNwbGl0dGVyKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlVGV4dCA9IG5vZGUuZ2V0U291cmNlRmlsZSgpLmdldEZ1bGxUZXh0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNHcmFwaGVtZUNsdXN0ZXJzID0gc3BsaXR0ZXIuY291bnRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQpID4gMTtcclxuICAgICAgICAgICAgICAgIGlmIChoYXNHcmFwaGVtZUNsdXN0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudFRleHQgPSBzb3VyY2VGaWxlVGV4dC5zdWJzdHJpbmcoc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMgPSBzcGxpdHRlci5zcGxpdEdyYXBoZW1lcyhzb3VyY2VFbGVtZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZVRleHRHcmFwaGVtZXMgPSBzcGxpdHRlci5zcGxpdEdyYXBoZW1lcyhzb3VyY2VGaWxlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZHcmFwaGVtZUNsdXN0ZXJzQmVmb3JlU3RhcnQgPSBzcGxpdHRlci5jb3VudEdyYXBoZW1lcyhzb3VyY2VGaWxlVGV4dC5zdWJzdHJpbmcoMCwgc291cmNlU3RhcnQpKTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBzdGFydCBvZiB0aGUgc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMgYXJyYXkgaW4gdGhlIHNvdXJjZUZpbGVUZXh0R3JhcGhlbWVzIGFycmF5XHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlU3RhcnQgPSBIZWxwZXJzLmluZGV4T2ZTcGxpdEFycmF5KHtzZWFyY2hBcnJheTogc291cmNlRmlsZVRleHRHcmFwaGVtZXMsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEFycmF5OiBzb3VyY2VFbGVtZW50VGV4dEdyYXBoZW1lcywgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHNvdXJjZVN0YXJ0IC0gbnVtYmVyT2ZHcmFwaGVtZUNsdXN0ZXJzQmVmb3JlU3RhcnR9KTtcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VFbmQgPSBzb3VyY2VTdGFydCArIHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFRoZSArMSBpcyBiZWNhdXNlIHRoZSBzb3VyY2UgYW5jaG9yIChQaGFybykgaXMgMS1iYXNlZCwgYnV0IHRzLW1vcnBoIGlzIDAtYmFzZWRcclxuICAgICAgICAgICAgc291cmNlQW5jaG9yLnN0YXJ0UG9zID0gc291cmNlU3RhcnQgKyAxO1xyXG4gICAgICAgICAgICBzb3VyY2VBbmNob3IuZW5kUG9zID0gc291cmNlRW5kICsgMTtcclxuXHJcbiAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpLmdldEZpbGVQYXRoKCkgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcclxuICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNvdXJjZUFuY2hvci5lbGVtZW50ID0gZm14O1xyXG4gICAgICAgICAgICBzb3VyY2VBbmNob3IuZmlsZU5hbWUgPSBmaWxlTmFtZTtcclxuICAgICAgICAgICAgZm14LnNvdXJjZUFuY2hvciA9IHNvdXJjZUFuY2hvcjtcclxuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KHNvdXJjZUFuY2hvcik7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc291cmNlQW5jaG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZXMgYSBGYW1peCBpbmRleCBmaWxlIGFuY2hvclxyXG4gICAgICogQHBhcmFtIHNvdXJjZUVsZW1lbnQgQSBzb3VyY2UgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIGZhbWl4RWxlbWVudCBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHNvdXJjZSBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYWtlRmFtaXhJbmRleEZpbGVBbmNob3Ioc291cmNlRWxlbWVudDogVFNNb3JwaE9iamVjdFR5cGUsIGZhbWl4RWxlbWVudDogRmFtaXguU291cmNlZEVudGl0eSk6IHZvaWQge1xyXG4gICAgICAgIC8vIEZhbWl4LkNvbW1lbnQgaXMgbm90IGEgbmFtZWQgZW50aXR5IChkb2VzIG5vdCBoYXZlIGEgZnVsbHlRdWFsaWZpZWROYW1lKVxyXG4gICAgICAgIGlmICghKGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LkNvbW1lbnQpKSB7ICAvLyBtdXN0IGJlIGEgbmFtZWQgZW50aXR5XHJcbiAgICAgICAgICAgIC8vIGluc2FuaXR5IGNoZWNrOiBuYW1lZCBlbnRpdGllcyBzaG91bGQgaGF2ZSBmdWxseVF1YWxpZmllZE5hbWVcclxuICAgICAgICAgICAgY29uc3QgZnVsbHlRdWFsaWZpZWROYW1lID0gKGZhbWl4RWxlbWVudCBhcyBGYW1peC5OYW1lZEVudGl0eSkuZnVsbHlRdWFsaWZpZWROYW1lO1xyXG4gICAgICAgICAgICBpZiAoIWZ1bGx5UXVhbGlmaWVkTmFtZSB8fCBmdWxseVF1YWxpZmllZE5hbWUgPT09IHRoaXMuVU5LTk9XTl9WQUxVRSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCBlbGVtZW50ICR7ZmFtaXhFbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9IGhhcyBubyB2YWxpZCBmdWxseVF1YWxpZmllZE5hbWUuYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIm1ha2luZyBpbmRleCBmaWxlIGFuY2hvciBmb3IgJ1wiICsgc291cmNlRWxlbWVudD8uZ2V0VGV4dCgpICsgXCInIHdpdGggZmFtaXhFbGVtZW50IFwiICsgZmFtaXhFbGVtZW50LmdldEpTT04oKSk7XHJcbiAgICAgICAgY29uc3QgZm14SW5kZXhGaWxlQW5jaG9yID0gbmV3IEZhbWl4LkluZGV4ZWRGaWxlQW5jaG9yKCk7XHJcbiAgICAgICAgZm14SW5kZXhGaWxlQW5jaG9yLmVsZW1lbnQgPSBmYW1peEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmYW1peEVsZW1lbnQsIHNvdXJjZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAoc291cmNlRWxlbWVudCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGhQcm9qZWN0ID0gdGhpcy5mYW1peFJlcC5nZXRBYnNvbHV0ZVBhdGgoKTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5ub3JtYWxpemUoc291cmNlRWxlbWVudC5nZXRTb3VyY2VGaWxlKCkuZ2V0RmlsZVBhdGgoKSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbk5vZGVNb2R1bGVzID0gYWJzb2x1dGVQYXRoLmluZGV4T2YoJ25vZGVfbW9kdWxlcycpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHBhdGhJblByb2plY3Q6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgICAgICAgICBpZiAocG9zaXRpb25Ob2RlTW9kdWxlcyAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhGcm9tTm9kZU1vZHVsZXMgPSBhYnNvbHV0ZVBhdGguc3Vic3RyaW5nKHBvc2l0aW9uTm9kZU1vZHVsZXMpO1xyXG4gICAgICAgICAgICAgICAgcGF0aEluUHJvamVjdCA9IHBhdGhGcm9tTm9kZU1vZHVsZXM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoSW5Qcm9qZWN0ID0gdGhpcy5jb252ZXJ0VG9SZWxhdGl2ZVBhdGgoYWJzb2x1dGVQYXRoLCBhYnNvbHV0ZVBhdGhQcm9qZWN0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcmV2ZXJ0IGFueSBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMgKHBhdGgubm9ybWFsaXplIG9uIHdpbmRvd3MgaW50cm9kdWNlcyB0aGVtKVxyXG4gICAgICAgICAgICBwYXRoSW5Qcm9qZWN0ID0gcGF0aEluUHJvamVjdC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwYXRoSW5Qcm9qZWN0LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoSW5Qcm9qZWN0ID0gcGF0aEluUHJvamVjdC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZteEluZGV4RmlsZUFuY2hvci5maWxlTmFtZSA9IHBhdGhJblByb2plY3Q7XHJcbiAgICAgICAgICAgIGxldCBzb3VyY2VTdGFydCwgc291cmNlRW5kXHJcbiAgICAgICAgICAgIC8vICxzb3VyY2VMaW5lU3RhcnQsIHNvdXJjZUxpbmVFbmRcclxuICAgICAgICAgICAgOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGlmICghKHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBDb21tZW50UmFuZ2UpKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2VTdGFydCA9IHNvdXJjZUVsZW1lbnQuZ2V0U3RhcnQoKTtcclxuICAgICAgICAgICAgICAgIHNvdXJjZUVuZCA9IHNvdXJjZUVsZW1lbnQuZ2V0RW5kKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBzb3VyY2VMaW5lU3RhcnQgPSBzb3VyY2VFbGVtZW50LmdldFN0YXJ0TGluZU51bWJlcigpO1xyXG4gICAgICAgICAgICAgICAgLy8gc291cmNlTGluZUVuZCA9IHNvdXJjZUVsZW1lbnQuZ2V0RW5kTGluZU51bWJlcigpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc291cmNlU3RhcnQgPSBzb3VyY2VFbGVtZW50LmdldFBvcygpO1xyXG4gICAgICAgICAgICAgICAgc291cmNlRW5kID0gc291cmNlRWxlbWVudC5nZXRFbmQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29uZmlnLmV4cGVjdEdyYXBoZW1lcykge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGxvZ2ljIGhhbmRsZXMgdGhlIGNhc2Ugb2YgbXVsdGktY29kZSBwb2ludCBjaGFyYWN0ZXJzIChlLmcuIGVtb2ppKSBpbiB0aGUgc291cmNlIHRleHQuXHJcbiAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIFBoYXJvL1NtYWxsdGFsayB0cmVhdHMgbXVsdGktY29kZSBwb2ludCBjaGFyYWN0ZXJzIGFzIGEgc2luZ2xlIGNoYXJhY3RlciwgXHJcbiAgICAgICAgICAgICAgICAgKiBidXQgSmF2YVNjcmlwdCB0cmVhdHMgdGhlbSBhcyBtdWx0aXBsZSBjaGFyYWN0ZXJzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zXHJcbiAgICAgICAgICAgICAgICAgKiBvZiBhIHNvdXJjZSBlbGVtZW50IGluIFBoYXJvL1NtYWxsdGFsayB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGVcclxuICAgICAgICAgICAgICAgICAqIHNhbWUgc291cmNlIGVsZW1lbnQgaW4gSmF2YVNjcmlwdC4gVGhpcyBsb2dpYyBmaW5kcyB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgb2YgdGhlIHNvdXJjZVxyXG4gICAgICAgICAgICAgICAgICogZWxlbWVudCBpbiBKYXZhU2NyaXB0IGFuZCB0aGVuIHVzZXMgdGhvc2UgcG9zaXRpb25zIHRvIHNldCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgb2YgdGhlXHJcbiAgICAgICAgICAgICAgICAgKiBGYW1peCBpbmRleCBmaWxlIGFuY2hvci5cclxuICAgICAgICAgICAgICAgICAqIEl0IGRlcGVuZHMgb24gY29kZSBpbiB0aGUgJ2dyYXBoZW1lLXNwbGl0dGVyJyBwYWNrYWdlIGluIG5wbS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgR3JhcGhlbWVTcGxpdHRlcigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZVRleHQgPSBzb3VyY2VFbGVtZW50LmdldFNvdXJjZUZpbGUoKS5nZXRGdWxsVGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzR3JhcGhlbWVDbHVzdGVycyA9IHNwbGl0dGVyLmNvdW50R3JhcGhlbWVzKHNvdXJjZUZpbGVUZXh0KSA+IDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGFzR3JhcGhlbWVDbHVzdGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUVsZW1lbnRUZXh0ID0gc291cmNlRmlsZVRleHQuc3Vic3RyaW5nKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzID0gc3BsaXR0ZXIuc3BsaXRHcmFwaGVtZXMoc291cmNlRWxlbWVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVUZXh0R3JhcGhlbWVzID0gc3BsaXR0ZXIuc3BsaXRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mR3JhcGhlbWVDbHVzdGVyc0JlZm9yZVN0YXJ0ID0gc3BsaXR0ZXIuY291bnRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQuc3Vic3RyaW5nKDAsIHNvdXJjZVN0YXJ0KSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzIGFycmF5IGluIHRoZSBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcyBhcnJheVxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gSGVscGVycy5pbmRleE9mU3BsaXRBcnJheSh7c2VhcmNoQXJyYXk6IHNvdXJjZUZpbGVUZXh0R3JhcGhlbWVzLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRBcnJheTogc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzb3VyY2VTdGFydCAtIG51bWJlck9mR3JhcGhlbWVDbHVzdGVyc0JlZm9yZVN0YXJ0fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRW5kID0gc291cmNlU3RhcnQgKyBzb3VyY2VFbGVtZW50VGV4dEdyYXBoZW1lcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIG5vdGU6IHRoZSArMSBpcyBiZWNhdXNlIHRoZSBzb3VyY2UgYW5jaG9yIGlzIDEtYmFzZWQsIGJ1dCB0cy1tb3JwaCBpcyAwLWJhc2VkXHJcbiAgICAgICAgICAgIGZteEluZGV4RmlsZUFuY2hvci5zdGFydFBvcyA9IHNvdXJjZVN0YXJ0ICsgMTtcclxuICAgICAgICAgICAgZm14SW5kZXhGaWxlQW5jaG9yLmVuZFBvcyA9IHNvdXJjZUVuZCArIDE7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiAoIShmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5JbXBvcnRDbGF1c2UgfHwgZmFtaXhFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguQWNjZXNzIHx8IGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlJlZmVyZW5jZSB8fCBmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5JbnZvY2F0aW9uIHx8IGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LkluaGVyaXRhbmNlKSAmJiAhKGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LkNvbW1lbnQpICYmICEoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIENvbW1lbnRSYW5nZSkgJiYgIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgSWRlbnRpZmllcikgJiYgIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgSW1wb3J0U3BlY2lmaWVyKSAmJiAhKHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpKSB7XHJcbiAgICAgICAgICAgIC8vICAgIGluaXRGUU4oc291cmNlRWxlbWVudCwgZmFtaXhFbGVtZW50KTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHNvdXJjZUVsZW1lbnQgaXMgbnVsbFxyXG4gICAgICAgICAgICBsb2dnZXIud2FybihcInNvdXJjZUVsZW1lbnQgaXMgbnVsbCBmb3IgZmFtaXhFbGVtZW50IFwiICsgZmFtaXhFbGVtZW50LmdldEpTT04oKSk7XHJcbiAgICAgICAgICAgIGZteEluZGV4RmlsZUFuY2hvci5maWxlTmFtZSA9IFwidW5rbm93blwiO1xyXG4gICAgICAgICAgICBmbXhJbmRleEZpbGVBbmNob3Iuc3RhcnRQb3MgPSAwO1xyXG4gICAgICAgICAgICBmbXhJbmRleEZpbGVBbmNob3IuZW5kUG9zID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhJbmRleEZpbGVBbmNob3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggc2NyaXB0IGVudGl0eSBvciBtb2R1bGVcclxuICAgICAqIEBwYXJhbSBmIEEgc291cmNlIGZpbGVcclxuICAgICAqIEBwYXJhbSBpc01vZHVsZSBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgc291cmNlIGZpbGUgaXMgYSBtb2R1bGVcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgc291cmNlIGZpbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhGaWxlKGY6IFNvdXJjZUZpbGUsIGlzTW9kdWxlOiBib29sZWFuKTogRmFtaXguU2NyaXB0RW50aXR5IHwgRmFtaXguTW9kdWxlIHtcclxuICAgICAgICBsZXQgZm14RmlsZTogRmFtaXguU2NyaXB0RW50aXR5OyAvLyB8IEZhbWl4Lk1vZHVsZTtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmLmdldEJhc2VOYW1lKCk7XHJcbiAgICAgICAgY29uc3QgZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSA9IGYuZ2V0RmlsZVBhdGgoKTtcclxuICAgICAgICBjb25zdCBmb3VuZEZpbGVOYW1lID0gdGhpcy5mbXhGaWxlTWFwLmdldChmdWxseVF1YWxpZmllZEZpbGVuYW1lKTtcclxuICAgICAgICBpZiAoIWZvdW5kRmlsZU5hbWUpIHtcclxuICAgICAgICAgICAgaWYgKGlzTW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgICBmbXhGaWxlID0gbmV3IEZhbWl4Lk1vZHVsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm14RmlsZSA9IG5ldyBGYW1peC5TY3JpcHRFbnRpdHkoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmbXhGaWxlLm5hbWUgPSBmaWxlTmFtZTtcclxuICAgICAgICAgICAgZm14RmlsZS5udW1iZXJPZkxpbmVzT2ZUZXh0ID0gZi5nZXRFbmRMaW5lTnVtYmVyKCkgLSBmLmdldFN0YXJ0TGluZU51bWJlcigpO1xyXG4gICAgICAgICAgICBmbXhGaWxlLm51bWJlck9mQ2hhcmFjdGVycyA9IGYuZ2V0RnVsbFRleHQoKS5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpbml0RlFOKGYsIGZteEZpbGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoZiwgZm14RmlsZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZteEZpbGVNYXAuc2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUsIGZteEZpbGUpO1xyXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14RmlsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmbXhGaWxlID0gZm91bmRGaWxlTmFtZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14RmlsZSxmKTtcclxuICAgICAgICByZXR1cm4gZm14RmlsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IE1vZHVsZVxyXG4gICAgICogQHBhcmFtIG1vZHVsZURlY2xhcmF0aW9uIEEgbW9kdWxlXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIG1vZHVsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peE1vZHVsZShtb2R1bGVEZWNsYXJhdGlvbjogTW9kdWxlRGVjbGFyYXRpb24pOiBGYW1peC5Nb2R1bGUge1xyXG4gICAgICAgIGlmICh0aGlzLmZteE1vZHVsZU1hcC5oYXMobW9kdWxlRGVjbGFyYXRpb24pKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJNb2R1bGUgPSB0aGlzLmZteE1vZHVsZU1hcC5nZXQobW9kdWxlRGVjbGFyYXRpb24pO1xyXG4gICAgICAgICAgICBpZiAock1vZHVsZSkgeyBcclxuICAgICAgICAgICAgICAgcmV0dXJuIHJNb2R1bGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhbWl4IG1vZHVsZSAke21vZHVsZURlY2xhcmF0aW9uLmdldE5hbWUoKX0gaXMgbm90IGZvdW5kIGluIHRoZSBtb2R1bGUgbWFwLmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmbXhNb2R1bGUgPSBuZXcgRmFtaXguTW9kdWxlKCk7XHJcbiAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IG1vZHVsZURlY2xhcmF0aW9uLmdldE5hbWUoKTtcclxuICAgICAgICBmbXhNb2R1bGUubmFtZSA9IG1vZHVsZU5hbWU7XHJcbiAgICAgICAgZm14TW9kdWxlLmlzQW1iaWVudCA9IGlzQW1iaWVudChtb2R1bGVEZWNsYXJhdGlvbik7XHJcbiAgICAgICAgZm14TW9kdWxlLmlzTmFtZXNwYWNlID0gaXNOYW1lc3BhY2UobW9kdWxlRGVjbGFyYXRpb24pO1xyXG4gICAgICAgIGZteE1vZHVsZS5pc01vZHVsZSA9ICFmbXhNb2R1bGUuaXNOYW1lc3BhY2UgJiYgIWZteE1vZHVsZS5pc0FtYmllbnQ7XHJcblxyXG4gICAgICAgIGluaXRGUU4obW9kdWxlRGVjbGFyYXRpb24sIGZteE1vZHVsZSk7XHJcbiAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IobW9kdWxlRGVjbGFyYXRpb24sIGZteE1vZHVsZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZm14TW9kdWxlTWFwLnNldChtb2R1bGVEZWNsYXJhdGlvbiwgZm14TW9kdWxlKTtcclxuXHJcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteE1vZHVsZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14TW9kdWxlLG1vZHVsZURlY2xhcmF0aW9uKTtcclxuICAgICAgICByZXR1cm4gZm14TW9kdWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGFsaWFzXHJcbiAgICAgKiBAcGFyYW0gYSBBbiBhbGlhc1xyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBhbGlhc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhBbGlhcyhhOiBUeXBlQWxpYXNEZWNsYXJhdGlvbik6IEZhbWl4LkFsaWFzIHtcclxuICAgICAgICBsZXQgZm14QWxpYXM6IEZhbWl4LkFsaWFzO1xyXG4gICAgICAgIGNvbnN0IGFsaWFzTmFtZSA9IGEuZ2V0TmFtZSgpO1xyXG4gICAgICAgIC8vY29uc3QgYWxpYXNGdWxseVF1YWxpZmllZE5hbWUgPSBhLmdldFR5cGUoKS5nZXRUZXh0KCk7IC8vIEZRTkZ1bmN0aW9ucy5nZXRGUU4oYSk7XHJcbiAgICAgICAgY29uc3QgYWxpYXNGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGEpO1xyXG4gICAgICAgIGNvbnN0IGZvdW5kQWxpYXMgPSB0aGlzLmZteEFsaWFzTWFwLmdldChhbGlhc0Z1bGx5UXVhbGlmaWVkTmFtZSk7XHJcbiAgICAgICAgaWYgKCFmb3VuZEFsaWFzKSB7XHJcbiAgICAgICAgICAgIGZteEFsaWFzID0gbmV3IEZhbWl4LkFsaWFzKCk7XHJcbiAgICAgICAgICAgIGZteEFsaWFzLm5hbWUgPSBhLmdldE5hbWUoKTtcclxuICAgICAgICAgICAgY29uc3QgYWxpYXNOYW1lV2l0aEdlbmVyaWNzID0gYWxpYXNOYW1lICsgKGEuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPyAoXCI8XCIgKyBhLmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKHRwID0+IHRwLmdldE5hbWUoKSkuam9pbihcIiwgXCIpICsgXCI+XCIpIDogXCJcIik7XHJcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgPiBOT1RFOiBhbGlhcyAke2FsaWFzTmFtZX0gaGFzIGZ1bGx5IHF1YWxpZmllZCBuYW1lICR7YWxpYXNGdWxseVF1YWxpZmllZE5hbWV9IGFuZCBuYW1lIHdpdGggZ2VuZXJpY3MgJHthbGlhc05hbWVXaXRoR2VuZXJpY3N9LmApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoYWxpYXNOYW1lV2l0aEdlbmVyaWNzLCBhKTtcclxuICAgICAgICAgICAgZm14QWxpYXMuYWxpYXNlZEVudGl0eSA9IGZteFR5cGU7XHJcbiAgICAgICAgICAgIGluaXRGUU4oYSwgZm14QWxpYXMpO1xyXG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihhLCBmbXhBbGlhcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZteEFsaWFzTWFwLnNldChhbGlhc0Z1bGx5UXVhbGlmaWVkTmFtZSwgZm14QWxpYXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEFsaWFzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZteEFsaWFzID0gZm91bmRBbGlhcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhBbGlhcyxhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZteEFsaWFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggY2xhc3Mgb3IgcGFyYW1ldGVyaXphYmxlIGNsYXNzXHJcbiAgICAgKiBAcGFyYW0gY2xzIEEgY2xhc3NcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY2xhc3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhDbGFzcyhjbHM6IENsYXNzRGVjbGFyYXRpb24pOiBGYW1peC5DbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNDbGFzcyB7XHJcbiAgICAgICAgbGV0IGZteENsYXNzOiBGYW1peC5DbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNDbGFzcztcclxuICAgICAgICBjb25zdCBpc0Fic3RyYWN0ID0gY2xzLmlzQWJzdHJhY3QoKTtcclxuICAgICAgICBjb25zdCBjbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oY2xzKTtcclxuICAgICAgICBjb25zdCBjbHNOYW1lID0gY2xzLmdldE5hbWUoKSB8fCB0aGlzLlVOS05PV05fVkFMVUU7XHJcbiAgICAgICAgY29uc3QgaXNHZW5lcmljID0gY2xzLmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IGZvdW5kQ2xhc3MgPSB0aGlzLmZteENsYXNzTWFwLmdldChjbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZSk7XHJcbiAgICAgICAgaWYgKCFmb3VuZENsYXNzKSB7XHJcbiAgICAgICAgICAgIGlmIChpc0dlbmVyaWMpIHtcclxuICAgICAgICAgICAgICAgIGZteENsYXNzID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNDbGFzcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm14Q2xhc3MgPSBuZXcgRmFtaXguQ2xhc3MoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm14Q2xhc3MubmFtZSA9IGNsc05hbWU7XHJcbiAgICAgICAgICAgIGluaXRGUU4oY2xzLCBmbXhDbGFzcyk7XHJcbiAgICAgICAgICAgIC8vIGZteENsYXNzLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGNsYXNzRnVsbHlRdWFsaWZpZWROYW1lO1xyXG4gICAgICAgICAgICBmbXhDbGFzcy5pc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGNscywgZm14Q2xhc3MpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mbXhDbGFzc01hcC5zZXQoY2xhc3NGdWxseVF1YWxpZmllZE5hbWUsIGZteENsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhDbGFzcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteENsYXNzLGNscyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmbXhDbGFzcyA9IGZvdW5kQ2xhc3M7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZm14Q2xhc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBpbnRlcmZhY2Ugb3IgcGFyYW1ldGVyaXphYmxlIGludGVyZmFjZVxyXG4gICAgICogQHBhcmFtIGludGVyIEFuIGludGVyZmFjZVxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBpbnRlcmZhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoaW50ZXI6IEludGVyZmFjZURlY2xhcmF0aW9uKTogRmFtaXguSW50ZXJmYWNlIHwgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSB7XHJcblxyXG4gICAgICAgIGxldCBmbXhJbnRlcmZhY2U6IEZhbWl4LkludGVyZmFjZSB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2U7XHJcbiAgICAgICAgY29uc3QgaW50ZXJOYW1lID0gaW50ZXIuZ2V0TmFtZSgpO1xyXG4gICAgICAgIGNvbnN0IGludGVyRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihpbnRlcik7XHJcbiAgICAgICAgY29uc3QgZm91bmRJbnRlcmZhY2UgPSB0aGlzLmZteEludGVyZmFjZU1hcC5nZXQoaW50ZXJGdWxseVF1YWxpZmllZE5hbWUpO1xyXG4gICAgICAgIGlmICghZm91bmRJbnRlcmZhY2UpIHtcclxuICAgICAgICAgICAgY29uc3QgaXNHZW5lcmljID0gaW50ZXIuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlmIChpc0dlbmVyaWMpIHtcclxuICAgICAgICAgICAgICAgIGZteEludGVyZmFjZSA9IG5ldyBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmbXhJbnRlcmZhY2UgPSBuZXcgRmFtaXguSW50ZXJmYWNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZteEludGVyZmFjZS5uYW1lID0gaW50ZXJOYW1lO1xyXG4gICAgICAgICAgICBpbml0RlFOKGludGVyLCBmbXhJbnRlcmZhY2UpO1xyXG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihpbnRlciwgZm14SW50ZXJmYWNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm14SW50ZXJmYWNlTWFwLnNldChpbnRlckZ1bGx5UXVhbGlmaWVkTmFtZSwgZm14SW50ZXJmYWNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhJbnRlcmZhY2UpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhJbnRlcmZhY2UsaW50ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm14SW50ZXJmYWNlID0gZm91bmRJbnRlcmZhY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbXhJbnRlcmZhY2U7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IGNvbmNyZXRlIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSBjb25jcmV0ZUVsZW1lbnQgQSBwYXJhbWV0cmljIEVsZW1lbnQgICBcclxuICAgICAqIEBwYXJhbSBjb25jcmV0ZUVsZW1lbnREZWNsYXJhdGlvbiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvblxyXG4gICAgICogQHBhcmFtIGNvbmNyZXRlQXJndW1lbnRzIGNvbmNyZXRlIGFyZ3VtZW50c1xyXG4gICAgICogQHJldHVybnMgQSBwYXJhbWV0cmljIEVsZW1lbnQgIFxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peENvbmNyZXRlRWxlbWVudChjb25jcmV0ZUVsZW1lbnQgOiBQYXJhbWV0cmljVmFyaWFudFR5cGUsIFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3JldGVFbGVtZW50RGVjbGFyYXRpb24gOiBDb25jcmV0ZUVsZW1lbnRUU01vcnBoVHlwZSwgXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jcmV0ZUFyZ3VtZW50czogVHlwZU5vZGVbXSk6IFBhcmFtZXRyaWNWYXJpYW50VHlwZSB7XHJcbiAgICAgICAgXHJcbiAgICAvLyAgICAgbGV0IGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUgPSBjb25jcmV0ZUVsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lO1xyXG4gICAgLy8gICAgIGxldCBwYXJhbXMgPSBcIlwiO1xyXG4gICAgICAgIFxyXG4gICAgLy8gICAgIGNvbmNyZXRlQXJndW1lbnRzLm1hcCgocGFyYW0pID0+IHtcclxuICAgIC8vICAgICAgICAgcGFyYW1zID0gcGFyYW1zK3BhcmFtLmdldFRleHQoKSsnLCc7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAvLyAgICAgcGFyYW1zID0gcGFyYW1zLnN1YnN0cmluZygwLCBwYXJhbXMubGVuZ3RoIC0gMSlcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgLy8gICAgIGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUgPSBIZWxwZXJzLnJlcGxhY2VMYXN0QmV0d2VlblRhZ3MoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSxwYXJhbXMpO1xyXG5cclxuICAgIC8vICAgICBsZXQgY29uY0VsZW1lbnQ6IFBhcmFtZXRyaWNWYXJpYW50VHlwZTtcclxuXHJcbiAgICAvLyAgICAgaWYgKCF0aGlzLmZteEludGVyZmFjZU1hcC5oYXMoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSkgJiYgXHJcbiAgICAvLyAgICAgICAgICF0aGlzLmZteENsYXNzTWFwLmhhcyhmdWxseVF1YWxpZmllZEZpbGVuYW1lKSAmJiBcclxuICAgIC8vICAgICAgICAgIXRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuaGFzKGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpKXtcclxuICAgIC8vICAgICAgICAgY29uY0VsZW1lbnQgPSBfLmNsb25lRGVlcChjb25jcmV0ZUVsZW1lbnQpOyBcclxuICAgIC8vICAgICAgICAgY29uY0VsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lID0gZnVsbHlRdWFsaWZpZWRGaWxlbmFtZTtcclxuICAgIC8vICAgICAgICAgY29uY0VsZW1lbnQuY2xlYXJHZW5lcmljUGFyYW1ldGVycygpO1xyXG4gICAgLy8gICAgICAgICBjb25jcmV0ZUFyZ3VtZW50cy5tYXAoKHBhcmFtKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZVR5cGUocGFyYW0pO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uY0VsZW1lbnQuYWRkQ29uY3JldGVQYXJhbWV0ZXIocGFyYW1ldGVyKTtcclxuICAgIC8vICAgICAgICAgfSlcclxuICAgICAgICAgICAgXHJcbiAgICAvLyAgICAgICAgIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljQ2xhc3MpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuZm14Q2xhc3NNYXAuc2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUsIGNvbmNFbGVtZW50IGFzIEZhbWl4LlBhcmFtZXRyaWNDbGFzcyk7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5mbXhJbnRlcmZhY2VNYXAuc2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUsIGNvbmNFbGVtZW50IGFzIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UpO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2UgaWYgKGNvbmNyZXRlRWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5zZXQoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSwgY29uY0VsZW1lbnQgYXMgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uKTtcclxuICAgIC8vICAgICAgICAgfSBlbHNlIHsgLy8gaWYgKGNvbmNyZXRlRWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRyaWNNZXRob2QpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuc2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUsIGNvbmNFbGVtZW50IGFzIEZhbWl4LlBhcmFtZXRyaWNNZXRob2QpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChjb25jRWxlbWVudCk7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoY29uY0VsZW1lbnQsY29uY3JldGVFbGVtZW50RGVjbGFyYXRpb24pO1xyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljQ2xhc3MpIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvbmNFbGVtZW50ID0gdGhpcy5mbXhDbGFzc01hcC5nZXQoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSkgYXMgRmFtaXguUGFyYW1ldHJpY0NsYXNzO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2UgaWYgKGNvbmNyZXRlRWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UpIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvbmNFbGVtZW50ID0gdGhpcy5mbXhJbnRlcmZhY2VNYXAuZ2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpIGFzIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2U7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25jRWxlbWVudCA9IHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuZ2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpIGFzIEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbjtcclxuICAgIC8vICAgICAgICAgfSBlbHNlIHsgIC8vIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljTWV0aG9kKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25jRWxlbWVudCA9IHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuZ2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpIGFzIEZhbWl4LlBhcmFtZXRyaWNNZXRob2Q7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgcmV0dXJuIGNvbmNFbGVtZW50O1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IHByb3BlcnR5XHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgQSBwcm9wZXJ0eVxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBwcm9wZXJ0eVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhQcm9wZXJ0eShwcm9wZXJ0eTogUHJvcGVydHlEZWNsYXJhdGlvbiB8IFByb3BlcnR5U2lnbmF0dXJlKTogRmFtaXguUHJvcGVydHkge1xyXG4gICAgICAgIGNvbnN0IGZteFByb3BlcnR5ID0gbmV3IEZhbWl4LlByb3BlcnR5KCk7XHJcbiAgICAgICAgY29uc3QgaXNTaWduYXR1cmUgPSBwcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5U2lnbmF0dXJlO1xyXG4gICAgICAgIGZteFByb3BlcnR5Lm5hbWUgPSBwcm9wZXJ0eS5nZXROYW1lKCk7XHJcblxyXG4gICAgICAgIGxldCBwcm9wVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcHJvcFR5cGVOYW1lID0gcHJvcGVydHkuZ2V0VHlwZSgpLmdldFRleHQoKS50cmltKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIEZhaWxlZCB0byBnZXQgdXNhYmxlIG5hbWUgZm9yIHByb3BlcnR5OiAke3Byb3BlcnR5LmdldE5hbWUoKX0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKHByb3BUeXBlTmFtZSwgcHJvcGVydHkpO1xyXG4gICAgICAgIGZteFByb3BlcnR5LmRlY2xhcmVkVHlwZSA9IGZteFR5cGU7XHJcblxyXG4gICAgICAgIC8vIGFkZCB0aGUgdmlzaWJpbGl0eSAocHVibGljLCBwcml2YXRlLCBldGMuKSB0byB0aGUgZm14UHJvcGVydHlcclxuICAgICAgICBmbXhQcm9wZXJ0eS52aXNpYmlsaXR5ID0gXCJcIjtcclxuXHJcbiAgICAgICAgcHJvcGVydHkuZ2V0TW9kaWZpZXJzKCkuZm9yRWFjaChtID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoIChtLmdldFRleHQoKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBTY29wZS5QdWJsaWM6XHJcbiAgICAgICAgICAgICAgICAgICAgZm14UHJvcGVydHkudmlzaWJpbGl0eSA9IFwicHVibGljXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNjb3BlLlByb3RlY3RlZDpcclxuICAgICAgICAgICAgICAgICAgICBmbXhQcm9wZXJ0eS52aXNpYmlsaXR5ID0gXCJwcm90ZWN0ZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgU2NvcGUuUHJpdmF0ZTpcclxuICAgICAgICAgICAgICAgICAgICBmbXhQcm9wZXJ0eS52aXNpYmlsaXR5ID0gXCJwcml2YXRlXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RhdGljXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgZm14UHJvcGVydHkuaXNDbGFzc1NpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInJlYWRvbmx5XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgZm14UHJvcGVydHkucmVhZE9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoIWlzU2lnbmF0dXJlICYmIHByb3BlcnR5LmdldEV4Y2xhbWF0aW9uVG9rZW5Ob2RlKCkpIHtcclxuICAgICAgICAgICAgZm14UHJvcGVydHkuaXNEZWZpbml0ZWx5QXNzaWduZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJvcGVydHkuZ2V0UXVlc3Rpb25Ub2tlbk5vZGUoKSkge1xyXG4gICAgICAgICAgICBmbXhQcm9wZXJ0eS5pc09wdGlvbmFsID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb3BlcnR5LmdldE5hbWUoKS5zdWJzdHJpbmcoMCwgMSkgPT09IFwiI1wiKSB7XHJcbiAgICAgICAgICAgIGZteFByb3BlcnR5LmlzSmF2YVNjcmlwdFByaXZhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW5pdEZRTihwcm9wZXJ0eSwgZm14UHJvcGVydHkpO1xyXG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHByb3BlcnR5LCBmbXhQcm9wZXJ0eSk7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhQcm9wZXJ0eSk7XHJcblxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14UHJvcGVydHkscHJvcGVydHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZm14UHJvcGVydHk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggbWV0aG9kIG9yIGFjY2Vzc29yXHJcbiAgICAgKiBAcGFyYW0gbWV0aG9kIEEgbWV0aG9kIG9yIGFuIGFjY2Vzc29yXHJcbiAgICAgKiBAcGFyYW0gY3VycmVudENDIFRoZSBjeWNsb21hdGljIGNvbXBsZXhpdHkgbWV0cmljcyBvZiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZVxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGFjY2Vzc29yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4TWV0aG9kKG1ldGhvZDogTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24sIGN1cnJlbnRDQzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSk6IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHwgRmFtaXguUGFyYW1ldHJpY01ldGhvZCB7XHJcbiAgICAgICAgbGV0IGZteE1ldGhvZDogRmFtaXguTWV0aG9kIHwgRmFtaXguQWNjZXNzb3IgfCBGYW1peC5QYXJhbWV0cmljTWV0aG9kO1xyXG4gICAgICAgIGNvbnN0IGlzR2VuZXJpYyA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgY29uc3QgZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKG1ldGhvZCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmhhcyhmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSkpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIFNldEFjY2Vzc29yRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGZteE1ldGhvZCA9IG5ldyBGYW1peC5BY2Nlc3NvcigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNHZXR0ZXIgPSBtZXRob2QgaW5zdGFuY2VvZiBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNTZXR0ZXIgPSBtZXRob2QgaW5zdGFuY2VvZiBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzR2V0dGVyKSB7KGZteE1ldGhvZCBhcyBGYW1peC5BY2Nlc3Nvcikua2luZCA9IFwiZ2V0dGVyXCI7fVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzU2V0dGVyKSB7KGZteE1ldGhvZCBhcyBGYW1peC5BY2Nlc3Nvcikua2luZCA9IFwic2V0dGVyXCI7fVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteE1ldGhvZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmljKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm14TWV0aG9kID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNNZXRob2QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZteE1ldGhvZCA9IG5ldyBGYW1peC5NZXRob2QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gbWV0aG9kIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbjtcclxuICAgICAgICAgICAgY29uc3QgaXNTaWduYXR1cmUgPSBtZXRob2QgaW5zdGFuY2VvZiBNZXRob2RTaWduYXR1cmU7XHJcblxyXG4gICAgICAgICAgICBsZXQgaXNBYnN0cmFjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgaXNTdGF0aWMgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKG1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfHwgbWV0aG9kIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaXNBYnN0cmFjdCA9IG1ldGhvZC5pc0Fic3RyYWN0KCk7XHJcbiAgICAgICAgICAgICAgICBpc1N0YXRpYyA9IG1ldGhvZC5pc1N0YXRpYygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvcikgeyhmbXhNZXRob2QgYXMgRmFtaXguQWNjZXNzb3IpLmtpbmQgPSBcImNvbnN0cnVjdG9yXCI7fVxyXG4gICAgICAgICAgICBmbXhNZXRob2QuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7XHJcbiAgICAgICAgICAgIGZteE1ldGhvZC5pc0NsYXNzU2lkZSA9IGlzU3RhdGljO1xyXG4gICAgICAgICAgICBmbXhNZXRob2QuaXNQcml2YXRlID0gKG1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfHwgbWV0aG9kIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbikgPyAobWV0aG9kLmdldE1vZGlmaWVycygpLmZpbmQoeCA9PiB4LmdldFRleHQoKSA9PT0gJ3ByaXZhdGUnKSkgIT09IHVuZGVmaW5lZCA6IGZhbHNlO1xyXG4gICAgICAgICAgICBmbXhNZXRob2QuaXNQcm90ZWN0ZWQgPSAobWV0aG9kIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gfHwgbWV0aG9kIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fCBtZXRob2QgaW5zdGFuY2VvZiBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKSA/IChtZXRob2QuZ2V0TW9kaWZpZXJzKCkuZmluZCh4ID0+IHguZ2V0VGV4dCgpID09PSAncHJvdGVjdGVkJykpICE9PSB1bmRlZmluZWQgOiBmYWxzZTtcclxuICAgICAgICAgICAgZm14TWV0aG9kLnNpZ25hdHVyZSA9IEhlbHBlcnMuY29tcHV0ZVNpZ25hdHVyZShtZXRob2QuZ2V0VGV4dCgpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBtZXRob2ROYW1lOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIGlmIChpc0NvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gXCJjb25zdHJ1Y3RvclwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IChtZXRob2QgYXMgTWV0aG9kRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbikuZ2V0TmFtZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZteE1ldGhvZC5uYW1lID0gbWV0aG9kTmFtZTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDAsIDEpID09PSBcIiNcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGZteE1ldGhvZC5pc1ByaXZhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWZteE1ldGhvZC5pc1ByaXZhdGUgJiYgIWZteE1ldGhvZC5pc1Byb3RlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgZm14TWV0aG9kLmlzUHVibGljID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZteE1ldGhvZC5pc1B1YmxpYyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzU2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICAgICAgICBmbXhNZXRob2QuY3ljbG9tYXRpY0NvbXBsZXhpdHkgPSBjdXJyZW50Q0NbZm14TWV0aG9kLm5hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm14TWV0aG9kLmN5Y2xvbWF0aWNDb21wbGV4aXR5ID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IG1ldGhvZFR5cGVOYW1lID0gdGhpcy5VTktOT1dOX1ZBTFVFOyBcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIG1ldGhvZFR5cGVOYW1lID0gbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCkudHJpbSgpOyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIEZhaWxlZCB0byBnZXQgdXNhYmxlIG5hbWUgZm9yIHJldHVybiB0eXBlIG9mIG1ldGhvZDogJHtmbXhNZXRob2QubmFtZX0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUobWV0aG9kVHlwZU5hbWUsIG1ldGhvZCk7XHJcbiAgICAgICAgICAgIGZteE1ldGhvZC5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xyXG4gICAgICAgICAgICBmbXhNZXRob2QubnVtYmVyT2ZMaW5lc09mQ29kZSA9IG1ldGhvZC5nZXRFbmRMaW5lTnVtYmVyKCkgLSBtZXRob2QuZ2V0U3RhcnRMaW5lTnVtYmVyKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpO1xyXG4gICAgICAgICAgICBmbXhNZXRob2QubnVtYmVyT2ZQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzU2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICAgICAgICBmbXhNZXRob2QubnVtYmVyT2ZTdGF0ZW1lbnRzID0gbWV0aG9kLmdldFN0YXRlbWVudHMoKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmbXhNZXRob2QubnVtYmVyT2ZTdGF0ZW1lbnRzID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaW5pdEZRTihtZXRob2QsIGZteE1ldGhvZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhNZXRob2QpO1xyXG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihtZXRob2QsIGZteE1ldGhvZCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLnNldChmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSwgZm14TWV0aG9kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZteE1ldGhvZCA9IHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuZ2V0KGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lKSBhcyAoRmFtaXguTWV0aG9kIHwgRmFtaXguQWNjZXNzb3IgfCBGYW1peC5QYXJhbWV0cmljTWV0aG9kKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14TWV0aG9kLG1ldGhvZCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGZteE1ldGhvZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIGZ1bmMgQSBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIGN1cnJlbnRDQyBUaGUgY3ljbG9tYXRpYyBjb21wbGV4aXR5IG1ldHJpY3Mgb2YgdGhlIGN1cnJlbnQgc291cmNlIGZpbGVcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgZnVuY3Rpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhGdW5jdGlvbihmdW5jOiBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uLCBjdXJyZW50Q0M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0pOiBGYW1peC5GdW5jdGlvbiB8IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbiB7XHJcbiAgICAgICAgbGV0IGZteEZ1bmN0aW9uOiBGYW1peC5GdW5jdGlvbiB8IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbjtcclxuICAgICAgICBjb25zdCBpc0dlbmVyaWMgPSBmdW5jLmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMDtcclxuICAgICAgICBjb25zdCBmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oZnVuYyk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmhhcyhmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSkpIHtcclxuICAgICAgICAgICAgaWYgKGlzR2VuZXJpYykge1xyXG4gICAgICAgICAgICAgICAgZm14RnVuY3Rpb24gPSBuZXcgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmbXhGdW5jdGlvbiA9IG5ldyBGYW1peC5GdW5jdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGZ1bmMuZ2V0TmFtZSgpO1xyXG4gICAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICAgICAgZm14RnVuY3Rpb24ubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmbXhGdW5jdGlvbi5uYW1lID0gXCJhbm9ueW1vdXNcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm14RnVuY3Rpb24uc2lnbmF0dXJlID0gSGVscGVycy5jb21wdXRlU2lnbmF0dXJlKGZ1bmMuZ2V0VGV4dCgpKTtcclxuICAgICAgICAgICAgZm14RnVuY3Rpb24uY3ljbG9tYXRpY0NvbXBsZXhpdHkgPSBjdXJyZW50Q0NbZm14RnVuY3Rpb24ubmFtZV07XHJcbiAgICAgICAgICAgIGluaXRGUU4oZnVuYywgZm14RnVuY3Rpb24pO1xyXG4gICAgICAgICAgICAvLyBmbXhGdW5jdGlvbi5mdWxseVF1YWxpZmllZE5hbWUgPSBmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZTtcclxuICAgIFxyXG4gICAgICAgICAgICBsZXQgZnVuY3Rpb25UeXBlTmFtZSA9IHRoaXMuVU5LTk9XTl9WQUxVRTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZU5hbWUgPSBmdW5jLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCkudHJpbSgpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIEZhaWxlZCB0byBnZXQgdXNhYmxlIG5hbWUgZm9yIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uOiAke2Z1bmMuZ2V0TmFtZSgpfS4gQ29udGludWluZy4uLmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoZnVuY3Rpb25UeXBlTmFtZSwgZnVuYyk7XHJcbiAgICAgICAgICAgIGZteEZ1bmN0aW9uLmRlY2xhcmVkVHlwZSA9IGZteFR5cGU7XHJcbiAgICAgICAgICAgIGZteEZ1bmN0aW9uLm51bWJlck9mTGluZXNPZkNvZGUgPSBmdW5jLmdldEVuZExpbmVOdW1iZXIoKSAtIGZ1bmMuZ2V0U3RhcnRMaW5lTnVtYmVyKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBmdW5jLmdldFBhcmFtZXRlcnMoKTtcclxuICAgICAgICAgICAgZm14RnVuY3Rpb24ubnVtYmVyT2ZQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGZteEZ1bmN0aW9uLm51bWJlck9mU3RhdGVtZW50cyA9IGZ1bmMuZ2V0U3RhdGVtZW50cygpLmxlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoZnVuYywgZm14RnVuY3Rpb24pO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhGdW5jdGlvbik7XHJcbiAgICBcclxuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhGdW5jdGlvbixmdW5jKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuc2V0KGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lLCBmbXhGdW5jdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmbXhGdW5jdGlvbiA9IHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuZ2V0KGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lKSBhcyAoRmFtaXguRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZteEZ1bmN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IHBhcmFtZXRlclxyXG4gICAgICogQHBhcmFtIHBhcmFtIEEgcGFyYW1ldGVyXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHBhcmFtZXRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRlcihwYXJhbTogUGFyYW1ldGVyRGVjbGFyYXRpb24pOiBGYW1peC5QYXJhbWV0ZXIge1xyXG4gICAgICAgIGlmICh0aGlzLmZteFBhcmFtZXRlck1hcC5oYXMocGFyYW0pKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJQYXJhbWV0ZXIgPSB0aGlzLmZteFBhcmFtZXRlck1hcC5nZXQocGFyYW0pO1xyXG4gICAgICAgICAgICBpZiAoclBhcmFtZXRlcikgeyBcclxuICAgICAgICAgICAgICAgcmV0dXJuIHJQYXJhbWV0ZXI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhbWl4IHBhcmFtZXRlciAke3BhcmFtLmdldE5hbWUoKX0gaXMgbm90IGZvdW5kIGluIHRoZSBwYXJhbWV0ZXIgbWFwLmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmbXhQYXJhbSA9IG5ldyBGYW1peC5QYXJhbWV0ZXIoKTtcclxuXHJcbiAgICAgICAgbGV0IHBhcmFtVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcGFyYW1UeXBlTmFtZSA9IHBhcmFtLmdldFR5cGUoKS5nZXRUZXh0KCkudHJpbSgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciBwYXJhbWV0ZXI6ICR7cGFyYW0uZ2V0TmFtZSgpfS4gQ29udGludWluZy4uLmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUocGFyYW1UeXBlTmFtZSwgcGFyYW0pO1xyXG4gICAgICAgIGZteFBhcmFtLmRlY2xhcmVkVHlwZSA9IGZteFR5cGU7XHJcbiAgICAgICAgZm14UGFyYW0ubmFtZSA9IHBhcmFtLmdldE5hbWUoKTtcclxuXHJcbiAgICAgICAgaW5pdEZRTihwYXJhbSwgZm14UGFyYW0pO1xyXG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHBhcmFtLCBmbXhQYXJhbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhQYXJhbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14UGFyYW0sIHBhcmFtKTtcclxuICAgICAgICB0aGlzLmZteFBhcmFtZXRlck1hcC5zZXQocGFyYW0sIGZteFBhcmFtKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZteFBhcmFtO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IHR5cGUgcGFyYW1ldGVyXHJcbiAgICAgKiBAcGFyYW0gdHAgQSB0eXBlIHBhcmFtZXRlclxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSB0eXBlIHBhcmFtZXRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhQYXJhbWV0ZXJUeXBlKHRwOiBUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pOiBGYW1peC5QYXJhbWV0ZXJUeXBlIHtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBmbXhQYXJhbWV0ZXJUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRlclR5cGUoKTtcclxuICAgXHJcbiAgICAgICAgZm14UGFyYW1ldGVyVHlwZS5uYW1lID0gdHAuZ2V0TmFtZSgpOyAgICAgIFxyXG4gICAgICAgIGluaXRGUU4odHAsIGZteFBhcmFtZXRlclR5cGUpO1xyXG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHRwLCBmbXhQYXJhbWV0ZXJUeXBlKTtcclxuXHJcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFBhcmFtZXRlclR5cGUpO1xyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteFBhcmFtZXRlclR5cGUsdHApO1xyXG5cclxuICAgICAgICByZXR1cm4gZm14UGFyYW1ldGVyVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCB0eXBlIGluIHRoZSBjb250ZXh0IG9mIGNvbmNyZXRpemF0aW9uc1xyXG4gICAgICogQHBhcmFtIHR5cGVOYW1lIEEgdHlwZSBuYW1lXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBBbiBlbGVtZW50XHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHR5cGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZVR5cGUoZWxlbWVudDogVHlwZU5vZGUpOiBcclxuICAgICAgICBGYW1peC5QYXJhbWV0ZXJUeXBlIHwgRmFtaXguUHJpbWl0aXZlVHlwZSB8IEZhbWl4LkNsYXNzIHwgRmFtaXguSW50ZXJmYWNlIHtcclxuICAgICAgICAvLyBUT0RPIC0gcmVmYWN0b3IgdG8gc3RvcCB1c2luZyBuYW1lcyBhcyBhIGtleSBpbiB0aGUgbWFwcywgdXNlIHRzLW1vcnBoIGVsZW1lbnQgaW5zdGVhZFxyXG4gICAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9IGVsZW1lbnQuZ2V0U3ltYm9sKCk/LmdldERlY2xhcmF0aW9ucygpWzBdIGFzIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjtcclxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJUeXBlTmFtZSA6IHN0cmluZyA9IGVsZW1lbnQuZ2V0VGV4dCgpO1xyXG4gICAgICAgIGxldCBmbXhQYXJhbWV0ZXJUeXBlOiBGYW1peC5UeXBlIHwgRmFtaXguQ2xhc3MgfCBGYW1peC5JbnRlcmZhY2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIC8vIGdldCBhIFR5cGVSZWZlcmVuY2UgZnJvbSBhIFR5cGVOb2RlXHJcbiAgICAgICAgY29uc3QgdHlwZVJlZmVyZW5jZSA9IGVsZW1lbnQuZ2V0VHlwZSgpO1xyXG4gICAgICAgIC8vIGdldCBhIFR5cGVEZWNsYXJhdGlvbiBmcm9tIGEgVHlwZVJlZmVyZW5jZVxyXG4gICAgICAgIGNvbnN0IHR5cGVEZWNsYXJhdGlvbiA9IHR5cGVSZWZlcmVuY2UuZ2V0U3ltYm9sKCk/LmdldERlY2xhcmF0aW9ucygpWzBdIGFzIFRTTW9ycGhUeXBlRGVjbGFyYXRpb247XHJcblxyXG4gICAgICAgIGxldCBpc0NsYXNzT3JJbnRlcmZhY2UgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5mbXhDbGFzc01hcC5oYXMocGFyYW1ldGVyVHlwZU5hbWUpKXtcclxuICAgICAgICAgICAgdGhpcy5mbXhDbGFzc01hcC5mb3JFYWNoKChvYmosIG5hbWUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKG9iaiBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRyaWNDbGFzcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGVsZW1lbnQuZ2V0VGV4dCgpICYmIG9iai5nZW5lcmljUGFyYW1ldGVycy5zaXplPjApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG9iajtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGFzc09ySW50ZXJmYWNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZWxlbWVudC5nZXRUZXh0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG9iajtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGFzc09ySW50ZXJmYWNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgfSAgIFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZteEludGVyZmFjZU1hcC5oYXMocGFyYW1ldGVyVHlwZU5hbWUpKXtcclxuICAgICAgICAgICAgdGhpcy5mbXhJbnRlcmZhY2VNYXAuZm9yRWFjaCgob2JqLCBuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKXtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZWxlbWVudC5nZXRUZXh0KCkgJiYgb2JqLmdlbmVyaWNQYXJhbWV0ZXJzLnNpemU+MCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJUeXBlID0gb2JqO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NsYXNzT3JJbnRlcmZhY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBlbGVtZW50LmdldFRleHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJUeXBlID0gb2JqO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NsYXNzT3JJbnRlcmZhY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICB9ICAgXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIWlzQ2xhc3NPckludGVyZmFjZSl7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5mbXhUeXBlTWFwLmhhcyh0eXBlRGVjbGFyYXRpb24pKSB7ICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyByZWZhY3RvciBcclxuICAgICAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZVR5cGUocGFyYW1ldGVyVHlwZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG5ldyBGYW1peC5QcmltaXRpdmVUeXBlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZS5pc1N0dWIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRlclR5cGUoKTtcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlclR5cGUubmFtZSA9IHBhcmFtZXRlclR5cGVOYW1lO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFBhcmFtZXRlclR5cGUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mbXhUeXBlTWFwLnNldCh0eXBlRGVjbGFyYXRpb24sIGZteFBhcmFtZXRlclR5cGUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhQYXJhbWV0ZXJUeXBlLHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZteFR5cGVNYXAuZ2V0KHR5cGVEZWNsYXJhdGlvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCB0eXBlICR7dHlwZURlY2xhcmF0aW9ufSBpcyBub3QgZm91bmQgaW4gdGhlIFR5cGUgbWFwLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZm14UGFyYW1ldGVyVHlwZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZteFBhcmFtZXRlclR5cGUgd2FzIHVuZGVmaW5lZCBmb3IgcGFyYW1ldGVyVHlwZU5hbWUgJHtwYXJhbWV0ZXJUeXBlTmFtZX1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZteFBhcmFtZXRlclR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggdmFyaWFibGVcclxuICAgICAqIEBwYXJhbSB2YXJpYWJsZSBBIHZhcmlhYmxlXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHZhcmlhYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4VmFyaWFibGUodmFyaWFibGU6IFZhcmlhYmxlRGVjbGFyYXRpb24pOiBGYW1peC5WYXJpYWJsZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm14VmFyaWFibGVNYXAuaGFzKHZhcmlhYmxlKSkge1xyXG4gICAgICAgICAgICBjb25zdCByVmFyaWFibGUgPSB0aGlzLmZteFZhcmlhYmxlTWFwLmdldCh2YXJpYWJsZSk7XHJcbiAgICAgICAgICAgIGlmIChyVmFyaWFibGUpIHsgXHJcbiAgICAgICAgICAgICAgIHJldHVybiByVmFyaWFibGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhbWl4IHBhcmFtZXRlciAke3ZhcmlhYmxlLmdldE5hbWUoKX0gaXMgbm90IGZvdW5kIGluIHRoZSB2YXJpYWJsZSBtYXAuYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZm14VmFyaWFibGUgPSBuZXcgRmFtaXguVmFyaWFibGUoKTtcclxuICAgIFxyXG4gICAgICAgIGxldCB2YXJpYWJsZVR5cGVOYW1lID0gdGhpcy5VTktOT1dOX1ZBTFVFO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhcmlhYmxlVHlwZU5hbWUgPSB2YXJpYWJsZS5nZXRUeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiAke2Vycm9yfS4gRmFpbGVkIHRvIGdldCB1c2FibGUgbmFtZSBmb3IgdmFyaWFibGU6ICR7dmFyaWFibGUuZ2V0TmFtZSgpfS4gQ29udGludWluZy4uLmApO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKHZhcmlhYmxlVHlwZU5hbWUsIHZhcmlhYmxlKTtcclxuICAgICAgICBmbXhWYXJpYWJsZS5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xyXG4gICAgICAgIGZteFZhcmlhYmxlLm5hbWUgPSB2YXJpYWJsZS5nZXROYW1lKCk7XHJcbiAgICAgICAgaW5pdEZRTih2YXJpYWJsZSwgZm14VmFyaWFibGUpO1xyXG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHZhcmlhYmxlLCBmbXhWYXJpYWJsZSk7XHJcbiAgICBcclxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14VmFyaWFibGUpO1xyXG4gICAgXHJcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhWYXJpYWJsZSx2YXJpYWJsZSk7XHJcbiAgICAgICAgdGhpcy5mbXhWYXJpYWJsZU1hcC5zZXQodmFyaWFibGUsIGZteFZhcmlhYmxlKTtcclxuICAgIFxyXG4gICAgICAgIHJldHVybiBmbXhWYXJpYWJsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBlbnVtXHJcbiAgICAgKiBAcGFyYW0gZW51bUVudGl0eSBBbiBlbnVtXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGVudW1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhFbnVtKGVudW1FbnRpdHk6IEVudW1EZWNsYXJhdGlvbik6IEZhbWl4LkVudW0ge1xyXG4gICAgICAgIGlmICh0aGlzLmZteEVudW1NYXAuaGFzKGVudW1FbnRpdHkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJFbnVtID0gdGhpcy5mbXhFbnVtTWFwLmdldChlbnVtRW50aXR5KTtcclxuICAgICAgICAgICAgaWYgKHJFbnVtKSB7IFxyXG4gICAgICAgICAgICAgICByZXR1cm4gckVudW07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhbWl4IGVudW0gJHtlbnVtRW50aXR5LmdldE5hbWUoKX0gaXMgbm90IGZvdW5kIGluIHRoZSBlbnVtIG1hcC5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmbXhFbnVtID0gbmV3IEZhbWl4LkVudW0oKTtcclxuICAgICAgICBmbXhFbnVtLm5hbWUgPSBlbnVtRW50aXR5LmdldE5hbWUoKTtcclxuICAgICAgICBpbml0RlFOKGVudW1FbnRpdHksIGZteEVudW0pO1xyXG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGVudW1FbnRpdHksIGZteEVudW0pO1xyXG5cclxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14RW51bSk7XHJcblxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14RW51bSxlbnVtRW50aXR5KTtcclxuICAgICAgICB0aGlzLmZteEVudW1NYXAuc2V0KGVudW1FbnRpdHksIGZteEVudW0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZm14RW51bTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBlbnVtIHZhbHVlXHJcbiAgICAgKiBAcGFyYW0gZW51bU1lbWJlciBBbiBlbnVtIG1lbWJlclxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBlbnVtIG1lbWJlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhFbnVtVmFsdWUoZW51bU1lbWJlcjogRW51bU1lbWJlcik6IEZhbWl4LkVudW1WYWx1ZSB7XHJcbiAgICAgICAgY29uc3QgZm14RW51bVZhbHVlID0gbmV3IEZhbWl4LkVudW1WYWx1ZSgpO1xyXG5cclxuICAgICAgICBsZXQgZW51bVZhbHVlVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW51bVZhbHVlVHlwZU5hbWUgPSBlbnVtTWVtYmVyLmdldFR5cGUoKS5nZXRUZXh0KCkudHJpbSgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciBlbnVtIHZhbHVlOiAke2VudW1NZW1iZXIuZ2V0TmFtZSgpfS4gQ29udGludWluZy4uLmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoZW51bVZhbHVlVHlwZU5hbWUsIGVudW1NZW1iZXIpO1xyXG4gICAgICAgIGZteEVudW1WYWx1ZS5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xyXG4gICAgICAgIGZteEVudW1WYWx1ZS5uYW1lID0gZW51bU1lbWJlci5nZXROYW1lKCk7XHJcbiAgICAgICAgaW5pdEZRTihlbnVtTWVtYmVyLCBmbXhFbnVtVmFsdWUpO1xyXG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGVudW1NZW1iZXIsIGZteEVudW1WYWx1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhFbnVtVmFsdWUpO1xyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEVudW1WYWx1ZSxlbnVtTWVtYmVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZteEVudW1WYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IGRlY29yYXRvclxyXG4gICAgICogQHBhcmFtIGRlY29yYXRvciBBIGRlY29yYXRvclxyXG4gICAgICogQHBhcmFtIGRlY29yYXRlZEVudGl0eSBBIGNsYXNzLCBhIG1ldGhvZCwgYSBwYXJhbWV0ZXIgb3IgYSBwcm9wZXJ0eVxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBkZWNvcmF0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhEZWNvcmF0b3IoZGVjb3JhdG9yOiBEZWNvcmF0b3IsIGRlY29yYXRlZEVudGl0eTogQ2xhc3NEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFByb3BlcnR5RGVjbGFyYXRpb24pOiBGYW1peC5EZWNvcmF0b3Ige1xyXG4gICAgICAgIGNvbnN0IGZteERlY29yYXRvciA9IG5ldyBGYW1peC5EZWNvcmF0b3IoKTtcclxuICAgICAgICBjb25zdCBkZWNvcmF0b3JOYW1lID0gXCJAXCIgKyBkZWNvcmF0b3IuZ2V0TmFtZSgpO1xyXG4gICAgICAgIGNvbnN0IGRlY29yYXRvckV4cHJlc3Npb24gPSBkZWNvcmF0b3IuZ2V0VGV4dCgpLnN1YnN0cmluZygxKTtcclxuXHJcbiAgICAgICAgZm14RGVjb3JhdG9yLm5hbWUgPSBkZWNvcmF0b3JOYW1lO1xyXG4gICAgICAgIGZteERlY29yYXRvci5kZWNvcmF0b3JFeHByZXNzaW9uID0gZGVjb3JhdG9yRXhwcmVzc2lvbjtcclxuICAgICAgICBjb25zdCBkZWNvcmF0ZWRFbnRpdHlGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGRlY29yYXRlZEVudGl0eSk7XHJcbiAgICAgICAgY29uc3QgZm14RGVjb3JhdGVkRW50aXR5ID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKGRlY29yYXRlZEVudGl0eUZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgRmFtaXguTmFtZWRFbnRpdHk7XHJcbiAgICAgICAgZm14RGVjb3JhdG9yLmRlY29yYXRlZEVudGl0eSA9IGZteERlY29yYXRlZEVudGl0eTtcclxuICAgICAgICBpbml0RlFOKGRlY29yYXRvciwgZm14RGVjb3JhdG9yKTtcclxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihkZWNvcmF0b3IsIGZteERlY29yYXRvcik7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhEZWNvcmF0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteERlY29yYXRvcixkZWNvcmF0b3IpO1xyXG5cclxuICAgICAgICByZXR1cm4gZm14RGVjb3JhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGNvbW1lbnRcclxuICAgICAqIEBwYXJhbSBjb21tZW50IEEgY29tbWVudFxyXG4gICAgICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29tbWVudCdzIGNvbnRhaW5lclxyXG4gICAgICogQHBhcmFtIGlzSlNEb2MgQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNvbW1lbnQgaXMgYSBKU0RvY1xyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb21tZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVGYW1peENvbW1lbnQoY29tbWVudDogQ29tbWVudFJhbmdlLCBmbXhTY29wZTogRmFtaXguTmFtZWRFbnRpdHksIGlzSlNEb2M6IGJvb2xlYW4pOiBGYW1peC5Db21tZW50IHtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYD4gTk9URTogY3JlYXRpbmcgY29tbWVudCAke2NvbW1lbnQuZ2V0VGV4dCgpfSBpbiBzY29wZSAke2ZteFNjb3BlLm5hbWV9LmApO1xyXG4gICAgICAgIGNvbnN0IGZteENvbW1lbnQgPSBuZXcgRmFtaXguQ29tbWVudCgpO1xyXG4gICAgICAgIGZteENvbW1lbnQuY29udGFpbmVyID0gZm14U2NvcGU7ICAvLyBhZGRzIGNvbW1lbnQgdG8gdGhlIGNvbnRhaW5lcidzIGNvbW1lbnRzIGNvbGxlY3Rpb25cclxuICAgICAgICBmbXhDb21tZW50LmlzSlNEb2MgPSBpc0pTRG9jO1xyXG5cclxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihjb21tZW50LCBmbXhDb21tZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteENvbW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteENvbW1lbnQsY29tbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBmbXhDb21tZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggdHlwZVxyXG4gICAgICogQHBhcmFtIHR5cGVOYW1lIEEgdHlwZSBuYW1lXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBBIHRzLW1vcnBoIGVsZW1lbnRcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgdHlwZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peFR5cGUodHlwZU5hbWU6IHN0cmluZywgZWxlbWVudDogVFNNb3JwaFR5cGVEZWNsYXJhdGlvbik6IEZhbWl4LlR5cGUge1xyXG4gICAgICAgIGxldCBmbXhUeXBlOiBGYW1peC5UeXBlO1xyXG4gICAgICAgIGNvbnN0IGlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmVUeXBlKHR5cGVOYW1lKTtcclxuICAgICAgICBjb25zdCBpc1BhcmFtZXRyaWNUeXBlID1cclxuICAgICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24gJiYgZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDAgfHxcclxuICAgICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uICYmIGVsZW1lbnQuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwOyBcclxuXHJcbiAgICAgICAgICAgIC8vIEZ1bmN0aW9ucyBhbmQgbWV0aG9kcyBhcmVuJ3QgdHlwZXMhXHJcbiAgICAgICAgICAgIC8vIHx8XHJcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbkRlY2xhcmF0aW9uICYmIGVsZW1lbnQuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwIHx8XHJcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiAmJiBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMCB8fFxyXG4gICAgICAgICAgICAvLyBlbGVtZW50IGluc3RhbmNlb2YgQXJyb3dGdW5jdGlvbiAmJiBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiQ3JlYXRpbmcgKG9yIGdldHRpbmcpIHR5cGU6ICdcIiArIHR5cGVOYW1lICsgXCInIG9mIGVsZW1lbnQ6IFwiICsgZWxlbWVudD8uZ2V0VGV4dCgpICsgXCIgb2Yga2luZDogXCIgKyBlbGVtZW50Py5nZXRLaW5kTmFtZSgpKTtcclxuXHJcbiAgICAgICAgaWYgKGlzUHJpbWl0aXZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhQcmltaXRpdmVUeXBlKHR5cGVOYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpc1BhcmFtZXRyaWNUeXBlKSB7XHJcbiAgICAgICAgICAgIC8vIG5hcnJvdyB0aGUgdHlwZVxyXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0cmljRWxlbWVudCA9IGVsZW1lbnQgYXMgVFNNb3JwaFBhcmFtZXRyaWNUeXBlO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVPckdldEZhbWl4UGFyYW1ldHJpY1R5cGUodHlwZU5hbWUsIHBhcmFtZXRyaWNFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5mbXhUeXBlTWFwLmhhcyhlbGVtZW50KSkge1xyXG4gICAgICAgICAgICBsZXQgYW5jZXN0b3I6IEZhbWl4LkNvbnRhaW5lckVudGl0eSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuIFxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlQW5jZXN0b3IgPSBIZWxwZXJzLmZpbmRUeXBlQW5jZXN0b3IoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGVBbmNlc3Rvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQW5jZXN0b3Igbm90IGZvdW5kIGZvciBlbGVtZW50ICR7ZWxlbWVudC5nZXRUZXh0KCl9LmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKHR5cGVBbmNlc3Rvcik7XHJcbiAgICAgICAgICAgICAgICBhbmNlc3RvciA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShhbmNlc3RvckZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgRmFtaXguQ29udGFpbmVyRW50aXR5O1xyXG4gICAgICAgICAgICAgICAgaWYgKCFhbmNlc3Rvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQW5jZXN0b3IgJHtGUU5GdW5jdGlvbnMuZ2V0RlFOKHR5cGVBbmNlc3Rvcil9IG5vdCBmb3VuZC4gQWRkaW5nIHRoZSBuZXcgdHlwZS5gKTtcclxuICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUodHlwZUFuY2VzdG9yLmdldFRleHQoKSwgdHlwZUFuY2VzdG9yIGFzIFRTTW9ycGhUeXBlRGVjbGFyYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlR5cGUoKTtcclxuICAgICAgICAgICAgZm14VHlwZS5uYW1lID0gdHlwZU5hbWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWFuY2VzdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuY2VzdG9yIG5vdCBmb3VuZCBmb3IgdHlwZSAke3R5cGVOYW1lfS5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmbXhUeXBlLmNvbnRhaW5lciA9IGFuY2VzdG9yO1xyXG4gICAgICAgICAgICBpbml0RlFOKGVsZW1lbnQsIGZteFR5cGUpO1xyXG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihlbGVtZW50LCBmbXhUeXBlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhUeXBlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm14VHlwZU1hcC5zZXQoZWxlbWVudCwgZm14VHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZteFR5cGVNYXAuZ2V0KGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBmbXhUeXBlID0gcmVzdWx0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCB0eXBlICR7dHlwZU5hbWV9IGlzIG5vdCBmb3VuZCBpbiB0aGUgVHlwZSBtYXAuYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14VHlwZSxlbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZteFR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCB0eXBlIHRoYXQgaXMgcGFyYW1ldHJpY1xyXG4gICAgICogQHBhcmFtIHR5cGVOYW1lIEEgdHlwZSBuYW1lXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBBIHRzLW1vcnBoIGVsZW1lbnRcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgcGFyYW1ldGVyIHR5cGVcclxuICAgICAqL1xyXG4gICAgY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRyaWNUeXBlKHR5cGVOYW1lOiBzdHJpbmcsIGVsZW1lbnQ6IFRTTW9ycGhQYXJhbWV0cmljVHlwZSk6IEZhbWl4LlR5cGUge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5mbXhUeXBlTWFwLmhhcyhlbGVtZW50KSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZteFR5cGVNYXAuZ2V0KGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCB0eXBlICR7dHlwZU5hbWV9IGlzIG5vdCBmb3VuZCAodW5kZWZpbmVkKSBpbiB0aGUgVHlwZSBtYXAuYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEEgcGFyYW1ldHJpYyB0eXBlIGlzIGEgdHlwZSB0aGF0IGhhcyB0eXBlIHBhcmFtZXRlcnMsIGUuZy4sIExpc3Q8VD5cclxuICAgICAgICAvLyBJbiBUUyBpdCBjYW4gYmUgYSBjbGFzcywgYW4gaW50ZXJmYWNlLCBhIGZ1bmN0aW9uLCBhbiBhcnJvdyBmdW5jdGlvbiwgb3IgYSBtZXRob2RcclxuXHJcbiAgICAgICAgLy8gY3JlYXRlIHRoZSBGYW1peCBQYXJhbWV0cmljIFR5cGUgKG1heWJlIGl0J3MganVzdCBhbiBJbnRlcmZhY2UsIGV0Yy4pXHJcbiAgICAgICAgbGV0IGZteFR5cGU6IEZhbWl4LlR5cGU7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikge1xyXG4gICAgICAgICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNDbGFzcygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGZteFR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgYXJlIG5vdCB0eXBlcyBcclxuICAgICAgICAvLyBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRnVuY3Rpb25EZWNsYXJhdGlvbikge1xyXG4gICAgICAgIC8vICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbigpO1xyXG4gICAgICAgIC8vIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFycm93RnVuY3Rpb24pIHtcclxuICAgICAgICAvLyAgICAgZm14VHlwZSA9IG5ldyBGYW1peC5QYXJhbWV0cmljQXJyb3dGdW5jdGlvbigpO1xyXG4gICAgICAgIC8vIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7XHJcbiAgICAgICAgLy8gICAgIGZteFR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldHJpY01ldGhvZCgpO1xyXG4gICAgICAgIC8vIH0gXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBpcyBub3QgYSBjbGFzcywgaW50ZXJmYWNlLCBmdW5jdGlvbiwgYXJyb3cgZnVuY3Rpb24sIG9yIG1ldGhvZC5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHBhcmFtZXRlcnMgPSBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCk7XHJcblxyXG4gICAgICAgIC8vIC8vIGZvciBlYWNoIHBhcmFtZXRlciwgZ2V0T3JDcmVhdGUgdGhlIEZhbWl4UGFyYW1ldGVyVHlwZVxyXG4gICAgICAgIC8vIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIHBhcmFtZXRlcnMpIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5jcmVhdGVPckdldEZhbWl4UGFyYW1ldGVyVHlwZShwYXJhbWV0ZXIuZ2V0TmFtZSgpLCBwYXJhbWV0ZXIpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gLy8gVE9ETzogdGhlIGZvbGxvd2luZyBjb2RlIGlzIG5vdCBjb3JyZWN0LCBpdCBpcyBqdXN0IGEgcGxhY2Vob2xkZXJcclxuICAgICAgICAvLyBjb25zdCBwYXJhbWV0ZXJUeXBlTmFtZXMgPSB0eXBlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWUuaW5kZXhPZihcIjxcIikgKyAxLCB0eXBlTmFtZS5pbmRleE9mKFwiPlwiKSlcclxuICAgICAgICAvLyAgICAgLnNwbGl0KFwiLFwiKS5tYXAocyA9PiBzLnRyaW0oKSk7XHJcbiAgICAgICAgLy8gY29uc3QgYmFzZVR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIHR5cGVOYW1lLmluZGV4T2YoXCI8XCIpKS50cmltKCk7XHJcbiAgICAgICAgLy8gcGFyYW1ldGVyVHlwZU5hbWVzLmZvckVhY2gocGFyYW1ldGVyVHlwZU5hbWUgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCBmbXhQYXJhbWV0ZXJUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4UGFyYW1ldGVyVHlwZShwYXJhbWV0ZXJUeXBlTmFtZSwgZWxlbWVudCk7XHJcbiAgICAgICAgLy8gICAgIChmbXhUeXBlIGFzIEZhbWl4LlBhcmFtZXRlclR5cGUpLmFkZEFyZ3VtZW50KGZteFBhcmFtZXRlclR5cGUpO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICAgIC8vIGNvbnN0IGZteEJhc2VUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShiYXNlVHlwZU5hbWUsIGVsZW1lbnQpO1xyXG5cclxuICAgICAgICAvLyAoZm14VHlwZSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlKS5iYXNlVHlwZSA9IGZteEJhc2VUeXBlO1xyXG5cclxuICAgICAgICBmbXhUeXBlLm5hbWUgPSB0eXBlTmFtZTtcclxuICAgICAgICBpbml0RlFOKGVsZW1lbnQsIGZteFR5cGUpO1xyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhUeXBlKTtcclxuICAgICAgICB0aGlzLmZteFR5cGVNYXAuc2V0KGVsZW1lbnQsIGZteFR5cGUpO1xyXG4gICAgICAgIHJldHVybiBmbXhUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHR5cGUgZm9yIGEgcGFyYW1ldGVyIGluIGEgcGFyYW1ldHJpYyB0eXBlLCBlLmcuLCBUIGluIExpc3Q8VD5cclxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlTmFtZSBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBUeXBlU2NyaXB0IGVsZW1lbnQgKFRTTW9ycGhQYXJhbWV0cmljVHlwZSkgdGhhdCB0aGUgdHlwZSBpcyBhc3NvY2lhdGVkIHdpdGhcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICAvLyBjcmVhdGVPckdldEZhbWl4UGFyYW1ldGVyVHlwZShwYXJhbWV0ZXJUeXBlTmFtZTogc3RyaW5nLCBlbGVtZW50OiBQYXJhbWV0ZXJEZWNsYXJhdGlvbikge1xyXG4gICAgLy8gICAgIGlmICh0aGlzLmZteFR5cGVNYXAuaGFzKGVsZW1lbnQpKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmZteFR5cGVNYXAuZ2V0KGVsZW1lbnQpIGFzIEZhbWl4LlBhcmFtZXRlclR5cGU7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICAvLyBkZXRlcm1pbmUgaWYgZWxlbWVudCBpcyBhIFxyXG4gICAgLy8gICAgIGNvbnN0IGZteFR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldGVyVHlwZSgpO1xyXG4gICAgLy8gICAgIC8vIGNvbnN0IHBhcmFtZXRlclR5cGVOYW1lcyA9IHR5cGVOYW1lLnN1YnN0cmluZyh0eXBlTmFtZS5pbmRleE9mKFwiPFwiKSArIDEsIHR5cGVOYW1lLmluZGV4T2YoXCI+XCIpKVxyXG4gICAgLy8gICAgIC8vICAgICAuc3BsaXQoXCIsXCIpLm1hcChzID0+IHMudHJpbSgpKTtcclxuICAgIC8vICAgICAvLyBjb25zdCBiYXNlVHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUuaW5kZXhPZihcIjxcIikpLnRyaW0oKTtcclxuICAgIC8vICAgICAvLyBwYXJhbWV0ZXJUeXBlTmFtZXMuZm9yRWFjaChwYXJhbWV0ZXJUeXBlTmFtZSA9PiB7XHJcbiAgICAvLyAgICAgLy8gICAgIGNvbnN0IGZteFBhcmFtZXRlclR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhQYXJhbWV0ZXJUeXBlKHBhcmFtZXRlclR5cGVOYW1lLCBlbGVtZW50KTtcclxuICAgIC8vICAgICAvLyAgICAgKGZteFR5cGUgYXMgRmFtaXguUGFyYW1ldGVyVHlwZSkuYWRkQXJndW1lbnQoZm14UGFyYW1ldGVyVHlwZSk7XHJcbiAgICAvLyAgICAgLy8gfSk7XHJcbiAgICAvLyAgICAgY29uc3QgZm14QmFzZVR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKGJhc2VUeXBlTmFtZSwgZWxlbWVudCk7XHJcbiAgICAvLyAgICAgKGZteFR5cGUgYXMgRmFtaXguUGFyYW1ldGVyVHlwZSkuYmFzZVR5cGUgPSBmbXhCYXNlVHlwZTtcclxuICAgIC8vICAgICBpbml0RlFOKGVsZW1lbnQsIGZteFR5cGUpO1xyXG4gICAgLy8gICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhUeXBlKTtcclxuICAgIC8vICAgICB0aGlzLmZteFR5cGVNYXAuc2V0KGVsZW1lbnQsIGZteFR5cGUpO1xyXG4gICAgLy8gICAgIHJldHVybiBmbXhUeXBlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggcHJpbWl0aXZlIHR5cGVcclxuICAgICAqIEBwYXJhbSB0eXBlTmFtZSBBIHR5cGUgbmFtZVxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBwcmltaXRpdmUgdHlwZVxyXG4gICAgICovXHJcbiAgICBjcmVhdGVPckdldEZhbWl4UHJpbWl0aXZlVHlwZSh0eXBlTmFtZTogc3RyaW5nKTogRmFtaXguUHJpbWl0aXZlVHlwZSB7XHJcbiAgICAgICAgbGV0IGZteFR5cGU6IEZhbWl4LlByaW1pdGl2ZVR5cGUgPSBuZXcgRmFtaXguUHJpbWl0aXZlVHlwZSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5mbXhQcmltaXRpdmVUeXBlTWFwLmhhcyh0eXBlTmFtZSkpIHtcclxuICAgICAgICAgICAgZm14VHlwZSA9IG5ldyBGYW1peC5QcmltaXRpdmVUeXBlKCk7XHJcbiAgICAgICAgICAgIGZteFR5cGUuaXNTdHViID0gdHJ1ZTtcclxuICAgICAgICAgICAgZm14VHlwZS5uYW1lID0gdHlwZU5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuZm14UHJpbWl0aXZlVHlwZU1hcC5zZXQodHlwZU5hbWUsIGZteFR5cGUpO1xyXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14VHlwZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm14VHlwZSA9IHRoaXMuZm14UHJpbWl0aXZlVHlwZU1hcC5nZXQodHlwZU5hbWUpIGFzIEZhbWl4LlByaW1pdGl2ZVR5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbXhUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGFjY2Vzc1xyXG4gICAgICogQHBhcmFtIG5vZGUgQSBub2RlXHJcbiAgICAgKiBAcGFyYW0gaWQgQW4gaWQgb2YgYSBwYXJhbWV0ZXIsIGEgdmFyaWFibGUsIGEgcHJvcGVydHkgb3IgYW4gZW51bSBtZW1iZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4QWNjZXNzKG5vZGU6IElkZW50aWZpZXIsIGlkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBmbXhWYXIgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlJZChpZCkgYXMgRmFtaXguU3RydWN0dXJhbEVudGl0eTtcclxuICAgICAgICBpZiAoIWZteFZhcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhbWl4IGVudGl0eSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCwgZm9yIG5vZGUgJHtub2RlLmdldFRleHQoKX0gaW4gJHtub2RlLmdldFNvdXJjZUZpbGUoKS5nZXRCYXNlTmFtZSgpfSBhdCBsaW5lICR7bm9kZS5nZXRTdGFydExpbmVOdW1iZXIoKX0uYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2dnZXIuZGVidWcoYENyZWF0aW5nIEZhbWl4QWNjZXNzLiBOb2RlOiBbJHtub2RlLmdldEtpbmROYW1lKCl9XSAnJHtub2RlLmdldFRleHQoKX0nIGF0IGxpbmUgJHtub2RlLmdldFN0YXJ0TGluZU51bWJlcigpfSBpbiAke25vZGUuZ2V0U291cmNlRmlsZSgpLmdldEJhc2VOYW1lKCl9LCBpZDogJHtpZH0gcmVmZXJzIHRvIGZteFZhciAnJHtmbXhWYXIuZnVsbHlRdWFsaWZpZWROYW1lfScuYCk7XHJcblxyXG4gICAgICAgIGNvbnN0IG5vZGVSZWZlcmVuY2VBbmNlc3RvciA9IEhlbHBlcnMuZmluZEFuY2VzdG9yKG5vZGUpO1xyXG4gICAgICAgIGNvbnN0IGFuY2VzdG9yRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihub2RlUmVmZXJlbmNlQW5jZXN0b3IpO1xyXG4gICAgICAgIGNvbnN0IGFjY2Vzc29yID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKGFuY2VzdG9yRnVsbHlRdWFsaWZpZWROYW1lKSBhcyBGYW1peC5Db250YWluZXJFbnRpdHk7XHJcbiAgICAgICAgaWYgKCFhY2Nlc3Nvcikge1xyXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEFuY2VzdG9yICR7YW5jZXN0b3JGdWxseVF1YWxpZmllZE5hbWV9IG9mIGtpbmQgJHtub2RlUmVmZXJlbmNlQW5jZXN0b3IuZ2V0S2luZE5hbWUoKX0gbm90IGZvdW5kLmApO1xyXG4gICAgICAgICAgICAvLyBhY2Nlc3NvciA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoYW5jZXN0b3JGdWxseVF1YWxpZmllZE5hbWUsIG5vZGVSZWZlcmVuY2VBbmNlc3RvciBhcyBUeXBlRGVjbGFyYXRpb24pO1xyXG4gICAgICAgICAgICByZXR1cm47IC8vIGJhaWwgb3V0IFRPRE86IHRoaXMgaXMgcHJvYmFibHkgd3JvbmdcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kIGFjY2Vzc29yIHRvIGJlICR7YWNjZXNzb3IuZnVsbHlRdWFsaWZpZWROYW1lfS5gKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvLyBtYWtlIHN1cmUgYWNjZXNzb3IgaXMgYSBtZXRob2QsIGZ1bmN0aW9uLCBzY3JpcHQgb3IgbW9kdWxlXHJcbiAgICAgICAgaWYgKCEoYWNjZXNzb3IgaW5zdGFuY2VvZiBGYW1peC5NZXRob2QpICYmICEoYWNjZXNzb3IgaW5zdGFuY2VvZiBGYW1peC5BcnJvd0Z1bmN0aW9uKSAmJiAhKGFjY2Vzc29yIGluc3RhbmNlb2YgRmFtaXguRnVuY3Rpb24pICYmICEoYWNjZXNzb3IgaW5zdGFuY2VvZiBGYW1peC5TY3JpcHRFbnRpdHkpICYmICEoYWNjZXNzb3IgaW5zdGFuY2VvZiBGYW1peC5Nb2R1bGUpKSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgQWNjZXNzb3IgJHthY2Nlc3Nvci5mdWxseVF1YWxpZmllZE5hbWV9IGlzIG5vdCBhIG1ldGhvZCwgZnVuY3Rpb24sIGV0Yy5gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZG9uJ3QgY3JlYXRlIGFueSBkdXBsaWNhdGVzIChlLmcuIGlmIHRoZSBzYW1lIHZhcmlhYmxlIGlzIGFjY2Vzc2VkIG11bHRpcGxlIHRpbWVzIGJ5IHNhbWUgYWNjZXNzb3IpXHJcbiAgICAgICAgY29uc3QgZm91bmRBY2Nlc3MgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4QWNjZXNzQnlBY2Nlc3NvckFuZFZhcmlhYmxlKGFjY2Vzc29yLCBmbXhWYXIpO1xyXG4gICAgICAgIGlmIChmb3VuZEFjY2Vzcykge1xyXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZhbWl4QWNjZXNzIGFscmVhZHkgZXhpc3RzIGZvciBhY2Nlc3NvciAke2FjY2Vzc29yLmZ1bGx5UXVhbGlmaWVkTmFtZX0gYW5kIHZhcmlhYmxlICR7Zm14VmFyLmZ1bGx5UXVhbGlmaWVkTmFtZX0uYCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZm14QWNjZXNzID0gbmV3IEZhbWl4LkFjY2VzcygpO1xyXG4gICAgICAgIGZteEFjY2Vzcy5hY2Nlc3NvciA9IGFjY2Vzc29yO1xyXG4gICAgICAgIGZteEFjY2Vzcy52YXJpYWJsZSA9IGZteFZhcjtcclxuXHJcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEFjY2Vzcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14QWNjZXNzLG5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGludm9jYXRpb25cclxuICAgICAqIEBwYXJhbSBub2RlUmVmZXJyaW5nVG9JbnZvY2FibGUgQSBub2RlXHJcbiAgICAgKiBAcGFyYW0gaW52b2NhYmxlIEEgbWV0aG9kIG9yIGEgZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIG1ldGhvZCBvciB0aGUgZnVuY3Rpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4SW52b2NhdGlvbihub2RlUmVmZXJyaW5nVG9JbnZvY2FibGU6IElkZW50aWZpZXIsIGludm9jYWJsZTogSW52b2NhYmxlVHlwZSwgaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGZteEludm9jYWJsZSA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUlkKGlkKSBhcyBGYW1peC5CZWhhdmlvcmFsRW50aXR5O1xyXG4gICAgICAgIC8vIHNpbmNlIHRoZSBub2RlIGlzIGluIHRoZSBBU1QsIHdlIG5lZWQgdG8gZmluZCB0aGUgYW5jZXN0b3IgdGhhdCBpcyBpbiB0aGUgRmFtaXggbW9kZWxcclxuICAgICAgICBjb25zdCBjb250YWluZXJPZk5vZGUgPSBIZWxwZXJzLmZpbmRBbmNlc3Rvcihub2RlUmVmZXJyaW5nVG9JbnZvY2FibGUpO1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgY29udGFpbmVyIChhbmNlc3RvcikgJHtjb250YWluZXJPZk5vZGUuZ2V0S2luZE5hbWUoKX0gZm9yIEFTVCBub2RlICR7bm9kZVJlZmVycmluZ1RvSW52b2NhYmxlLmdldFRleHQoKX0uYCk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyRlFOID0gRlFORnVuY3Rpb25zLmdldEZRTihjb250YWluZXJPZk5vZGUpO1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgY29udGFpbmVyRlFOICR7Y29udGFpbmVyRlFOfS5gKTtcclxuICAgICAgICBsZXQgc2VuZGVyID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKGNvbnRhaW5lckZRTikgYXMgRmFtaXguQ29udGFpbmVyRW50aXR5O1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgYSBzZW5kZXIgdGhhdCBtYXRjaGVzICR7c2VuZGVyLmZ1bGx5UXVhbGlmaWVkTmFtZX0uYCk7XHJcbiAgICAgICAgaWYgKHNlbmRlciBpbnN0YW5jZW9mIEZhbWl4LlR5cGUpIHtcclxuICAgICAgICAgICAgLy8gVE9ETyB0aGlzIG1pZ2h0IGJlIGFuIGVycm9yIGluIGdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWVcclxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBPb3BzISBTZW5kZXIgaXMgYSB0eXBlLCB3aGljaCBpcyBub3QgdmFsaWQgZm9yIGFuIEludm9jYXRpb24uIFRyeWluZyB0byBmaW5kIGEgY29udGFpbmVyIGZvciAke3NlbmRlci5mdWxseVF1YWxpZmllZE5hbWV9LmApO1xyXG4gICAgICAgICAgICBjb25zdCBzZW5kZXJDb250YWluZXIgPSBzZW5kZXIuY29udGFpbmVyO1xyXG4gICAgICAgICAgICBpZiAoc2VuZGVyQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBzZW5kZXIgPSBzZW5kZXJDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVjZWl2ZXJGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGludm9jYWJsZS5nZXRQYXJlbnQoKSk7XHJcbiAgICAgICAgY29uc3QgcmVjZWl2ZXIgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWUocmVjZWl2ZXJGdWxseVF1YWxpZmllZE5hbWUpIGFzIEZhbWl4Lk5hbWVkRW50aXR5O1xyXG5cclxuICAgICAgICBjb25zdCBmbXhJbnZvY2F0aW9uID0gbmV3IEZhbWl4Lkludm9jYXRpb24oKTtcclxuICAgICAgICBmbXhJbnZvY2F0aW9uLnNlbmRlciA9IHNlbmRlcjtcclxuICAgICAgICBmbXhJbnZvY2F0aW9uLnJlY2VpdmVyID0gcmVjZWl2ZXI7XHJcbiAgICAgICAgZm14SW52b2NhdGlvbi5hZGRDYW5kaWRhdGUoZm14SW52b2NhYmxlKTtcclxuICAgICAgICBmbXhJbnZvY2F0aW9uLnNpZ25hdHVyZSA9IGZteEludm9jYWJsZS5zaWduYXR1cmU7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhJbnZvY2F0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhJbnZvY2F0aW9uLG5vZGVSZWZlcnJpbmdUb0ludm9jYWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggaW5oZXJpdGFuY2VcclxuICAgICAqIEBwYXJhbSBjbHMgQSBjbGFzcyBvciBhbiBpbnRlcmZhY2UgKHN1YmNsYXNzKVxyXG4gICAgICogQHBhcmFtIGluaENsYXNzIFRoZSBpbmhlcml0ZWQgY2xhc3Mgb3IgaW50ZXJmYWNlIChzdXBlcmNsYXNzKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peEluaGVyaXRhbmNlKGNsczogQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uLCBpbmhDbGFzczogQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKTogdm9pZCB7XHJcbiAgICAgICAgLy8gLy8gbmVlZCBhIGtleSB0byBzZWUgaWYgdGhlIGluaGVyaXRhbmNlIGFscmVhZHkgZXhpc3RzXHJcbiAgICAgICAgLy8gY29uc3QgY2xhc3NGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGNscyk7XHJcbiAgICAgICAgLy8gbGV0IGluS2V5d29yZDogc3RyaW5nO1xyXG4gICAgICAgIC8vIGxldCBpbmhDbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xyXG4gICAgICAgIC8vIGxldCBpbmhDbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICAvLyAvLyBpZiBpbmhDbGFzcyBpcyBhbiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMsIGl0IGlzIGFuIGludGVyZmFjZVxyXG4gICAgICAgIC8vIGlmIChpbmhDbGFzcyBpbnN0YW5jZW9mIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cykge1xyXG4gICAgICAgIC8vICAgICBpbmhDbGFzc05hbWUgPSBpbmhDbGFzcy5nZXRFeHByZXNzaW9uKCkuZ2V0VGV4dCgpO1xyXG4gICAgICAgIC8vICAgICAvLyB3aGF0IGlzIGluaENsYXNzRnVsbHlRdWFsaWZpZWROYW1lPyBUT0RPXHJcbiAgICAgICAgLy8gICAgIGluaENsYXNzRnVsbHlRdWFsaWZpZWROYW1lID0gJ1VuZGVmaW5lZF9TY29wZV9mcm9tX2ltcG9ydGVyLicgKyBpbmhDbGFzc05hbWU7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgaW5oQ2xhc3NOYW1lID0gaW5oQ2xhc3MuZ2V0TmFtZSgpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIWluaENsYXNzTmFtZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmhlcml0ZWQgY2xhc3Mgb3IgaW50ZXJmYWNlIG5hbWUgbm90IGZvdW5kIGZvciAke2luaENsYXNzLmdldFRleHQoKX0uYCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgaW5oQ2xhc3NGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGluaENsYXNzKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gLy8gYnVpbGQgdGhlIHVuaXF1ZSBrZXkgb2YgdGhlIGluaGVyaXRhbmNlXHJcbiAgICAgICAgLy8gaWYgKChjbHMgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uICYmIGluaENsYXNzIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgXHJcbiAgICAgICAgLy8gICAgIHx8IChjbHMgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiBpbmhDbGFzcyBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSkge1xyXG4gICAgICAgIC8vICAgICBpbktleXdvcmQgPSBcIiBleHRlbmRzIFwiO1xyXG4gICAgICAgIC8vIH0gZWxzZSBpZiAoY2xzIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbiAmJiAoaW5oQ2xhc3MgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8fCBpbmhDbGFzcyBpbnN0YW5jZW9mIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cykpIHtcclxuICAgICAgICAvLyAgICAgaW5LZXl3b3JkID0gXCIgaW1wbGVtZW50cyBcIjtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoYEluaGVyaXRhbmNlICR7Y2xzLmdldFRleHQoKX0gYW5kICR7aW5oQ2xhc3MuZ2V0VGV4dCgpfSBpcyBub3QgdmFsaWQuYCk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyBjb25zdCBpbmhlcml0YW5jZUZ1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oY2xzKSArIGluS2V5d29yZCArIGluaENsYXNzRnVsbHlRdWFsaWZpZWROYW1lO1xyXG4gICAgICAgIC8vIGlmICh0aGlzLmZteEluaGVyaXRhbmNlTWFwLmhhcyhpbmhlcml0YW5jZUZ1bGx5UXVhbGlmaWVkTmFtZSkpIHtcclxuICAgICAgICAvLyAgICAgY29uc3QgckluaGVyaXRhbmNlID0gdGhpcy5mbXhJbmhlcml0YW5jZU1hcC5nZXQoaW5oZXJpdGFuY2VGdWxseVF1YWxpZmllZE5hbWUpO1xyXG4gICAgICAgIC8vICAgICBpZiAockluaGVyaXRhbmNlKSB7IFxyXG4gICAgICAgIC8vICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nXHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluaGVyaXRhbmNlICR7Y2xzLmdldFRleHQoKX0gaXMgbm90IGZvdW5kIGluIHRoZSBpbmhlcml0YW5jZSBtYXAuYCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZteEluaGVyaXRhbmNlID0gbmV3IEZhbWl4LkluaGVyaXRhbmNlKCk7XHJcblxyXG4gICAgICAgIC8vIGxvZ2dlci5kZWJ1ZyhgY3JlYXRlRmFtaXhJbmhlcml0YW5jZTogY2xhc3NGdWxseVF1YWxpZmllZE5hbWU6IGNsYXNzIGZxbiA9ICR7Y2xhc3NGdWxseVF1YWxpZmllZE5hbWV9YCk7XHJcblxyXG4gICAgICAgIGxldCBzdWJDbGFzczogRmFtaXguQ2xhc3MgfCBGYW1peC5JbnRlcmZhY2UgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKGNscyBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgc3ViQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDbGFzcyhjbHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc3ViQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoY2xzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc3ViQ2xhc3MpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdWJjbGFzcyAke2Nsc30gbm90IGZvdW5kIGluIENsYXNzIG9yIEludGVyZmFjZSBtYXBzLmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN1cGVyQ2xhc3M6IEZhbWl4LkNsYXNzIHwgRmFtaXguSW50ZXJmYWNlIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIC8vIGlmIChpbmhDbGFzcyBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24gfHwgaW5oQ2xhc3MgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikge1xyXG4gICAgICAgIC8vICAgICBpbmhDbGFzc05hbWUgPSBpbmhDbGFzcy5nZXROYW1lKCk7XHJcbiAgICAgICAgLy8gICAgIGlmICghaW5oQ2xhc3NOYW1lKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluaGVyaXRlZCBjbGFzcyBvciBpbnRlcmZhY2UgbmFtZSBub3QgZm91bmQgZm9yICR7aW5oQ2xhc3MuZ2V0VGV4dCgpfS5gKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICAgICBpbmhDbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oaW5oQ2xhc3MpO1xyXG4gICAgICAgIC8vICAgICBpZiAoaW5oQ2xhc3MgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5mbXhDbGFzc01hcC5nZXQoaW5oQ2xhc3NGdWxseVF1YWxpZmllZE5hbWUpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuZm14SW50ZXJmYWNlTWFwLmdldChpbmhDbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgaWYgKCFzdXBlckNsYXNzKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN1cGVyY2xhc3MgJHtjbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZX0gbm90IGZvdW5kIGluIENsYXNzIG9yIEludGVyZmFjZSBtYXBzLmApO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyAvLyBpdCBzaG91bGRuJ3QgYWRkIHRoZSBjbGFzcy9pbnRlcmZhY2UgYWdhaW4gdG8gdGhlIE1hcCwgaXQgc2hvdWxkIHVzZSBjcmVhdGVPckdldCAoPylcclxuICAgICAgICAvLyBpZiAoc3VwZXJDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgIGlmIChpbmhDbGFzcyBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgLy8gc3VwZXJDbGFzcyA9IG5ldyBGYW1peC5DbGFzcygpO1xyXG4gICAgICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3MoaW5oQ2xhc3MpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmZteENsYXNzTWFwLnNldChpbmhDbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZSwgc3VwZXJDbGFzcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGluaENsYXNzIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgLy8gc3VwZXJDbGFzcyA9IG5ldyBGYW1peC5JbnRlcmZhY2UoKTtcclxuICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZShpbmhDbGFzcyk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuZm14SW50ZXJmYWNlTWFwLnNldChpbmhDbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZSwgc3VwZXJDbGFzcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gaW5oQ2xhc3MgaW5zdGFuY2VvZiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcclxuICAgICAgICAgICAgY29uc3QgaW50ZXJmYWNlRGVjbGFyYXRpb24gPSBnZXRJbnRlcmZhY2VEZWNsYXJhdGlvbkZyb21FeHByZXNzaW9uKGluaENsYXNzKTtcclxuICAgICAgICAgICAgaWYgKGludGVyZmFjZURlY2xhcmF0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoaW50ZXJmYWNlRGVjbGFyYXRpb24pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcmZhY2UgZGVjbGFyYXRpb24gbm90IGZvdW5kIGZvciAke2luaENsYXNzLmdldFRleHQoKX0uYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoc3VwZXJDbGFzcywgaW5oQ2xhc3MpO1xyXG5cclxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihpbmhDbGFzcywgc3VwZXJDbGFzcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChzdXBlckNsYXNzKTtcclxuXHJcbiAgICAgICAgZm14SW5oZXJpdGFuY2Uuc3ViY2xhc3MgPSBzdWJDbGFzcztcclxuICAgICAgICBmbXhJbmhlcml0YW5jZS5zdXBlcmNsYXNzID0gc3VwZXJDbGFzcztcclxuXHJcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEluaGVyaXRhbmNlKTtcclxuICAgICAgICAvLyBubyBGUU4gZm9yIGluaGVyaXRhbmNlXHJcblxyXG4gICAgICAgIC8vIFdlIGRvbid0IG1hcCBpbmhlcml0YW5jZSB0byB0aGUgc291cmNlIGNvZGUgZWxlbWVudCBiZWNhdXNlIHRoZXJlIGFyZSB0d28gZWxlbWVudHMgKHN1cGVyLCBzdWIpXHJcbiAgICAgICAgLy8gdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhJbmhlcml0YW5jZSwgbnVsbCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjcmVhdGVGYW1peEltcG9ydENsYXVzZShpbXBvcnRlZEVudGl0eTogRmFtaXguTmFtZWRFbnRpdHksIGltcG9ydGluZ0VudGl0eTogRmFtaXguTW9kdWxlKSB7XHJcbiAgICAgICAgY29uc3QgZm14SW1wb3J0Q2xhdXNlID0gbmV3IEZhbWl4LkltcG9ydENsYXVzZSgpO1xyXG4gICAgICAgIGZteEltcG9ydENsYXVzZS5pbXBvcnRlZEVudGl0eSA9IGltcG9ydGVkRW50aXR5O1xyXG4gICAgICAgIGZteEltcG9ydENsYXVzZS5pbXBvcnRpbmdFbnRpdHkgPSBpbXBvcnRpbmdFbnRpdHk7XHJcbiAgICAgICAgaW1wb3J0aW5nRW50aXR5LmFkZE91dGdvaW5nSW1wb3J0KGZteEltcG9ydENsYXVzZSk7XHJcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEltcG9ydENsYXVzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggaW1wb3J0IGNsYXVzZVxyXG4gICAgICogQHBhcmFtIGltcG9ydENsYXVzZUluZm8gVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjcmVhdGUgYSBGYW1peCBpbXBvcnQgY2xhdXNlXHJcbiAgICAgKiBAcGFyYW0gaW1wb3J0RGVjbGFyYXRpb24gVGhlIGltcG9ydCBkZWNsYXJhdGlvblxyXG4gICAgICogQHBhcmFtIGltcG9ydGVyIEEgc291cmNlIGZpbGUgd2hpY2ggaXMgYSBtb2R1bGVcclxuICAgICAqIEBwYXJhbSBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aCBUaGUgcGF0aCBvZiB0aGUgbW9kdWxlIHdoZXJlIHRoZSBleHBvcnQgZGVjbGFyYXRpb24gaXNcclxuICAgICAqIEBwYXJhbSBpbXBvcnRFbGVtZW50IFRoZSBpbXBvcnRlZCBlbnRpdHlcclxuICAgICAqIEBwYXJhbSBpc0luRXhwb3J0cyBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgaW1wb3J0ZWQgZW50aXR5IGlzIGluIHRoZSBleHBvcnRzXHJcbiAgICAgKiBAcGFyYW0gaXNEZWZhdWx0RXhwb3J0IEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBpbXBvcnRlZCBlbnRpdHkgaXMgYSBkZWZhdWx0IGV4cG9ydFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb2xkQ3JlYXRlT3JHZXRGYW1peEltcG9ydENsYXVzZShpbXBvcnRDbGF1c2VJbmZvOiB7aW1wb3J0RGVjbGFyYXRpb24/OiBJbXBvcnREZWNsYXJhdGlvbiB8IEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uLCBpbXBvcnRlclNvdXJjZUZpbGU6IFNvdXJjZUZpbGUsIG1vZHVsZVNwZWNpZmllckZpbGVQYXRoOiBzdHJpbmcsIGltcG9ydEVsZW1lbnQ6IEltcG9ydFNwZWNpZmllciB8IElkZW50aWZpZXIsIGlzSW5FeHBvcnRzOiBib29sZWFuLCBpc0RlZmF1bHRFeHBvcnQ6IGJvb2xlYW59KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qge2ltcG9ydERlY2xhcmF0aW9uLCBpbXBvcnRlclNvdXJjZUZpbGU6IGltcG9ydGVyLCBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aCwgaW1wb3J0RWxlbWVudCwgaXNJbkV4cG9ydHMsIGlzRGVmYXVsdEV4cG9ydH0gPSBpbXBvcnRDbGF1c2VJbmZvO1xyXG4gICAgICAgIGlmIChpbXBvcnREZWNsYXJhdGlvbiAmJiB0aGlzLmZteEltcG9ydENsYXVzZU1hcC5oYXMoaW1wb3J0RGVjbGFyYXRpb24pKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJJbXBvcnRDbGF1c2UgPSB0aGlzLmZteEltcG9ydENsYXVzZU1hcC5nZXQoaW1wb3J0RGVjbGFyYXRpb24pO1xyXG4gICAgICAgICAgICBpZiAockltcG9ydENsYXVzZSkgeyBcclxuICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCBkbyBhbnl0aGluZ1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgY2xhdXNlICR7aW1wb3J0RWxlbWVudC5nZXRUZXh0KCl9IGlzIG5vdCBmb3VuZCBpbiB0aGUgaW1wb3J0IGNsYXVzZSBtYXAuYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvZ2dlci5pbmZvKGBjcmVhdGluZyBhIG5ldyBGYW1peEltcG9ydENsYXVzZSBmb3IgJHtpbXBvcnREZWNsYXJhdGlvbj8uZ2V0VGV4dCgpfSBpbiAke2ltcG9ydGVyLmdldEJhc2VOYW1lKCl9LmApO1xyXG4gICAgICAgIGNvbnN0IGZteEltcG9ydENsYXVzZSA9IG5ldyBGYW1peC5JbXBvcnRDbGF1c2UoKTtcclxuXHJcbiAgICAgICAgbGV0IGltcG9ydGVkRW50aXR5OiBGYW1peC5OYW1lZEVudGl0eSB8IEZhbWl4LlN0cnVjdHVyYWxFbnRpdHkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgbGV0IGltcG9ydGVkRW50aXR5TmFtZTogc3RyaW5nO1xyXG5cclxuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGhQcm9qZWN0ID0gdGhpcy5mYW1peFJlcC5nZXRBYnNvbHV0ZVBhdGgoKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLm5vcm1hbGl6ZShtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aCk7XHJcbiAgICAgICAgLy8gY29udmVydCB0aGUgcGF0aCBhbmQgcmVtb3ZlIGFueSB3aW5kb3dzIGJhY2tzbGFzaGVzIGludHJvZHVjZWQgYnkgcGF0aC5ub3JtYWxpemVcclxuICAgICAgICBsb2dnZXIuZGVidWcoYGNyZWF0ZUZhbWl4SW1wb3J0Q2xhdXNlOiBhYnNvbHV0ZVBhdGg6ICR7YWJzb2x1dGVQYXRofWApO1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2U6IGNvbnZlcnRUb1JlbGF0aXZlUGF0aDogJHt0aGlzLmNvbnZlcnRUb1JlbGF0aXZlUGF0aChhYnNvbHV0ZVBhdGgsIGFic29sdXRlUGF0aFByb2plY3QpfWApO1xyXG4gICAgICAgIGNvbnN0IHBhdGhJblByb2plY3Q6IHN0cmluZyA9IHRoaXMuY29udmVydFRvUmVsYXRpdmVQYXRoKGFic29sdXRlUGF0aCwgYWJzb2x1dGVQYXRoUHJvamVjdCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBjcmVhdGVGYW1peEltcG9ydENsYXVzZTogcGF0aEluUHJvamVjdDogJHtwYXRoSW5Qcm9qZWN0fWApO1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IFwie1wiICsgcGF0aEluUHJvamVjdCArIFwifS5cIjtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYGNyZWF0ZUZhbWl4SW1wb3J0Q2xhdXNlOiBwYXRoTmFtZTogJHtwYXRoTmFtZX1gKTtcclxuXHJcbiAgICAgICAgLy8gTmFtZWQgaW1wb3J0cywgZS5nLiBpbXBvcnQgeyBDbGFzc1cgfSBmcm9tIFwiLi9jb21wbGV4RXhwb3J0TW9kdWxlXCI7XHJcblxyXG4gICAgICAgIC8vIFN0YXJ0IHdpdGggc2ltcGxlIGltcG9ydCBjbGF1c2UgKHdpdGhvdXQgcmVmZXJyaW5nIHRvIHRoZSBhY3R1YWwgdmFyaWFibGUpXHJcblxyXG4gICAgICAgIGlmIChpbXBvcnREZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEltcG9ydERlY2xhcmF0aW9uIFxyXG4gICAgICAgICAgICAmJiBpbXBvcnRFbGVtZW50IGluc3RhbmNlb2YgSW1wb3J0U3BlY2lmaWVyKSB7IFxyXG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHlOYW1lID0gaW1wb3J0RWxlbWVudC5nZXROYW1lKCk7XHJcbiAgICAgICAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUgKyBpbXBvcnRlZEVudGl0eU5hbWU7XHJcbiAgICAgICAgICAgIGlmIChpc0luRXhwb3J0cykge1xyXG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWUocGF0aE5hbWUpIGFzIEZhbWl4Lk5hbWVkRW50aXR5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpbXBvcnRlZEVudGl0eSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbXBvcnRlZEVudGl0eSA9IG5ldyBGYW1peC5OYW1lZEVudGl0eSgpO1xyXG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkubmFtZSA9IGltcG9ydGVkRW50aXR5TmFtZTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNJbkV4cG9ydHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZEVudGl0eS5pc1N0dWIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gbG9nZ2VyLmRlYnVnKGBjcmVhdGVGYW1peEltcG9ydENsYXVzZTogQ3JlYXRpbmcgbmFtZWQgZW50aXR5ICR7aW1wb3J0ZWRFbnRpdHlOYW1lfSB3aXRoIEZRTiAke3BhdGhOYW1lfWApO1xyXG4gICAgICAgICAgICAgICAgLy8gaW1wb3J0ZWRFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID0gcGF0aE5hbWU7XHJcbiAgICAgICAgICAgICAgICBpbml0RlFOKGltcG9ydEVsZW1lbnQsIGltcG9ydGVkRW50aXR5KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihpbXBvcnRFbGVtZW50LCBpbXBvcnRlZEVudGl0eSk7XHJcbiAgICAgICAgICAgICAgICAvLyBtdXN0IGFkZCBlbnRpdHkgdG8gcmVwb3NpdG9yeVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGltcG9ydGVkRW50aXR5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBoYW5kbGUgaW1wb3J0IGVxdWFscyBkZWNsYXJhdGlvbnMsIGUuZy4gaW1wb3J0IG15TW9kdWxlID0gcmVxdWlyZShcIi4vY29tcGxleEV4cG9ydE1vZHVsZVwiKTtcclxuICAgICAgICAvLyBUeXBlU2NyaXB0IGNhbid0IGRldGVybWluZSB0aGUgdHlwZSBvZiB0aGUgaW1wb3J0ZWQgbW9kdWxlLCBzbyB3ZSBjcmVhdGUgYSBNb2R1bGUgZW50aXR5XHJcbiAgICAgICAgZWxzZSBpZiAoaW1wb3J0RGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbikge1xyXG4gICAgICAgICAgICBpbXBvcnRlZEVudGl0eU5hbWUgPSBpbXBvcnREZWNsYXJhdGlvbj8uZ2V0TmFtZSgpO1xyXG4gICAgICAgICAgICBwYXRoTmFtZSA9IHBhdGhOYW1lICsgaW1wb3J0ZWRFbnRpdHlOYW1lO1xyXG4gICAgICAgICAgICBpbXBvcnRlZEVudGl0eSA9IG5ldyBGYW1peC5TdHJ1Y3R1cmFsRW50aXR5KCk7XHJcbiAgICAgICAgICAgIGltcG9ydGVkRW50aXR5Lm5hbWUgPSBpbXBvcnRlZEVudGl0eU5hbWU7XHJcbiAgICAgICAgICAgIGluaXRGUU4oaW1wb3J0RGVjbGFyYXRpb24sIGltcG9ydGVkRW50aXR5KTtcclxuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoaW1wb3J0RWxlbWVudCwgaW1wb3J0ZWRFbnRpdHkpO1xyXG4gICAgICAgICAgICAvLyBpbXBvcnRlZEVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPSBwYXRoTmFtZTtcclxuICAgICAgICAgICAgY29uc3QgYW55VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoJ2FueScsIGltcG9ydERlY2xhcmF0aW9uKTtcclxuICAgICAgICAgICAgKGltcG9ydGVkRW50aXR5IGFzIEZhbWl4LlN0cnVjdHVyYWxFbnRpdHkpLmRlY2xhcmVkVHlwZSA9IGFueVR5cGU7XHJcbiAgICAgICAgfSBlbHNlIHsgIC8vIGRlZmF1bHQgaW1wb3J0cywgZS5nLiBpbXBvcnQgQ2xhc3NXIGZyb20gXCIuL2NvbXBsZXhFeHBvcnRNb2R1bGVcIjsgIFxyXG4gICAgICAgICAgICBpbXBvcnRlZEVudGl0eU5hbWUgPSBpbXBvcnRFbGVtZW50LmdldFRleHQoKTtcclxuICAgICAgICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZSArIChpc0RlZmF1bHRFeHBvcnQgPyBcImRlZmF1bHRFeHBvcnRcIiA6IFwibmFtZXNwYWNlRXhwb3J0XCIpO1xyXG4gICAgICAgICAgICBpbXBvcnRlZEVudGl0eSA9IG5ldyBGYW1peC5OYW1lZEVudGl0eSgpO1xyXG4gICAgICAgICAgICBpbXBvcnRlZEVudGl0eS5uYW1lID0gaW1wb3J0ZWRFbnRpdHlOYW1lO1xyXG4gICAgICAgICAgICAvLyBpbXBvcnRlZEVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPSBwYXRoTmFtZTtcclxuICAgICAgICAgICAgaW5pdEZRTihpbXBvcnRFbGVtZW50LCBpbXBvcnRlZEVudGl0eSk7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGltcG9ydEVsZW1lbnQsIGltcG9ydGVkRW50aXR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSSBkb24ndCB0aGluayBpdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHJlcG9zaXRvcnkgaWYgaXQgZXhpc3RzIGFscmVhZHlcclxuICAgICAgICBpZiAoIWlzSW5FeHBvcnRzKSB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoaW1wb3J0ZWRFbnRpdHkpO1xyXG4gICAgICAgIGNvbnN0IGltcG9ydGVyRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihpbXBvcnRlcik7XHJcbiAgICAgICAgY29uc3QgZm14SW1wb3J0ZXIgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWUoaW1wb3J0ZXJGdWxseVF1YWxpZmllZE5hbWUpIGFzIEZhbWl4Lk1vZHVsZTtcclxuICAgICAgICBmbXhJbXBvcnRDbGF1c2UuaW1wb3J0aW5nRW50aXR5ID0gZm14SW1wb3J0ZXI7XHJcbiAgICAgICAgZm14SW1wb3J0Q2xhdXNlLmltcG9ydGVkRW50aXR5ID0gaW1wb3J0ZWRFbnRpdHk7XHJcbiAgICAgICAgaWYgKGltcG9ydERlY2xhcmF0aW9uIGluc3RhbmNlb2YgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgZm14SW1wb3J0Q2xhdXNlLm1vZHVsZVNwZWNpZmllciA9IGltcG9ydERlY2xhcmF0aW9uPy5nZXRNb2R1bGVSZWZlcmVuY2UoKS5nZXRUZXh0KCkgYXMgc3RyaW5nO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZteEltcG9ydENsYXVzZS5tb2R1bGVTcGVjaWZpZXIgPSBpbXBvcnREZWNsYXJhdGlvbj8uZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSBhcyBzdHJpbmc7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBjcmVhdGVGYW1peEltcG9ydENsYXVzZTogJHtmbXhJbXBvcnRDbGF1c2UuaW1wb3J0ZWRFbnRpdHk/Lm5hbWV9IChvZiB0eXBlICR7XHJcbiAgICAgICAgICAgIEhlbHBlcnMuZ2V0U3ViVHlwZU5hbWUoZm14SW1wb3J0Q2xhdXNlLmltcG9ydGVkRW50aXR5KX0pIGlzIGltcG9ydGVkIGJ5ICR7Zm14SW1wb3J0Q2xhdXNlLmltcG9ydGluZ0VudGl0eT8ubmFtZX1gKTtcclxuXHJcbiAgICAgICAgZm14SW1wb3J0ZXIuYWRkT3V0Z29pbmdJbXBvcnQoZm14SW1wb3J0Q2xhdXNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEltcG9ydENsYXVzZSk7XHJcblxyXG4gICAgICAgIGlmIChpbXBvcnREZWNsYXJhdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEltcG9ydENsYXVzZSwgaW1wb3J0RGVjbGFyYXRpb24pO1xyXG4gICAgICAgICAgICB0aGlzLmZteEltcG9ydENsYXVzZU1hcC5zZXQoaW1wb3J0RGVjbGFyYXRpb24sIGZteEltcG9ydENsYXVzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IEFycm93IEZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0gYXJyb3dFeHByZXNzaW9uIEFuIEV4cHJlc3Npb25cclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgdmFyaWFibGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhBcnJvd0Z1bmN0aW9uKGFycm93RXhwcmVzc2lvbjogRXhwcmVzc2lvbiwgY3VycmVudENDOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ICk6IEZhbWl4LkFycm93RnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljQXJyb3dGdW5jdGlvbiB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IGZteEFycm93RnVuY3Rpb246IEZhbWl4LkFycm93RnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljQXJyb3dGdW5jdGlvbjtcclxuICAgICAgICBjb25zdCBmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oYXJyb3dFeHByZXNzaW9uKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmhhcyhmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSkpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFycm93RnVuY3Rpb24gPSBhcnJvd0V4cHJlc3Npb24uYXNLaW5kT3JUaHJvdyhTeW50YXhLaW5kLkFycm93RnVuY3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaXNHZW5lcmljID0gYXJyb3dGdW5jdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNHZW5lcmljKSB7XHJcbiAgICAgICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNBcnJvd0Z1bmN0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uID0gbmV3IEZhbWl4LkFycm93RnVuY3Rpb24oKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgb2YgdGhlIGFycm93IGZ1bmN0aW9uICh0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24pXHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGFycm93RnVuY3Rpb24uZ2V0UGFyZW50SWZLaW5kKFN5bnRheEtpbmQuVmFyaWFibGVEZWNsYXJhdGlvbik7XHJcbiAgICAgICAgICAgIGxldCBmdW5jdGlvbk5hbWUgPSAnKE5PX05BTUUpJztcclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50IGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZVxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lID0gcGFyZW50LmdldE5hbWUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGZ1bmN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbi5uYW1lID0gZnVuY3Rpb25OYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbi5uYW1lID0gXCJhbm9ueW1vdXNcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gU2lnbmF0dXJlIG9mIGFuIGFycm93IGZ1bmN0aW9uIGlzIChwYXJhbWV0ZXJzKSA9PiByZXR1cm5fdHlwZVxyXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzU2lnbmF0dXJlID0gYXJyb3dGdW5jdGlvbi5nZXRQYXJhbWV0ZXJzKCkubWFwKHAgPT4gcC5nZXRUZXh0KCkpLmpvaW4oXCIsIFwiKTtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVHlwZVNpZ25hdHVyZSA9IGFycm93RnVuY3Rpb24uZ2V0UmV0dXJuVHlwZSgpLmdldFRleHQoKTtcclxuICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbi5zaWduYXR1cmUgPSBgKCR7cGFyYW1ldGVyc1NpZ25hdHVyZX0pID0+ICR7cmV0dXJuVHlwZVNpZ25hdHVyZX1gO1xyXG4gICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uLmN5Y2xvbWF0aWNDb21wbGV4aXR5ID0gY3VycmVudENDW2ZteEFycm93RnVuY3Rpb24ubmFtZV07XHJcblxyXG4gICAgICAgICAgICBsZXQgZnVuY3Rpb25UeXBlTmFtZSA9IHRoaXMuVU5LTk9XTl9WQUxVRTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZU5hbWUgPSBhcnJvd0Z1bmN0aW9uLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCkudHJpbSgpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIEZhaWxlZCB0byBnZXQgdXNhYmxlIG5hbWUgZm9yIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uOiAke2Z1bmN0aW9uTmFtZX0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoZnVuY3Rpb25UeXBlTmFtZSwgYXJyb3dGdW5jdGlvbiBhcyB1bmtub3duIGFzIEZ1bmN0aW9uRGVjbGFyYXRpb24pO1xyXG4gICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uLmRlY2xhcmVkVHlwZSA9IGZteFR5cGU7XHJcbiAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24ubnVtYmVyT2ZMaW5lc09mQ29kZSA9IGFycm93RnVuY3Rpb24uZ2V0RW5kTGluZU51bWJlcigpIC0gYXJyb3dGdW5jdGlvbi5nZXRTdGFydExpbmVOdW1iZXIoKTtcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IGFycm93RnVuY3Rpb24uZ2V0UGFyYW1ldGVycygpO1xyXG4gICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uLm51bWJlck9mUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uLm51bWJlck9mU3RhdGVtZW50cyA9IGFycm93RnVuY3Rpb24uZ2V0U3RhdGVtZW50cygpLmxlbmd0aDtcclxuICAgICAgICAgICAgaW5pdEZRTihhcnJvd0V4cHJlc3Npb24gYXMgdW5rbm93biBhcyBUU01vcnBoT2JqZWN0VHlwZSwgZm14QXJyb3dGdW5jdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGFycm93RXhwcmVzc2lvbiBhcyB1bmtub3duIGFzIFRTTW9ycGhPYmplY3RUeXBlLCBmbXhBcnJvd0Z1bmN0aW9uKTtcclxuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEFycm93RnVuY3Rpb24pO1xyXG4gICAgICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEFycm93RnVuY3Rpb24sYXJyb3dGdW5jdGlvbiBhcyB1bmtub3duIGFzIFRTTW9ycGhPYmplY3RUeXBlKTtcclxuICAgICAgICAgICAgdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5zZXQoZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUsIGZteEFycm93RnVuY3Rpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24gPSB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmdldChmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgRmFtaXguQXJyb3dGdW5jdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmbXhBcnJvd0Z1bmN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGNvbmNyZXRpc2F0aW9uXHJcbiAgICAgKiBAcGFyYW0gY2xzIEEgY2xhc3NcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29uY3JldGlzYXRpb25cclxuICAgICAqL1xyXG4gICAgLy8gcHVibGljIGNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb24oY29uRW50aXR5IDogRmFtaXguUGFyYW1ldHJpY0NsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSB8IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbiB8IEZhbWl4LlBhcmFtZXRyaWNNZXRob2QgLGdlbkVudGl0eSA6IEZhbWl4LlBhcmFtZXRyaWNDbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljTWV0aG9kKTogRmFtaXguQ29uY3JldGlzYXRpb24ge1xyXG4gICAgICAgIFxyXG4gICAgLy8gICAgIGNvbnN0IGZteENvbmNyZXRpc2F0aW9uIDogRmFtaXguQ29uY3JldGlzYXRpb24gPSBuZXcgRmFtaXguQ29uY3JldGlzYXRpb24oKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgLy8gICAgIGZteENvbmNyZXRpc2F0aW9uLmNvbmNyZXRlRW50aXR5ID0gY29uRW50aXR5O1xyXG4gICAgLy8gICAgIGZteENvbmNyZXRpc2F0aW9uLmdlbmVyaWNFbnRpdHkgPSBnZW5FbnRpdHk7XHJcbiAgICAvLyAgICAgLy8gdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhDb25jcmV0aXNhdGlvbixudWxsKTtcclxuICAgIC8vICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14Q29uY3JldGlzYXRpb24pOyAgICBcclxuICAgIC8vICAgICBjb25zdCBwYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiA9IHRoaXMuY3JlYXRlRmFtaXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbihmbXhDb25jcmV0aXNhdGlvbik7XHJcbiAgICAgICAgICAgIFxyXG4gICAgLy8gICAgIHJldHVybiBmbXhDb25jcmV0aXNhdGlvbjtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBjb25jcmV0aXNhdGlvblxyXG4gICAgICogQHBhcmFtIGNvbmNyZXRpc2F0aW9uIEEgRmFtaXhDb25jcmV0aXNhdGlvblxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBQYXJhbWV0ZXJDb25jcmVzdGlzYXRpb25cclxuICAgICAqL1xyXG4gICAgLy8gcHVibGljIGNyZWF0ZUZhbWl4UGFyYW1ldGVyQ29uY3JldGlzYXRpb24oY29uY3JldGlzYXRpb246IEZhbWl4LkNvbmNyZXRpc2F0aW9uKTogRmFtaXguUGFyYW1ldGVyQ29uY3JldGlzYXRpb24gfCB1bmRlZmluZWR7XHJcbiAgICAvLyAgICAgY29uc3QgY29uQ2xhc3MgPSBjb25jcmV0aXNhdGlvbi5jb25jcmV0ZUVudGl0eTtcclxuICAgIC8vICAgICBjb25zdCBnZW5DbGFzcyA9IGNvbmNyZXRpc2F0aW9uLmdlbmVyaWNFbnRpdHk7XHJcbiAgICAvLyAgICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBwYXJhbWV0ZXIgY29uY3JldGlzYXRpb24gYmV0d2VlbiAke2NvbkNsYXNzLmZ1bGx5UXVhbGlmaWVkTmFtZX0gYW5kICR7Z2VuQ2xhc3MuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG4gICAgLy8gICAgIGNvbnN0IHBhcmFtZXRlckNvbmNyZXRpc2F0aW9ucyA9IHRoaXMuZmFtaXhSZXAuX2dldEFsbEVudGl0aWVzV2l0aFR5cGUoXCJQYXJhbWV0ZXJDb25jcmV0aXNhdGlvblwiKSBhcyBTZXQ8RmFtaXguUGFyYW1ldGVyQ29uY3JldGlzYXRpb24+O1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbmNyZXRlUGFyYW1ldGVycyA9IGNvbkNsYXNzLmNvbmNyZXRlUGFyYW1ldGVycztcclxuICAgIC8vICAgICBjb25zdCBnZW5lcmljUGFyYW1ldGVycyA9IGdlbkNsYXNzLmdlbmVyaWNQYXJhbWV0ZXJzO1xyXG4gICAgICAgIFxyXG4gICAgLy8gICAgIGxldCBjb25DbGFzc1R5cGVQYXJhbWV0ZXJzSXRlcmF0b3IgPSBjb25jcmV0ZVBhcmFtZXRlcnMudmFsdWVzKCk7XHJcbiAgICAvLyAgICAgbGV0IGdlbkNsYXNzVHlwZVBhcmFtZXRlcnNJdGVyYXRvciA9IGdlbmVyaWNQYXJhbWV0ZXJzLnZhbHVlcygpO1xyXG4gICAgLy8gICAgIGxldCBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiA6IEZhbWl4LlBhcmFtZXRlckNvbmNyZXRpc2F0aW9uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdlbmVyaWNQYXJhbWV0ZXJzLnNpemU7IGkrKykge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBjb25DbGFzc1R5cGVQYXJhbWV0ZXIgPSBjb25DbGFzc1R5cGVQYXJhbWV0ZXJzSXRlcmF0b3IubmV4dCgpLnZhbHVlIGFzIEZhbWl4LlBhcmFtZXRlclR5cGU7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGdlbkNsYXNzVHlwZVBhcmFtZXRlciA9IGdlbkNsYXNzVHlwZVBhcmFtZXRlcnNJdGVyYXRvci5uZXh0KCkudmFsdWUgYXMgRmFtaXguUGFyYW1ldGVyVHlwZTtcclxuICAgIC8vICAgICAgICAgbGV0IGNyZWF0ZVBhcmFtZXRlckNvbmNyZXRpc2F0aW9uIDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvLyAgICAgICAgIGlmKGNvbkNsYXNzVHlwZVBhcmFtZXRlciAmJiBnZW5DbGFzc1R5cGVQYXJhbWV0ZXIgJiYgY29uQ2xhc3NUeXBlUGFyYW1ldGVyLm5hbWUgIT0gZ2VuQ2xhc3NUeXBlUGFyYW1ldGVyLm5hbWUpe1xyXG4gICAgLy8gICAgICAgICAgICAgcGFyYW1ldGVyQ29uY3JldGlzYXRpb25zLmZvckVhY2goKHBhcmFtIDogRmFtaXguUGFyYW1ldGVyQ29uY3JldGlzYXRpb24pID0+IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoY29uQ2xhc3NUeXBlUGFyYW1ldGVyLm5hbWUgPT0gcGFyYW0uY29uY3JldGVQYXJhbWV0ZXIubmFtZSAmJiBnZW5DbGFzc1R5cGVQYXJhbWV0ZXIubmFtZSA9PSBwYXJhbS5nZW5lcmljUGFyYW1ldGVyLm5hbWUpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUGFyYW1ldGVyQ29uY3JldGlzYXRpb24gPSBmYWxzZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24gPSBwYXJhbTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9KVxyXG4gICAgLy8gICAgICAgICAgICAgaWYgKGNyZWF0ZVBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24gPSBuZXcgRmFtaXguUGFyYW1ldGVyQ29uY3JldGlzYXRpb24oKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbi5nZW5lcmljUGFyYW1ldGVyID0gZ2VuQ2xhc3NUeXBlUGFyYW1ldGVyO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uLmNvbmNyZXRlUGFyYW1ldGVyID0gY29uQ2xhc3NUeXBlUGFyYW1ldGVyO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uLmFkZENvbmNyZXRpc2F0aW9uKGNvbmNyZXRpc2F0aW9uKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAvLyB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uLG51bGwpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoIWZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24gd2FzIHVuZGVmaW5lZCBmb3IgY29uY3JldGlzYXRpb24gd2l0aCBnZW5lcmljIHBhcmFtZXRlciAke2dlbkNsYXNzVHlwZVBhcmFtZXRlci5uYW1lfSBhbmQgY29uY3JldGUgcGFyYW1ldGVyICR7Y29uQ2xhc3NUeXBlUGFyYW1ldGVyLm5hbWV9YCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uLmFkZENvbmNyZXRpc2F0aW9uKGNvbmNyZXRpc2F0aW9uKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbik7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgaWYgKCFmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbikge1xyXG4gICAgLy8gICAgICAgICBsb2dnZXIuZXJyb3IoYGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uIHdhcyB1bmRlZmluZWQgZm9yIGNvbmNyZXRpc2F0aW9uIHdpdGggY29uY3JldGUgZW50aXR5ICR7Y29uQ2xhc3MuZnVsbHlRdWFsaWZpZWROYW1lfSBhbmQgZ2VuZXJpYyBlbnRpdHkgJHtnZW5DbGFzcy5mdWxseVF1YWxpZmllZE5hbWV9YCk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbjtcclxuXHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb24gYmV0d2VlbiB0d28gY2xhc3NlcyBvciB0d28gaW50ZXJmYWNlc1xyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgQSBjbGFzcyBvciBhbiBJbnRlcmZhY2VcclxuICAgICAqL1xyXG4gICAgLy8gcHVibGljIGNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25DbGFzc09ySW50ZXJmYWNlU3BlY2lhbGlzYXRpb24oZWxlbWVudDogQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uKXtcclxuICAgICAgICBcclxuICAgIC8vICAgICBjb25zdCBzdXBlckVudGl0eSA9IGVsZW1lbnQuZ2V0RXh0ZW5kcygpO1xyXG4gICAgLy8gICAgIGxldCBzdXBlckVudGl0eUFycmF5O1xyXG4gICAgLy8gICAgIGlmIChzdXBlckVudGl0eSl7XHJcbiAgICAvLyAgICAgICAgIHN1cGVyRW50aXR5QXJyYXkgPSBBcnJheS5pc0FycmF5KHN1cGVyRW50aXR5KSA/IHN1cGVyRW50aXR5IDogW3N1cGVyRW50aXR5XTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgaWYgKHN1cGVyRW50aXR5QXJyYXkgJiYgc3VwZXJFbnRpdHlBcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIHN1cGVyRW50aXR5QXJyYXkuZm9yRWFjaChlbnRpdHkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgbGV0IGVudGl0eUlzR2VuZXJpYztcclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHN1cGVyRW50aXR5U3ltYm9sID0gZW50aXR5LmdldEV4cHJlc3Npb24oKS5nZXRTeW1ib2xPclRocm93KCk7XHJcbiAgICAvLyAgICAgICAgICAgICBsZXQgc3VwZXJFbnRpdHlEZWNsYXJhdGlvbjtcclxuICAgIC8vICAgICAgICAgICAgIGlmIChzdXBlckVudGl0eSBpbnN0YW5jZW9mIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHN1cGVyRW50aXR5RGVjbGFyYXRpb24gPSBzdXBlckVudGl0eVN5bWJvbC5nZXREZWNsYXJhdGlvbnMoKVswXS5hc0tpbmQodHMuU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgc3VwZXJFbnRpdHlEZWNsYXJhdGlvbiA9IHN1cGVyRW50aXR5U3ltYm9sLmdldERlY2xhcmF0aW9ucygpWzBdLmFzS2luZCh0cy5TeW50YXhLaW5kLkludGVyZmFjZURlY2xhcmF0aW9uKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIGlmIChzdXBlckVudGl0eURlY2xhcmF0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgZW50aXR5SXNHZW5lcmljID0gc3VwZXJFbnRpdHlEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDA7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoZW50aXR5SXNHZW5lcmljKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbGV0IEVudGl0eURlY2xhcmF0aW9uO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGxldCBnZW5FbnRpdHk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHN1cGVyRW50aXR5IGluc3RhbmNlb2YgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIEVudGl0eURlY2xhcmF0aW9uID0gZW50aXR5LmdldEV4cHJlc3Npb24oKS5nZXRTeW1ib2woKT8uZ2V0RGVjbGFyYXRpb25zKClbMF0gYXMgQ2xhc3NEZWNsYXJhdGlvbjtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgZ2VuRW50aXR5ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3MoRW50aXR5RGVjbGFyYXRpb24pIGFzIEZhbWl4LlBhcmFtZXRyaWNDbGFzcztcclxuICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBFbnRpdHlEZWNsYXJhdGlvbiA9IGVudGl0eS5nZXRFeHByZXNzaW9uKCkuZ2V0U3ltYm9sKCk/LmdldERlY2xhcmF0aW9ucygpWzBdIGFzIEludGVyZmFjZURlY2xhcmF0aW9uO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBnZW5FbnRpdHkgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoRW50aXR5RGVjbGFyYXRpb24pIGFzIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2U7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGdlblBhcmFtcyA9IEVudGl0eURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKChwYXJhbSkgPT4gcGFyYW0uZ2V0VGV4dCgpKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gZWxlbWVudC5nZXRIZXJpdGFnZUNsYXVzZXMoKVswXS5nZXRUeXBlTm9kZXMoKVswXS5nZXRUeXBlQXJndW1lbnRzKClcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zdCBjb25QYXJhbXMgPSBlbGVtZW50LmdldEhlcml0YWdlQ2xhdXNlcygpWzBdLmdldFR5cGVOb2RlcygpWzBdLmdldFR5cGVBcmd1bWVudHMoKS5tYXAoKHBhcmFtKSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmICghSGVscGVycy5hcnJheXNBcmVFcXVhbChjb25QYXJhbXMsZ2VuUGFyYW1zKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY29uRW50aXR5O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25FbnRpdHkgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoZ2VuRW50aXR5LEVudGl0eURlY2xhcmF0aW9uLGFyZ3MpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25jcmV0aXNhdGlvbnMgPSB0aGlzLmZhbWl4UmVwLl9nZXRBbGxFbnRpdGllc1dpdGhUeXBlKFwiQ29uY3JldGlzYXRpb25cIikgYXMgU2V0PEZhbWl4LkNvbmNyZXRpc2F0aW9uPjtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZUNvbmNyZXRpc2F0aW9uIDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChjb25jIDogRmFtaXguQ29uY3JldGlzYXRpb24pID0+IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5FbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbmMuZ2VuZXJpY0VudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgJiYgY29uYy5jb25jcmV0ZUVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSl7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29uY3JldGlzYXRpb24gPSBmYWxzZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlQ29uY3JldGlzYXRpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZteENvbmNyZXRpc2F0aW9uIDogRmFtaXguQ29uY3JldGlzYXRpb24gPSB0aGlzLmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb24oY29uRW50aXR5LGdlbkVudGl0eSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNlZW1zIHVuZmluaXNoZWRcclxuICAgIC8vIH0gICAgXHJcbiAgICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBjb25jcmV0aXNhdGlvbiBiZXR3ZWVuIGEgY2xhc3MgYW5kIGl0cyBpbnN0YW5jaWF0aW9uc1xyXG4gICAgICogQHBhcmFtIGNscyBBIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBjcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uR2VuZXJpY0luc3RhbnRpYXRpb24oY2xzOiBDbGFzc0RlY2xhcmF0aW9uKXtcclxuICAgICAgIFxyXG4gICAgLy8gICAgIGNvbnN0IGlzR2VuZXJpYyA9IGNscy5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDA7XHJcbiAgICAvLyAgICAgaWYgKGlzR2VuZXJpYykge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBpbnN0YW5jZXMgPSBjbHMuZ2V0U291cmNlRmlsZSgpLmdldERlc2NlbmRhbnRzT2ZLaW5kKHRzLlN5bnRheEtpbmQuTmV3RXhwcmVzc2lvbilcclxuICAgIC8vICAgICAgICAgICAgIC5maWx0ZXIobmV3RXhwciA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IG5ld0V4cHIuZ2V0RXhwcmVzc2lvbigpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLmdldFRleHQoKSA9PT0gY2xzLmdldE5hbWUoKTtcclxuICAgIC8vICAgICAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgICAgICBpbnN0YW5jZXMuZm9yRWFjaChpbnN0YW5jZSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZUlzR2VuZXJpYyA9IGluc3RhbmNlLmdldFR5cGVBcmd1bWVudHMoKS5sZW5ndGggPiAwO1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKGluc3RhbmNlSXNHZW5lcmljKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3QgY29uUGFyYW1zID0gaW5zdGFuY2UuZ2V0VHlwZUFyZ3VtZW50cygpLm1hcCgocGFyYW0pID0+IHBhcmFtLmdldFRleHQoKSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3QgZ2VuRW50aXR5ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3MoY2xzKSBhcyBGYW1peC5QYXJhbWV0cmljQ2xhc3M7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3QgZ2VuUGFyYW1zID0gY2xzLmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKChwYXJhbSkgPT4gcGFyYW0uZ2V0VGV4dCgpKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoIUhlbHBlcnMuYXJyYXlzQXJlRXF1YWwoY29uUGFyYW1zLGdlblBhcmFtcykpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbkVudGl0eTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uRW50aXR5ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q29uY3JldGVFbGVtZW50KGdlbkVudGl0eSxjbHMsaW5zdGFuY2UuZ2V0VHlwZUFyZ3VtZW50cygpKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY3JldGlzYXRpb25zID0gdGhpcy5mYW1peFJlcC5fZ2V0QWxsRW50aXRpZXNXaXRoVHlwZShcIkNvbmNyZXRpc2F0aW9uXCIpIGFzIFNldDxGYW1peC5Db25jcmV0aXNhdGlvbj47XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxldCBjcmVhdGVDb25jcmV0aXNhdGlvbiA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25jcmV0aXNhdGlvbnMuZm9yRWFjaCgoY29uYyA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25jLmdlbmVyaWNFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lICYmIGNvbmMuY29uY3JldGVFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbkVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUpe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmNyZXRpc2F0aW9uID0gZmFsc2U7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUNvbmNyZXRpc2F0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbiA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gdGhpcy5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uKGNvbkVudGl0eSxnZW5FbnRpdHkpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9KVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNlZW1zIHVuZmluaXNoZWRcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBjb25jcmV0aXNhdGlvbiBiZXR3ZWVuIGEgY2xhc3MgYW5kIGl0cyBpbnN0YW5jaWF0aW9uc1xyXG4gICAgICogQHBhcmFtIGZ1bmMgQSBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkZ1bmN0aW9uSW5zdGFudGlhdGlvbihlbGVtZW50OiBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24pe1xyXG4gICAgLy8gICAgIGNvbnN0IGlzR2VuZXJpYyA9IGVsZW1lbnQuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xyXG4gICAgLy8gICAgIGlmIChpc0dlbmVyaWMpIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgZ2VuUGFyYW1zID0gZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpLm1hcChwYXJhbSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xyXG4gICAgLy8gICAgICAgICBjb25zdCB1c2VzID0gZWxlbWVudC5maW5kUmVmZXJlbmNlc0FzTm9kZXMoKTsgICAgXHJcbiAgICAvLyAgICAgICAgIHVzZXMuZm9yRWFjaCh1c2FnZSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCB1bmRlZmluZWQgPSB1c2FnZTtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxFeHByZXNzaW9uID0gY3VycmVudE5vZGUuYXNLaW5kKFN5bnRheEtpbmQuQ2FsbEV4cHJlc3Npb24pO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbGxFeHByZXNzaW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbGxFeHByZXNzaW9uIG5vdCBmb3VuZCBmb3IgJHtjdXJyZW50Tm9kZS5nZXRUZXh0KCl9YCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VJc0dlbmVyaWMgPSBjYWxsRXhwcmVzc2lvbi5nZXRUeXBlQXJndW1lbnRzKCkubGVuZ3RoID4gMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlSXNHZW5lcmljKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gY2FsbEV4cHJlc3Npb24uZ2V0VHlwZUFyZ3VtZW50cygpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uUGFyYW1zID0gY2FsbEV4cHJlc3Npb24uZ2V0VHlwZUFyZ3VtZW50cygpLm1hcChwYXJhbSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFIZWxwZXJzLmFycmF5c0FyZUVxdWFsKGNvblBhcmFtcyxnZW5QYXJhbXMpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdlbkVsZW1lbnQ7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uRGVjbGFyYXRpb24pe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5FbGVtZW50ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4RnVuY3Rpb24oZWxlbWVudCwge30pIGFzIEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbjtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5FbGVtZW50ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4TWV0aG9kKGVsZW1lbnQsIHt9KSBhcyBGYW1peC5QYXJhbWV0cmljTWV0aG9kO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uY0VsZW1lbnQ7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY0VsZW1lbnQgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoZ2VuRWxlbWVudCxlbGVtZW50LGFyZ3MpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNyZXRpc2F0aW9ucyA9IHRoaXMuZmFtaXhSZXAuX2dldEFsbEVudGl0aWVzV2l0aFR5cGUoXCJDb25jcmV0aXNhdGlvblwiKSBhcyBTZXQ8RmFtaXguQ29uY3JldGlzYXRpb24+O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjcmVhdGVDb25jcmV0aXNhdGlvbiA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChjb25jIDogRmFtaXguQ29uY3JldGlzYXRpb24pID0+IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbkVsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbmMuZ2VuZXJpY0VudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgJiYgY29uYy5jb25jcmV0ZUVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uY0VsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lKXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmNyZXRpc2F0aW9uID0gZmFsc2U7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlQ29uY3JldGlzYXRpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm14Q29uY3JldGlzYXRpb24gOiBGYW1peC5Db25jcmV0aXNhdGlvbiA9IHRoaXMuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbihjb25jRWxlbWVudCxnZW5FbGVtZW50KTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIC8vIFJlbW9udGVyIMOgIGwnw6lsw6ltZW50IHBhcmVudCAodXRpbGUgc2kgbGUgbsWTdWQgZGUgcsOpZsOpcmVuY2UgZXN0IHVuIGVuZmFudClcclxuICAgIC8vICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9KTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb24gYmV0d2VlbiBhIGNsYXNzIGFuZCBhbiBpbnRlcmZhY2VcclxuICAgICAqIEBwYXJhbSBjbHMgQSBjbGFzc1xyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkludGVyZmFjZUNsYXNzKGNsczogQ2xhc3NEZWNsYXJhdGlvbil7XHJcbiAgICBcclxuICAgIC8vICAgICBjb25zdCBzdXBlckludGVyZmFjZXMgPSBjbHMuZ2V0SW1wbGVtZW50cygpO1xyXG4gICAgLy8gICAgIHN1cGVySW50ZXJmYWNlcy5mb3JFYWNoKGludGVyZmFjZVR5cGUgPT4ge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBpbnRlcmZhY2VJc0dlbmVyaWMgPSBpbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKS5sZW5ndGg+MDtcclxuICAgIC8vICAgICAgICAgaWYgKGludGVyZmFjZUlzR2VuZXJpYykge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgaW50ZXJmYWNlRGVjbGFyYXRpb24gPSBpbnRlcmZhY2VUeXBlLmdldEV4cHJlc3Npb24oKS5nZXRTeW1ib2woKT8uZ2V0RGVjbGFyYXRpb25zKClbMF0gYXMgSW50ZXJmYWNlRGVjbGFyYXRpb247XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBnZW5QYXJhbXMgPSBpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLm1hcCgocGFyYW0pID0+IHBhcmFtLmdldFRleHQoKSk7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBjb25QYXJhbXMgPSBjbHMuZ2V0SGVyaXRhZ2VDbGF1c2VzKClbMF0uZ2V0VHlwZU5vZGVzKClbMF0uZ2V0VHlwZUFyZ3VtZW50cygpLm1hcCgocGFyYW0pID0+IHBhcmFtLmdldFRleHQoKSk7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBhcmdzID0gY2xzLmdldEhlcml0YWdlQ2xhdXNlcygpWzBdLmdldFR5cGVOb2RlcygpWzBdLmdldFR5cGVBcmd1bWVudHMoKTtcclxuICAgIC8vICAgICAgICAgICAgIGlmICghSGVscGVycy5hcnJheXNBcmVFcXVhbChjb25QYXJhbXMsZ2VuUGFyYW1zKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGdlbkludGVyZmFjZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZShpbnRlcmZhY2VEZWNsYXJhdGlvbikgYXMgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zdCBjb25JbnRlcmZhY2UgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoZ2VuSW50ZXJmYWNlLGludGVyZmFjZURlY2xhcmF0aW9uLGFyZ3MpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNyZXRpc2F0aW9ucyA9IHRoaXMuZmFtaXhSZXAuX2dldEFsbEVudGl0aWVzV2l0aFR5cGUoXCJDb25jcmV0aXNhdGlvblwiKSBhcyBTZXQ8RmFtaXguQ29uY3JldGlzYXRpb24+O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGxldCBjcmVhdGVDb25jcmV0aXNhdGlvbiA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChjb25jIDogRmFtaXguQ29uY3JldGlzYXRpb24pID0+IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbkludGVyZmFjZS5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uYy5nZW5lcmljRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSAmJiBjb25jLmNvbmNyZXRlRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25JbnRlcmZhY2UuZnVsbHlRdWFsaWZpZWROYW1lKXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmNyZXRpc2F0aW9uID0gZmFsc2U7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUNvbmNyZXRpc2F0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZteENvbmNyZXRpc2F0aW9uIDogRmFtaXguQ29uY3JldGlzYXRpb24gPSB0aGlzLmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb24oY29uSW50ZXJmYWNlLGdlbkludGVyZmFjZSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb24gYmV0d2VlbiBhbiBpbnRlcmZhY2UgYW5kIGEgVHlwZVxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgQSB2YXJpYWJsZSBvciBhIGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0gaW50ZXIgQW4gaW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBjcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uVHlwZUluc3RhbmNpYXRpb24oZWxlbWVudDogSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBDbGFzc0RlY2xhcmF0aW9uKXtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgaXNHZW5lcmljID0gZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDA7XHJcbiAgICAvLyAgICAgaWYgKGlzR2VuZXJpYykge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBnZW5QYXJhbXMgPSBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKHBhcmFtID0+IHBhcmFtLmdldFRleHQoKSk7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHVzZXMgPSBlbGVtZW50LmZpbmRSZWZlcmVuY2VzQXNOb2RlcygpO1xyXG4gICAgLy8gICAgICAgICB1c2VzLmZvckVhY2godXNlID0+IHsgICAgICAgIFxyXG4gICAgLy8gICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB1c2UuZ2V0UGFyZW50KCk7XHJcbiAgICAvLyAgICAgICAgICAgICB3aGlsZSAocGFyZW50Tm9kZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVSZWZlcmVuY2VOb2RlID0gcGFyZW50Tm9kZS5hc0tpbmQoU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaWYgKCF0eXBlUmVmZXJlbmNlTm9kZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlUmVmZXJlbmNlTm9kZSBub3QgZm91bmQgZm9yICR7cGFyZW50Tm9kZS5nZXRUZXh0KCl9YCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZVJlZmVyZW5jZU5vZGVJc0dlbmVyaWMgPSB0eXBlUmVmZXJlbmNlTm9kZS5nZXRUeXBlQXJndW1lbnRzKCkubGVuZ3RoID4gMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVSZWZlcmVuY2VOb2RlSXNHZW5lcmljKSB7fVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IHR5cGVSZWZlcmVuY2VOb2RlLmdldFR5cGVBcmd1bWVudHMoKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvblBhcmFtcyA9IHR5cGVSZWZlcmVuY2VOb2RlLmdldFR5cGVBcmd1bWVudHMoKS5tYXAocGFyYW0gPT4gcGFyYW0uZ2V0VGV4dCgpKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSGVscGVycy5hcnJheXNBcmVFcXVhbChjb25QYXJhbXMsZ2VuUGFyYW1zKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZW5FbGVtZW50O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuRWxlbWVudCA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peENsYXNzKGVsZW1lbnQpIGFzIEZhbWl4LlBhcmFtZXRyaWNDbGFzcztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5FbGVtZW50ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlKGVsZW1lbnQpIGFzIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2U7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25jRWxlbWVudDtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jRWxlbWVudCA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peENvbmNyZXRlRWxlbWVudChnZW5FbGVtZW50LGVsZW1lbnQsYXJncyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY3JldGlzYXRpb25zID0gdGhpcy5mYW1peFJlcC5fZ2V0QWxsRW50aXRpZXNXaXRoVHlwZShcIkNvbmNyZXRpc2F0aW9uXCIpIGFzIFNldDxGYW1peC5Db25jcmV0aXNhdGlvbj47XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZUNvbmNyZXRpc2F0aW9uIDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3JldGlzYXRpb25zLmZvckVhY2goKGNvbmMgOiBGYW1peC5Db25jcmV0aXNhdGlvbikgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuRWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uYy5nZW5lcmljRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSAmJiBjb25jLmNvbmNyZXRlRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25jRWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUpe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29uY3JldGlzYXRpb24gPSBmYWxzZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVDb25jcmV0aXNhdGlvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbiA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gdGhpcy5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uKGNvbmNFbGVtZW50LGdlbkVsZW1lbnQpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLmdldFBhcmVudCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9KTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIGNvbnZlcnRUb1JlbGF0aXZlUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZywgYWJzb2x1dGVQYXRoUHJvamVjdDogc3RyaW5nKSB7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBjb252ZXJ0VG9SZWxhdGl2ZVBhdGg6IGFic29sdXRlUGF0aDogJyR7YWJzb2x1dGVQYXRofScsIGFic29sdXRlUGF0aFByb2plY3Q6ICcke2Fic29sdXRlUGF0aFByb2plY3R9J2ApO1xyXG4gICAgICAgIGlmIChhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aChhYnNvbHV0ZVBhdGhQcm9qZWN0KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYWJzb2x1dGVQYXRoLnJlcGxhY2UoYWJzb2x1dGVQYXRoUHJvamVjdCwgXCJcIikuc2xpY2UoMSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUGF0aC5zbGljZSgxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gYWJzb2x1dGVQYXRoO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlVHlwZSh0eXBlTmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdHlwZU5hbWUgPT09IFwibnVtYmVyXCIgfHxcclxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJzdHJpbmdcIiB8fFxyXG4gICAgICAgIHR5cGVOYW1lID09PSBcImJvb2xlYW5cIiB8fFxyXG4gICAgICAgIHR5cGVOYW1lID09PSBcImJpZ2ludFwiIHx8XHJcbiAgICAgICAgdHlwZU5hbWUgPT09IFwic3ltYm9sXCIgfHxcclxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJ1bmRlZmluZWRcIiB8fFxyXG4gICAgICAgIHR5cGVOYW1lID09PSBcIm51bGxcIiB8fFxyXG4gICAgICAgIHR5cGVOYW1lID09PSBcImFueVwiIHx8XHJcbiAgICAgICAgdHlwZU5hbWUgPT09IFwidW5rbm93blwiIHx8XHJcbiAgICAgICAgdHlwZU5hbWUgPT09IFwibmV2ZXJcIiB8fFxyXG4gICAgICAgIHR5cGVOYW1lID09PSBcInZvaWRcIjtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEZRTihzb3VyY2VFbGVtZW50OiBUU01vcnBoT2JqZWN0VHlwZSwgZmFtaXhFbGVtZW50OiBGYW1peC5Tb3VyY2VkRW50aXR5KSB7XHJcbiAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBlbGVtZW50IGlzIGEgVHlwZSAtLSBuZWVkIHRvIGNoYW5nZSBpdHMgbmFtZVxyXG4gICAgaWYgKGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlR5cGUgJiYgIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgQ29tbWVudFJhbmdlKSAmJiBpc1R5cGVDb250ZXh0KHNvdXJjZUVsZW1lbnQpKSB7XHJcbiAgICAgICAgbGV0IGZxbiA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oc291cmNlRWxlbWVudCk7XHJcbiAgICAgICAgLy8gdXNpbmcgcmVnZXgsIHJlcGxhY2UgW2JsYWhdIHdpdGggW2JsYWhUeXBlXVxyXG4gICAgICAgIGZxbiA9IGZxbi5yZXBsYWNlKC9cXFsoW15cXF1dKylcXF0vZywgXCJbJDFUeXBlXVwiKTtcclxuICAgICAgICBsb2dnZXIuaW5mbyhcIlNldHRpbmcgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIFwiICsgZmFtaXhFbGVtZW50LmdldEpTT04oKSArIFwiIHRvIFwiICsgZnFuKTtcclxuICAgICAgICBmYW1peEVsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lID0gZnFuO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIGNhdGNoIGFsbCAoZXhjZXB0IGNvbW1lbnRzKVxyXG4gICAgaWYgKCEoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIENvbW1lbnRSYW5nZSkpIHtcclxuICAgICAgICBjb25zdCBmcW4gPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKHNvdXJjZUVsZW1lbnQpO1xyXG4gICAgICAgIGxvZ2dlci5pbmZvKFwiU2V0dGluZyBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgXCIgKyBmYW1peEVsZW1lbnQuZ2V0SlNPTigpICsgXCIgdG8gXCIgKyBmcW4pO1xyXG4gICAgICAgIChmYW1peEVsZW1lbnQgYXMgRmFtaXguTmFtZWRFbnRpdHkpLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZxbjtcclxuICAgIH0gXHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBpc1R5cGVDb250ZXh0KHNvdXJjZUVsZW1lbnQ6IEltcG9ydERlY2xhcmF0aW9uIHwgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24gfCBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBWYXJpYWJsZURlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IFByb3BlcnR5U2lnbmF0dXJlIHwgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgSWRlbnRpZmllciB8IERlY29yYXRvciB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgSW1wb3J0U3BlY2lmaWVyIHwgRW51bURlY2xhcmF0aW9uIHwgRW51bU1lbWJlciB8IFR5cGVBbGlhc0RlY2xhcmF0aW9uIHwgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIHwgVFNNb3JwaFBhcmFtZXRyaWNUeXBlKSB7XHJcbiAgICByZXR1cm4gc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb25cclxuICAgICAgICB8fCBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gIFxyXG4gICAgICAgIHx8IHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbkRlY2xhcmF0aW9uIFxyXG4gICAgICAgIHx8IHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbkV4cHJlc3Npb24gXHJcbiAgICAgICAgfHwgc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEFycm93RnVuY3Rpb25cclxuICAgICAgICB8fFxyXG4gICAgICAgIHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8fFxyXG4gICAgICAgIHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uIHx8XHJcbiAgICAgICAgc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIFByb3BlcnR5RGVjbGFyYXRpb24gfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgUHJvcGVydHlTaWduYXR1cmUgfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHx8XHJcbiAgICAgICAgc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpZXIgfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgRGVjb3JhdG9yIHx8XHJcbiAgICAgICAgc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fFxyXG4gICAgICAgIHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBJbXBvcnRTcGVjaWZpZXIgfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgRW51bURlY2xhcmF0aW9uIHx8XHJcbiAgICAgICAgc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEVudW1NZW1iZXIgfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgVHlwZUFsaWFzRGVjbGFyYXRpb25cclxuICAgICAgICB8fCBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgSW1wb3J0RGVjbGFyYXRpb25cclxuICAgICAgICB8fCBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzO1xyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gZ2V0SW50ZXJmYWNlRGVjbGFyYXRpb25Gcm9tRXhwcmVzc2lvbihleHByZXNzaW9uOiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpOiBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAvLyBTdGVwIDE6IEdldCB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvblxyXG4gICAgY29uc3QgdHlwZSA9IGV4cHJlc3Npb24uZ2V0VHlwZSgpO1xyXG5cclxuICAgIC8vIFN0ZXAgMjogR2V0IHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlXHJcbiAgICBsZXQgc3ltYm9sID0gdHlwZS5nZXRTeW1ib2woKTtcclxuXHJcbiAgICBpZiAoIXN5bWJvbCkge1xyXG4gICAgICAgIC8vIElmIHN5bWJvbCBpcyBub3QgZm91bmQsIHRyeSB0byBnZXQgdGhlIHN5bWJvbCBmcm9tIHRoZSBpZGVudGlmaWVyXHJcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGV4cHJlc3Npb24uZ2V0Rmlyc3REZXNjZW5kYW50QnlLaW5kKFN5bnRheEtpbmQuSWRlbnRpZmllcik7XHJcbiAgICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWRlbnRpZmllciBub3QgZm91bmQgZm9yICR7ZXhwcmVzc2lvbi5nZXRUZXh0KCl9LmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzeW1ib2wgPSBpZGVudGlmaWVyLmdldFN5bWJvbCgpO1xyXG4gICAgICAgIGlmICghc3ltYm9sKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3ltYm9sIG5vdCBmb3VuZCBmb3IgJHtpZGVudGlmaWVyLmdldFRleHQoKX0uYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0ZXAgMzogUmVzb2x2ZSB0aGUgc3ltYm9sIHRvIGZpbmQgdGhlIGFjdHVhbCBkZWNsYXJhdGlvblxyXG4gICAgY29uc3QgaW50ZXJmYWNlRGVjbGFyYXRpb24gPSByZXNvbHZlU3ltYm9sVG9JbnRlcmZhY2VEZWNsYXJhdGlvbihzeW1ib2wpO1xyXG5cclxuICAgIGlmICghaW50ZXJmYWNlRGVjbGFyYXRpb24pIHtcclxuICAgICAgICBsb2dnZXIuZXJyb3IoYEludGVyZmFjZSBkZWNsYXJhdGlvbiBub3QgZm91bmQgZm9yICR7ZXhwcmVzc2lvbi5nZXRUZXh0KCl9LmApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbnRlcmZhY2VEZWNsYXJhdGlvbjtcclxufVxyXG5cclxuaW1wb3J0IHsgU3ltYm9sIGFzIFRTTW9ycGhTeW1ib2wgfSBmcm9tIFwidHMtbW9ycGhcIjtcclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVTeW1ib2xUb0ludGVyZmFjZURlY2xhcmF0aW9uKHN5bWJvbDogVFNNb3JwaFN5bWJvbCk6IEludGVyZmFjZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIC8vIEdldCB0aGUgZGVjbGFyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sXHJcbiAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBzeW1ib2wuZ2V0RGVjbGFyYXRpb25zKCk7XHJcblxyXG4gICAgLy8gRmlsdGVyIGZvciBJbnRlcmZhY2VEZWNsYXJhdGlvblxyXG4gICAgY29uc3QgaW50ZXJmYWNlRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbnMuZmluZChkZWNsYXJhdGlvbiA9PiBkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSBhcyBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBpZiAoaW50ZXJmYWNlRGVjbGFyYXRpb24pIHtcclxuICAgICAgICByZXR1cm4gaW50ZXJmYWNlRGVjbGFyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIGltcG9ydHM6IElmIHRoZSBzeW1ib2wgaXMgaW1wb3J0ZWQsIHJlc29sdmUgdGhlIGltcG9ydCB0byBmaW5kIHRoZSBhY3R1YWwgZGVjbGFyYXRpb25cclxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZGVjbGFyYXRpb25zKSB7XHJcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5JbXBvcnRTcGVjaWZpZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgaW1wb3J0U3BlY2lmaWVyID0gZGVjbGFyYXRpb24gYXMgSW1wb3J0U3BlY2lmaWVyO1xyXG4gICAgICAgICAgICBjb25zdCBpbXBvcnREZWNsYXJhdGlvbiA9IGltcG9ydFNwZWNpZmllci5nZXRJbXBvcnREZWNsYXJhdGlvbigpO1xyXG4gICAgICAgICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBpbXBvcnREZWNsYXJhdGlvbi5nZXRNb2R1bGVTcGVjaWZpZXJTb3VyY2VGaWxlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobW9kdWxlU3BlY2lmaWVyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleHBvcnRlZFN5bWJvbHMgPSBtb2R1bGVTcGVjaWZpZXIuZ2V0RXhwb3J0U3ltYm9scygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWRTeW1ib2wgPSBleHBvcnRlZFN5bWJvbHMuZmluZChzeW1ib2wgPT4gc3ltYm9sLmdldE5hbWUoKSA9PT0gaW1wb3J0U3BlY2lmaWVyLmdldE5hbWUoKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhwb3J0ZWRTeW1ib2wpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVN5bWJvbFRvSW50ZXJmYWNlRGVjbGFyYXRpb24oZXhwb3J0ZWRTeW1ib2wpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8vIGZ1bmN0aW9uIG9sZEdldEludGVyZmFjZURlY2xhcmF0aW9uRnJvbUV4cHJlc3Npb24oZXhwcmVzc2lvbjogRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKTogSW50ZXJmYWNlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xyXG4vLyAgICAgLy8gVHdvIGNhc2VzOlxyXG4vLyAgICAgLy8gY2xhc3MgQSBpbXBsZW1lbnRzIEltcG9ydGVkSW50ZXJmYWNlLCBEZWNsYXJlZEludGVyZmFjZSB7fVxyXG4vLyAgICAgY29uc3QgdHlwZSA9IGV4cHJlc3Npb24uZ2V0VHlwZSgpO1xyXG5cclxuLy8gICAgIC8vIEltcG9ydGVkSW50ZXJmYWNlOiB0eXBlIHdpbGwgYSBzeW1ib2wgXHJcbi8vICAgICBsZXQgc3ltYm9sID0gdHlwZS5nZXRBbGlhc1N5bWJvbCgpOyAgLy8gd2lsbCBiZSBkZWZpbmVkIGZvciBpbXBvcnRlZCBpbnRlcmZhY2VzXHJcblxyXG4vLyAgICAgaWYgKCFzeW1ib2wpIHtcclxuLy8gICAgICAgICAvLyBEZWNsYXJlZEludGVyZmFjZTogdHlwZSB3aWxsIGJlIGFuIEludGVyZmFjZURlY2xhcmF0aW9uIG9uIElkZW50aWZpZXIgbm9kZSB0aGF0IGlzIHRoZSBjaGlsZCBvZiB0aGUgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXHJcbi8vICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGV4cHJlc3Npb24uZ2V0Rmlyc3REZXNjZW5kYW50QnlLaW5kKFN5bnRheEtpbmQuSWRlbnRpZmllcik7XHJcbi8vICAgICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XHJcbi8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWRlbnRpZmllciBub3QgZm91bmQgZm9yICR7ZXhwcmVzc2lvbi5nZXRUZXh0KCl9LmApO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICBzeW1ib2wgPSBpZGVudGlmaWVyLmdldFN5bWJvbCgpO1xyXG4vLyAgICAgICAgIGlmICghc3ltYm9sKSB7XHJcbi8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3ltYm9sIG5vdCBmb3VuZCBmb3IgJHtpZGVudGlmaWVyLmdldFRleHQoKX0uYCk7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIC8vIFN0ZXAgMzogR2V0IHRoZSBkZWNsYXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2xcclxuLy8gICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IHN5bWJvbC5nZXREZWNsYXJhdGlvbnMoKTtcclxuXHJcbi8vICAgICAvLyBTdGVwIDQ6IEZpbHRlciBmb3IgSW50ZXJmYWNlRGVjbGFyYXRpb25cclxuLy8gICAgIGNvbnN0IGludGVyZmFjZURlY2xhcmF0aW9uID0gZGVjbGFyYXRpb25zLmZpbmQoZGVjbGFyYXRpb24gPT4gZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgYXMgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQ7XHJcblxyXG4vLyAgICAgaWYgKCFpbnRlcmZhY2VEZWNsYXJhdGlvbikge1xyXG4vLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJmYWNlIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCBmb3IgJHtleHByZXNzaW9uLmdldFRleHQoKX0uYCk7XHJcbi8vICAgICB9XHJcblxyXG4vLyAgICAgcmV0dXJuIGludGVyZmFjZURlY2xhcmF0aW9uO1xyXG4vLyB9XHJcbiJdfQ==
|
|
1803
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW50aXR5RGljdGlvbmFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYW1peF9mdW5jdGlvbnMvRW50aXR5RGljdGlvbmFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbzBESCwwQ0FZQztBQTcwREQsdUNBQTZrQjtBQUM3a0IsOEVBQWdGO0FBQ2hGLGdFQUFrRDtBQUNsRCxvRUFBZ0U7QUFDaEUsd0NBQTRDO0FBQzVDLG9EQUFvRDtBQUNwRCxpRUFBaUU7QUFDakUsc0RBQXVEO0FBQ3ZELDREQUE4QztBQUM5QyxxREFBdUM7QUFDdkMsZ0RBQXdCO0FBZXhCLE1BQWEsZ0JBQWdCO0lBcUJ6QjtRQW5CTyxhQUFRLEdBQUcsSUFBSSxrQ0FBZSxFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQyxDQUFDLDRDQUE0QztRQUMxRixnQkFBVyxHQUFHLElBQUksR0FBRyxFQUErQyxDQUFDLENBQUMsNERBQTREO1FBQ2xJLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXVELENBQUMsQ0FBQyxnREFBZ0Q7UUFDbEksaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBbUMsQ0FBQyxDQUFDLGdEQUFnRDtRQUMzRyxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQTZDLENBQUMsQ0FBQyxrREFBa0Q7UUFDckgsZUFBVSxHQUFHLElBQUksR0FBRyxFQUE0RCxDQUFDLENBQUMsbURBQW1EO1FBQ3JJLHdCQUFtQixHQUFHLElBQUksR0FBRyxFQUErQixDQUFDLENBQUMscURBQXFEO1FBQ25ILDRCQUF1QixHQUFHLElBQUksR0FBOEYsQ0FBQyxDQUFDLCtDQUErQztRQUM3Syx3QkFBbUIsR0FBRyxJQUFJLEdBQWdDLENBQUMsQ0FBQywrQ0FBK0M7UUFDM0csb0JBQWUsR0FBRyxJQUFJLEdBQUcsRUFBeUMsQ0FBQyxDQUFDLDJD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LE9BQU8sbUNBQW1DLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQy9ELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDO0FBRUQsaUlBQWlJO0FBQ2pJLG9CQUFvQjtBQUNwQixvRUFBb0U7QUFDcEUseUNBQXlDO0FBRXpDLGdEQUFnRDtBQUNoRCxzRkFBc0Y7QUFFdEYscUJBQXFCO0FBQ3JCLDZJQUE2STtBQUM3SSx5RkFBeUY7QUFDekYsNkJBQTZCO0FBQzdCLG9GQUFvRjtBQUNwRixZQUFZO0FBQ1osMkNBQTJDO0FBQzNDLHlCQUF5QjtBQUN6QixnRkFBZ0Y7QUFDaEYsWUFBWTtBQUNaLFFBQVE7QUFFUixpRUFBaUU7QUFDakUscURBQXFEO0FBRXJELGlEQUFpRDtBQUNqRCxzSkFBc0o7QUFFdEosbUNBQW1DO0FBQ25DLDJGQUEyRjtBQUMzRixRQUFRO0FBRVIsbUNBQW1DO0FBQ25DLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogYSBmdW5jdGlvbiBnZXRPckNyZWF0ZVhUeXBlIHRha2VzIGFyZ3VtZW50cyBuYW1lOiBzdHJpbmcgYW5kIGVsZW1lbnQ6IHRzLW1vcnBoLXR5cGUgYW5kIHJldHVybnMgYSBGYW1peC5UeXBlXHJcbiAqIFRoZSBnb2FsIGlzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHR5cGVzIChlLmcuLCBhIG1ldGhvZCdzIGRlZmluZWRUeXBlKSwgZm9yIHRoZSBtb2RlbC5cclxuICogVGhlIG5hbWUgZG9lc24ndCBuZWVkIHRvIGJlIGZ1bGx5IHF1YWxpZmllZCAoaXQncyB0aGUgbmFtZSB1c2VkIGluIHRoZSBzb3VyY2UgY29kZSwgb3IgdGhlIEZhbWl4IG1vZGVsKS5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IHsgQ2xhc3NEZWNsYXJhdGlvbiwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiwgRnVuY3Rpb25EZWNsYXJhdGlvbiwgSWRlbnRpZmllciwgSW50ZXJmYWNlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uLCBNZXRob2RTaWduYXR1cmUsIE1vZHVsZURlY2xhcmF0aW9uLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVNpZ25hdHVyZSwgU291cmNlRmlsZSwgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uLCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgRGVjb3JhdG9yLCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBJbXBvcnRTcGVjaWZpZXIsIENvbW1lbnRSYW5nZSwgRW51bURlY2xhcmF0aW9uLCBFbnVtTWVtYmVyLCBUeXBlQWxpYXNEZWNsYXJhdGlvbiwgRnVuY3Rpb25FeHByZXNzaW9uLCBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMsIEltcG9ydERlY2xhcmF0aW9uLCBJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiwgU3ludGF4S2luZCwgRXhwcmVzc2lvbiwgVHlwZU5vZGUsIFNjb3BlLCBBcnJvd0Z1bmN0aW9uIH0gZnJvbSBcInRzLW1vcnBoXCI7XHJcbmltcG9ydCB7IGlzQW1iaWVudCwgaXNOYW1lc3BhY2UgfSBmcm9tIFwiLi4vYW5hbHl6ZV9mdW5jdGlvbnMvcHJvY2Vzc19mdW5jdGlvbnNcIjtcclxuaW1wb3J0ICogYXMgRmFtaXggZnJvbSBcIi4uL2xpYi9mYW1peC9tb2RlbC9mYW1peFwiO1xyXG5pbXBvcnQgeyBGYW1peFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vbGliL2ZhbWl4L2ZhbWl4X3JlcG9zaXRvcnlcIjtcclxuaW1wb3J0IHsgbG9nZ2VyLCBjb25maWcgfSBmcm9tIFwiLi4vYW5hbHl6ZVwiO1xyXG4vLyBpbXBvcnQgR3JhcGhlbWVTcGxpdHRlciBmcm9tIFwiZ3JhcGhlbWUtc3BsaXR0ZXJcIjtcclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcclxuaW1wb3J0IEdyYXBoZW1lU3BsaXR0ZXIgPSByZXF1aXJlKCdncmFwaGVtZS1zcGxpdHRlcicpO1xyXG5pbXBvcnQgKiBhcyBIZWxwZXJzIGZyb20gXCIuL2hlbHBlcnNfY3JlYXRpb25cIjtcclxuaW1wb3J0ICogYXMgRlFORnVuY3Rpb25zIGZyb20gXCIuLi9mcW5cIjtcclxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcclxuLy8gaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcclxuXHJcbmV4cG9ydCB0eXBlIFRTTW9ycGhPYmplY3RUeXBlID0gSW1wb3J0RGVjbGFyYXRpb24gfCBJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiB8IFNvdXJjZUZpbGUgfCBNb2R1bGVEZWNsYXJhdGlvbiB8IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IE1ldGhvZFNpZ25hdHVyZSB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFZhcmlhYmxlRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgUHJvcGVydHlTaWduYXR1cmUgfCBUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBJZGVudGlmaWVyIHwgRGVjb3JhdG9yIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBJbXBvcnRTcGVjaWZpZXIgfCBDb21tZW50UmFuZ2UgfCBFbnVtRGVjbGFyYXRpb24gfCBFbnVtTWVtYmVyIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMgfCBUU01vcnBoUGFyYW1ldHJpY1R5cGU7XHJcblxyXG5leHBvcnQgdHlwZSBUU01vcnBoVHlwZURlY2xhcmF0aW9uID0gVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgUHJvcGVydHlTaWduYXR1cmUgfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFZhcmlhYmxlRGVjbGFyYXRpb24gfCBFbnVtTWVtYmVyIHwgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24gfCBUU01vcnBoUGFyYW1ldHJpY1R5cGUgfCBUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247XHJcblxyXG5leHBvcnQgdHlwZSBUU01vcnBoUGFyYW1ldHJpY1R5cGUgPSBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBBcnJvd0Z1bmN0aW9uO1xyXG5cclxuLy8gdHlwZSBQYXJhbWV0cmljVmFyaWFudFR5cGUgPSBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlIHwgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uIHwgRmFtaXguUGFyYW1ldHJpY01ldGhvZDtcclxuXHJcbi8vIHR5cGUgQ29uY3JldGVFbGVtZW50VFNNb3JwaFR5cGUgPSBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb247XHJcblxyXG5leHBvcnQgdHlwZSBJbnZvY2FibGVUeXBlID0gTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgQXJyb3dGdW5jdGlvbjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFbnRpdHlEaWN0aW9uYXJ5IHtcclxuICAgIFxyXG4gICAgcHVibGljIGZhbWl4UmVwID0gbmV3IEZhbWl4UmVwb3NpdG9yeSgpO1xyXG4gICAgcHJpdmF0ZSBmbXhBbGlhc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5BbGlhcz4oKTsgLy8gTWFwcyB0aGUgYWxpYXMgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgZm14Q2xhc3NNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljQ2xhc3M+KCk7IC8vIE1hcHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxyXG4gICAgcHJpdmF0ZSBmbXhJbnRlcmZhY2VNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguSW50ZXJmYWNlIHwgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZT4oKTsgLy8gTWFwcyB0aGUgaW50ZXJmYWNlIG5hbWVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXHJcbiAgICBwcml2YXRlIGZteE1vZHVsZU1hcCA9IG5ldyBNYXA8TW9kdWxlRGVjbGFyYXRpb24sIEZhbWl4Lk1vZHVsZT4oKTsgLy8gTWFwcyB0aGUgbmFtZXNwYWNlIG5hbWVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXHJcbiAgICBwcml2YXRlIGZteEZpbGVNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguU2NyaXB0RW50aXR5IHwgRmFtaXguTW9kdWxlPigpOyAvLyBNYXBzIHRoZSBzb3VyY2UgZmlsZSBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxyXG4gICAgcHJpdmF0ZSBmbXhUeXBlTWFwID0gbmV3IE1hcDxUU01vcnBoVHlwZURlY2xhcmF0aW9uLCBGYW1peC5UeXBlIHwgRmFtaXguUGFyYW1ldGVyVHlwZT4oKTsgLy8gTWFwcyB0aGUgdHlwZXMgZGVjbGFyYXRpb25zIHRvIHRoZWlyIEZhbWl4IG1vZGVsXHJcbiAgICBwcml2YXRlIGZteFByaW1pdGl2ZVR5cGVNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguUHJpbWl0aXZlVHlwZT4oKTsgLy8gTWFwcyB0aGUgcHJpbWl0aXZlIHR5cGUgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgZm14RnVuY3Rpb25BbmRNZXRob2RNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24gfCBGYW1peC5NZXRob2QgfCBGYW1peC5QYXJhbWV0cmljTWV0aG9kPjsgLy8gTWFwcyB0aGUgZnVuY3Rpb24gbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgZm14QXJyb3dGdW5jdGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5BcnJvd0Z1bmN0aW9uPjsgLy8gTWFwcyB0aGUgZnVuY3Rpb24gbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgZm14UGFyYW1ldGVyTWFwID0gbmV3IE1hcDxQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgRmFtaXguUGFyYW1ldGVyPigpOyAvLyBNYXBzIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXHJcbiAgICBwcml2YXRlIGZteFZhcmlhYmxlTWFwID0gbmV3IE1hcDxWYXJpYWJsZURlY2xhcmF0aW9uLCBGYW1peC5WYXJpYWJsZT4oKTsgLy8gTWFwcyB0aGUgdmFyaWFibGVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXHJcbiAgICBwcml2YXRlIGZteEltcG9ydENsYXVzZU1hcCA9IG5ldyBNYXA8SW1wb3J0RGVjbGFyYXRpb24gfCBJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiwgRmFtaXguSW1wb3J0Q2xhdXNlPigpOyAvLyBNYXBzIHRoZSBpbXBvcnQgY2xhdXNlcyB0byB0aGVpciBGYW1peCBtb2RlbFxyXG4gICAgcHJpdmF0ZSBmbXhFbnVtTWFwID0gbmV3IE1hcDxFbnVtRGVjbGFyYXRpb24sIEZhbWl4LkVudW0+KCk7IC8vIE1hcHMgdGhlIGVudW0gbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcclxuICAgIHByaXZhdGUgZm14SW5oZXJpdGFuY2VNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguSW5oZXJpdGFuY2U+KCk7IC8vIE1hcHMgdGhlIGluaGVyaXRhbmNlIG5hbWVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXHJcbiAgICBwcml2YXRlIFVOS05PV05fVkFMVUUgPSAnKHVua25vd24gZHVlIHRvIHBhcnNpbmcgZXJyb3IpJzsgLy8gVGhlIHZhbHVlIHRvIHVzZSB3aGVuIGEgbmFtZSBpcyBub3QgdXNhYmxlXHJcbiAgICBwdWJsaWMgZm14RWxlbWVudE9iamVjdE1hcCA9IG5ldyBNYXA8RmFtaXguRW50aXR5LFRTTW9ycGhPYmplY3RUeXBlPigpO1xyXG4gICAgcHVibGljIHRzTW9ycGhFbGVtZW50T2JqZWN0TWFwID0gbmV3IE1hcDxUU01vcnBoT2JqZWN0VHlwZSxGYW1peC5FbnRpdHk+KCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5mYW1peFJlcC5zZXRGbXhFbGVtZW50T2JqZWN0TWFwKHRoaXMuZm14RWxlbWVudE9iamVjdE1hcCk7ICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFNvdXJjZUFuY2hvcihmbXg6IEZhbWl4LlNvdXJjZWRFbnRpdHksIG5vZGU6IFRTTW9ycGhPYmplY3RUeXBlKTogRmFtaXguSW5kZXhlZEZpbGVBbmNob3Ige1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZUFuY2hvcjogRmFtaXguSW5kZXhlZEZpbGVBbmNob3IgPSBuZXcgRmFtaXguSW5kZXhlZEZpbGVBbmNob3IoKTtcclxuICAgICAgICBsZXQgc291cmNlU3RhcnQsIHNvdXJjZUVuZDogbnVtYmVyO1xyXG4gICAgICAgIGlmIChmbXggJiYgbm9kZSkge1xyXG4gICAgICAgICAgICAvLyBmaW5kIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGUgc291cmNlIGVsZW1lbnRcclxuICAgICAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIENvbW1lbnRSYW5nZSkpIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gbm9kZS5nZXRTdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgc291cmNlRW5kID0gbm9kZS5nZXRFbmQoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gbm9kZS5nZXRQb3MoKTtcclxuICAgICAgICAgICAgICAgIHNvdXJjZUVuZCA9IG5vZGUuZ2V0RW5kKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICBpZiAoY29uZmlnLmV4cGVjdEdyYXBoZW1lcykge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGxvZ2ljIGhhbmRsZXMgdGhlIGNhc2Ugb2YgbXVsdGktY29kZSBwb2ludCBjaGFyYWN0ZXJzIChlLmcuIGVtb2ppKSBpbiB0aGUgc291cmNlIHRleHQuXHJcbiAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIFBoYXJvL1NtYWxsdGFsayB0cmVhdHMgbXVsdGktY29kZSBwb2ludCBjaGFyYWN0ZXJzIGFzIGEgc2luZ2xlIGNoYXJhY3RlciwgXHJcbiAgICAgICAgICAgICAgICAgKiBidXQgSmF2YVNjcmlwdCB0cmVhdHMgdGhlbSBhcyBtdWx0aXBsZSBjaGFyYWN0ZXJzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zXHJcbiAgICAgICAgICAgICAgICAgKiBvZiBhIHNvdXJjZSBlbGVtZW50IGluIFBoYXJvL1NtYWxsdGFsayB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGVcclxuICAgICAgICAgICAgICAgICAqIHNhbWUgc291cmNlIGVsZW1lbnQgaW4gSmF2YVNjcmlwdC4gVGhpcyBsb2dpYyBmaW5kcyB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgb2YgdGhlIHNvdXJjZVxyXG4gICAgICAgICAgICAgICAgICogZWxlbWVudCBpbiBKYXZhU2NyaXB0IGFuZCB0aGVuIHVzZXMgdGhvc2UgcG9zaXRpb25zIHRvIHNldCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgb2YgdGhlXHJcbiAgICAgICAgICAgICAgICAgKiBGYW1peCBpbmRleCBmaWxlIGFuY2hvci5cclxuICAgICAgICAgICAgICAgICAqIEl0IGRlcGVuZHMgb24gY29kZSBpbiB0aGUgJ2dyYXBoZW1lLXNwbGl0dGVyJyBwYWNrYWdlIGluIG5wbS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgR3JhcGhlbWVTcGxpdHRlcigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZVRleHQgPSBub2RlLmdldFNvdXJjZUZpbGUoKS5nZXRGdWxsVGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzR3JhcGhlbWVDbHVzdGVycyA9IHNwbGl0dGVyLmNvdW50R3JhcGhlbWVzKHNvdXJjZUZpbGVUZXh0KSA+IDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGFzR3JhcGhlbWVDbHVzdGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUVsZW1lbnRUZXh0ID0gc291cmNlRmlsZVRleHQuc3Vic3RyaW5nKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzID0gc3BsaXR0ZXIuc3BsaXRHcmFwaGVtZXMoc291cmNlRWxlbWVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVUZXh0R3JhcGhlbWVzID0gc3BsaXR0ZXIuc3BsaXRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mR3JhcGhlbWVDbHVzdGVyc0JlZm9yZVN0YXJ0ID0gc3BsaXR0ZXIuY291bnRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQuc3Vic3RyaW5nKDAsIHNvdXJjZVN0YXJ0KSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzIGFycmF5IGluIHRoZSBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcyBhcnJheVxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gSGVscGVycy5pbmRleE9mU3BsaXRBcnJheSh7c2VhcmNoQXJyYXk6IHNvdXJjZUZpbGVUZXh0R3JhcGhlbWVzLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRBcnJheTogc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzb3VyY2VTdGFydCAtIG51bWJlck9mR3JhcGhlbWVDbHVzdGVyc0JlZm9yZVN0YXJ0fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRW5kID0gc291cmNlU3RhcnQgKyBzb3VyY2VFbGVtZW50VGV4dEdyYXBoZW1lcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBUaGUgKzEgaXMgYmVjYXVzZSB0aGUgc291cmNlIGFuY2hvciAoUGhhcm8pIGlzIDEtYmFzZWQsIGJ1dCB0cy1tb3JwaCBpcyAwLWJhc2VkXHJcbiAgICAgICAgICAgIHNvdXJjZUFuY2hvci5zdGFydFBvcyA9IHNvdXJjZVN0YXJ0ICsgMTtcclxuICAgICAgICAgICAgc291cmNlQW5jaG9yLmVuZFBvcyA9IHNvdXJjZUVuZCArIDE7XHJcblxyXG4gICAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBub2RlLmdldFNvdXJjZUZpbGUoKS5nZXRGaWxlUGF0aCgpIGFzIHN0cmluZztcclxuICAgICAgICAgICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzb3VyY2VBbmNob3IuZWxlbWVudCA9IGZteDtcclxuICAgICAgICAgICAgc291cmNlQW5jaG9yLmZpbGVOYW1lID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICAgIGZteC5zb3VyY2VBbmNob3IgPSBzb3VyY2VBbmNob3I7XHJcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChzb3VyY2VBbmNob3IpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZUFuY2hvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ha2VzIGEgRmFtaXggaW5kZXggZmlsZSBhbmNob3JcclxuICAgICAqIEBwYXJhbSBzb3VyY2VFbGVtZW50IEEgc291cmNlIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSBmYW1peEVsZW1lbnQgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBzb3VyY2UgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHNvdXJjZUVsZW1lbnQ6IFRTTW9ycGhPYmplY3RUeXBlLCBmYW1peEVsZW1lbnQ6IEZhbWl4LlNvdXJjZWRFbnRpdHkpOiB2b2lkIHtcclxuICAgICAgICAvLyBGYW1peC5Db21tZW50IGlzIG5vdCBhIG5hbWVkIGVudGl0eSAoZG9lcyBub3QgaGF2ZSBhIGZ1bGx5UXVhbGlmaWVkTmFtZSlcclxuICAgICAgICBpZiAoIShmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5Db21tZW50KSkgeyAgLy8gbXVzdCBiZSBhIG5hbWVkIGVudGl0eVxyXG4gICAgICAgICAgICAvLyBpbnNhbml0eSBjaGVjazogbmFtZWQgZW50aXRpZXMgc2hvdWxkIGhhdmUgZnVsbHlRdWFsaWZpZWROYW1lXHJcbiAgICAgICAgICAgIGNvbnN0IGZ1bGx5UXVhbGlmaWVkTmFtZSA9IChmYW1peEVsZW1lbnQgYXMgRmFtaXguTmFtZWRFbnRpdHkpLmZ1bGx5UXVhbGlmaWVkTmFtZTtcclxuICAgICAgICAgICAgaWYgKCFmdWxseVF1YWxpZmllZE5hbWUgfHwgZnVsbHlRdWFsaWZpZWROYW1lID09PSB0aGlzLlVOS05PV05fVkFMVUUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggZWxlbWVudCAke2ZhbWl4RWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfSBoYXMgbm8gdmFsaWQgZnVsbHlRdWFsaWZpZWROYW1lLmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2dnZXIuZGVidWcoXCJtYWtpbmcgaW5kZXggZmlsZSBhbmNob3IgZm9yICdcIiArIHNvdXJjZUVsZW1lbnQ/LmdldFRleHQoKSArIFwiJyB3aXRoIGZhbWl4RWxlbWVudCBcIiArIGZhbWl4RWxlbWVudC5nZXRKU09OKCkpO1xyXG4gICAgICAgIGNvbnN0IGZteEluZGV4RmlsZUFuY2hvciA9IG5ldyBGYW1peC5JbmRleGVkRmlsZUFuY2hvcigpO1xyXG4gICAgICAgIGZteEluZGV4RmlsZUFuY2hvci5lbGVtZW50ID0gZmFtaXhFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZmFtaXhFbGVtZW50LCBzb3VyY2VFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHNvdXJjZUVsZW1lbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoUHJvamVjdCA9IHRoaXMuZmFtaXhSZXAuZ2V0QWJzb2x1dGVQYXRoKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgubm9ybWFsaXplKHNvdXJjZUVsZW1lbnQuZ2V0U291cmNlRmlsZSgpLmdldEZpbGVQYXRoKCkpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25Ob2RlTW9kdWxlcyA9IGFic29sdXRlUGF0aC5pbmRleE9mKCdub2RlX21vZHVsZXMnKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBwYXRoSW5Qcm9qZWN0OiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uTm9kZU1vZHVsZXMgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoRnJvbU5vZGVNb2R1bGVzID0gYWJzb2x1dGVQYXRoLnN1YnN0cmluZyhwb3NpdGlvbk5vZGVNb2R1bGVzKTtcclxuICAgICAgICAgICAgICAgIHBhdGhJblByb2plY3QgPSBwYXRoRnJvbU5vZGVNb2R1bGVzO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGF0aEluUHJvamVjdCA9IHRoaXMuY29udmVydFRvUmVsYXRpdmVQYXRoKGFic29sdXRlUGF0aCwgYWJzb2x1dGVQYXRoUHJvamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHJldmVydCBhbnkgYmFja3NsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzIChwYXRoLm5vcm1hbGl6ZSBvbiB3aW5kb3dzIGludHJvZHVjZXMgdGhlbSlcclxuICAgICAgICAgICAgcGF0aEluUHJvamVjdCA9IHBhdGhJblByb2plY3QucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XHJcblxyXG4gICAgICAgICAgICBpZiAocGF0aEluUHJvamVjdC5zdGFydHNXaXRoKFwiL1wiKSkge1xyXG4gICAgICAgICAgICAgICAgcGF0aEluUHJvamVjdCA9IHBhdGhJblByb2plY3Quc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmbXhJbmRleEZpbGVBbmNob3IuZmlsZU5hbWUgPSBwYXRoSW5Qcm9qZWN0O1xyXG4gICAgICAgICAgICBsZXQgc291cmNlU3RhcnQsIHNvdXJjZUVuZFxyXG4gICAgICAgICAgICAvLyAsc291cmNlTGluZVN0YXJ0LCBzb3VyY2VMaW5lRW5kXHJcbiAgICAgICAgICAgIDogbnVtYmVyO1xyXG4gICAgICAgICAgICBpZiAoIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgQ29tbWVudFJhbmdlKSkge1xyXG4gICAgICAgICAgICAgICAgc291cmNlU3RhcnQgPSBzb3VyY2VFbGVtZW50LmdldFN0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2VFbmQgPSBzb3VyY2VFbGVtZW50LmdldEVuZCgpO1xyXG4gICAgICAgICAgICAgICAgLy8gc291cmNlTGluZVN0YXJ0ID0gc291cmNlRWxlbWVudC5nZXRTdGFydExpbmVOdW1iZXIoKTtcclxuICAgICAgICAgICAgICAgIC8vIHNvdXJjZUxpbmVFbmQgPSBzb3VyY2VFbGVtZW50LmdldEVuZExpbmVOdW1iZXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gc291cmNlRWxlbWVudC5nZXRQb3MoKTtcclxuICAgICAgICAgICAgICAgIHNvdXJjZUVuZCA9IHNvdXJjZUVsZW1lbnQuZ2V0RW5kKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbmZpZy5leHBlY3RHcmFwaGVtZXMpIHtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogVGhlIGZvbGxvd2luZyBsb2dpYyBoYW5kbGVzIHRoZSBjYXNlIG9mIG11bHRpLWNvZGUgcG9pbnQgY2hhcmFjdGVycyAoZS5nLiBlbW9qaSkgaW4gdGhlIHNvdXJjZSB0ZXh0LlxyXG4gICAgICAgICAgICAgICAgICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBQaGFyby9TbWFsbHRhbGsgdHJlYXRzIG11bHRpLWNvZGUgcG9pbnQgY2hhcmFjdGVycyBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIFxyXG4gICAgICAgICAgICAgICAgICogYnV0IEphdmFTY3JpcHQgdHJlYXRzIHRoZW0gYXMgbXVsdGlwbGUgY2hhcmFjdGVycy4gVGhpcyBtZWFucyB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9uc1xyXG4gICAgICAgICAgICAgICAgICogb2YgYSBzb3VyY2UgZWxlbWVudCBpbiBQaGFyby9TbWFsbHRhbGsgd2lsbCBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgb2YgdGhlXHJcbiAgICAgICAgICAgICAgICAgKiBzYW1lIHNvdXJjZSBlbGVtZW50IGluIEphdmFTY3JpcHQuIFRoaXMgbG9naWMgZmluZHMgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIG9mIHRoZSBzb3VyY2VcclxuICAgICAgICAgICAgICAgICAqIGVsZW1lbnQgaW4gSmF2YVNjcmlwdCBhbmQgdGhlbiB1c2VzIHRob3NlIHBvc2l0aW9ucyB0byBzZXQgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIG9mIHRoZVxyXG4gICAgICAgICAgICAgICAgICogRmFtaXggaW5kZXggZmlsZSBhbmNob3IuXHJcbiAgICAgICAgICAgICAgICAgKiBJdCBkZXBlbmRzIG9uIGNvZGUgaW4gdGhlICdncmFwaGVtZS1zcGxpdHRlcicgcGFja2FnZSBpbiBucG0uXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0dGVyID0gbmV3IEdyYXBoZW1lU3BsaXR0ZXIoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVUZXh0ID0gc291cmNlRWxlbWVudC5nZXRTb3VyY2VGaWxlKCkuZ2V0RnVsbFRleHQoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0dyYXBoZW1lQ2x1c3RlcnMgPSBzcGxpdHRlci5jb3VudEdyYXBoZW1lcyhzb3VyY2VGaWxlVGV4dCkgPiAxO1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhc0dyYXBoZW1lQ2x1c3RlcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50VGV4dCA9IHNvdXJjZUZpbGVUZXh0LnN1YnN0cmluZyhzb3VyY2VTdGFydCwgc291cmNlRW5kKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50VGV4dEdyYXBoZW1lcyA9IHNwbGl0dGVyLnNwbGl0R3JhcGhlbWVzKHNvdXJjZUVsZW1lbnRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcyA9IHNwbGl0dGVyLnNwbGl0R3JhcGhlbWVzKHNvdXJjZUZpbGVUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJPZkdyYXBoZW1lQ2x1c3RlcnNCZWZvcmVTdGFydCA9IHNwbGl0dGVyLmNvdW50R3JhcGhlbWVzKHNvdXJjZUZpbGVUZXh0LnN1YnN0cmluZygwLCBzb3VyY2VTdGFydCkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBzb3VyY2VFbGVtZW50VGV4dEdyYXBoZW1lcyBhcnJheSBpbiB0aGUgc291cmNlRmlsZVRleHRHcmFwaGVtZXMgYXJyYXlcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VTdGFydCA9IEhlbHBlcnMuaW5kZXhPZlNwbGl0QXJyYXkoe3NlYXJjaEFycmF5OiBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcywgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXk6IHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogc291cmNlU3RhcnQgLSBudW1iZXJPZkdyYXBoZW1lQ2x1c3RlcnNCZWZvcmVTdGFydH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUVuZCA9IHNvdXJjZVN0YXJ0ICsgc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBub3RlOiB0aGUgKzEgaXMgYmVjYXVzZSB0aGUgc291cmNlIGFuY2hvciBpcyAxLWJhc2VkLCBidXQgdHMtbW9ycGggaXMgMC1iYXNlZFxyXG4gICAgICAgICAgICBmbXhJbmRleEZpbGVBbmNob3Iuc3RhcnRQb3MgPSBzb3VyY2VTdGFydCArIDE7XHJcbiAgICAgICAgICAgIGZteEluZGV4RmlsZUFuY2hvci5lbmRQb3MgPSBzb3VyY2VFbmQgKyAxO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgKCEoZmFtaXhFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguSW1wb3J0Q2xhdXNlIHx8IGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LkFjY2VzcyB8fCBmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5SZWZlcmVuY2UgfHwgZmFtaXhFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguSW52b2NhdGlvbiB8fCBmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5Jbmhlcml0YW5jZSkgJiYgIShmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5Db21tZW50KSAmJiAhKHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBDb21tZW50UmFuZ2UpICYmICEoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpZXIpICYmICEoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEltcG9ydFNwZWNpZmllcikgJiYgIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKSkge1xyXG4gICAgICAgICAgICAvLyAgICBpbml0RlFOKHNvdXJjZUVsZW1lbnQsIGZhbWl4RWxlbWVudCk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBzb3VyY2VFbGVtZW50IGlzIG51bGxcclxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJzb3VyY2VFbGVtZW50IGlzIG51bGwgZm9yIGZhbWl4RWxlbWVudCBcIiArIGZhbWl4RWxlbWVudC5nZXRKU09OKCkpO1xyXG4gICAgICAgICAgICBmbXhJbmRleEZpbGVBbmNob3IuZmlsZU5hbWUgPSBcInVua25vd25cIjtcclxuICAgICAgICAgICAgZm14SW5kZXhGaWxlQW5jaG9yLnN0YXJ0UG9zID0gMDtcclxuICAgICAgICAgICAgZm14SW5kZXhGaWxlQW5jaG9yLmVuZFBvcyA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14SW5kZXhGaWxlQW5jaG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IHNjcmlwdCBlbnRpdHkgb3IgbW9kdWxlXHJcbiAgICAgKiBAcGFyYW0gZiBBIHNvdXJjZSBmaWxlXHJcbiAgICAgKiBAcGFyYW0gaXNNb2R1bGUgQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIGEgbW9kdWxlXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHNvdXJjZSBmaWxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4RmlsZShmOiBTb3VyY2VGaWxlLCBpc01vZHVsZTogYm9vbGVhbik6IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSB7XHJcbiAgICAgICAgbGV0IGZteEZpbGU6IEZhbWl4LlNjcmlwdEVudGl0eTsgLy8gfCBGYW1peC5Nb2R1bGU7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZi5nZXRCYXNlTmFtZSgpO1xyXG4gICAgICAgIGNvbnN0IGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUgPSBmLmdldEZpbGVQYXRoKCk7XHJcbiAgICAgICAgY29uc3QgZm91bmRGaWxlTmFtZSA9IHRoaXMuZm14RmlsZU1hcC5nZXQoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSk7XHJcbiAgICAgICAgaWYgKCFmb3VuZEZpbGVOYW1lKSB7XHJcbiAgICAgICAgICAgIGlmIChpc01vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgZm14RmlsZSA9IG5ldyBGYW1peC5Nb2R1bGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZteEZpbGUgPSBuZXcgRmFtaXguU2NyaXB0RW50aXR5KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm14RmlsZS5uYW1lID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICAgIGZteEZpbGUubnVtYmVyT2ZMaW5lc09mVGV4dCA9IGYuZ2V0RW5kTGluZU51bWJlcigpIC0gZi5nZXRTdGFydExpbmVOdW1iZXIoKTtcclxuICAgICAgICAgICAgZm14RmlsZS5udW1iZXJPZkNoYXJhY3RlcnMgPSBmLmdldEZ1bGxUZXh0KCkubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaW5pdEZRTihmLCBmbXhGaWxlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGYsIGZteEZpbGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mbXhGaWxlTWFwLnNldChmdWxseVF1YWxpZmllZEZpbGVuYW1lLCBmbXhGaWxlKTtcclxuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEZpbGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm14RmlsZSA9IGZvdW5kRmlsZU5hbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEZpbGUsZik7XHJcbiAgICAgICAgcmV0dXJuIGZteEZpbGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBNb2R1bGVcclxuICAgICAqIEBwYXJhbSBtb2R1bGVEZWNsYXJhdGlvbiBBIG1vZHVsZVxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBtb2R1bGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhNb2R1bGUobW9kdWxlRGVjbGFyYXRpb246IE1vZHVsZURlY2xhcmF0aW9uKTogRmFtaXguTW9kdWxlIHtcclxuICAgICAgICBpZiAodGhpcy5mbXhNb2R1bGVNYXAuaGFzKG1vZHVsZURlY2xhcmF0aW9uKSkge1xyXG4gICAgICAgICAgICBjb25zdCByTW9kdWxlID0gdGhpcy5mbXhNb2R1bGVNYXAuZ2V0KG1vZHVsZURlY2xhcmF0aW9uKTtcclxuICAgICAgICAgICAgaWYgKHJNb2R1bGUpIHsgXHJcbiAgICAgICAgICAgICAgIHJldHVybiByTW9kdWxlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCBtb2R1bGUgJHttb2R1bGVEZWNsYXJhdGlvbi5nZXROYW1lKCl9IGlzIG5vdCBmb3VuZCBpbiB0aGUgbW9kdWxlIG1hcC5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZm14TW9kdWxlID0gbmV3IEZhbWl4Lk1vZHVsZSgpO1xyXG4gICAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBtb2R1bGVEZWNsYXJhdGlvbi5nZXROYW1lKCk7XHJcbiAgICAgICAgZm14TW9kdWxlLm5hbWUgPSBtb2R1bGVOYW1lO1xyXG4gICAgICAgIGZteE1vZHVsZS5pc0FtYmllbnQgPSBpc0FtYmllbnQobW9kdWxlRGVjbGFyYXRpb24pO1xyXG4gICAgICAgIGZteE1vZHVsZS5pc05hbWVzcGFjZSA9IGlzTmFtZXNwYWNlKG1vZHVsZURlY2xhcmF0aW9uKTtcclxuICAgICAgICBmbXhNb2R1bGUuaXNNb2R1bGUgPSAhZm14TW9kdWxlLmlzTmFtZXNwYWNlICYmICFmbXhNb2R1bGUuaXNBbWJpZW50O1xyXG5cclxuICAgICAgICBpbml0RlFOKG1vZHVsZURlY2xhcmF0aW9uLCBmbXhNb2R1bGUpO1xyXG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKG1vZHVsZURlY2xhcmF0aW9uLCBmbXhNb2R1bGUpO1xyXG5cclxuICAgICAgICB0aGlzLmZteE1vZHVsZU1hcC5zZXQobW9kdWxlRGVjbGFyYXRpb24sIGZteE1vZHVsZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhNb2R1bGUpO1xyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteE1vZHVsZSxtb2R1bGVEZWNsYXJhdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIGZteE1vZHVsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBhbGlhc1xyXG4gICAgICogQHBhcmFtIGEgQW4gYWxpYXNcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgYWxpYXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4QWxpYXMoYTogVHlwZUFsaWFzRGVjbGFyYXRpb24pOiBGYW1peC5BbGlhcyB7XHJcbiAgICAgICAgbGV0IGZteEFsaWFzOiBGYW1peC5BbGlhcztcclxuICAgICAgICBjb25zdCBhbGlhc05hbWUgPSBhLmdldE5hbWUoKTtcclxuICAgICAgICAvL2NvbnN0IGFsaWFzRnVsbHlRdWFsaWZpZWROYW1lID0gYS5nZXRUeXBlKCkuZ2V0VGV4dCgpOyAvLyBGUU5GdW5jdGlvbnMuZ2V0RlFOKGEpO1xyXG4gICAgICAgIGNvbnN0IGFsaWFzRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihhKTtcclxuICAgICAgICBjb25zdCBmb3VuZEFsaWFzID0gdGhpcy5mbXhBbGlhc01hcC5nZXQoYWxpYXNGdWxseVF1YWxpZmllZE5hbWUpO1xyXG4gICAgICAgIGlmICghZm91bmRBbGlhcykge1xyXG4gICAgICAgICAgICBmbXhBbGlhcyA9IG5ldyBGYW1peC5BbGlhcygpO1xyXG4gICAgICAgICAgICBmbXhBbGlhcy5uYW1lID0gYS5nZXROYW1lKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFsaWFzTmFtZVdpdGhHZW5lcmljcyA9IGFsaWFzTmFtZSArIChhLmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID8gKFwiPFwiICsgYS5nZXRUeXBlUGFyYW1ldGVycygpLm1hcCh0cCA9PiB0cC5nZXROYW1lKCkpLmpvaW4oXCIsIFwiKSArIFwiPlwiKSA6IFwiXCIpO1xyXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYD4gTk9URTogYWxpYXMgJHthbGlhc05hbWV9IGhhcyBmdWxseSBxdWFsaWZpZWQgbmFtZSAke2FsaWFzRnVsbHlRdWFsaWZpZWROYW1lfSBhbmQgbmFtZSB3aXRoIGdlbmVyaWNzICR7YWxpYXNOYW1lV2l0aEdlbmVyaWNzfS5gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKGFsaWFzTmFtZVdpdGhHZW5lcmljcywgYSk7XHJcbiAgICAgICAgICAgIGZteEFsaWFzLmFsaWFzZWRFbnRpdHkgPSBmbXhUeXBlO1xyXG4gICAgICAgICAgICBpbml0RlFOKGEsIGZteEFsaWFzKTtcclxuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoYSwgZm14QWxpYXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mbXhBbGlhc01hcC5zZXQoYWxpYXNGdWxseVF1YWxpZmllZE5hbWUsIGZteEFsaWFzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhBbGlhcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmbXhBbGlhcyA9IGZvdW5kQWxpYXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14QWxpYXMsYSk7XHJcblxyXG4gICAgICAgIHJldHVybiBmbXhBbGlhcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IGNsYXNzIG9yIHBhcmFtZXRlcml6YWJsZSBjbGFzc1xyXG4gICAgICogQHBhcmFtIGNscyBBIGNsYXNzXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4Q2xhc3MoY2xzOiBDbGFzc0RlY2xhcmF0aW9uKTogRmFtaXguQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljQ2xhc3Mge1xyXG4gICAgICAgIGxldCBmbXhDbGFzczogRmFtaXguQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljQ2xhc3M7XHJcbiAgICAgICAgY29uc3QgaXNBYnN0cmFjdCA9IGNscy5pc0Fic3RyYWN0KCk7XHJcbiAgICAgICAgY29uc3QgY2xhc3NGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGNscyk7XHJcbiAgICAgICAgY29uc3QgY2xzTmFtZSA9IGNscy5nZXROYW1lKCkgfHwgdGhpcy5VTktOT1dOX1ZBTFVFO1xyXG4gICAgICAgIGNvbnN0IGlzR2VuZXJpYyA9IGNscy5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBmb3VuZENsYXNzID0gdGhpcy5mbXhDbGFzc01hcC5nZXQoY2xhc3NGdWxseVF1YWxpZmllZE5hbWUpO1xyXG4gICAgICAgIGlmICghZm91bmRDbGFzcykge1xyXG4gICAgICAgICAgICBpZiAoaXNHZW5lcmljKSB7XHJcbiAgICAgICAgICAgICAgICBmbXhDbGFzcyA9IG5ldyBGYW1peC5QYXJhbWV0cmljQ2xhc3MoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZteENsYXNzID0gbmV3IEZhbWl4LkNsYXNzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZteENsYXNzLm5hbWUgPSBjbHNOYW1lO1xyXG4gICAgICAgICAgICBpbml0RlFOKGNscywgZm14Q2xhc3MpO1xyXG4gICAgICAgICAgICAvLyBmbXhDbGFzcy5mdWxseVF1YWxpZmllZE5hbWUgPSBjbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZTtcclxuICAgICAgICAgICAgZm14Q2xhc3MuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihjbHMsIGZteENsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm14Q2xhc3NNYXAuc2V0KGNsYXNzRnVsbHlRdWFsaWZpZWROYW1lLCBmbXhDbGFzcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14Q2xhc3MpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhDbGFzcyxjbHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm14Q2xhc3MgPSBmb3VuZENsYXNzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZteENsYXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggaW50ZXJmYWNlIG9yIHBhcmFtZXRlcml6YWJsZSBpbnRlcmZhY2VcclxuICAgICAqIEBwYXJhbSBpbnRlciBBbiBpbnRlcmZhY2VcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgaW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlKGludGVyOiBJbnRlcmZhY2VEZWNsYXJhdGlvbik6IEZhbWl4LkludGVyZmFjZSB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2Uge1xyXG5cclxuICAgICAgICBsZXQgZm14SW50ZXJmYWNlOiBGYW1peC5JbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlO1xyXG4gICAgICAgIGNvbnN0IGludGVyTmFtZSA9IGludGVyLmdldE5hbWUoKTtcclxuICAgICAgICBjb25zdCBpbnRlckZ1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oaW50ZXIpO1xyXG4gICAgICAgIGNvbnN0IGZvdW5kSW50ZXJmYWNlID0gdGhpcy5mbXhJbnRlcmZhY2VNYXAuZ2V0KGludGVyRnVsbHlRdWFsaWZpZWROYW1lKTtcclxuICAgICAgICBpZiAoIWZvdW5kSW50ZXJmYWNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzR2VuZXJpYyA9IGludGVyLmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoaXNHZW5lcmljKSB7XHJcbiAgICAgICAgICAgICAgICBmbXhJbnRlcmZhY2UgPSBuZXcgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm14SW50ZXJmYWNlID0gbmV3IEZhbWl4LkludGVyZmFjZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmbXhJbnRlcmZhY2UubmFtZSA9IGludGVyTmFtZTtcclxuICAgICAgICAgICAgaW5pdEZRTihpbnRlciwgZm14SW50ZXJmYWNlKTtcclxuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoaW50ZXIsIGZteEludGVyZmFjZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZteEludGVyZmFjZU1hcC5zZXQoaW50ZXJGdWxseVF1YWxpZmllZE5hbWUsIGZteEludGVyZmFjZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14SW50ZXJmYWNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14SW50ZXJmYWNlLGludGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZteEludGVyZmFjZSA9IGZvdW5kSW50ZXJmYWNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZm14SW50ZXJmYWNlO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBjb25jcmV0ZSBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0gY29uY3JldGVFbGVtZW50IEEgcGFyYW1ldHJpYyBFbGVtZW50ICAgXHJcbiAgICAgKiBAcGFyYW0gY29uY3JldGVFbGVtZW50RGVjbGFyYXRpb24gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb25cclxuICAgICAqIEBwYXJhbSBjb25jcmV0ZUFyZ3VtZW50cyBjb25jcmV0ZSBhcmd1bWVudHNcclxuICAgICAqIEByZXR1cm5zIEEgcGFyYW1ldHJpYyBFbGVtZW50ICBcclxuICAgICAqL1xyXG4gICAgLy8gcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoY29uY3JldGVFbGVtZW50IDogUGFyYW1ldHJpY1ZhcmlhbnRUeXBlLCBcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNyZXRlRWxlbWVudERlY2xhcmF0aW9uIDogQ29uY3JldGVFbGVtZW50VFNNb3JwaFR5cGUsIFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3JldGVBcmd1bWVudHM6IFR5cGVOb2RlW10pOiBQYXJhbWV0cmljVmFyaWFudFR5cGUge1xyXG4gICAgICAgIFxyXG4gICAgLy8gICAgIGxldCBmdWxseVF1YWxpZmllZEZpbGVuYW1lID0gY29uY3JldGVFbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZTtcclxuICAgIC8vICAgICBsZXQgcGFyYW1zID0gXCJcIjtcclxuICAgICAgICBcclxuICAgIC8vICAgICBjb25jcmV0ZUFyZ3VtZW50cy5tYXAoKHBhcmFtKSA9PiB7XHJcbiAgICAvLyAgICAgICAgIHBhcmFtcyA9IHBhcmFtcytwYXJhbS5nZXRUZXh0KCkrJywnO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgLy8gICAgIHBhcmFtcyA9IHBhcmFtcy5zdWJzdHJpbmcoMCwgcGFyYW1zLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgICAgICAgICBcclxuICAgIC8vICAgICBmdWxseVF1YWxpZmllZEZpbGVuYW1lID0gSGVscGVycy5yZXBsYWNlTGFzdEJldHdlZW5UYWdzKGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUscGFyYW1zKTtcclxuXHJcbiAgICAvLyAgICAgbGV0IGNvbmNFbGVtZW50OiBQYXJhbWV0cmljVmFyaWFudFR5cGU7XHJcblxyXG4gICAgLy8gICAgIGlmICghdGhpcy5mbXhJbnRlcmZhY2VNYXAuaGFzKGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpICYmIFxyXG4gICAgLy8gICAgICAgICAhdGhpcy5mbXhDbGFzc01hcC5oYXMoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSkgJiYgXHJcbiAgICAvLyAgICAgICAgICF0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmhhcyhmdWxseVF1YWxpZmllZEZpbGVuYW1lKSl7XHJcbiAgICAvLyAgICAgICAgIGNvbmNFbGVtZW50ID0gXy5jbG9uZURlZXAoY29uY3JldGVFbGVtZW50KTsgXHJcbiAgICAvLyAgICAgICAgIGNvbmNFbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWU7XHJcbiAgICAvLyAgICAgICAgIGNvbmNFbGVtZW50LmNsZWFyR2VuZXJpY1BhcmFtZXRlcnMoKTtcclxuICAgIC8vICAgICAgICAgY29uY3JldGVBcmd1bWVudHMubWFwKChwYXJhbSkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVyID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q29uY3JldGVUeXBlKHBhcmFtKTtcclxuICAgIC8vICAgICAgICAgICAgIGNvbmNFbGVtZW50LmFkZENvbmNyZXRlUGFyYW1ldGVyKHBhcmFtZXRlcik7XHJcbiAgICAvLyAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIFxyXG4gICAgLy8gICAgICAgICBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0NsYXNzKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmZteENsYXNzTWFwLnNldChmdWxseVF1YWxpZmllZEZpbGVuYW1lLCBjb25jRWxlbWVudCBhcyBGYW1peC5QYXJhbWV0cmljQ2xhc3MpO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2UgaWYgKGNvbmNyZXRlRWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuZm14SW50ZXJmYWNlTWFwLnNldChmdWxseVF1YWxpZmllZEZpbGVuYW1lLCBjb25jRWxlbWVudCBhcyBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKTtcclxuICAgIC8vICAgICAgICAgfSBlbHNlIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuc2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUsIGNvbmNFbGVtZW50IGFzIEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbik7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7IC8vIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljTWV0aG9kKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLnNldChmdWxseVF1YWxpZmllZEZpbGVuYW1lLCBjb25jRWxlbWVudCBhcyBGYW1peC5QYXJhbWV0cmljTWV0aG9kKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoY29uY0VsZW1lbnQpO1xyXG4gICAgLy8gICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGNvbmNFbGVtZW50LGNvbmNyZXRlRWxlbWVudERlY2xhcmF0aW9uKTtcclxuICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0NsYXNzKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25jRWxlbWVudCA9IHRoaXMuZm14Q2xhc3NNYXAuZ2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpIGFzIEZhbWl4LlBhcmFtZXRyaWNDbGFzcztcclxuICAgIC8vICAgICAgICAgfSBlbHNlIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25jRWxlbWVudCA9IHRoaXMuZm14SW50ZXJmYWNlTWFwLmdldChmdWxseVF1YWxpZmllZEZpbGVuYW1lKSBhcyBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2UgaWYgKGNvbmNyZXRlRWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uY0VsZW1lbnQgPSB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmdldChmdWxseVF1YWxpZmllZEZpbGVuYW1lKSBhcyBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb247XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7ICAvLyBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY01ldGhvZCkge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uY0VsZW1lbnQgPSB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmdldChmdWxseVF1YWxpZmllZEZpbGVuYW1lKSBhcyBGYW1peC5QYXJhbWV0cmljTWV0aG9kO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBjb25jRWxlbWVudDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBwcm9wZXJ0eVxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEEgcHJvcGVydHlcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgcHJvcGVydHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4UHJvcGVydHkocHJvcGVydHk6IFByb3BlcnR5RGVjbGFyYXRpb24gfCBQcm9wZXJ0eVNpZ25hdHVyZSk6IEZhbWl4LlByb3BlcnR5IHtcclxuICAgICAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IG5ldyBGYW1peC5Qcm9wZXJ0eSgpO1xyXG4gICAgICAgIGNvbnN0IGlzU2lnbmF0dXJlID0gcHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eVNpZ25hdHVyZTtcclxuICAgICAgICBmbXhQcm9wZXJ0eS5uYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpO1xyXG5cclxuICAgICAgICBsZXQgcHJvcFR5cGVOYW1lID0gdGhpcy5VTktOT1dOX1ZBTFVFO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHByb3BUeXBlTmFtZSA9IHByb3BlcnR5LmdldFR5cGUoKS5nZXRUZXh0KCkudHJpbSgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciBwcm9wZXJ0eTogJHtwcm9wZXJ0eS5nZXROYW1lKCl9LiBDb250aW51aW5nLi4uYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmbXhUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShwcm9wVHlwZU5hbWUsIHByb3BlcnR5KTtcclxuICAgICAgICBmbXhQcm9wZXJ0eS5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xyXG5cclxuICAgICAgICAvLyBhZGQgdGhlIHZpc2liaWxpdHkgKHB1YmxpYywgcHJpdmF0ZSwgZXRjLikgdG8gdGhlIGZteFByb3BlcnR5XHJcbiAgICAgICAgZm14UHJvcGVydHkudmlzaWJpbGl0eSA9IFwiXCI7XHJcblxyXG4gICAgICAgIHByb3BlcnR5LmdldE1vZGlmaWVycygpLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAobS5nZXRUZXh0KCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgU2NvcGUuUHVibGljOlxyXG4gICAgICAgICAgICAgICAgICAgIGZteFByb3BlcnR5LnZpc2liaWxpdHkgPSBcInB1YmxpY1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBTY29wZS5Qcm90ZWN0ZWQ6XHJcbiAgICAgICAgICAgICAgICAgICAgZm14UHJvcGVydHkudmlzaWJpbGl0eSA9IFwicHJvdGVjdGVkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNjb3BlLlByaXZhdGU6XHJcbiAgICAgICAgICAgICAgICAgICAgZm14UHJvcGVydHkudmlzaWJpbGl0eSA9IFwicHJpdmF0ZVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInN0YXRpY1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGZteFByb3BlcnR5LmlzQ2xhc3NTaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZWFkb25seVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGZteFByb3BlcnR5LnJlYWRPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFpc1NpZ25hdHVyZSAmJiBwcm9wZXJ0eS5nZXRFeGNsYW1hdGlvblRva2VuTm9kZSgpKSB7XHJcbiAgICAgICAgICAgIGZteFByb3BlcnR5LmlzRGVmaW5pdGVseUFzc2lnbmVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb3BlcnR5LmdldFF1ZXN0aW9uVG9rZW5Ob2RlKCkpIHtcclxuICAgICAgICAgICAgZm14UHJvcGVydHkuaXNPcHRpb25hbCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5nZXROYW1lKCkuc3Vic3RyaW5nKDAsIDEpID09PSBcIiNcIikge1xyXG4gICAgICAgICAgICBmbXhQcm9wZXJ0eS5pc0phdmFTY3JpcHRQcml2YXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGluaXRGUU4ocHJvcGVydHksIGZteFByb3BlcnR5KTtcclxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihwcm9wZXJ0eSwgZm14UHJvcGVydHkpO1xyXG5cclxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14UHJvcGVydHkpO1xyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteFByb3BlcnR5LHByb3BlcnR5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZteFByb3BlcnR5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IG1ldGhvZCBvciBhY2Nlc3NvclxyXG4gICAgICogQHBhcmFtIG1ldGhvZCBBIG1ldGhvZCBvciBhbiBhY2Nlc3NvclxyXG4gICAgICogQHBhcmFtIGN1cnJlbnRDQyBUaGUgY3ljbG9tYXRpYyBjb21wbGV4aXR5IG1ldHJpY3Mgb2YgdGhlIGN1cnJlbnQgc291cmNlIGZpbGVcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgbWV0aG9kIG9yIHRoZSBhY2Nlc3NvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peE1ldGhvZChtZXRob2Q6IE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IE1ldGhvZFNpZ25hdHVyZSB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBjdXJyZW50Q0M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0pOiBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvciB8IEZhbWl4LlBhcmFtZXRyaWNNZXRob2Qge1xyXG4gICAgICAgIGxldCBmbXhNZXRob2Q6IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHwgRmFtaXguUGFyYW1ldHJpY01ldGhvZDtcclxuICAgICAgICBjb25zdCBpc0dlbmVyaWMgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xyXG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihtZXRob2QpO1xyXG4gICAgICAgIGlmICghdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5oYXMoZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUpKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAobWV0aG9kIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fCBtZXRob2QgaW5zdGFuY2VvZiBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBmbXhNZXRob2QgPSBuZXcgRmFtaXguQWNjZXNzb3IoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzR2V0dGVyID0gbWV0aG9kIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2V0dGVyID0gbWV0aG9kIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcclxuICAgICAgICAgICAgICAgIGlmIChpc0dldHRlcikgeyhmbXhNZXRob2QgYXMgRmFtaXguQWNjZXNzb3IpLmtpbmQgPSBcImdldHRlclwiO31cclxuICAgICAgICAgICAgICAgIGlmIChpc1NldHRlcikgeyhmbXhNZXRob2QgYXMgRmFtaXguQWNjZXNzb3IpLmtpbmQgPSBcInNldHRlclwiO31cclxuICAgICAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhNZXRob2QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJpYykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZteE1ldGhvZCA9IG5ldyBGYW1peC5QYXJhbWV0cmljTWV0aG9kKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmbXhNZXRob2QgPSBuZXcgRmFtaXguTWV0aG9kKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgaXNDb25zdHJ1Y3RvciA9IG1ldGhvZCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb247XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU2lnbmF0dXJlID0gbWV0aG9kIGluc3RhbmNlb2YgTWV0aG9kU2lnbmF0dXJlO1xyXG5cclxuICAgICAgICAgICAgbGV0IGlzQWJzdHJhY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGlzU3RhdGljID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiB8fCBtZXRob2QgaW5zdGFuY2VvZiBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIFNldEFjY2Vzc29yRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGlzQWJzdHJhY3QgPSBtZXRob2QuaXNBYnN0cmFjdCgpO1xyXG4gICAgICAgICAgICAgICAgaXNTdGF0aWMgPSBtZXRob2QuaXNTdGF0aWMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IpIHsoZm14TWV0aG9kIGFzIEZhbWl4LkFjY2Vzc29yKS5raW5kID0gXCJjb25zdHJ1Y3RvclwiO31cclxuICAgICAgICAgICAgZm14TWV0aG9kLmlzQWJzdHJhY3QgPSBpc0Fic3RyYWN0O1xyXG4gICAgICAgICAgICBmbXhNZXRob2QuaXNDbGFzc1NpZGUgPSBpc1N0YXRpYztcclxuICAgICAgICAgICAgZm14TWV0aG9kLmlzUHJpdmF0ZSA9IChtZXRob2QgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiB8fCBtZXRob2QgaW5zdGFuY2VvZiBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIFNldEFjY2Vzc29yRGVjbGFyYXRpb24pID8gKG1ldGhvZC5nZXRNb2RpZmllcnMoKS5maW5kKHggPT4geC5nZXRUZXh0KCkgPT09ICdwcml2YXRlJykpICE9PSB1bmRlZmluZWQgOiBmYWxzZTtcclxuICAgICAgICAgICAgZm14TWV0aG9kLmlzUHJvdGVjdGVkID0gKG1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfHwgbWV0aG9kIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbikgPyAobWV0aG9kLmdldE1vZGlmaWVycygpLmZpbmQoeCA9PiB4LmdldFRleHQoKSA9PT0gJ3Byb3RlY3RlZCcpKSAhPT0gdW5kZWZpbmVkIDogZmFsc2U7XHJcbiAgICAgICAgICAgIGZteE1ldGhvZC5zaWduYXR1cmUgPSBIZWxwZXJzLmNvbXB1dGVTaWduYXR1cmUobWV0aG9kLmdldFRleHQoKSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgbWV0aG9kTmFtZTogc3RyaW5nO1xyXG4gICAgICAgICAgICBpZiAoaXNDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFwiY29uc3RydWN0b3JcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAobWV0aG9kIGFzIE1ldGhvZERlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24pLmdldE5hbWUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmbXhNZXRob2QubmFtZSA9IG1ldGhvZE5hbWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzQ29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZygwLCAxKSA9PT0gXCIjXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbXhNZXRob2QuaXNQcml2YXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFmbXhNZXRob2QuaXNQcml2YXRlICYmICFmbXhNZXRob2QuaXNQcm90ZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGZteE1ldGhvZC5pc1B1YmxpYyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmbXhNZXRob2QuaXNQdWJsaWMgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpc1NpZ25hdHVyZSkge1xyXG4gICAgICAgICAgICAgICAgZm14TWV0aG9kLmN5Y2xvbWF0aWNDb21wbGV4aXR5ID0gY3VycmVudENDW2ZteE1ldGhvZC5uYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZteE1ldGhvZC5jeWNsb21hdGljQ29tcGxleGl0eSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBtZXRob2RUeXBlTmFtZSA9IHRoaXMuVU5LTk9XTl9WQUxVRTsgXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBtZXRob2RUeXBlTmFtZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciByZXR1cm4gdHlwZSBvZiBtZXRob2Q6ICR7Zm14TWV0aG9kLm5hbWV9LiBDb250aW51aW5nLi4uYCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKG1ldGhvZFR5cGVOYW1lLCBtZXRob2QpO1xyXG4gICAgICAgICAgICBmbXhNZXRob2QuZGVjbGFyZWRUeXBlID0gZm14VHlwZTtcclxuICAgICAgICAgICAgZm14TWV0aG9kLm51bWJlck9mTGluZXNPZkNvZGUgPSBtZXRob2QuZ2V0RW5kTGluZU51bWJlcigpIC0gbWV0aG9kLmdldFN0YXJ0TGluZU51bWJlcigpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTtcclxuICAgICAgICAgICAgZm14TWV0aG9kLm51bWJlck9mUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFpc1NpZ25hdHVyZSkge1xyXG4gICAgICAgICAgICAgICAgZm14TWV0aG9kLm51bWJlck9mU3RhdGVtZW50cyA9IG1ldGhvZC5nZXRTdGF0ZW1lbnRzKCkubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm14TWV0aG9kLm51bWJlck9mU3RhdGVtZW50cyA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGluaXRGUU4obWV0aG9kLCBmbXhNZXRob2QpO1xyXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14TWV0aG9kKTtcclxuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IobWV0aG9kLCBmbXhNZXRob2QpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5zZXQoZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUsIGZteE1ldGhvZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmbXhNZXRob2QgPSB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmdldChmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgKEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHwgRmFtaXguUGFyYW1ldHJpY01ldGhvZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteE1ldGhvZCxtZXRob2QpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBmbXhNZXRob2Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSBjdXJyZW50Q0MgVGhlIGN5Y2xvbWF0aWMgY29tcGxleGl0eSBtZXRyaWNzIG9mIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4RnVuY3Rpb24oZnVuYzogRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiwgY3VycmVudENDOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9KTogRmFtaXguRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24ge1xyXG4gICAgICAgIGxldCBmbXhGdW5jdGlvbjogRmFtaXguRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb247XHJcbiAgICAgICAgY29uc3QgaXNHZW5lcmljID0gZnVuYy5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgY29uc3QgZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGZ1bmMpO1xyXG4gICAgICAgIGlmICghdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5oYXMoZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIGlmIChpc0dlbmVyaWMpIHtcclxuICAgICAgICAgICAgICAgIGZteEZ1bmN0aW9uID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm14RnVuY3Rpb24gPSBuZXcgRmFtaXguRnVuY3Rpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBmdW5jLmdldE5hbWUoKTtcclxuICAgICAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGZteEZ1bmN0aW9uLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm14RnVuY3Rpb24ubmFtZSA9IFwiYW5vbnltb3VzXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZteEZ1bmN0aW9uLnNpZ25hdHVyZSA9IEhlbHBlcnMuY29tcHV0ZVNpZ25hdHVyZShmdW5jLmdldFRleHQoKSk7XHJcbiAgICAgICAgICAgIGZteEZ1bmN0aW9uLmN5Y2xvbWF0aWNDb21wbGV4aXR5ID0gY3VycmVudENDW2ZteEZ1bmN0aW9uLm5hbWVdO1xyXG4gICAgICAgICAgICBpbml0RlFOKGZ1bmMsIGZteEZ1bmN0aW9uKTtcclxuICAgICAgICAgICAgLy8gZm14RnVuY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lID0gZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWU7XHJcbiAgICBcclxuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvblR5cGVOYW1lID0gZnVuYy5nZXRSZXR1cm5UeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbjogJHtmdW5jLmdldE5hbWUoKX0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKGZ1bmN0aW9uVHlwZU5hbWUsIGZ1bmMpO1xyXG4gICAgICAgICAgICBmbXhGdW5jdGlvbi5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xyXG4gICAgICAgICAgICBmbXhGdW5jdGlvbi5udW1iZXJPZkxpbmVzT2ZDb2RlID0gZnVuYy5nZXRFbmRMaW5lTnVtYmVyKCkgLSBmdW5jLmdldFN0YXJ0TGluZU51bWJlcigpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gZnVuYy5nZXRQYXJhbWV0ZXJzKCk7XHJcbiAgICAgICAgICAgIGZteEZ1bmN0aW9uLm51bWJlck9mUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmbXhGdW5jdGlvbi5udW1iZXJPZlN0YXRlbWVudHMgPSBmdW5jLmdldFN0YXRlbWVudHMoKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGZ1bmMsIGZteEZ1bmN0aW9uKTtcclxuICAgIFxyXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14RnVuY3Rpb24pO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14RnVuY3Rpb24sZnVuYyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLnNldChmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSwgZm14RnVuY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm14RnVuY3Rpb24gPSB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmdldChmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgKEZhbWl4LkZ1bmN0aW9uIHwgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmbXhGdW5jdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBwYXJhbWV0ZXJcclxuICAgICAqIEBwYXJhbSBwYXJhbSBBIHBhcmFtZXRlclxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBwYXJhbWV0ZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhQYXJhbWV0ZXIocGFyYW06IFBhcmFtZXRlckRlY2xhcmF0aW9uKTogRmFtaXguUGFyYW1ldGVyIHtcclxuICAgICAgICBpZiAodGhpcy5mbXhQYXJhbWV0ZXJNYXAuaGFzKHBhcmFtKSkge1xyXG4gICAgICAgICAgICBjb25zdCByUGFyYW1ldGVyID0gdGhpcy5mbXhQYXJhbWV0ZXJNYXAuZ2V0KHBhcmFtKTtcclxuICAgICAgICAgICAgaWYgKHJQYXJhbWV0ZXIpIHsgXHJcbiAgICAgICAgICAgICAgIHJldHVybiByUGFyYW1ldGVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCBwYXJhbWV0ZXIgJHtwYXJhbS5nZXROYW1lKCl9IGlzIG5vdCBmb3VuZCBpbiB0aGUgcGFyYW1ldGVyIG1hcC5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZm14UGFyYW0gPSBuZXcgRmFtaXguUGFyYW1ldGVyKCk7XHJcblxyXG4gICAgICAgIGxldCBwYXJhbVR5cGVOYW1lID0gdGhpcy5VTktOT1dOX1ZBTFVFO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHBhcmFtVHlwZU5hbWUgPSBwYXJhbS5nZXRUeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiAke2Vycm9yfS4gRmFpbGVkIHRvIGdldCB1c2FibGUgbmFtZSBmb3IgcGFyYW1ldGVyOiAke3BhcmFtLmdldE5hbWUoKX0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKHBhcmFtVHlwZU5hbWUsIHBhcmFtKTtcclxuICAgICAgICBmbXhQYXJhbS5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xyXG4gICAgICAgIGZteFBhcmFtLm5hbWUgPSBwYXJhbS5nZXROYW1lKCk7XHJcblxyXG4gICAgICAgIGluaXRGUU4ocGFyYW0sIGZteFBhcmFtKTtcclxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihwYXJhbSwgZm14UGFyYW0pO1xyXG5cclxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14UGFyYW0pO1xyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteFBhcmFtLCBwYXJhbSk7XHJcbiAgICAgICAgdGhpcy5mbXhQYXJhbWV0ZXJNYXAuc2V0KHBhcmFtLCBmbXhQYXJhbSk7XHJcblxyXG4gICAgICAgIHJldHVybiBmbXhQYXJhbTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCB0eXBlIHBhcmFtZXRlclxyXG4gICAgICogQHBhcmFtIHRwIEEgdHlwZSBwYXJhbWV0ZXJcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgdHlwZSBwYXJhbWV0ZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4UGFyYW1ldGVyVHlwZSh0cDogVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKTogRmFtaXguUGFyYW1ldGVyVHlwZSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZm14UGFyYW1ldGVyVHlwZSA9IG5ldyBGYW1peC5QYXJhbWV0ZXJUeXBlKCk7XHJcbiAgIFxyXG4gICAgICAgIGZteFBhcmFtZXRlclR5cGUubmFtZSA9IHRwLmdldE5hbWUoKTsgICAgICBcclxuICAgICAgICBpbml0RlFOKHRwLCBmbXhQYXJhbWV0ZXJUeXBlKTtcclxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcih0cCwgZm14UGFyYW1ldGVyVHlwZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhQYXJhbWV0ZXJUeXBlKTtcclxuXHJcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhQYXJhbWV0ZXJUeXBlLHRwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZteFBhcmFtZXRlclR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggdHlwZSBpbiB0aGUgY29udGV4dCBvZiBjb25jcmV0aXphdGlvbnNcclxuICAgICAqIEBwYXJhbSB0eXBlTmFtZSBBIHR5cGUgbmFtZVxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgQW4gZWxlbWVudFxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSB0eXBlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4Q29uY3JldGVUeXBlKGVsZW1lbnQ6IFR5cGVOb2RlKTogXHJcbiAgICAgICAgRmFtaXguUGFyYW1ldGVyVHlwZSB8IEZhbWl4LlByaW1pdGl2ZVR5cGUgfCBGYW1peC5DbGFzcyB8IEZhbWl4LkludGVyZmFjZSB7XHJcbiAgICAgICAgLy8gVE9ETyAtIHJlZmFjdG9yIHRvIHN0b3AgdXNpbmcgbmFtZXMgYXMgYSBrZXkgaW4gdGhlIG1hcHMsIHVzZSB0cy1tb3JwaCBlbGVtZW50IGluc3RlYWRcclxuICAgICAgICBjb25zdCB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gPSBlbGVtZW50LmdldFN5bWJvbCgpPy5nZXREZWNsYXJhdGlvbnMoKVswXSBhcyBUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247XHJcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyVHlwZU5hbWUgOiBzdHJpbmcgPSBlbGVtZW50LmdldFRleHQoKTtcclxuICAgICAgICBsZXQgZm14UGFyYW1ldGVyVHlwZTogRmFtaXguVHlwZSB8IEZhbWl4LkNsYXNzIHwgRmFtaXguSW50ZXJmYWNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAvLyBnZXQgYSBUeXBlUmVmZXJlbmNlIGZyb20gYSBUeXBlTm9kZVxyXG4gICAgICAgIGNvbnN0IHR5cGVSZWZlcmVuY2UgPSBlbGVtZW50LmdldFR5cGUoKTtcclxuICAgICAgICAvLyBnZXQgYSBUeXBlRGVjbGFyYXRpb24gZnJvbSBhIFR5cGVSZWZlcmVuY2VcclxuICAgICAgICBjb25zdCB0eXBlRGVjbGFyYXRpb24gPSB0eXBlUmVmZXJlbmNlLmdldFN5bWJvbCgpPy5nZXREZWNsYXJhdGlvbnMoKVswXSBhcyBUU01vcnBoVHlwZURlY2xhcmF0aW9uO1xyXG5cclxuICAgICAgICBsZXQgaXNDbGFzc09ySW50ZXJmYWNlID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuZm14Q2xhc3NNYXAuaGFzKHBhcmFtZXRlclR5cGVOYW1lKSl7XHJcbiAgICAgICAgICAgIHRoaXMuZm14Q2xhc3NNYXAuZm9yRWFjaCgob2JqLCBuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljQ2xhc3Mpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBlbGVtZW50LmdldFRleHQoKSAmJiBvYmouZ2VuZXJpY1BhcmFtZXRlcnMuc2l6ZT4wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlclR5cGUgPSBvYmo7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xhc3NPckludGVyZmFjZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGVsZW1lbnQuZ2V0VGV4dCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlclR5cGUgPSBvYmo7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xhc3NPckludGVyZmFjZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgICAgIH0gICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5mbXhJbnRlcmZhY2VNYXAuaGFzKHBhcmFtZXRlclR5cGVOYW1lKSl7XHJcbiAgICAgICAgICAgIHRoaXMuZm14SW50ZXJmYWNlTWFwLmZvckVhY2goKG9iaiwgbmFtZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYob2JqIGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGVsZW1lbnQuZ2V0VGV4dCgpICYmIG9iai5nZW5lcmljUGFyYW1ldGVycy5zaXplPjApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG9iajtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGFzc09ySW50ZXJmYWNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZWxlbWVudC5nZXRUZXh0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG9iajtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGFzc09ySW50ZXJmYWNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgfSAgIFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCFpc0NsYXNzT3JJbnRlcmZhY2Upe1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZm14VHlwZU1hcC5oYXModHlwZURlY2xhcmF0aW9uKSkgeyAgICBcclxuICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVmYWN0b3IgXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmltaXRpdmVUeXBlKHBhcmFtZXRlclR5cGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlclR5cGUgPSBuZXcgRmFtaXguUHJpbWl0aXZlVHlwZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlclR5cGUuaXNTdHViID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG5ldyBGYW1peC5QYXJhbWV0ZXJUeXBlKCk7XHJcbiAgICAgICAgICAgICAgICB9IFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJUeXBlLm5hbWUgPSBwYXJhbWV0ZXJUeXBlTmFtZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhQYXJhbWV0ZXJUeXBlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm14VHlwZU1hcC5zZXQodHlwZURlY2xhcmF0aW9uLCBmbXhQYXJhbWV0ZXJUeXBlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14UGFyYW1ldGVyVHlwZSx0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mbXhUeXBlTWFwLmdldCh0eXBlRGVjbGFyYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlclR5cGUgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggdHlwZSAke3R5cGVEZWNsYXJhdGlvbn0gaXMgbm90IGZvdW5kIGluIHRoZSBUeXBlIG1hcC5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWZteFBhcmFtZXRlclR5cGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmbXhQYXJhbWV0ZXJUeXBlIHdhcyB1bmRlZmluZWQgZm9yIHBhcmFtZXRlclR5cGVOYW1lICR7cGFyYW1ldGVyVHlwZU5hbWV9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbXhQYXJhbWV0ZXJUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IHZhcmlhYmxlXHJcbiAgICAgKiBAcGFyYW0gdmFyaWFibGUgQSB2YXJpYWJsZVxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSB2YXJpYWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peFZhcmlhYmxlKHZhcmlhYmxlOiBWYXJpYWJsZURlY2xhcmF0aW9uKTogRmFtaXguVmFyaWFibGUge1xyXG4gICAgICAgIGlmICh0aGlzLmZteFZhcmlhYmxlTWFwLmhhcyh2YXJpYWJsZSkpIHtcclxuICAgICAgICAgICAgY29uc3QgclZhcmlhYmxlID0gdGhpcy5mbXhWYXJpYWJsZU1hcC5nZXQodmFyaWFibGUpO1xyXG4gICAgICAgICAgICBpZiAoclZhcmlhYmxlKSB7IFxyXG4gICAgICAgICAgICAgICByZXR1cm4gclZhcmlhYmxlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCBwYXJhbWV0ZXIgJHt2YXJpYWJsZS5nZXROYW1lKCl9IGlzIG5vdCBmb3VuZCBpbiB0aGUgdmFyaWFibGUgbWFwLmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZteFZhcmlhYmxlID0gbmV3IEZhbWl4LlZhcmlhYmxlKCk7XHJcbiAgICBcclxuICAgICAgICBsZXQgdmFyaWFibGVUeXBlTmFtZSA9IHRoaXMuVU5LTk9XTl9WQUxVRTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXJpYWJsZVR5cGVOYW1lID0gdmFyaWFibGUuZ2V0VHlwZSgpLmdldFRleHQoKS50cmltKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIEZhaWxlZCB0byBnZXQgdXNhYmxlIG5hbWUgZm9yIHZhcmlhYmxlOiAke3ZhcmlhYmxlLmdldE5hbWUoKX0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBjb25zdCBmbXhUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZSh2YXJpYWJsZVR5cGVOYW1lLCB2YXJpYWJsZSk7XHJcbiAgICAgICAgZm14VmFyaWFibGUuZGVjbGFyZWRUeXBlID0gZm14VHlwZTtcclxuICAgICAgICBmbXhWYXJpYWJsZS5uYW1lID0gdmFyaWFibGUuZ2V0TmFtZSgpO1xyXG4gICAgICAgIGluaXRGUU4odmFyaWFibGUsIGZteFZhcmlhYmxlKTtcclxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcih2YXJpYWJsZSwgZm14VmFyaWFibGUpO1xyXG4gICAgXHJcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFZhcmlhYmxlKTtcclxuICAgIFxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14VmFyaWFibGUsdmFyaWFibGUpO1xyXG4gICAgICAgIHRoaXMuZm14VmFyaWFibGVNYXAuc2V0KHZhcmlhYmxlLCBmbXhWYXJpYWJsZSk7XHJcbiAgICBcclxuICAgICAgICByZXR1cm4gZm14VmFyaWFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggZW51bVxyXG4gICAgICogQHBhcmFtIGVudW1FbnRpdHkgQW4gZW51bVxyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBlbnVtXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4RW51bShlbnVtRW50aXR5OiBFbnVtRGVjbGFyYXRpb24pOiBGYW1peC5FbnVtIHtcclxuICAgICAgICBpZiAodGhpcy5mbXhFbnVtTWFwLmhhcyhlbnVtRW50aXR5KSkge1xyXG4gICAgICAgICAgICBjb25zdCByRW51bSA9IHRoaXMuZm14RW51bU1hcC5nZXQoZW51bUVudGl0eSk7XHJcbiAgICAgICAgICAgIGlmIChyRW51bSkgeyBcclxuICAgICAgICAgICAgICAgcmV0dXJuIHJFbnVtO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCBlbnVtICR7ZW51bUVudGl0eS5nZXROYW1lKCl9IGlzIG5vdCBmb3VuZCBpbiB0aGUgZW51bSBtYXAuYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZm14RW51bSA9IG5ldyBGYW1peC5FbnVtKCk7XHJcbiAgICAgICAgZm14RW51bS5uYW1lID0gZW51bUVudGl0eS5nZXROYW1lKCk7XHJcbiAgICAgICAgaW5pdEZRTihlbnVtRW50aXR5LCBmbXhFbnVtKTtcclxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihlbnVtRW50aXR5LCBmbXhFbnVtKTtcclxuXHJcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEVudW0pO1xyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEVudW0sZW51bUVudGl0eSk7XHJcbiAgICAgICAgdGhpcy5mbXhFbnVtTWFwLnNldChlbnVtRW50aXR5LCBmbXhFbnVtKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZteEVudW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggZW51bSB2YWx1ZVxyXG4gICAgICogQHBhcmFtIGVudW1NZW1iZXIgQW4gZW51bSBtZW1iZXJcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgZW51bSBtZW1iZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4RW51bVZhbHVlKGVudW1NZW1iZXI6IEVudW1NZW1iZXIpOiBGYW1peC5FbnVtVmFsdWUge1xyXG4gICAgICAgIGNvbnN0IGZteEVudW1WYWx1ZSA9IG5ldyBGYW1peC5FbnVtVmFsdWUoKTtcclxuXHJcbiAgICAgICAgbGV0IGVudW1WYWx1ZVR5cGVOYW1lID0gdGhpcy5VTktOT1dOX1ZBTFVFO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVudW1WYWx1ZVR5cGVOYW1lID0gZW51bU1lbWJlci5nZXRUeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiAke2Vycm9yfS4gRmFpbGVkIHRvIGdldCB1c2FibGUgbmFtZSBmb3IgZW51bSB2YWx1ZTogJHtlbnVtTWVtYmVyLmdldE5hbWUoKX0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKGVudW1WYWx1ZVR5cGVOYW1lLCBlbnVtTWVtYmVyKTtcclxuICAgICAgICBmbXhFbnVtVmFsdWUuZGVjbGFyZWRUeXBlID0gZm14VHlwZTtcclxuICAgICAgICBmbXhFbnVtVmFsdWUubmFtZSA9IGVudW1NZW1iZXIuZ2V0TmFtZSgpO1xyXG4gICAgICAgIGluaXRGUU4oZW51bU1lbWJlciwgZm14RW51bVZhbHVlKTtcclxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihlbnVtTWVtYmVyLCBmbXhFbnVtVmFsdWUpO1xyXG5cclxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14RW51bVZhbHVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhFbnVtVmFsdWUsZW51bU1lbWJlcik7XHJcblxyXG4gICAgICAgIHJldHVybiBmbXhFbnVtVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBkZWNvcmF0b3JcclxuICAgICAqIEBwYXJhbSBkZWNvcmF0b3IgQSBkZWNvcmF0b3JcclxuICAgICAqIEBwYXJhbSBkZWNvcmF0ZWRFbnRpdHkgQSBjbGFzcywgYSBtZXRob2QsIGEgcGFyYW1ldGVyIG9yIGEgcHJvcGVydHlcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgZGVjb3JhdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4RGVjb3JhdG9yKGRlY29yYXRvcjogRGVjb3JhdG9yLCBkZWNvcmF0ZWRFbnRpdHk6IENsYXNzRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uKTogRmFtaXguRGVjb3JhdG9yIHtcclxuICAgICAgICBjb25zdCBmbXhEZWNvcmF0b3IgPSBuZXcgRmFtaXguRGVjb3JhdG9yKCk7XHJcbiAgICAgICAgY29uc3QgZGVjb3JhdG9yTmFtZSA9IFwiQFwiICsgZGVjb3JhdG9yLmdldE5hbWUoKTtcclxuICAgICAgICBjb25zdCBkZWNvcmF0b3JFeHByZXNzaW9uID0gZGVjb3JhdG9yLmdldFRleHQoKS5zdWJzdHJpbmcoMSk7XHJcblxyXG4gICAgICAgIGZteERlY29yYXRvci5uYW1lID0gZGVjb3JhdG9yTmFtZTtcclxuICAgICAgICBmbXhEZWNvcmF0b3IuZGVjb3JhdG9yRXhwcmVzc2lvbiA9IGRlY29yYXRvckV4cHJlc3Npb247XHJcbiAgICAgICAgY29uc3QgZGVjb3JhdGVkRW50aXR5RnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihkZWNvcmF0ZWRFbnRpdHkpO1xyXG4gICAgICAgIGNvbnN0IGZteERlY29yYXRlZEVudGl0eSA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShkZWNvcmF0ZWRFbnRpdHlGdWxseVF1YWxpZmllZE5hbWUpIGFzIEZhbWl4Lk5hbWVkRW50aXR5O1xyXG4gICAgICAgIGZteERlY29yYXRvci5kZWNvcmF0ZWRFbnRpdHkgPSBmbXhEZWNvcmF0ZWRFbnRpdHk7XHJcbiAgICAgICAgaW5pdEZRTihkZWNvcmF0b3IsIGZteERlY29yYXRvcik7XHJcbiAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoZGVjb3JhdG9yLCBmbXhEZWNvcmF0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14RGVjb3JhdG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhEZWNvcmF0b3IsZGVjb3JhdG9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZteERlY29yYXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBjb21tZW50XHJcbiAgICAgKiBAcGFyYW0gY29tbWVudCBBIGNvbW1lbnRcclxuICAgICAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbW1lbnQncyBjb250YWluZXJcclxuICAgICAqIEBwYXJhbSBpc0pTRG9jIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjb21tZW50IGlzIGEgSlNEb2NcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29tbWVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhDb21tZW50KGNvbW1lbnQ6IENvbW1lbnRSYW5nZSwgZm14U2NvcGU6IEZhbWl4Lk5hbWVkRW50aXR5LCBpc0pTRG9jOiBib29sZWFuKTogRmFtaXguQ29tbWVudCB7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGA+IE5PVEU6IGNyZWF0aW5nIGNvbW1lbnQgJHtjb21tZW50LmdldFRleHQoKX0gaW4gc2NvcGUgJHtmbXhTY29wZS5uYW1lfS5gKTtcclxuICAgICAgICBjb25zdCBmbXhDb21tZW50ID0gbmV3IEZhbWl4LkNvbW1lbnQoKTtcclxuICAgICAgICBmbXhDb21tZW50LmNvbnRhaW5lciA9IGZteFNjb3BlOyAgLy8gYWRkcyBjb21tZW50IHRvIHRoZSBjb250YWluZXIncyBjb21tZW50cyBjb2xsZWN0aW9uXHJcbiAgICAgICAgZm14Q29tbWVudC5pc0pTRG9jID0gaXNKU0RvYztcclxuXHJcbiAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoY29tbWVudCwgZm14Q29tbWVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhDb21tZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhDb21tZW50LGNvbW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gZm14Q29tbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IHR5cGVcclxuICAgICAqIEBwYXJhbSB0eXBlTmFtZSBBIHR5cGUgbmFtZVxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgQSB0cy1tb3JwaCBlbGVtZW50XHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHR5cGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhUeXBlKHR5cGVOYW1lOiBzdHJpbmcsIGVsZW1lbnQ6IFRTTW9ycGhUeXBlRGVjbGFyYXRpb24pOiBGYW1peC5UeXBlIHtcclxuICAgICAgICBsZXQgZm14VHlwZTogRmFtaXguVHlwZTtcclxuICAgICAgICBjb25zdCBpc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlVHlwZSh0eXBlTmFtZSk7XHJcbiAgICAgICAgY29uc3QgaXNQYXJhbWV0cmljVHlwZSA9XHJcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uICYmIGVsZW1lbnQuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwIHx8XHJcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMDsgXHJcblxyXG4gICAgICAgICAgICAvLyBGdW5jdGlvbnMgYW5kIG1ldGhvZHMgYXJlbid0IHR5cGVzIVxyXG4gICAgICAgICAgICAvLyB8fFxyXG4gICAgICAgICAgICAvLyBlbGVtZW50IGluc3RhbmNlb2YgRnVuY3Rpb25EZWNsYXJhdGlvbiAmJiBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMCB8fFxyXG4gICAgICAgICAgICAvLyBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gJiYgZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDAgfHxcclxuICAgICAgICAgICAgLy8gZWxlbWVudCBpbnN0YW5jZW9mIEFycm93RnVuY3Rpb24gJiYgZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIkNyZWF0aW5nIChvciBnZXR0aW5nKSB0eXBlOiAnXCIgKyB0eXBlTmFtZSArIFwiJyBvZiBlbGVtZW50OiBcIiArIGVsZW1lbnQ/LmdldFRleHQoKSArIFwiIG9mIGtpbmQ6IFwiICsgZWxlbWVudD8uZ2V0S2luZE5hbWUoKSk7XHJcblxyXG4gICAgICAgIGlmIChpc1ByaW1pdGl2ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVPckdldEZhbWl4UHJpbWl0aXZlVHlwZSh0eXBlTmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXNQYXJhbWV0cmljVHlwZSkge1xyXG4gICAgICAgICAgICAvLyBuYXJyb3cgdGhlIHR5cGVcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1ldHJpY0VsZW1lbnQgPSBlbGVtZW50IGFzIFRTTW9ycGhQYXJhbWV0cmljVHlwZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRyaWNUeXBlKHR5cGVOYW1lLCBwYXJhbWV0cmljRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZm14VHlwZU1hcC5oYXMoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgbGV0IGFuY2VzdG9yOiBGYW1peC5Db250YWluZXJFbnRpdHkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiBcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZUFuY2VzdG9yID0gSGVscGVycy5maW5kVHlwZUFuY2VzdG9yKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlQW5jZXN0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuY2VzdG9yIG5vdCBmb3VuZCBmb3IgZWxlbWVudCAke2VsZW1lbnQuZ2V0VGV4dCgpfS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTih0eXBlQW5jZXN0b3IpO1xyXG4gICAgICAgICAgICAgICAgYW5jZXN0b3IgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWUoYW5jZXN0b3JGdWxseVF1YWxpZmllZE5hbWUpIGFzIEZhbWl4LkNvbnRhaW5lckVudGl0eTtcclxuICAgICAgICAgICAgICAgIGlmICghYW5jZXN0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEFuY2VzdG9yICR7RlFORnVuY3Rpb25zLmdldEZRTih0eXBlQW5jZXN0b3IpfSBub3QgZm91bmQuIEFkZGluZyB0aGUgbmV3IHR5cGUuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKHR5cGVBbmNlc3Rvci5nZXRUZXh0KCksIHR5cGVBbmNlc3RvciBhcyBUU01vcnBoVHlwZURlY2xhcmF0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm14VHlwZSA9IG5ldyBGYW1peC5UeXBlKCk7XHJcbiAgICAgICAgICAgIGZteFR5cGUubmFtZSA9IHR5cGVOYW1lO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhbmNlc3Rvcikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbmNlc3RvciBub3QgZm91bmQgZm9yIHR5cGUgJHt0eXBlTmFtZX0uYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm14VHlwZS5jb250YWluZXIgPSBhbmNlc3RvcjtcclxuICAgICAgICAgICAgaW5pdEZRTihlbGVtZW50LCBmbXhUeXBlKTtcclxuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoZWxlbWVudCwgZm14VHlwZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14VHlwZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZteFR5cGVNYXAuc2V0KGVsZW1lbnQsIGZteFR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mbXhUeXBlTWFwLmdldChlbGVtZW50KTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZm14VHlwZSA9IHJlc3VsdDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggdHlwZSAke3R5cGVOYW1lfSBpcyBub3QgZm91bmQgaW4gdGhlIFR5cGUgbWFwLmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteFR5cGUsZWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBmbXhUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggdHlwZSB0aGF0IGlzIHBhcmFtZXRyaWNcclxuICAgICAqIEBwYXJhbSB0eXBlTmFtZSBBIHR5cGUgbmFtZVxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgQSB0cy1tb3JwaCBlbGVtZW50XHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHBhcmFtZXRlciB0eXBlXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZU9yR2V0RmFtaXhQYXJhbWV0cmljVHlwZSh0eXBlTmFtZTogc3RyaW5nLCBlbGVtZW50OiBUU01vcnBoUGFyYW1ldHJpY1R5cGUpOiBGYW1peC5UeXBlIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZm14VHlwZU1hcC5oYXMoZWxlbWVudCkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mbXhUeXBlTWFwLmdldChlbGVtZW50KTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggdHlwZSAke3R5cGVOYW1lfSBpcyBub3QgZm91bmQgKHVuZGVmaW5lZCkgaW4gdGhlIFR5cGUgbWFwLmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBIHBhcmFtZXRyaWMgdHlwZSBpcyBhIHR5cGUgdGhhdCBoYXMgdHlwZSBwYXJhbWV0ZXJzLCBlLmcuLCBMaXN0PFQ+XHJcbiAgICAgICAgLy8gSW4gVFMgaXQgY2FuIGJlIGEgY2xhc3MsIGFuIGludGVyZmFjZSwgYSBmdW5jdGlvbiwgYW4gYXJyb3cgZnVuY3Rpb24sIG9yIGEgbWV0aG9kXHJcblxyXG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgRmFtaXggUGFyYW1ldHJpYyBUeXBlIChtYXliZSBpdCdzIGp1c3QgYW4gSW50ZXJmYWNlLCBldGMuKVxyXG4gICAgICAgIGxldCBmbXhUeXBlOiBGYW1peC5UeXBlO1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgZm14VHlwZSA9IG5ldyBGYW1peC5QYXJhbWV0cmljQ2xhc3MoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikge1xyXG4gICAgICAgICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZnVuY3Rpb25zIGFuZCBtZXRob2RzIGFyZSBub3QgdHlwZXMgXHJcbiAgICAgICAgLy8gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAvLyAgICAgZm14VHlwZSA9IG5ldyBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24oKTtcclxuICAgICAgICAvLyB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnJvd0Z1bmN0aW9uKSB7XHJcbiAgICAgICAgLy8gICAgIGZteFR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldHJpY0Fycm93RnVuY3Rpb24oKTtcclxuICAgICAgICAvLyB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikge1xyXG4gICAgICAgIC8vICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNNZXRob2QoKTtcclxuICAgICAgICAvLyB9IFxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgaXMgbm90IGEgY2xhc3MsIGludGVyZmFjZSwgZnVuY3Rpb24sIGFycm93IGZ1bmN0aW9uLCBvciBtZXRob2QuYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjb25zdCBwYXJhbWV0ZXJzID0gZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpO1xyXG5cclxuICAgICAgICAvLyAvLyBmb3IgZWFjaCBwYXJhbWV0ZXIsIGdldE9yQ3JlYXRlIHRoZSBGYW1peFBhcmFtZXRlclR5cGVcclxuICAgICAgICAvLyBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBwYXJhbWV0ZXJzKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRlclR5cGUocGFyYW1ldGVyLmdldE5hbWUoKSwgcGFyYW1ldGVyKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIC8vIFRPRE86IHRoZSBmb2xsb3dpbmcgY29kZSBpcyBub3QgY29ycmVjdCwgaXQgaXMganVzdCBhIHBsYWNlaG9sZGVyXHJcbiAgICAgICAgLy8gY29uc3QgcGFyYW1ldGVyVHlwZU5hbWVzID0gdHlwZU5hbWUuc3Vic3RyaW5nKHR5cGVOYW1lLmluZGV4T2YoXCI8XCIpICsgMSwgdHlwZU5hbWUuaW5kZXhPZihcIj5cIikpXHJcbiAgICAgICAgLy8gICAgIC5zcGxpdChcIixcIikubWFwKHMgPT4gcy50cmltKCkpO1xyXG4gICAgICAgIC8vIGNvbnN0IGJhc2VUeXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCB0eXBlTmFtZS5pbmRleE9mKFwiPFwiKSkudHJpbSgpO1xyXG4gICAgICAgIC8vIHBhcmFtZXRlclR5cGVOYW1lcy5mb3JFYWNoKHBhcmFtZXRlclR5cGVOYW1lID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3QgZm14UGFyYW1ldGVyVHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRlclR5cGUocGFyYW1ldGVyVHlwZU5hbWUsIGVsZW1lbnQpO1xyXG4gICAgICAgIC8vICAgICAoZm14VHlwZSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlKS5hZGRBcmd1bWVudChmbXhQYXJhbWV0ZXJUeXBlKTtcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgICAvLyBjb25zdCBmbXhCYXNlVHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoYmFzZVR5cGVOYW1lLCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgLy8gKGZteFR5cGUgYXMgRmFtaXguUGFyYW1ldGVyVHlwZSkuYmFzZVR5cGUgPSBmbXhCYXNlVHlwZTtcclxuXHJcbiAgICAgICAgZm14VHlwZS5uYW1lID0gdHlwZU5hbWU7XHJcbiAgICAgICAgaW5pdEZRTihlbGVtZW50LCBmbXhUeXBlKTtcclxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14VHlwZSk7XHJcbiAgICAgICAgdGhpcy5mbXhUeXBlTWFwLnNldChlbGVtZW50LCBmbXhUeXBlKTtcclxuICAgICAgICByZXR1cm4gZm14VHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSB0eXBlIGZvciBhIHBhcmFtZXRlciBpbiBhIHBhcmFtZXRyaWMgdHlwZSwgZS5nLiwgVCBpbiBMaXN0PFQ+XHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZU5hbWUgXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgVHlwZVNjcmlwdCBlbGVtZW50IChUU01vcnBoUGFyYW1ldHJpY1R5cGUpIHRoYXQgdGhlIHR5cGUgaXMgYXNzb2NpYXRlZCB3aXRoXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgLy8gY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRlclR5cGUocGFyYW1ldGVyVHlwZU5hbWU6IHN0cmluZywgZWxlbWVudDogUGFyYW1ldGVyRGVjbGFyYXRpb24pIHtcclxuICAgIC8vICAgICBpZiAodGhpcy5mbXhUeXBlTWFwLmhhcyhlbGVtZW50KSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5mbXhUeXBlTWFwLmdldChlbGVtZW50KSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgLy8gZGV0ZXJtaW5lIGlmIGVsZW1lbnQgaXMgYSBcclxuICAgIC8vICAgICBjb25zdCBmbXhUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRlclR5cGUoKTtcclxuICAgIC8vICAgICAvLyBjb25zdCBwYXJhbWV0ZXJUeXBlTmFtZXMgPSB0eXBlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWUuaW5kZXhPZihcIjxcIikgKyAxLCB0eXBlTmFtZS5pbmRleE9mKFwiPlwiKSlcclxuICAgIC8vICAgICAvLyAgICAgLnNwbGl0KFwiLFwiKS5tYXAocyA9PiBzLnRyaW0oKSk7XHJcbiAgICAvLyAgICAgLy8gY29uc3QgYmFzZVR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIHR5cGVOYW1lLmluZGV4T2YoXCI8XCIpKS50cmltKCk7XHJcbiAgICAvLyAgICAgLy8gcGFyYW1ldGVyVHlwZU5hbWVzLmZvckVhY2gocGFyYW1ldGVyVHlwZU5hbWUgPT4ge1xyXG4gICAgLy8gICAgIC8vICAgICBjb25zdCBmbXhQYXJhbWV0ZXJUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4UGFyYW1ldGVyVHlwZShwYXJhbWV0ZXJUeXBlTmFtZSwgZWxlbWVudCk7XHJcbiAgICAvLyAgICAgLy8gICAgIChmbXhUeXBlIGFzIEZhbWl4LlBhcmFtZXRlclR5cGUpLmFkZEFyZ3VtZW50KGZteFBhcmFtZXRlclR5cGUpO1xyXG4gICAgLy8gICAgIC8vIH0pO1xyXG4gICAgLy8gICAgIGNvbnN0IGZteEJhc2VUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShiYXNlVHlwZU5hbWUsIGVsZW1lbnQpO1xyXG4gICAgLy8gICAgIChmbXhUeXBlIGFzIEZhbWl4LlBhcmFtZXRlclR5cGUpLmJhc2VUeXBlID0gZm14QmFzZVR5cGU7XHJcbiAgICAvLyAgICAgaW5pdEZRTihlbGVtZW50LCBmbXhUeXBlKTtcclxuICAgIC8vICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14VHlwZSk7XHJcbiAgICAvLyAgICAgdGhpcy5mbXhUeXBlTWFwLnNldChlbGVtZW50LCBmbXhUeXBlKTtcclxuICAgIC8vICAgICByZXR1cm4gZm14VHlwZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IHByaW1pdGl2ZSB0eXBlXHJcbiAgICAgKiBAcGFyYW0gdHlwZU5hbWUgQSB0eXBlIG5hbWVcclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVcclxuICAgICAqL1xyXG4gICAgY3JlYXRlT3JHZXRGYW1peFByaW1pdGl2ZVR5cGUodHlwZU5hbWU6IHN0cmluZyk6IEZhbWl4LlByaW1pdGl2ZVR5cGUge1xyXG4gICAgICAgIGxldCBmbXhUeXBlOiBGYW1peC5QcmltaXRpdmVUeXBlID0gbmV3IEZhbWl4LlByaW1pdGl2ZVR5cGUoKTtcclxuICAgICAgICBpZiAoIXRoaXMuZm14UHJpbWl0aXZlVHlwZU1hcC5oYXModHlwZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIGZteFR5cGUgPSBuZXcgRmFtaXguUHJpbWl0aXZlVHlwZSgpO1xyXG4gICAgICAgICAgICBmbXhUeXBlLmlzU3R1YiA9IHRydWU7XHJcbiAgICAgICAgICAgIGZteFR5cGUubmFtZSA9IHR5cGVOYW1lO1xyXG4gICAgICAgICAgICB0aGlzLmZteFByaW1pdGl2ZVR5cGVNYXAuc2V0KHR5cGVOYW1lLCBmbXhUeXBlKTtcclxuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFR5cGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZteFR5cGUgPSB0aGlzLmZteFByaW1pdGl2ZVR5cGVNYXAuZ2V0KHR5cGVOYW1lKSBhcyBGYW1peC5QcmltaXRpdmVUeXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZm14VHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBhY2Nlc3NcclxuICAgICAqIEBwYXJhbSBub2RlIEEgbm9kZVxyXG4gICAgICogQHBhcmFtIGlkIEFuIGlkIG9mIGEgcGFyYW1ldGVyLCBhIHZhcmlhYmxlLCBhIHByb3BlcnR5IG9yIGFuIGVudW0gbWVtYmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVGYW1peEFjY2Vzcyhub2RlOiBJZGVudGlmaWVyLCBpZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZm14VmFyID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5SWQoaWQpIGFzIEZhbWl4LlN0cnVjdHVyYWxFbnRpdHk7XHJcbiAgICAgICAgaWYgKCFmbXhWYXIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCBlbnRpdHkgd2l0aCBpZCAke2lkfSBub3QgZm91bmQsIGZvciBub2RlICR7bm9kZS5nZXRUZXh0KCl9IGluICR7bm9kZS5nZXRTb3VyY2VGaWxlKCkuZ2V0QmFzZU5hbWUoKX0gYXQgbGluZSAke25vZGUuZ2V0U3RhcnRMaW5lTnVtYmVyKCl9LmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBGYW1peEFjY2Vzcy4gTm9kZTogWyR7bm9kZS5nZXRLaW5kTmFtZSgpfV0gJyR7bm9kZS5nZXRUZXh0KCl9JyBhdCBsaW5lICR7bm9kZS5nZXRTdGFydExpbmVOdW1iZXIoKX0gaW4gJHtub2RlLmdldFNvdXJjZUZpbGUoKS5nZXRCYXNlTmFtZSgpfSwgaWQ6ICR7aWR9IHJlZmVycyB0byBmbXhWYXIgJyR7Zm14VmFyLmZ1bGx5UXVhbGlmaWVkTmFtZX0nLmApO1xyXG5cclxuICAgICAgICBjb25zdCBub2RlUmVmZXJlbmNlQW5jZXN0b3IgPSBIZWxwZXJzLmZpbmRBbmNlc3Rvcihub2RlKTtcclxuICAgICAgICBjb25zdCBhbmNlc3RvckZ1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4obm9kZVJlZmVyZW5jZUFuY2VzdG9yKTtcclxuICAgICAgICBjb25zdCBhY2Nlc3NvciA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShhbmNlc3RvckZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgRmFtaXguQ29udGFpbmVyRW50aXR5O1xyXG4gICAgICAgIGlmICghYWNjZXNzb3IpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBBbmNlc3RvciAke2FuY2VzdG9yRnVsbHlRdWFsaWZpZWROYW1lfSBvZiBraW5kICR7bm9kZVJlZmVyZW5jZUFuY2VzdG9yLmdldEtpbmROYW1lKCl9IG5vdCBmb3VuZC5gKTtcclxuICAgICAgICAgICAgLy8gYWNjZXNzb3IgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKGFuY2VzdG9yRnVsbHlRdWFsaWZpZWROYW1lLCBub2RlUmVmZXJlbmNlQW5jZXN0b3IgYXMgVHlwZURlY2xhcmF0aW9uKTtcclxuICAgICAgICAgICAgcmV0dXJuOyAvLyBiYWlsIG91dCBUT0RPOiB0aGlzIGlzIHByb2JhYmx5IHdyb25nXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGb3VuZCBhY2Nlc3NvciB0byBiZSAke2FjY2Vzc29yLmZ1bGx5UXVhbGlmaWVkTmFtZX0uYCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIGFjY2Vzc29yIGlzIGEgbWV0aG9kLCBmdW5jdGlvbiwgc2NyaXB0IG9yIG1vZHVsZVxyXG4gICAgICAgIGlmICghKGFjY2Vzc29yIGluc3RhbmNlb2YgRmFtaXguTWV0aG9kKSAmJiAhKGFjY2Vzc29yIGluc3RhbmNlb2YgRmFtaXguQXJyb3dGdW5jdGlvbikgJiYgIShhY2Nlc3NvciBpbnN0YW5jZW9mIEZhbWl4LkZ1bmN0aW9uKSAmJiAhKGFjY2Vzc29yIGluc3RhbmNlb2YgRmFtaXguU2NyaXB0RW50aXR5KSAmJiAhKGFjY2Vzc29yIGluc3RhbmNlb2YgRmFtaXguTW9kdWxlKSkge1xyXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEFjY2Vzc29yICR7YWNjZXNzb3IuZnVsbHlRdWFsaWZpZWROYW1lfSBpcyBub3QgYSBtZXRob2QsIGZ1bmN0aW9uLCBldGMuYCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGRvbid0IGNyZWF0ZSBhbnkgZHVwbGljYXRlcyAoZS5nLiBpZiB0aGUgc2FtZSB2YXJpYWJsZSBpcyBhY2Nlc3NlZCBtdWx0aXBsZSB0aW1lcyBieSBzYW1lIGFjY2Vzc29yKVxyXG4gICAgICAgIGNvbnN0IGZvdW5kQWNjZXNzID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEFjY2Vzc0J5QWNjZXNzb3JBbmRWYXJpYWJsZShhY2Nlc3NvciwgZm14VmFyKTtcclxuICAgICAgICBpZiAoZm91bmRBY2Nlc3MpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGYW1peEFjY2VzcyBhbHJlYWR5IGV4aXN0cyBmb3IgYWNjZXNzb3IgJHthY2Nlc3Nvci5mdWxseVF1YWxpZmllZE5hbWV9IGFuZCB2YXJpYWJsZSAke2ZteFZhci5mdWxseVF1YWxpZmllZE5hbWV9LmApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZteEFjY2VzcyA9IG5ldyBGYW1peC5BY2Nlc3MoKTtcclxuICAgICAgICBmbXhBY2Nlc3MuYWNjZXNzb3IgPSBhY2Nlc3NvcjtcclxuICAgICAgICBmbXhBY2Nlc3MudmFyaWFibGUgPSBmbXhWYXI7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhBY2Nlc3MpO1xyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEFjY2Vzcyxub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBpbnZvY2F0aW9uXHJcbiAgICAgKiBAcGFyYW0gbm9kZVJlZmVycmluZ1RvSW52b2NhYmxlIEEgbm9kZVxyXG4gICAgICogQHBhcmFtIGludm9jYWJsZSBBIG1ldGhvZCBvciBhIGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVGYW1peEludm9jYXRpb24obm9kZVJlZmVycmluZ1RvSW52b2NhYmxlOiBJZGVudGlmaWVyLCBpbnZvY2FibGU6IEludm9jYWJsZVR5cGUsIGlkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBmbXhJbnZvY2FibGUgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlJZChpZCkgYXMgRmFtaXguQmVoYXZpb3JhbEVudGl0eTtcclxuICAgICAgICAvLyBzaW5jZSB0aGUgbm9kZSBpcyBpbiB0aGUgQVNULCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGFuY2VzdG9yIHRoYXQgaXMgaW4gdGhlIEZhbWl4IG1vZGVsXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyT2ZOb2RlID0gSGVscGVycy5maW5kQW5jZXN0b3Iobm9kZVJlZmVycmluZ1RvSW52b2NhYmxlKTtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kIGNvbnRhaW5lciAoYW5jZXN0b3IpICR7Y29udGFpbmVyT2ZOb2RlLmdldEtpbmROYW1lKCl9IGZvciBBU1Qgbm9kZSAke25vZGVSZWZlcnJpbmdUb0ludm9jYWJsZS5nZXRUZXh0KCl9LmApO1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckZRTiA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oY29udGFpbmVyT2ZOb2RlKTtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kIGNvbnRhaW5lckZRTiAke2NvbnRhaW5lckZRTn0uYCk7XHJcbiAgICAgICAgbGV0IHNlbmRlciA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShjb250YWluZXJGUU4pIGFzIEZhbWl4LkNvbnRhaW5lckVudGl0eTtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kIGEgc2VuZGVyIHRoYXQgbWF0Y2hlcyAke3NlbmRlci5mdWxseVF1YWxpZmllZE5hbWV9LmApO1xyXG4gICAgICAgIGlmIChzZW5kZXIgaW5zdGFuY2VvZiBGYW1peC5UeXBlKSB7XHJcbiAgICAgICAgICAgIC8vIFRPRE8gdGhpcyBtaWdodCBiZSBhbiBlcnJvciBpbiBnZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lXHJcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgT29wcyEgU2VuZGVyIGlzIGEgdHlwZSwgd2hpY2ggaXMgbm90IHZhbGlkIGZvciBhbiBJbnZvY2F0aW9uLiBUcnlpbmcgdG8gZmluZCBhIGNvbnRhaW5lciBmb3IgJHtzZW5kZXIuZnVsbHlRdWFsaWZpZWROYW1lfS5gKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VuZGVyQ29udGFpbmVyID0gc2VuZGVyLmNvbnRhaW5lcjtcclxuICAgICAgICAgICAgaWYgKHNlbmRlckNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgc2VuZGVyID0gc2VuZGVyQ29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlY2VpdmVyRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihpbnZvY2FibGUuZ2V0UGFyZW50KCkpO1xyXG4gICAgICAgIGNvbnN0IHJlY2VpdmVyID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKHJlY2VpdmVyRnVsbHlRdWFsaWZpZWROYW1lKSBhcyBGYW1peC5OYW1lZEVudGl0eTtcclxuXHJcbiAgICAgICAgY29uc3QgZm14SW52b2NhdGlvbiA9IG5ldyBGYW1peC5JbnZvY2F0aW9uKCk7XHJcbiAgICAgICAgZm14SW52b2NhdGlvbi5zZW5kZXIgPSBzZW5kZXI7XHJcbiAgICAgICAgZm14SW52b2NhdGlvbi5yZWNlaXZlciA9IHJlY2VpdmVyO1xyXG4gICAgICAgIGZteEludm9jYXRpb24uYWRkQ2FuZGlkYXRlKGZteEludm9jYWJsZSk7XHJcbiAgICAgICAgZm14SW52b2NhdGlvbi5zaWduYXR1cmUgPSBmbXhJbnZvY2FibGUuc2lnbmF0dXJlO1xyXG5cclxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14SW52b2NhdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14SW52b2NhdGlvbixub2RlUmVmZXJyaW5nVG9JbnZvY2FibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGluaGVyaXRhbmNlXHJcbiAgICAgKiBAcGFyYW0gY2xzIEEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlIChzdWJjbGFzcylcclxuICAgICAqIEBwYXJhbSBpbmhDbGFzcyBUaGUgaW5oZXJpdGVkIGNsYXNzIG9yIGludGVyZmFjZSAoc3VwZXJjbGFzcylcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhJbmhlcml0YW5jZShjbHM6IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiwgaW5oQ2xhc3M6IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cyk6IHZvaWQge1xyXG4gICAgICAgIC8vIC8vIG5lZWQgYSBrZXkgdG8gc2VlIGlmIHRoZSBpbmhlcml0YW5jZSBhbHJlYWR5IGV4aXN0c1xyXG4gICAgICAgIC8vIGNvbnN0IGNsYXNzRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihjbHMpO1xyXG4gICAgICAgIC8vIGxldCBpbktleXdvcmQ6IHN0cmluZztcclxuICAgICAgICAvLyBsZXQgaW5oQ2xhc3NGdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcclxuICAgICAgICAvLyBsZXQgaW5oQ2xhc3NOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgLy8gLy8gaWYgaW5oQ2xhc3MgaXMgYW4gRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzLCBpdCBpcyBhbiBpbnRlcmZhY2VcclxuICAgICAgICAvLyBpZiAoaW5oQ2xhc3MgaW5zdGFuY2VvZiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpIHtcclxuICAgICAgICAvLyAgICAgaW5oQ2xhc3NOYW1lID0gaW5oQ2xhc3MuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKTtcclxuICAgICAgICAvLyAgICAgLy8gd2hhdCBpcyBpbmhDbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZT8gVE9ET1xyXG4gICAgICAgIC8vICAgICBpbmhDbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZSA9ICdVbmRlZmluZWRfU2NvcGVfZnJvbV9pbXBvcnRlci4nICsgaW5oQ2xhc3NOYW1lO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGluaENsYXNzTmFtZSA9IGluaENsYXNzLmdldE5hbWUoKTtcclxuICAgICAgICAvLyAgICAgaWYgKCFpbmhDbGFzc05hbWUpIHtcclxuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5oZXJpdGVkIGNsYXNzIG9yIGludGVyZmFjZSBuYW1lIG5vdCBmb3VuZCBmb3IgJHtpbmhDbGFzcy5nZXRUZXh0KCl9LmApO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIGluaENsYXNzRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihpbmhDbGFzcyk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIC8vIGJ1aWxkIHRoZSB1bmlxdWUga2V5IG9mIHRoZSBpbmhlcml0YW5jZVxyXG4gICAgICAgIC8vIGlmICgoY2xzIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbiAmJiBpbmhDbGFzcyBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIFxyXG4gICAgICAgIC8vICAgICB8fCAoY2xzIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24gJiYgaW5oQ2xhc3MgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikpIHtcclxuICAgICAgICAvLyAgICAgaW5LZXl3b3JkID0gXCIgZXh0ZW5kcyBcIjtcclxuICAgICAgICAvLyB9IGVsc2UgaWYgKGNscyBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24gJiYgKGluaENsYXNzIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24gfHwgaW5oQ2xhc3MgaW5zdGFuY2VvZiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpKSB7XHJcbiAgICAgICAgLy8gICAgIGluS2V5d29yZCA9IFwiIGltcGxlbWVudHMgXCI7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmhlcml0YW5jZSAke2Nscy5nZXRUZXh0KCl9IGFuZCAke2luaENsYXNzLmdldFRleHQoKX0gaXMgbm90IHZhbGlkLmApO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gY29uc3QgaW5oZXJpdGFuY2VGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGNscykgKyBpbktleXdvcmQgKyBpbmhDbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZTtcclxuICAgICAgICAvLyBpZiAodGhpcy5mbXhJbmhlcml0YW5jZU1hcC5oYXMoaW5oZXJpdGFuY2VGdWxseVF1YWxpZmllZE5hbWUpKSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHJJbmhlcml0YW5jZSA9IHRoaXMuZm14SW5oZXJpdGFuY2VNYXAuZ2V0KGluaGVyaXRhbmNlRnVsbHlRdWFsaWZpZWROYW1lKTtcclxuICAgICAgICAvLyAgICAgaWYgKHJJbmhlcml0YW5jZSkgeyBcclxuICAgICAgICAvLyAgICAgICAgcmV0dXJuOyAvLyBkb24ndCBkbyBhbnl0aGluZ1xyXG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmhlcml0YW5jZSAke2Nscy5nZXRUZXh0KCl9IGlzIG5vdCBmb3VuZCBpbiB0aGUgaW5oZXJpdGFuY2UgbWFwLmApO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBjb25zdCBmbXhJbmhlcml0YW5jZSA9IG5ldyBGYW1peC5Jbmhlcml0YW5jZSgpO1xyXG5cclxuICAgICAgICAvLyBsb2dnZXIuZGVidWcoYGNyZWF0ZUZhbWl4SW5oZXJpdGFuY2U6IGNsYXNzRnVsbHlRdWFsaWZpZWROYW1lOiBjbGFzcyBmcW4gPSAke2NsYXNzRnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgICAgICBsZXQgc3ViQ2xhc3M6IEZhbWl4LkNsYXNzIHwgRmFtaXguSW50ZXJmYWNlIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChjbHMgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7XHJcbiAgICAgICAgICAgIHN1YkNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3MoY2xzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHN1YkNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlKGNscyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXN1YkNsYXNzKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3ViY2xhc3MgJHtjbHN9IG5vdCBmb3VuZCBpbiBDbGFzcyBvciBJbnRlcmZhY2UgbWFwcy5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdXBlckNsYXNzOiBGYW1peC5DbGFzcyB8IEZhbWl4LkludGVyZmFjZSB8IHVuZGVmaW5lZDtcclxuICAgICAgICAvLyBpZiAoaW5oQ2xhc3MgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uIHx8IGluaENsYXNzIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAvLyAgICAgaW5oQ2xhc3NOYW1lID0gaW5oQ2xhc3MuZ2V0TmFtZSgpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIWluaENsYXNzTmFtZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmhlcml0ZWQgY2xhc3Mgb3IgaW50ZXJmYWNlIG5hbWUgbm90IGZvdW5kIGZvciAke2luaENsYXNzLmdldFRleHQoKX0uYCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgaW5oQ2xhc3NGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGluaENsYXNzKTtcclxuICAgICAgICAvLyAgICAgaWYgKGluaENsYXNzIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikge1xyXG4gICAgICAgIC8vICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuZm14Q2xhc3NNYXAuZ2V0KGluaENsYXNzRnVsbHlRdWFsaWZpZWROYW1lKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICAgICBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgIHN1cGVyQ2xhc3MgPSB0aGlzLmZteEludGVyZmFjZU1hcC5nZXQoaW5oQ2xhc3NGdWxseVF1YWxpZmllZE5hbWUpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIGlmICghc3VwZXJDbGFzcykge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdXBlcmNsYXNzICR7Y2xhc3NGdWxseVF1YWxpZmllZE5hbWV9IG5vdCBmb3VuZCBpbiBDbGFzcyBvciBJbnRlcmZhY2UgbWFwcy5gKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gLy8gaXQgc2hvdWxkbid0IGFkZCB0aGUgY2xhc3MvaW50ZXJmYWNlIGFnYWluIHRvIHRoZSBNYXAsIGl0IHNob3VsZCB1c2UgY3JlYXRlT3JHZXQgKD8pXHJcbiAgICAgICAgLy8gaWYgKHN1cGVyQ2xhc3MgPT09IHVuZGVmaW5lZCkge1xyXG5cclxuICAgICAgICBpZiAoaW5oQ2xhc3MgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vIHN1cGVyQ2xhc3MgPSBuZXcgRmFtaXguQ2xhc3MoKTtcclxuICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peENsYXNzKGluaENsYXNzKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5mbXhDbGFzc01hcC5zZXQoaW5oQ2xhc3NGdWxseVF1YWxpZmllZE5hbWUsIHN1cGVyQ2xhc3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpbmhDbGFzcyBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vIHN1cGVyQ2xhc3MgPSBuZXcgRmFtaXguSW50ZXJmYWNlKCk7XHJcbiAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoaW5oQ2xhc3MpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmZteEludGVyZmFjZU1hcC5zZXQoaW5oQ2xhc3NGdWxseVF1YWxpZmllZE5hbWUsIHN1cGVyQ2xhc3MpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGluaENsYXNzIGluc3RhbmNlb2YgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXHJcbiAgICAgICAgICAgIGNvbnN0IGludGVyZmFjZURlY2xhcmF0aW9uID0gZ2V0SW50ZXJmYWNlRGVjbGFyYXRpb25Gcm9tRXhwcmVzc2lvbihpbmhDbGFzcyk7XHJcbiAgICAgICAgICAgIGlmIChpbnRlcmZhY2VEZWNsYXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlKGludGVyZmFjZURlY2xhcmF0aW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJmYWNlIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCBmb3IgJHtpbmhDbGFzcy5nZXRUZXh0KCl9LmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KHN1cGVyQ2xhc3MsIGluaENsYXNzKTtcclxuXHJcbiAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoaW5oQ2xhc3MsIHN1cGVyQ2xhc3MpO1xyXG5cclxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoc3VwZXJDbGFzcyk7XHJcblxyXG4gICAgICAgIGZteEluaGVyaXRhbmNlLnN1YmNsYXNzID0gc3ViQ2xhc3M7XHJcbiAgICAgICAgZm14SW5oZXJpdGFuY2Uuc3VwZXJjbGFzcyA9IHN1cGVyQ2xhc3M7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhJbmhlcml0YW5jZSk7XHJcbiAgICAgICAgLy8gbm8gRlFOIGZvciBpbmhlcml0YW5jZVxyXG5cclxuICAgICAgICAvLyBXZSBkb24ndCBtYXAgaW5oZXJpdGFuY2UgdG8gdGhlIHNvdXJjZSBjb2RlIGVsZW1lbnQgYmVjYXVzZSB0aGVyZSBhcmUgdHdvIGVsZW1lbnRzIChzdXBlciwgc3ViKVxyXG4gICAgICAgIC8vIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14SW5oZXJpdGFuY2UsIG51bGwpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2UoaW1wb3J0ZWRFbnRpdHk6IEZhbWl4Lk5hbWVkRW50aXR5LCBpbXBvcnRpbmdFbnRpdHk6IEZhbWl4Lk1vZHVsZSkge1xyXG4gICAgICAgIGNvbnN0IGZteEltcG9ydENsYXVzZSA9IG5ldyBGYW1peC5JbXBvcnRDbGF1c2UoKTtcclxuICAgICAgICBmbXhJbXBvcnRDbGF1c2UuaW1wb3J0ZWRFbnRpdHkgPSBpbXBvcnRlZEVudGl0eTtcclxuICAgICAgICBmbXhJbXBvcnRDbGF1c2UuaW1wb3J0aW5nRW50aXR5ID0gaW1wb3J0aW5nRW50aXR5O1xyXG4gICAgICAgIGltcG9ydGluZ0VudGl0eS5hZGRPdXRnb2luZ0ltcG9ydChmbXhJbXBvcnRDbGF1c2UpO1xyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhJbXBvcnRDbGF1c2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGltcG9ydCBjbGF1c2VcclxuICAgICAqIEBwYXJhbSBpbXBvcnRDbGF1c2VJbmZvIFRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY3JlYXRlIGEgRmFtaXggaW1wb3J0IGNsYXVzZVxyXG4gICAgICogQHBhcmFtIGltcG9ydERlY2xhcmF0aW9uIFRoZSBpbXBvcnQgZGVjbGFyYXRpb25cclxuICAgICAqIEBwYXJhbSBpbXBvcnRlciBBIHNvdXJjZSBmaWxlIHdoaWNoIGlzIGEgbW9kdWxlXHJcbiAgICAgKiBAcGFyYW0gbW9kdWxlU3BlY2lmaWVyRmlsZVBhdGggVGhlIHBhdGggb2YgdGhlIG1vZHVsZSB3aGVyZSB0aGUgZXhwb3J0IGRlY2xhcmF0aW9uIGlzXHJcbiAgICAgKiBAcGFyYW0gaW1wb3J0RWxlbWVudCBUaGUgaW1wb3J0ZWQgZW50aXR5XHJcbiAgICAgKiBAcGFyYW0gaXNJbkV4cG9ydHMgQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGltcG9ydGVkIGVudGl0eSBpcyBpbiB0aGUgZXhwb3J0c1xyXG4gICAgICogQHBhcmFtIGlzRGVmYXVsdEV4cG9ydCBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgaW1wb3J0ZWQgZW50aXR5IGlzIGEgZGVmYXVsdCBleHBvcnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9sZENyZWF0ZU9yR2V0RmFtaXhJbXBvcnRDbGF1c2UoaW1wb3J0Q2xhdXNlSW5mbzoge2ltcG9ydERlY2xhcmF0aW9uPzogSW1wb3J0RGVjbGFyYXRpb24gfCBJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiwgaW1wb3J0ZXJTb3VyY2VGaWxlOiBTb3VyY2VGaWxlLCBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aDogc3RyaW5nLCBpbXBvcnRFbGVtZW50OiBJbXBvcnRTcGVjaWZpZXIgfCBJZGVudGlmaWVyLCBpc0luRXhwb3J0czogYm9vbGVhbiwgaXNEZWZhdWx0RXhwb3J0OiBib29sZWFufSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHtpbXBvcnREZWNsYXJhdGlvbiwgaW1wb3J0ZXJTb3VyY2VGaWxlOiBpbXBvcnRlciwgbW9kdWxlU3BlY2lmaWVyRmlsZVBhdGgsIGltcG9ydEVsZW1lbnQsIGlzSW5FeHBvcnRzLCBpc0RlZmF1bHRFeHBvcnR9ID0gaW1wb3J0Q2xhdXNlSW5mbztcclxuICAgICAgICBpZiAoaW1wb3J0RGVjbGFyYXRpb24gJiYgdGhpcy5mbXhJbXBvcnRDbGF1c2VNYXAuaGFzKGltcG9ydERlY2xhcmF0aW9uKSkge1xyXG4gICAgICAgICAgICBjb25zdCBySW1wb3J0Q2xhdXNlID0gdGhpcy5mbXhJbXBvcnRDbGF1c2VNYXAuZ2V0KGltcG9ydERlY2xhcmF0aW9uKTtcclxuICAgICAgICAgICAgaWYgKHJJbXBvcnRDbGF1c2UpIHsgXHJcbiAgICAgICAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgZG8gYW55dGhpbmdcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW1wb3J0IGNsYXVzZSAke2ltcG9ydEVsZW1lbnQuZ2V0VGV4dCgpfSBpcyBub3QgZm91bmQgaW4gdGhlIGltcG9ydCBjbGF1c2UgbWFwLmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2dnZXIuaW5mbyhgY3JlYXRpbmcgYSBuZXcgRmFtaXhJbXBvcnRDbGF1c2UgZm9yICR7aW1wb3J0RGVjbGFyYXRpb24/LmdldFRleHQoKX0gaW4gJHtpbXBvcnRlci5nZXRCYXNlTmFtZSgpfS5gKTtcclxuICAgICAgICBjb25zdCBmbXhJbXBvcnRDbGF1c2UgPSBuZXcgRmFtaXguSW1wb3J0Q2xhdXNlKCk7XHJcblxyXG4gICAgICAgIGxldCBpbXBvcnRlZEVudGl0eTogRmFtaXguTmFtZWRFbnRpdHkgfCBGYW1peC5TdHJ1Y3R1cmFsRW50aXR5IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBpbXBvcnRlZEVudGl0eU5hbWU6IHN0cmluZztcclxuXHJcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoUHJvamVjdCA9IHRoaXMuZmFtaXhSZXAuZ2V0QWJzb2x1dGVQYXRoKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5ub3JtYWxpemUobW9kdWxlU3BlY2lmaWVyRmlsZVBhdGgpO1xyXG4gICAgICAgIC8vIGNvbnZlcnQgdGhlIHBhdGggYW5kIHJlbW92ZSBhbnkgd2luZG93cyBiYWNrc2xhc2hlcyBpbnRyb2R1Y2VkIGJ5IHBhdGgubm9ybWFsaXplXHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBjcmVhdGVGYW1peEltcG9ydENsYXVzZTogYWJzb2x1dGVQYXRoOiAke2Fic29sdXRlUGF0aH1gKTtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYGNyZWF0ZUZhbWl4SW1wb3J0Q2xhdXNlOiBjb252ZXJ0VG9SZWxhdGl2ZVBhdGg6ICR7dGhpcy5jb252ZXJ0VG9SZWxhdGl2ZVBhdGgoYWJzb2x1dGVQYXRoLCBhYnNvbHV0ZVBhdGhQcm9qZWN0KX1gKTtcclxuICAgICAgICBjb25zdCBwYXRoSW5Qcm9qZWN0OiBzdHJpbmcgPSB0aGlzLmNvbnZlcnRUb1JlbGF0aXZlUGF0aChhYnNvbHV0ZVBhdGgsIGFic29sdXRlUGF0aFByb2plY3QpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2U6IHBhdGhJblByb2plY3Q6ICR7cGF0aEluUHJvamVjdH1gKTtcclxuICAgICAgICBsZXQgcGF0aE5hbWUgPSBcIntcIiArIHBhdGhJblByb2plY3QgKyBcIn0uXCI7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBjcmVhdGVGYW1peEltcG9ydENsYXVzZTogcGF0aE5hbWU6ICR7cGF0aE5hbWV9YCk7XHJcblxyXG4gICAgICAgIC8vIE5hbWVkIGltcG9ydHMsIGUuZy4gaW1wb3J0IHsgQ2xhc3NXIH0gZnJvbSBcIi4vY29tcGxleEV4cG9ydE1vZHVsZVwiO1xyXG5cclxuICAgICAgICAvLyBTdGFydCB3aXRoIHNpbXBsZSBpbXBvcnQgY2xhdXNlICh3aXRob3V0IHJlZmVycmluZyB0byB0aGUgYWN0dWFsIHZhcmlhYmxlKVxyXG5cclxuICAgICAgICBpZiAoaW1wb3J0RGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbXBvcnREZWNsYXJhdGlvbiBcclxuICAgICAgICAgICAgJiYgaW1wb3J0RWxlbWVudCBpbnN0YW5jZW9mIEltcG9ydFNwZWNpZmllcikgeyBcclxuICAgICAgICAgICAgICAgIGltcG9ydGVkRW50aXR5TmFtZSA9IGltcG9ydEVsZW1lbnQuZ2V0TmFtZSgpO1xyXG4gICAgICAgICAgICBwYXRoTmFtZSA9IHBhdGhOYW1lICsgaW1wb3J0ZWRFbnRpdHlOYW1lO1xyXG4gICAgICAgICAgICBpZiAoaXNJbkV4cG9ydHMpIHtcclxuICAgICAgICAgICAgICAgIGltcG9ydGVkRW50aXR5ID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKHBhdGhOYW1lKSBhcyBGYW1peC5OYW1lZEVudGl0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaW1wb3J0ZWRFbnRpdHkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkgPSBuZXcgRmFtaXguTmFtZWRFbnRpdHkoKTtcclxuICAgICAgICAgICAgICAgIGltcG9ydGVkRW50aXR5Lm5hbWUgPSBpbXBvcnRlZEVudGl0eU5hbWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzSW5FeHBvcnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkuaXNTdHViID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGxvZ2dlci5kZWJ1ZyhgY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2U6IENyZWF0aW5nIG5hbWVkIGVudGl0eSAke2ltcG9ydGVkRW50aXR5TmFtZX0gd2l0aCBGUU4gJHtwYXRoTmFtZX1gKTtcclxuICAgICAgICAgICAgICAgIC8vIGltcG9ydGVkRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9IHBhdGhOYW1lO1xyXG4gICAgICAgICAgICAgICAgaW5pdEZRTihpbXBvcnRFbGVtZW50LCBpbXBvcnRlZEVudGl0eSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoaW1wb3J0RWxlbWVudCwgaW1wb3J0ZWRFbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgLy8gbXVzdCBhZGQgZW50aXR5IHRvIHJlcG9zaXRvcnlcclxuICAgICAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChpbXBvcnRlZEVudGl0eSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaGFuZGxlIGltcG9ydCBlcXVhbHMgZGVjbGFyYXRpb25zLCBlLmcuIGltcG9ydCBteU1vZHVsZSA9IHJlcXVpcmUoXCIuL2NvbXBsZXhFeHBvcnRNb2R1bGVcIik7XHJcbiAgICAgICAgLy8gVHlwZVNjcmlwdCBjYW4ndCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIGltcG9ydGVkIG1vZHVsZSwgc28gd2UgY3JlYXRlIGEgTW9kdWxlIGVudGl0eVxyXG4gICAgICAgIGVsc2UgaWYgKGltcG9ydERlY2xhcmF0aW9uIGluc3RhbmNlb2YgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHlOYW1lID0gaW1wb3J0RGVjbGFyYXRpb24/LmdldE5hbWUoKTtcclxuICAgICAgICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZSArIGltcG9ydGVkRW50aXR5TmFtZTtcclxuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkgPSBuZXcgRmFtaXguU3RydWN0dXJhbEVudGl0eSgpO1xyXG4gICAgICAgICAgICBpbXBvcnRlZEVudGl0eS5uYW1lID0gaW1wb3J0ZWRFbnRpdHlOYW1lO1xyXG4gICAgICAgICAgICBpbml0RlFOKGltcG9ydERlY2xhcmF0aW9uLCBpbXBvcnRlZEVudGl0eSk7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGltcG9ydEVsZW1lbnQsIGltcG9ydGVkRW50aXR5KTtcclxuICAgICAgICAgICAgLy8gaW1wb3J0ZWRFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID0gcGF0aE5hbWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGFueVR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKCdhbnknLCBpbXBvcnREZWNsYXJhdGlvbik7XHJcbiAgICAgICAgICAgIChpbXBvcnRlZEVudGl0eSBhcyBGYW1peC5TdHJ1Y3R1cmFsRW50aXR5KS5kZWNsYXJlZFR5cGUgPSBhbnlUeXBlO1xyXG4gICAgICAgIH0gZWxzZSB7ICAvLyBkZWZhdWx0IGltcG9ydHMsIGUuZy4gaW1wb3J0IENsYXNzVyBmcm9tIFwiLi9jb21wbGV4RXhwb3J0TW9kdWxlXCI7ICBcclxuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHlOYW1lID0gaW1wb3J0RWxlbWVudC5nZXRUZXh0KCk7XHJcbiAgICAgICAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUgKyAoaXNEZWZhdWx0RXhwb3J0ID8gXCJkZWZhdWx0RXhwb3J0XCIgOiBcIm5hbWVzcGFjZUV4cG9ydFwiKTtcclxuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkgPSBuZXcgRmFtaXguTmFtZWRFbnRpdHkoKTtcclxuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkubmFtZSA9IGltcG9ydGVkRW50aXR5TmFtZTtcclxuICAgICAgICAgICAgLy8gaW1wb3J0ZWRFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID0gcGF0aE5hbWU7XHJcbiAgICAgICAgICAgIGluaXRGUU4oaW1wb3J0RWxlbWVudCwgaW1wb3J0ZWRFbnRpdHkpO1xyXG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihpbXBvcnRFbGVtZW50LCBpbXBvcnRlZEVudGl0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEkgZG9uJ3QgdGhpbmsgaXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSByZXBvc2l0b3J5IGlmIGl0IGV4aXN0cyBhbHJlYWR5XHJcbiAgICAgICAgaWYgKCFpc0luRXhwb3J0cykgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGltcG9ydGVkRW50aXR5KTtcclxuICAgICAgICBjb25zdCBpbXBvcnRlckZ1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oaW1wb3J0ZXIpO1xyXG4gICAgICAgIGNvbnN0IGZteEltcG9ydGVyID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKGltcG9ydGVyRnVsbHlRdWFsaWZpZWROYW1lKSBhcyBGYW1peC5Nb2R1bGU7XHJcbiAgICAgICAgZm14SW1wb3J0Q2xhdXNlLmltcG9ydGluZ0VudGl0eSA9IGZteEltcG9ydGVyO1xyXG4gICAgICAgIGZteEltcG9ydENsYXVzZS5pbXBvcnRlZEVudGl0eSA9IGltcG9ydGVkRW50aXR5O1xyXG4gICAgICAgIGlmIChpbXBvcnREZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGZteEltcG9ydENsYXVzZS5tb2R1bGVTcGVjaWZpZXIgPSBpbXBvcnREZWNsYXJhdGlvbj8uZ2V0TW9kdWxlUmVmZXJlbmNlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmbXhJbXBvcnRDbGF1c2UubW9kdWxlU3BlY2lmaWVyID0gaW1wb3J0RGVjbGFyYXRpb24/LmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCkgYXMgc3RyaW5nO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2U6ICR7Zm14SW1wb3J0Q2xhdXNlLmltcG9ydGVkRW50aXR5Py5uYW1lfSAob2YgdHlwZSAke1xyXG4gICAgICAgICAgICBIZWxwZXJzLmdldFN1YlR5cGVOYW1lKGZteEltcG9ydENsYXVzZS5pbXBvcnRlZEVudGl0eSl9KSBpcyBpbXBvcnRlZCBieSAke2ZteEltcG9ydENsYXVzZS5pbXBvcnRpbmdFbnRpdHk/Lm5hbWV9YCk7XHJcblxyXG4gICAgICAgIGZteEltcG9ydGVyLmFkZE91dGdvaW5nSW1wb3J0KGZteEltcG9ydENsYXVzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhJbXBvcnRDbGF1c2UpO1xyXG5cclxuICAgICAgICBpZiAoaW1wb3J0RGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhJbXBvcnRDbGF1c2UsIGltcG9ydERlY2xhcmF0aW9uKTtcclxuICAgICAgICAgICAgdGhpcy5mbXhJbXBvcnRDbGF1c2VNYXAuc2V0KGltcG9ydERlY2xhcmF0aW9uLCBmbXhJbXBvcnRDbGF1c2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBBcnJvdyBGdW5jdGlvblxyXG4gICAgICogQHBhcmFtIGFycm93RXhwcmVzc2lvbiBBbiBFeHByZXNzaW9uXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHZhcmlhYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4QXJyb3dGdW5jdGlvbihhcnJvd0V4cHJlc3Npb246IEV4cHJlc3Npb24sIGN1cnJlbnRDQzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSApOiBGYW1peC5BcnJvd0Z1bmN0aW9uIHwgRmFtaXguUGFyYW1ldHJpY0Fycm93RnVuY3Rpb24ge1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBmbXhBcnJvd0Z1bmN0aW9uOiBGYW1peC5BcnJvd0Z1bmN0aW9uIHwgRmFtaXguUGFyYW1ldHJpY0Fycm93RnVuY3Rpb247XHJcbiAgICAgICAgY29uc3QgZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGFycm93RXhwcmVzc2lvbik7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5oYXMoZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUpKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhcnJvd0Z1bmN0aW9uID0gYXJyb3dFeHByZXNzaW9uLmFzS2luZE9yVGhyb3coU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzR2VuZXJpYyA9IGFycm93RnVuY3Rpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzR2VuZXJpYykge1xyXG4gICAgICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbiA9IG5ldyBGYW1peC5QYXJhbWV0cmljQXJyb3dGdW5jdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbiA9IG5ldyBGYW1peC5BcnJvd0Z1bmN0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyZW50IG9mIHRoZSBhcnJvdyBmdW5jdGlvbiAodGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uKVxyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBhcnJvd0Z1bmN0aW9uLmdldFBhcmVudElmS2luZChTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pO1xyXG4gICAgICAgICAgICBsZXQgZnVuY3Rpb25OYW1lID0gJyhOT19OQU1FKSc7XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudCBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGVcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSA9IHBhcmVudC5nZXROYW1lKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChmdW5jdGlvbk5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24ubmFtZSA9IGZ1bmN0aW9uTmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24ubmFtZSA9IFwiYW5vbnltb3VzXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNpZ25hdHVyZSBvZiBhbiBhcnJvdyBmdW5jdGlvbiBpcyAocGFyYW1ldGVycykgPT4gcmV0dXJuX3R5cGVcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVyc1NpZ25hdHVyZSA9IGFycm93RnVuY3Rpb24uZ2V0UGFyYW1ldGVycygpLm1hcChwID0+IHAuZ2V0VGV4dCgpKS5qb2luKFwiLCBcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblR5cGVTaWduYXR1cmUgPSBhcnJvd0Z1bmN0aW9uLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCk7XHJcbiAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24uc2lnbmF0dXJlID0gYCgke3BhcmFtZXRlcnNTaWduYXR1cmV9KSA9PiAke3JldHVyblR5cGVTaWduYXR1cmV9YDtcclxuICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbi5jeWNsb21hdGljQ29tcGxleGl0eSA9IGN1cnJlbnRDQ1tmbXhBcnJvd0Z1bmN0aW9uLm5hbWVdO1xyXG5cclxuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvblR5cGVOYW1lID0gYXJyb3dGdW5jdGlvbi5nZXRSZXR1cm5UeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbjogJHtmdW5jdGlvbk5hbWV9LiBDb250aW51aW5nLi4uYCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKGZ1bmN0aW9uVHlwZU5hbWUsIGFycm93RnVuY3Rpb24gYXMgdW5rbm93biBhcyBGdW5jdGlvbkRlY2xhcmF0aW9uKTtcclxuICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbi5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xyXG4gICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uLm51bWJlck9mTGluZXNPZkNvZGUgPSBhcnJvd0Z1bmN0aW9uLmdldEVuZExpbmVOdW1iZXIoKSAtIGFycm93RnVuY3Rpb24uZ2V0U3RhcnRMaW5lTnVtYmVyKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBhcnJvd0Z1bmN0aW9uLmdldFBhcmFtZXRlcnMoKTtcclxuICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbi5udW1iZXJPZlBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLmxlbmd0aDtcclxuICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbi5udW1iZXJPZlN0YXRlbWVudHMgPSBhcnJvd0Z1bmN0aW9uLmdldFN0YXRlbWVudHMoKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGluaXRGUU4oYXJyb3dFeHByZXNzaW9uIGFzIHVua25vd24gYXMgVFNNb3JwaE9iamVjdFR5cGUsIGZteEFycm93RnVuY3Rpb24pO1xyXG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihhcnJvd0V4cHJlc3Npb24gYXMgdW5rbm93biBhcyBUU01vcnBoT2JqZWN0VHlwZSwgZm14QXJyb3dGdW5jdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhBcnJvd0Z1bmN0aW9uKTtcclxuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhBcnJvd0Z1bmN0aW9uLGFycm93RnVuY3Rpb24gYXMgdW5rbm93biBhcyBUU01vcnBoT2JqZWN0VHlwZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuc2V0KGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lLCBmbXhBcnJvd0Z1bmN0aW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uID0gdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5nZXQoZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUpIGFzIEZhbWl4LkFycm93RnVuY3Rpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZm14QXJyb3dGdW5jdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBjb25jcmV0aXNhdGlvblxyXG4gICAgICogQHBhcmFtIGNscyBBIGNsYXNzXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbmNyZXRpc2F0aW9uXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBjcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uKGNvbkVudGl0eSA6IEZhbWl4LlBhcmFtZXRyaWNDbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljTWV0aG9kICxnZW5FbnRpdHkgOiBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlIHwgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uIHwgRmFtaXguUGFyYW1ldHJpY01ldGhvZCk6IEZhbWl4LkNvbmNyZXRpc2F0aW9uIHtcclxuICAgICAgICBcclxuICAgIC8vICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbiA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gbmV3IEZhbWl4LkNvbmNyZXRpc2F0aW9uKCk7ICAgICAgICAgICAgICBcclxuICAgICAgICBcclxuICAgIC8vICAgICBmbXhDb25jcmV0aXNhdGlvbi5jb25jcmV0ZUVudGl0eSA9IGNvbkVudGl0eTtcclxuICAgIC8vICAgICBmbXhDb25jcmV0aXNhdGlvbi5nZW5lcmljRW50aXR5ID0gZ2VuRW50aXR5O1xyXG4gICAgLy8gICAgIC8vIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14Q29uY3JldGlzYXRpb24sbnVsbCk7XHJcbiAgICAvLyAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteENvbmNyZXRpc2F0aW9uKTsgICAgXHJcbiAgICAvLyAgICAgY29uc3QgcGFyYW1ldGVyQ29uY3JldGlzYXRpb24gPSB0aGlzLmNyZWF0ZUZhbWl4UGFyYW1ldGVyQ29uY3JldGlzYXRpb24oZm14Q29uY3JldGlzYXRpb24pO1xyXG4gICAgICAgICAgICBcclxuICAgIC8vICAgICByZXR1cm4gZm14Q29uY3JldGlzYXRpb247XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb25cclxuICAgICAqIEBwYXJhbSBjb25jcmV0aXNhdGlvbiBBIEZhbWl4Q29uY3JldGlzYXRpb25cclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgUGFyYW1ldGVyQ29uY3Jlc3Rpc2F0aW9uXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBjcmVhdGVGYW1peFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKGNvbmNyZXRpc2F0aW9uOiBGYW1peC5Db25jcmV0aXNhdGlvbik6IEZhbWl4LlBhcmFtZXRlckNvbmNyZXRpc2F0aW9uIHwgdW5kZWZpbmVke1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbkNsYXNzID0gY29uY3JldGlzYXRpb24uY29uY3JldGVFbnRpdHk7XHJcbiAgICAvLyAgICAgY29uc3QgZ2VuQ2xhc3MgPSBjb25jcmV0aXNhdGlvbi5nZW5lcmljRW50aXR5O1xyXG4gICAgLy8gICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgcGFyYW1ldGVyIGNvbmNyZXRpc2F0aW9uIGJldHdlZW4gJHtjb25DbGFzcy5mdWxseVF1YWxpZmllZE5hbWV9IGFuZCAke2dlbkNsYXNzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcclxuICAgIC8vICAgICBjb25zdCBwYXJhbWV0ZXJDb25jcmV0aXNhdGlvbnMgPSB0aGlzLmZhbWl4UmVwLl9nZXRBbGxFbnRpdGllc1dpdGhUeXBlKFwiUGFyYW1ldGVyQ29uY3JldGlzYXRpb25cIikgYXMgU2V0PEZhbWl4LlBhcmFtZXRlckNvbmNyZXRpc2F0aW9uPjtcclxuICAgIC8vICAgICBjb25zdCBjb25jcmV0ZVBhcmFtZXRlcnMgPSBjb25DbGFzcy5jb25jcmV0ZVBhcmFtZXRlcnM7XHJcbiAgICAvLyAgICAgY29uc3QgZ2VuZXJpY1BhcmFtZXRlcnMgPSBnZW5DbGFzcy5nZW5lcmljUGFyYW1ldGVycztcclxuICAgICAgICBcclxuICAgIC8vICAgICBsZXQgY29uQ2xhc3NUeXBlUGFyYW1ldGVyc0l0ZXJhdG9yID0gY29uY3JldGVQYXJhbWV0ZXJzLnZhbHVlcygpO1xyXG4gICAgLy8gICAgIGxldCBnZW5DbGFzc1R5cGVQYXJhbWV0ZXJzSXRlcmF0b3IgPSBnZW5lcmljUGFyYW1ldGVycy52YWx1ZXMoKTtcclxuICAgIC8vICAgICBsZXQgZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24gOiBGYW1peC5QYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnZW5lcmljUGFyYW1ldGVycy5zaXplOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgY29uQ2xhc3NUeXBlUGFyYW1ldGVyID0gY29uQ2xhc3NUeXBlUGFyYW1ldGVyc0l0ZXJhdG9yLm5leHQoKS52YWx1ZSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlO1xyXG4gICAgLy8gICAgICAgICBjb25zdCBnZW5DbGFzc1R5cGVQYXJhbWV0ZXIgPSBnZW5DbGFzc1R5cGVQYXJhbWV0ZXJzSXRlcmF0b3IubmV4dCgpLnZhbHVlIGFzIEZhbWl4LlBhcmFtZXRlclR5cGU7XHJcbiAgICAvLyAgICAgICAgIGxldCBjcmVhdGVQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gICAgICAgICBpZihjb25DbGFzc1R5cGVQYXJhbWV0ZXIgJiYgZ2VuQ2xhc3NUeXBlUGFyYW1ldGVyICYmIGNvbkNsYXNzVHlwZVBhcmFtZXRlci5uYW1lICE9IGdlbkNsYXNzVHlwZVBhcmFtZXRlci5uYW1lKXtcclxuICAgIC8vICAgICAgICAgICAgIHBhcmFtZXRlckNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChwYXJhbSA6IEZhbWl4LlBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKGNvbkNsYXNzVHlwZVBhcmFtZXRlci5uYW1lID09IHBhcmFtLmNvbmNyZXRlUGFyYW1ldGVyLm5hbWUgJiYgZ2VuQ2xhc3NUeXBlUGFyYW1ldGVyLm5hbWUgPT0gcGFyYW0uZ2VuZXJpY1BhcmFtZXRlci5uYW1lKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVBhcmFtZXRlckNvbmNyZXRpc2F0aW9uID0gZmFsc2U7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uID0gcGFyYW07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfSlcclxuICAgIC8vICAgICAgICAgICAgIGlmIChjcmVhdGVQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uID0gbmV3IEZhbWl4LlBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24uZ2VuZXJpY1BhcmFtZXRlciA9IGdlbkNsYXNzVHlwZVBhcmFtZXRlcjtcclxuICAgIC8vICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbi5jb25jcmV0ZVBhcmFtZXRlciA9IGNvbkNsYXNzVHlwZVBhcmFtZXRlcjtcclxuICAgIC8vICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbi5hZGRDb25jcmV0aXNhdGlvbihjb25jcmV0aXNhdGlvbik7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgLy8gdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbixudWxsKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKCFmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uIHdhcyB1bmRlZmluZWQgZm9yIGNvbmNyZXRpc2F0aW9uIHdpdGggZ2VuZXJpYyBwYXJhbWV0ZXIgJHtnZW5DbGFzc1R5cGVQYXJhbWV0ZXIubmFtZX0gYW5kIGNvbmNyZXRlIHBhcmFtZXRlciAke2NvbkNsYXNzVHlwZVBhcmFtZXRlci5uYW1lfWApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbi5hZGRDb25jcmV0aXNhdGlvbihjb25jcmV0aXNhdGlvbik7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24pO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGlmICghZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24pIHtcclxuICAgIC8vICAgICAgICAgbG9nZ2VyLmVycm9yKGBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiB3YXMgdW5kZWZpbmVkIGZvciBjb25jcmV0aXNhdGlvbiB3aXRoIGNvbmNyZXRlIGVudGl0eSAke2NvbkNsYXNzLmZ1bGx5UXVhbGlmaWVkTmFtZX0gYW5kIGdlbmVyaWMgZW50aXR5ICR7Z2VuQ2xhc3MuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb247XHJcblxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGNvbmNyZXRpc2F0aW9uIGJldHdlZW4gdHdvIGNsYXNzZXMgb3IgdHdvIGludGVyZmFjZXNcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IEEgY2xhc3Mgb3IgYW4gSW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBjcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uQ2xhc3NPckludGVyZmFjZVNwZWNpYWxpc2F0aW9uKGVsZW1lbnQ6IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbil7XHJcbiAgICAgICAgXHJcbiAgICAvLyAgICAgY29uc3Qgc3VwZXJFbnRpdHkgPSBlbGVtZW50LmdldEV4dGVuZHMoKTtcclxuICAgIC8vICAgICBsZXQgc3VwZXJFbnRpdHlBcnJheTtcclxuICAgIC8vICAgICBpZiAoc3VwZXJFbnRpdHkpe1xyXG4gICAgLy8gICAgICAgICBzdXBlckVudGl0eUFycmF5ID0gQXJyYXkuaXNBcnJheShzdXBlckVudGl0eSkgPyBzdXBlckVudGl0eSA6IFtzdXBlckVudGl0eV07XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGlmIChzdXBlckVudGl0eUFycmF5ICYmIHN1cGVyRW50aXR5QXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICBzdXBlckVudGl0eUFycmF5LmZvckVhY2goZW50aXR5ID0+IHtcclxuICAgIC8vICAgICAgICAgICAgIGxldCBlbnRpdHlJc0dlbmVyaWM7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBzdXBlckVudGl0eVN5bWJvbCA9IGVudGl0eS5nZXRFeHByZXNzaW9uKCkuZ2V0U3ltYm9sT3JUaHJvdygpO1xyXG4gICAgLy8gICAgICAgICAgICAgbGV0IHN1cGVyRW50aXR5RGVjbGFyYXRpb247XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoc3VwZXJFbnRpdHkgaW5zdGFuY2VvZiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBzdXBlckVudGl0eURlY2xhcmF0aW9uID0gc3VwZXJFbnRpdHlTeW1ib2wuZ2V0RGVjbGFyYXRpb25zKClbMF0uYXNLaW5kKHRzLlN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbik7XHJcbiAgICAvLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHN1cGVyRW50aXR5RGVjbGFyYXRpb24gPSBzdXBlckVudGl0eVN5bWJvbC5nZXREZWNsYXJhdGlvbnMoKVswXS5hc0tpbmQodHMuU3ludGF4S2luZC5JbnRlcmZhY2VEZWNsYXJhdGlvbik7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoc3VwZXJFbnRpdHlEZWNsYXJhdGlvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGVudGl0eUlzR2VuZXJpYyA9IHN1cGVyRW50aXR5RGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgaWYgKGVudGl0eUlzR2VuZXJpYykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGxldCBFbnRpdHlEZWNsYXJhdGlvbjtcclxuICAgIC8vICAgICAgICAgICAgICAgICBsZXQgZ2VuRW50aXR5O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChzdXBlckVudGl0eSBpbnN0YW5jZW9mIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBFbnRpdHlEZWNsYXJhdGlvbiA9IGVudGl0eS5nZXRFeHByZXNzaW9uKCkuZ2V0U3ltYm9sKCk/LmdldERlY2xhcmF0aW9ucygpWzBdIGFzIENsYXNzRGVjbGFyYXRpb247XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGdlbkVudGl0eSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peENsYXNzKEVudGl0eURlY2xhcmF0aW9uKSBhcyBGYW1peC5QYXJhbWV0cmljQ2xhc3M7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgRW50aXR5RGVjbGFyYXRpb24gPSBlbnRpdHkuZ2V0RXhwcmVzc2lvbigpLmdldFN5bWJvbCgpPy5nZXREZWNsYXJhdGlvbnMoKVswXSBhcyBJbnRlcmZhY2VEZWNsYXJhdGlvbjtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgZ2VuRW50aXR5ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlKEVudGl0eURlY2xhcmF0aW9uKSBhcyBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zdCBnZW5QYXJhbXMgPSBFbnRpdHlEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLm1hcCgocGFyYW0pID0+IHBhcmFtLmdldFRleHQoKSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IGVsZW1lbnQuZ2V0SGVyaXRhZ2VDbGF1c2VzKClbMF0uZ2V0VHlwZU5vZGVzKClbMF0uZ2V0VHlwZUFyZ3VtZW50cygpXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3QgY29uUGFyYW1zID0gZWxlbWVudC5nZXRIZXJpdGFnZUNsYXVzZXMoKVswXS5nZXRUeXBlTm9kZXMoKVswXS5nZXRUeXBlQXJndW1lbnRzKCkubWFwKChwYXJhbSkgPT4gcGFyYW0uZ2V0VGV4dCgpKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoIUhlbHBlcnMuYXJyYXlzQXJlRXF1YWwoY29uUGFyYW1zLGdlblBhcmFtcykpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbkVudGl0eTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uRW50aXR5ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q29uY3JldGVFbGVtZW50KGdlbkVudGl0eSxFbnRpdHlEZWNsYXJhdGlvbixhcmdzKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY3JldGlzYXRpb25zID0gdGhpcy5mYW1peFJlcC5fZ2V0QWxsRW50aXRpZXNXaXRoVHlwZShcIkNvbmNyZXRpc2F0aW9uXCIpIGFzIFNldDxGYW1peC5Db25jcmV0aXNhdGlvbj47XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxldCBjcmVhdGVDb25jcmV0aXNhdGlvbiA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25jcmV0aXNhdGlvbnMuZm9yRWFjaCgoY29uYyA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25jLmdlbmVyaWNFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lICYmIGNvbmMuY29uY3JldGVFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbkVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUpe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmNyZXRpc2F0aW9uID0gZmFsc2U7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUNvbmNyZXRpc2F0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbiA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gdGhpcy5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uKGNvbkVudGl0eSxnZW5FbnRpdHkpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9KTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzZWVtcyB1bmZpbmlzaGVkXHJcbiAgICAvLyB9ICAgIFxyXG4gICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb24gYmV0d2VlbiBhIGNsYXNzIGFuZCBpdHMgaW5zdGFuY2lhdGlvbnNcclxuICAgICAqIEBwYXJhbSBjbHMgQSBjbGFzc1xyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkdlbmVyaWNJbnN0YW50aWF0aW9uKGNsczogQ2xhc3NEZWNsYXJhdGlvbil7XHJcbiAgICAgICBcclxuICAgIC8vICAgICBjb25zdCBpc0dlbmVyaWMgPSBjbHMuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xyXG4gICAgLy8gICAgIGlmIChpc0dlbmVyaWMpIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgaW5zdGFuY2VzID0gY2xzLmdldFNvdXJjZUZpbGUoKS5nZXREZXNjZW5kYW50c09mS2luZCh0cy5TeW50YXhLaW5kLk5ld0V4cHJlc3Npb24pXHJcbiAgICAvLyAgICAgICAgICAgICAuZmlsdGVyKG5ld0V4cHIgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBuZXdFeHByLmdldEV4cHJlc3Npb24oKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5nZXRUZXh0KCkgPT09IGNscy5nZXROYW1lKCk7XHJcbiAgICAvLyAgICAgICAgIH0pO1xyXG5cclxuICAgIC8vICAgICAgICAgaW5zdGFuY2VzLmZvckVhY2goaW5zdGFuY2UgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VJc0dlbmVyaWMgPSBpbnN0YW5jZS5nZXRUeXBlQXJndW1lbnRzKCkubGVuZ3RoID4gMDtcclxuICAgIC8vICAgICAgICAgICAgIGlmIChpbnN0YW5jZUlzR2VuZXJpYykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGNvblBhcmFtcyA9IGluc3RhbmNlLmdldFR5cGVBcmd1bWVudHMoKS5tYXAoKHBhcmFtKSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGdlbkVudGl0eSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peENsYXNzKGNscykgYXMgRmFtaXguUGFyYW1ldHJpY0NsYXNzO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGdlblBhcmFtcyA9IGNscy5nZXRUeXBlUGFyYW1ldGVycygpLm1hcCgocGFyYW0pID0+IHBhcmFtLmdldFRleHQoKSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKCFIZWxwZXJzLmFycmF5c0FyZUVxdWFsKGNvblBhcmFtcyxnZW5QYXJhbXMpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxldCBjb25FbnRpdHk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbkVudGl0eSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peENvbmNyZXRlRWxlbWVudChnZW5FbnRpdHksY2xzLGluc3RhbmNlLmdldFR5cGVBcmd1bWVudHMoKSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNyZXRpc2F0aW9ucyA9IHRoaXMuZmFtaXhSZXAuX2dldEFsbEVudGl0aWVzV2l0aFR5cGUoXCJDb25jcmV0aXNhdGlvblwiKSBhcyBTZXQ8RmFtaXguQ29uY3JldGlzYXRpb24+O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY3JlYXRlQ29uY3JldGlzYXRpb24gOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uY3JldGlzYXRpb25zLmZvckVhY2goKGNvbmMgOiBGYW1peC5Db25jcmV0aXNhdGlvbikgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbkVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uYy5nZW5lcmljRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSAmJiBjb25jLmNvbmNyZXRlRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25FbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lKXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb25jcmV0aXNhdGlvbiA9IGZhbHNlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVDb25jcmV0aXNhdGlvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm14Q29uY3JldGlzYXRpb24gOiBGYW1peC5Db25jcmV0aXNhdGlvbiA9IHRoaXMuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbihjb25FbnRpdHksZ2VuRW50aXR5KTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfSlcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzZWVtcyB1bmZpbmlzaGVkXHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb24gYmV0d2VlbiBhIGNsYXNzIGFuZCBpdHMgaW5zdGFuY2lhdGlvbnNcclxuICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb25cclxuICAgICAqL1xyXG4gICAgLy8gcHVibGljIGNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25GdW5jdGlvbkluc3RhbnRpYXRpb24oZWxlbWVudDogRnVuY3Rpb25EZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uKXtcclxuICAgIC8vICAgICBjb25zdCBpc0dlbmVyaWMgPSBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMDtcclxuICAgIC8vICAgICBpZiAoaXNHZW5lcmljKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGdlblBhcmFtcyA9IGVsZW1lbnQuZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAocGFyYW0gPT4gcGFyYW0uZ2V0VGV4dCgpKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgdXNlcyA9IGVsZW1lbnQuZmluZFJlZmVyZW5jZXNBc05vZGVzKCk7ICAgIFxyXG4gICAgLy8gICAgICAgICB1c2VzLmZvckVhY2godXNhZ2UgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlOiBOb2RlIHwgdW5kZWZpbmVkID0gdXNhZ2U7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsRXhwcmVzc2lvbiA9IGN1cnJlbnROb2RlLmFzS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsRXhwcmVzc2lvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsRXhwcmVzc2lvbiBub3QgZm91bmQgZm9yICR7Y3VycmVudE5vZGUuZ2V0VGV4dCgpfWApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlSXNHZW5lcmljID0gY2FsbEV4cHJlc3Npb24uZ2V0VHlwZUFyZ3VtZW50cygpLmxlbmd0aCA+IDA7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZUlzR2VuZXJpYykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IGNhbGxFeHByZXNzaW9uLmdldFR5cGVBcmd1bWVudHMoKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvblBhcmFtcyA9IGNhbGxFeHByZXNzaW9uLmdldFR5cGVBcmd1bWVudHMoKS5tYXAocGFyYW0gPT4gcGFyYW0uZ2V0VGV4dCgpKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSGVscGVycy5hcnJheXNBcmVFcXVhbChjb25QYXJhbXMsZ2VuUGFyYW1zKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZW5FbGVtZW50O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbkRlY2xhcmF0aW9uKXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuRWxlbWVudCA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peEZ1bmN0aW9uKGVsZW1lbnQsIHt9KSBhcyBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb247XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuRWxlbWVudCA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peE1ldGhvZChlbGVtZW50LCB7fSkgYXMgRmFtaXguUGFyYW1ldHJpY01ldGhvZDtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmNFbGVtZW50O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNFbGVtZW50ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q29uY3JldGVFbGVtZW50KGdlbkVsZW1lbnQsZWxlbWVudCxhcmdzKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25jcmV0aXNhdGlvbnMgPSB0aGlzLmZhbWl4UmVwLl9nZXRBbGxFbnRpdGllc1dpdGhUeXBlKFwiQ29uY3JldGlzYXRpb25cIikgYXMgU2V0PEZhbWl4LkNvbmNyZXRpc2F0aW9uPjtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3JlYXRlQ29uY3JldGlzYXRpb24gOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jcmV0aXNhdGlvbnMuZm9yRWFjaCgoY29uYyA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5FbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25jLmdlbmVyaWNFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lICYmIGNvbmMuY29uY3JldGVFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbmNFbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZSl7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb25jcmV0aXNhdGlvbiA9IGZhbHNlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUNvbmNyZXRpc2F0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZteENvbmNyZXRpc2F0aW9uIDogRmFtaXguQ29uY3JldGlzYXRpb24gPSB0aGlzLmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb24oY29uY0VsZW1lbnQsZ2VuRWxlbWVudCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAvLyBSZW1vbnRlciDDoCBsJ8OpbMOpbWVudCBwYXJlbnQgKHV0aWxlIHNpIGxlIG7Fk3VkIGRlIHLDqWbDqXJlbmNlIGVzdCB1biBlbmZhbnQpXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGNvbmNyZXRpc2F0aW9uIGJldHdlZW4gYSBjbGFzcyBhbmQgYW4gaW50ZXJmYWNlXHJcbiAgICAgKiBAcGFyYW0gY2xzIEEgY2xhc3NcclxuICAgICAqL1xyXG4gICAgLy8gcHVibGljIGNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25JbnRlcmZhY2VDbGFzcyhjbHM6IENsYXNzRGVjbGFyYXRpb24pe1xyXG4gICAgXHJcbiAgICAvLyAgICAgY29uc3Qgc3VwZXJJbnRlcmZhY2VzID0gY2xzLmdldEltcGxlbWVudHMoKTtcclxuICAgIC8vICAgICBzdXBlckludGVyZmFjZXMuZm9yRWFjaChpbnRlcmZhY2VUeXBlID0+IHtcclxuICAgIC8vICAgICAgICAgY29uc3QgaW50ZXJmYWNlSXNHZW5lcmljID0gaW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkubGVuZ3RoPjA7XHJcbiAgICAvLyAgICAgICAgIGlmIChpbnRlcmZhY2VJc0dlbmVyaWMpIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IGludGVyZmFjZURlY2xhcmF0aW9uID0gaW50ZXJmYWNlVHlwZS5nZXRFeHByZXNzaW9uKCkuZ2V0U3ltYm9sKCk/LmdldERlY2xhcmF0aW9ucygpWzBdIGFzIEludGVyZmFjZURlY2xhcmF0aW9uO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgZ2VuUGFyYW1zID0gaW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHBhcmFtKSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgY29uUGFyYW1zID0gY2xzLmdldEhlcml0YWdlQ2xhdXNlcygpWzBdLmdldFR5cGVOb2RlcygpWzBdLmdldFR5cGVBcmd1bWVudHMoKS5tYXAoKHBhcmFtKSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgYXJncyA9IGNscy5nZXRIZXJpdGFnZUNsYXVzZXMoKVswXS5nZXRUeXBlTm9kZXMoKVswXS5nZXRUeXBlQXJndW1lbnRzKCk7XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoIUhlbHBlcnMuYXJyYXlzQXJlRXF1YWwoY29uUGFyYW1zLGdlblBhcmFtcykpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zdCBnZW5JbnRlcmZhY2UgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoaW50ZXJmYWNlRGVjbGFyYXRpb24pIGFzIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2U7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3QgY29uSW50ZXJmYWNlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q29uY3JldGVFbGVtZW50KGdlbkludGVyZmFjZSxpbnRlcmZhY2VEZWNsYXJhdGlvbixhcmdzKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zdCBjb25jcmV0aXNhdGlvbnMgPSB0aGlzLmZhbWl4UmVwLl9nZXRBbGxFbnRpdGllc1dpdGhUeXBlKFwiQ29uY3JldGlzYXRpb25cIikgYXMgU2V0PEZhbWl4LkNvbmNyZXRpc2F0aW9uPjtcclxuICAgIC8vICAgICAgICAgICAgICAgICBsZXQgY3JlYXRlQ29uY3JldGlzYXRpb24gOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25jcmV0aXNhdGlvbnMuZm9yRWFjaCgoY29uYyA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5JbnRlcmZhY2UuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbmMuZ2VuZXJpY0VudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgJiYgY29uYy5jb25jcmV0ZUVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uSW50ZXJmYWNlLmZ1bGx5UXVhbGlmaWVkTmFtZSl7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb25jcmV0aXNhdGlvbiA9IGZhbHNlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChjcmVhdGVDb25jcmV0aXNhdGlvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbiA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gdGhpcy5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uKGNvbkludGVyZmFjZSxnZW5JbnRlcmZhY2UpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGNvbmNyZXRpc2F0aW9uIGJldHdlZW4gYW4gaW50ZXJmYWNlIGFuZCBhIFR5cGVcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IEEgdmFyaWFibGUgb3IgYSBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIGludGVyIEFuIGludGVyZmFjZVxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvblR5cGVJbnN0YW5jaWF0aW9uKGVsZW1lbnQ6IEludGVyZmFjZURlY2xhcmF0aW9uIHwgQ2xhc3NEZWNsYXJhdGlvbil7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGlzR2VuZXJpYyA9IGVsZW1lbnQuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xyXG4gICAgLy8gICAgIGlmIChpc0dlbmVyaWMpIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgZ2VuUGFyYW1zID0gZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpLm1hcChwYXJhbSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xyXG4gICAgLy8gICAgICAgICBjb25zdCB1c2VzID0gZWxlbWVudC5maW5kUmVmZXJlbmNlc0FzTm9kZXMoKTtcclxuICAgIC8vICAgICAgICAgdXNlcy5mb3JFYWNoKHVzZSA9PiB7ICAgICAgICBcclxuICAgIC8vICAgICAgICAgICAgIGxldCBwYXJlbnROb2RlID0gdXNlLmdldFBhcmVudCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgd2hpbGUgKHBhcmVudE5vZGUpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuVHlwZVJlZmVyZW5jZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlUmVmZXJlbmNlTm9kZSA9IHBhcmVudE5vZGUuYXNLaW5kKFN5bnRheEtpbmQuVHlwZVJlZmVyZW5jZSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlmICghdHlwZVJlZmVyZW5jZU5vZGUpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZVJlZmVyZW5jZU5vZGUgbm90IGZvdW5kIGZvciAke3BhcmVudE5vZGUuZ2V0VGV4dCgpfWApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVSZWZlcmVuY2VOb2RlSXNHZW5lcmljID0gdHlwZVJlZmVyZW5jZU5vZGUuZ2V0VHlwZUFyZ3VtZW50cygpLmxlbmd0aCA+IDA7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlUmVmZXJlbmNlTm9kZUlzR2VuZXJpYykge31cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB0eXBlUmVmZXJlbmNlTm9kZS5nZXRUeXBlQXJndW1lbnRzKCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25QYXJhbXMgPSB0eXBlUmVmZXJlbmNlTm9kZS5nZXRUeXBlQXJndW1lbnRzKCkubWFwKHBhcmFtID0+IHBhcmFtLmdldFRleHQoKSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUhlbHBlcnMuYXJyYXlzQXJlRXF1YWwoY29uUGFyYW1zLGdlblBhcmFtcykpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ2VuRWxlbWVudDtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbil7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDbGFzcyhlbGVtZW50KSBhcyBGYW1peC5QYXJhbWV0cmljQ2xhc3M7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuRWxlbWVudCA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZShlbGVtZW50KSBhcyBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uY0VsZW1lbnQ7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY0VsZW1lbnQgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoZ2VuRWxlbWVudCxlbGVtZW50LGFyZ3MpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNyZXRpc2F0aW9ucyA9IHRoaXMuZmFtaXhSZXAuX2dldEFsbEVudGl0aWVzV2l0aFR5cGUoXCJDb25jcmV0aXNhdGlvblwiKSBhcyBTZXQ8RmFtaXguQ29uY3JldGlzYXRpb24+O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjcmVhdGVDb25jcmV0aXNhdGlvbiA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChjb25jIDogRmFtaXguQ29uY3JldGlzYXRpb24pID0+IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbkVsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbmMuZ2VuZXJpY0VudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgJiYgY29uYy5jb25jcmV0ZUVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uY0VsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lKXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmNyZXRpc2F0aW9uID0gZmFsc2U7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlQ29uY3JldGlzYXRpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm14Q29uY3JldGlzYXRpb24gOiBGYW1peC5Db25jcmV0aXNhdGlvbiA9IHRoaXMuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbihjb25jRWxlbWVudCxnZW5FbGVtZW50KTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRQYXJlbnQoKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBjb252ZXJ0VG9SZWxhdGl2ZVBhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcsIGFic29sdXRlUGF0aFByb2plY3Q6IHN0cmluZykge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY29udmVydFRvUmVsYXRpdmVQYXRoOiBhYnNvbHV0ZVBhdGg6ICcke2Fic29sdXRlUGF0aH0nLCBhYnNvbHV0ZVBhdGhQcm9qZWN0OiAnJHthYnNvbHV0ZVBhdGhQcm9qZWN0fSdgKTtcclxuICAgICAgICBpZiAoYWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgoYWJzb2x1dGVQYXRoUHJvamVjdCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUGF0aC5yZXBsYWNlKGFic29sdXRlUGF0aFByb2plY3QsIFwiXCIpLnNsaWNlKDEpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhYnNvbHV0ZVBhdGguc2xpY2UoMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUGF0aDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZVR5cGUodHlwZU5hbWU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHR5cGVOYW1lID09PSBcIm51bWJlclwiIHx8XHJcbiAgICAgICAgdHlwZU5hbWUgPT09IFwic3RyaW5nXCIgfHxcclxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJib29sZWFuXCIgfHxcclxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJiaWdpbnRcIiB8fFxyXG4gICAgICAgIHR5cGVOYW1lID09PSBcInN5bWJvbFwiIHx8XHJcbiAgICAgICAgdHlwZU5hbWUgPT09IFwidW5kZWZpbmVkXCIgfHxcclxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJudWxsXCIgfHxcclxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJhbnlcIiB8fFxyXG4gICAgICAgIHR5cGVOYW1lID09PSBcInVua25vd25cIiB8fFxyXG4gICAgICAgIHR5cGVOYW1lID09PSBcIm5ldmVyXCIgfHxcclxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJ2b2lkXCI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRGUU4oc291cmNlRWxlbWVudDogVFNNb3JwaE9iamVjdFR5cGUsIGZhbWl4RWxlbWVudDogRmFtaXguU291cmNlZEVudGl0eSkge1xyXG4gICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gZWxlbWVudCBpcyBhIFR5cGUgLS0gbmVlZCB0byBjaGFuZ2UgaXRzIG5hbWVcclxuICAgIGlmIChmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5UeXBlICYmICEoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIENvbW1lbnRSYW5nZSkgJiYgaXNUeXBlQ29udGV4dChzb3VyY2VFbGVtZW50KSkge1xyXG4gICAgICAgIGxldCBmcW4gPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKHNvdXJjZUVsZW1lbnQpO1xyXG4gICAgICAgIC8vIHVzaW5nIHJlZ2V4LCByZXBsYWNlIFtibGFoXSB3aXRoIFtibGFoVHlwZV1cclxuICAgICAgICBmcW4gPSBmcW4ucmVwbGFjZSgvXFxbKFteXFxdXSspXFxdL2csIFwiWyQxVHlwZV1cIik7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2V0dGluZyBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgXCIgKyBmYW1peEVsZW1lbnQuZ2V0SlNPTigpICsgXCIgdG8gXCIgKyBmcW4pO1xyXG4gICAgICAgIGZhbWl4RWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUgPSBmcW47XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gY2F0Y2ggYWxsIChleGNlcHQgY29tbWVudHMpXHJcbiAgICBpZiAoIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgQ29tbWVudFJhbmdlKSkge1xyXG4gICAgICAgIGNvbnN0IGZxbiA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oc291cmNlRWxlbWVudCk7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2V0dGluZyBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgXCIgKyBmYW1peEVsZW1lbnQuZ2V0SlNPTigpICsgXCIgdG8gXCIgKyBmcW4pO1xyXG4gICAgICAgIChmYW1peEVsZW1lbnQgYXMgRmFtaXguTmFtZWRFbnRpdHkpLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZxbjtcclxuICAgIH0gXHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBpc1R5cGVDb250ZXh0KHNvdXJjZUVsZW1lbnQ6IEltcG9ydERlY2xhcmF0aW9uIHwgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24gfCBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBWYXJpYWJsZURlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IFByb3BlcnR5U2lnbmF0dXJlIHwgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgSWRlbnRpZmllciB8IERlY29yYXRvciB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgSW1wb3J0U3BlY2lmaWVyIHwgRW51bURlY2xhcmF0aW9uIHwgRW51bU1lbWJlciB8IFR5cGVBbGlhc0RlY2xhcmF0aW9uIHwgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIHwgVFNNb3JwaFBhcmFtZXRyaWNUeXBlKSB7XHJcbiAgICByZXR1cm4gc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb25cclxuICAgICAgICB8fCBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gIFxyXG4gICAgICAgIHx8IHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbkRlY2xhcmF0aW9uIFxyXG4gICAgICAgIHx8IHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbkV4cHJlc3Npb24gXHJcbiAgICAgICAgfHwgc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEFycm93RnVuY3Rpb25cclxuICAgICAgICB8fFxyXG4gICAgICAgIHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8fFxyXG4gICAgICAgIHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uIHx8XHJcbiAgICAgICAgc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIFByb3BlcnR5RGVjbGFyYXRpb24gfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgUHJvcGVydHlTaWduYXR1cmUgfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHx8XHJcbiAgICAgICAgc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpZXIgfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgRGVjb3JhdG9yIHx8XHJcbiAgICAgICAgc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fFxyXG4gICAgICAgIHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBJbXBvcnRTcGVjaWZpZXIgfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgRW51bURlY2xhcmF0aW9uIHx8XHJcbiAgICAgICAgc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEVudW1NZW1iZXIgfHxcclxuICAgICAgICBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgVHlwZUFsaWFzRGVjbGFyYXRpb25cclxuICAgICAgICB8fCBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgSW1wb3J0RGVjbGFyYXRpb25cclxuICAgICAgICB8fCBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzO1xyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gZ2V0SW50ZXJmYWNlRGVjbGFyYXRpb25Gcm9tRXhwcmVzc2lvbihleHByZXNzaW9uOiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpOiBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAvLyBTdGVwIDE6IEdldCB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvblxyXG4gICAgY29uc3QgdHlwZSA9IGV4cHJlc3Npb24uZ2V0VHlwZSgpO1xyXG5cclxuICAgIC8vIFN0ZXAgMjogR2V0IHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlXHJcbiAgICBsZXQgc3ltYm9sID0gdHlwZS5nZXRTeW1ib2woKTtcclxuXHJcbiAgICBpZiAoIXN5bWJvbCkge1xyXG4gICAgICAgIC8vIElmIHN5bWJvbCBpcyBub3QgZm91bmQsIHRyeSB0byBnZXQgdGhlIHN5bWJvbCBmcm9tIHRoZSBpZGVudGlmaWVyXHJcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGV4cHJlc3Npb24uZ2V0Rmlyc3REZXNjZW5kYW50QnlLaW5kKFN5bnRheEtpbmQuSWRlbnRpZmllcik7XHJcbiAgICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWRlbnRpZmllciBub3QgZm91bmQgZm9yICR7ZXhwcmVzc2lvbi5nZXRUZXh0KCl9LmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzeW1ib2wgPSBpZGVudGlmaWVyLmdldFN5bWJvbCgpO1xyXG4gICAgICAgIGlmICghc3ltYm9sKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3ltYm9sIG5vdCBmb3VuZCBmb3IgJHtpZGVudGlmaWVyLmdldFRleHQoKX0uYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0ZXAgMzogUmVzb2x2ZSB0aGUgc3ltYm9sIHRvIGZpbmQgdGhlIGFjdHVhbCBkZWNsYXJhdGlvblxyXG4gICAgY29uc3QgaW50ZXJmYWNlRGVjbGFyYXRpb24gPSByZXNvbHZlU3ltYm9sVG9JbnRlcmZhY2VEZWNsYXJhdGlvbihzeW1ib2wpO1xyXG5cclxuICAgIGlmICghaW50ZXJmYWNlRGVjbGFyYXRpb24pIHtcclxuICAgICAgICBsb2dnZXIuZXJyb3IoYEludGVyZmFjZSBkZWNsYXJhdGlvbiBub3QgZm91bmQgZm9yICR7ZXhwcmVzc2lvbi5nZXRUZXh0KCl9LmApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbnRlcmZhY2VEZWNsYXJhdGlvbjtcclxufVxyXG5cclxuaW1wb3J0IHsgU3ltYm9sIGFzIFRTTW9ycGhTeW1ib2wgfSBmcm9tIFwidHMtbW9ycGhcIjtcclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVTeW1ib2xUb0ludGVyZmFjZURlY2xhcmF0aW9uKHN5bWJvbDogVFNNb3JwaFN5bWJvbCk6IEludGVyZmFjZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIC8vIEdldCB0aGUgZGVjbGFyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sXHJcbiAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBzeW1ib2wuZ2V0RGVjbGFyYXRpb25zKCk7XHJcblxyXG4gICAgLy8gRmlsdGVyIGZvciBJbnRlcmZhY2VEZWNsYXJhdGlvblxyXG4gICAgY29uc3QgaW50ZXJmYWNlRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbnMuZmluZChkZWNsYXJhdGlvbiA9PiBkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSBhcyBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBpZiAoaW50ZXJmYWNlRGVjbGFyYXRpb24pIHtcclxuICAgICAgICByZXR1cm4gaW50ZXJmYWNlRGVjbGFyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIGltcG9ydHM6IElmIHRoZSBzeW1ib2wgaXMgaW1wb3J0ZWQsIHJlc29sdmUgdGhlIGltcG9ydCB0byBmaW5kIHRoZSBhY3R1YWwgZGVjbGFyYXRpb25cclxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZGVjbGFyYXRpb25zKSB7XHJcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5JbXBvcnRTcGVjaWZpZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgaW1wb3J0U3BlY2lmaWVyID0gZGVjbGFyYXRpb24gYXMgSW1wb3J0U3BlY2lmaWVyO1xyXG4gICAgICAgICAgICBjb25zdCBpbXBvcnREZWNsYXJhdGlvbiA9IGltcG9ydFNwZWNpZmllci5nZXRJbXBvcnREZWNsYXJhdGlvbigpO1xyXG4gICAgICAgICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBpbXBvcnREZWNsYXJhdGlvbi5nZXRNb2R1bGVTcGVjaWZpZXJTb3VyY2VGaWxlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobW9kdWxlU3BlY2lmaWVyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleHBvcnRlZFN5bWJvbHMgPSBtb2R1bGVTcGVjaWZpZXIuZ2V0RXhwb3J0U3ltYm9scygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWRTeW1ib2wgPSBleHBvcnRlZFN5bWJvbHMuZmluZChzeW1ib2wgPT4gc3ltYm9sLmdldE5hbWUoKSA9PT0gaW1wb3J0U3BlY2lmaWVyLmdldE5hbWUoKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhwb3J0ZWRTeW1ib2wpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVN5bWJvbFRvSW50ZXJmYWNlRGVjbGFyYXRpb24oZXhwb3J0ZWRTeW1ib2wpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8vIGZ1bmN0aW9uIG9sZEdldEludGVyZmFjZURlY2xhcmF0aW9uRnJvbUV4cHJlc3Npb24oZXhwcmVzc2lvbjogRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKTogSW50ZXJmYWNlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xyXG4vLyAgICAgLy8gVHdvIGNhc2VzOlxyXG4vLyAgICAgLy8gY2xhc3MgQSBpbXBsZW1lbnRzIEltcG9ydGVkSW50ZXJmYWNlLCBEZWNsYXJlZEludGVyZmFjZSB7fVxyXG4vLyAgICAgY29uc3QgdHlwZSA9IGV4cHJlc3Npb24uZ2V0VHlwZSgpO1xyXG5cclxuLy8gICAgIC8vIEltcG9ydGVkSW50ZXJmYWNlOiB0eXBlIHdpbGwgYSBzeW1ib2wgXHJcbi8vICAgICBsZXQgc3ltYm9sID0gdHlwZS5nZXRBbGlhc1N5bWJvbCgpOyAgLy8gd2lsbCBiZSBkZWZpbmVkIGZvciBpbXBvcnRlZCBpbnRlcmZhY2VzXHJcblxyXG4vLyAgICAgaWYgKCFzeW1ib2wpIHtcclxuLy8gICAgICAgICAvLyBEZWNsYXJlZEludGVyZmFjZTogdHlwZSB3aWxsIGJlIGFuIEludGVyZmFjZURlY2xhcmF0aW9uIG9uIElkZW50aWZpZXIgbm9kZSB0aGF0IGlzIHRoZSBjaGlsZCBvZiB0aGUgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXHJcbi8vICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGV4cHJlc3Npb24uZ2V0Rmlyc3REZXNjZW5kYW50QnlLaW5kKFN5bnRheEtpbmQuSWRlbnRpZmllcik7XHJcbi8vICAgICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XHJcbi8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWRlbnRpZmllciBub3QgZm91bmQgZm9yICR7ZXhwcmVzc2lvbi5nZXRUZXh0KCl9LmApO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICBzeW1ib2wgPSBpZGVudGlmaWVyLmdldFN5bWJvbCgpO1xyXG4vLyAgICAgICAgIGlmICghc3ltYm9sKSB7XHJcbi8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3ltYm9sIG5vdCBmb3VuZCBmb3IgJHtpZGVudGlmaWVyLmdldFRleHQoKX0uYCk7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIC8vIFN0ZXAgMzogR2V0IHRoZSBkZWNsYXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2xcclxuLy8gICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IHN5bWJvbC5nZXREZWNsYXJhdGlvbnMoKTtcclxuXHJcbi8vICAgICAvLyBTdGVwIDQ6IEZpbHRlciBmb3IgSW50ZXJmYWNlRGVjbGFyYXRpb25cclxuLy8gICAgIGNvbnN0IGludGVyZmFjZURlY2xhcmF0aW9uID0gZGVjbGFyYXRpb25zLmZpbmQoZGVjbGFyYXRpb24gPT4gZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgYXMgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQ7XHJcblxyXG4vLyAgICAgaWYgKCFpbnRlcmZhY2VEZWNsYXJhdGlvbikge1xyXG4vLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJmYWNlIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCBmb3IgJHtleHByZXNzaW9uLmdldFRleHQoKX0uYCk7XHJcbi8vICAgICB9XHJcblxyXG4vLyAgICAgcmV0dXJuIGludGVyZmFjZURlY2xhcmF0aW9uO1xyXG4vLyB9XHJcbiJdfQ==
|