@aurigma/ng-storefront-api-client 2.37.10 → 2.38.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -3685,4 +3685,4 @@ function blobToText(blob) {
|
|
|
3685
3685
|
}
|
|
3686
3686
|
});
|
|
3687
3687
|
}
|
|
3688
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVmcm9udC1hcGktY2xpZW50LmpzIiwic291cmNlUm9vdCI6Ii9ob21lL2F1cmlnbWEvYWdlbnRzL0NDSDAzL193b3JrLzEvcy9CYWNrZW5kL3NyYy9CYWNrT2ZmaWNlLldlYi5QdWJsaWNBcGkuVHlwZVNjcmlwdEFwaUNsaWVudC9Bbmd1bGFyL2FwaS1jbGllbnQvc3RvcmVmcm9udC1jbGllbnQvcHJvamVjdHMvY2xpZW50L3NyYy8iLCJzb3VyY2VzIjpbImxpYi9zdG9yZWZyb250LWFwaS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsd0JBQXdCO0FBQ3hCLG1CQUFtQjtBQUNuQiw0SEFBNEg7QUFDNUgsb0JBQW9CO0FBQ3BCLHdCQUF3QjtBQUN4Qix1Q0FBdUM7QUFFdkMsT0FBTyxFQUFFLFFBQVEsSUFBSSxtQkFBbUIsRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxlQUFlLEVBQUUsVUFBVSxJQUFJLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRS9GLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBUyxjQUFjLENBQUMsQ0FBQztBQUV2RSxNQUFNLE9BQU8sc0JBQXNCO0lBQW5DO1FBRUksV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNaLHVCQUFrQixHQUFXLElBQUksQ0FBQztJQUc5QyxDQUFDO0lBRlMscUJBQXFCOzhEQUFzQixPQUFPLElBQUksQ0FBQyxr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YWJsZSAqL1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyA8YXV0by1nZW5lcmF0ZWQ+XG4vLyAgICAgR2VuZXJhdGVkIHVzaW5nIHRoZSBOU3dhZyB0b29sY2hhaW4gdjEzLjE1LjUuMCAoTkpzb25TY2hlbWEgdjEwLjYuNi4wIChOZXd0b25zb2Z0Lkpzb24gdjExLjAuMC4wKSkgKGh0dHA6Ly9OU3dhZy5vcmcpXG4vLyA8L2F1dG8tZ2VuZXJhdGVkPlxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZVNoYXJwZXIgZGlzYWJsZSBJbmNvbnNpc3RlbnROYW1pbmdcblxuaW1wb3J0IHsgbWVyZ2VNYXAgYXMgX29ic2VydmFibGVNZXJnZU1hcCwgY2F0Y2hFcnJvciBhcyBfb2JzZXJ2YWJsZUNhdGNoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSBhcyBfb2JzZXJ2YWJsZUZyb20sIHRocm93RXJyb3IgYXMgX29ic2VydmFibGVUaHJvdywgb2YgYXMgX29ic2VydmFibGVPZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCwgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UsIEh0dHBSZXNwb25zZUJhc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmV4cG9ydCBjb25zdCBBUElfQkFTRV9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignQVBJX0JBU0VfVVJMJyk7XG5cbmV4cG9ydCBjbGFzcyBBcGlDbGllbnRDb25maWd1cmF0aW9uIHtcbiAgICBhcGlVcmw6IHN0cmluZztcbiAgICBhcGlLZXk6IHN0cmluZyA9ICcnO1xuICAgIHByaXZhdGUgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmcgPSBudWxsO1xuICAgIGFzeW5jIGdldEF1dGhvcml6YXRpb25Ub2tlbigpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gdGhpcy5hdXRob3JpemF0aW9uVG9rZW47IH07XG4gICAgc2V0QXV0aG9yaXphdGlvblRva2VuKHRva2VuOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5hdXRob3JpemF0aW9uVG9rZW4gPSB0b2tlbjsgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwaUNsaWVudEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgeyB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5nZXRBdXRob3JpemF0aW9uVG9rZW4oKTtcbiAgICAgICAgaWYgKHRva2VuICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IChvcHRpb25zLmhlYWRlcnMgYXMgSHR0cEhlYWRlcnMpLmFwcGVuZChcImF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSAob3B0aW9ucy5oZWFkZXJzIGFzIEh0dHBIZWFkZXJzKS5hcHBlbmQoXCJYLUFQSS1LZXlcIiwgdGhpcy5jb25maWd1cmF0aW9uLmFwaUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9vcHRpb25zID0geyAuLi5vcHRpb25zLCB0cmFuc2Zvcm1SZXNwb25zZTogKHJlcykgPT4gcmVzLCByZXNwb25zZVR5cGU6ICdqc29uJyB9O1xuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0QmFzZVVybChkZWZ1bHRVcmw6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmFwaVVybC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLmFwaVVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5hcGlVcmw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRyYW5zZm9ybVJlc3VsdCh1cmw6IHN0cmluZywgcmVzOiBIdHRwUmVzcG9uc2VCYXNlLCBjYjogKHJlczogSHR0cFJlc3BvbnNlQmFzZSkgPT4gT2JzZXJ2YWJsZTxhbnk+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgIHJldHVybiBjYihyZXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQnVpbGRJbmZvQXBpQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzc2VtYmx5IGJ1aWxkIGluZm8uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgaGVhZEluZm8oKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzc2VtYmx5IGJ1aWxkIGluZm8uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SW5mbygpOiBPYnNlcnZhYmxlPEJ1aWxkSW5mb01vZGVsPjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBCdWlsZEluZm9BcGlDbGllbnQgZXh0ZW5kcyBBcGlDbGllbnRCYXNlIGltcGxlbWVudHMgSUJ1aWxkSW5mb0FwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3NlbWJseSBidWlsZCBpbmZvLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGhlYWRJbmZvKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL2luZm9cIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJoZWFkXCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0hlYWRJbmZvKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzSGVhZEluZm8oPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzSGVhZEluZm8ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzc2VtYmx5IGJ1aWxkIGluZm8uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SW5mbygpOiBPYnNlcnZhYmxlPEJ1aWxkSW5mb01vZGVsPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvaW5mb1wiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEluZm8oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRJbmZvKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEJ1aWxkSW5mb01vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEJ1aWxkSW5mb01vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0SW5mbyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPEJ1aWxkSW5mb01vZGVsPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEJ1aWxkSW5mb01vZGVsPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvZHVjdFJlZmVyZW5jZXNBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHN0b3JlZnJvbnQgcHJvZHVjdCByZWZlcmVuY2VzIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFJlZmVyZW5jZSAob3B0aW9uYWwpIFByb2R1Y3QgcmVmZXJlbmNlIGZpbHRlci4gUHJvZHVjdCByZWZlcmVuY2UgaXMgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByb2R1Y3RTcGVjaWZpY2F0aW9uSWQgKG9wdGlvbmFsKSBDdXNvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHNraXAgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2Ugc3RhcnQgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHNvcnRlZCByZXN1bHQgbGlzdC5cbiAgICAgKiBAcGFyYW0gdGFrZSAob3B0aW9uYWwpIERlZmluZXMgcGFnZSBsZW5ndGggKGhvdyBtYW55IGNvbnNlcXVlbnQgaXRlbXMgb2Ygc29ydGVkIHJlc3VsdCBsaXN0IHNob3VsZCBiZSB0YWtlbikuXG4gICAgICogQHBhcmFtIHNvcnRpbmcgKG9wdGlvbmFsKSBEZWZpbmVzIHNvcnRpbmcgb3JkZXIgb2YgcmVzdWx0IGxpc3QgZS5nLjogXCJUaXRsZSBBU0MsIExhc3RNb2RpZmllZCBERVNDXCIuXG4gICAgICogQHBhcmFtIHNlYXJjaCAob3B0aW9uYWwpIFNlYXJjaCBzdHJpbmcgZm9yIHBhcnRpYWwgbWF0Y2guXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0QWxsKHN0b3JlZnJvbnRJZDogbnVtYmVyLCBwcm9kdWN0UmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJvZHVjdFNwZWNpZmljYXRpb25JZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHNraXA/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0YWtlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc29ydGluZz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlByb2R1Y3RSZWZlcmVuY2VEdG8+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENyZWF0ZSBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGUoc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYm9keT86IENyZWF0ZVByb2R1Y3RSZWZlcmVuY2VEdG8gfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9kdWN0UmVmZXJlbmNlRHRvPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0KHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCwgc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvZHVjdFJlZmVyZW5jZUR0bz47XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyB0aGUgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZGVsZXRlKHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCwgc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvZHVjdFJlZmVyZW5jZUR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBieSB0aGUgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0UHJvZHVjdFNwZWNpZmljYXRpb24ocmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsLCBzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3QgcGVyc29uYWxpemF0aW9uIHdvcmtmbG93IGNvbmZpZ3VyYXRpb24gYnkgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0UHJvZHVjdENvbmZpZyhyZWZlcmVuY2U6IHN0cmluZyB8IG51bGwsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3QgY29zdCBkZXRhaWxzIGZyb20gZWNvbW1lcmNlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3QgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc2t1IFByb2R1Y3QgU0tVLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250VXNlcklkIChvcHRpb25hbCkgU3RvcmVmcm9udCB1c2VyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGN1cnJlbmN5Q29kZSAob3B0aW9uYWwpIFByb2R1Y3QgY29zdCBjdXJyZW5jeSBjb2RlLlxuICAgICAqIEBwYXJhbSBxdWFudGl0eSAob3B0aW9uYWwpIFByb2R1Y3QgcXVhbnRpdHkuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0UHJvZHVjdENvc3REZXRhaWxzKHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCwgc2t1OiBzdHJpbmcsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCBzdG9yZWZyb250VXNlcklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgY3VycmVuY3lDb2RlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcXVhbnRpdHk/OiBudW1iZXIgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvZHVjdENvc3REZXRhaWxzRHRvPjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0UmVmZXJlbmNlc0FwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJUHJvZHVjdFJlZmVyZW5jZXNBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHN0b3JlZnJvbnQgcHJvZHVjdCByZWZlcmVuY2VzIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFJlZmVyZW5jZSAob3B0aW9uYWwpIFByb2R1Y3QgcmVmZXJlbmNlIGZpbHRlci4gUHJvZHVjdCByZWZlcmVuY2UgaXMgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByb2R1Y3RTcGVjaWZpY2F0aW9uSWQgKG9wdGlvbmFsKSBDdXNvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHNraXAgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2Ugc3RhcnQgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHNvcnRlZCByZXN1bHQgbGlzdC5cbiAgICAgKiBAcGFyYW0gdGFrZSAob3B0aW9uYWwpIERlZmluZXMgcGFnZSBsZW5ndGggKGhvdyBtYW55IGNvbnNlcXVlbnQgaXRlbXMgb2Ygc29ydGVkIHJlc3VsdCBsaXN0IHNob3VsZCBiZSB0YWtlbikuXG4gICAgICogQHBhcmFtIHNvcnRpbmcgKG9wdGlvbmFsKSBEZWZpbmVzIHNvcnRpbmcgb3JkZXIgb2YgcmVzdWx0IGxpc3QgZS5nLjogXCJUaXRsZSBBU0MsIExhc3RNb2RpZmllZCBERVNDXCIuXG4gICAgICogQHBhcmFtIHNlYXJjaCAob3B0aW9uYWwpIFNlYXJjaCBzdHJpbmcgZm9yIHBhcnRpYWwgbWF0Y2guXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0QWxsKHN0b3JlZnJvbnRJZDogbnVtYmVyLCBwcm9kdWN0UmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJvZHVjdFNwZWNpZmljYXRpb25JZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHNraXA/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0YWtlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc29ydGluZz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlByb2R1Y3RSZWZlcmVuY2VEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9kdWN0LXJlZmVyZW5jZXM/XCI7XG4gICAgICAgIGlmIChzdG9yZWZyb250SWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdG9yZWZyb250SWQnIG11c3QgYmUgZGVmaW5lZCBhbmQgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB1cmxfICs9IFwic3RvcmVmcm9udElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250SWQpICsgXCImXCI7XG4gICAgICAgIGlmIChwcm9kdWN0UmVmZXJlbmNlICE9PSB1bmRlZmluZWQgJiYgcHJvZHVjdFJlZmVyZW5jZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcm9kdWN0UmVmZXJlbmNlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcm9kdWN0UmVmZXJlbmNlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJvZHVjdFNwZWNpZmljYXRpb25JZCAhPT0gdW5kZWZpbmVkICYmIHByb2R1Y3RTcGVjaWZpY2F0aW9uSWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJvZHVjdFNwZWNpZmljYXRpb25JZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJvZHVjdFNwZWNpZmljYXRpb25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNraXAgIT09IHVuZGVmaW5lZCAmJiBza2lwICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInNraXA9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNraXApICsgXCImXCI7XG4gICAgICAgIGlmICh0YWtlICE9PSB1bmRlZmluZWQgJiYgdGFrZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0YWtlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0YWtlKSArIFwiJlwiO1xuICAgICAgICBpZiAoc29ydGluZyAhPT0gdW5kZWZpbmVkICYmIHNvcnRpbmcgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic29ydGluZz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc29ydGluZykgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNlYXJjaCAhPT0gdW5kZWZpbmVkICYmIHNlYXJjaCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzZWFyY2g9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNlYXJjaCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvZHVjdFJlZmVyZW5jZUR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvZHVjdFJlZmVyZW5jZUR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEFsbChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UGFnZWRPZlByb2R1Y3RSZWZlcmVuY2VEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFBhZ2VkT2ZQcm9kdWN0UmVmZXJlbmNlRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlByb2R1Y3RSZWZlcmVuY2VEdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzdG9yZWZyb250IHByb2R1Y3QgcmVmZXJlbmNlLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgQ3JlYXRlIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZShzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogQ3JlYXRlUHJvZHVjdFJlZmVyZW5jZUR0byB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9kdWN0LXJlZmVyZW5jZXM/XCI7XG4gICAgICAgIGlmIChzdG9yZWZyb250SWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdG9yZWZyb250SWQnIG11c3QgYmUgZGVmaW5lZCBhbmQgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB1cmxfICs9IFwic3RvcmVmcm9udElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250SWQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvZHVjdFJlZmVyZW5jZUR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NyZWF0ZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UHJvZHVjdFJlZmVyZW5jZUR0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAxOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAxID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvZHVjdFJlZmVyZW5jZUR0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDEpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxQcm9kdWN0UmVmZXJlbmNlRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzdG9yZWZyb250IHByb2R1Y3QgcmVmZXJlbmNlLlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2UgUHJvZHVjdCByZWZlcmVuY2UgLSBleHRlcm5hbCByZWZlcmVuY2UgdG8gQ3VzdG9tZXIncyBDYW52YXMgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXQocmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsLCBzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9kdWN0UmVmZXJlbmNlRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvZHVjdC1yZWZlcmVuY2VzL3tyZWZlcmVuY2V9P1wiO1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSB1bmRlZmluZWQgfHwgcmVmZXJlbmNlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVmZXJlbmNlJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3JlZmVyZW5jZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZWZlcmVuY2UpKTtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9kdWN0UmVmZXJlbmNlRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2R1Y3RSZWZlcmVuY2VEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvZHVjdFJlZmVyZW5jZUR0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHRoZSBzdG9yZWZyb250IHByb2R1Y3QgcmVmZXJlbmNlLlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2UgUHJvZHVjdCByZWZlcmVuY2UgLSBleHRlcm5hbCByZWZlcmVuY2UgdG8gQ3VzdG9tZXIncyBDYW52YXMgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBkZWxldGUocmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsLCBzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9kdWN0UmVmZXJlbmNlRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvZHVjdC1yZWZlcmVuY2VzL3tyZWZlcmVuY2V9P1wiO1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSB1bmRlZmluZWQgfHwgcmVmZXJlbmNlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVmZXJlbmNlJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3JlZmVyZW5jZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZWZlcmVuY2UpKTtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZGVsZXRlXCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0RlbGV0ZSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0RlbGV0ZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9kdWN0UmVmZXJlbmNlRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NEZWxldGUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2R1Y3RSZWZlcmVuY2VEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvZHVjdFJlZmVyZW5jZUR0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvZHVjdCBzcGVjaWZpY2F0aW9uIGJ5IHRoZSBzdG9yZWZyb250IHByb2R1Y3QgcmVmZXJlbmNlLlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2UgUHJvZHVjdCByZWZlcmVuY2UgLSBleHRlcm5hbCByZWZlcmVuY2UgdG8gQ3VzdG9tZXIncyBDYW52YXMgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRQcm9kdWN0U3BlY2lmaWNhdGlvbihyZWZlcmVuY2U6IHN0cmluZyB8IG51bGwsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvZHVjdC1yZWZlcmVuY2VzL3tyZWZlcmVuY2V9L3Byb2R1Y3Qtc3BlY2lmaWNhdGlvbj9cIjtcbiAgICAgICAgaWYgKHJlZmVyZW5jZSA9PT0gdW5kZWZpbmVkIHx8IHJlZmVyZW5jZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JlZmVyZW5jZScgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntyZWZlcmVuY2V9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmVmZXJlbmNlKSk7XG4gICAgICAgIGlmIChzdG9yZWZyb250SWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdG9yZWZyb250SWQnIG11c3QgYmUgZGVmaW5lZCBhbmQgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB1cmxfICs9IFwic3RvcmVmcm9udElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250SWQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9kdWN0U3BlY2lmaWNhdGlvbig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFByb2R1Y3RTcGVjaWZpY2F0aW9uKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0UHJvZHVjdFNwZWNpZmljYXRpb24ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvZHVjdCBwZXJzb25hbGl6YXRpb24gd29ya2Zsb3cgY29uZmlndXJhdGlvbiBieSBzdG9yZWZyb250IHByb2R1Y3QgcmVmZXJlbmNlLlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2UgUHJvZHVjdCByZWZlcmVuY2UgLSBleHRlcm5hbCByZWZlcmVuY2UgdG8gQ3VzdG9tZXIncyBDYW52YXMgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRQcm9kdWN0Q29uZmlnKHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCwgc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvZHVjdC1yZWZlcmVuY2VzL3tyZWZlcmVuY2V9L3Byb2R1Y3QtY29uZmlnP1wiO1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSB1bmRlZmluZWQgfHwgcmVmZXJlbmNlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVmZXJlbmNlJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3JlZmVyZW5jZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZWZlcmVuY2UpKTtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFByb2R1Y3RDb25maWcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9kdWN0Q29uZmlnKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRQcm9kdWN0Q29uZmlnKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxzdHJpbmc+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3QgY29zdCBkZXRhaWxzIGZyb20gZWNvbW1lcmNlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3QgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc2t1IFByb2R1Y3QgU0tVLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250VXNlcklkIChvcHRpb25hbCkgU3RvcmVmcm9udCB1c2VyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGN1cnJlbmN5Q29kZSAob3B0aW9uYWwpIFByb2R1Y3QgY29zdCBjdXJyZW5jeSBjb2RlLlxuICAgICAqIEBwYXJhbSBxdWFudGl0eSAob3B0aW9uYWwpIFByb2R1Y3QgcXVhbnRpdHkuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0UHJvZHVjdENvc3REZXRhaWxzKHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCwgc2t1OiBzdHJpbmcsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCBzdG9yZWZyb250VXNlcklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgY3VycmVuY3lDb2RlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcXVhbnRpdHk/OiBudW1iZXIgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvZHVjdENvc3REZXRhaWxzRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvZHVjdC1yZWZlcmVuY2VzL3tyZWZlcmVuY2V9L3Byb2R1Y3QtY29zdC1kZXRhaWxzP1wiO1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSB1bmRlZmluZWQgfHwgcmVmZXJlbmNlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVmZXJlbmNlJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3JlZmVyZW5jZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZWZlcmVuY2UpKTtcbiAgICAgICAgaWYgKHNrdSA9PT0gdW5kZWZpbmVkIHx8IHNrdSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3NrdScgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJza3U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNrdSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRVc2VySWQgIT09IHVuZGVmaW5lZCAmJiBzdG9yZWZyb250VXNlcklkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRVc2VySWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRVc2VySWQpICsgXCImXCI7XG4gICAgICAgIGlmIChjdXJyZW5jeUNvZGUgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW5jeUNvZGUgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiY3VycmVuY3lDb2RlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjdXJyZW5jeUNvZGUpICsgXCImXCI7XG4gICAgICAgIGlmIChxdWFudGl0eSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3F1YW50aXR5JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHF1YW50aXR5ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicXVhbnRpdHk9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHF1YW50aXR5KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0UHJvZHVjdENvc3REZXRhaWxzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0UHJvZHVjdENvc3REZXRhaWxzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RDb3N0RGV0YWlsc0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9kdWN0Q29zdERldGFpbHNEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRQcm9kdWN0Q29zdERldGFpbHMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2R1Y3RDb3N0RGV0YWlsc0R0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvZHVjdENvc3REZXRhaWxzRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFByb2R1Y3RDb3N0RGV0YWlsc0R0bz4oPGFueT5udWxsKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb2R1Y3RTcGVjaWZpY2F0aW9uc0FwaUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgcHJvZHVjdCBzcGVjaWZpY2F0aW9ucywgcmVsZXZhbnQgdG8gdGhlIHNwZWNpZmllZCBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBza2lwIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIHN0YXJ0IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3QuXG4gICAgICogQHBhcmFtIHRha2UgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2UgbGVuZ3RoIChob3cgbWFueSBjb25zZXF1ZW50IGl0ZW1zIG9mIHNvcnRlZCByZXN1bHQgbGlzdCBzaG91bGQgYmUgdGFrZW4pLlxuICAgICAqIEBwYXJhbSBzb3J0aW5nIChvcHRpb25hbCkgRGVmaW5lcyBzb3J0aW5nIG9yZGVyIG9mIHJlc3VsdCBsaXN0IGUuZy46IFwiVGl0bGUgQVNDLCBMYXN0TW9kaWZpZWQgREVTQ1wiLlxuICAgICAqIEBwYXJhbSBzZWFyY2ggKG9wdGlvbmFsKSBTZWFyY2ggc3RyaW5nIGZvciBwYXJ0aWFsIG1hdGNoLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEFsbChza2lwPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGFrZT86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHNvcnRpbmc/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzZWFyY2g/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBQcm9kdWN0IHNwZWNpZmljYXRpb24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXQoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3QgcGVyc29ubGl6YXRpb24gd29ya2Zsb3cgY29uZmlndXJhdGlvbiBieSBwcm9kdWN0IHNwZWNpZmljYXRpb24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgUHJvZHVjdCBzcGVjaWZpY2F0aW9uIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q29uZmlndXJhdGlvbihpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdFNwZWNpZmljYXRpb25zQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElQcm9kdWN0U3BlY2lmaWNhdGlvbnNBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbnMsIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gc2tpcCAob3B0aW9uYWwpIERlZmluZXMgcGFnZSBzdGFydCBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc29ydGVkIHJlc3VsdCBsaXN0LlxuICAgICAqIEBwYXJhbSB0YWtlIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIGxlbmd0aCAoaG93IG1hbnkgY29uc2VxdWVudCBpdGVtcyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3Qgc2hvdWxkIGJlIHRha2VuKS5cbiAgICAgKiBAcGFyYW0gc29ydGluZyAob3B0aW9uYWwpIERlZmluZXMgc29ydGluZyBvcmRlciBvZiByZXN1bHQgbGlzdCBlLmcuOiBcIlRpdGxlIEFTQywgTGFzdE1vZGlmaWVkIERFU0NcIi5cbiAgICAgKiBAcGFyYW0gc2VhcmNoIChvcHRpb25hbCkgU2VhcmNoIHN0cmluZyBmb3IgcGFydGlhbCBtYXRjaC5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGwoc2tpcD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHRha2U/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3J0aW5nPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2VhcmNoPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQYWdlZE9mUHJvZHVjdFNwZWNpZmljYXRpb25EdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9kdWN0LXNwZWNpZmljYXRpb25zP1wiO1xuICAgICAgICBpZiAoc2tpcCAhPT0gdW5kZWZpbmVkICYmIHNraXAgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic2tpcD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc2tpcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRha2UgIT09IHVuZGVmaW5lZCAmJiB0YWtlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRha2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRha2UpICsgXCImXCI7XG4gICAgICAgIGlmIChzb3J0aW5nICE9PSB1bmRlZmluZWQgJiYgc29ydGluZyAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzb3J0aW5nPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzb3J0aW5nKSArIFwiJlwiO1xuICAgICAgICBpZiAoc2VhcmNoICE9PSB1bmRlZmluZWQgJiYgc2VhcmNoICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInNlYXJjaD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc2VhcmNoKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0QWxsKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0QWxsKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvZHVjdFNwZWNpZmljYXRpb25EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRBbGwocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UGFnZWRPZlByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9kdWN0IHNwZWNpZmljYXRpb24gYnkgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgUHJvZHVjdCBzcGVjaWZpY2F0aW9uIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0KGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvZHVjdFNwZWNpZmljYXRpb25EdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9kdWN0LXNwZWNpZmljYXRpb25zL3tpZH0/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UHJvZHVjdFNwZWNpZmljYXRpb25EdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9kdWN0IHBlcnNvbmxpemF0aW9uIHdvcmtmbG93IGNvbmZpZ3VyYXRpb24gYnkgcHJvZHVjdCBzcGVjaWZpY2F0aW9uIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGlkIFByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbmZpZ3VyYXRpb24oaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9kdWN0LXNwZWNpZmljYXRpb25zL3tpZH0vY29uZmlnP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDb25maWd1cmF0aW9uKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q29uZmlndXJhdGlvbig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0Q29uZmlndXJhdGlvbihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvamVjdHNBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHByb2plY3RzLCByZWxldmFudCB0byB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIG93bmVySWQgKG9wdGlvbmFsKSBQcm9qZWN0IG93bmVyIChzdG9yZWZyb250IHVzZXIgaWQpIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFJlZmVyZW5jZSAob3B0aW9uYWwpIFByb2R1Y3QgcmVmZXJlbmNlIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gc3RhdHVzIChvcHRpb25hbCkgUHJvamVjdCBzdGF0dXMgZmlsdGVyLlxuICAgICAqIEBwYXJhbSBkYXRlUGVyaW9kIChvcHRpb25hbCkgUHJvamVjdCBkYXRlIHBlcmlvZCBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHNraXAgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2Ugc3RhcnQgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHNvcnRlZCByZXN1bHQgbGlzdC5cbiAgICAgKiBAcGFyYW0gdGFrZSAob3B0aW9uYWwpIERlZmluZXMgcGFnZSBsZW5ndGggKGhvdyBtYW55IGNvbnNlcXVlbnQgaXRlbXMgb2Ygc29ydGVkIHJlc3VsdCBsaXN0IHNob3VsZCBiZSB0YWtlbikuXG4gICAgICogQHBhcmFtIHNvcnRpbmcgKG9wdGlvbmFsKSBEZWZpbmVzIHNvcnRpbmcgb3JkZXIgb2YgcmVzdWx0IGxpc3QgZS5nLjogXCJUaXRsZSBBU0MsIExhc3RNb2RpZmllZCBERVNDXCIuXG4gICAgICogQHBhcmFtIHNlYXJjaCAob3B0aW9uYWwpIFNlYXJjaCBzdHJpbmcgZm9yIHBhcnRpYWwgbWF0Y2guXG4gICAgICogQHBhcmFtIG9yZGVySWQgKG9wdGlvbmFsKSBJZGVudGlmaWVyIG9mIGNvcnJlc3BvbmRpbmcgb3JkZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCAob3B0aW9uYWwpIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGwob3duZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHByb2R1Y3RSZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzdGF0dXM/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBkYXRlUGVyaW9kPzogRGF0ZVBlcmlvZCB8IHVuZGVmaW5lZCwgc2tpcD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHRha2U/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3J0aW5nPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2VhcmNoPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgb3JkZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHN0b3JlZnJvbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlByb2plY3REdG8+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdC5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENyZWF0ZSBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGUoc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYm9keT86IENyZWF0ZVByb2plY3REdG8gfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9qZWN0RHRvPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvamVjdCBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0KGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvamVjdER0bz47XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHByb2plY3QgYnkgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGRlbGV0ZShpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9qZWN0IHByZXZpZXcgZmlsZSBieSBwcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGlkIFByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRQcmV2aWV3KGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvamVjdCBwcmV2aWV3IFVSTCBieSBwcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGlkIFByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRQcmV2aWV3VXJsKGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2plY3QgYnkgJ1JlbmRlciBIaVJlcycgc2NlbmFyaW8uXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBDcmVhdGUgb3BlcmF0aW9uIHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3JlYXRlQnlSZW5kZXJIaVJlc1NjZW5hcmlvKHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGJvZHk/OiBDcmVhdGVQcm9qZWN0QnlSZW5kZXJIaVJlc1NjZW5hcmlvRHRvIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvamVjdER0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHN0YXR1cyB0cmFuc2l0aW9ucyBmb3IgYSBwcm9qZWN0LlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0QXZhaWxhYmxlVHJhbnNpdGlvbnMoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQYWdlZE9mUHJvamVjdFRyYW5zaXRpb25EdG8+O1xuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIHByb2plY3Qgc3RhdHVzLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbiBUcmFuc2l0aW9uIGlkZW50aWZ5aW5nIG5hbWUuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY2hhbmdlU3RhdHVzKGlkOiBudW1iZXIsIHRyYW5zaXRpb246IHN0cmluZyB8IG51bGwsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvamVjdFN0YXR1c0R0bz47XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgcHJvamVjdCBzdGF0dXMgZm9yY2libHkgd2l0aG91dCBhIHByb3BlciB0cmFuc2l0aW9uLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0YXR1cyBQcm9qZWN0IHN0YXR1cyBjb2RlLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvcmNlU3RhdHVzKGlkOiBudW1iZXIsIHN0YXR1czogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3RTdGF0dXNEdG8+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBleGlzdGluZyBwcm9qZWN0IHN0YXR1c2VzLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEFsbFN0YXR1c2VzKHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlByb2plY3RTdGF0dXNEdG8+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBleGlzdGluZyBwcm9qZWN0IHN0YXR1cyB0cmFuc2l0aW9ucy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGxUcmFuc2l0aW9ucyh0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0VHJhbnNpdGlvbkR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiB1cmwgdG8gZG93bmxvYWQgcHJvamVjdCBwcmludCBmaWxlLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGRlc2lnblVzZXJJZCBEZXNpZ24gb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gZGVzaWduSWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBnZXRQcm9qZWN0UGRmVXJsKGlkOiBudW1iZXIsIGRlc2lnblVzZXJJZDogc3RyaW5nLCBkZXNpZ25JZDogc3RyaW5nLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3RQZGZSZXN1bHREdG8+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJjaGl2ZSBmaWxlLCB3aGljaCBjb250YWlucyBhbGwgcHJvamVjdCBwcmludCBmaWxlcy5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBkZXNpZ25Vc2VySWQgRGVzaWduIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGRlc2lnbklkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgdGhlIHJlcXVlc3RlZCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHByb3BlciBmaWxlbmFtZSBzdXBwbGllZCAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldFByb2plY3RQZGZaaXAoaWQ6IG51bWJlciwgZGVzaWduVXNlcklkOiBzdHJpbmcsIGRlc2lnbklkOiBzdHJpbmcsIGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9qZWN0IHByb2Nlc3NpbmcgcmVzdWx0cy5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFByb2plY3RQcm9jZXNzaW5nUmVzdWx0cyhpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3RQcm9jZXNzaW5nUmVzdWx0c0R0bz47XG4gICAgLyoqXG4gICAgICogUmVzdW1lcyBwcm9qZWN0IHByb2Nlc3NpbmcuXG4gICAgICogQHBhcmFtIGlkIFByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXN1bWVQcm9qZWN0UHJvY2Vzc2luZyhpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIFJlc3RhcnRzIGEgcHJvamVjdCBwcm9jZXNzaW5nIHJvdXRpbmUuXG4gICAgICogQHBhcmFtIGlkIFByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXN0YXJ0UHJvamVjdFByb2Nlc3NpbmcoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIG9yZGVyIGRlc2NyaXB0aW9uIGZyb20gdGhlIGVjb21tZXJjZSBzeXN0ZW0gZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFByb2plY3RPcmRlcihpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQXR0YWNocyB0aGUgc3BlY2lmaWVkIGRhdGEgdG8gdGhlIHByb2plY3QncyBvcmRlciBpbiBlY29tbWVyY2Ugc3lzdGVtLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBBIGxpc3Qgb2YgZGF0YSBpdGVtcywgd2hpY2ggc2hvdWxkIGJlIGF0dGFjaGVkIHRvIHByb2plY3QncyBvcmRlci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBhdHRhY2hEYXRhVG9Qcm9qZWN0T3JkZXIoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogT3JkZXJEYXRhSXRlbUR0b1tdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJvamVjdHNBcGlDbGllbnQgZXh0ZW5kcyBBcGlDbGllbnRCYXNlIGltcGxlbWVudHMgSVByb2plY3RzQXBpQ2xpZW50IHtcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQ7XG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIGpzb25QYXJzZVJldml2ZXI6ICgoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IGFueSkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEFwaUNsaWVudENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb246IEFwaUNsaWVudENvbmZpZ3VyYXRpb24sIEBJbmplY3QoSHR0cENsaWVudCkgaHR0cDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChBUElfQkFTRV9VUkwpIGJhc2VVcmw/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmwgIT09IHVuZGVmaW5lZCAmJiBiYXNlVXJsICE9PSBudWxsID8gYmFzZVVybCA6IHRoaXMuZ2V0QmFzZVVybChcIlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBwcm9qZWN0cywgcmVsZXZhbnQgdG8gdGhlIHNwZWNpZmllZCBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBvd25lcklkIChvcHRpb25hbCkgUHJvamVjdCBvd25lciAoc3RvcmVmcm9udCB1c2VyIGlkKSBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHByb2R1Y3RSZWZlcmVuY2UgKG9wdGlvbmFsKSBQcm9kdWN0IHJlZmVyZW5jZSBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHN0YXR1cyAob3B0aW9uYWwpIFByb2plY3Qgc3RhdHVzIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gZGF0ZVBlcmlvZCAob3B0aW9uYWwpIFByb2plY3QgZGF0ZSBwZXJpb2QgZmlsdGVyLlxuICAgICAqIEBwYXJhbSBza2lwIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIHN0YXJ0IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3QuXG4gICAgICogQHBhcmFtIHRha2UgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2UgbGVuZ3RoIChob3cgbWFueSBjb25zZXF1ZW50IGl0ZW1zIG9mIHNvcnRlZCByZXN1bHQgbGlzdCBzaG91bGQgYmUgdGFrZW4pLlxuICAgICAqIEBwYXJhbSBzb3J0aW5nIChvcHRpb25hbCkgRGVmaW5lcyBzb3J0aW5nIG9yZGVyIG9mIHJlc3VsdCBsaXN0IGUuZy46IFwiVGl0bGUgQVNDLCBMYXN0TW9kaWZpZWQgREVTQ1wiLlxuICAgICAqIEBwYXJhbSBzZWFyY2ggKG9wdGlvbmFsKSBTZWFyY2ggc3RyaW5nIGZvciBwYXJ0aWFsIG1hdGNoLlxuICAgICAqIEBwYXJhbSBvcmRlcklkIChvcHRpb25hbCkgSWRlbnRpZmllciBvZiBjb3JyZXNwb25kaW5nIG9yZGVyLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgKG9wdGlvbmFsKSBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0QWxsKG93bmVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBwcm9kdWN0UmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc3RhdHVzPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGF0ZVBlcmlvZD86IERhdGVQZXJpb2QgfCB1bmRlZmluZWQsIHNraXA/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0YWtlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc29ydGluZz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIG9yZGVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzdG9yZWZyb250SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0RHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHM/XCI7XG4gICAgICAgIGlmIChvd25lcklkICE9PSB1bmRlZmluZWQgJiYgb3duZXJJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvd25lcklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBvd25lcklkKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJvZHVjdFJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkICYmIHByb2R1Y3RSZWZlcmVuY2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJvZHVjdFJlZmVyZW5jZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJvZHVjdFJlZmVyZW5jZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1cyAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdGF0dXM9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0YXR1cykgKyBcIiZcIjtcbiAgICAgICAgaWYgKGRhdGVQZXJpb2QgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdkYXRlUGVyaW9kJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGRhdGVQZXJpb2QgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJkYXRlUGVyaW9kPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBkYXRlUGVyaW9kKSArIFwiJlwiO1xuICAgICAgICBpZiAoc2tpcCAhPT0gdW5kZWZpbmVkICYmIHNraXAgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic2tpcD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc2tpcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRha2UgIT09IHVuZGVmaW5lZCAmJiB0YWtlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRha2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRha2UpICsgXCImXCI7XG4gICAgICAgIGlmIChzb3J0aW5nICE9PSB1bmRlZmluZWQgJiYgc29ydGluZyAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzb3J0aW5nPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzb3J0aW5nKSArIFwiJlwiO1xuICAgICAgICBpZiAoc2VhcmNoICE9PSB1bmRlZmluZWQgJiYgc2VhcmNoICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInNlYXJjaD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc2VhcmNoKSArIFwiJlwiO1xuICAgICAgICBpZiAob3JkZXJJZCAhPT0gdW5kZWZpbmVkICYmIG9yZGVySWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwib3JkZXJJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgb3JkZXJJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCAhPT0gdW5kZWZpbmVkICYmIHN0b3JlZnJvbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvamVjdER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvamVjdER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEFsbChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UGFnZWRPZlByb2plY3REdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFBhZ2VkT2ZQcm9qZWN0RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlByb2plY3REdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0LlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgQ3JlYXRlIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZShzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogQ3JlYXRlUHJvamVjdER0byB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3REdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cz9cIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGUoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGUoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvamVjdER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9qZWN0RHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ3JlYXRlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxQcm9qZWN0RHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDE6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDEgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9qZWN0RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvamVjdER0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvamVjdCBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0KGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvamVjdER0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3Byb2plY3RzL3tpZH0/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9qZWN0RHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2plY3REdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2plY3REdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2plY3REdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvamVjdER0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcHJvamVjdCBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZGVsZXRlKGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3Byb2plY3RzL3tpZH0/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImRlbGV0ZVwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NEZWxldGUoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NEZWxldGUoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRGVsZXRlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2plY3QgcHJldmlldyBmaWxlIGJ5IHByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFByZXZpZXcoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L3ByZXZpZXc/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcmV2aWV3KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRQcmV2aWV3KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9qZWN0IHByZXZpZXcgVVJMIGJ5IHByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFByZXZpZXdVcmwoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L3ByZXZpZXctdXJsP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcmV2aWV3VXJsKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0UHJldmlld1VybCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0UHJldmlld1VybChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+X3Jlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5fcmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdCBieSAnUmVuZGVyIEhpUmVzJyBzY2VuYXJpby5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENyZWF0ZSBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGVCeVJlbmRlckhpUmVzU2NlbmFyaW8oc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYm9keT86IENyZWF0ZVByb2plY3RCeVJlbmRlckhpUmVzU2NlbmFyaW9EdG8gfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9qZWN0RHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHMvYnktc2NlbmFyaW8vcmVuZGVyLWhpcmVzP1wiO1xuICAgICAgICBpZiAoc3RvcmVmcm9udElkID09PSB1bmRlZmluZWQgfHwgc3RvcmVmcm9udElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3RvcmVmcm9udElkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3RvcmVmcm9udElkKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZUJ5UmVuZGVySGlSZXNTY2VuYXJpbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZUJ5UmVuZGVySGlSZXNTY2VuYXJpbyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9qZWN0RHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2plY3REdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDcmVhdGVCeVJlbmRlckhpUmVzU2NlbmFyaW8ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2plY3REdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2plY3REdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAxKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA5OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA5ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQ29uZmxpY3RcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxQcm9qZWN0RHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSBzdGF0dXMgdHJhbnNpdGlvbnMgZm9yIGEgcHJvamVjdC5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEF2YWlsYWJsZVRyYW5zaXRpb25zKGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHMve2lkfS90cmFuc2l0aW9ucz9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0QXZhaWxhYmxlVHJhbnNpdGlvbnMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBdmFpbGFibGVUcmFuc2l0aW9ucyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvamVjdFRyYW5zaXRpb25EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0QXZhaWxhYmxlVHJhbnNpdGlvbnMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0VHJhbnNpdGlvbkR0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkJhZCBSZXF1ZXN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDk6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDkgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9qZWN0VHJhbnNpdGlvbkNvbmZsaWN0RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIHByb2plY3Qgc3RhdHVzLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbiBUcmFuc2l0aW9uIGlkZW50aWZ5aW5nIG5hbWUuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY2hhbmdlU3RhdHVzKGlkOiBudW1iZXIsIHRyYW5zaXRpb246IHN0cmluZyB8IG51bGwsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvamVjdFN0YXR1c0R0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3Byb2plY3RzL3tpZH0vdHJhbnNpdGlvbnMve3RyYW5zaXRpb259P1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0cmFuc2l0aW9uID09PSB1bmRlZmluZWQgfHwgdHJhbnNpdGlvbiA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RyYW5zaXRpb24nIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dHJhbnNpdGlvbn1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0cmFuc2l0aW9uKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ2hhbmdlU3RhdHVzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ2hhbmdlU3RhdHVzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2plY3RTdGF0dXNEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvamVjdFN0YXR1c0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NoYW5nZVN0YXR1cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UHJvamVjdFN0YXR1c0R0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvamVjdFN0YXR1c0R0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJCYWQgUmVxdWVzdFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA5OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA5ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvamVjdFRyYW5zaXRpb25Db25mbGljdER0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJDb25mbGljdFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFByb2plY3RTdGF0dXNEdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgcHJvamVjdCBzdGF0dXMgZm9yY2libHkgd2l0aG91dCBhIHByb3BlciB0cmFuc2l0aW9uLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0YXR1cyBQcm9qZWN0IHN0YXR1cyBjb2RlLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvcmNlU3RhdHVzKGlkOiBudW1iZXIsIHN0YXR1czogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3RTdGF0dXNEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L3N0YXR1c2VzL3tzdGF0dXN9P1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IHVuZGVmaW5lZCB8fCBzdGF0dXMgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdGF0dXMnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7c3RhdHVzfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0YXR1cykpO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ZvcmNlU3RhdHVzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRm9yY2VTdGF0dXMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvamVjdFN0YXR1c0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9qZWN0U3RhdHVzRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRm9yY2VTdGF0dXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2plY3RTdGF0dXNEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2plY3RTdGF0dXNEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQmFkIFJlcXVlc3RcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvamVjdFN0YXR1c0R0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZXhpc3RpbmcgcHJvamVjdCBzdGF0dXNlcy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGxTdGF0dXNlcyh0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHMvc3RhdHVzZXM/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBbGxTdGF0dXNlcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbFN0YXR1c2VzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0QWxsU3RhdHVzZXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQYWdlZE9mUHJvamVjdFN0YXR1c0R0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBleGlzdGluZyBwcm9qZWN0IHN0YXR1cyB0cmFuc2l0aW9ucy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGxUcmFuc2l0aW9ucyh0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0VHJhbnNpdGlvbkR0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3Byb2plY3RzL3RyYW5zaXRpb25zP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0QWxsVHJhbnNpdGlvbnMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBbGxUcmFuc2l0aW9ucyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvamVjdFRyYW5zaXRpb25EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0QWxsVHJhbnNpdGlvbnMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0VHJhbnNpdGlvbkR0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gdXJsIHRvIGRvd25sb2FkIHByb2plY3QgcHJpbnQgZmlsZS5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBkZXNpZ25Vc2VySWQgRGVzaWduIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGRlc2lnbklkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0UHJvamVjdFBkZlVybChpZDogbnVtYmVyLCBkZXNpZ25Vc2VySWQ6IHN0cmluZywgZGVzaWduSWQ6IHN0cmluZywgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9qZWN0UGRmUmVzdWx0RHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHMve2lkfS9wcm9qZWN0LXBkZj9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAoZGVzaWduVXNlcklkID09PSB1bmRlZmluZWQgfHwgZGVzaWduVXNlcklkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZGVzaWduVXNlcklkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcImRlc2lnblVzZXJJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZGVzaWduVXNlcklkKSArIFwiJlwiO1xuICAgICAgICBpZiAoZGVzaWduSWQgPT09IHVuZGVmaW5lZCB8fCBkZXNpZ25JZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2Rlc2lnbklkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcImRlc2lnbklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBkZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFByb2plY3RQZGZVcmwoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0UGRmVXJsKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2plY3RQZGZSZXN1bHREdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvamVjdFBkZlJlc3VsdER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFByb2plY3RQZGZVcmwocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2plY3RQZGZSZXN1bHREdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2plY3RQZGZSZXN1bHREdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxQcm9qZWN0UGRmUmVzdWx0RHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJjaGl2ZSBmaWxlLCB3aGljaCBjb250YWlucyBhbGwgcHJvamVjdCBwcmludCBmaWxlcy5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBkZXNpZ25Vc2VySWQgRGVzaWduIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGRlc2lnbklkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgdGhlIHJlcXVlc3RlZCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHByb3BlciBmaWxlbmFtZSBzdXBwbGllZCAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldFByb2plY3RQZGZaaXAoaWQ6IG51bWJlciwgZGVzaWduVXNlcklkOiBzdHJpbmcsIGRlc2lnbklkOiBzdHJpbmcsIGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L3Byb2plY3QtcGRmLXppcD9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAoZGVzaWduVXNlcklkID09PSB1bmRlZmluZWQgfHwgZGVzaWduVXNlcklkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZGVzaWduVXNlcklkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcImRlc2lnblVzZXJJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZGVzaWduVXNlcklkKSArIFwiJlwiO1xuICAgICAgICBpZiAoZGVzaWduSWQgPT09IHVuZGVmaW5lZCB8fCBkZXNpZ25JZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2Rlc2lnbklkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcImRlc2lnbklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBkZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQgIT09IHVuZGVmaW5lZCAmJiBhdHRhY2htZW50ICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImF0dGFjaG1lbnQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGF0dGFjaG1lbnQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFByb2plY3RQZGZaaXAoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0UGRmWmlwKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRQcm9qZWN0UGRmWmlwKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9qZWN0IHByb2Nlc3NpbmcgcmVzdWx0cy5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFByb2plY3RQcm9jZXNzaW5nUmVzdWx0cyhpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3RQcm9jZXNzaW5nUmVzdWx0c0R0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3Byb2plY3RzL3tpZH0vcHJvY2Vzc2luZy1yZXN1bHRzP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0UHJvY2Vzc2luZ1Jlc3VsdHMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0UHJvY2Vzc2luZ1Jlc3VsdHMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvamVjdFByb2Nlc3NpbmdSZXN1bHRzRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2plY3RQcm9jZXNzaW5nUmVzdWx0c0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFByb2plY3RQcm9jZXNzaW5nUmVzdWx0cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UHJvamVjdFByb2Nlc3NpbmdSZXN1bHRzRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9qZWN0UHJvY2Vzc2luZ1Jlc3VsdHNEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvamVjdFByb2Nlc3NpbmdSZXN1bHRzRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3VtZXMgcHJvamVjdCBwcm9jZXNzaW5nLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVzdW1lUHJvamVjdFByb2Nlc3NpbmcoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHMve2lkfS9yZXN1bWUtcHJvY2Vzc2luZz9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXN1bWVQcm9qZWN0UHJvY2Vzc2luZyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1Jlc3VtZVByb2plY3RQcm9jZXNzaW5nKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1Jlc3VtZVByb2plY3RQcm9jZXNzaW5nKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdGFydHMgYSBwcm9qZWN0IHByb2Nlc3Npbmcgcm91dGluZS5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlc3RhcnRQcm9qZWN0UHJvY2Vzc2luZyhpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L3Jlc3RhcnQtcHJvY2Vzc2luZz9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXN0YXJ0UHJvamVjdFByb2Nlc3NpbmcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXN0YXJ0UHJvamVjdFByb2Nlc3NpbmcoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVzdGFydFByb2plY3RQcm9jZXNzaW5nKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvcmRlciBkZXNjcmlwdGlvbiBmcm9tIHRoZSBlY29tbWVyY2Ugc3lzdGVtIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICogQHBhcmFtIGlkIFByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRQcm9qZWN0T3JkZXIoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L29yZGVyP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0T3JkZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0T3JkZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFByb2plY3RPcmRlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaHMgdGhlIHNwZWNpZmllZCBkYXRhIHRvIHRoZSBwcm9qZWN0J3Mgb3JkZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgQSBsaXN0IG9mIGRhdGEgaXRlbXMsIHdoaWNoIHNob3VsZCBiZSBhdHRhY2hlZCB0byBwcm9qZWN0J3Mgb3JkZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgYXR0YWNoRGF0YVRvUHJvamVjdE9yZGVyKGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYm9keT86IE9yZGVyRGF0YUl0ZW1EdG9bXSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L29yZGVyLWRhdGE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvblwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQXR0YWNoRGF0YVRvUHJvamVjdE9yZGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQXR0YWNoRGF0YVRvUHJvamVjdE9yZGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0F0dGFjaERhdGFUb1Byb2plY3RPcmRlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3RvcmVmcm9udHNBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHN0b3JlZnJvbnRzLCByZWxldmFudCB0byB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIHR5cGVzIChvcHRpb25hbCkgU3RvcmVmcm9udCB0eXBlIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gc2tpcCAob3B0aW9uYWwpIERlZmluZXMgcGFnZSBzdGFydCBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc29ydGVkIHJlc3VsdCBsaXN0LlxuICAgICAqIEBwYXJhbSB0YWtlIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIGxlbmd0aCAoaG93IG1hbnkgY29uc2VxdWVudCBpdGVtcyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3Qgc2hvdWxkIGJlIHRha2VuKS5cbiAgICAgKiBAcGFyYW0gc29ydGluZyAob3B0aW9uYWwpIERlZmluZXMgc29ydGluZyBvcmRlciBvZiByZXN1bHQgbGlzdCBlLmcuOiBcIlRpdGxlIEFTQywgTGFzdE1vZGlmaWVkIERFU0NcIi5cbiAgICAgKiBAcGFyYW0gc2VhcmNoIChvcHRpb25hbCkgU2VhcmNoIHN0cmluZyBmb3IgcGFydGlhbCBtYXRjaC5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGwodHlwZXM/OiBTdG9yZWZyb250VHlwZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2tpcD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHRha2U/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3J0aW5nPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2VhcmNoPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQYWdlZE9mU3RvcmVmcm9udER0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0b3JlZnJvbnQgYnkgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldChpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFN0b3JlZnJvbnREdG8+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFN0b3JlZnJvbnRzQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElTdG9yZWZyb250c0FwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgc3RvcmVmcm9udHMsIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gdHlwZXMgKG9wdGlvbmFsKSBTdG9yZWZyb250IHR5cGUgZmlsdGVyLlxuICAgICAqIEBwYXJhbSBza2lwIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIHN0YXJ0IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3QuXG4gICAgICogQHBhcmFtIHRha2UgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2UgbGVuZ3RoIChob3cgbWFueSBjb25zZXF1ZW50IGl0ZW1zIG9mIHNvcnRlZCByZXN1bHQgbGlzdCBzaG91bGQgYmUgdGFrZW4pLlxuICAgICAqIEBwYXJhbSBzb3J0aW5nIChvcHRpb25hbCkgRGVmaW5lcyBzb3J0aW5nIG9yZGVyIG9mIHJlc3VsdCBsaXN0IGUuZy46IFwiVGl0bGUgQVNDLCBMYXN0TW9kaWZpZWQgREVTQ1wiLlxuICAgICAqIEBwYXJhbSBzZWFyY2ggKG9wdGlvbmFsKSBTZWFyY2ggc3RyaW5nIGZvciBwYXJ0aWFsIG1hdGNoLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEFsbCh0eXBlcz86IFN0b3JlZnJvbnRUeXBlW10gfCBudWxsIHwgdW5kZWZpbmVkLCBza2lwPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGFrZT86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHNvcnRpbmc/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzZWFyY2g/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZTdG9yZWZyb250RHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvc3RvcmVmcm9udHM/XCI7XG4gICAgICAgIGlmICh0eXBlcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVzICE9PSBudWxsKVxuICAgICAgICAgICAgdHlwZXMgJiYgdHlwZXMuZm9yRWFjaChpdGVtID0+IHsgdXJsXyArPSBcInR5cGVzPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpdGVtKSArIFwiJlwiOyB9KTtcbiAgICAgICAgaWYgKHNraXAgIT09IHVuZGVmaW5lZCAmJiBza2lwICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInNraXA9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNraXApICsgXCImXCI7XG4gICAgICAgIGlmICh0YWtlICE9PSB1bmRlZmluZWQgJiYgdGFrZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0YWtlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0YWtlKSArIFwiJlwiO1xuICAgICAgICBpZiAoc29ydGluZyAhPT0gdW5kZWZpbmVkICYmIHNvcnRpbmcgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic29ydGluZz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc29ydGluZykgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNlYXJjaCAhPT0gdW5kZWZpbmVkICYmIHNlYXJjaCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzZWFyY2g9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNlYXJjaCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mU3RvcmVmcm9udER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mU3RvcmVmcm9udER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEFsbChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UGFnZWRPZlN0b3JlZnJvbnREdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFBhZ2VkT2ZTdG9yZWZyb250RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlN0b3JlZnJvbnREdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0b3JlZnJvbnQgYnkgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldChpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFN0b3JlZnJvbnREdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9zdG9yZWZyb250cy97aWR9P1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXQoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8U3RvcmVmcm9udER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxTdG9yZWZyb250RHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxTdG9yZWZyb250RHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxTdG9yZWZyb250RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFN0b3JlZnJvbnREdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdG9yZWZyb250VXNlcnNBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHN0b3JlZnJvbnQgdXNlcnMsIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udFVzZXJJZCAob3B0aW9uYWwpIFN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBza2lwIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIHN0YXJ0IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3QuXG4gICAgICogQHBhcmFtIHRha2UgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2UgbGVuZ3RoIChob3cgbWFueSBjb25zZXF1ZW50IGl0ZW1zIG9mIHNvcnRlZCByZXN1bHQgbGlzdCBzaG91bGQgYmUgdGFrZW4pLlxuICAgICAqIEBwYXJhbSBzb3J0aW5nIChvcHRpb25hbCkgRGVmaW5lcyBzb3J0aW5nIG9yZGVyIG9mIHJlc3VsdCBsaXN0IGUuZy46IFwiVGl0bGUgQVNDLCBMYXN0TW9kaWZpZWQgREVTQ1wiLlxuICAgICAqIEBwYXJhbSBzZWFyY2ggKG9wdGlvbmFsKSBTZWFyY2ggc3RyaW5nIGZvciBwYXJ0aWFsIG1hdGNoLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEFsbChzdG9yZWZyb250SWQ6IG51bWJlciwgc3RvcmVmcm9udFVzZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNraXA/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0YWtlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc29ydGluZz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlN0b3JlZnJvbnRVc2VyRHRvPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN0b3JlZnJvbnQgdXNlci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIE9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZShzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogQ3JlYXRlU3RvcmVmcm9udFVzZXJEdG8gfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxTdG9yZWZyb250VXNlckR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0b3JlZnJvbnQgdXNlciBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBTdG9yZWZyb250IHVzZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXQoaWQ6IHN0cmluZyB8IG51bGwsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFN0b3JlZnJvbnRVc2VyRHRvPjtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBzdG9yZWZyb250IHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBPcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZWdpc3RlcihzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogUmVnaXN0ZXJTdG9yZWZyb250VXNlcklucHV0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zZmVycyBhbGwgZXhpc3RpbmcgZGF0YSBmb3IgdGhlIGFub255bW91cyBzdG9yZWZyb250IHVzZXIgdG8gdGhlIHNlbGVjdGVkIHJlZ3VsYXIgc3RvcmVmcm9udCB1c2VyIGFjY291bnQuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBPcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBtZXJnZUFub255bW91cyhzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogTWVyZ2VBbm9ueW1vdXNVc2VyRGF0YUlucHV0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBUEkgYWNjZXNzIHRva2VuIGZvciB0aGUgc3BlY2lmaWVkIHN0b3JlZnJvbnQgdXNlci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udFVzZXJJZCBTdG9yZWZyb250IHVzZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRUb2tlbihzdG9yZWZyb250VXNlcklkOiBzdHJpbmcsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU3RvcmVmcm9udFVzZXJzQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElTdG9yZWZyb250VXNlcnNBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHN0b3JlZnJvbnQgdXNlcnMsIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udFVzZXJJZCAob3B0aW9uYWwpIFN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBza2lwIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIHN0YXJ0IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3QuXG4gICAgICogQHBhcmFtIHRha2UgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2UgbGVuZ3RoIChob3cgbWFueSBjb25zZXF1ZW50IGl0ZW1zIG9mIHNvcnRlZCByZXN1bHQgbGlzdCBzaG91bGQgYmUgdGFrZW4pLlxuICAgICAqIEBwYXJhbSBzb3J0aW5nIChvcHRpb25hbCkgRGVmaW5lcyBzb3J0aW5nIG9yZGVyIG9mIHJlc3VsdCBsaXN0IGUuZy46IFwiVGl0bGUgQVNDLCBMYXN0TW9kaWZpZWQgREVTQ1wiLlxuICAgICAqIEBwYXJhbSBzZWFyY2ggKG9wdGlvbmFsKSBTZWFyY2ggc3RyaW5nIGZvciBwYXJ0aWFsIG1hdGNoLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEFsbChzdG9yZWZyb250SWQ6IG51bWJlciwgc3RvcmVmcm9udFVzZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNraXA/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0YWtlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc29ydGluZz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlN0b3JlZnJvbnRVc2VyRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvc3RvcmVmcm9udC11c2Vycz9cIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRVc2VySWQgIT09IHVuZGVmaW5lZCAmJiBzdG9yZWZyb250VXNlcklkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRVc2VySWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRVc2VySWQpICsgXCImXCI7XG4gICAgICAgIGlmIChza2lwICE9PSB1bmRlZmluZWQgJiYgc2tpcCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJza2lwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBza2lwKSArIFwiJlwiO1xuICAgICAgICBpZiAodGFrZSAhPT0gdW5kZWZpbmVkICYmIHRha2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGFrZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGFrZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNvcnRpbmcgIT09IHVuZGVmaW5lZCAmJiBzb3J0aW5nICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInNvcnRpbmc9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNvcnRpbmcpICsgXCImXCI7XG4gICAgICAgIGlmIChzZWFyY2ggIT09IHVuZGVmaW5lZCAmJiBzZWFyY2ggIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic2VhcmNoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzZWFyY2gpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBbGwoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBbGwoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UGFnZWRPZlN0b3JlZnJvbnRVc2VyRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFBhZ2VkT2ZTdG9yZWZyb250VXNlckR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEFsbChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UGFnZWRPZlN0b3JlZnJvbnRVc2VyRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQYWdlZE9mU3RvcmVmcm9udFVzZXJEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxQYWdlZE9mU3RvcmVmcm9udFVzZXJEdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzdG9yZWZyb250IHVzZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBPcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGUoc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYm9keT86IENyZWF0ZVN0b3JlZnJvbnRVc2VyRHRvIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9zdG9yZWZyb250LXVzZXJzP1wiO1xuICAgICAgICBpZiAoc3RvcmVmcm9udElkID09PSB1bmRlZmluZWQgfHwgc3RvcmVmcm9udElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3RvcmVmcm9udElkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3RvcmVmcm9udElkKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxTdG9yZWZyb250VXNlckR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxTdG9yZWZyb250VXNlckR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NyZWF0ZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFN0b3JlZnJvbnRVc2VyRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8U3RvcmVmcm9udFVzZXJEdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0b3JlZnJvbnQgdXNlciBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBTdG9yZWZyb250IHVzZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXQoaWQ6IHN0cmluZyB8IG51bGwsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFN0b3JlZnJvbnRVc2VyRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvc3RvcmVmcm9udC11c2Vycy97aWR9P1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChzdG9yZWZyb250SWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdG9yZWZyb250SWQnIG11c3QgYmUgZGVmaW5lZCBhbmQgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB1cmxfICs9IFwic3RvcmVmcm9udElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250SWQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXQoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFN0b3JlZnJvbnRVc2VyRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxTdG9yZWZyb250VXNlckR0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxTdG9yZWZyb250VXNlckR0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBzdG9yZWZyb250IHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBPcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZWdpc3RlcihzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogUmVnaXN0ZXJTdG9yZWZyb250VXNlcklucHV0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9zdG9yZWZyb250LXVzZXJzL3JlZ2lzdGVyP1wiO1xuICAgICAgICBpZiAoc3RvcmVmcm9udElkID09PSB1bmRlZmluZWQgfHwgc3RvcmVmcm9udElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3RvcmVmcm9udElkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3RvcmVmcm9udElkKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1JlZ2lzdGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVnaXN0ZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZWdpc3RlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFN0b3JlZnJvbnRVc2VyRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8U3RvcmVmcm9udFVzZXJEdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmZXJzIGFsbCBleGlzdGluZyBkYXRhIGZvciB0aGUgYW5vbnltb3VzIHN0b3JlZnJvbnQgdXNlciB0byB0aGUgc2VsZWN0ZWQgcmVndWxhciBzdG9yZWZyb250IHVzZXIgYWNjb3VudC5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIE9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIG1lcmdlQW5vbnltb3VzKHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGJvZHk/OiBNZXJnZUFub255bW91c1VzZXJEYXRhSW5wdXQgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvc3RvcmVmcm9udC11c2Vycy9tZXJnZS1hbm9ueW1vdXM/XCI7XG4gICAgICAgIGlmIChzdG9yZWZyb250SWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdG9yZWZyb250SWQnIG11c3QgYmUgZGVmaW5lZCBhbmQgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB1cmxfICs9IFwic3RvcmVmcm9udElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250SWQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb25cIixcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc01lcmdlQW5vbnltb3VzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTWVyZ2VBbm9ueW1vdXMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzTWVyZ2VBbm9ueW1vdXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFQSSBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgc3RvcmVmcm9udCB1c2VyLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250VXNlcklkIFN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFRva2VuKHN0b3JlZnJvbnRVc2VySWQ6IHN0cmluZywgc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvc3RvcmVmcm9udC11c2Vycy90b2tlbj9cIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRVc2VySWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250VXNlcklkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3RvcmVmcm9udFVzZXJJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250VXNlcklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250VXNlcklkKSArIFwiJlwiO1xuICAgICAgICBpZiAoc3RvcmVmcm9udElkID09PSB1bmRlZmluZWQgfHwgc3RvcmVmcm9udElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3RvcmVmcm9udElkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3RvcmVmcm9udElkKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0VG9rZW4oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRUb2tlbig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0VG9rZW4ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8c3RyaW5nPl9yZXNwb25zZVRleHQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+X3Jlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDk6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDkgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+X3Jlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGVuYW50SW5mb0FwaUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVuYW50IGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBcHBsaWNhdGlvbnNJbmZvKHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VGVuYW50QXBwbGljYXRpb25zSW5mb0R0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVuYW50LlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEluZm8odGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxUZW5hbnRJbmZvRHRvPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0ZW5hbnQgdXNlcnMuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0VXNlcnNJbmZvKHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VGVuYW50VXNlckluZm9EdG9bXT47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVGVuYW50SW5mb0FwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJVGVuYW50SW5mb0FwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVuYW50IGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBcHBsaWNhdGlvbnNJbmZvKHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VGVuYW50QXBwbGljYXRpb25zSW5mb0R0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3RlbmFudC1pbmZvL2FwcGxpY2F0aW9ucz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFwcGxpY2F0aW9uc0luZm8oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBcHBsaWNhdGlvbnNJbmZvKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFRlbmFudEFwcGxpY2F0aW9uc0luZm9EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VGVuYW50QXBwbGljYXRpb25zSW5mb0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEFwcGxpY2F0aW9uc0luZm8ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFRlbmFudEFwcGxpY2F0aW9uc0luZm9EdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFRlbmFudEFwcGxpY2F0aW9uc0luZm9EdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxUZW5hbnRBcHBsaWNhdGlvbnNJbmZvRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlbmFudC5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRJbmZvKHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VGVuYW50SW5mb0R0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3RlbmFudC1pbmZvP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW5mbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEluZm8oPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VGVuYW50SW5mb0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxUZW5hbnRJbmZvRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0SW5mbyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8VGVuYW50SW5mb0R0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VGVuYW50SW5mb0R0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFRlbmFudEluZm9EdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGVuYW50IHVzZXJzLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFVzZXJzSW5mbyh0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFRlbmFudFVzZXJJbmZvRHRvW10+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS90ZW5hbnQtaW5mby91c2Vycz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFVzZXJzSW5mbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFVzZXJzSW5mbyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxUZW5hbnRVc2VySW5mb0R0b1tdPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFRlbmFudFVzZXJJbmZvRHRvW10+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRVc2Vyc0luZm8ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFRlbmFudFVzZXJJbmZvRHRvW10+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFRlbmFudFVzZXJJbmZvRHRvW10+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxUZW5hbnRVc2VySW5mb0R0b1tdPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuLyoqIEluZm9ybWF0aW9uIGFib3V0IGEgc2VydmljZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRJbmZvTW9kZWwge1xuICAgIC8qKiBWZXJzaW9uIG51bWJlci4gKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQnVpbGQgZGF0ZSAoVVRDKS4gKi9cbiAgICBidWlsZERhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIChEZWJ1ZyB8IFJlbGVhc2UpLiAqL1xuICAgIGNvbmZpZ3VyYXRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBTZXJ2aWNlIG5hbWUuICovXG4gICAgYXBwTmFtZT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFJlZmVyZW5jZUR0byB7XG4gICAgLyoqIFByb2R1Y3QgcmVmZXJlbmNlIGlzIGFuIGV4dGVybmFsIHJlZmVyZW5jZSB0byBDdXN0b21lcidzIENhbnZhcyBwcm9kdWN0IHNwZWNpZmljYXRpb24sIGUuZyBvbmxpbmUgc3RvcmUgcHJvZHVjdCBpZGVudGlmaWVyLiAqL1xuICAgIHByb2R1Y3RSZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBDdXN0b21lcidzIENhbnZhcyBwcm9kdWN0IHNwZWNpZmljYXRpb24gaWRlbnRpZmllci4gKi9cbiAgICBwcm9kdWN0U3BlY2lmaWNhdGlvbklkPzogbnVtYmVyO1xuICAgIC8qKiBTdG9yZWZyb250IGlkZW50aWZpZXIuICovXG4gICAgc3RvcmVmcm9udElkPzogbnVtYmVyO1xuICAgIC8qKiBUZW5hbnQgaWRlbnRpZmllci4gKi9cbiAgICB0ZW5hbnRJZD86IG51bWJlcjtcbiAgICAvKiogU3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZSBjcmVhdGlvbiBkYXRlIGFuZCB0aW1lLiAqL1xuICAgIGNyZWF0ZWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBQYWdlZCBsaXN0IG9mIGl0ZW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlZE9mUHJvZHVjdFJlZmVyZW5jZUR0byB7XG4gICAgLyoqIEl0ZW1zIGNvdW50LiAqL1xuICAgIHRvdGFsPzogbnVtYmVyO1xuICAgIC8qKiBJdGVtcyBsaXN0LiAqL1xuICAgIGl0ZW1zPzogUHJvZHVjdFJlZmVyZW5jZUR0b1tdIHwgbnVsbDtcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyBjcmVhdGUgb3BlcmF0aW9uIHBhcmFtZXRlcnMgZm9yIHN0b3JlZnJvbnQgcHJvZHVjdCByZWZlcmVuY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2R1Y3RSZWZlcmVuY2VEdG8ge1xuICAgIC8qKiBQcm9kdWN0IHJlZmVyZW5jZSBpcyBhbiBleHRlcm5hbCByZWZlcmVuY2UgdG8gQ3VzdG9tZXIncyBDYW52YXMgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci4gKi9cbiAgICBwcm9kdWN0UmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBpZGVudGlmaWVyLiAqL1xuICAgIHByb2R1Y3RTcGVjaWZpY2F0aW9uSWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ibGVtRGV0YWlscyB7XG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgdGl0bGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIHN0YXR1cz86IG51bWJlciB8IG51bGw7XG4gICAgZGV0YWlsPzogc3RyaW5nIHwgbnVsbDtcbiAgICBpbnN0YW5jZT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgcHJvZHVjdCBhdHRyaWJ1dGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RBdHRyaWJ1dGVEdG8ge1xuICAgIC8qKiBQcm9kdWN0IGF0dHJpYnV0ZSBuYW1lLiAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBQcm9kdWN0IGF0dHJpYnV0ZSB0eXBlLiAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBQcm9kdWN0IGF0dHJpYnV0ZSB2YWx1ZS4gKi9cbiAgICB2YWx1ZT86IGFueSB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3BlY2lmaWNhdGlvbkR0byB7XG4gICAgLyoqIFByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBpZGVudGlmaWVyLiAqL1xuICAgIGlkPzogbnVtYmVyO1xuICAgIC8qKiBUZW5hbnQgaWRlbnRpZmllci4gKi9cbiAgICB0ZW5hbnRJZD86IG51bWJlcjtcbiAgICAvKiogUHJvZHVjdCBzcGVjaWZpY2F0aW9uIG5hbWUuICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIExpc3Qgb2YgcHJvZHVjdCBhdHRyaWJ1dGVzLiAqL1xuICAgIHByb2R1Y3RBdHRyaWJ1dGVzPzogUHJvZHVjdEF0dHJpYnV0ZUR0b1tdIHwgbnVsbDtcbiAgICAvKiogUHJvZHVjdCBzcGVjaWZpY2F0aW9uIGNyZWF0aW9uIHRpbWUuICovXG4gICAgY3JlYXRlZD86IHN0cmluZztcbiAgICAvKiogUHJvZHVjdCBzcGVjaWZpY2F0aW9uIG1vZGlmaWNhdGlvbiB0aW1lLiAqL1xuICAgIGxhc3RNb2RpZmllZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgc3RvcmVmcm9udCBwcm9kdWN0IGNvc3QgZGV0YWlscy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdENvc3REZXRhaWxzRHRvIHtcbiAgICAvKiogUHJvZHVjdCByZWZlcmVuY2UgaXMgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuICovXG4gICAgcHJvZHVjdFJlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFByb2R1Y3QgU0tVLiAqL1xuICAgIHByb2R1Y3RTa3U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBQcm9kdWN0IHF1YW50aXR5LiAqL1xuICAgIHByb2R1Y3RRdWFudGl0eT86IG51bWJlcjtcbiAgICAvKiogUHJvZHVjdCBwcmljZS4gKi9cbiAgICBwcm9kdWN0UHJpY2U/OiBudW1iZXI7XG4gICAgLyoqIFByb2R1Y3QgY29zdC4gKi9cbiAgICBwcm9kdWN0Q29zdD86IG51bWJlcjtcbiAgICAvKiogUHJvZHVjdCBkaXNjb3VudC4gKi9cbiAgICBwcm9kdWN0RGlzY291bnQ/OiBudW1iZXI7XG4gICAgLyoqIEN1cnJlbmN5IGNvZGUuICovXG4gICAgY3VycmVuY3lDb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVGVuYW50IGlkZW50aWZpZXIuICovXG4gICAgdGVuYW50SWQ/OiBudW1iZXI7XG59XG5cbi8qKiBQYWdlZCBsaXN0IG9mIGl0ZW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlZE9mUHJvZHVjdFNwZWNpZmljYXRpb25EdG8ge1xuICAgIC8qKiBJdGVtcyBjb3VudC4gKi9cbiAgICB0b3RhbD86IG51bWJlcjtcbiAgICAvKiogSXRlbXMgbGlzdC4gKi9cbiAgICBpdGVtcz86IFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvW10gfCBudWxsO1xufVxuXG4vKiogRGVmaW5lcyBhbGwgYXZhaWxhYmxlIGRhdGUgcGVyaW9kIGZpbHRlciB2YWx1ZXMgZm9yIHF1ZXJpZXMuICovXG5leHBvcnQgZW51bSBEYXRlUGVyaW9kIHtcbiAgICBBbGwgPSBcIkFsbFwiLFxuICAgIFRvZGF5ID0gXCJUb2RheVwiLFxuICAgIExhc3Q3RGF5cyA9IFwiTGFzdDdEYXlzXCIsXG4gICAgTGFzdDMwRGF5cyA9IFwiTGFzdDMwRGF5c1wiLFxufVxuXG4vKiogQXZhaWxhYmxlIHByb2R1Y3QgcmVzb3VyY2UgdHlwZXMgKi9cbmV4cG9ydCBlbnVtIFByb2plY3RJdGVtUmVzb3VyY2VUeXBlIHtcbiAgICBHZW5lcmFsID0gXCJHZW5lcmFsXCIsXG4gICAgUHJldmlldyA9IFwiUHJldmlld1wiLFxuICAgIEhpcmVzID0gXCJIaXJlc1wiLFxufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdCBpdGVtIHJlc291cmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0SXRlbVJlc291cmNlRHRvIHtcbiAgICAvKiogUmVzb3VyY2UgSUQuICovXG4gICAgcmVzb3VyY2VJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlc291cmNlIG5hbWUuICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlc291cmNlIHR5cGUuICovXG4gICAgdHlwZT86IFByb2plY3RJdGVtUmVzb3VyY2VUeXBlO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdCBpdGVtLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0SXRlbUR0byB7XG4gICAgLyoqIEl0ZW0gbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogSXRlbSBxdWFudGl0eSBpbmZvcm1hdGlvbi4gKi9cbiAgICBxdWFudGl0eT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIEl0ZW0gaW5mb3JtYXRpb24uICovXG4gICAgZmllbGRzPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCBudWxsO1xuICAgIC8qKiBBZGRpdGlvbmFsIGl0ZW0gaW5mb3JtYXRpb24uICovXG4gICAgaGlkZGVuPzogYW55IHwgbnVsbDtcbiAgICAvKiogQSBsaXN0IG9mIGRlc2lnbiBpZGVudGlmaWVycyBhc3NvY2lhdGVkIHRvIHRoZSBpdGVtLiAqL1xuICAgIGRlc2lnbklkcz86IHN0cmluZ1tdIHwgbnVsbDtcbiAgICAvKiogU0tVLiAqL1xuICAgIHNrdT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEV4dGVybmFsIHJlc291cmNlcyBkZXNjcmlwdGlvbnMuICovXG4gICAgcmVzb3VyY2VzPzogUHJvamVjdEl0ZW1SZXNvdXJjZUR0b1tdIHwgbnVsbDtcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2plY3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3REdG8ge1xuICAgIC8qKiBQcm9qZWN0IGlkZW50aWZpZXIuICovXG4gICAgaWQ/OiBudW1iZXI7XG4gICAgLyoqIFByb2R1Y3QgcmVmZXJlbmNlIChpLmUgZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbikgKi9cbiAgICBwcm9kdWN0UmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogU3RvcmVmcm9udCBpZGVudGlmaWVyLiAqL1xuICAgIHN0b3JlZnJvbnRJZD86IG51bWJlcjtcbiAgICAvKiogUHJvamVjdCB0ZW5hbnQgaW5kZW50aWZpZXIuICovXG4gICAgdGVuYW50SWQ/OiBudW1iZXI7XG4gICAgLyoqIE9yZGVyIGlkZW50aWZpZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBvcmRlcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogT3JkZXIgdXJsIGluIGVjb21tZXJjZSBzeXN0ZW0uICovXG4gICAgb3JkZXJVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBPcmRlciBudW1iZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBvcmRlck51bWJlcj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIExpbmUgaXRlbSBpZGVudGlmaWVyIGZyb20gZXh0ZXJuYWwgZWNvbW1lcmNlIHN5c3RlbSBvcmRlci4gKi9cbiAgICBvcmRlckxpbmVJdGVtSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBMaW5lIGl0ZW0gaW5kZXggZnJvbSBleHRlcm5hbCBlY29tbWVyY2Ugc3lzdGVtIG9yZGVyLiAqL1xuICAgIG9yZGVyTGluZUl0ZW1JbmRleD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIEN1c3RvbWVyIGlkZW50aWZpZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBjdXN0b21lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQ3VzdG9tZXIgbmFtZSBpbiBlY29tbWVyY2Ugc3lzdGVtLiAqL1xuICAgIGN1c3RvbWVyTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFByb2plY3QgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUHJvamVjdCBvd25lciBpZGVudGlmaWVyLiAqL1xuICAgIG93bmVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBMaXN0IG9mIHByb2plY3QgaXRlbXMuICovXG4gICAgaXRlbXM/OiBQcm9qZWN0SXRlbUR0b1tdIHwgbnVsbDtcbiAgICAvKiogUHJvamVjdCBzdGF0dXMgY29kZS4gKi9cbiAgICBzdGF0dXM/OiBudW1iZXI7XG4gICAgLyoqIFByb2plY3QgY3JlYXRpb24gdGltZS4gKi9cbiAgICBjcmVhdGVkPzogc3RyaW5nO1xuICAgIC8qKiBQcm9qZWN0IG1vZGlmaWNhdGlvbiB0aW1lLiAqL1xuICAgIGxhc3RNb2RpZmllZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0LiAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFBhZ2VkIGxpc3Qgb2YgaXRlbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkT2ZQcm9qZWN0RHRvIHtcbiAgICAvKiogSXRlbXMgY291bnQuICovXG4gICAgdG90YWw/OiBudW1iZXI7XG4gICAgLyoqIEl0ZW1zIGxpc3QuICovXG4gICAgaXRlbXM/OiBQcm9qZWN0RHRvW10gfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGNyZWF0ZSBvcGVyYXRpb24gcGFyYW10ZXJzIGZvciBhIHByb2plY3QgaXRlbSByZXNvdXJjZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdEl0ZW1SZXNvdXJjZVBhcmFtZXRlcnNEdG8ge1xuICAgIC8qKiBSZXNvdXJjZSBVUkwuICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUmVzb3VyY2UgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUmVzb3VyY2UgdHlwZS4gKi9cbiAgICB0eXBlPzogUHJvamVjdEl0ZW1SZXNvdXJjZVR5cGU7XG4gICAgLyoqIE9yaWdpbmFsIHJlc291cmNlIGlkZW50aWZpZXIuICovXG4gICAgcmVzb3VyY2VJZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgY3JlYXRlIG9wZXJhdGlvbiBwYXJhbXRlcnMgZm9yIGEgcHJvamVjdCBpdGVtLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0SXRlbVBhcmFtZXRlcnNEdG8ge1xuICAgIC8qKiBJdGVtIG5hbWUuICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEl0ZW0gcXVhbnRpdHkgaW5mb3JtYXRpb24uICovXG4gICAgcXVhbnRpdHk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKiBJdGVtIGluZm9ybWF0aW9uLiAqL1xuICAgIGZpZWxkcz86IHsgW2tleTogc3RyaW5nXTogYW55OyB9IHwgbnVsbDtcbiAgICAvKiogQWRkaXRpb25hbCBpdGVtIGluZm9ybWF0aW9uLiAqL1xuICAgIGhpZGRlbj86IGFueSB8IG51bGw7XG4gICAgLyoqIEEgbGlzdCBvZiBkZXNpZ24gaWRlbnRpZmllcnMgYXNzb2NpYXRlZCB0byB0aGUgaXRlbS4gKi9cbiAgICBkZXNpZ25JZHM/OiBzdHJpbmdbXSB8IG51bGw7XG4gICAgLyoqIFNLVS4gKi9cbiAgICBza3U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBFeHRlcm5hbCByZXNvdXJjZXMgZGVzY3JpcHRpb25zLiAqL1xuICAgIHJlc291cmNlcz86IFByb2plY3RJdGVtUmVzb3VyY2VQYXJhbWV0ZXJzRHRvW10gfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGNyZWF0ZSBvcGVyYXRpb24gcGFyYW1ldGVycyBmb3IgcHJvamVjdCBlbnRpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3REdG8ge1xuICAgIC8qKiBQcm9kdWN0IHJlZmVyZW5jZSAoaS5lIGV4dGVybmFsIHJlZmVyZW5jZSB0byBDdXN0b21lcidzIENhbnZhcyBwcm9kdWN0IHNwZWNpZmljYXRpb24gLSBtYWluIHN1YmplY3Qgb2YgdGhpcyBwcm9qZWN0KS4gKi9cbiAgICBwcm9kdWN0UmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqIE9yZGVyIGlkZW50aWZpZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBvcmRlcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogT3JkZXIgdXJsIGluIGVjb21tZXJjZSBzeXN0ZW0uICovXG4gICAgb3JkZXJVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBPcmRlciBudW1iZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBvcmRlck51bWJlcj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIExpbmUgaXRlbSBpbmRleCBmcm9tIGVjb21tZXJjZSBzeXN0ZW0gb3JkZXIuICovXG4gICAgb3JkZXJMaW5lSXRlbUluZGV4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogTGluZSBJdGVtIGlkZW50aWZpZXIgZnJvbSBlY29tbWVyY2Ugc3lzdGVtIG9yZGVyLiAqL1xuICAgIG9yZGVyTGluZUl0ZW1JZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEN1c3RvbWVyIGlkZW50aWZpZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBjdXN0b21lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQ3VzdG9tZXIgbmFtZSBpbiBlY29tbWVyY2Ugc3lzdGVtLiAqL1xuICAgIGN1c3RvbWVyTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFByb2plY3QgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUHJvamVjdCBvd25lciBpZGVudGlmaWVyLiAqL1xuICAgIG93bmVySWQ6IHN0cmluZztcbiAgICAvKiogTGlzdCBvZiBwcm9qZWN0IGl0ZW1zLiAqL1xuICAgIGl0ZW1zPzogUHJvamVjdEl0ZW1QYXJhbWV0ZXJzRHRvW10gfCBudWxsO1xuICAgIC8qKiBEZXNjcmlwdGlvbiBvZiB0aGUgcHJvamVjdC4gKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgZWNvbW1lcmNlIG9yZGVyIGRlc2NyaXB0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmRlckRldGFpbHNEdG8ge1xuICAgIC8qKiBPcmRlciBpZGVudGlmaWVyIGluIGVjb21tZXJjZSBzeXN0ZW0uICovXG4gICAgb3JkZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE9yZGVyIHVybCBpbiBlY29tbWVyY2Ugc3lzdGVtLiAqL1xuICAgIG9yZGVyVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogT3JkZXIgbnVtYmVyIGluIGVjb21tZXJjZSBzeXN0ZW0uICovXG4gICAgb3JkZXJOdW1iZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKiBMaW5lIGl0ZW0gaW5kZXggZnJvbSBlY29tbWVyY2Ugc3lzdGVtIG9yZGVyLiAqL1xuICAgIG9yZGVyTGluZUl0ZW1JbmRleD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIExpbmUgSXRlbSBpZGVudGlmaWVyIGZyb20gZWNvbW1lcmNlIHN5c3RlbSBvcmRlci4gKi9cbiAgICBvcmRlckxpbmVJdGVtSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBDdXN0b21lciBpZGVudGlmaWVyIGluIGVjb21tZXJjZSBzeXN0ZW0uICovXG4gICAgY3VzdG9tZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEN1c3RvbWVyIG5hbWUgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBjdXN0b21lck5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgZW51bSBSZW5kZXJIaVJlc1NjZW5hcmlvT3V0cHV0Rm9ybWF0IHtcbiAgICBQZGYgPSBcIlBkZlwiLFxuICAgIEpwZWcgPSBcIkpwZWdcIixcbiAgICBQbmcgPSBcIlBuZ1wiLFxuICAgIFRpZmYgPSBcIlRpZmZcIixcbn1cblxuZXhwb3J0IGVudW0gUmVuZGVySGlSZXNTY2VuYXJpb091dHB1dENvbG9yU3BhY2Uge1xuICAgIFJnYiA9IFwiUmdiXCIsXG4gICAgR3JheXNjYWxlID0gXCJHcmF5c2NhbGVcIixcbiAgICBDbXlrID0gXCJDbXlrXCIsXG59XG5cbmV4cG9ydCBlbnVtIFJlbmRlckhpUmVzU2NlbmFyaW9PdXRwdXRGbGlwTW9kZSB7XG4gICAgTm9uZSA9IFwiTm9uZVwiLFxuICAgIEhvcml6b250YWwgPSBcIkhvcml6b250YWxcIixcbiAgICBWZXJ0aWNhbCA9IFwiVmVydGljYWxcIixcbiAgICBCb3RoID0gXCJCb3RoXCIsXG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgJ1JlbmRlckhpUmVzJyBzY2VuYXJpbyBwYXJhbXRlcnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckhpUmVzU2NlbmFyaW9EdG8ge1xuICAgIC8qKiBQcml2YXRlIGRlc2lnbiBpZGVudGlmaWVyLiAqL1xuICAgIGRlc2lnbklkOiBzdHJpbmc7XG4gICAgLyoqIE91dHB1dCBmaWxlIG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogT3V0cHV0IGZpbGUgRFBJLiAqL1xuICAgIGRwaT86IG51bWJlcjtcbiAgICAvKiogT3V0cHV0IGZpbGUgZm9ybWF0LiAqL1xuICAgIGZvcm1hdD86IFJlbmRlckhpUmVzU2NlbmFyaW9PdXRwdXRGb3JtYXQgfCBudWxsO1xuICAgIC8qKiBPdXRwdXQgZmlsZSBjb2xvciBzcGFjZS4gKi9cbiAgICBjb2xvclNwYWNlPzogUmVuZGVySGlSZXNTY2VuYXJpb091dHB1dENvbG9yU3BhY2UgfCBudWxsO1xuICAgIC8qKiBPdXRwdXQgZmlsZSBmbGlwIG1vZGUuICovXG4gICAgZmxpcE1vZGU/OiBSZW5kZXJIaVJlc1NjZW5hcmlvT3V0cHV0RmxpcE1vZGUgfCBudWxsO1xuICAgIC8qKiBPdXRwdXQgZmlsZSBhY2Nlc3MgbW9kZS4gKi9cbiAgICBhbm9ueW1vdXNBY2Nlc3M/OiBib29sZWFuIHwgbnVsbDtcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyAnY3JlYXRlJyBvcGVyYXRpb24gcGFyYW1ldGVycyBmb3IgcHJvamVjdCBlbnRpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RCeVJlbmRlckhpUmVzU2NlbmFyaW9EdG8ge1xuICAgIC8qKiBQcm9qZWN0IG93bmVyIGlkZW50aWZpZXIuICovXG4gICAgb3duZXJJZDogc3RyaW5nO1xuICAgIC8qKiBQcm9qZWN0IG5hbWUuICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0LiAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogRWNvbW1lcmNlIHN5c3RlbSBvcmRlciBkZXNjcmlwdGlvbi4gKi9cbiAgICBvcmRlckRldGFpbHM/OiBPcmRlckRldGFpbHNEdG8gfCBudWxsO1xuICAgIC8qKiBMaXN0IG9mIHByb2plY3QgaXRlbXMuICovXG4gICAgc2NlbmFyaW86IFJlbmRlckhpUmVzU2NlbmFyaW9EdG87XG59XG5cbi8qKiBQcm9qZWN0IHRyYW5zaXRpb24gZHRvIGNsYXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0VHJhbnNpdGlvbkR0byB7XG4gICAgLyoqIFRyYW5zaXRpb24gaWRlbnRpZnlpbmcgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVHJhbnNpdGlvbiBkaXNwbGF5IG5hbWUuICovXG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBQcm9qZWN0IHN0YXR1cyBjb2RlIGZyb20gd2hpY2ggdHJhbnNpdGlvbiB0byB0aGUgcmVzdWx0IHN0YXR1cyBjb2RlIGNhbiBiZSBkb25lLiAqL1xuICAgIHN0YXJ0U3RhdHVzPzogbnVtYmVyO1xuICAgIC8qKiBUcmFuc2l0aW9uIHJlc3VsdCBwcm9qZWN0IHN0YXR1cyBjb2RlLiAqL1xuICAgIHJlc3VsdFN0YXR1cz86IG51bWJlcjtcbn1cblxuLyoqIFBhZ2VkIGxpc3Qgb2YgaXRlbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkT2ZQcm9qZWN0VHJhbnNpdGlvbkR0byB7XG4gICAgLyoqIEl0ZW1zIGNvdW50LiAqL1xuICAgIHRvdGFsPzogbnVtYmVyO1xuICAgIC8qKiBJdGVtcyBsaXN0LiAqL1xuICAgIGl0ZW1zPzogUHJvamVjdFRyYW5zaXRpb25EdG9bXSB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2plY3QgdHJhbnNpdGlvbiBjb25mbGljdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdFRyYW5zaXRpb25Db25mbGljdER0byB7XG4gICAgLyoqIEEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHN0YXR1cyB0cmFuc2l0aW9ucyBmb3IgdGhlIHByb2plY3QuICovXG4gICAgYXZhaWxhYmxlVHJhbnNpdGlvbnM/OiBQcm9qZWN0VHJhbnNpdGlvbkR0b1tdIHwgbnVsbDtcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgcHJvamVjdCBzdGF0dXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RTdGF0dXNEdG8ge1xuICAgIC8qKiBTdGF0dXMgY29kZS4gKi9cbiAgICBjb2RlPzogbnVtYmVyO1xuICAgIC8qKiBTdGF0dXMgZGlzcGxheSBuYW1lLiAqL1xuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFBhZ2VkIGxpc3Qgb2YgaXRlbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvIHtcbiAgICAvKiogSXRlbXMgY291bnQuICovXG4gICAgdG90YWw/OiBudW1iZXI7XG4gICAgLyoqIEl0ZW1zIGxpc3QuICovXG4gICAgaXRlbXM/OiBQcm9qZWN0U3RhdHVzRHRvW10gfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIHJlc3VsdCBvZiAnZ2V0IHByb2plY3QgcGRmIHVybCcgb3BlcmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0UGRmUmVzdWx0RHRvIHtcbiAgICAvKiogUHJvamVjdCBwZGYgdXJsLiAqL1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBBdmFpbGFibGUgcHJvamVjdCBwcm9jZXNzaW5nIHN0YXR1c2VzLiAqL1xuZXhwb3J0IGVudW0gUHJvamVjdFByb2Nlc3NpbmdTdGF0dXMge1xuICAgIFBlbmRpbmcgPSBcIlBlbmRpbmdcIixcbiAgICBJblByb2dyZXNzID0gXCJJblByb2dyZXNzXCIsXG4gICAgQ29tcGxldGVkID0gXCJDb21wbGV0ZWRcIixcbiAgICBGYWlsZWQgPSBcIkZhaWxlZFwiLFxufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCBvdXRwdXQgZmlsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdE91dHB1dEZpbGVEZXRhaWxzRHRvIHtcbiAgICAvKiogUHJvamVjdCBvdXRwdXQgZmlsZSBVUkwuICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUHJvamVjdCBvdXRwdXQgZmlsZSBuYW1lICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFByb2plY3Qgb3V0cHV0IGZpbGUgZm9ybWF0ICovXG4gICAgZm9ybWF0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUHJvamVjdCBvdXRwdXQgZmlsZSBpZCB3aXRoaW5nIGFydGlmYWN0cyBzdG9yYWdlLiAqL1xuICAgIGFydGlmYWN0SWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBQcm9qZWN0IG91dHB1dCBmaWxlIGFjY2VzcyBzdHJhdGVneS4gKi9cbiAgICBhbm9ueW1vdXNBY2Nlc3M/OiBib29sZWFuO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGRlc2NyaXB0aW9uIG9mIHByb2plY3QgcHJvY2Vzc2luZyByZXN1bHRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0UHJvY2Vzc2luZ1Jlc3VsdHNEdG8ge1xuICAgIC8qKiBQcm9qZWN0IHByb2Nlc3Npbmcgc3RhdHVzLiAqL1xuICAgIHN0YXR1cz86IFByb2plY3RQcm9jZXNzaW5nU3RhdHVzO1xuICAgIC8qKiBQcm9qZWN0IHN0YXR1cyBkZXNjcmlwdGlvbi4gKi9cbiAgICBzdGF0dXNEZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIENvbGxlY3Rpb24gb2YgcHJvamVjdCBvdXRwdXQgZmlsZSBkZXNjcmlwdGlvbnMuICovXG4gICAgb3V0cHV0RmlsZURldGFpbHM/OiBQcm9qZWN0T3V0cHV0RmlsZURldGFpbHNEdG9bXSB8IG51bGw7XG59XG5cbi8qKiBBdmFpbGFibGUgdmFsdWUgdHlwZXMgZm9yIG9yZGVyIGRhdGEgaXRlbS4gKi9cbmV4cG9ydCBlbnVtIE9yZGVyRGF0YUl0ZW1WYWx1ZVR5cGUge1xuICAgIFBsYWluVGV4dCA9IFwiUGxhaW5UZXh0XCIsXG4gICAgQ29tbWFTZXBhcmF0ZWRMaXN0ID0gXCJDb21tYVNlcGFyYXRlZExpc3RcIixcbiAgICBTZXJpYWxpemVkSnNvbiA9IFwiU2VyaWFsaXplZEpzb25cIixcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBwcm9qZWN0J3Mgb3JkZXIgZGF0YSBpdGVtLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmRlckRhdGFJdGVtRHRvIHtcbiAgICAvKiogT3JkZXIgZGF0YSBpdGVtIGtleSAoZXZlbnR1YWxsIG9yZGVyIG1ldGFkYXRhIGZpZWxkIG5hbWUpLiAqL1xuICAgIGtleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE9yZGVyIGRhdGEgaXRlbSB2YWx1ZS4gKi9cbiAgICB2YWx1ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE9yZGVyIGRhdGEgaXRlbSB0eXBlLiAqL1xuICAgIHR5cGU/OiBPcmRlckRhdGFJdGVtVmFsdWVUeXBlO1xufVxuXG4vKiogU3RvcmVmcm9udCB0eXBlcy4gKi9cbmV4cG9ydCBlbnVtIFN0b3JlZnJvbnRUeXBlIHtcbiAgICBDdXN0b20gPSBcIkN1c3RvbVwiLFxuICAgIFNob3BpZnlMZWdhY3kgPSBcIlNob3BpZnlMZWdhY3lcIixcbiAgICBEb2NrZXRNYW5hZ2VyID0gXCJEb2NrZXRNYW5hZ2VyXCIsXG4gICAgQ3VzdG9tU2FtbCA9IFwiQ3VzdG9tU2FtbFwiLFxuICAgIE5vcENvbW1lcmNlID0gXCJOb3BDb21tZXJjZVwiLFxuICAgIFdvb0NvbW1lcmNlID0gXCJXb29Db21tZXJjZVwiLFxuICAgIE1hZ2VudG8gPSBcIk1hZ2VudG9cIixcbiAgICBCaWdDb21tZXJjZSA9IFwiQmlnQ29tbWVyY2VcIixcbiAgICBTaG9waWZ5ID0gXCJTaG9waWZ5XCIsXG4gICAgU2hvcGlmeUN1c3RvbSA9IFwiU2hvcGlmeUN1c3RvbVwiLFxufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3RvcmVmcm9udC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVmcm9udER0byB7XG4gICAgLyoqIFN0b3JlZnJvbnQgaWRlbnRpZmllci4gKi9cbiAgICBpZD86IG51bWJlcjtcbiAgICAvKiogVGVuYW50IGlkZW50aWZpZXIuICovXG4gICAgdGVuYW50SWQ/OiBudW1iZXI7XG4gICAgLyoqIFN0b3JlZnJvbnQgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogU3RvcmVmcm9udCBlY29tbWVyY2Ugc3lzdGVtIHR5cGUuICovXG4gICAgdHlwZT86IFN0b3JlZnJvbnRUeXBlO1xuICAgIC8qKiBTdG9yZWZyb250IGVudGl0eSBjcmVhdGlvbiBkYXRlIGFuZCB0aW1lLiAqL1xuICAgIGNyZWF0ZWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBQYWdlZCBsaXN0IG9mIGl0ZW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlZE9mU3RvcmVmcm9udER0byB7XG4gICAgLyoqIEl0ZW1zIGNvdW50LiAqL1xuICAgIHRvdGFsPzogbnVtYmVyO1xuICAgIC8qKiBJdGVtcyBsaXN0LiAqL1xuICAgIGl0ZW1zPzogU3RvcmVmcm9udER0b1tdIHwgbnVsbDtcbn1cblxuLyoqIERUTyBjbGFzcywgY29udGFpbmluZyBpbmZyb21hdGlvbiBhYm91dCBhIHN0b3JlZnJvbnQgdXNlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVmcm9udFVzZXJEdG8ge1xuICAgIC8qKiBTdG9yZWZyb250IHVzZXIgaWRlbnRpZmllci4gKi9cbiAgICB1c2VySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBTdG9yZWZyb250IHRlbmFudCBpbmRlbnRpZmllci4gKi9cbiAgICB0ZW5hbnRJZD86IG51bWJlcjtcbiAgICAvKiogU3RvcmVmcm9udCBpZGVudGlmaWVyLiAqL1xuICAgIHN0b3JlZnJvbnRJZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgdXNlciBpcyB0cmFja2VkIGFzIGFuIGFub255bW91cy4gKi9cbiAgICBpc0Fub255bW91cz86IGJvb2xlYW47XG59XG5cbi8qKiBQYWdlZCBsaXN0IG9mIGl0ZW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlZE9mU3RvcmVmcm9udFVzZXJEdG8ge1xuICAgIC8qKiBJdGVtcyBjb3VudC4gKi9cbiAgICB0b3RhbD86IG51bWJlcjtcbiAgICAvKiogSXRlbXMgbGlzdC4gKi9cbiAgICBpdGVtcz86IFN0b3JlZnJvbnRVc2VyRHRvW10gfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGNyZWF0ZSBvcGVyYXRpb24gcGFyYW1ldGVycyBmb3Igc3RvcmVmcm9udCB1c2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTdG9yZWZyb250VXNlckR0byB7XG4gICAgLyoqIFN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLiAqL1xuICAgIHN0b3JlZnJvbnRVc2VySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIHVzZXIgaXMgdHJhY2tlZCBhcyBhbiBhbm9ueW1vdXMuICovXG4gICAgaXNBbm9ueW1vdXM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyU3RvcmVmcm9udFVzZXJJbnB1dCB7XG4gICAgLyoqIFN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLiAqL1xuICAgIHN0b3JlZnJvbnRVc2VySWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIHBhcmFtZXRlcnMgZm9yIG1lcmdlIGFub255bW91cyB1c2VyIG9wZXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVyZ2VBbm9ueW1vdXNVc2VyRGF0YUlucHV0IHtcbiAgICAvKiogQW5vbnltb3VzIHN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLiAqL1xuICAgIGFub255bW91c1N0b3JlZnJvbnRVc2VySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBSZWd1bGFyIHN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLiAqL1xuICAgIHJlZ3VsYXJTdG9yZWZyb250VXNlcklkPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0ZW5hbnQgYXBwbGljYXRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRBcHBsaWNhdGlvbnNJbmZvRHRvIHtcbiAgICAvKiogQW4gdXJsIHRvIHRoZSAnRGVzaWduIEVkaXRvcicgdGVuYW50IGFwcGxpY2F0aW9uLiAqL1xuICAgIGRlc2lnbkVkaXRvclVybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEFuIHVybCB0byB0aGUgJ1VJIEZyYW1ld29yaycuICovXG4gICAgdWlGcmFtZXdvcmtVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBBbiB1cmwgdG8gdGhlICdTaW1wbGUgZWRpdG9yJy4gKi9cbiAgICBzaW1wbGVFZGl0b3JVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBBbiB1cmwgdG8gdGhlICdQcmVmbGlnaHQnIHRlbmFudCBhcHBsaWNhdGlvbi4gKi9cbiAgICBwcmVmbGlnaHRVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBBbiB1cmwgdG8gdGhlICdEeW5hbWljIEltYWdlJyB0ZW5hbnQgYXBwbGljYXRpb24uICovXG4gICAgZHluYW1pY0ltYWdlVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVGVuYW50IGlkZW50aWZpZXIgKi9cbiAgICB0ZW5hbnRJZD86IG51bWJlcjtcbiAgICAvKiogQW4gQXBpS2V5IGZvciB0aGUgJ0Rlc2lnbiBFZGl0b3InIHRlbmFudCBhcHBsaWNhdGlvbi4gKi9cbiAgICBkZXNpZ25FZGl0b3JBcGlLZXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBBbiBBcGlLZXkgZm9yIHRoZSAnUHJlZmxpZ2h0JyB0ZW5hbnQgYXBwbGljYXRpb24uICovXG4gICAgcHJlZmxpZ2h0QXBpS2V5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQW4gQXBpS2V5IGZvciB0aGUgJ0R5bmFtaWMgSW1hZ2UnIHRlbmFudCBhcHBsaWNhdGlvbi4gKi9cbiAgICBkeW5hbWljSW1hZ2VBcGlLZXk/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGVuYW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRJbmZvRHRvIHtcbiAgICAvKiogVGVuYW50IGlkZW50aWZpZXIuICovXG4gICAgdGVuYW50SWQ/OiBudW1iZXI7XG4gICAgLyoqIFRlbmFuY3kgbmFtZS4gKi9cbiAgICB0ZW5hbmN5TmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFRlbmFudCBjcmVhdGlvbiB0aW1lLiAqL1xuICAgIHRlbmFudENyZWF0aW9uVGltZT86IHN0cmluZztcbiAgICAvKiogVGVuYW50IGFjdGl2ZW5lc3Mgc3RhdHVzLiAqL1xuICAgIGlzQWN0aXZlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRVc2VySW5mb0R0byB7XG4gICAgLyoqIFRlbmFudCBpZGVudGlmaWVyLiAqL1xuICAgIHRlbmFudElkPzogbnVtYmVyO1xuICAgIC8qKiBVc2VyIGlkZW50aWZpZXIuICovXG4gICAgdXNlcklkPzogbnVtYmVyO1xuICAgIC8qKiBVc2VyIG5hbWUuICovXG4gICAgdXNlck5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBVc2VyIHN1cm5hbWUuICovXG4gICAgdXNlclN1cm5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBVc2VyIHN0YXR1cy4gKi9cbiAgICBpc0FjdGl2ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlc3BvbnNlIHtcbiAgICBkYXRhOiBCbG9iO1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIGZpbGVOYW1lPzogc3RyaW5nO1xuICAgIGhlYWRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwaUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgcmVzcG9uc2U6IHN0cmluZztcbiAgICBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfTtcbiAgICByZXN1bHQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ6IGFueSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc0FwaUV4Y2VwdGlvbiA9IHRydWU7XG5cbiAgICBzdGF0aWMgaXNBcGlFeGNlcHRpb24ob2JqOiBhbnkpOiBvYmogaXMgQXBpRXhjZXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIG9iai5pc0FwaUV4Y2VwdGlvbiA9PT0gdHJ1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3VsdCk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhuZXcgQXBpRXhjZXB0aW9uKG1lc3NhZ2UsIHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnMsIG51bGwpKTtcbn1cblxuZnVuY3Rpb24gYmxvYlRvVGV4dChibG9iOiBhbnkpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxzdHJpbmc+KChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmICghYmxvYikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChcIlwiKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgoPGFueT5ldmVudC50YXJnZXQpLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChibG9iKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSJdfQ==
|
|
3688
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVmcm9udC1hcGktY2xpZW50LmpzIiwic291cmNlUm9vdCI6Ii9ob21lL2F1cmlnbWEvYWdlbnRzL0NDSDAxL193b3JrLzIvcy9CYWNrZW5kL3NyYy9CYWNrT2ZmaWNlLldlYi5QdWJsaWNBcGkuVHlwZVNjcmlwdEFwaUNsaWVudC9Bbmd1bGFyL2FwaS1jbGllbnQvc3RvcmVmcm9udC1jbGllbnQvcHJvamVjdHMvY2xpZW50L3NyYy8iLCJzb3VyY2VzIjpbImxpYi9zdG9yZWZyb250LWFwaS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsd0JBQXdCO0FBQ3hCLG1CQUFtQjtBQUNuQiw0SEFBNEg7QUFDNUgsb0JBQW9CO0FBQ3BCLHdCQUF3QjtBQUN4Qix1Q0FBdUM7QUFFdkMsT0FBTyxFQUFFLFFBQVEsSUFBSSxtQkFBbUIsRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxlQUFlLEVBQUUsVUFBVSxJQUFJLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRS9GLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBUyxjQUFjLENBQUMsQ0FBQztBQUV2RSxNQUFNLE9BQU8sc0JBQXNCO0lBQW5DO1FBRUksV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNaLHVCQUFrQixHQUFXLElBQUksQ0FBQztJQUc5QyxDQUFDO0lBRlMscUJBQXFCOzhEQUFzQixPQUFPLElBQUksQ0FBQyxr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YWJsZSAqL1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyA8YXV0by1nZW5lcmF0ZWQ+XG4vLyAgICAgR2VuZXJhdGVkIHVzaW5nIHRoZSBOU3dhZyB0b29sY2hhaW4gdjEzLjE1LjUuMCAoTkpzb25TY2hlbWEgdjEwLjYuNi4wIChOZXd0b25zb2Z0Lkpzb24gdjExLjAuMC4wKSkgKGh0dHA6Ly9OU3dhZy5vcmcpXG4vLyA8L2F1dG8tZ2VuZXJhdGVkPlxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZVNoYXJwZXIgZGlzYWJsZSBJbmNvbnNpc3RlbnROYW1pbmdcblxuaW1wb3J0IHsgbWVyZ2VNYXAgYXMgX29ic2VydmFibGVNZXJnZU1hcCwgY2F0Y2hFcnJvciBhcyBfb2JzZXJ2YWJsZUNhdGNoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSBhcyBfb2JzZXJ2YWJsZUZyb20sIHRocm93RXJyb3IgYXMgX29ic2VydmFibGVUaHJvdywgb2YgYXMgX29ic2VydmFibGVPZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCwgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UsIEh0dHBSZXNwb25zZUJhc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmV4cG9ydCBjb25zdCBBUElfQkFTRV9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignQVBJX0JBU0VfVVJMJyk7XG5cbmV4cG9ydCBjbGFzcyBBcGlDbGllbnRDb25maWd1cmF0aW9uIHtcbiAgICBhcGlVcmw6IHN0cmluZztcbiAgICBhcGlLZXk6IHN0cmluZyA9ICcnO1xuICAgIHByaXZhdGUgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmcgPSBudWxsO1xuICAgIGFzeW5jIGdldEF1dGhvcml6YXRpb25Ub2tlbigpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gdGhpcy5hdXRob3JpemF0aW9uVG9rZW47IH07XG4gICAgc2V0QXV0aG9yaXphdGlvblRva2VuKHRva2VuOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5hdXRob3JpemF0aW9uVG9rZW4gPSB0b2tlbjsgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwaUNsaWVudEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgeyB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5nZXRBdXRob3JpemF0aW9uVG9rZW4oKTtcbiAgICAgICAgaWYgKHRva2VuICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IChvcHRpb25zLmhlYWRlcnMgYXMgSHR0cEhlYWRlcnMpLmFwcGVuZChcImF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSAob3B0aW9ucy5oZWFkZXJzIGFzIEh0dHBIZWFkZXJzKS5hcHBlbmQoXCJYLUFQSS1LZXlcIiwgdGhpcy5jb25maWd1cmF0aW9uLmFwaUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9vcHRpb25zID0geyAuLi5vcHRpb25zLCB0cmFuc2Zvcm1SZXNwb25zZTogKHJlcykgPT4gcmVzLCByZXNwb25zZVR5cGU6ICdqc29uJyB9O1xuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0QmFzZVVybChkZWZ1bHRVcmw6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmFwaVVybC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLmFwaVVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5hcGlVcmw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRyYW5zZm9ybVJlc3VsdCh1cmw6IHN0cmluZywgcmVzOiBIdHRwUmVzcG9uc2VCYXNlLCBjYjogKHJlczogSHR0cFJlc3BvbnNlQmFzZSkgPT4gT2JzZXJ2YWJsZTxhbnk+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgIHJldHVybiBjYihyZXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQnVpbGRJbmZvQXBpQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzc2VtYmx5IGJ1aWxkIGluZm8uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgaGVhZEluZm8oKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzc2VtYmx5IGJ1aWxkIGluZm8uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SW5mbygpOiBPYnNlcnZhYmxlPEJ1aWxkSW5mb01vZGVsPjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBCdWlsZEluZm9BcGlDbGllbnQgZXh0ZW5kcyBBcGlDbGllbnRCYXNlIGltcGxlbWVudHMgSUJ1aWxkSW5mb0FwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3NlbWJseSBidWlsZCBpbmZvLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGhlYWRJbmZvKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL2luZm9cIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJoZWFkXCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0hlYWRJbmZvKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzSGVhZEluZm8oPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzSGVhZEluZm8ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzc2VtYmx5IGJ1aWxkIGluZm8uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SW5mbygpOiBPYnNlcnZhYmxlPEJ1aWxkSW5mb01vZGVsPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvaW5mb1wiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEluZm8oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRJbmZvKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEJ1aWxkSW5mb01vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEJ1aWxkSW5mb01vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0SW5mbyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPEJ1aWxkSW5mb01vZGVsPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEJ1aWxkSW5mb01vZGVsPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvZHVjdFJlZmVyZW5jZXNBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHN0b3JlZnJvbnQgcHJvZHVjdCByZWZlcmVuY2VzIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFJlZmVyZW5jZSAob3B0aW9uYWwpIFByb2R1Y3QgcmVmZXJlbmNlIGZpbHRlci4gUHJvZHVjdCByZWZlcmVuY2UgaXMgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByb2R1Y3RTcGVjaWZpY2F0aW9uSWQgKG9wdGlvbmFsKSBDdXNvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHNraXAgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2Ugc3RhcnQgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHNvcnRlZCByZXN1bHQgbGlzdC5cbiAgICAgKiBAcGFyYW0gdGFrZSAob3B0aW9uYWwpIERlZmluZXMgcGFnZSBsZW5ndGggKGhvdyBtYW55IGNvbnNlcXVlbnQgaXRlbXMgb2Ygc29ydGVkIHJlc3VsdCBsaXN0IHNob3VsZCBiZSB0YWtlbikuXG4gICAgICogQHBhcmFtIHNvcnRpbmcgKG9wdGlvbmFsKSBEZWZpbmVzIHNvcnRpbmcgb3JkZXIgb2YgcmVzdWx0IGxpc3QgZS5nLjogXCJUaXRsZSBBU0MsIExhc3RNb2RpZmllZCBERVNDXCIuXG4gICAgICogQHBhcmFtIHNlYXJjaCAob3B0aW9uYWwpIFNlYXJjaCBzdHJpbmcgZm9yIHBhcnRpYWwgbWF0Y2guXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0QWxsKHN0b3JlZnJvbnRJZDogbnVtYmVyLCBwcm9kdWN0UmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJvZHVjdFNwZWNpZmljYXRpb25JZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHNraXA/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0YWtlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc29ydGluZz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlByb2R1Y3RSZWZlcmVuY2VEdG8+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENyZWF0ZSBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGUoc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYm9keT86IENyZWF0ZVByb2R1Y3RSZWZlcmVuY2VEdG8gfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9kdWN0UmVmZXJlbmNlRHRvPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0KHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCwgc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvZHVjdFJlZmVyZW5jZUR0bz47XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyB0aGUgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZGVsZXRlKHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCwgc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvZHVjdFJlZmVyZW5jZUR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBieSB0aGUgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0UHJvZHVjdFNwZWNpZmljYXRpb24ocmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsLCBzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3QgcGVyc29uYWxpemF0aW9uIHdvcmtmbG93IGNvbmZpZ3VyYXRpb24gYnkgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0UHJvZHVjdENvbmZpZyhyZWZlcmVuY2U6IHN0cmluZyB8IG51bGwsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3QgY29zdCBkZXRhaWxzIGZyb20gZWNvbW1lcmNlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3QgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc2t1IFByb2R1Y3QgU0tVLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250VXNlcklkIChvcHRpb25hbCkgU3RvcmVmcm9udCB1c2VyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGN1cnJlbmN5Q29kZSAob3B0aW9uYWwpIFByb2R1Y3QgY29zdCBjdXJyZW5jeSBjb2RlLlxuICAgICAqIEBwYXJhbSBxdWFudGl0eSAob3B0aW9uYWwpIFByb2R1Y3QgcXVhbnRpdHkuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0UHJvZHVjdENvc3REZXRhaWxzKHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCwgc2t1OiBzdHJpbmcsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCBzdG9yZWZyb250VXNlcklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgY3VycmVuY3lDb2RlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcXVhbnRpdHk/OiBudW1iZXIgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvZHVjdENvc3REZXRhaWxzRHRvPjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0UmVmZXJlbmNlc0FwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJUHJvZHVjdFJlZmVyZW5jZXNBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHN0b3JlZnJvbnQgcHJvZHVjdCByZWZlcmVuY2VzIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFJlZmVyZW5jZSAob3B0aW9uYWwpIFByb2R1Y3QgcmVmZXJlbmNlIGZpbHRlci4gUHJvZHVjdCByZWZlcmVuY2UgaXMgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByb2R1Y3RTcGVjaWZpY2F0aW9uSWQgKG9wdGlvbmFsKSBDdXNvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHNraXAgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2Ugc3RhcnQgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHNvcnRlZCByZXN1bHQgbGlzdC5cbiAgICAgKiBAcGFyYW0gdGFrZSAob3B0aW9uYWwpIERlZmluZXMgcGFnZSBsZW5ndGggKGhvdyBtYW55IGNvbnNlcXVlbnQgaXRlbXMgb2Ygc29ydGVkIHJlc3VsdCBsaXN0IHNob3VsZCBiZSB0YWtlbikuXG4gICAgICogQHBhcmFtIHNvcnRpbmcgKG9wdGlvbmFsKSBEZWZpbmVzIHNvcnRpbmcgb3JkZXIgb2YgcmVzdWx0IGxpc3QgZS5nLjogXCJUaXRsZSBBU0MsIExhc3RNb2RpZmllZCBERVNDXCIuXG4gICAgICogQHBhcmFtIHNlYXJjaCAob3B0aW9uYWwpIFNlYXJjaCBzdHJpbmcgZm9yIHBhcnRpYWwgbWF0Y2guXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0QWxsKHN0b3JlZnJvbnRJZDogbnVtYmVyLCBwcm9kdWN0UmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJvZHVjdFNwZWNpZmljYXRpb25JZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHNraXA/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0YWtlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc29ydGluZz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlByb2R1Y3RSZWZlcmVuY2VEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9kdWN0LXJlZmVyZW5jZXM/XCI7XG4gICAgICAgIGlmIChzdG9yZWZyb250SWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdG9yZWZyb250SWQnIG11c3QgYmUgZGVmaW5lZCBhbmQgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB1cmxfICs9IFwic3RvcmVmcm9udElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250SWQpICsgXCImXCI7XG4gICAgICAgIGlmIChwcm9kdWN0UmVmZXJlbmNlICE9PSB1bmRlZmluZWQgJiYgcHJvZHVjdFJlZmVyZW5jZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcm9kdWN0UmVmZXJlbmNlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcm9kdWN0UmVmZXJlbmNlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJvZHVjdFNwZWNpZmljYXRpb25JZCAhPT0gdW5kZWZpbmVkICYmIHByb2R1Y3RTcGVjaWZpY2F0aW9uSWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJvZHVjdFNwZWNpZmljYXRpb25JZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJvZHVjdFNwZWNpZmljYXRpb25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNraXAgIT09IHVuZGVmaW5lZCAmJiBza2lwICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInNraXA9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNraXApICsgXCImXCI7XG4gICAgICAgIGlmICh0YWtlICE9PSB1bmRlZmluZWQgJiYgdGFrZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0YWtlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0YWtlKSArIFwiJlwiO1xuICAgICAgICBpZiAoc29ydGluZyAhPT0gdW5kZWZpbmVkICYmIHNvcnRpbmcgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic29ydGluZz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc29ydGluZykgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNlYXJjaCAhPT0gdW5kZWZpbmVkICYmIHNlYXJjaCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzZWFyY2g9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNlYXJjaCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvZHVjdFJlZmVyZW5jZUR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvZHVjdFJlZmVyZW5jZUR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEFsbChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UGFnZWRPZlByb2R1Y3RSZWZlcmVuY2VEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFBhZ2VkT2ZQcm9kdWN0UmVmZXJlbmNlRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlByb2R1Y3RSZWZlcmVuY2VEdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzdG9yZWZyb250IHByb2R1Y3QgcmVmZXJlbmNlLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgQ3JlYXRlIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZShzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogQ3JlYXRlUHJvZHVjdFJlZmVyZW5jZUR0byB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9kdWN0LXJlZmVyZW5jZXM/XCI7XG4gICAgICAgIGlmIChzdG9yZWZyb250SWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdG9yZWZyb250SWQnIG11c3QgYmUgZGVmaW5lZCBhbmQgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB1cmxfICs9IFwic3RvcmVmcm9udElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250SWQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvZHVjdFJlZmVyZW5jZUR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NyZWF0ZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UHJvZHVjdFJlZmVyZW5jZUR0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAxOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAxID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvZHVjdFJlZmVyZW5jZUR0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDEpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxQcm9kdWN0UmVmZXJlbmNlRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzdG9yZWZyb250IHByb2R1Y3QgcmVmZXJlbmNlLlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2UgUHJvZHVjdCByZWZlcmVuY2UgLSBleHRlcm5hbCByZWZlcmVuY2UgdG8gQ3VzdG9tZXIncyBDYW52YXMgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXQocmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsLCBzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9kdWN0UmVmZXJlbmNlRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvZHVjdC1yZWZlcmVuY2VzL3tyZWZlcmVuY2V9P1wiO1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSB1bmRlZmluZWQgfHwgcmVmZXJlbmNlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVmZXJlbmNlJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3JlZmVyZW5jZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZWZlcmVuY2UpKTtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9kdWN0UmVmZXJlbmNlRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2R1Y3RSZWZlcmVuY2VEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvZHVjdFJlZmVyZW5jZUR0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHRoZSBzdG9yZWZyb250IHByb2R1Y3QgcmVmZXJlbmNlLlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2UgUHJvZHVjdCByZWZlcmVuY2UgLSBleHRlcm5hbCByZWZlcmVuY2UgdG8gQ3VzdG9tZXIncyBDYW52YXMgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBkZWxldGUocmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsLCBzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9kdWN0UmVmZXJlbmNlRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvZHVjdC1yZWZlcmVuY2VzL3tyZWZlcmVuY2V9P1wiO1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSB1bmRlZmluZWQgfHwgcmVmZXJlbmNlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVmZXJlbmNlJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3JlZmVyZW5jZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZWZlcmVuY2UpKTtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZGVsZXRlXCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0RlbGV0ZSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0RlbGV0ZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9kdWN0UmVmZXJlbmNlRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NEZWxldGUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2R1Y3RSZWZlcmVuY2VEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2R1Y3RSZWZlcmVuY2VEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvZHVjdFJlZmVyZW5jZUR0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvZHVjdCBzcGVjaWZpY2F0aW9uIGJ5IHRoZSBzdG9yZWZyb250IHByb2R1Y3QgcmVmZXJlbmNlLlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2UgUHJvZHVjdCByZWZlcmVuY2UgLSBleHRlcm5hbCByZWZlcmVuY2UgdG8gQ3VzdG9tZXIncyBDYW52YXMgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRQcm9kdWN0U3BlY2lmaWNhdGlvbihyZWZlcmVuY2U6IHN0cmluZyB8IG51bGwsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvZHVjdC1yZWZlcmVuY2VzL3tyZWZlcmVuY2V9L3Byb2R1Y3Qtc3BlY2lmaWNhdGlvbj9cIjtcbiAgICAgICAgaWYgKHJlZmVyZW5jZSA9PT0gdW5kZWZpbmVkIHx8IHJlZmVyZW5jZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JlZmVyZW5jZScgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntyZWZlcmVuY2V9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmVmZXJlbmNlKSk7XG4gICAgICAgIGlmIChzdG9yZWZyb250SWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdG9yZWZyb250SWQnIG11c3QgYmUgZGVmaW5lZCBhbmQgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB1cmxfICs9IFwic3RvcmVmcm9udElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250SWQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9kdWN0U3BlY2lmaWNhdGlvbig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFByb2R1Y3RTcGVjaWZpY2F0aW9uKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0UHJvZHVjdFNwZWNpZmljYXRpb24ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvZHVjdCBwZXJzb25hbGl6YXRpb24gd29ya2Zsb3cgY29uZmlndXJhdGlvbiBieSBzdG9yZWZyb250IHByb2R1Y3QgcmVmZXJlbmNlLlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2UgUHJvZHVjdCByZWZlcmVuY2UgLSBleHRlcm5hbCByZWZlcmVuY2UgdG8gQ3VzdG9tZXIncyBDYW52YXMgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRQcm9kdWN0Q29uZmlnKHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCwgc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvZHVjdC1yZWZlcmVuY2VzL3tyZWZlcmVuY2V9L3Byb2R1Y3QtY29uZmlnP1wiO1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSB1bmRlZmluZWQgfHwgcmVmZXJlbmNlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVmZXJlbmNlJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3JlZmVyZW5jZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZWZlcmVuY2UpKTtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFByb2R1Y3RDb25maWcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9kdWN0Q29uZmlnKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRQcm9kdWN0Q29uZmlnKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxzdHJpbmc+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3QgY29zdCBkZXRhaWxzIGZyb20gZWNvbW1lcmNlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIFByb2R1Y3QgcmVmZXJlbmNlIC0gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3QgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc2t1IFByb2R1Y3QgU0tVLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250VXNlcklkIChvcHRpb25hbCkgU3RvcmVmcm9udCB1c2VyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGN1cnJlbmN5Q29kZSAob3B0aW9uYWwpIFByb2R1Y3QgY29zdCBjdXJyZW5jeSBjb2RlLlxuICAgICAqIEBwYXJhbSBxdWFudGl0eSAob3B0aW9uYWwpIFByb2R1Y3QgcXVhbnRpdHkuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0UHJvZHVjdENvc3REZXRhaWxzKHJlZmVyZW5jZTogc3RyaW5nIHwgbnVsbCwgc2t1OiBzdHJpbmcsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCBzdG9yZWZyb250VXNlcklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgY3VycmVuY3lDb2RlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcXVhbnRpdHk/OiBudW1iZXIgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvZHVjdENvc3REZXRhaWxzRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvZHVjdC1yZWZlcmVuY2VzL3tyZWZlcmVuY2V9L3Byb2R1Y3QtY29zdC1kZXRhaWxzP1wiO1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSB1bmRlZmluZWQgfHwgcmVmZXJlbmNlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVmZXJlbmNlJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3JlZmVyZW5jZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZWZlcmVuY2UpKTtcbiAgICAgICAgaWYgKHNrdSA9PT0gdW5kZWZpbmVkIHx8IHNrdSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3NrdScgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJza3U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNrdSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRVc2VySWQgIT09IHVuZGVmaW5lZCAmJiBzdG9yZWZyb250VXNlcklkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRVc2VySWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRVc2VySWQpICsgXCImXCI7XG4gICAgICAgIGlmIChjdXJyZW5jeUNvZGUgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW5jeUNvZGUgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiY3VycmVuY3lDb2RlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjdXJyZW5jeUNvZGUpICsgXCImXCI7XG4gICAgICAgIGlmIChxdWFudGl0eSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3F1YW50aXR5JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHF1YW50aXR5ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicXVhbnRpdHk9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHF1YW50aXR5KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0UHJvZHVjdENvc3REZXRhaWxzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0UHJvZHVjdENvc3REZXRhaWxzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2R1Y3RDb3N0RGV0YWlsc0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9kdWN0Q29zdERldGFpbHNEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRQcm9kdWN0Q29zdERldGFpbHMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2R1Y3RDb3N0RGV0YWlsc0R0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvZHVjdENvc3REZXRhaWxzRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFByb2R1Y3RDb3N0RGV0YWlsc0R0bz4oPGFueT5udWxsKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb2R1Y3RTcGVjaWZpY2F0aW9uc0FwaUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgcHJvZHVjdCBzcGVjaWZpY2F0aW9ucywgcmVsZXZhbnQgdG8gdGhlIHNwZWNpZmllZCBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBza2lwIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIHN0YXJ0IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3QuXG4gICAgICogQHBhcmFtIHRha2UgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2UgbGVuZ3RoIChob3cgbWFueSBjb25zZXF1ZW50IGl0ZW1zIG9mIHNvcnRlZCByZXN1bHQgbGlzdCBzaG91bGQgYmUgdGFrZW4pLlxuICAgICAqIEBwYXJhbSBzb3J0aW5nIChvcHRpb25hbCkgRGVmaW5lcyBzb3J0aW5nIG9yZGVyIG9mIHJlc3VsdCBsaXN0IGUuZy46IFwiVGl0bGUgQVNDLCBMYXN0TW9kaWZpZWQgREVTQ1wiLlxuICAgICAqIEBwYXJhbSBzZWFyY2ggKG9wdGlvbmFsKSBTZWFyY2ggc3RyaW5nIGZvciBwYXJ0aWFsIG1hdGNoLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEFsbChza2lwPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGFrZT86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHNvcnRpbmc/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzZWFyY2g/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBQcm9kdWN0IHNwZWNpZmljYXRpb24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXQoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2R1Y3QgcGVyc29ubGl6YXRpb24gd29ya2Zsb3cgY29uZmlndXJhdGlvbiBieSBwcm9kdWN0IHNwZWNpZmljYXRpb24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgUHJvZHVjdCBzcGVjaWZpY2F0aW9uIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q29uZmlndXJhdGlvbihpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdFNwZWNpZmljYXRpb25zQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElQcm9kdWN0U3BlY2lmaWNhdGlvbnNBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbnMsIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gc2tpcCAob3B0aW9uYWwpIERlZmluZXMgcGFnZSBzdGFydCBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc29ydGVkIHJlc3VsdCBsaXN0LlxuICAgICAqIEBwYXJhbSB0YWtlIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIGxlbmd0aCAoaG93IG1hbnkgY29uc2VxdWVudCBpdGVtcyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3Qgc2hvdWxkIGJlIHRha2VuKS5cbiAgICAgKiBAcGFyYW0gc29ydGluZyAob3B0aW9uYWwpIERlZmluZXMgc29ydGluZyBvcmRlciBvZiByZXN1bHQgbGlzdCBlLmcuOiBcIlRpdGxlIEFTQywgTGFzdE1vZGlmaWVkIERFU0NcIi5cbiAgICAgKiBAcGFyYW0gc2VhcmNoIChvcHRpb25hbCkgU2VhcmNoIHN0cmluZyBmb3IgcGFydGlhbCBtYXRjaC5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGwoc2tpcD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHRha2U/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3J0aW5nPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2VhcmNoPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQYWdlZE9mUHJvZHVjdFNwZWNpZmljYXRpb25EdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9kdWN0LXNwZWNpZmljYXRpb25zP1wiO1xuICAgICAgICBpZiAoc2tpcCAhPT0gdW5kZWZpbmVkICYmIHNraXAgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic2tpcD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc2tpcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRha2UgIT09IHVuZGVmaW5lZCAmJiB0YWtlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRha2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRha2UpICsgXCImXCI7XG4gICAgICAgIGlmIChzb3J0aW5nICE9PSB1bmRlZmluZWQgJiYgc29ydGluZyAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzb3J0aW5nPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzb3J0aW5nKSArIFwiJlwiO1xuICAgICAgICBpZiAoc2VhcmNoICE9PSB1bmRlZmluZWQgJiYgc2VhcmNoICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInNlYXJjaD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc2VhcmNoKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0QWxsKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0QWxsKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvZHVjdFNwZWNpZmljYXRpb25EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRBbGwocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UGFnZWRPZlByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9kdWN0IHNwZWNpZmljYXRpb24gYnkgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgUHJvZHVjdCBzcGVjaWZpY2F0aW9uIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0KGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvZHVjdFNwZWNpZmljYXRpb25EdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9kdWN0LXNwZWNpZmljYXRpb25zL3tpZH0/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9kdWN0U3BlY2lmaWNhdGlvbkR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UHJvZHVjdFNwZWNpZmljYXRpb25EdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9kdWN0IHBlcnNvbmxpemF0aW9uIHdvcmtmbG93IGNvbmZpZ3VyYXRpb24gYnkgcHJvZHVjdCBzcGVjaWZpY2F0aW9uIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGlkIFByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbmZpZ3VyYXRpb24oaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9kdWN0LXNwZWNpZmljYXRpb25zL3tpZH0vY29uZmlnP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDb25maWd1cmF0aW9uKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q29uZmlndXJhdGlvbig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0Q29uZmlndXJhdGlvbihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvamVjdHNBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHByb2plY3RzLCByZWxldmFudCB0byB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIG93bmVySWQgKG9wdGlvbmFsKSBQcm9qZWN0IG93bmVyIChzdG9yZWZyb250IHVzZXIgaWQpIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFJlZmVyZW5jZSAob3B0aW9uYWwpIFByb2R1Y3QgcmVmZXJlbmNlIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gc3RhdHVzIChvcHRpb25hbCkgUHJvamVjdCBzdGF0dXMgZmlsdGVyLlxuICAgICAqIEBwYXJhbSBkYXRlUGVyaW9kIChvcHRpb25hbCkgUHJvamVjdCBkYXRlIHBlcmlvZCBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHNraXAgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2Ugc3RhcnQgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHNvcnRlZCByZXN1bHQgbGlzdC5cbiAgICAgKiBAcGFyYW0gdGFrZSAob3B0aW9uYWwpIERlZmluZXMgcGFnZSBsZW5ndGggKGhvdyBtYW55IGNvbnNlcXVlbnQgaXRlbXMgb2Ygc29ydGVkIHJlc3VsdCBsaXN0IHNob3VsZCBiZSB0YWtlbikuXG4gICAgICogQHBhcmFtIHNvcnRpbmcgKG9wdGlvbmFsKSBEZWZpbmVzIHNvcnRpbmcgb3JkZXIgb2YgcmVzdWx0IGxpc3QgZS5nLjogXCJUaXRsZSBBU0MsIExhc3RNb2RpZmllZCBERVNDXCIuXG4gICAgICogQHBhcmFtIHNlYXJjaCAob3B0aW9uYWwpIFNlYXJjaCBzdHJpbmcgZm9yIHBhcnRpYWwgbWF0Y2guXG4gICAgICogQHBhcmFtIG9yZGVySWQgKG9wdGlvbmFsKSBJZGVudGlmaWVyIG9mIGNvcnJlc3BvbmRpbmcgb3JkZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCAob3B0aW9uYWwpIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGwob3duZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHByb2R1Y3RSZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzdGF0dXM/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBkYXRlUGVyaW9kPzogRGF0ZVBlcmlvZCB8IHVuZGVmaW5lZCwgc2tpcD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHRha2U/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3J0aW5nPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2VhcmNoPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgb3JkZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHN0b3JlZnJvbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlByb2plY3REdG8+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdC5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENyZWF0ZSBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGUoc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYm9keT86IENyZWF0ZVByb2plY3REdG8gfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9qZWN0RHRvPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvamVjdCBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0KGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvamVjdER0bz47XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHByb2plY3QgYnkgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGRlbGV0ZShpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9qZWN0IHByZXZpZXcgZmlsZSBieSBwcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGlkIFByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRQcmV2aWV3KGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvamVjdCBwcmV2aWV3IFVSTCBieSBwcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGlkIFByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRQcmV2aWV3VXJsKGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2plY3QgYnkgJ1JlbmRlciBIaVJlcycgc2NlbmFyaW8uXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBDcmVhdGUgb3BlcmF0aW9uIHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3JlYXRlQnlSZW5kZXJIaVJlc1NjZW5hcmlvKHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGJvZHk/OiBDcmVhdGVQcm9qZWN0QnlSZW5kZXJIaVJlc1NjZW5hcmlvRHRvIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvamVjdER0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHN0YXR1cyB0cmFuc2l0aW9ucyBmb3IgYSBwcm9qZWN0LlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0QXZhaWxhYmxlVHJhbnNpdGlvbnMoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQYWdlZE9mUHJvamVjdFRyYW5zaXRpb25EdG8+O1xuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIHByb2plY3Qgc3RhdHVzLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbiBUcmFuc2l0aW9uIGlkZW50aWZ5aW5nIG5hbWUuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY2hhbmdlU3RhdHVzKGlkOiBudW1iZXIsIHRyYW5zaXRpb246IHN0cmluZyB8IG51bGwsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvamVjdFN0YXR1c0R0bz47XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgcHJvamVjdCBzdGF0dXMgZm9yY2libHkgd2l0aG91dCBhIHByb3BlciB0cmFuc2l0aW9uLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0YXR1cyBQcm9qZWN0IHN0YXR1cyBjb2RlLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvcmNlU3RhdHVzKGlkOiBudW1iZXIsIHN0YXR1czogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3RTdGF0dXNEdG8+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBleGlzdGluZyBwcm9qZWN0IHN0YXR1c2VzLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEFsbFN0YXR1c2VzKHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlByb2plY3RTdGF0dXNEdG8+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBleGlzdGluZyBwcm9qZWN0IHN0YXR1cyB0cmFuc2l0aW9ucy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGxUcmFuc2l0aW9ucyh0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0VHJhbnNpdGlvbkR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiB1cmwgdG8gZG93bmxvYWQgcHJvamVjdCBwcmludCBmaWxlLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGRlc2lnblVzZXJJZCBEZXNpZ24gb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gZGVzaWduSWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBnZXRQcm9qZWN0UGRmVXJsKGlkOiBudW1iZXIsIGRlc2lnblVzZXJJZDogc3RyaW5nLCBkZXNpZ25JZDogc3RyaW5nLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3RQZGZSZXN1bHREdG8+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJjaGl2ZSBmaWxlLCB3aGljaCBjb250YWlucyBhbGwgcHJvamVjdCBwcmludCBmaWxlcy5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBkZXNpZ25Vc2VySWQgRGVzaWduIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGRlc2lnbklkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgdGhlIHJlcXVlc3RlZCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHByb3BlciBmaWxlbmFtZSBzdXBwbGllZCAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldFByb2plY3RQZGZaaXAoaWQ6IG51bWJlciwgZGVzaWduVXNlcklkOiBzdHJpbmcsIGRlc2lnbklkOiBzdHJpbmcsIGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9qZWN0IHByb2Nlc3NpbmcgcmVzdWx0cy5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFByb2plY3RQcm9jZXNzaW5nUmVzdWx0cyhpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3RQcm9jZXNzaW5nUmVzdWx0c0R0bz47XG4gICAgLyoqXG4gICAgICogUmVzdW1lcyBwcm9qZWN0IHByb2Nlc3NpbmcuXG4gICAgICogQHBhcmFtIGlkIFByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXN1bWVQcm9qZWN0UHJvY2Vzc2luZyhpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIFJlc3RhcnRzIGEgcHJvamVjdCBwcm9jZXNzaW5nIHJvdXRpbmUuXG4gICAgICogQHBhcmFtIGlkIFByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXN0YXJ0UHJvamVjdFByb2Nlc3NpbmcoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIG9yZGVyIGRlc2NyaXB0aW9uIGZyb20gdGhlIGVjb21tZXJjZSBzeXN0ZW0gZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFByb2plY3RPcmRlcihpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQXR0YWNocyB0aGUgc3BlY2lmaWVkIGRhdGEgdG8gdGhlIHByb2plY3QncyBvcmRlciBpbiBlY29tbWVyY2Ugc3lzdGVtLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBBIGxpc3Qgb2YgZGF0YSBpdGVtcywgd2hpY2ggc2hvdWxkIGJlIGF0dGFjaGVkIHRvIHByb2plY3QncyBvcmRlci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBhdHRhY2hEYXRhVG9Qcm9qZWN0T3JkZXIoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogT3JkZXJEYXRhSXRlbUR0b1tdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJvamVjdHNBcGlDbGllbnQgZXh0ZW5kcyBBcGlDbGllbnRCYXNlIGltcGxlbWVudHMgSVByb2plY3RzQXBpQ2xpZW50IHtcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQ7XG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIGpzb25QYXJzZVJldml2ZXI6ICgoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IGFueSkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEFwaUNsaWVudENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb246IEFwaUNsaWVudENvbmZpZ3VyYXRpb24sIEBJbmplY3QoSHR0cENsaWVudCkgaHR0cDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChBUElfQkFTRV9VUkwpIGJhc2VVcmw/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmwgIT09IHVuZGVmaW5lZCAmJiBiYXNlVXJsICE9PSBudWxsID8gYmFzZVVybCA6IHRoaXMuZ2V0QmFzZVVybChcIlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBwcm9qZWN0cywgcmVsZXZhbnQgdG8gdGhlIHNwZWNpZmllZCBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBvd25lcklkIChvcHRpb25hbCkgUHJvamVjdCBvd25lciAoc3RvcmVmcm9udCB1c2VyIGlkKSBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHByb2R1Y3RSZWZlcmVuY2UgKG9wdGlvbmFsKSBQcm9kdWN0IHJlZmVyZW5jZSBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHN0YXR1cyAob3B0aW9uYWwpIFByb2plY3Qgc3RhdHVzIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gZGF0ZVBlcmlvZCAob3B0aW9uYWwpIFByb2plY3QgZGF0ZSBwZXJpb2QgZmlsdGVyLlxuICAgICAqIEBwYXJhbSBza2lwIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIHN0YXJ0IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3QuXG4gICAgICogQHBhcmFtIHRha2UgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2UgbGVuZ3RoIChob3cgbWFueSBjb25zZXF1ZW50IGl0ZW1zIG9mIHNvcnRlZCByZXN1bHQgbGlzdCBzaG91bGQgYmUgdGFrZW4pLlxuICAgICAqIEBwYXJhbSBzb3J0aW5nIChvcHRpb25hbCkgRGVmaW5lcyBzb3J0aW5nIG9yZGVyIG9mIHJlc3VsdCBsaXN0IGUuZy46IFwiVGl0bGUgQVNDLCBMYXN0TW9kaWZpZWQgREVTQ1wiLlxuICAgICAqIEBwYXJhbSBzZWFyY2ggKG9wdGlvbmFsKSBTZWFyY2ggc3RyaW5nIGZvciBwYXJ0aWFsIG1hdGNoLlxuICAgICAqIEBwYXJhbSBvcmRlcklkIChvcHRpb25hbCkgSWRlbnRpZmllciBvZiBjb3JyZXNwb25kaW5nIG9yZGVyLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgKG9wdGlvbmFsKSBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0QWxsKG93bmVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBwcm9kdWN0UmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc3RhdHVzPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGF0ZVBlcmlvZD86IERhdGVQZXJpb2QgfCB1bmRlZmluZWQsIHNraXA/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0YWtlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc29ydGluZz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIG9yZGVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzdG9yZWZyb250SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0RHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHM/XCI7XG4gICAgICAgIGlmIChvd25lcklkICE9PSB1bmRlZmluZWQgJiYgb3duZXJJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvd25lcklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBvd25lcklkKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJvZHVjdFJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkICYmIHByb2R1Y3RSZWZlcmVuY2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJvZHVjdFJlZmVyZW5jZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJvZHVjdFJlZmVyZW5jZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1cyAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdGF0dXM9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0YXR1cykgKyBcIiZcIjtcbiAgICAgICAgaWYgKGRhdGVQZXJpb2QgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdkYXRlUGVyaW9kJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGRhdGVQZXJpb2QgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJkYXRlUGVyaW9kPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBkYXRlUGVyaW9kKSArIFwiJlwiO1xuICAgICAgICBpZiAoc2tpcCAhPT0gdW5kZWZpbmVkICYmIHNraXAgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic2tpcD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc2tpcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRha2UgIT09IHVuZGVmaW5lZCAmJiB0YWtlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRha2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRha2UpICsgXCImXCI7XG4gICAgICAgIGlmIChzb3J0aW5nICE9PSB1bmRlZmluZWQgJiYgc29ydGluZyAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzb3J0aW5nPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzb3J0aW5nKSArIFwiJlwiO1xuICAgICAgICBpZiAoc2VhcmNoICE9PSB1bmRlZmluZWQgJiYgc2VhcmNoICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInNlYXJjaD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc2VhcmNoKSArIFwiJlwiO1xuICAgICAgICBpZiAob3JkZXJJZCAhPT0gdW5kZWZpbmVkICYmIG9yZGVySWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwib3JkZXJJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgb3JkZXJJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCAhPT0gdW5kZWZpbmVkICYmIHN0b3JlZnJvbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvamVjdER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvamVjdER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEFsbChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UGFnZWRPZlByb2plY3REdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFBhZ2VkT2ZQcm9qZWN0RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlByb2plY3REdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0LlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgQ3JlYXRlIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZShzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogQ3JlYXRlUHJvamVjdER0byB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3REdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cz9cIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGUoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGUoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvamVjdER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9qZWN0RHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ3JlYXRlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxQcm9qZWN0RHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDE6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDEgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9qZWN0RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvamVjdER0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvamVjdCBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0KGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvamVjdER0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3Byb2plY3RzL3tpZH0/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9qZWN0RHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2plY3REdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2plY3REdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2plY3REdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvamVjdER0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcHJvamVjdCBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZGVsZXRlKGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3Byb2plY3RzL3tpZH0/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImRlbGV0ZVwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NEZWxldGUoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NEZWxldGUoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRGVsZXRlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb2plY3QgcHJldmlldyBmaWxlIGJ5IHByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFByZXZpZXcoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L3ByZXZpZXc/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcmV2aWV3KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRQcmV2aWV3KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9qZWN0IHByZXZpZXcgVVJMIGJ5IHByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFByZXZpZXdVcmwoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L3ByZXZpZXctdXJsP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcmV2aWV3VXJsKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0UHJldmlld1VybCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0UHJldmlld1VybChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+X3Jlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5fcmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdCBieSAnUmVuZGVyIEhpUmVzJyBzY2VuYXJpby5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENyZWF0ZSBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGVCeVJlbmRlckhpUmVzU2NlbmFyaW8oc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYm9keT86IENyZWF0ZVByb2plY3RCeVJlbmRlckhpUmVzU2NlbmFyaW9EdG8gfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9qZWN0RHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHMvYnktc2NlbmFyaW8vcmVuZGVyLWhpcmVzP1wiO1xuICAgICAgICBpZiAoc3RvcmVmcm9udElkID09PSB1bmRlZmluZWQgfHwgc3RvcmVmcm9udElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3RvcmVmcm9udElkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3RvcmVmcm9udElkKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZUJ5UmVuZGVySGlSZXNTY2VuYXJpbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZUJ5UmVuZGVySGlSZXNTY2VuYXJpbyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9qZWN0RHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2plY3REdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDcmVhdGVCeVJlbmRlckhpUmVzU2NlbmFyaW8ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2plY3REdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2plY3REdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAxKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA5OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA5ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQ29uZmxpY3RcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxQcm9qZWN0RHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSBzdGF0dXMgdHJhbnNpdGlvbnMgZm9yIGEgcHJvamVjdC5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEF2YWlsYWJsZVRyYW5zaXRpb25zKGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHMve2lkfS90cmFuc2l0aW9ucz9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0QXZhaWxhYmxlVHJhbnNpdGlvbnMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBdmFpbGFibGVUcmFuc2l0aW9ucyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvamVjdFRyYW5zaXRpb25EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0QXZhaWxhYmxlVHJhbnNpdGlvbnMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0VHJhbnNpdGlvbkR0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkJhZCBSZXF1ZXN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDk6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDkgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9qZWN0VHJhbnNpdGlvbkNvbmZsaWN0RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIHByb2plY3Qgc3RhdHVzLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbiBUcmFuc2l0aW9uIGlkZW50aWZ5aW5nIG5hbWUuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY2hhbmdlU3RhdHVzKGlkOiBudW1iZXIsIHRyYW5zaXRpb246IHN0cmluZyB8IG51bGwsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UHJvamVjdFN0YXR1c0R0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3Byb2plY3RzL3tpZH0vdHJhbnNpdGlvbnMve3RyYW5zaXRpb259P1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0cmFuc2l0aW9uID09PSB1bmRlZmluZWQgfHwgdHJhbnNpdGlvbiA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RyYW5zaXRpb24nIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dHJhbnNpdGlvbn1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0cmFuc2l0aW9uKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ2hhbmdlU3RhdHVzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ2hhbmdlU3RhdHVzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2plY3RTdGF0dXNEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvamVjdFN0YXR1c0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NoYW5nZVN0YXR1cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UHJvamVjdFN0YXR1c0R0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvamVjdFN0YXR1c0R0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJCYWQgUmVxdWVzdFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA5OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA5ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvamVjdFRyYW5zaXRpb25Db25mbGljdER0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJDb25mbGljdFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFByb2plY3RTdGF0dXNEdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgcHJvamVjdCBzdGF0dXMgZm9yY2libHkgd2l0aG91dCBhIHByb3BlciB0cmFuc2l0aW9uLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0YXR1cyBQcm9qZWN0IHN0YXR1cyBjb2RlLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvcmNlU3RhdHVzKGlkOiBudW1iZXIsIHN0YXR1czogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3RTdGF0dXNEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L3N0YXR1c2VzL3tzdGF0dXN9P1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IHVuZGVmaW5lZCB8fCBzdGF0dXMgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdGF0dXMnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7c3RhdHVzfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0YXR1cykpO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ZvcmNlU3RhdHVzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRm9yY2VTdGF0dXMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvamVjdFN0YXR1c0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQcm9qZWN0U3RhdHVzRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRm9yY2VTdGF0dXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2plY3RTdGF0dXNEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2plY3RTdGF0dXNEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQmFkIFJlcXVlc3RcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvamVjdFN0YXR1c0R0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZXhpc3RpbmcgcHJvamVjdCBzdGF0dXNlcy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGxTdGF0dXNlcyh0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHMvc3RhdHVzZXM/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBbGxTdGF0dXNlcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbFN0YXR1c2VzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0QWxsU3RhdHVzZXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQYWdlZE9mUHJvamVjdFN0YXR1c0R0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBleGlzdGluZyBwcm9qZWN0IHN0YXR1cyB0cmFuc2l0aW9ucy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGxUcmFuc2l0aW9ucyh0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0VHJhbnNpdGlvbkR0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3Byb2plY3RzL3RyYW5zaXRpb25zP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0QWxsVHJhbnNpdGlvbnMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBbGxUcmFuc2l0aW9ucyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mUHJvamVjdFRyYW5zaXRpb25EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0QWxsVHJhbnNpdGlvbnMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZQcm9qZWN0VHJhbnNpdGlvbkR0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlByb2plY3RUcmFuc2l0aW9uRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gdXJsIHRvIGRvd25sb2FkIHByb2plY3QgcHJpbnQgZmlsZS5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBkZXNpZ25Vc2VySWQgRGVzaWduIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGRlc2lnbklkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0UHJvamVjdFBkZlVybChpZDogbnVtYmVyLCBkZXNpZ25Vc2VySWQ6IHN0cmluZywgZGVzaWduSWQ6IHN0cmluZywgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQcm9qZWN0UGRmUmVzdWx0RHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHMve2lkfS9wcm9qZWN0LXBkZj9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAoZGVzaWduVXNlcklkID09PSB1bmRlZmluZWQgfHwgZGVzaWduVXNlcklkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZGVzaWduVXNlcklkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcImRlc2lnblVzZXJJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZGVzaWduVXNlcklkKSArIFwiJlwiO1xuICAgICAgICBpZiAoZGVzaWduSWQgPT09IHVuZGVmaW5lZCB8fCBkZXNpZ25JZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2Rlc2lnbklkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcImRlc2lnbklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBkZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFByb2plY3RQZGZVcmwoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0UGRmVXJsKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2plY3RQZGZSZXN1bHREdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvamVjdFBkZlJlc3VsdER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFByb2plY3RQZGZVcmwocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFByb2plY3RQZGZSZXN1bHREdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2plY3RQZGZSZXN1bHREdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxQcm9qZWN0UGRmUmVzdWx0RHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJjaGl2ZSBmaWxlLCB3aGljaCBjb250YWlucyBhbGwgcHJvamVjdCBwcmludCBmaWxlcy5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBkZXNpZ25Vc2VySWQgRGVzaWduIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGRlc2lnbklkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgdGhlIHJlcXVlc3RlZCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHByb3BlciBmaWxlbmFtZSBzdXBwbGllZCAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldFByb2plY3RQZGZaaXAoaWQ6IG51bWJlciwgZGVzaWduVXNlcklkOiBzdHJpbmcsIGRlc2lnbklkOiBzdHJpbmcsIGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L3Byb2plY3QtcGRmLXppcD9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAoZGVzaWduVXNlcklkID09PSB1bmRlZmluZWQgfHwgZGVzaWduVXNlcklkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZGVzaWduVXNlcklkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcImRlc2lnblVzZXJJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZGVzaWduVXNlcklkKSArIFwiJlwiO1xuICAgICAgICBpZiAoZGVzaWduSWQgPT09IHVuZGVmaW5lZCB8fCBkZXNpZ25JZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2Rlc2lnbklkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcImRlc2lnbklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBkZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQgIT09IHVuZGVmaW5lZCAmJiBhdHRhY2htZW50ICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImF0dGFjaG1lbnQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGF0dGFjaG1lbnQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFByb2plY3RQZGZaaXAoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0UGRmWmlwKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRQcm9qZWN0UGRmWmlwKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9qZWN0IHByb2Nlc3NpbmcgcmVzdWx0cy5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFByb2plY3RQcm9jZXNzaW5nUmVzdWx0cyhpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFByb2plY3RQcm9jZXNzaW5nUmVzdWx0c0R0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3Byb2plY3RzL3tpZH0vcHJvY2Vzc2luZy1yZXN1bHRzP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0UHJvY2Vzc2luZ1Jlc3VsdHMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0UHJvY2Vzc2luZ1Jlc3VsdHMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UHJvamVjdFByb2Nlc3NpbmdSZXN1bHRzRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFByb2plY3RQcm9jZXNzaW5nUmVzdWx0c0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFByb2plY3RQcm9jZXNzaW5nUmVzdWx0cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UHJvamVjdFByb2Nlc3NpbmdSZXN1bHRzRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9qZWN0UHJvY2Vzc2luZ1Jlc3VsdHNEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UHJvamVjdFByb2Nlc3NpbmdSZXN1bHRzRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3VtZXMgcHJvamVjdCBwcm9jZXNzaW5nLlxuICAgICAqIEBwYXJhbSBpZCBQcm9qZWN0IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVzdW1lUHJvamVjdFByb2Nlc3NpbmcoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvcHJvamVjdHMve2lkfS9yZXN1bWUtcHJvY2Vzc2luZz9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXN1bWVQcm9qZWN0UHJvY2Vzc2luZyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1Jlc3VtZVByb2plY3RQcm9jZXNzaW5nKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1Jlc3VtZVByb2plY3RQcm9jZXNzaW5nKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdGFydHMgYSBwcm9qZWN0IHByb2Nlc3Npbmcgcm91dGluZS5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlc3RhcnRQcm9qZWN0UHJvY2Vzc2luZyhpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L3Jlc3RhcnQtcHJvY2Vzc2luZz9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXN0YXJ0UHJvamVjdFByb2Nlc3NpbmcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXN0YXJ0UHJvamVjdFByb2Nlc3NpbmcoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVzdGFydFByb2plY3RQcm9jZXNzaW5nKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvcmRlciBkZXNjcmlwdGlvbiBmcm9tIHRoZSBlY29tbWVyY2Ugc3lzdGVtIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICogQHBhcmFtIGlkIFByb2plY3QgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRQcm9qZWN0T3JkZXIoaWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L29yZGVyP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0T3JkZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRQcm9qZWN0T3JkZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFByb2plY3RPcmRlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaHMgdGhlIHNwZWNpZmllZCBkYXRhIHRvIHRoZSBwcm9qZWN0J3Mgb3JkZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS5cbiAgICAgKiBAcGFyYW0gaWQgUHJvamVjdCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgQSBsaXN0IG9mIGRhdGEgaXRlbXMsIHdoaWNoIHNob3VsZCBiZSBhdHRhY2hlZCB0byBwcm9qZWN0J3Mgb3JkZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgYXR0YWNoRGF0YVRvUHJvamVjdE9yZGVyKGlkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYm9keT86IE9yZGVyRGF0YUl0ZW1EdG9bXSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9wcm9qZWN0cy97aWR9L29yZGVyLWRhdGE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvblwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQXR0YWNoRGF0YVRvUHJvamVjdE9yZGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQXR0YWNoRGF0YVRvUHJvamVjdE9yZGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0F0dGFjaERhdGFUb1Byb2plY3RPcmRlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3RvcmVmcm9udHNBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHN0b3JlZnJvbnRzLCByZWxldmFudCB0byB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIHR5cGVzIChvcHRpb25hbCkgU3RvcmVmcm9udCB0eXBlIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gc2tpcCAob3B0aW9uYWwpIERlZmluZXMgcGFnZSBzdGFydCBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc29ydGVkIHJlc3VsdCBsaXN0LlxuICAgICAqIEBwYXJhbSB0YWtlIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIGxlbmd0aCAoaG93IG1hbnkgY29uc2VxdWVudCBpdGVtcyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3Qgc2hvdWxkIGJlIHRha2VuKS5cbiAgICAgKiBAcGFyYW0gc29ydGluZyAob3B0aW9uYWwpIERlZmluZXMgc29ydGluZyBvcmRlciBvZiByZXN1bHQgbGlzdCBlLmcuOiBcIlRpdGxlIEFTQywgTGFzdE1vZGlmaWVkIERFU0NcIi5cbiAgICAgKiBAcGFyYW0gc2VhcmNoIChvcHRpb25hbCkgU2VhcmNoIHN0cmluZyBmb3IgcGFydGlhbCBtYXRjaC5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBbGwodHlwZXM/OiBTdG9yZWZyb250VHlwZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2tpcD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHRha2U/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3J0aW5nPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2VhcmNoPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxQYWdlZE9mU3RvcmVmcm9udER0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0b3JlZnJvbnQgYnkgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldChpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFN0b3JlZnJvbnREdG8+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFN0b3JlZnJvbnRzQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElTdG9yZWZyb250c0FwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgc3RvcmVmcm9udHMsIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gdHlwZXMgKG9wdGlvbmFsKSBTdG9yZWZyb250IHR5cGUgZmlsdGVyLlxuICAgICAqIEBwYXJhbSBza2lwIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIHN0YXJ0IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3QuXG4gICAgICogQHBhcmFtIHRha2UgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2UgbGVuZ3RoIChob3cgbWFueSBjb25zZXF1ZW50IGl0ZW1zIG9mIHNvcnRlZCByZXN1bHQgbGlzdCBzaG91bGQgYmUgdGFrZW4pLlxuICAgICAqIEBwYXJhbSBzb3J0aW5nIChvcHRpb25hbCkgRGVmaW5lcyBzb3J0aW5nIG9yZGVyIG9mIHJlc3VsdCBsaXN0IGUuZy46IFwiVGl0bGUgQVNDLCBMYXN0TW9kaWZpZWQgREVTQ1wiLlxuICAgICAqIEBwYXJhbSBzZWFyY2ggKG9wdGlvbmFsKSBTZWFyY2ggc3RyaW5nIGZvciBwYXJ0aWFsIG1hdGNoLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEFsbCh0eXBlcz86IFN0b3JlZnJvbnRUeXBlW10gfCBudWxsIHwgdW5kZWZpbmVkLCBza2lwPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGFrZT86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHNvcnRpbmc/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzZWFyY2g/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFBhZ2VkT2ZTdG9yZWZyb250RHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvc3RvcmVmcm9udHM/XCI7XG4gICAgICAgIGlmICh0eXBlcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVzICE9PSBudWxsKVxuICAgICAgICAgICAgdHlwZXMgJiYgdHlwZXMuZm9yRWFjaChpdGVtID0+IHsgdXJsXyArPSBcInR5cGVzPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpdGVtKSArIFwiJlwiOyB9KTtcbiAgICAgICAgaWYgKHNraXAgIT09IHVuZGVmaW5lZCAmJiBza2lwICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInNraXA9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNraXApICsgXCImXCI7XG4gICAgICAgIGlmICh0YWtlICE9PSB1bmRlZmluZWQgJiYgdGFrZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0YWtlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0YWtlKSArIFwiJlwiO1xuICAgICAgICBpZiAoc29ydGluZyAhPT0gdW5kZWZpbmVkICYmIHNvcnRpbmcgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic29ydGluZz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc29ydGluZykgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNlYXJjaCAhPT0gdW5kZWZpbmVkICYmIHNlYXJjaCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzZWFyY2g9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNlYXJjaCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFsbCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mU3RvcmVmcm9udER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxQYWdlZE9mU3RvcmVmcm9udER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEFsbChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UGFnZWRPZlN0b3JlZnJvbnREdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFBhZ2VkT2ZTdG9yZWZyb250RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UGFnZWRPZlN0b3JlZnJvbnREdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0b3JlZnJvbnQgYnkgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gaWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldChpZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFN0b3JlZnJvbnREdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9zdG9yZWZyb250cy97aWR9P1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXQoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8U3RvcmVmcm9udER0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxTdG9yZWZyb250RHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxTdG9yZWZyb250RHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxTdG9yZWZyb250RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFN0b3JlZnJvbnREdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdG9yZWZyb250VXNlcnNBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHN0b3JlZnJvbnQgdXNlcnMsIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udFVzZXJJZCAob3B0aW9uYWwpIFN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBza2lwIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIHN0YXJ0IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3QuXG4gICAgICogQHBhcmFtIHRha2UgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2UgbGVuZ3RoIChob3cgbWFueSBjb25zZXF1ZW50IGl0ZW1zIG9mIHNvcnRlZCByZXN1bHQgbGlzdCBzaG91bGQgYmUgdGFrZW4pLlxuICAgICAqIEBwYXJhbSBzb3J0aW5nIChvcHRpb25hbCkgRGVmaW5lcyBzb3J0aW5nIG9yZGVyIG9mIHJlc3VsdCBsaXN0IGUuZy46IFwiVGl0bGUgQVNDLCBMYXN0TW9kaWZpZWQgREVTQ1wiLlxuICAgICAqIEBwYXJhbSBzZWFyY2ggKG9wdGlvbmFsKSBTZWFyY2ggc3RyaW5nIGZvciBwYXJ0aWFsIG1hdGNoLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEFsbChzdG9yZWZyb250SWQ6IG51bWJlciwgc3RvcmVmcm9udFVzZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNraXA/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0YWtlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc29ydGluZz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlN0b3JlZnJvbnRVc2VyRHRvPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN0b3JlZnJvbnQgdXNlci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIE9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZShzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogQ3JlYXRlU3RvcmVmcm9udFVzZXJEdG8gfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxTdG9yZWZyb250VXNlckR0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0b3JlZnJvbnQgdXNlciBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBTdG9yZWZyb250IHVzZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXQoaWQ6IHN0cmluZyB8IG51bGwsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFN0b3JlZnJvbnRVc2VyRHRvPjtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBzdG9yZWZyb250IHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBPcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZWdpc3RlcihzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogUmVnaXN0ZXJTdG9yZWZyb250VXNlcklucHV0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zZmVycyBhbGwgZXhpc3RpbmcgZGF0YSBmb3IgdGhlIGFub255bW91cyBzdG9yZWZyb250IHVzZXIgdG8gdGhlIHNlbGVjdGVkIHJlZ3VsYXIgc3RvcmVmcm9udCB1c2VyIGFjY291bnQuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBPcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBtZXJnZUFub255bW91cyhzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogTWVyZ2VBbm9ueW1vdXNVc2VyRGF0YUlucHV0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBUEkgYWNjZXNzIHRva2VuIGZvciB0aGUgc3BlY2lmaWVkIHN0b3JlZnJvbnQgdXNlci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udFVzZXJJZCBTdG9yZWZyb250IHVzZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRUb2tlbihzdG9yZWZyb250VXNlcklkOiBzdHJpbmcsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU3RvcmVmcm9udFVzZXJzQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElTdG9yZWZyb250VXNlcnNBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHN0b3JlZnJvbnQgdXNlcnMsIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udFVzZXJJZCAob3B0aW9uYWwpIFN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBza2lwIChvcHRpb25hbCkgRGVmaW5lcyBwYWdlIHN0YXJ0IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzb3J0ZWQgcmVzdWx0IGxpc3QuXG4gICAgICogQHBhcmFtIHRha2UgKG9wdGlvbmFsKSBEZWZpbmVzIHBhZ2UgbGVuZ3RoIChob3cgbWFueSBjb25zZXF1ZW50IGl0ZW1zIG9mIHNvcnRlZCByZXN1bHQgbGlzdCBzaG91bGQgYmUgdGFrZW4pLlxuICAgICAqIEBwYXJhbSBzb3J0aW5nIChvcHRpb25hbCkgRGVmaW5lcyBzb3J0aW5nIG9yZGVyIG9mIHJlc3VsdCBsaXN0IGUuZy46IFwiVGl0bGUgQVNDLCBMYXN0TW9kaWZpZWQgREVTQ1wiLlxuICAgICAqIEBwYXJhbSBzZWFyY2ggKG9wdGlvbmFsKSBTZWFyY2ggc3RyaW5nIGZvciBwYXJ0aWFsIG1hdGNoLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEFsbChzdG9yZWZyb250SWQ6IG51bWJlciwgc3RvcmVmcm9udFVzZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNraXA/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCB0YWtlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc29ydGluZz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UGFnZWRPZlN0b3JlZnJvbnRVc2VyRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvc3RvcmVmcm9udC11c2Vycz9cIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHN0b3JlZnJvbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3N0b3JlZnJvbnRJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRVc2VySWQgIT09IHVuZGVmaW5lZCAmJiBzdG9yZWZyb250VXNlcklkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRVc2VySWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHN0b3JlZnJvbnRVc2VySWQpICsgXCImXCI7XG4gICAgICAgIGlmIChza2lwICE9PSB1bmRlZmluZWQgJiYgc2tpcCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJza2lwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBza2lwKSArIFwiJlwiO1xuICAgICAgICBpZiAodGFrZSAhPT0gdW5kZWZpbmVkICYmIHRha2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGFrZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGFrZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNvcnRpbmcgIT09IHVuZGVmaW5lZCAmJiBzb3J0aW5nICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInNvcnRpbmc9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNvcnRpbmcpICsgXCImXCI7XG4gICAgICAgIGlmIChzZWFyY2ggIT09IHVuZGVmaW5lZCAmJiBzZWFyY2ggIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic2VhcmNoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzZWFyY2gpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBbGwoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBbGwoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UGFnZWRPZlN0b3JlZnJvbnRVc2VyRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFBhZ2VkT2ZTdG9yZWZyb250VXNlckR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEFsbChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UGFnZWRPZlN0b3JlZnJvbnRVc2VyRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQYWdlZE9mU3RvcmVmcm9udFVzZXJEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxQYWdlZE9mU3RvcmVmcm9udFVzZXJEdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzdG9yZWZyb250IHVzZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBPcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGUoc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYm9keT86IENyZWF0ZVN0b3JlZnJvbnRVc2VyRHRvIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9zdG9yZWZyb250LXVzZXJzP1wiO1xuICAgICAgICBpZiAoc3RvcmVmcm9udElkID09PSB1bmRlZmluZWQgfHwgc3RvcmVmcm9udElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3RvcmVmcm9udElkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3RvcmVmcm9udElkKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxTdG9yZWZyb250VXNlckR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxTdG9yZWZyb250VXNlckR0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NyZWF0ZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFN0b3JlZnJvbnRVc2VyRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8U3RvcmVmcm9udFVzZXJEdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0b3JlZnJvbnQgdXNlciBieSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBpZCBTdG9yZWZyb250IHVzZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXQoaWQ6IHN0cmluZyB8IG51bGwsIHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFN0b3JlZnJvbnRVc2VyRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvc3RvcmVmcm9udC11c2Vycy97aWR9P1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChzdG9yZWZyb250SWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdG9yZWZyb250SWQnIG11c3QgYmUgZGVmaW5lZCBhbmQgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB1cmxfICs9IFwic3RvcmVmcm9udElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250SWQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXQoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFN0b3JlZnJvbnRVc2VyRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxTdG9yZWZyb250VXNlckR0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxTdG9yZWZyb250VXNlckR0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBzdG9yZWZyb250IHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN0b3JlZnJvbnRJZCBTdG9yZWZyb250IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBPcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZWdpc3RlcihzdG9yZWZyb250SWQ6IG51bWJlciwgdGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBib2R5PzogUmVnaXN0ZXJTdG9yZWZyb250VXNlcklucHV0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS9zdG9yZWZyb250LXVzZXJzL3JlZ2lzdGVyP1wiO1xuICAgICAgICBpZiAoc3RvcmVmcm9udElkID09PSB1bmRlZmluZWQgfHwgc3RvcmVmcm9udElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3RvcmVmcm9udElkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3RvcmVmcm9udElkKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1JlZ2lzdGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVnaXN0ZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZWdpc3RlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8U3RvcmVmcm9udFVzZXJEdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFN0b3JlZnJvbnRVc2VyRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8U3RvcmVmcm9udFVzZXJEdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmZXJzIGFsbCBleGlzdGluZyBkYXRhIGZvciB0aGUgYW5vbnltb3VzIHN0b3JlZnJvbnQgdXNlciB0byB0aGUgc2VsZWN0ZWQgcmVndWxhciBzdG9yZWZyb250IHVzZXIgYWNjb3VudC5cbiAgICAgKiBAcGFyYW0gc3RvcmVmcm9udElkIFN0b3JlZnJvbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIE9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIG1lcmdlQW5vbnltb3VzKHN0b3JlZnJvbnRJZDogbnVtYmVyLCB0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGJvZHk/OiBNZXJnZUFub255bW91c1VzZXJEYXRhSW5wdXQgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvc3RvcmVmcm9udC11c2Vycy9tZXJnZS1hbm9ueW1vdXM/XCI7XG4gICAgICAgIGlmIChzdG9yZWZyb250SWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdG9yZWZyb250SWQnIG11c3QgYmUgZGVmaW5lZCBhbmQgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB1cmxfICs9IFwic3RvcmVmcm9udElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250SWQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRlbmFudElkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb25cIixcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc01lcmdlQW5vbnltb3VzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTWVyZ2VBbm9ueW1vdXMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzTWVyZ2VBbm9ueW1vdXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFQSSBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgc3RvcmVmcm9udCB1c2VyLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250VXNlcklkIFN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBzdG9yZWZyb250SWQgU3RvcmVmcm9udCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFRva2VuKHN0b3JlZnJvbnRVc2VySWQ6IHN0cmluZywgc3RvcmVmcm9udElkOiBudW1iZXIsIHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3N0b3JlZnJvbnQvdjEvc3RvcmVmcm9udC11c2Vycy90b2tlbj9cIjtcbiAgICAgICAgaWYgKHN0b3JlZnJvbnRVc2VySWQgPT09IHVuZGVmaW5lZCB8fCBzdG9yZWZyb250VXNlcklkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3RvcmVmcm9udFVzZXJJZCcgbXVzdCBiZSBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHVybF8gKz0gXCJzdG9yZWZyb250VXNlcklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdG9yZWZyb250VXNlcklkKSArIFwiJlwiO1xuICAgICAgICBpZiAoc3RvcmVmcm9udElkID09PSB1bmRlZmluZWQgfHwgc3RvcmVmcm9udElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3RvcmVmcm9udElkJyBtdXN0IGJlIGRlZmluZWQgYW5kIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdXJsXyArPSBcInN0b3JlZnJvbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3RvcmVmcm9udElkKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0VG9rZW4oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRUb2tlbig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0VG9rZW4ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8c3RyaW5nPl9yZXNwb25zZVRleHQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+X3Jlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDk6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDkgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+X3Jlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGVuYW50SW5mb0FwaUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVuYW50IGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBcHBsaWNhdGlvbnNJbmZvKHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VGVuYW50QXBwbGljYXRpb25zSW5mb0R0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVuYW50LlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEluZm8odGVuYW50SWQ/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxUZW5hbnRJbmZvRHRvPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0ZW5hbnQgdXNlcnMuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0VXNlcnNJbmZvKHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VGVuYW50VXNlckluZm9EdG9bXT47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVGVuYW50SW5mb0FwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJVGVuYW50SW5mb0FwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVuYW50IGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBcHBsaWNhdGlvbnNJbmZvKHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VGVuYW50QXBwbGljYXRpb25zSW5mb0R0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3RlbmFudC1pbmZvL2FwcGxpY2F0aW9ucz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEFwcGxpY2F0aW9uc0luZm8oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBcHBsaWNhdGlvbnNJbmZvKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFRlbmFudEFwcGxpY2F0aW9uc0luZm9EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VGVuYW50QXBwbGljYXRpb25zSW5mb0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEFwcGxpY2F0aW9uc0luZm8ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFRlbmFudEFwcGxpY2F0aW9uc0luZm9EdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFRlbmFudEFwcGxpY2F0aW9uc0luZm9EdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxUZW5hbnRBcHBsaWNhdGlvbnNJbmZvRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlbmFudC5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRJbmZvKHRlbmFudElkPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VGVuYW50SW5mb0R0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zdG9yZWZyb250L3YxL3RlbmFudC1pbmZvP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0ZW5hbnRJZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW5mbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEluZm8oPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VGVuYW50SW5mb0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxUZW5hbnRJbmZvRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0SW5mbyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8VGVuYW50SW5mb0R0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VGVuYW50SW5mb0R0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFRlbmFudEluZm9EdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGVuYW50IHVzZXJzLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFVzZXJzSW5mbyh0ZW5hbnRJZD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFRlbmFudFVzZXJJbmZvRHRvW10+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc3RvcmVmcm9udC92MS90ZW5hbnQtaW5mby91c2Vycz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQgJiYgdGVuYW50SWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFVzZXJzSW5mbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFVzZXJzSW5mbyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxUZW5hbnRVc2VySW5mb0R0b1tdPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFRlbmFudFVzZXJJbmZvRHRvW10+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRVc2Vyc0luZm8ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFRlbmFudFVzZXJJbmZvRHRvW10+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFRlbmFudFVzZXJJbmZvRHRvW10+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxUZW5hbnRVc2VySW5mb0R0b1tdPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuLyoqIEluZm9ybWF0aW9uIGFib3V0IGEgc2VydmljZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRJbmZvTW9kZWwge1xuICAgIC8qKiBWZXJzaW9uIG51bWJlci4gKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQnVpbGQgZGF0ZSAoVVRDKS4gKi9cbiAgICBidWlsZERhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIChEZWJ1ZyB8IFJlbGVhc2UpLiAqL1xuICAgIGNvbmZpZ3VyYXRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBTZXJ2aWNlIG5hbWUuICovXG4gICAgYXBwTmFtZT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgc3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFJlZmVyZW5jZUR0byB7XG4gICAgLyoqIFByb2R1Y3QgcmVmZXJlbmNlIGlzIGFuIGV4dGVybmFsIHJlZmVyZW5jZSB0byBDdXN0b21lcidzIENhbnZhcyBwcm9kdWN0IHNwZWNpZmljYXRpb24sIGUuZyBvbmxpbmUgc3RvcmUgcHJvZHVjdCBpZGVudGlmaWVyLiAqL1xuICAgIHByb2R1Y3RSZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBDdXN0b21lcidzIENhbnZhcyBwcm9kdWN0IHNwZWNpZmljYXRpb24gaWRlbnRpZmllci4gKi9cbiAgICBwcm9kdWN0U3BlY2lmaWNhdGlvbklkPzogbnVtYmVyO1xuICAgIC8qKiBTdG9yZWZyb250IGlkZW50aWZpZXIuICovXG4gICAgc3RvcmVmcm9udElkPzogbnVtYmVyO1xuICAgIC8qKiBUZW5hbnQgaWRlbnRpZmllci4gKi9cbiAgICB0ZW5hbnRJZD86IG51bWJlcjtcbiAgICAvKiogU3RvcmVmcm9udCBwcm9kdWN0IHJlZmVyZW5jZSBjcmVhdGlvbiBkYXRlIGFuZCB0aW1lLiAqL1xuICAgIGNyZWF0ZWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBQYWdlZCBsaXN0IG9mIGl0ZW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlZE9mUHJvZHVjdFJlZmVyZW5jZUR0byB7XG4gICAgLyoqIEl0ZW1zIGNvdW50LiAqL1xuICAgIHRvdGFsPzogbnVtYmVyO1xuICAgIC8qKiBJdGVtcyBsaXN0LiAqL1xuICAgIGl0ZW1zPzogUHJvZHVjdFJlZmVyZW5jZUR0b1tdIHwgbnVsbDtcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyBjcmVhdGUgb3BlcmF0aW9uIHBhcmFtZXRlcnMgZm9yIHN0b3JlZnJvbnQgcHJvZHVjdCByZWZlcmVuY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2R1Y3RSZWZlcmVuY2VEdG8ge1xuICAgIC8qKiBQcm9kdWN0IHJlZmVyZW5jZSBpcyBhbiBleHRlcm5hbCByZWZlcmVuY2UgdG8gQ3VzdG9tZXIncyBDYW52YXMgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLCBlLmcgb25saW5lIHN0b3JlIHByb2R1Y3QgaWRlbnRpZmllci4gKi9cbiAgICBwcm9kdWN0UmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBpZGVudGlmaWVyLiAqL1xuICAgIHByb2R1Y3RTcGVjaWZpY2F0aW9uSWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ibGVtRGV0YWlscyB7XG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgdGl0bGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIHN0YXR1cz86IG51bWJlciB8IG51bGw7XG4gICAgZGV0YWlsPzogc3RyaW5nIHwgbnVsbDtcbiAgICBpbnN0YW5jZT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgcHJvZHVjdCBhdHRyaWJ1dGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RBdHRyaWJ1dGVEdG8ge1xuICAgIC8qKiBQcm9kdWN0IGF0dHJpYnV0ZSBuYW1lLiAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBQcm9kdWN0IGF0dHJpYnV0ZSB0eXBlLiAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBQcm9kdWN0IGF0dHJpYnV0ZSB2YWx1ZS4gKi9cbiAgICB2YWx1ZT86IGFueSB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgcHJvZHVjdCBzcGVjaWZpY2F0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3BlY2lmaWNhdGlvbkR0byB7XG4gICAgLyoqIFByb2R1Y3Qgc3BlY2lmaWNhdGlvbiBpZGVudGlmaWVyLiAqL1xuICAgIGlkPzogbnVtYmVyO1xuICAgIC8qKiBUZW5hbnQgaWRlbnRpZmllci4gKi9cbiAgICB0ZW5hbnRJZD86IG51bWJlcjtcbiAgICAvKiogUHJvZHVjdCBzcGVjaWZpY2F0aW9uIG5hbWUuICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIExpc3Qgb2YgcHJvZHVjdCBhdHRyaWJ1dGVzLiAqL1xuICAgIHByb2R1Y3RBdHRyaWJ1dGVzPzogUHJvZHVjdEF0dHJpYnV0ZUR0b1tdIHwgbnVsbDtcbiAgICAvKiogUHJvZHVjdCBzcGVjaWZpY2F0aW9uIGNyZWF0aW9uIHRpbWUuICovXG4gICAgY3JlYXRlZD86IHN0cmluZztcbiAgICAvKiogUHJvZHVjdCBzcGVjaWZpY2F0aW9uIG1vZGlmaWNhdGlvbiB0aW1lLiAqL1xuICAgIGxhc3RNb2RpZmllZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgc3RvcmVmcm9udCBwcm9kdWN0IGNvc3QgZGV0YWlscy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdENvc3REZXRhaWxzRHRvIHtcbiAgICAvKiogUHJvZHVjdCByZWZlcmVuY2UgaXMgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbiwgZS5nIG9ubGluZSBzdG9yZSBwcm9kdWN0IGlkZW50aWZpZXIuICovXG4gICAgcHJvZHVjdFJlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFByb2R1Y3QgU0tVLiAqL1xuICAgIHByb2R1Y3RTa3U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBQcm9kdWN0IHF1YW50aXR5LiAqL1xuICAgIHByb2R1Y3RRdWFudGl0eT86IG51bWJlcjtcbiAgICAvKiogUHJvZHVjdCBwcmljZS4gKi9cbiAgICBwcm9kdWN0UHJpY2U/OiBudW1iZXI7XG4gICAgLyoqIFByb2R1Y3QgY29zdC4gKi9cbiAgICBwcm9kdWN0Q29zdD86IG51bWJlcjtcbiAgICAvKiogUHJvZHVjdCBkaXNjb3VudC4gKi9cbiAgICBwcm9kdWN0RGlzY291bnQ/OiBudW1iZXI7XG4gICAgLyoqIEN1cnJlbmN5IGNvZGUuICovXG4gICAgY3VycmVuY3lDb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVGVuYW50IGlkZW50aWZpZXIuICovXG4gICAgdGVuYW50SWQ/OiBudW1iZXI7XG59XG5cbi8qKiBQYWdlZCBsaXN0IG9mIGl0ZW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlZE9mUHJvZHVjdFNwZWNpZmljYXRpb25EdG8ge1xuICAgIC8qKiBJdGVtcyBjb3VudC4gKi9cbiAgICB0b3RhbD86IG51bWJlcjtcbiAgICAvKiogSXRlbXMgbGlzdC4gKi9cbiAgICBpdGVtcz86IFByb2R1Y3RTcGVjaWZpY2F0aW9uRHRvW10gfCBudWxsO1xufVxuXG4vKiogRGVmaW5lcyBhbGwgYXZhaWxhYmxlIGRhdGUgcGVyaW9kIGZpbHRlciB2YWx1ZXMgZm9yIHF1ZXJpZXMuICovXG5leHBvcnQgZW51bSBEYXRlUGVyaW9kIHtcbiAgICBBbGwgPSBcIkFsbFwiLFxuICAgIFRvZGF5ID0gXCJUb2RheVwiLFxuICAgIExhc3Q3RGF5cyA9IFwiTGFzdDdEYXlzXCIsXG4gICAgTGFzdDMwRGF5cyA9IFwiTGFzdDMwRGF5c1wiLFxufVxuXG4vKiogQXZhaWxhYmxlIHByb2R1Y3QgcmVzb3VyY2UgdHlwZXMgKi9cbmV4cG9ydCBlbnVtIFByb2plY3RJdGVtUmVzb3VyY2VUeXBlIHtcbiAgICBHZW5lcmFsID0gXCJHZW5lcmFsXCIsXG4gICAgUHJldmlldyA9IFwiUHJldmlld1wiLFxuICAgIEhpcmVzID0gXCJIaXJlc1wiLFxufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdCBpdGVtIHJlc291cmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0SXRlbVJlc291cmNlRHRvIHtcbiAgICAvKiogUmVzb3VyY2UgSUQuICovXG4gICAgcmVzb3VyY2VJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlc291cmNlIG5hbWUuICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlc291cmNlIHR5cGUuICovXG4gICAgdHlwZT86IFByb2plY3RJdGVtUmVzb3VyY2VUeXBlO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdCBpdGVtLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0SXRlbUR0byB7XG4gICAgLyoqIEl0ZW0gbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogSXRlbSBxdWFudGl0eSBpbmZvcm1hdGlvbi4gKi9cbiAgICBxdWFudGl0eT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIEl0ZW0gaW5mb3JtYXRpb24uICovXG4gICAgZmllbGRzPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCBudWxsO1xuICAgIC8qKiBBZGRpdGlvbmFsIGl0ZW0gaW5mb3JtYXRpb24uICovXG4gICAgaGlkZGVuPzogYW55IHwgbnVsbDtcbiAgICAvKiogQSBsaXN0IG9mIGRlc2lnbiBpZGVudGlmaWVycyBhc3NvY2lhdGVkIHRvIHRoZSBpdGVtLiAqL1xuICAgIGRlc2lnbklkcz86IHN0cmluZ1tdIHwgbnVsbDtcbiAgICAvKiogU0tVLiAqL1xuICAgIHNrdT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEV4dGVybmFsIHJlc291cmNlcyBkZXNjcmlwdGlvbnMuICovXG4gICAgcmVzb3VyY2VzPzogUHJvamVjdEl0ZW1SZXNvdXJjZUR0b1tdIHwgbnVsbDtcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2plY3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3REdG8ge1xuICAgIC8qKiBQcm9qZWN0IGlkZW50aWZpZXIuICovXG4gICAgaWQ/OiBudW1iZXI7XG4gICAgLyoqIFByb2R1Y3QgcmVmZXJlbmNlIChpLmUgZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIEN1c3RvbWVyJ3MgQ2FudmFzIHByb2R1Y3Qgc3BlY2lmaWNhdGlvbikgKi9cbiAgICBwcm9kdWN0UmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogU3RvcmVmcm9udCBpZGVudGlmaWVyLiAqL1xuICAgIHN0b3JlZnJvbnRJZD86IG51bWJlcjtcbiAgICAvKiogUHJvamVjdCB0ZW5hbnQgaW5kZW50aWZpZXIuICovXG4gICAgdGVuYW50SWQ/OiBudW1iZXI7XG4gICAgLyoqIE9yZGVyIGlkZW50aWZpZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBvcmRlcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogT3JkZXIgdXJsIGluIGVjb21tZXJjZSBzeXN0ZW0uICovXG4gICAgb3JkZXJVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBPcmRlciBudW1iZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBvcmRlck51bWJlcj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIExpbmUgaXRlbSBpZGVudGlmaWVyIGZyb20gZXh0ZXJuYWwgZWNvbW1lcmNlIHN5c3RlbSBvcmRlci4gKi9cbiAgICBvcmRlckxpbmVJdGVtSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBMaW5lIGl0ZW0gaW5kZXggZnJvbSBleHRlcm5hbCBlY29tbWVyY2Ugc3lzdGVtIG9yZGVyLiAqL1xuICAgIG9yZGVyTGluZUl0ZW1JbmRleD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIEN1c3RvbWVyIGlkZW50aWZpZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBjdXN0b21lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQ3VzdG9tZXIgbmFtZSBpbiBlY29tbWVyY2Ugc3lzdGVtLiAqL1xuICAgIGN1c3RvbWVyTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFByb2plY3QgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUHJvamVjdCBvd25lciBpZGVudGlmaWVyLiAqL1xuICAgIG93bmVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBMaXN0IG9mIHByb2plY3QgaXRlbXMuICovXG4gICAgaXRlbXM/OiBQcm9qZWN0SXRlbUR0b1tdIHwgbnVsbDtcbiAgICAvKiogUHJvamVjdCBzdGF0dXMgY29kZS4gKi9cbiAgICBzdGF0dXM/OiBudW1iZXI7XG4gICAgLyoqIFByb2plY3QgY3JlYXRpb24gdGltZS4gKi9cbiAgICBjcmVhdGVkPzogc3RyaW5nO1xuICAgIC8qKiBQcm9qZWN0IG1vZGlmaWNhdGlvbiB0aW1lLiAqL1xuICAgIGxhc3RNb2RpZmllZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0LiAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFBhZ2VkIGxpc3Qgb2YgaXRlbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkT2ZQcm9qZWN0RHRvIHtcbiAgICAvKiogSXRlbXMgY291bnQuICovXG4gICAgdG90YWw/OiBudW1iZXI7XG4gICAgLyoqIEl0ZW1zIGxpc3QuICovXG4gICAgaXRlbXM/OiBQcm9qZWN0RHRvW10gfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGNyZWF0ZSBvcGVyYXRpb24gcGFyYW10ZXJzIGZvciBhIHByb2plY3QgaXRlbSByZXNvdXJjZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdEl0ZW1SZXNvdXJjZVBhcmFtZXRlcnNEdG8ge1xuICAgIC8qKiBSZXNvdXJjZSBVUkwuICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUmVzb3VyY2UgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUmVzb3VyY2UgdHlwZS4gKi9cbiAgICB0eXBlPzogUHJvamVjdEl0ZW1SZXNvdXJjZVR5cGU7XG4gICAgLyoqIE9yaWdpbmFsIHJlc291cmNlIGlkZW50aWZpZXIuICovXG4gICAgcmVzb3VyY2VJZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgY3JlYXRlIG9wZXJhdGlvbiBwYXJhbXRlcnMgZm9yIGEgcHJvamVjdCBpdGVtLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0SXRlbVBhcmFtZXRlcnNEdG8ge1xuICAgIC8qKiBJdGVtIG5hbWUuICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEl0ZW0gcXVhbnRpdHkgaW5mb3JtYXRpb24uICovXG4gICAgcXVhbnRpdHk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKiBJdGVtIGluZm9ybWF0aW9uLiAqL1xuICAgIGZpZWxkcz86IHsgW2tleTogc3RyaW5nXTogYW55OyB9IHwgbnVsbDtcbiAgICAvKiogQWRkaXRpb25hbCBpdGVtIGluZm9ybWF0aW9uLiAqL1xuICAgIGhpZGRlbj86IGFueSB8IG51bGw7XG4gICAgLyoqIEEgbGlzdCBvZiBkZXNpZ24gaWRlbnRpZmllcnMgYXNzb2NpYXRlZCB0byB0aGUgaXRlbS4gKi9cbiAgICBkZXNpZ25JZHM/OiBzdHJpbmdbXSB8IG51bGw7XG4gICAgLyoqIFNLVS4gKi9cbiAgICBza3U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBFeHRlcm5hbCByZXNvdXJjZXMgZGVzY3JpcHRpb25zLiAqL1xuICAgIHJlc291cmNlcz86IFByb2plY3RJdGVtUmVzb3VyY2VQYXJhbWV0ZXJzRHRvW10gfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGNyZWF0ZSBvcGVyYXRpb24gcGFyYW1ldGVycyBmb3IgcHJvamVjdCBlbnRpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3REdG8ge1xuICAgIC8qKiBQcm9kdWN0IHJlZmVyZW5jZSAoaS5lIGV4dGVybmFsIHJlZmVyZW5jZSB0byBDdXN0b21lcidzIENhbnZhcyBwcm9kdWN0IHNwZWNpZmljYXRpb24gLSBtYWluIHN1YmplY3Qgb2YgdGhpcyBwcm9qZWN0KS4gKi9cbiAgICBwcm9kdWN0UmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqIE9yZGVyIGlkZW50aWZpZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBvcmRlcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogT3JkZXIgdXJsIGluIGVjb21tZXJjZSBzeXN0ZW0uICovXG4gICAgb3JkZXJVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBPcmRlciBudW1iZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBvcmRlck51bWJlcj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIExpbmUgaXRlbSBpbmRleCBmcm9tIGVjb21tZXJjZSBzeXN0ZW0gb3JkZXIuICovXG4gICAgb3JkZXJMaW5lSXRlbUluZGV4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogTGluZSBJdGVtIGlkZW50aWZpZXIgZnJvbSBlY29tbWVyY2Ugc3lzdGVtIG9yZGVyLiAqL1xuICAgIG9yZGVyTGluZUl0ZW1JZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEN1c3RvbWVyIGlkZW50aWZpZXIgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBjdXN0b21lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQ3VzdG9tZXIgbmFtZSBpbiBlY29tbWVyY2Ugc3lzdGVtLiAqL1xuICAgIGN1c3RvbWVyTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFByb2plY3QgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUHJvamVjdCBvd25lciBpZGVudGlmaWVyLiAqL1xuICAgIG93bmVySWQ6IHN0cmluZztcbiAgICAvKiogTGlzdCBvZiBwcm9qZWN0IGl0ZW1zLiAqL1xuICAgIGl0ZW1zPzogUHJvamVjdEl0ZW1QYXJhbWV0ZXJzRHRvW10gfCBudWxsO1xuICAgIC8qKiBEZXNjcmlwdGlvbiBvZiB0aGUgcHJvamVjdC4gKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgZWNvbW1lcmNlIG9yZGVyIGRlc2NyaXB0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmRlckRldGFpbHNEdG8ge1xuICAgIC8qKiBPcmRlciBpZGVudGlmaWVyIGluIGVjb21tZXJjZSBzeXN0ZW0uICovXG4gICAgb3JkZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE9yZGVyIHVybCBpbiBlY29tbWVyY2Ugc3lzdGVtLiAqL1xuICAgIG9yZGVyVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogT3JkZXIgbnVtYmVyIGluIGVjb21tZXJjZSBzeXN0ZW0uICovXG4gICAgb3JkZXJOdW1iZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKiBMaW5lIGl0ZW0gaW5kZXggZnJvbSBlY29tbWVyY2Ugc3lzdGVtIG9yZGVyLiAqL1xuICAgIG9yZGVyTGluZUl0ZW1JbmRleD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIExpbmUgSXRlbSBpZGVudGlmaWVyIGZyb20gZWNvbW1lcmNlIHN5c3RlbSBvcmRlci4gKi9cbiAgICBvcmRlckxpbmVJdGVtSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBDdXN0b21lciBpZGVudGlmaWVyIGluIGVjb21tZXJjZSBzeXN0ZW0uICovXG4gICAgY3VzdG9tZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEN1c3RvbWVyIG5hbWUgaW4gZWNvbW1lcmNlIHN5c3RlbS4gKi9cbiAgICBjdXN0b21lck5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgZW51bSBSZW5kZXJIaVJlc1NjZW5hcmlvT3V0cHV0Rm9ybWF0IHtcbiAgICBQZGYgPSBcIlBkZlwiLFxuICAgIEpwZWcgPSBcIkpwZWdcIixcbiAgICBQbmcgPSBcIlBuZ1wiLFxuICAgIFRpZmYgPSBcIlRpZmZcIixcbn1cblxuZXhwb3J0IGVudW0gUmVuZGVySGlSZXNTY2VuYXJpb091dHB1dENvbG9yU3BhY2Uge1xuICAgIFJnYiA9IFwiUmdiXCIsXG4gICAgR3JheXNjYWxlID0gXCJHcmF5c2NhbGVcIixcbiAgICBDbXlrID0gXCJDbXlrXCIsXG59XG5cbmV4cG9ydCBlbnVtIFJlbmRlckhpUmVzU2NlbmFyaW9PdXRwdXRGbGlwTW9kZSB7XG4gICAgTm9uZSA9IFwiTm9uZVwiLFxuICAgIEhvcml6b250YWwgPSBcIkhvcml6b250YWxcIixcbiAgICBWZXJ0aWNhbCA9IFwiVmVydGljYWxcIixcbiAgICBCb3RoID0gXCJCb3RoXCIsXG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgJ1JlbmRlckhpUmVzJyBzY2VuYXJpbyBwYXJhbXRlcnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckhpUmVzU2NlbmFyaW9EdG8ge1xuICAgIC8qKiBQcml2YXRlIGRlc2lnbiBpZGVudGlmaWVyLiAqL1xuICAgIGRlc2lnbklkOiBzdHJpbmc7XG4gICAgLyoqIE91dHB1dCBmaWxlIG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogT3V0cHV0IGZpbGUgRFBJLiAqL1xuICAgIGRwaT86IG51bWJlcjtcbiAgICAvKiogT3V0cHV0IGZpbGUgZm9ybWF0LiAqL1xuICAgIGZvcm1hdD86IFJlbmRlckhpUmVzU2NlbmFyaW9PdXRwdXRGb3JtYXQgfCBudWxsO1xuICAgIC8qKiBPdXRwdXQgZmlsZSBjb2xvciBzcGFjZS4gKi9cbiAgICBjb2xvclNwYWNlPzogUmVuZGVySGlSZXNTY2VuYXJpb091dHB1dENvbG9yU3BhY2UgfCBudWxsO1xuICAgIC8qKiBPdXRwdXQgZmlsZSBmbGlwIG1vZGUuICovXG4gICAgZmxpcE1vZGU/OiBSZW5kZXJIaVJlc1NjZW5hcmlvT3V0cHV0RmxpcE1vZGUgfCBudWxsO1xuICAgIC8qKiBPdXRwdXQgZmlsZSBhY2Nlc3MgbW9kZS4gKi9cbiAgICBhbm9ueW1vdXNBY2Nlc3M/OiBib29sZWFuIHwgbnVsbDtcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyAnY3JlYXRlJyBvcGVyYXRpb24gcGFyYW1ldGVycyBmb3IgcHJvamVjdCBlbnRpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RCeVJlbmRlckhpUmVzU2NlbmFyaW9EdG8ge1xuICAgIC8qKiBQcm9qZWN0IG93bmVyIGlkZW50aWZpZXIuICovXG4gICAgb3duZXJJZDogc3RyaW5nO1xuICAgIC8qKiBQcm9qZWN0IG5hbWUuICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0LiAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogRWNvbW1lcmNlIHN5c3RlbSBvcmRlciBkZXNjcmlwdGlvbi4gKi9cbiAgICBvcmRlckRldGFpbHM/OiBPcmRlckRldGFpbHNEdG8gfCBudWxsO1xuICAgIC8qKiBMaXN0IG9mIHByb2plY3QgaXRlbXMuICovXG4gICAgc2NlbmFyaW86IFJlbmRlckhpUmVzU2NlbmFyaW9EdG87XG59XG5cbi8qKiBQcm9qZWN0IHRyYW5zaXRpb24gZHRvIGNsYXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0VHJhbnNpdGlvbkR0byB7XG4gICAgLyoqIFRyYW5zaXRpb24gaWRlbnRpZnlpbmcgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVHJhbnNpdGlvbiBkaXNwbGF5IG5hbWUuICovXG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBQcm9qZWN0IHN0YXR1cyBjb2RlIGZyb20gd2hpY2ggdHJhbnNpdGlvbiB0byB0aGUgcmVzdWx0IHN0YXR1cyBjb2RlIGNhbiBiZSBkb25lLiAqL1xuICAgIHN0YXJ0U3RhdHVzPzogbnVtYmVyO1xuICAgIC8qKiBUcmFuc2l0aW9uIHJlc3VsdCBwcm9qZWN0IHN0YXR1cyBjb2RlLiAqL1xuICAgIHJlc3VsdFN0YXR1cz86IG51bWJlcjtcbn1cblxuLyoqIFBhZ2VkIGxpc3Qgb2YgaXRlbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkT2ZQcm9qZWN0VHJhbnNpdGlvbkR0byB7XG4gICAgLyoqIEl0ZW1zIGNvdW50LiAqL1xuICAgIHRvdGFsPzogbnVtYmVyO1xuICAgIC8qKiBJdGVtcyBsaXN0LiAqL1xuICAgIGl0ZW1zPzogUHJvamVjdFRyYW5zaXRpb25EdG9bXSB8IG51bGw7XG59XG5cbi8qKiBEdG8gY2xhc3MsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2plY3QgdHJhbnNpdGlvbiBjb25mbGljdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdFRyYW5zaXRpb25Db25mbGljdER0byB7XG4gICAgLyoqIEEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHN0YXR1cyB0cmFuc2l0aW9ucyBmb3IgdGhlIHByb2plY3QuICovXG4gICAgYXZhaWxhYmxlVHJhbnNpdGlvbnM/OiBQcm9qZWN0VHJhbnNpdGlvbkR0b1tdIHwgbnVsbDtcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgcHJvamVjdCBzdGF0dXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RTdGF0dXNEdG8ge1xuICAgIC8qKiBTdGF0dXMgY29kZS4gKi9cbiAgICBjb2RlPzogbnVtYmVyO1xuICAgIC8qKiBTdGF0dXMgZGlzcGxheSBuYW1lLiAqL1xuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFBhZ2VkIGxpc3Qgb2YgaXRlbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkT2ZQcm9qZWN0U3RhdHVzRHRvIHtcbiAgICAvKiogSXRlbXMgY291bnQuICovXG4gICAgdG90YWw/OiBudW1iZXI7XG4gICAgLyoqIEl0ZW1zIGxpc3QuICovXG4gICAgaXRlbXM/OiBQcm9qZWN0U3RhdHVzRHRvW10gfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIHJlc3VsdCBvZiAnZ2V0IHByb2plY3QgcGRmIHVybCcgb3BlcmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0UGRmUmVzdWx0RHRvIHtcbiAgICAvKiogUHJvamVjdCBwZGYgdXJsLiAqL1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBBdmFpbGFibGUgcHJvamVjdCBwcm9jZXNzaW5nIHN0YXR1c2VzLiAqL1xuZXhwb3J0IGVudW0gUHJvamVjdFByb2Nlc3NpbmdTdGF0dXMge1xuICAgIFBlbmRpbmcgPSBcIlBlbmRpbmdcIixcbiAgICBJblByb2dyZXNzID0gXCJJblByb2dyZXNzXCIsXG4gICAgQ29tcGxldGVkID0gXCJDb21wbGV0ZWRcIixcbiAgICBGYWlsZWQgPSBcIkZhaWxlZFwiLFxufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCBvdXRwdXQgZmlsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdE91dHB1dEZpbGVEZXRhaWxzRHRvIHtcbiAgICAvKiogUHJvamVjdCBvdXRwdXQgZmlsZSBVUkwuICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUHJvamVjdCBvdXRwdXQgZmlsZSBuYW1lICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFByb2plY3Qgb3V0cHV0IGZpbGUgZm9ybWF0ICovXG4gICAgZm9ybWF0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUHJvamVjdCBvdXRwdXQgZmlsZSBpZCB3aXRoaW5nIGFydGlmYWN0cyBzdG9yYWdlLiAqL1xuICAgIGFydGlmYWN0SWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBQcm9qZWN0IG91dHB1dCBmaWxlIGFjY2VzcyBzdHJhdGVneS4gKi9cbiAgICBhbm9ueW1vdXNBY2Nlc3M/OiBib29sZWFuO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGRlc2NyaXB0aW9uIG9mIHByb2plY3QgcHJvY2Vzc2luZyByZXN1bHRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0UHJvY2Vzc2luZ1Jlc3VsdHNEdG8ge1xuICAgIC8qKiBQcm9qZWN0IHByb2Nlc3Npbmcgc3RhdHVzLiAqL1xuICAgIHN0YXR1cz86IFByb2plY3RQcm9jZXNzaW5nU3RhdHVzO1xuICAgIC8qKiBQcm9qZWN0IHN0YXR1cyBkZXNjcmlwdGlvbi4gKi9cbiAgICBzdGF0dXNEZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIENvbGxlY3Rpb24gb2YgcHJvamVjdCBvdXRwdXQgZmlsZSBkZXNjcmlwdGlvbnMuICovXG4gICAgb3V0cHV0RmlsZURldGFpbHM/OiBQcm9qZWN0T3V0cHV0RmlsZURldGFpbHNEdG9bXSB8IG51bGw7XG59XG5cbi8qKiBBdmFpbGFibGUgdmFsdWUgdHlwZXMgZm9yIG9yZGVyIGRhdGEgaXRlbS4gKi9cbmV4cG9ydCBlbnVtIE9yZGVyRGF0YUl0ZW1WYWx1ZVR5cGUge1xuICAgIFBsYWluVGV4dCA9IFwiUGxhaW5UZXh0XCIsXG4gICAgQ29tbWFTZXBhcmF0ZWRMaXN0ID0gXCJDb21tYVNlcGFyYXRlZExpc3RcIixcbiAgICBTZXJpYWxpemVkSnNvbiA9IFwiU2VyaWFsaXplZEpzb25cIixcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBwcm9qZWN0J3Mgb3JkZXIgZGF0YSBpdGVtLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmRlckRhdGFJdGVtRHRvIHtcbiAgICAvKiogT3JkZXIgZGF0YSBpdGVtIGtleSAoZXZlbnR1YWxsIG9yZGVyIG1ldGFkYXRhIGZpZWxkIG5hbWUpLiAqL1xuICAgIGtleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE9yZGVyIGRhdGEgaXRlbSB2YWx1ZS4gKi9cbiAgICB2YWx1ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE9yZGVyIGRhdGEgaXRlbSB0eXBlLiAqL1xuICAgIHR5cGU/OiBPcmRlckRhdGFJdGVtVmFsdWVUeXBlO1xufVxuXG4vKiogU3RvcmVmcm9udCB0eXBlcy4gKi9cbmV4cG9ydCBlbnVtIFN0b3JlZnJvbnRUeXBlIHtcbiAgICBDdXN0b20gPSBcIkN1c3RvbVwiLFxuICAgIFNob3BpZnlMZWdhY3kgPSBcIlNob3BpZnlMZWdhY3lcIixcbiAgICBEb2NrZXRNYW5hZ2VyID0gXCJEb2NrZXRNYW5hZ2VyXCIsXG4gICAgQ3VzdG9tU2FtbCA9IFwiQ3VzdG9tU2FtbFwiLFxuICAgIE5vcENvbW1lcmNlID0gXCJOb3BDb21tZXJjZVwiLFxuICAgIFdvb0NvbW1lcmNlID0gXCJXb29Db21tZXJjZVwiLFxuICAgIE1hZ2VudG8gPSBcIk1hZ2VudG9cIixcbiAgICBCaWdDb21tZXJjZSA9IFwiQmlnQ29tbWVyY2VcIixcbiAgICBTaG9waWZ5ID0gXCJTaG9waWZ5XCIsXG4gICAgU2hvcGlmeUN1c3RvbSA9IFwiU2hvcGlmeUN1c3RvbVwiLFxufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3RvcmVmcm9udC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVmcm9udER0byB7XG4gICAgLyoqIFN0b3JlZnJvbnQgaWRlbnRpZmllci4gKi9cbiAgICBpZD86IG51bWJlcjtcbiAgICAvKiogVGVuYW50IGlkZW50aWZpZXIuICovXG4gICAgdGVuYW50SWQ/OiBudW1iZXI7XG4gICAgLyoqIFN0b3JlZnJvbnQgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogU3RvcmVmcm9udCBlY29tbWVyY2Ugc3lzdGVtIHR5cGUuICovXG4gICAgdHlwZT86IFN0b3JlZnJvbnRUeXBlO1xuICAgIC8qKiBTdG9yZWZyb250IGVudGl0eSBjcmVhdGlvbiBkYXRlIGFuZCB0aW1lLiAqL1xuICAgIGNyZWF0ZWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBQYWdlZCBsaXN0IG9mIGl0ZW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlZE9mU3RvcmVmcm9udER0byB7XG4gICAgLyoqIEl0ZW1zIGNvdW50LiAqL1xuICAgIHRvdGFsPzogbnVtYmVyO1xuICAgIC8qKiBJdGVtcyBsaXN0LiAqL1xuICAgIGl0ZW1zPzogU3RvcmVmcm9udER0b1tdIHwgbnVsbDtcbn1cblxuLyoqIERUTyBjbGFzcywgY29udGFpbmluZyBpbmZyb21hdGlvbiBhYm91dCBhIHN0b3JlZnJvbnQgdXNlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVmcm9udFVzZXJEdG8ge1xuICAgIC8qKiBTdG9yZWZyb250IHVzZXIgaWRlbnRpZmllci4gKi9cbiAgICB1c2VySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBTdG9yZWZyb250IHRlbmFudCBpbmRlbnRpZmllci4gKi9cbiAgICB0ZW5hbnRJZD86IG51bWJlcjtcbiAgICAvKiogU3RvcmVmcm9udCBpZGVudGlmaWVyLiAqL1xuICAgIHN0b3JlZnJvbnRJZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgdXNlciBpcyB0cmFja2VkIGFzIGFuIGFub255bW91cy4gKi9cbiAgICBpc0Fub255bW91cz86IGJvb2xlYW47XG59XG5cbi8qKiBQYWdlZCBsaXN0IG9mIGl0ZW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlZE9mU3RvcmVmcm9udFVzZXJEdG8ge1xuICAgIC8qKiBJdGVtcyBjb3VudC4gKi9cbiAgICB0b3RhbD86IG51bWJlcjtcbiAgICAvKiogSXRlbXMgbGlzdC4gKi9cbiAgICBpdGVtcz86IFN0b3JlZnJvbnRVc2VyRHRvW10gfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGNyZWF0ZSBvcGVyYXRpb24gcGFyYW1ldGVycyBmb3Igc3RvcmVmcm9udCB1c2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTdG9yZWZyb250VXNlckR0byB7XG4gICAgLyoqIFN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLiAqL1xuICAgIHN0b3JlZnJvbnRVc2VySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIHVzZXIgaXMgdHJhY2tlZCBhcyBhbiBhbm9ueW1vdXMuICovXG4gICAgaXNBbm9ueW1vdXM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyU3RvcmVmcm9udFVzZXJJbnB1dCB7XG4gICAgLyoqIFN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLiAqL1xuICAgIHN0b3JlZnJvbnRVc2VySWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIHBhcmFtZXRlcnMgZm9yIG1lcmdlIGFub255bW91cyB1c2VyIG9wZXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVyZ2VBbm9ueW1vdXNVc2VyRGF0YUlucHV0IHtcbiAgICAvKiogQW5vbnltb3VzIHN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLiAqL1xuICAgIGFub255bW91c1N0b3JlZnJvbnRVc2VySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBSZWd1bGFyIHN0b3JlZnJvbnQgdXNlciBpZGVudGlmaWVyLiAqL1xuICAgIHJlZ3VsYXJTdG9yZWZyb250VXNlcklkPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIER0byBjbGFzcywgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0ZW5hbnQgYXBwbGljYXRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRBcHBsaWNhdGlvbnNJbmZvRHRvIHtcbiAgICAvKiogQW4gdXJsIHRvIHRoZSAnRGVzaWduIEVkaXRvcicgdGVuYW50IGFwcGxpY2F0aW9uLiAqL1xuICAgIGRlc2lnbkVkaXRvclVybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEFuIHVybCB0byB0aGUgJ1VJIEZyYW1ld29yaycuICovXG4gICAgdWlGcmFtZXdvcmtVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBBbiB1cmwgdG8gdGhlICdTaW1wbGUgZWRpdG9yJy4gKi9cbiAgICBzaW1wbGVFZGl0b3JVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBBbiB1cmwgdG8gdGhlICdQcmVmbGlnaHQnIHRlbmFudCBhcHBsaWNhdGlvbi4gKi9cbiAgICBwcmVmbGlnaHRVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBBbiB1cmwgdG8gdGhlICdEeW5hbWljIEltYWdlJyB0ZW5hbnQgYXBwbGljYXRpb24uICovXG4gICAgZHluYW1pY0ltYWdlVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVGVuYW50IGlkZW50aWZpZXIgKi9cbiAgICB0ZW5hbnRJZD86IG51bWJlcjtcbiAgICAvKiogQW4gQXBpS2V5IGZvciB0aGUgJ0Rlc2lnbiBFZGl0b3InIHRlbmFudCBhcHBsaWNhdGlvbi4gKi9cbiAgICBkZXNpZ25FZGl0b3JBcGlLZXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBBbiBBcGlLZXkgZm9yIHRoZSAnUHJlZmxpZ2h0JyB0ZW5hbnQgYXBwbGljYXRpb24uICovXG4gICAgcHJlZmxpZ2h0QXBpS2V5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQW4gQXBpS2V5IGZvciB0aGUgJ0R5bmFtaWMgSW1hZ2UnIHRlbmFudCBhcHBsaWNhdGlvbi4gKi9cbiAgICBkeW5hbWljSW1hZ2VBcGlLZXk/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogRHRvIGNsYXNzLCBjb250YWluaW5nIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGVuYW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRJbmZvRHRvIHtcbiAgICAvKiogVGVuYW50IGlkZW50aWZpZXIuICovXG4gICAgdGVuYW50SWQ/OiBudW1iZXI7XG4gICAgLyoqIFRlbmFuY3kgbmFtZS4gKi9cbiAgICB0ZW5hbmN5TmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFRlbmFudCBjcmVhdGlvbiB0aW1lLiAqL1xuICAgIHRlbmFudENyZWF0aW9uVGltZT86IHN0cmluZztcbiAgICAvKiogVGVuYW50IGFjdGl2ZW5lc3Mgc3RhdHVzLiAqL1xuICAgIGlzQWN0aXZlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRVc2VySW5mb0R0byB7XG4gICAgLyoqIFRlbmFudCBpZGVudGlmaWVyLiAqL1xuICAgIHRlbmFudElkPzogbnVtYmVyO1xuICAgIC8qKiBVc2VyIGlkZW50aWZpZXIuICovXG4gICAgdXNlcklkPzogbnVtYmVyO1xuICAgIC8qKiBVc2VyIG5hbWUuICovXG4gICAgdXNlck5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBVc2VyIHN1cm5hbWUuICovXG4gICAgdXNlclN1cm5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBVc2VyIHN0YXR1cy4gKi9cbiAgICBpc0FjdGl2ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlc3BvbnNlIHtcbiAgICBkYXRhOiBCbG9iO1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIGZpbGVOYW1lPzogc3RyaW5nO1xuICAgIGhlYWRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwaUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgcmVzcG9uc2U6IHN0cmluZztcbiAgICBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfTtcbiAgICByZXN1bHQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ6IGFueSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc0FwaUV4Y2VwdGlvbiA9IHRydWU7XG5cbiAgICBzdGF0aWMgaXNBcGlFeGNlcHRpb24ob2JqOiBhbnkpOiBvYmogaXMgQXBpRXhjZXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIG9iai5pc0FwaUV4Y2VwdGlvbiA9PT0gdHJ1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3VsdCk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhuZXcgQXBpRXhjZXB0aW9uKG1lc3NhZ2UsIHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnMsIG51bGwpKTtcbn1cblxuZnVuY3Rpb24gYmxvYlRvVGV4dChibG9iOiBhbnkpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxzdHJpbmc+KChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmICghYmxvYikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChcIlwiKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgoPGFueT5ldmVudC50YXJnZXQpLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChibG9iKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSJdfQ==
|