@bitgo-beta/sdk-coin-near 1.3.3-alpha.359 → 1.3.3-alpha.360
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/lib/constants.d.ts +1 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +3 -2
- package/dist/src/lib/utils.d.ts +14 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +27 -1
- package/dist/src/near.d.ts +53 -2
- package/dist/src/near.d.ts.map +1 -1
- package/dist/src/near.js +263 -88
- package/package.json +6 -6
|
@@ -12,4 +12,5 @@ export declare const FT_TRANSFER = "ft_transfer";
|
|
|
12
12
|
export declare const STORAGE_DEPOSIT = "storage_deposit";
|
|
13
13
|
export declare const FUNGIBLE_TOKEN_RELATED_METHODS: string[];
|
|
14
14
|
export declare const HEX_REGEX: RegExp;
|
|
15
|
+
export declare const MAX_GAS_LIMIT_FOR_FT_TRANSFER = "30000000000000";
|
|
15
16
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;CAI7B,CAAC;AAEX,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,eAAe,oBAAoB,CAAC;AACjD,eAAO,MAAM,8BAA8B,UAAiC,CAAC;AAE7E,eAAO,MAAM,SAAS,QAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;CAI7B,CAAC;AAEX,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,eAAe,oBAAoB,CAAC;AACjD,eAAO,MAAM,8BAA8B,UAAiC,CAAC;AAE7E,eAAO,MAAM,SAAS,QAAmB,CAAC;AAE1C,eAAO,MAAM,6BAA6B,mBAAmB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HEX_REGEX = exports.FUNGIBLE_TOKEN_RELATED_METHODS = exports.STORAGE_DEPOSIT = exports.FT_TRANSFER = exports.StakingContractMethodNames = void 0;
|
|
3
|
+
exports.MAX_GAS_LIMIT_FOR_FT_TRANSFER = exports.HEX_REGEX = exports.FUNGIBLE_TOKEN_RELATED_METHODS = exports.STORAGE_DEPOSIT = exports.FT_TRANSFER = exports.StakingContractMethodNames = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Staking smart contract method names selected to use on the builders.
|
|
6
6
|
* You can see all methods here
|
|
@@ -15,4 +15,5 @@ exports.FT_TRANSFER = 'ft_transfer';
|
|
|
15
15
|
exports.STORAGE_DEPOSIT = 'storage_deposit';
|
|
16
16
|
exports.FUNGIBLE_TOKEN_RELATED_METHODS = [exports.FT_TRANSFER, exports.STORAGE_DEPOSIT];
|
|
17
17
|
exports.HEX_REGEX = /^[0-9a-fA-F]+$/;
|
|
18
|
-
|
|
18
|
+
exports.MAX_GAS_LIMIT_FOR_FT_TRANSFER = '30000000000000';
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7R0FJRztBQUNVLFFBQUEsMEJBQTBCLEdBQUc7SUFDeEMsZUFBZSxFQUFFLG1CQUFtQjtJQUNwQyxPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsVUFBVTtDQUNaLENBQUM7QUFFRSxRQUFBLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFDNUIsUUFBQSxlQUFlLEdBQUcsaUJBQWlCLENBQUM7QUFDcEMsUUFBQSw4QkFBOEIsR0FBRyxDQUFDLG1CQUFXLEVBQUUsdUJBQWUsQ0FBQyxDQUFDO0FBRWhFLFFBQUEsU0FBUyxHQUFHLGdCQUFnQixDQUFDO0FBRTdCLFFBQUEsNkJBQTZCLEdBQUcsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWtpbmcgc21hcnQgY29udHJhY3QgbWV0aG9kIG5hbWVzIHNlbGVjdGVkIHRvIHVzZSBvbiB0aGUgYnVpbGRlcnMuXG4gKiBZb3UgY2FuIHNlZSBhbGwgbWV0aG9kcyBoZXJlXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uZWFyL2NvcmUtY29udHJhY3RzL2Jsb2IvbWFzdGVyL3N0YWtpbmctcG9vbC9SRUFETUUubWRcbiAqL1xuZXhwb3J0IGNvbnN0IFN0YWtpbmdDb250cmFjdE1ldGhvZE5hbWVzID0ge1xuICBEZXBvc2l0QW5kU3Rha2U6ICdkZXBvc2l0X2FuZF9zdGFrZScsXG4gIFVuc3Rha2U6ICd1bnN0YWtlJyxcbiAgV2l0aGRyYXc6ICd3aXRoZHJhdycsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgRlRfVFJBTlNGRVIgPSAnZnRfdHJhbnNmZXInO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfREVQT1NJVCA9ICdzdG9yYWdlX2RlcG9zaXQnO1xuZXhwb3J0IGNvbnN0IEZVTkdJQkxFX1RPS0VOX1JFTEFURURfTUVUSE9EUyA9IFtGVF9UUkFOU0ZFUiwgU1RPUkFHRV9ERVBPU0lUXTtcblxuZXhwb3J0IGNvbnN0IEhFWF9SRUdFWCA9IC9eWzAtOWEtZkEtRl0rJC87XG5cbmV4cG9ydCBjb25zdCBNQVhfR0FTX0xJTUlUX0ZPUl9GVF9UUkFOU0ZFUiA9ICczMDAwMDAwMDAwMDAwMCc7XG4iXX0=
|
package/dist/src/lib/utils.d.ts
CHANGED
|
@@ -51,6 +51,20 @@ export declare class Utils implements BaseUtils {
|
|
|
51
51
|
* @returns {Nep141Token|undefined} token instance if found
|
|
52
52
|
*/
|
|
53
53
|
getTokenInstanceFromTokenName(tokenName: string): Nep141Token | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Convert from raw gas units to yocto Near value
|
|
56
|
+
*
|
|
57
|
+
* @param {String} gasUnits - raw gas units (e.g. "30000000000000" = 30TGas)
|
|
58
|
+
* @returns {String} value in yoctoNear as a string
|
|
59
|
+
*/
|
|
60
|
+
convertGasUnitsToYoctoNear(gasUnits: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Convert the given record into base64 string
|
|
63
|
+
*
|
|
64
|
+
* @param {Record<String, String>} data the input in the form of a map
|
|
65
|
+
* @returns {String} base64 encoded string
|
|
66
|
+
*/
|
|
67
|
+
convertToBase64(data: Record<string, string>): string;
|
|
54
68
|
}
|
|
55
69
|
declare const utils: Utils;
|
|
56
70
|
export default utils;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAY,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAS,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIzD,qBAAa,KAAM,YAAW,SAAS;IACrC,kBAAkB;IAClB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,kBAAkB;IAClB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC,kBAAkB;IAClB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC,kBAAkB;IAClB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIzC;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAShC;;;;;;OAMG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAY5C,kBAAkB;IAClB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C,kBAAkB;IAClB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI3C,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;IAIvC;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAQhD;;;;;OAKG;IACH,gCAAgC,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO7E;;;;;OAKG;IACH,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAOzE;;;;;OAKG;IACH,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAapD;;;;;OAKG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;CAGtD;AAED,QAAA,MAAM,KAAK,OAAc,CAAC;AAE1B,eAAe,KAAK,CAAC"}
|
package/dist/src/lib/utils.js
CHANGED
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.Utils = void 0;
|
|
7
7
|
const bs58_1 = __importDefault(require("bs58"));
|
|
8
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
9
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
9
10
|
const statics_1 = require("@bitgo-beta/statics");
|
|
10
11
|
const keyPair_1 = require("./keyPair");
|
|
@@ -106,8 +107,33 @@ class Utils {
|
|
|
106
107
|
.map((coin) => coin);
|
|
107
108
|
return token ? token[0] : undefined;
|
|
108
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Convert from raw gas units to yocto Near value
|
|
112
|
+
*
|
|
113
|
+
* @param {String} gasUnits - raw gas units (e.g. "30000000000000" = 30TGas)
|
|
114
|
+
* @returns {String} value in yoctoNear as a string
|
|
115
|
+
*/
|
|
116
|
+
convertGasUnitsToYoctoNear(gasUnits) {
|
|
117
|
+
const YOCTO_PER_NEAR = new bignumber_js_1.default('1e24');
|
|
118
|
+
const NEAR_PER_TGAS = new bignumber_js_1.default('0.0001'); // 1 TGas = 0.0001 Near
|
|
119
|
+
const GAS_UNITS_PER_TGAS = new bignumber_js_1.default('1e12'); // 1 TGas = 1e12 gas units
|
|
120
|
+
const gas = new bignumber_js_1.default(gasUnits);
|
|
121
|
+
const tgas = gas.dividedBy(GAS_UNITS_PER_TGAS);
|
|
122
|
+
const nearCost = tgas.multipliedBy(NEAR_PER_TGAS);
|
|
123
|
+
const yoctoCost = nearCost.multipliedBy(YOCTO_PER_NEAR);
|
|
124
|
+
return yoctoCost.integerValue(bignumber_js_1.default.ROUND_FLOOR).toString();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Convert the given record into base64 string
|
|
128
|
+
*
|
|
129
|
+
* @param {Record<String, String>} data the input in the form of a map
|
|
130
|
+
* @returns {String} base64 encoded string
|
|
131
|
+
*/
|
|
132
|
+
convertToBase64(data) {
|
|
133
|
+
return Buffer.from(JSON.stringify(data)).toString('base64');
|
|
134
|
+
}
|
|
109
135
|
}
|
|
110
136
|
exports.Utils = Utils;
|
|
111
137
|
const utils = new Utils();
|
|
112
138
|
exports.default = utils;
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4QixnRUFBcUM7QUFFckMsbURBQTJEO0FBQzNELGlEQUF5RDtBQUV6RCx1Q0FBb0M7QUFFcEMsTUFBYSxLQUFLO0lBQ2hCLGtCQUFrQjtJQUNsQixjQUFjLENBQUMsT0FBZTtRQUM1QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE9BQU8sSUFBQSxtQkFBUSxFQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLEdBQVc7UUFDM0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxVQUFVLENBQUMsR0FBVztRQUNwQixJQUFJLENBQUM7WUFDSCxJQUFJLGlCQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxDQUNMLENBQUMseURBQXlELENBQUMsSUFBSSxD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QyxJQUE0QjtRQUMxQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5RCxDQUFDO0NBQ0Y7QUExSUQsc0JBMElDO0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUUxQixrQkFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVV0aWxzLCBpc0Jhc2U1OCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zLCBOZXAxNDFUb2tlbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcblxuZXhwb3J0IGNsYXNzIFV0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRBY2NvdW50SWQoYWRkcmVzcyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQmFzZTU4KGhhc2gsIDMyKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRLZXkoa2V5KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHVibGljS2V5KHB1YktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZEFjY291bnRJZChwdWJLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBrZXkgaGF2ZSB0aGUgY29ycmVjdCBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIHN0cmluZyB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHN0cmluZyBoYXZlIHRoZSBjb3JyZWN0IGZvcm1hdCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlXG4gICAqL1xuICBpc1ZhbGlkS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGFjY291bnQgaGF2ZSB0aGUgY29ycmVjdCBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjY291bnRJZCAtIHN0cmluZyB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IGlmIHRoZSBzdHJpbmcgY2FuIGhhdmUgdGhlIGNvcnJlY3QgZm9ybWF0IGFuZCBtYXRjaCB0aGUgZXhwZWN0ZWQgbGVuZ3RoXG4gICAqIG9yIGNhbiBjcmVhdGUgYSBuZXcga2V5UGFpclxuICAgKi9cbiAgaXNWYWxpZEFjY291bnRJZChhY2NvdW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghYWNjb3VudElkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICAoL14oKFthLXpcXGRdK1tcXC1fXSkqW2EtelxcZF0rXFwuKSooW2EtelxcZF0rW1xcLV9dKSpbYS16XFxkXSskLy50ZXN0KGFjY291bnRJZCkgJiZcbiAgICAgICAgYWNjb3VudElkLmxlbmd0aCA+PSAyICYmXG4gICAgICAgIGFjY291bnRJZC5sZW5ndGggPD0gNjQpIHx8XG4gICAgICBpc0Jhc2U1OChhY2NvdW50SWQsIDMyKVxuICAgICk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0Jhc2U1OChzaWduYXR1cmUsIDY0KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNCYXNlNTgodHhJZCwgMzIpO1xuICB9XG5cbiAgYmFzZTU4RW5jb2RlKHZhbHVlOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnM1OC5lbmNvZGUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGJhc2U1OCBkZWNvZGVkIHN0cmluZyBpcyBlcXVhbCB0byBsZW5ndGhcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gc3RyaW5nIHRvIGJlIGNoZWNrZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIGV4cGVjdGVkIGRlY29kZWQgbGVuZ3RoXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IGlmIHRoZSBzdHJpbmcgY2FuIGJlIGRlY29kZWQgYXMgYmFzZTU4IGFuZCBtYXRjaCB0aGUgZXhwZWN0ZWQgbGVuZ3RoXG4gICAqL1xuICBpc0Jhc2U1OCh2YWx1ZTogc3RyaW5nLCBsZW5ndGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF2YWx1ZSAmJiBiczU4LmRlY29kZSh2YWx1ZSkubGVuZ3RoID09PSBsZW5ndGg7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBiaXRnbyB0b2tlbiBuYW1lIHVzaW5nIGNvbnRyYWN0IGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRyYWN0QWRkcmVzcyB0aGUgdG9rZW4gY29udHJhY3QgYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0b2tlbiBuYW1lXG4gICAqL1xuICBmaW5kVG9rZW5OYW1lRnJvbUNvbnRyYWN0QWRkcmVzcyhjb250cmFjdEFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdG9rZW4gPSBjb2luc1xuICAgICAgLmZpbHRlcigoY29pbikgPT4gY29pbiBpbnN0YW5jZW9mIE5lcDE0MVRva2VuICYmIGNvaW4uY29udHJhY3RBZGRyZXNzID09PSBjb250cmFjdEFkZHJlc3MpXG4gICAgICAubWFwKChjb2luKSA9PiBjb2luIGFzIE5lcDE0MVRva2VuKTtcbiAgICByZXR1cm4gdG9rZW4gPyB0b2tlblswXS5uYW1lIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIHRva2VuIGluc3RhbmNlIHVzaW5nIHRoZSBiaXRnbyB0b2tlbiBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0b2tlbk5hbWUgdGhlIGJpdGdvIG5hbWUgb2YgdGhlIHRva2VuXG4gICAqIEByZXR1cm5zIHtOZXAxNDFUb2tlbnx1bmRlZmluZWR9IHRva2VuIGluc3RhbmNlIGlmIGZvdW5kXG4gICAqL1xuICBnZXRUb2tlbkluc3RhbmNlRnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IE5lcDE0MVRva2VuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zXG4gICAgICAuZmlsdGVyKChjb2luKSA9PiBjb2luIGluc3RhbmNlb2YgTmVwMTQxVG9rZW4gJiYgY29pbi5uYW1lID09PSB0b2tlbk5hbWUpXG4gICAgICAubWFwKChjb2luKSA9PiBjb2luIGFzIE5lcDE0MVRva2VuKTtcbiAgICByZXR1cm4gdG9rZW4gPyB0b2tlblswXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGZyb20gcmF3IGdhcyB1bml0cyB0byB5b2N0byBOZWFyIHZhbHVlXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBnYXNVbml0cyAtIHJhdyBnYXMgdW5pdHMgKGUuZy4gXCIzMDAwMDAwMDAwMDAwMFwiID0gMzBUR2FzKVxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSB2YWx1ZSBpbiB5b2N0b05lYXIgYXMgYSBzdHJpbmdcbiAgICovXG4gIGNvbnZlcnRHYXNVbml0c1RvWW9jdG9OZWFyKGdhc1VuaXRzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IFlPQ1RPX1BFUl9ORUFSID0gbmV3IEJpZ051bWJlcignMWUyNCcpO1xuICAgIGNvbnN0IE5FQVJfUEVSX1RHQVMgPSBuZXcgQmlnTnVtYmVyKCcwLjAwMDEnKTsgLy8gMSBUR2FzID0gMC4wMDAxIE5lYXJcbiAgICBjb25zdCBHQVNfVU5JVFNfUEVSX1RHQVMgPSBuZXcgQmlnTnVtYmVyKCcxZTEyJyk7IC8vIDEgVEdhcyA9IDFlMTIgZ2FzIHVuaXRzXG5cbiAgICBjb25zdCBnYXMgPSBuZXcgQmlnTnVtYmVyKGdhc1VuaXRzKTtcbiAgICBjb25zdCB0Z2FzID0gZ2FzLmRpdmlkZWRCeShHQVNfVU5JVFNfUEVSX1RHQVMpO1xuICAgIGNvbnN0IG5lYXJDb3N0ID0gdGdhcy5tdWx0aXBsaWVkQnkoTkVBUl9QRVJfVEdBUyk7XG4gICAgY29uc3QgeW9jdG9Db3N0ID0gbmVhckNvc3QubXVsdGlwbGllZEJ5KFlPQ1RPX1BFUl9ORUFSKTtcblxuICAgIHJldHVybiB5b2N0b0Nvc3QuaW50ZWdlclZhbHVlKEJpZ051bWJlci5ST1VORF9GTE9PUikudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSBnaXZlbiByZWNvcmQgaW50byBiYXNlNjQgc3RyaW5nXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPFN0cmluZywgU3RyaW5nPn0gZGF0YSB0aGUgaW5wdXQgaW4gdGhlIGZvcm0gb2YgYSBtYXBcbiAgICogQHJldHVybnMge1N0cmluZ30gYmFzZTY0IGVuY29kZWQgc3RyaW5nXG4gICAqL1xuICBjb252ZXJ0VG9CYXNlNjQoZGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGRhdGEpKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
|
package/dist/src/near.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @prettier
|
|
3
3
|
*/
|
|
4
|
-
import { BaseCoin as StaticsBaseCoin, CoinFamily } from '@bitgo-beta/statics';
|
|
5
|
-
import { BaseCoin, BitGoBase, KeyPair, ParsedTransaction, ParseTransactionOptions as BaseParseTransactionOptions, SignedTransaction, SignTransactionOptions as BaseSignTransactionOptions, TransactionExplanation, VerifyAddressOptions, VerifyTransactionOptions, Eddsa, MPCAlgorithm, MPCTx, MPCSweepTxs, MPCSweepRecoveryOptions, MPCTxs, MultisigType, AuditDecryptedKeyParams, TokenEnablementConfig, MPCRecoveryOptions } from '@bitgo-beta/sdk-core';
|
|
6
4
|
import * as request from 'superagent';
|
|
5
|
+
import { AuditDecryptedKeyParams, BaseCoin, BitGoBase, Eddsa, KeyPair, MPCAlgorithm, MPCRecoveryOptions, MPCSweepRecoveryOptions, MPCSweepTxs, MPCTx, MPCTxs, MultisigType, ParsedTransaction, ParseTransactionOptions as BaseParseTransactionOptions, SignedTransaction, SignTransactionOptions as BaseSignTransactionOptions, TokenEnablementConfig, TransactionExplanation, VerifyAddressOptions, VerifyTransactionOptions } from '@bitgo-beta/sdk-core';
|
|
6
|
+
import { BaseCoin as StaticsBaseCoin, CoinFamily } from '@bitgo-beta/statics';
|
|
7
7
|
export interface SignTransactionOptions extends BaseSignTransactionOptions {
|
|
8
8
|
txPrebuild: TransactionPrebuild;
|
|
9
9
|
prv: string;
|
|
@@ -138,6 +138,43 @@ export declare class Near extends BaseCoin {
|
|
|
138
138
|
* @param params
|
|
139
139
|
*/
|
|
140
140
|
recover(params: MPCRecoveryOptions): Promise<MPCTx | MPCSweepTxs>;
|
|
141
|
+
/**
|
|
142
|
+
* Function to handle near token recovery
|
|
143
|
+
* @param {MPCRecoveryOptions} params mpc recovery options input
|
|
144
|
+
* @param {Nep141Token} token the token object
|
|
145
|
+
* @param {String} senderAddress sender address
|
|
146
|
+
* @param {String} derivationPath the derivation path
|
|
147
|
+
* @param {Number} idx current index
|
|
148
|
+
* @param {String} bitgoKey bitgo key
|
|
149
|
+
* @param {Boolean} isStorageDepositEnabled flag indicating whether storage deposit is enabled on the receiver
|
|
150
|
+
* @param {BigNumber} availableTokenBalance currently available token balance on the address
|
|
151
|
+
* @param {Boolean} isUnsignedSweep flag indicating whether it is an unsigned sweep
|
|
152
|
+
* @returns {Promise<MPCTx | MPCSweepTxs>}
|
|
153
|
+
*/
|
|
154
|
+
private recoverNearToken;
|
|
155
|
+
/**
|
|
156
|
+
* Function to build unsigned sweep transaction
|
|
157
|
+
* @param {TransactionBuilder} txBuilder the near transaction builder
|
|
158
|
+
* @param {String} senderAddress sender address
|
|
159
|
+
* @param {String} receiverAddress the receiver address
|
|
160
|
+
* @param {String} bitgoKey bitgo key
|
|
161
|
+
* @param {Number} index current index
|
|
162
|
+
* @param {String} derivationPath the derivation path
|
|
163
|
+
* @param {BigNumber} netAmount net amount to be recovered
|
|
164
|
+
* @param {BigNumber} netGas net gas required
|
|
165
|
+
* @param {Nep141Token} token optional nep141 token instance
|
|
166
|
+
* @returns {Promise<MPCSweepTxs>}
|
|
167
|
+
*/
|
|
168
|
+
private buildUnsignedSweepTransaction;
|
|
169
|
+
/**
|
|
170
|
+
* Function to sign the recovery transaction
|
|
171
|
+
* @param {TransactionBuilder} txBuilder the near transaction builder
|
|
172
|
+
* @param {MPCRecoveryOptions} params mpc recovery options input
|
|
173
|
+
* @param {String} derivationPath the derivation path
|
|
174
|
+
* @param {String} senderAddress the sender address
|
|
175
|
+
* @returns {Promise<String>}
|
|
176
|
+
*/
|
|
177
|
+
private signRecoveryTransaction;
|
|
141
178
|
createBroadcastableSweepTransaction(params: MPCSweepRecoveryOptions): Promise<MPCTxs>;
|
|
142
179
|
/**
|
|
143
180
|
* Make a request to one of the public EOS nodes available
|
|
@@ -151,6 +188,20 @@ export declare class Near extends BaseCoin {
|
|
|
151
188
|
bs58EncodedPublicKey: string;
|
|
152
189
|
}): Promise<NearTxBuilderParamsFromNode>;
|
|
153
190
|
protected getAccountBalance(accountId: string, storageAmountPerByte: number): Promise<string>;
|
|
191
|
+
/**
|
|
192
|
+
* Function to get the fungible token balance for an account
|
|
193
|
+
* @param {String} accountId account for which the ft balance to be fetched
|
|
194
|
+
* @param tokenContractAddress the token contract address
|
|
195
|
+
* @returns {Promise<String>}
|
|
196
|
+
*/
|
|
197
|
+
protected getAccountFungibleTokenBalance(accountId: string, tokenContractAddress: string): Promise<string>;
|
|
198
|
+
/**
|
|
199
|
+
* Function to check if storage deposit is enabled on an address for a token
|
|
200
|
+
* @param {String} accountId account for which the storage balance to be fetched
|
|
201
|
+
* @param tokenContractAddress the token contract address
|
|
202
|
+
* @returns {Promise<Boolean>} true if we find the storage balance, false if response is null
|
|
203
|
+
*/
|
|
204
|
+
protected checkIfStorageDepositIsEnabled(accountId: string, tokenContractAddress: string): Promise<boolean>;
|
|
154
205
|
protected getProtocolConfig(): Promise<ProtocolConfigOutput>;
|
|
155
206
|
protected getGasPrice(blockHash: string): Promise<string>;
|
|
156
207
|
protected getPublicNodeUrls(): string[];
|
package/dist/src/near.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"near.d.ts","sourceRoot":"","sources":["../../src/near.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"near.d.ts","sourceRoot":"","sources":["../../src/near.ts"],"names":[],"mappings":"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"}
|
package/dist/src/near.js
CHANGED
|
@@ -40,16 +40,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
40
40
|
};
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
42
|
exports.Near = void 0;
|
|
43
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
44
43
|
const _ = __importStar(require("lodash"));
|
|
44
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
45
45
|
const base58 = __importStar(require("bs58"));
|
|
46
|
-
const statics_1 = require("@bitgo-beta/statics");
|
|
47
|
-
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
48
46
|
const nearAPI = __importStar(require("near-api-js"));
|
|
49
47
|
const request = __importStar(require("superagent"));
|
|
48
|
+
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
49
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
50
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
50
51
|
const lib_1 = require("./lib");
|
|
51
52
|
const utils_1 = __importDefault(require("./lib/utils"));
|
|
52
|
-
const
|
|
53
|
+
const constants_1 = require("./lib/constants");
|
|
53
54
|
class Near extends sdk_core_1.BaseCoin {
|
|
54
55
|
constructor(bitgo, staticsCoin) {
|
|
55
56
|
super(bitgo);
|
|
@@ -254,6 +255,11 @@ class Near extends sdk_core_1.BaseCoin {
|
|
|
254
255
|
const isUnsignedSweep = !params.userKey && !params.backupKey && !params.walletPassphrase;
|
|
255
256
|
const MPC = await sdk_core_1.EDDSAMethods.getInitializedMpcInstance();
|
|
256
257
|
const { storageAmountPerByte, transferCost, receiptConfig } = await this.getProtocolConfig();
|
|
258
|
+
let isStorageDepositEnabled = false;
|
|
259
|
+
if (params.tokenContractAddress) {
|
|
260
|
+
// check if receiver storage deposit is enabled
|
|
261
|
+
isStorageDepositEnabled = await this.checkIfStorageDepositIsEnabled(params.recoveryDestination, params.tokenContractAddress);
|
|
262
|
+
}
|
|
257
263
|
for (let i = startIdx; i < numIteration + startIdx; i++) {
|
|
258
264
|
const currPath = `m/${i}`;
|
|
259
265
|
const accountId = MPC.deriveUnhardened(bitgoKey, currPath).slice(0, 64);
|
|
@@ -271,6 +277,38 @@ class Near extends sdk_core_1.BaseCoin {
|
|
|
271
277
|
if (availableBalance.toNumber() <= 0) {
|
|
272
278
|
continue;
|
|
273
279
|
}
|
|
280
|
+
const feeReserve = (0, bignumber_js_1.default)(statics_1.Networks[this.network].near.feeReserve);
|
|
281
|
+
const storageReserve = (0, bignumber_js_1.default)(statics_1.Networks[this.network].near.storageReserve);
|
|
282
|
+
// check for possible token recovery, recover the token provided by the user
|
|
283
|
+
if (params.tokenContractAddress) {
|
|
284
|
+
const tokenName = utils_1.default.findTokenNameFromContractAddress(params.tokenContractAddress);
|
|
285
|
+
if (!tokenName) {
|
|
286
|
+
throw new Error(`Token name not found for contract address ${params.tokenContractAddress}. The address may be invalid or unsupported. Please refer to the supported tokens in the BitGo documentation for guidance.`);
|
|
287
|
+
}
|
|
288
|
+
const token = utils_1.default.getTokenInstanceFromTokenName(tokenName);
|
|
289
|
+
if (!token) {
|
|
290
|
+
throw new Error(`Token instance could not be created for token name ${tokenName}. The token may be invalid or unsupported. Please refer to the supported tokens in the BitGo documentation for guidance.`);
|
|
291
|
+
}
|
|
292
|
+
let availableTokenBalance;
|
|
293
|
+
try {
|
|
294
|
+
availableTokenBalance = new bignumber_js_1.default(await this.getAccountFungibleTokenBalance(accountId, params.tokenContractAddress));
|
|
295
|
+
}
|
|
296
|
+
catch (e) {
|
|
297
|
+
throw e;
|
|
298
|
+
}
|
|
299
|
+
if (availableTokenBalance.toNumber() <= 0) {
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
const netAmount = availableBalance
|
|
303
|
+
.minus(utils_1.default.convertGasUnitsToYoctoNear(constants_1.MAX_GAS_LIMIT_FOR_FT_TRANSFER))
|
|
304
|
+
.minus(feeReserve)
|
|
305
|
+
.minus(storageReserve);
|
|
306
|
+
if (netAmount.toNumber() <= 0) {
|
|
307
|
+
throw new Error(`Found address ${i} with non-zero fund but fund is insufficient to support a token recover ` +
|
|
308
|
+
`transaction. Please start the next scan at address index ${i + 1}.`);
|
|
309
|
+
}
|
|
310
|
+
return this.recoverNearToken(params, token, accountId, currPath, i, bitgoKey, isStorageDepositEnabled, availableTokenBalance, isUnsignedSweep);
|
|
311
|
+
}
|
|
274
312
|
// first build the unsigned txn
|
|
275
313
|
const bs58EncodedPublicKey = nearAPI.utils.serialize.base_encode(new Uint8Array(Buffer.from(accountId, 'hex')));
|
|
276
314
|
const { nonce, blockHash } = await this.getAccessKey({ accountId, bs58EncodedPublicKey });
|
|
@@ -283,8 +321,6 @@ class Near extends sdk_core_1.BaseCoin {
|
|
|
283
321
|
.plus(new bignumber_js_1.default(transferCost.execution).plus(receiptConfig.execution).multipliedBy(gasPriceSecondBlock));
|
|
284
322
|
// adding some padding to make sure the gas doesn't go below required gas by network
|
|
285
323
|
const totalGasWithPadding = totalGasRequired.multipliedBy(1.5);
|
|
286
|
-
const feeReserve = (0, bignumber_js_1.default)(statics_1.Networks[this.network].near.feeReserve);
|
|
287
|
-
const storageReserve = (0, bignumber_js_1.default)(statics_1.Networks[this.network].near.storageReserve);
|
|
288
324
|
const netAmount = availableBalance.minus(totalGasWithPadding).minus(feeReserve).minus(storageReserve);
|
|
289
325
|
if (netAmount.toNumber() <= 0) {
|
|
290
326
|
throw new Error(`Found address ${i} with non-zero fund but fund is insufficient to support a recover ` +
|
|
@@ -301,94 +337,166 @@ class Near extends sdk_core_1.BaseCoin {
|
|
|
301
337
|
const unsignedTransaction = (await txBuilder.build());
|
|
302
338
|
let serializedTx = unsignedTransaction.toBroadcastFormat();
|
|
303
339
|
if (!isUnsignedSweep) {
|
|
304
|
-
|
|
305
|
-
/* ***************** START **************************************/
|
|
306
|
-
// TODO(BG-51092): This looks like a common part which can be extracted out too
|
|
307
|
-
if (!params.userKey) {
|
|
308
|
-
throw new Error('missing userKey');
|
|
309
|
-
}
|
|
310
|
-
if (!params.backupKey) {
|
|
311
|
-
throw new Error('missing backupKey');
|
|
312
|
-
}
|
|
313
|
-
if (!params.walletPassphrase) {
|
|
314
|
-
throw new Error('missing wallet passphrase');
|
|
315
|
-
}
|
|
316
|
-
// Clean up whitespace from entered values
|
|
317
|
-
const userKey = params.userKey.replace(/\s/g, '');
|
|
318
|
-
const backupKey = params.backupKey.replace(/\s/g, '');
|
|
319
|
-
// Decrypt private keys from KeyCard values
|
|
320
|
-
let userPrv;
|
|
321
|
-
try {
|
|
322
|
-
userPrv = this.bitgo.decrypt({
|
|
323
|
-
input: userKey,
|
|
324
|
-
password: params.walletPassphrase,
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
catch (e) {
|
|
328
|
-
throw new Error(`Error decrypting user keychain: ${e.message}`);
|
|
329
|
-
}
|
|
330
|
-
/** TODO BG-52419 Implement Codec for parsing */
|
|
331
|
-
const userSigningMaterial = JSON.parse(userPrv);
|
|
332
|
-
let backupPrv;
|
|
333
|
-
try {
|
|
334
|
-
backupPrv = this.bitgo.decrypt({
|
|
335
|
-
input: backupKey,
|
|
336
|
-
password: params.walletPassphrase,
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
catch (e) {
|
|
340
|
-
throw new Error(`Error decrypting backup keychain: ${e.message}`);
|
|
341
|
-
}
|
|
342
|
-
const backupSigningMaterial = JSON.parse(backupPrv);
|
|
343
|
-
/* ********************** END ***********************************/
|
|
344
|
-
// add signature
|
|
345
|
-
const signatureHex = await sdk_core_1.EDDSAMethods.getTSSSignature(userSigningMaterial, backupSigningMaterial, currPath, unsignedTransaction);
|
|
346
|
-
const publicKeyObj = { pub: accountId };
|
|
347
|
-
txBuilder.addSignature(publicKeyObj, signatureHex);
|
|
348
|
-
const completedTransaction = await txBuilder.build();
|
|
349
|
-
serializedTx = completedTransaction.toBroadcastFormat();
|
|
340
|
+
serializedTx = await this.signRecoveryTransaction(txBuilder, params, currPath, accountId);
|
|
350
341
|
}
|
|
351
342
|
else {
|
|
352
|
-
|
|
353
|
-
const walletCoin = this.getChain();
|
|
354
|
-
const inputs = [
|
|
355
|
-
{
|
|
356
|
-
address: accountId, // The sender's account ID
|
|
357
|
-
valueString: value.toString(),
|
|
358
|
-
value: value.toNumber(),
|
|
359
|
-
},
|
|
360
|
-
];
|
|
361
|
-
const outputs = [
|
|
362
|
-
{
|
|
363
|
-
address: params.recoveryDestination, // The recovery destination address
|
|
364
|
-
valueString: value.toString(),
|
|
365
|
-
coinName: walletCoin,
|
|
366
|
-
},
|
|
367
|
-
];
|
|
368
|
-
const spendAmount = value.toString();
|
|
369
|
-
const parsedTx = { inputs: inputs, outputs: outputs, spendAmount: spendAmount, type: '' };
|
|
370
|
-
const feeInfo = { fee: totalGasWithPadding.toNumber(), feeString: totalGasWithPadding.toFixed() }; // Include gas fees
|
|
371
|
-
const transaction = {
|
|
372
|
-
serializedTx: serializedTx, // Serialized unsigned transaction
|
|
373
|
-
scanIndex: i, // Current index in the scan
|
|
374
|
-
coin: walletCoin,
|
|
375
|
-
signableHex: unsignedTransaction.signablePayload.toString('hex'), // Hex payload for signing
|
|
376
|
-
derivationPath: currPath, // Derivation path for the account
|
|
377
|
-
parsedTx: parsedTx,
|
|
378
|
-
feeInfo: feeInfo,
|
|
379
|
-
coinSpecific: { commonKeychain: bitgoKey }, // Include block hash for NEAR
|
|
380
|
-
};
|
|
381
|
-
const transactions = [{ unsignedTx: transaction, signatureShares: [] }];
|
|
382
|
-
const txRequest = {
|
|
383
|
-
transactions: transactions,
|
|
384
|
-
walletCoin: walletCoin,
|
|
385
|
-
};
|
|
386
|
-
return { txRequests: [txRequest] };
|
|
343
|
+
return this.buildUnsignedSweepTransaction(txBuilder, accountId, params.recoveryDestination, bitgoKey, i, currPath, netAmount, totalGasWithPadding);
|
|
387
344
|
}
|
|
388
345
|
return { serializedTx: serializedTx, scanIndex: i };
|
|
389
346
|
}
|
|
390
347
|
throw new Error('Did not find an address with funds to recover');
|
|
391
348
|
}
|
|
349
|
+
/**
|
|
350
|
+
* Function to handle near token recovery
|
|
351
|
+
* @param {MPCRecoveryOptions} params mpc recovery options input
|
|
352
|
+
* @param {Nep141Token} token the token object
|
|
353
|
+
* @param {String} senderAddress sender address
|
|
354
|
+
* @param {String} derivationPath the derivation path
|
|
355
|
+
* @param {Number} idx current index
|
|
356
|
+
* @param {String} bitgoKey bitgo key
|
|
357
|
+
* @param {Boolean} isStorageDepositEnabled flag indicating whether storage deposit is enabled on the receiver
|
|
358
|
+
* @param {BigNumber} availableTokenBalance currently available token balance on the address
|
|
359
|
+
* @param {Boolean} isUnsignedSweep flag indicating whether it is an unsigned sweep
|
|
360
|
+
* @returns {Promise<MPCTx | MPCSweepTxs>}
|
|
361
|
+
*/
|
|
362
|
+
async recoverNearToken(params, token, senderAddress, derivationPath, idx, bitgoKey, isStorageDepositEnabled, availableTokenBalance, isUnsignedSweep) {
|
|
363
|
+
const factory = new lib_1.TransactionBuilderFactory(token);
|
|
364
|
+
const bs58EncodedPublicKey = nearAPI.utils.serialize.base_encode(new Uint8Array(Buffer.from(senderAddress, 'hex')));
|
|
365
|
+
const { nonce, blockHash } = await this.getAccessKey({ accountId: senderAddress, bs58EncodedPublicKey });
|
|
366
|
+
const txBuilder = factory
|
|
367
|
+
.getFungibleTokenTransferBuilder()
|
|
368
|
+
.sender(senderAddress, senderAddress)
|
|
369
|
+
.nonce(nonce)
|
|
370
|
+
.receiverId(token.contractAddress)
|
|
371
|
+
.recentBlockHash(blockHash)
|
|
372
|
+
.ftReceiverId(params.recoveryDestination)
|
|
373
|
+
.gas(constants_1.MAX_GAS_LIMIT_FOR_FT_TRANSFER)
|
|
374
|
+
.deposit('1')
|
|
375
|
+
.amount(availableTokenBalance.toString());
|
|
376
|
+
if (!isStorageDepositEnabled) {
|
|
377
|
+
txBuilder.addStorageDeposit({
|
|
378
|
+
deposit: BigInt(token.storageDepositAmount),
|
|
379
|
+
gas: BigInt(constants_1.MAX_GAS_LIMIT_FOR_FT_TRANSFER),
|
|
380
|
+
accountId: params.recoveryDestination,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
if (isUnsignedSweep) {
|
|
384
|
+
return this.buildUnsignedSweepTransaction(txBuilder, senderAddress, params.recoveryDestination, bitgoKey, idx, derivationPath, availableTokenBalance, new bignumber_js_1.default(utils_1.default.convertGasUnitsToYoctoNear(constants_1.MAX_GAS_LIMIT_FOR_FT_TRANSFER)), token);
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
const serializedTx = await this.signRecoveryTransaction(txBuilder, params, derivationPath, senderAddress);
|
|
388
|
+
return { serializedTx: serializedTx, scanIndex: idx };
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Function to build unsigned sweep transaction
|
|
393
|
+
* @param {TransactionBuilder} txBuilder the near transaction builder
|
|
394
|
+
* @param {String} senderAddress sender address
|
|
395
|
+
* @param {String} receiverAddress the receiver address
|
|
396
|
+
* @param {String} bitgoKey bitgo key
|
|
397
|
+
* @param {Number} index current index
|
|
398
|
+
* @param {String} derivationPath the derivation path
|
|
399
|
+
* @param {BigNumber} netAmount net amount to be recovered
|
|
400
|
+
* @param {BigNumber} netGas net gas required
|
|
401
|
+
* @param {Nep141Token} token optional nep141 token instance
|
|
402
|
+
* @returns {Promise<MPCSweepTxs>}
|
|
403
|
+
*/
|
|
404
|
+
async buildUnsignedSweepTransaction(txBuilder, senderAddress, receiverAddress, bitgoKey, index, derivationPath, netAmount, netGas, token) {
|
|
405
|
+
const isTokenTransaction = !!token;
|
|
406
|
+
const unsignedTransaction = (await txBuilder.build());
|
|
407
|
+
const serializedTx = unsignedTransaction.toBroadcastFormat();
|
|
408
|
+
const walletCoin = isTokenTransaction ? token.name : this.getChain();
|
|
409
|
+
const inputs = [
|
|
410
|
+
{
|
|
411
|
+
address: senderAddress,
|
|
412
|
+
valueString: netAmount.toString(),
|
|
413
|
+
value: netAmount.toNumber(),
|
|
414
|
+
},
|
|
415
|
+
];
|
|
416
|
+
const outputs = [
|
|
417
|
+
{
|
|
418
|
+
address: receiverAddress,
|
|
419
|
+
valueString: netAmount.toString(),
|
|
420
|
+
coinName: walletCoin,
|
|
421
|
+
},
|
|
422
|
+
];
|
|
423
|
+
const spendAmount = netAmount.toString();
|
|
424
|
+
const parsedTx = { inputs: inputs, outputs: outputs, spendAmount: spendAmount, type: '' };
|
|
425
|
+
const feeInfo = { fee: netGas.toNumber(), feeString: netGas.toFixed() }; // Include gas fees
|
|
426
|
+
const transaction = {
|
|
427
|
+
serializedTx: serializedTx, // Serialized unsigned transaction
|
|
428
|
+
scanIndex: index, // Current index in the scan
|
|
429
|
+
coin: walletCoin,
|
|
430
|
+
signableHex: unsignedTransaction.signablePayload.toString('hex'), // Hex payload for signing
|
|
431
|
+
derivationPath: derivationPath, // Derivation path for the account
|
|
432
|
+
parsedTx: parsedTx,
|
|
433
|
+
feeInfo: feeInfo,
|
|
434
|
+
coinSpecific: { commonKeychain: bitgoKey }, // Include block hash for NEAR
|
|
435
|
+
};
|
|
436
|
+
const transactions = [{ unsignedTx: transaction, signatureShares: [] }];
|
|
437
|
+
const txRequest = {
|
|
438
|
+
transactions: transactions,
|
|
439
|
+
walletCoin: walletCoin,
|
|
440
|
+
};
|
|
441
|
+
return { txRequests: [txRequest] };
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Function to sign the recovery transaction
|
|
445
|
+
* @param {TransactionBuilder} txBuilder the near transaction builder
|
|
446
|
+
* @param {MPCRecoveryOptions} params mpc recovery options input
|
|
447
|
+
* @param {String} derivationPath the derivation path
|
|
448
|
+
* @param {String} senderAddress the sender address
|
|
449
|
+
* @returns {Promise<String>}
|
|
450
|
+
*/
|
|
451
|
+
async signRecoveryTransaction(txBuilder, params, derivationPath, senderAddress) {
|
|
452
|
+
const unsignedTransaction = (await txBuilder.build());
|
|
453
|
+
// Sign the txn
|
|
454
|
+
/* ***************** START **************************************/
|
|
455
|
+
// TODO(BG-51092): This looks like a common part which can be extracted out too
|
|
456
|
+
if (!params.userKey) {
|
|
457
|
+
throw new Error('missing userKey');
|
|
458
|
+
}
|
|
459
|
+
if (!params.backupKey) {
|
|
460
|
+
throw new Error('missing backupKey');
|
|
461
|
+
}
|
|
462
|
+
if (!params.walletPassphrase) {
|
|
463
|
+
throw new Error('missing wallet passphrase');
|
|
464
|
+
}
|
|
465
|
+
// Clean up whitespace from entered values
|
|
466
|
+
const userKey = params.userKey.replace(/\s/g, '');
|
|
467
|
+
const backupKey = params.backupKey.replace(/\s/g, '');
|
|
468
|
+
// Decrypt private keys from KeyCard values
|
|
469
|
+
let userPrv;
|
|
470
|
+
try {
|
|
471
|
+
userPrv = this.bitgo.decrypt({
|
|
472
|
+
input: userKey,
|
|
473
|
+
password: params.walletPassphrase,
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
catch (e) {
|
|
477
|
+
throw new Error(`Error decrypting user keychain: ${e.message}`);
|
|
478
|
+
}
|
|
479
|
+
/** TODO BG-52419 Implement Codec for parsing */
|
|
480
|
+
const userSigningMaterial = JSON.parse(userPrv);
|
|
481
|
+
let backupPrv;
|
|
482
|
+
try {
|
|
483
|
+
backupPrv = this.bitgo.decrypt({
|
|
484
|
+
input: backupKey,
|
|
485
|
+
password: params.walletPassphrase,
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
catch (e) {
|
|
489
|
+
throw new Error(`Error decrypting backup keychain: ${e.message}`);
|
|
490
|
+
}
|
|
491
|
+
const backupSigningMaterial = JSON.parse(backupPrv);
|
|
492
|
+
/* ********************** END ***********************************/
|
|
493
|
+
// add signature
|
|
494
|
+
const signatureHex = await sdk_core_1.EDDSAMethods.getTSSSignature(userSigningMaterial, backupSigningMaterial, derivationPath, unsignedTransaction);
|
|
495
|
+
const publicKeyObj = { pub: senderAddress };
|
|
496
|
+
txBuilder.addSignature(publicKeyObj, signatureHex);
|
|
497
|
+
const completedTransaction = await txBuilder.build();
|
|
498
|
+
return completedTransaction.toBroadcastFormat();
|
|
499
|
+
}
|
|
392
500
|
async createBroadcastableSweepTransaction(params) {
|
|
393
501
|
const req = params.signatureShares;
|
|
394
502
|
const broadcastableTransactions = [];
|
|
@@ -507,6 +615,73 @@ class Near extends sdk_core_1.BaseCoin {
|
|
|
507
615
|
const availableBalance = totalBalance.minus(bignumber_js_1.default.max(staked, stateStaked));
|
|
508
616
|
return availableBalance.toString();
|
|
509
617
|
}
|
|
618
|
+
/**
|
|
619
|
+
* Function to get the fungible token balance for an account
|
|
620
|
+
* @param {String} accountId account for which the ft balance to be fetched
|
|
621
|
+
* @param tokenContractAddress the token contract address
|
|
622
|
+
* @returns {Promise<String>}
|
|
623
|
+
*/
|
|
624
|
+
async getAccountFungibleTokenBalance(accountId, tokenContractAddress) {
|
|
625
|
+
const base64Args = utils_1.default.convertToBase64({ account_id: accountId });
|
|
626
|
+
const response = await this.getDataFromNode({
|
|
627
|
+
payload: {
|
|
628
|
+
jsonrpc: '2.0',
|
|
629
|
+
id: 'dontcare',
|
|
630
|
+
method: 'query',
|
|
631
|
+
params: {
|
|
632
|
+
request_type: 'call_function',
|
|
633
|
+
finality: 'final',
|
|
634
|
+
account_id: tokenContractAddress,
|
|
635
|
+
method_name: 'ft_balance_of',
|
|
636
|
+
args_base64: base64Args,
|
|
637
|
+
},
|
|
638
|
+
},
|
|
639
|
+
});
|
|
640
|
+
if (response.status !== 200) {
|
|
641
|
+
throw new Error('Failed to fetch ft balance of the account');
|
|
642
|
+
}
|
|
643
|
+
const errorCause = response.body.error?.cause?.name;
|
|
644
|
+
if (errorCause !== undefined) {
|
|
645
|
+
throw new Error(errorCause);
|
|
646
|
+
}
|
|
647
|
+
const resultUint8Array = new Uint8Array(response.body.result.result);
|
|
648
|
+
const raw = new TextDecoder().decode(resultUint8Array);
|
|
649
|
+
return JSON.parse(raw);
|
|
650
|
+
}
|
|
651
|
+
/**
|
|
652
|
+
* Function to check if storage deposit is enabled on an address for a token
|
|
653
|
+
* @param {String} accountId account for which the storage balance to be fetched
|
|
654
|
+
* @param tokenContractAddress the token contract address
|
|
655
|
+
* @returns {Promise<Boolean>} true if we find the storage balance, false if response is null
|
|
656
|
+
*/
|
|
657
|
+
async checkIfStorageDepositIsEnabled(accountId, tokenContractAddress) {
|
|
658
|
+
const base64Args = utils_1.default.convertToBase64({ account_id: accountId });
|
|
659
|
+
const response = await this.getDataFromNode({
|
|
660
|
+
payload: {
|
|
661
|
+
jsonrpc: '2.0',
|
|
662
|
+
id: 'dontcare',
|
|
663
|
+
method: 'query',
|
|
664
|
+
params: {
|
|
665
|
+
request_type: 'call_function',
|
|
666
|
+
finality: 'final',
|
|
667
|
+
account_id: tokenContractAddress,
|
|
668
|
+
method_name: 'storage_balance_of',
|
|
669
|
+
args_base64: base64Args,
|
|
670
|
+
},
|
|
671
|
+
},
|
|
672
|
+
});
|
|
673
|
+
if (response.status !== 200) {
|
|
674
|
+
throw new Error('Failed to fetch storage deposit of the account');
|
|
675
|
+
}
|
|
676
|
+
const errorCause = response.body.error?.cause?.name;
|
|
677
|
+
if (errorCause !== undefined) {
|
|
678
|
+
throw new Error(errorCause);
|
|
679
|
+
}
|
|
680
|
+
const resultUint8Array = new Uint8Array(response.body.result.result);
|
|
681
|
+
const raw = new TextDecoder().decode(resultUint8Array);
|
|
682
|
+
const decoded = JSON.parse(raw);
|
|
683
|
+
return decoded !== null;
|
|
684
|
+
}
|
|
510
685
|
async getProtocolConfig() {
|
|
511
686
|
const response = await this.getDataFromNode({
|
|
512
687
|
payload: {
|
|
@@ -660,4 +835,4 @@ class Near extends sdk_core_1.BaseCoin {
|
|
|
660
835
|
}
|
|
661
836
|
exports.Near = Near;
|
|
662
837
|
Near.initialized = false;
|
|
663
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uZWFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsZ0VBQXFDO0FBQ3JDLDBDQUE0QjtBQUM1Qiw2Q0FBK0I7QUFDL0IsaURBQStGO0FBRS9GLG1EQThCOEI7QUFDOUIscURBQXVDO0FBQ3ZDLG9EQUFzQztBQUV0QywrQkFBdUY7QUFDdkYsd0RBQW9DO0FBQ3BDLHlEQUErRDtBQXNFL0QsTUFBYSxJQUFLLFNBQVEsbUJBQVE7SUFHaEMsWUFBWSxLQUFnQixFQUFFLFdBQXVDO1FBQ25FLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQVVMLFlBQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFUbkUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQU1ELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkJBQTJCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsc0JBQXNCO1FBQ3BCLE9BQU8sd0JBQWEsQ0FBQyxHQUFHLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsd0JBQXdCO1FBQ3RCLE9BQU87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b0IsRUFBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7O0FBdnJCSCxvQkF3ckJDO0FBNXFCa0IsZ0JBQVcsR0FBRyxLQUFLLEFBQVIsQ0FBUyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cblxuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgYmFzZTU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IHsgTmV0d29ya3MsIEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgQ29pbkZhbWlseSwgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcblxuaW1wb3J0IHtcbiAgQmFzZUNvaW4sXG4gIEJpdEdvQmFzZSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBLZXlQYWlyLFxuICBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgRWRkc2EsXG4gIFB1YmxpY0tleSxcbiAgRW52aXJvbm1lbnRzLFxuICBNUENBbGdvcml0aG0sXG4gIEVERFNBTWV0aG9kcyxcbiAgRUREU0FNZXRob2RUeXBlcyxcbiAgTVBDVHgsXG4gIE1QQ1Vuc2lnbmVkVHgsXG4gIFJlY292ZXJ5VHhSZXF1ZXN0LFxuICBNUENTd2VlcFR4cyxcbiAgTVBDU3dlZXBSZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1R4cyxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyxcbiAgVG9rZW5FbmFibGVtZW50Q29uZmlnLFxuICBNUENSZWNvdmVyeU9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIG5lYXJBUEkgZnJvbSAnbmVhci1hcGktanMnO1xuaW1wb3J0ICogYXMgcmVxdWVzdCBmcm9tICdzdXBlcmFnZW50JztcblxuaW1wb3J0IHsgS2V5UGFpciBhcyBOZWFyS2V5UGFpciwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgbmVhclV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCB7IGF1ZGl0RWRkc2FQcml2YXRlS2V5IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgZXh0ZW5kcyBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHBydjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUHJlYnVpbGQge1xuICB0eEhleDogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgYmxvY2tIYXNoOiBzdHJpbmc7XG4gIG5vbmNlOiBiaWdpbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xuICBmZWVJbmZvOiB7XG4gICAgZmVlOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpZWRUcmFuc2FjdGlvblBhcmFtZXRlcnMge1xuICB0eEhleDogc3RyaW5nO1xuICBwcnY6IHN0cmluZztcbiAgc2lnbmVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmVhclBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIGV4dGVuZHMgQmFzZVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDtcbiAgcHVibGljS2V5OiBzdHJpbmc7XG4gIGZlZUluZm86IHtcbiAgICBmZWU6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFRyYW5zYWN0aW9uT3V0cHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBhbW91bnQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5lYXJUeEJ1aWxkZXJQYXJhbXNGcm9tTm9kZSB7XG4gIG5vbmNlOiBiaWdpbnQ7XG4gIGJsb2NrSGFzaDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTmVhckZlZUNvbmZpZyB7XG4gIHNlbmRTaXI6IG51bWJlcjtcbiAgc2VuZE5vdFNpcjogbnVtYmVyO1xuICBleGVjdXRpb246IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFByb3RvY29sQ29uZmlnT3V0cHV0IHtcbiAgc3RvcmFnZUFtb3VudFBlckJ5dGU6IG51bWJlcjtcbiAgdHJhbnNmZXJDb3N0OiBOZWFyRmVlQ29uZmlnO1xuICByZWNlaXB0Q29uZmlnOiBOZWFyRmVlQ29uZmlnO1xufVxuXG50eXBlIFRyYW5zYWN0aW9uSW5wdXQgPSBUcmFuc2FjdGlvbk91dHB1dDtcblxuZXhwb3J0IGludGVyZmFjZSBOZWFyUGFyc2VkVHJhbnNhY3Rpb24gZXh0ZW5kcyBQYXJzZWRUcmFuc2FjdGlvbiB7XG4gIC8vIHRvdGFsIGFzc2V0cyBiZWluZyBtb3ZlZCwgaW5jbHVkaW5nIGZlZXNcbiAgaW5wdXRzOiBUcmFuc2FjdGlvbklucHV0W107XG5cbiAgLy8gd2hlcmUgYXNzZXRzIGFyZSBtb3ZlZCB0b1xuICBvdXRwdXRzOiBUcmFuc2FjdGlvbk91dHB1dFtdO1xufVxuXG5leHBvcnQgdHlwZSBOZWFyVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IFRyYW5zYWN0aW9uRXhwbGFuYXRpb247XG5cbmV4cG9ydCBjbGFzcyBOZWFyIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBNUEM6IEVkZHNhO1xuICBwcm90ZWN0ZWQgbmV0d29yayA9IHRoaXMuYml0Z28uZ2V0RW52KCkgPT09ICdwcm9kJyA/ICdtYWluJyA6ICd0ZXN0JztcblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgTmVhcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIGNvaW4gc3VwcG9ydHMgVFNTIHdhbGxldHMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFRTUyBXYWxsZXRzIGNhbiBiZSBjcmVhdGVkIGZvciB0aGlzIGNvaW5cbiAgICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk6IFRva2VuRW5hYmxlbWVudENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVpcmVzVG9rZW5FbmFibGVtZW50OiB0cnVlLFxuICAgICAgc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHM6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VkZHNhJztcbiAgfVxuXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLm5hbWU7XG4gIH1cblxuICBnZXRCYXNlQ2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDaGFpbigpO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IENvaW5GYW1pbHkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mYW1pbHk7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKTogYW55IHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgdmFsdWUgb2YgMFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBva2F5IHRvIHNlbmQgMCB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGVkMjU1MTkga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIHNlZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHB1YiwgcHJ2XG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IE5lYXJLZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBOZWFyS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnB1YixcbiAgICAgIHBydjoga2V5cy5wcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgcHVibGljIGtleSBmb3IgdGhlIGNvaW4uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwdWIgdGhlIHB1YiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBpcyBpdCB2YWxpZD9cbiAgICovXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbmVhclV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHN1cHBsaWVkIHByaXZhdGUga2V5IGlzIGEgdmFsaWQgbmVhciBwcml2YXRlIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJ2IHRoZSBwcnYgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHJ2KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5lYXJVdGlscy5pc1ZhbGlkUHJpdmF0ZUtleShwcnYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pblxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWRkcmVzcyB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5lYXJVdGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyBzaWduTWVzc2FnZShrZXk6IEtleVBhaXIsIG1lc3NhZ2U6IHN0cmluZyB8IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgbmVhcktleXBhaXIgPSBuZXcgTmVhcktleVBhaXIoeyBwcnY6IGtleS5wcnYgfSk7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihtZXNzYWdlKSkge1xuICAgICAgbWVzc2FnZSA9IGJhc2U1OC5lbmNvZGUobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKG5lYXJLZXlwYWlyLnNpZ25NZXNzYWdlKG1lc3NhZ2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsYWluL3BhcnNlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPE5lYXJUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlcigpO1xuICAgIGxldCByZWJ1aWx0VHJhbnNhY3Rpb246IEJhc2VUcmFuc2FjdGlvbjtcbiAgICBjb25zdCB0eFJhdyA9IHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uQnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eFJhdyk7XG4gICAgICByZWJ1aWx0VHJhbnNhY3Rpb24gPSBhd2FpdCB0cmFuc2FjdGlvbkJ1aWxkZXIuYnVpbGQoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiByZWJ1aWx0VHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICB2ZXJpZnlTaWduVHJhbnNhY3Rpb25QYXJhbXMocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogVmVyaWZpZWRUcmFuc2FjdGlvblBhcmFtZXRlcnMge1xuICAgIGNvbnN0IHBydiA9IHBhcmFtcy5wcnY7XG5cbiAgICBjb25zdCB0eEhleCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4O1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodHhIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdHhQcmVidWlsZCBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcodHhIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHR4UHJlYnVpbGQgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCB0eXBlICR7dHlwZW9mIHR4SGV4fWApO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwcnYgcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocHJ2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcnYgbXVzdCBiZSBhIHN0cmluZywgZ290IHR5cGUgJHt0eXBlb2YgcHJ2fWApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMocGFyYW1zLnR4UHJlYnVpbGQsICdrZXknKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHB1YmxpYyBrZXkgcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBhcmUgcmVjZWl2aW5nIGFkZHJlc3NlcyBkbyBub3QgdHJ5IHRvIGNvbnZlcnQgdGhlbVxuICAgIGNvbnN0IHNpZ25lciA9ICFuZWFyVXRpbHMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnR4UHJlYnVpbGQua2V5KVxuICAgICAgPyBuZXcgTmVhcktleVBhaXIoeyBwdWI6IHBhcmFtcy50eFByZWJ1aWxkLmtleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgIDogcGFyYW1zLnR4UHJlYnVpbGQua2V5O1xuICAgIHJldHVybiB7IHR4SGV4LCBwcnYsIHNpZ25lciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGtleWNoYWluIGFuZCBoYWxmLXNpZ24gcHJlYnVpbHQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQge1RyYW5zYWN0aW9uUHJlYnVpbGR9IHByZWJ1aWxkIG9iamVjdCByZXR1cm5lZCBieSBwbGF0Zm9ybVxuICAgKiBAcGFyYW0gcGFyYW1zLnBydiB7U3RyaW5nfSB1c2VyIHBydlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge0JsdWViaXJkPFNpZ25lZFRyYW5zYWN0aW9uPn1cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlcigpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbShwYXJhbXMudHhQcmVidWlsZC50eEhleCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHBhcmFtcy5wcnYgfSk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb246IEJhc2VUcmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gKHRyYW5zYWN0aW9uIGFzIEJhc2VUcmFuc2FjdGlvbikudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0eEhleDogc2VyaWFsaXplZFR4LFxuICAgIH0gYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVjb3ZlcihwYXJhbXM6IE1QQ1JlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHggfCBNUENTd2VlcFR4cz4ge1xuICAgIGlmICghcGFyYW1zLmJpdGdvS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYml0Z29LZXknKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uJyk7XG4gICAgfVxuICAgIGxldCBzdGFydElkeCA9IHBhcmFtcy5zdGFydGluZ1NjYW5JbmRleDtcbiAgICBpZiAoc3RhcnRJZHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RhcnRJZHggPSAwO1xuICAgIH0gZWxzZSBpZiAoIU51bWJlci5pc0ludGVnZXIoc3RhcnRJZHgpIHx8IHN0YXJ0SWR4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXJ0aW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycpO1xuICAgIH1cbiAgICBsZXQgbnVtSXRlcmF0aW9uID0gcGFyYW1zLnNjYW47XG4gICAgaWYgKG51bUl0ZXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBudW1JdGVyYXRpb24gPSAyMDtcbiAgICB9IGVsc2UgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bUl0ZXJhdGlvbikgfHwgbnVtSXRlcmF0aW9uIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzY2FubmluZyBmYWN0b3InKTtcbiAgICB9XG4gICAgY29uc3QgYml0Z29LZXkgPSBwYXJhbXMuYml0Z29LZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLnVzZXJLZXkgJiYgIXBhcmFtcy5iYWNrdXBLZXkgJiYgIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG4gICAgY29uc3QgeyBzdG9yYWdlQW1vdW50UGVyQnl0ZSwgdHJhbnNmZXJDb3N0LCByZWNlaXB0Q29uZmlnIH0gPSBhd2FpdCB0aGlzLmdldFByb3RvY29sQ29uZmlnKCk7XG5cbiAgICBmb3IgKGxldCBpID0gc3RhcnRJZHg7IGkgPCBudW1JdGVyYXRpb24gKyBzdGFydElkeDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyUGF0aCA9IGBtLyR7aX1gO1xuICAgICAgY29uc3QgYWNjb3VudElkID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGN1cnJQYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgICBsZXQgYXZhaWxhYmxlQmFsYW5jZSA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgICB0cnkge1xuICAgICAgICBhdmFpbGFibGVCYWxhbmNlID0gbmV3IEJpZ051bWJlcihhd2FpdCB0aGlzLmdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCwgc3RvcmFnZUFtb3VudFBlckJ5dGUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gVU5LTk9XTl9BQ0NPVU5UIGVycm9yIGluZGljYXRlcyB0aGF0IHRoZSBhZGRyZXNzIGhhcyBub3QgcGFydGFrZSBpbiBhbnkgdHJhbnNhY3Rpb24gc28gZmFyLCBzbyB3ZSB3aWxsXG4gICAgICAgIC8vIHRyZWF0IGl0IGFzIGEgemVybyBiYWxhbmNlIGFkZHJlc3NcbiAgICAgICAgaWYgKGUubWVzc2FnZSAhPT0gJ1VOS05PV05fQUNDT1VOVCcpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYXZhaWxhYmxlQmFsYW5jZS50b051bWJlcigpIDw9IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGZpcnN0IGJ1aWxkIHRoZSB1bnNpZ25lZCB0eG5cbiAgICAgIGNvbnN0IGJzNThFbmNvZGVkUHVibGljS2V5ID0gbmVhckFQSS51dGlscy5zZXJpYWxpemUuYmFzZV9lbmNvZGUobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oYWNjb3VudElkLCAnaGV4JykpKTtcbiAgICAgIGNvbnN0IHsgbm9uY2UsIGJsb2NrSGFzaCB9ID0gYXdhaXQgdGhpcy5nZXRBY2Nlc3NLZXkoeyBhY2NvdW50SWQsIGJzNThFbmNvZGVkUHVibGljS2V5IH0pO1xuICAgICAgY29uc3QgZ2FzUHJpY2UgPSBhd2FpdCB0aGlzLmdldEdhc1ByaWNlKGJsb2NrSGFzaCk7XG4gICAgICBjb25zdCBnYXNQcmljZUZpcnN0QmxvY2sgPSBuZXcgQmlnTnVtYmVyKGdhc1ByaWNlKTtcbiAgICAgIGNvbnN0IGdhc1ByaWNlU2Vjb25kQmxvY2sgPSBnYXNQcmljZUZpcnN0QmxvY2subXVsdGlwbGllZEJ5KDEuMDUpO1xuICAgICAgY29uc3QgdG90YWxHYXNSZXF1aXJlZCA9IG5ldyBCaWdOdW1iZXIodHJhbnNmZXJDb3N0LnNlbmRTaXIpXG4gICAgICAgIC5wbHVzKHJlY2VpcHRDb25maWcuc2VuZFNpcilcbiAgICAgICAgLm11bHRpcGxpZWRCeShnYXNQcmljZUZpcnN0QmxvY2spXG4gICAgICAgIC5wbHVzKG5ldyBCaWdOdW1iZXIodHJhbnNmZXJDb3N0LmV4ZWN1dGlvbikucGx1cyhyZWNlaXB0Q29uZmlnLmV4ZWN1dGlvbikubXVsdGlwbGllZEJ5KGdhc1ByaWNlU2Vjb25kQmxvY2spKTtcbiAgICAgIC8vIGFkZGluZyBzb21lIHBhZGRpbmcgdG8gbWFrZSBzdXJlIHRoZSBnYXMgZG9lc24ndCBnbyBiZWxvdyByZXF1aXJlZCBnYXMgYnkgbmV0d29ya1xuICAgICAgY29uc3QgdG90YWxHYXNXaXRoUGFkZGluZyA9IHRvdGFsR2FzUmVxdWlyZWQubXVsdGlwbGllZEJ5KDEuNSk7XG4gICAgICBjb25zdCBmZWVSZXNlcnZlID0gQmlnTnVtYmVyKE5ldHdvcmtzW3RoaXMubmV0d29ya10ubmVhci5mZWVSZXNlcnZlKTtcbiAgICAgIGNvbnN0IHN0b3JhZ2VSZXNlcnZlID0gQmlnTnVtYmVyKE5ldHdvcmtzW3RoaXMubmV0d29ya10ubmVhci5zdG9yYWdlUmVzZXJ2ZSk7XG4gICAgICBjb25zdCBuZXRBbW91bnQgPSBhdmFpbGFibGVCYWxhbmNlLm1pbnVzKHRvdGFsR2FzV2l0aFBhZGRpbmcpLm1pbnVzKGZlZVJlc2VydmUpLm1pbnVzKHN0b3JhZ2VSZXNlcnZlKTtcbiAgICAgIGlmIChuZXRBbW91bnQudG9OdW1iZXIoKSA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRm91bmQgYWRkcmVzcyAke2l9IHdpdGggbm9uLXplcm8gZnVuZCBidXQgZnVuZCBpcyBpbnN1ZmZpY2llbnQgdG8gc3VwcG9ydCBhIHJlY292ZXIgYCArXG4gICAgICAgICAgICBgdHJhbnNhY3Rpb24uIFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggJHtpICsgMX0uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIoYWNjb3VudElkLCBhY2NvdW50SWQpXG4gICAgICAgIC5ub25jZShub25jZSlcbiAgICAgICAgLnJlY2VpdmVySWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pXG4gICAgICAgIC5yZWNlbnRCbG9ja0hhc2goYmxvY2tIYXNoKVxuICAgICAgICAuYW1vdW50KG5ldEFtb3VudC50b0ZpeGVkKCkpO1xuICAgICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBsZXQgc2VyaWFsaXplZFR4ID0gdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgaWYgKCFpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgLy8gU2lnbiB0aGUgdHhuXG4gICAgICAgIC8qICoqKioqKioqKioqKioqKioqIFNUQVJUICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgICAgICAvLyBUT0RPKEJHLTUxMDkyKTogVGhpcyBsb29rcyBsaWtlIGEgY29tbW9uIHBhcnQgd2hpY2ggY2FuIGJlIGV4dHJhY3RlZCBvdXQgdG9vXG4gICAgICAgIGlmICghcGFyYW1zLnVzZXJLZXkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFyYW1zLmJhY2t1cEtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbiB1cCB3aGl0ZXNwYWNlIGZyb20gZW50ZXJlZCB2YWx1ZXNcbiAgICAgICAgY29uc3QgdXNlcktleSA9IHBhcmFtcy51c2VyS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgICAgIGNvbnN0IGJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgICAgICAvLyBEZWNyeXB0IHByaXZhdGUga2V5cyBmcm9tIEtleUNhcmQgdmFsdWVzXG4gICAgICAgIGxldCB1c2VyUHJ2O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHVzZXJQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IHVzZXJLZXksXG4gICAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgdXNlciBrZXljaGFpbjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIFRPRE8gQkctNTI0MTkgSW1wbGVtZW50IENvZGVjIGZvciBwYXJzaW5nICovXG4gICAgICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHVzZXJQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuVXNlclNpZ25pbmdNYXRlcmlhbDtcblxuICAgICAgICBsZXQgYmFja3VwUHJ2O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJhY2t1cFBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICAgICAgICBpbnB1dDogYmFja3VwS2V5LFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIGJhY2t1cCBrZXljaGFpbjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFja3VwU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShiYWNrdXBQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuQmFja3VwU2lnbmluZ01hdGVyaWFsO1xuICAgICAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqIEVORCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgICAgICAvLyBhZGQgc2lnbmF0dXJlXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZUhleCA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRUU1NTaWduYXR1cmUoXG4gICAgICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbCxcbiAgICAgICAgICBiYWNrdXBTaWduaW5nTWF0ZXJpYWwsXG4gICAgICAgICAgY3VyclBhdGgsXG4gICAgICAgICAgdW5zaWduZWRUcmFuc2FjdGlvblxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwdWJsaWNLZXlPYmogPSB7IHB1YjogYWNjb3VudElkIH07XG4gICAgICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUocHVibGljS2V5T2JqIGFzIFB1YmxpY0tleSwgc2lnbmF0dXJlSGV4KTtcblxuICAgICAgICBjb25zdCBjb21wbGV0ZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBzZXJpYWxpemVkVHggPSBjb21wbGV0ZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgQmlnTnVtYmVyKG5ldEFtb3VudCk7IC8vIFVzZSB0aGUgY2FsY3VsYXRlZCBuZXRBbW91bnQgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgICAgICBjb25zdCB3YWxsZXRDb2luID0gdGhpcy5nZXRDaGFpbigpO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogYWNjb3VudElkLCAvLyBUaGUgc2VuZGVyJ3MgYWNjb3VudCBJRFxuICAgICAgICAgICAgdmFsdWVTdHJpbmc6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9OdW1iZXIoKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCAvLyBUaGUgcmVjb3ZlcnkgZGVzdGluYXRpb24gYWRkcmVzc1xuICAgICAgICAgICAgdmFsdWVTdHJpbmc6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBjb2luTmFtZTogd2FsbGV0Q29pbixcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBzcGVuZEFtb3VudCA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR4ID0geyBpbnB1dHM6IGlucHV0cywgb3V0cHV0czogb3V0cHV0cywgc3BlbmRBbW91bnQ6IHNwZW5kQW1vdW50LCB0eXBlOiAnJyB9O1xuICAgICAgICBjb25zdCBmZWVJbmZvID0geyBmZWU6IHRvdGFsR2FzV2l0aFBhZGRpbmcudG9OdW1iZXIoKSwgZmVlU3RyaW5nOiB0b3RhbEdhc1dpdGhQYWRkaW5nLnRvRml4ZWQoKSB9OyAvLyBJbmNsdWRlIGdhcyBmZWVzXG5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb246IE1QQ1R4ID0ge1xuICAgICAgICAgIHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4LCAvLyBTZXJpYWxpemVkIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICAgICAgc2NhbkluZGV4OiBpLCAvLyBDdXJyZW50IGluZGV4IGluIHRoZSBzY2FuXG4gICAgICAgICAgY29pbjogd2FsbGV0Q29pbixcbiAgICAgICAgICBzaWduYWJsZUhleDogdW5zaWduZWRUcmFuc2FjdGlvbi5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLCAvLyBIZXggcGF5bG9hZCBmb3Igc2lnbmluZ1xuICAgICAgICAgIGRlcml2YXRpb25QYXRoOiBjdXJyUGF0aCwgLy8gRGVyaXZhdGlvbiBwYXRoIGZvciB0aGUgYWNjb3VudFxuICAgICAgICAgIHBhcnNlZFR4OiBwYXJzZWRUeCxcbiAgICAgICAgICBmZWVJbmZvOiBmZWVJbmZvLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzogeyBjb21tb25LZXljaGFpbjogYml0Z29LZXkgfSwgLy8gSW5jbHVkZSBibG9jayBoYXNoIGZvciBORUFSXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb25zOiBNUENVbnNpZ25lZFR4W10gPSBbeyB1bnNpZ25lZFR4OiB0cmFuc2FjdGlvbiwgc2lnbmF0dXJlU2hhcmVzOiBbXSB9XTtcbiAgICAgICAgY29uc3QgdHhSZXF1ZXN0OiBSZWNvdmVyeVR4UmVxdWVzdCA9IHtcbiAgICAgICAgICB0cmFuc2FjdGlvbnM6IHRyYW5zYWN0aW9ucyxcbiAgICAgICAgICB3YWxsZXRDb2luOiB3YWxsZXRDb2luLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyB0eFJlcXVlc3RzOiBbdHhSZXF1ZXN0XSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsIHNjYW5JbmRleDogaSB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggZnVuZHMgdG8gcmVjb3ZlcicpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQnJvYWRjYXN0YWJsZVN3ZWVwVHJhbnNhY3Rpb24ocGFyYW1zOiBNUENTd2VlcFJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzPiB7XG4gICAgY29uc3QgcmVxID0gcGFyYW1zLnNpZ25hdHVyZVNoYXJlcztcbiAgICBjb25zdCBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zOiBNUENUeFtdID0gW107XG4gICAgbGV0IGxhc3RTY2FuSW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHJlcVtpXS50eFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHNpZ25hdHVyZSBzaGFyZXNcbiAgICAgIGlmICghcmVxW2ldLm92YyB8fCAhcmVxW2ldLm92Y1swXS5lZGRzYVNpZ25hdHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc2lnbmF0dXJlKHMpJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSByZXFbaV0ub3ZjWzBdLmVkZHNhU2lnbmF0dXJlO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBzaWduYWJsZSBoZXhcbiAgICAgIGlmICghdHJhbnNhY3Rpb24uc2lnbmFibGVIZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHNpZ25hYmxlIGhleCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHRyYW5zYWN0aW9uLnNpZ25hYmxlSGV4ISwgJ2hleCcpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gTVBDLnZlcmlmeShtZXNzYWdlQnVmZmVyLCBzaWduYXR1cmUpO1xuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlIHRoZSBzaWduYXR1cmUgaW4gaGV4IGZvcm1hdFxuICAgICAgY29uc3Qgc2lnbmF0dXJlSGV4ID0gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oc2lnbmF0dXJlLlIsICdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlLnNpZ21hLCAnaGV4JyldKTtcblxuICAgICAgLy8gVmFsaWRhdGUgdHJhbnNhY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gICAgICBpZiAoIXRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYz8uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGNvbW1vbiBrZXljaGFpbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29tbW9uS2V5Y2hhaW4gPSB0cmFuc2FjdGlvbi5jb2luU3BlY2lmaWMhLmNvbW1vbktleWNoYWluISBhcyBzdHJpbmc7XG5cbiAgICAgIGlmICghdHJhbnNhY3Rpb24uZGVyaXZhdGlvblBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGRlcml2YXRpb24gcGF0aCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSB0cmFuc2FjdGlvbi5kZXJpdmF0aW9uUGF0aCBhcyBzdHJpbmc7XG5cbiAgICAgIC8vIERlcml2ZSBhY2NvdW50IElEIGFuZCBzZW5kZXIgYWRkcmVzc1xuICAgICAgY29uc3QgYWNjb3VudElkID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIGRlcml2YXRpb25QYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgICBjb25zdCB0eG5CdWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKCkuZnJvbSh0cmFuc2FjdGlvbi5zZXJpYWxpemVkVHggYXMgc3RyaW5nKTtcblxuICAgICAgLy8gQWRkIHRoZSBzaWduYXR1cmVcbiAgICAgIGNvbnN0IG5lYXJLZXlQYWlyID0gbmV3IE5lYXJLZXlQYWlyKHsgcHViOiBhY2NvdW50SWQgfSk7XG4gICAgICB0eG5CdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogbmVhcktleVBhaXIuZ2V0S2V5cygpLnB1YiB9LCBzaWduYXR1cmVIZXgpO1xuXG4gICAgICAvLyBGaW5hbGl6ZSBhbmQgc2VyaWFsaXplIHRoZSB0cmFuc2FjdGlvblxuICAgICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0eG5CdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBzaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBBZGQgdGhlIHNpZ25lZCB0cmFuc2FjdGlvbiB0byB0aGUgbGlzdFxuICAgICAgYnJvYWRjYXN0YWJsZVRyYW5zYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsXG4gICAgICAgIHNjYW5JbmRleDogdHJhbnNhY3Rpb24uc2NhbkluZGV4LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgbGFzdCBzY2FuIGluZGV4IGlmIGFwcGxpY2FibGVcbiAgICAgIGlmIChpID09PSByZXEubGVuZ3RoIC0gMSAmJiB0cmFuc2FjdGlvbi5jb2luU3BlY2lmaWMhLmxhc3RTY2FuSW5kZXgpIHtcbiAgICAgICAgbGFzdFNjYW5JbmRleCA9IHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyEubGFzdFNjYW5JbmRleCBhcyBudW1iZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBicm9hZGNhc3RhYmxlIHRyYW5zYWN0aW9ucyBhbmQgdGhlIGxhc3Qgc2NhbiBpbmRleFxuICAgIHJldHVybiB7IHRyYW5zYWN0aW9uczogYnJvYWRjYXN0YWJsZVRyYW5zYWN0aW9ucywgbGFzdFNjYW5JbmRleCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSByZXF1ZXN0IHRvIG9uZSBvZiB0aGUgcHVibGljIEVPUyBub2RlcyBhdmFpbGFibGVcbiAgICogQHBhcmFtIHBhcmFtcy5wYXlsb2FkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0RGF0YUZyb21Ob2RlKHBhcmFtczogeyBwYXlsb2FkPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSk6IFByb21pc2U8cmVxdWVzdC5SZXNwb25zZT4ge1xuICAgIGNvbnN0IG5vZGVVcmxzID0gdGhpcy5nZXRQdWJsaWNOb2RlVXJscygpO1xuICAgIGZvciAoY29uc3Qgbm9kZVVybCBvZiBub2RlVXJscykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucG9zdChub2RlVXJsKS5zZW5kKHBhcmFtcy5wYXlsb2FkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY2FsbCBlbmRwb2ludDogJy8nIGZyb20gbm9kZXM6ICR7Xy5qb2luKG5vZGVVcmxzLCAnLCAnKX1gKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRBY2Nlc3NLZXkoe1xuICAgIGFjY291bnRJZCxcbiAgICBiczU4RW5jb2RlZFB1YmxpY0tleSxcbiAgfToge1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgIGJzNThFbmNvZGVkUHVibGljS2V5OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPE5lYXJUeEJ1aWxkZXJQYXJhbXNGcm9tTm9kZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXREYXRhRnJvbU5vZGUoe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgaWQ6ICdkb250Y2FyZScsXG4gICAgICAgIG1ldGhvZDogJ3F1ZXJ5JyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgcmVxdWVzdF90eXBlOiAndmlld19hY2Nlc3Nfa2V5JyxcbiAgICAgICAgICBmaW5hbGl0eTogJ2ZpbmFsJyxcbiAgICAgICAgICBhY2NvdW50X2lkOiBhY2NvdW50SWQsXG4gICAgICAgICAgcHVibGljX2tleTogYnM1OEVuY29kZWRQdWJsaWNLZXksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY2NvdW50IG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICBjb25zdCBhY2Nlc3NLZXkgPSByZXNwb25zZS5ib2R5LnJlc3VsdDtcbiAgICByZXR1cm4geyBub25jZTogYWNjZXNzS2V5Lm5vbmNlICsgMSwgYmxvY2tIYXNoOiBhY2Nlc3NLZXkuYmxvY2tfaGFzaCB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZDogc3RyaW5nLCBzdG9yYWdlQW1vdW50UGVyQnl0ZTogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgIGlkOiAnZG9udGNhcmUnLFxuICAgICAgICBtZXRob2Q6ICdxdWVyeScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHJlcXVlc3RfdHlwZTogJ3ZpZXdfYWNjb3VudCcsXG4gICAgICAgICAgZmluYWxpdHk6ICdmaW5hbCcsXG4gICAgICAgICAgYWNjb3VudF9pZDogYWNjb3VudElkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHF1ZXJ5IGFjY291bnQgaW5mb3JtYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgZXJyb3JDYXVzZSA9IHJlc3BvbnNlLmJvZHkuZXJyb3I/LmNhdXNlLm5hbWU7XG4gICAgaWYgKGVycm9yQ2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yQ2F1c2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY291bnQgPSByZXNwb25zZS5ib2R5LnJlc3VsdDtcbiAgICBjb25zdCBjb3N0UGVyQnl0ZSA9IG5ldyBCaWdOdW1iZXIoc3RvcmFnZUFtb3VudFBlckJ5dGUpO1xuICAgIGNvbnN0IHN0YXRlU3Rha2VkID0gbmV3IEJpZ051bWJlcihhY2NvdW50LnN0b3JhZ2VfdXNhZ2UpLm11bHRpcGxpZWRCeShjb3N0UGVyQnl0ZSk7XG4gICAgY29uc3Qgc3Rha2VkID0gbmV3IEJpZ051bWJlcihhY2NvdW50LmxvY2tlZCk7XG4gICAgY29uc3QgdG90YWxCYWxhbmNlID0gbmV3IEJpZ051bWJlcihhY2NvdW50LmFtb3VudCkucGx1cyhzdGFrZWQpO1xuICAgIGNvbnN0IGF2YWlsYWJsZUJhbGFuY2UgPSB0b3RhbEJhbGFuY2UubWludXMoQmlnTnVtYmVyLm1heChzdGFrZWQsIHN0YXRlU3Rha2VkKSk7XG4gICAgcmV0dXJuIGF2YWlsYWJsZUJhbGFuY2UudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRQcm90b2NvbENvbmZpZygpOiBQcm9taXNlPFByb3RvY29sQ29uZmlnT3V0cHV0PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldERhdGFGcm9tTm9kZSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICBpZDogJ2RvbnRjYXJlJyxcbiAgICAgICAgbWV0aG9kOiAnRVhQRVJJTUVOVEFMX3Byb3RvY29sX2NvbmZpZycsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGZpbmFsaXR5OiAnZmluYWwnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWNjb3VudCBub3QgZm91bmQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSByZXNwb25zZS5ib2R5LnJlc3VsdDtcbiAgICBjb25zdCBzdG9yYWdlQW1vdW50UGVyQnl0ZSA9IGNvbmZpZy5ydW50aW1lX2NvbmZpZy5zdG9yYWdlX2Ftb3VudF9wZXJfYnl0ZTtcbiAgICBjb25zdCB0cmFuc2ZlckNvc3RGcm9tTmV0d29yayA9IGNvbmZpZy5ydW50aW1lX2NvbmZpZy50cmFuc2FjdGlvbl9jb3N0cy5hY3Rpb25fY3JlYXRpb25fY29uZmlnLnRyYW5zZmVyX2Nvc3Q7XG4gICAgY29uc3QgdHJhbnNmZXJDb3N0OiBOZWFyRmVlQ29uZmlnID0ge1xuICAgICAgc2VuZFNpcjogdHJhbnNmZXJDb3N0RnJvbU5ldHdvcmsuc2VuZF9zaXIsXG4gICAgICBzZW5kTm90U2lyOiB0cmFuc2ZlckNvc3RGcm9tTmV0d29yay5zZW5kX25vdF9zaXIsXG4gICAgICBleGVjdXRpb246IHRyYW5zZmVyQ29zdEZyb21OZXR3b3JrLmV4ZWN1dGlvbixcbiAgICB9O1xuXG4gICAgY29uc3QgcmVjZWlwdENvbmZpZ0Zyb21OZXR3b3JrID0gY29uZmlnLnJ1bnRpbWVfY29uZmlnLnRyYW5zYWN0aW9uX2Nvc3RzLmFjdGlvbl9yZWNlaXB0X2NyZWF0aW9uX2NvbmZpZztcbiAgICBjb25zdCByZWNlaXB0Q29uZmlnOiBOZWFyRmVlQ29uZmlnID0ge1xuICAgICAgc2VuZFNpcjogcmVjZWlwdENvbmZpZ0Zyb21OZXR3b3JrLnNlbmRfc2lyLFxuICAgICAgc2VuZE5vdFNpcjogcmVjZWlwdENvbmZpZ0Zyb21OZXR3b3JrLnNlbmRfbm90X3NpcixcbiAgICAgIGV4ZWN1dGlvbjogcmVjZWlwdENvbmZpZ0Zyb21OZXR3b3JrLmV4ZWN1dGlvbixcbiAgICB9O1xuICAgIHJldHVybiB7IHN0b3JhZ2VBbW91bnRQZXJCeXRlLCB0cmFuc2ZlckNvc3QsIHJlY2VpcHRDb25maWcgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRHYXNQcmljZShibG9ja0hhc2g6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldERhdGFGcm9tTm9kZSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICBpZDogJ2RvbnRjYXJlJyxcbiAgICAgICAgbWV0aG9kOiAnZ2FzX3ByaWNlJyxcbiAgICAgICAgcGFyYW1zOiBbYmxvY2tIYXNoXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjY291bnQgbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5ib2R5LnJlc3VsdC5nYXNfcHJpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UHVibGljTm9kZVVybHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBFbnZpcm9ubWVudHNbdGhpcy5iaXRnby5nZXRFbnYoKV0ubmVhck5vZGVVcmxzO1xuICB9XG5cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IE5lYXJQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8TmVhclBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4UHJlYnVpbGQ6IHBhcmFtcy50eFByZWJ1aWxkLFxuICAgICAgcHVibGljS2V5OiBwYXJhbXMucHVibGljS2V5LFxuICAgICAgZmVlSW5mbzogcGFyYW1zLmZlZUluZm8sXG4gICAgfSk7XG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uRXhwbGFuYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IG5lYXJUcmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uRXhwbGFuYXRpb24gYXMgTmVhclRyYW5zYWN0aW9uRXhwbGFuYXRpb247XG4gICAgaWYgKG5lYXJUcmFuc2FjdGlvbi5vdXRwdXRzLmxlbmd0aCA8PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnB1dHM6IFtdLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IG5lYXJUcmFuc2FjdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3M7XG4gICAgY29uc3QgZmVlQW1vdW50ID0gbmV3IEJpZ051bWJlcihuZWFyVHJhbnNhY3Rpb24uZmVlLmZlZSA9PT0gJycgPyAnMCcgOiBuZWFyVHJhbnNhY3Rpb24uZmVlLmZlZSk7XG5cbiAgICAvLyBhc3N1bWUgMSBzZW5kZXIsIHdobyBpcyBhbHNvIHRoZSBmZWUgcGF5ZXJcbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihuZWFyVHJhbnNhY3Rpb24ub3V0cHV0QW1vdW50KS5wbHVzKGZlZUFtb3VudCkudG9GaXhlZCgpLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3Qgb3V0cHV0czogVHJhbnNhY3Rpb25PdXRwdXRbXSA9IG5lYXJUcmFuc2FjdGlvbi5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKG91dHB1dC5hbW91bnQpLnRvRml4ZWQoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRzLFxuICAgICAgb3V0cHV0cyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgdG90YWxBbW91bnQgPSBuZXcgQmlnTnVtYmVyKDApO1xuICAgIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKTtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGQsIHR4UGFyYW1zOiB0eFBhcmFtcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5Db25maWcpO1xuICAgIGNvbnN0IHJhd1R4ID0gdHhQcmVidWlsZC50eEhleDtcbiAgICBpZiAoIXJhd1R4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9XG5cbiAgICB0cmFuc2FjdGlvbi5mcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIGNvbnN0IGV4cGxhaW5lZFR4ID0gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG5cbiAgICAvLyB1c2VycyBkbyBub3QgaW5wdXQgcmVjaXBpZW50cyBmb3IgY29uc29saWRhdGlvbiByZXF1ZXN0cyBhcyB0aGV5IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIHNlcnZlclxuICAgIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eFBhcmFtcy50eXBlID09PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IGV4cGxhaW5lZFR4Lm91dHB1dHNbMF0udG9rZW5OYW1lO1xuICAgICAgICBpZiAodG9rZW5OYW1lKSB7XG4gICAgICAgICAgY29uc3QgbmVwVG9rZW4gPSBuZWFyVXRpbHMuZ2V0VG9rZW5JbnN0YW5jZUZyb21Ub2tlbk5hbWUodG9rZW5OYW1lKTtcbiAgICAgICAgICBpZiAobmVwVG9rZW4pIHtcbiAgICAgICAgICAgIGV4cGxhaW5lZFR4Lm91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChvdXRwdXQuYW1vdW50ICE9PSBuZXBUb2tlbi5zdG9yYWdlRGVwb3NpdEFtb3VudCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3RvcmFnZSBkZXBvc2l0IGFtb3VudCBub3QgbWF0Y2hpbmchJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZFJlY2lwaWVudHMgPSB0eFBhcmFtcy5yZWNpcGllbnRzPy5tYXAoKHJlY2lwaWVudCkgPT4ge1xuICAgICAgICBpZiAodHhQYXJhbXMudHlwZSAhPT0gJ2VuYWJsZXRva2VuJykge1xuICAgICAgICAgIHJldHVybiBfLnBpY2socmVjaXBpZW50LCBbJ2FkZHJlc3MnLCAnYW1vdW50J10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBfLnBpY2socmVjaXBpZW50LCBbJ2FkZHJlc3MnLCAndG9rZW5OYW1lJ10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkT3V0cHV0cyA9IGV4cGxhaW5lZFR4Lm91dHB1dHMubWFwKChvdXRwdXQpID0+IHtcbiAgICAgICAgaWYgKHR4UGFyYW1zLnR5cGUgIT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgICAgICByZXR1cm4gXy5waWNrKG91dHB1dCwgWydhZGRyZXNzJywgJ2Ftb3VudCddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gXy5waWNrKG91dHB1dCwgWydhZGRyZXNzJywgJ3Rva2VuTmFtZSddKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghXy5pc0VxdWFsKGZpbHRlcmVkT3V0cHV0cywgZmlsdGVyZWRSZWNpcGllbnRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHJlY2lwaWVudHMgb2YgdHhQYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgICB0b3RhbEFtb3VudCA9IHR4UGFyYW1zLnR5cGUgIT09ICdlbmFibGV0b2tlbicgPyB0b3RhbEFtb3VudC5wbHVzKHJlY2lwaWVudHMuYW1vdW50KSA6IEJpZ051bWJlcigwKTtcbiAgICAgIH1cbiAgICAgIGlmICghdG90YWxBbW91bnQuaXNFcXVhbFRvKGV4cGxhaW5lZFR4Lm91dHB1dEFtb3VudCkgJiYgdHhQYXJhbXMudHlwZSAhPT0gJ2VuYWJsZXRva2VuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHRvdGFsIGFtb3VudCBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHRvdGFsIGFtb3VudCBmaWVsZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGRlcigpOiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0QmFzZUNoYWluKCkpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhdWRpdERlY3J5cHRlZEtleSh7IHBydiwgcHVibGljS2V5LCBtdWx0aVNpZ1R5cGUgfTogQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMpIHtcbiAgICBpZiAobXVsdGlTaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBtdWx0aVNpZ1R5cGUnKTtcbiAgICB9XG4gICAgYXVkaXRFZGRzYVByaXZhdGVLZXkocHJ2LCBwdWJsaWNLZXkgPz8gJycpO1xuICB9XG59XG4iXX0=
|
|
838
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uZWFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsMENBQTRCO0FBQzVCLGdFQUFxQztBQUNyQyw2Q0FBK0I7QUFDL0IscURBQXVDO0FBQ3ZDLG9EQUFzQztBQUV0Qyx5REFBK0Q7QUFDL0QsbURBOEI4QjtBQUM5QixpREFBNEc7QUFFNUcsK0JBQTJHO0FBQzNHLHdEQUFvQztBQUNwQywrQ0FBZ0U7QUFzRWhFLE1BQWEsSUFBSyxTQUFRLG1CQUFRO0lBR2hDLFlBQVksS0FBZ0IsRUFBRSxXQUF1QztRQUNuRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFVTCxZQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBVG5FLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFNRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELDJCQUEyQjtRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLHNCQUFzQjtRQUNwQixPQUFPLHdCQUFhLENBQUMsR0FBRyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILHdCQUF3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YSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxzQkFBUyxFQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JHLENBQUM7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUUsQ0FBQztnQkFDeEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1lBQ3JGLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sVUFBVTtRQUNoQixPQUFPLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUJBQWlCLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBMkI7UUFDekUsSUFBSSxZQUFZLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxJQUFBLGtDQUFvQixFQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7QUEzNkJILG9CQTQ2QkM7QUFoNkJrQixnQkFBVyxHQUFHLEtBQUssQUFBUixDQUFTIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBiYXNlNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgKiBhcyBuZWFyQVBJIGZyb20gJ25lYXItYXBpLWpzJztcbmltcG9ydCAqIGFzIHJlcXVlc3QgZnJvbSAnc3VwZXJhZ2VudCc7XG5cbmltcG9ydCB7IGF1ZGl0RWRkc2FQcml2YXRlS2V5IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHtcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIEJhc2VDb2luLFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEJpdEdvQmFzZSxcbiAgRWRkc2EsXG4gIEVERFNBTWV0aG9kcyxcbiAgRUREU0FNZXRob2RUeXBlcyxcbiAgRW52aXJvbm1lbnRzLFxuICBLZXlQYWlyLFxuICBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yLFxuICBNUENBbGdvcml0aG0sXG4gIE1QQ1JlY292ZXJ5T3B0aW9ucyxcbiAgTVBDU3dlZXBSZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1N3ZWVwVHhzLFxuICBNUENUeCxcbiAgTVBDVHhzLFxuICBNUENVbnNpZ25lZFR4LFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFB1YmxpY0tleSxcbiAgUmVjb3ZlcnlUeFJlcXVlc3QsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUb2tlbkVuYWJsZW1lbnRDb25maWcsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgQ29pbkZhbWlseSwgY29pbnMsIE5lcDE0MVRva2VuLCBOZXR3b3JrcyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBLZXlQYWlyIGFzIE5lYXJLZXlQYWlyLCBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25CdWlsZGVyLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IG5lYXJVdGlscyBmcm9tICcuL2xpYi91dGlscyc7XG5pbXBvcnQgeyBNQVhfR0FTX0xJTUlUX0ZPUl9GVF9UUkFOU0ZFUiB9IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDtcbiAgcHJ2OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25QcmVidWlsZCB7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xuICBibG9ja0hhc2g6IHN0cmluZztcbiAgbm9uY2U6IGJpZ2ludDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDtcbiAgcHVibGljS2V5OiBzdHJpbmc7XG4gIGZlZUluZm86IHtcbiAgICBmZWU6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZmllZFRyYW5zYWN0aW9uUGFyYW1ldGVycyB7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIHBydjogc3RyaW5nO1xuICBzaWduZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZWFyUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMgZXh0ZW5kcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkO1xuICBwdWJsaWNLZXk6IHN0cmluZztcbiAgZmVlSW5mbzoge1xuICAgIGZlZTogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgVHJhbnNhY3Rpb25PdXRwdXQge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGFtb3VudDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTmVhclR4QnVpbGRlclBhcmFtc0Zyb21Ob2RlIHtcbiAgbm9uY2U6IGJpZ2ludDtcbiAgYmxvY2tIYXNoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBOZWFyRmVlQ29uZmlnIHtcbiAgc2VuZFNpcjogbnVtYmVyO1xuICBzZW5kTm90U2lyOiBudW1iZXI7XG4gIGV4ZWN1dGlvbjogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUHJvdG9jb2xDb25maWdPdXRwdXQge1xuICBzdG9yYWdlQW1vdW50UGVyQnl0ZTogbnVtYmVyO1xuICB0cmFuc2ZlckNvc3Q6IE5lYXJGZWVDb25maWc7XG4gIHJlY2VpcHRDb25maWc6IE5lYXJGZWVDb25maWc7XG59XG5cbnR5cGUgVHJhbnNhY3Rpb25JbnB1dCA9IFRyYW5zYWN0aW9uT3V0cHV0O1xuXG5leHBvcnQgaW50ZXJmYWNlIE5lYXJQYXJzZWRUcmFuc2FjdGlvbiBleHRlbmRzIFBhcnNlZFRyYW5zYWN0aW9uIHtcbiAgLy8gdG90YWwgYXNzZXRzIGJlaW5nIG1vdmVkLCBpbmNsdWRpbmcgZmVlc1xuICBpbnB1dHM6IFRyYW5zYWN0aW9uSW5wdXRbXTtcblxuICAvLyB3aGVyZSBhc3NldHMgYXJlIG1vdmVkIHRvXG4gIG91dHB1dHM6IFRyYW5zYWN0aW9uT3V0cHV0W107XG59XG5cbmV4cG9ydCB0eXBlIE5lYXJUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcblxuZXhwb3J0IGNsYXNzIE5lYXIgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoYml0Z28pO1xuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBpbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc3RhdGljIE1QQzogRWRkc2E7XG4gIHByb3RlY3RlZCBuZXR3b3JrID0gdGhpcy5iaXRnby5nZXRFbnYoKSA9PT0gJ3Byb2QnID8gJ21haW4nIDogJ3Rlc3QnO1xuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBOZWFyKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICBhbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgY29pbiBzdXBwb3J0cyBUU1Mgd2FsbGV0cy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVFNTIFdhbGxldHMgY2FuIGJlIGNyZWF0ZWQgZm9yIHRoaXMgY29pblxuICAgKi9cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMudHNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBnZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTogVG9rZW5FbmFibGVtZW50Q29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IHRydWUsXG4gICAgICBzdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50czogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAnZWRkc2EnO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuXG4gIGdldEJhc2VDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldENoYWluKCk7XG4gIH1cblxuICBnZXRGYW1pbHkoKTogQ29pbkZhbWlseSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZ1bGxOYW1lO1xuICB9XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBhbnkge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy5fc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICAvKipcbiAgICogRmxhZyBmb3Igc2VuZGluZyB2YWx1ZSBvZiAwXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG9rYXkgdG8gc2VuZCAwIHZhbHVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgZWQyNTUxOSBrZXkgcGFpclxuICAgKlxuICAgKiBAcGFyYW0gc2VlZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBvYmplY3Qgd2l0aCBnZW5lcmF0ZWQgcHViLCBwcnZcbiAgICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkPzogQnVmZmVyKTogS2V5UGFpciB7XG4gICAgY29uc3Qga2V5UGFpciA9IHNlZWQgPyBuZXcgTmVhcktleVBhaXIoeyBzZWVkIH0pIDogbmV3IE5lYXJLZXlQYWlyKCk7XG4gICAgY29uc3Qga2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcnYgaW4ga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YiB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuZWFyVXRpbHMuaXNWYWxpZFB1YmxpY0tleShwdWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3VwcGxpZWQgcHJpdmF0ZSBrZXkgaXMgYSB2YWxpZCBuZWFyIHByaXZhdGUga2V5XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcnYgdGhlIHBydiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBpcyBpdCB2YWxpZD9cbiAgICovXG4gIGlzVmFsaWRQcnYocHJ2OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbmVhclV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KHBydik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhZGRyZXNzIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbmVhclV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKGtleTogS2V5UGFpciwgbWVzc2FnZTogc3RyaW5nIHwgQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCBuZWFyS2V5cGFpciA9IG5ldyBOZWFyS2V5UGFpcih7IHBydjoga2V5LnBydiB9KTtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKG1lc3NhZ2UpKSB7XG4gICAgICBtZXNzYWdlID0gYmFzZTU4LmVuY29kZShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQnVmZmVyLmZyb20obmVhcktleXBhaXIuc2lnbk1lc3NhZ2UobWVzc2FnZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxhaW4vcGFyc2UgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZXhwbGFpblRyYW5zYWN0aW9uKHBhcmFtczogRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8TmVhclRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRCdWlsZGVyKCk7XG4gICAgbGV0IHJlYnVpbHRUcmFuc2FjdGlvbjogQmFzZVRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHR4UmF3ID0gcGFyYW1zLnR4UHJlYnVpbGQudHhIZXg7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb25CdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4UmF3KTtcbiAgICAgIHJlYnVpbHRUcmFuc2FjdGlvbiA9IGF3YWl0IHRyYW5zYWN0aW9uQnVpbGRlci5idWlsZCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlYnVpbHRUcmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIHZlcmlmeVNpZ25UcmFuc2FjdGlvblBhcmFtcyhwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBWZXJpZmllZFRyYW5zYWN0aW9uUGFyYW1ldGVycyB7XG4gICAgY29uc3QgcHJ2ID0gcGFyYW1zLnBydjtcblxuICAgIGNvbnN0IHR4SGV4ID0gcGFyYW1zLnR4UHJlYnVpbGQudHhIZXg7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eEhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyh0eEhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZCBtdXN0IGJlIGFuIG9iamVjdCwgZ290IHR5cGUgJHt0eXBlb2YgdHhIZXh9YCk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocHJ2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBydiBwYXJhbWV0ZXIgdG8gc2lnbiB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHBydiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgdHlwZSAke3R5cGVvZiBwcnZ9YCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmhhcyhwYXJhbXMudHhQcmVidWlsZCwgJ2tleScpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcHVibGljIGtleSBwYXJhbWV0ZXIgdG8gc2lnbiB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIGFyZSByZWNlaXZpbmcgYWRkcmVzc2VzIGRvIG5vdCB0cnkgdG8gY29udmVydCB0aGVtXG4gICAgY29uc3Qgc2lnbmVyID0gIW5lYXJVdGlscy5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMudHhQcmVidWlsZC5rZXkpXG4gICAgICA/IG5ldyBOZWFyS2V5UGFpcih7IHB1YjogcGFyYW1zLnR4UHJlYnVpbGQua2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgOiBwYXJhbXMudHhQcmVidWlsZC5rZXk7XG4gICAgcmV0dXJuIHsgdHhIZXgsIHBydiwgc2lnbmVyIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUga2V5Y2hhaW4gYW5kIGhhbGYtc2lnbiBwcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQcmVidWlsZCB7VHJhbnNhY3Rpb25QcmVidWlsZH0gcHJlYnVpbGQgb2JqZWN0IHJldHVybmVkIGJ5IHBsYXRmb3JtXG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IHtTdHJpbmd9IHVzZXIgcHJ2XG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7Qmx1ZWJpcmQ8U2lnbmVkVHJhbnNhY3Rpb24+fVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRCdWlsZGVyKCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4KTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogcGFyYW1zLnBydiB9KTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbjogQmFzZVRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSAodHJhbnNhY3Rpb24gYXMgQmFzZVRyYW5zYWN0aW9uKS50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR4SGV4OiBzZXJpYWxpemVkVHgsXG4gICAgfSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgZnVuZHMgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBCaXRHb1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyByZWNvdmVyKHBhcmFtczogTVBDUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxNUENUeCB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgaWYgKCFwYXJhbXMuYml0Z29LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiaXRnb0tleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgICB9XG4gICAgbGV0IHN0YXJ0SWR4ID0gcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4O1xuICAgIGlmIChzdGFydElkeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGFydElkeCA9IDA7XG4gICAgfSBlbHNlIGlmICghTnVtYmVyLmlzSW50ZWdlcihzdGFydElkeCkgfHwgc3RhcnRJZHggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhcnRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzJyk7XG4gICAgfVxuICAgIGxldCBudW1JdGVyYXRpb24gPSBwYXJhbXMuc2NhbjtcbiAgICBpZiAobnVtSXRlcmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG51bUl0ZXJhdGlvbiA9IDIwO1xuICAgIH0gZWxzZSBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtSXRlcmF0aW9uKSB8fCBudW1JdGVyYXRpb24gPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNjYW5uaW5nIGZhY3RvcicpO1xuICAgIH1cbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9ICFwYXJhbXMudXNlcktleSAmJiAhcGFyYW1zLmJhY2t1cEtleSAmJiAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCB7IHN0b3JhZ2VBbW91bnRQZXJCeXRlLCB0cmFuc2ZlckNvc3QsIHJlY2VpcHRDb25maWcgfSA9IGF3YWl0IHRoaXMuZ2V0UHJvdG9jb2xDb25maWcoKTtcbiAgICBsZXQgaXNTdG9yYWdlRGVwb3NpdEVuYWJsZWQgPSBmYWxzZTtcblxuICAgIGlmIChwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MpIHtcbiAgICAgIC8vIGNoZWNrIGlmIHJlY2VpdmVyIHN0b3JhZ2UgZGVwb3NpdCBpcyBlbmFibGVkXG4gICAgICBpc1N0b3JhZ2VEZXBvc2l0RW5hYmxlZCA9IGF3YWl0IHRoaXMuY2hlY2tJZlN0b3JhZ2VEZXBvc2l0SXNFbmFibGVkKFxuICAgICAgICBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSBzdGFydElkeDsgaSA8IG51bUl0ZXJhdGlvbiArIHN0YXJ0SWR4OyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJQYXRoID0gYG0vJHtpfWA7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChiaXRnb0tleSwgY3VyclBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICAgIGxldCBhdmFpbGFibGVCYWxhbmNlID0gbmV3IEJpZ051bWJlcigwKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF2YWlsYWJsZUJhbGFuY2UgPSBuZXcgQmlnTnVtYmVyKGF3YWl0IHRoaXMuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkLCBzdG9yYWdlQW1vdW50UGVyQnl0ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBVTktOT1dOX0FDQ09VTlQgZXJyb3IgaW5kaWNhdGVzIHRoYXQgdGhlIGFkZHJlc3MgaGFzIG5vdCBwYXJ0YWtlIGluIGFueSB0cmFuc2FjdGlvbiBzbyBmYXIsIHNvIHdlIHdpbGxcbiAgICAgICAgLy8gdHJlYXQgaXQgYXMgYSB6ZXJvIGJhbGFuY2UgYWRkcmVzc1xuICAgICAgICBpZiAoZS5tZXNzYWdlICE9PSAnVU5LTk9XTl9BQ0NPVU5UJykge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhdmFpbGFibGVCYWxhbmNlLnRvTnVtYmVyKCkgPD0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZlZVJlc2VydmUgPSBCaWdOdW1iZXIoTmV0d29ya3NbdGhpcy5uZXR3b3JrXS5uZWFyLmZlZVJlc2VydmUpO1xuICAgICAgY29uc3Qgc3RvcmFnZVJlc2VydmUgPSBCaWdOdW1iZXIoTmV0d29ya3NbdGhpcy5uZXR3b3JrXS5uZWFyLnN0b3JhZ2VSZXNlcnZlKTtcblxuICAgICAgLy8gY2hlY2sgZm9yIHBvc3NpYmxlIHRva2VuIHJlY292ZXJ5LCByZWNvdmVyIHRoZSB0b2tlbiBwcm92aWRlZCBieSB0aGUgdXNlclxuICAgICAgaWYgKHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSBuZWFyVXRpbHMuZmluZFRva2VuTmFtZUZyb21Db250cmFjdEFkZHJlc3MocGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzKTtcbiAgICAgICAgaWYgKCF0b2tlbk5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVG9rZW4gbmFtZSBub3QgZm91bmQgZm9yIGNvbnRyYWN0IGFkZHJlc3MgJHtwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3N9LiBUaGUgYWRkcmVzcyBtYXkgYmUgaW52YWxpZCBvciB1bnN1cHBvcnRlZC4gUGxlYXNlIHJlZmVyIHRvIHRoZSBzdXBwb3J0ZWQgdG9rZW5zIGluIHRoZSBCaXRHbyBkb2N1bWVudGF0aW9uIGZvciBndWlkYW5jZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlbiA9IG5lYXJVdGlscy5nZXRUb2tlbkluc3RhbmNlRnJvbVRva2VuTmFtZSh0b2tlbk5hbWUpO1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRva2VuIGluc3RhbmNlIGNvdWxkIG5vdCBiZSBjcmVhdGVkIGZvciB0b2tlbiBuYW1lICR7dG9rZW5OYW1lfS4gVGhlIHRva2VuIG1heSBiZSBpbnZhbGlkIG9yIHVuc3VwcG9ydGVkLiBQbGVhc2UgcmVmZXIgdG8gdGhlIHN1cHBvcnRlZCB0b2tlbnMgaW4gdGhlIEJpdEdvIGRvY3VtZW50YXRpb24gZm9yIGd1aWRhbmNlLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhdmFpbGFibGVUb2tlbkJhbGFuY2U6IEJpZ051bWJlcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhdmFpbGFibGVUb2tlbkJhbGFuY2UgPSBuZXcgQmlnTnVtYmVyKFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRBY2NvdW50RnVuZ2libGVUb2tlbkJhbGFuY2UoYWNjb3VudElkLCBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF2YWlsYWJsZVRva2VuQmFsYW5jZS50b051bWJlcigpIDw9IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXRBbW91bnQgPSBhdmFpbGFibGVCYWxhbmNlXG4gICAgICAgICAgLm1pbnVzKG5lYXJVdGlscy5jb252ZXJ0R2FzVW5pdHNUb1lvY3RvTmVhcihNQVhfR0FTX0xJTUlUX0ZPUl9GVF9UUkFOU0ZFUikpXG4gICAgICAgICAgLm1pbnVzKGZlZVJlc2VydmUpXG4gICAgICAgICAgLm1pbnVzKHN0b3JhZ2VSZXNlcnZlKTtcbiAgICAgICAgaWYgKG5ldEFtb3VudC50b051bWJlcigpIDw9IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRm91bmQgYWRkcmVzcyAke2l9IHdpdGggbm9uLXplcm8gZnVuZCBidXQgZnVuZCBpcyBpbnN1ZmZpY2llbnQgdG8gc3VwcG9ydCBhIHRva2VuIHJlY292ZXIgYCArXG4gICAgICAgICAgICAgIGB0cmFuc2FjdGlvbi4gUGxlYXNlIHN0YXJ0IHRoZSBuZXh0IHNjYW4gYXQgYWRkcmVzcyBpbmRleCAke2kgKyAxfS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvdmVyTmVhclRva2VuKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgICAgY3VyclBhdGgsXG4gICAgICAgICAgaSxcbiAgICAgICAgICBiaXRnb0tleSxcbiAgICAgICAgICBpc1N0b3JhZ2VEZXBvc2l0RW5hYmxlZCxcbiAgICAgICAgICBhdmFpbGFibGVUb2tlbkJhbGFuY2UsXG4gICAgICAgICAgaXNVbnNpZ25lZFN3ZWVwXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIGZpcnN0IGJ1aWxkIHRoZSB1bnNpZ25lZCB0eG5cbiAgICAgIGNvbnN0IGJzNThFbmNvZGVkUHVibGljS2V5ID0gbmVhckFQSS51dGlscy5zZXJpYWxpemUuYmFzZV9lbmNvZGUobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oYWNjb3VudElkLCAnaGV4JykpKTtcbiAgICAgIGNvbnN0IHsgbm9uY2UsIGJsb2NrSGFzaCB9ID0gYXdhaXQgdGhpcy5nZXRBY2Nlc3NLZXkoeyBhY2NvdW50SWQsIGJzNThFbmNvZGVkUHVibGljS2V5IH0pO1xuICAgICAgY29uc3QgZ2FzUHJpY2UgPSBhd2FpdCB0aGlzLmdldEdhc1ByaWNlKGJsb2NrSGFzaCk7XG4gICAgICBjb25zdCBnYXNQcmljZUZpcnN0QmxvY2sgPSBuZXcgQmlnTnVtYmVyKGdhc1ByaWNlKTtcbiAgICAgIGNvbnN0IGdhc1ByaWNlU2Vjb25kQmxvY2sgPSBnYXNQcmljZUZpcnN0QmxvY2subXVsdGlwbGllZEJ5KDEuMDUpO1xuICAgICAgY29uc3QgdG90YWxHYXNSZXF1aXJlZCA9IG5ldyBCaWdOdW1iZXIodHJhbnNmZXJDb3N0LnNlbmRTaXIpXG4gICAgICAgIC5wbHVzKHJlY2VpcHRDb25maWcuc2VuZFNpcilcbiAgICAgICAgLm11bHRpcGxpZWRCeShnYXNQcmljZUZpcnN0QmxvY2spXG4gICAgICAgIC5wbHVzKG5ldyBCaWdOdW1iZXIodHJhbnNmZXJDb3N0LmV4ZWN1dGlvbikucGx1cyhyZWNlaXB0Q29uZmlnLmV4ZWN1dGlvbikubXVsdGlwbGllZEJ5KGdhc1ByaWNlU2Vjb25kQmxvY2spKTtcbiAgICAgIC8vIGFkZGluZyBzb21lIHBhZGRpbmcgdG8gbWFrZSBzdXJlIHRoZSBnYXMgZG9lc24ndCBnbyBiZWxvdyByZXF1aXJlZCBnYXMgYnkgbmV0d29ya1xuICAgICAgY29uc3QgdG90YWxHYXNXaXRoUGFkZGluZyA9IHRvdGFsR2FzUmVxdWlyZWQubXVsdGlwbGllZEJ5KDEuNSk7XG4gICAgICBjb25zdCBuZXRBbW91bnQgPSBhdmFpbGFibGVCYWxhbmNlLm1pbnVzKHRvdGFsR2FzV2l0aFBhZGRpbmcpLm1pbnVzKGZlZVJlc2VydmUpLm1pbnVzKHN0b3JhZ2VSZXNlcnZlKTtcbiAgICAgIGlmIChuZXRBbW91bnQudG9OdW1iZXIoKSA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRm91bmQgYWRkcmVzcyAke2l9IHdpdGggbm9uLXplcm8gZnVuZCBidXQgZnVuZCBpcyBpbnN1ZmZpY2llbnQgdG8gc3VwcG9ydCBhIHJlY292ZXIgYCArXG4gICAgICAgICAgICBgdHJhbnNhY3Rpb24uIFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggJHtpICsgMX0uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIoYWNjb3VudElkLCBhY2NvdW50SWQpXG4gICAgICAgIC5ub25jZShub25jZSlcbiAgICAgICAgLnJlY2VpdmVySWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pXG4gICAgICAgIC5yZWNlbnRCbG9ja0hhc2goYmxvY2tIYXNoKVxuICAgICAgICAuYW1vdW50KG5ldEFtb3VudC50b0ZpeGVkKCkpO1xuICAgICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBsZXQgc2VyaWFsaXplZFR4ID0gdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgaWYgKCFpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgc2VyaWFsaXplZFR4ID0gYXdhaXQgdGhpcy5zaWduUmVjb3ZlcnlUcmFuc2FjdGlvbih0eEJ1aWxkZXIsIHBhcmFtcywgY3VyclBhdGgsIGFjY291bnRJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFVuc2lnbmVkU3dlZXBUcmFuc2FjdGlvbihcbiAgICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgICAgYWNjb3VudElkLFxuICAgICAgICAgIHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgIGJpdGdvS2V5LFxuICAgICAgICAgIGksXG4gICAgICAgICAgY3VyclBhdGgsXG4gICAgICAgICAgbmV0QW1vdW50LFxuICAgICAgICAgIHRvdGFsR2FzV2l0aFBhZGRpbmdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4LCBzY2FuSW5kZXg6IGkgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIGZ1bmRzIHRvIHJlY292ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBoYW5kbGUgbmVhciB0b2tlbiByZWNvdmVyeVxuICAgKiBAcGFyYW0ge01QQ1JlY292ZXJ5T3B0aW9uc30gcGFyYW1zIG1wYyByZWNvdmVyeSBvcHRpb25zIGlucHV0XG4gICAqIEBwYXJhbSB7TmVwMTQxVG9rZW59IHRva2VuIHRoZSB0b2tlbiBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlbmRlckFkZHJlc3Mgc2VuZGVyIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRlcml2YXRpb25QYXRoIHRoZSBkZXJpdmF0aW9uIHBhdGhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGlkeCBjdXJyZW50IGluZGV4XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiaXRnb0tleSBiaXRnbyBrZXlcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc1N0b3JhZ2VEZXBvc2l0RW5hYmxlZCBmbGFnIGluZGljYXRpbmcgd2hldGhlciBzdG9yYWdlIGRlcG9zaXQgaXMgZW5hYmxlZCBvbiB0aGUgcmVjZWl2ZXJcbiAgICogQHBhcmFtIHtCaWdOdW1iZXJ9IGF2YWlsYWJsZVRva2VuQmFsYW5jZSBjdXJyZW50bHkgYXZhaWxhYmxlIHRva2VuIGJhbGFuY2Ugb24gdGhlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc1Vuc2lnbmVkU3dlZXAgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgaXMgYW4gdW5zaWduZWQgc3dlZXBcbiAgICogQHJldHVybnMge1Byb21pc2U8TVBDVHggfCBNUENTd2VlcFR4cz59XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY292ZXJOZWFyVG9rZW4oXG4gICAgcGFyYW1zOiBNUENSZWNvdmVyeU9wdGlvbnMsXG4gICAgdG9rZW46IE5lcDE0MVRva2VuLFxuICAgIHNlbmRlckFkZHJlc3M6IHN0cmluZyxcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIGlkeDogbnVtYmVyLFxuICAgIGJpdGdvS2V5OiBzdHJpbmcsXG4gICAgaXNTdG9yYWdlRGVwb3NpdEVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgYXZhaWxhYmxlVG9rZW5CYWxhbmNlOiBCaWdOdW1iZXIsXG4gICAgaXNVbnNpZ25lZFN3ZWVwOiBib29sZWFuXG4gICk6IFByb21pc2U8TVBDVHggfCBNUENTd2VlcFR4cz4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSh0b2tlbik7XG4gICAgY29uc3QgYnM1OEVuY29kZWRQdWJsaWNLZXkgPSBuZWFyQVBJLnV0aWxzLnNlcmlhbGl6ZS5iYXNlX2VuY29kZShuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShzZW5kZXJBZGRyZXNzLCAnaGV4JykpKTtcbiAgICBjb25zdCB7IG5vbmNlLCBibG9ja0hhc2ggfSA9IGF3YWl0IHRoaXMuZ2V0QWNjZXNzS2V5KHsgYWNjb3VudElkOiBzZW5kZXJBZGRyZXNzLCBiczU4RW5jb2RlZFB1YmxpY0tleSB9KTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAuZ2V0RnVuZ2libGVUb2tlblRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAuc2VuZGVyKHNlbmRlckFkZHJlc3MsIHNlbmRlckFkZHJlc3MpXG4gICAgICAubm9uY2Uobm9uY2UpXG4gICAgICAucmVjZWl2ZXJJZCh0b2tlbi5jb250cmFjdEFkZHJlc3MpXG4gICAgICAucmVjZW50QmxvY2tIYXNoKGJsb2NrSGFzaClcbiAgICAgIC5mdFJlY2VpdmVySWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pXG4gICAgICAuZ2FzKE1BWF9HQVNfTElNSVRfRk9SX0ZUX1RSQU5TRkVSKVxuICAgICAgLmRlcG9zaXQoJzEnKVxuICAgICAgLmFtb3VudChhdmFpbGFibGVUb2tlbkJhbGFuY2UudG9TdHJpbmcoKSk7XG4gICAgaWYgKCFpc1N0b3JhZ2VEZXBvc2l0RW5hYmxlZCkge1xuICAgICAgdHhCdWlsZGVyLmFkZFN0b3JhZ2VEZXBvc2l0KHtcbiAgICAgICAgZGVwb3NpdDogQmlnSW50KHRva2VuLnN0b3JhZ2VEZXBvc2l0QW1vdW50KSxcbiAgICAgICAgZ2FzOiBCaWdJbnQoTUFYX0dBU19MSU1JVF9GT1JfRlRfVFJBTlNGRVIpLFxuICAgICAgICBhY2NvdW50SWQ6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgIHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICBiaXRnb0tleSxcbiAgICAgICAgaWR4LFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgYXZhaWxhYmxlVG9rZW5CYWxhbmNlLFxuICAgICAgICBuZXcgQmlnTnVtYmVyKG5lYXJVdGlscy5jb252ZXJ0R2FzVW5pdHNUb1lvY3RvTmVhcihNQVhfR0FTX0xJTUlUX0ZPUl9GVF9UUkFOU0ZFUikpLFxuICAgICAgICB0b2tlblxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gYXdhaXQgdGhpcy5zaWduUmVjb3ZlcnlUcmFuc2FjdGlvbih0eEJ1aWxkZXIsIHBhcmFtcywgZGVyaXZhdGlvblBhdGgsIHNlbmRlckFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHsgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsIHNjYW5JbmRleDogaWR4IH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIGJ1aWxkIHVuc2lnbmVkIHN3ZWVwIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25CdWlsZGVyfSB0eEJ1aWxkZXIgdGhlIG5lYXIgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VuZGVyQWRkcmVzcyBzZW5kZXIgYWRkcmVzc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjZWl2ZXJBZGRyZXNzIHRoZSByZWNlaXZlciBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiaXRnb0tleSBiaXRnbyBrZXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IGN1cnJlbnQgaW5kZXhcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRlcml2YXRpb25QYXRoIHRoZSBkZXJpdmF0aW9uIHBhdGhcbiAgICogQHBhcmFtIHtCaWdOdW1iZXJ9IG5ldEFtb3VudCBuZXQgYW1vdW50IHRvIGJlIHJlY292ZXJlZFxuICAgKiBAcGFyYW0ge0JpZ051bWJlcn0gbmV0R2FzIG5ldCBnYXMgcmVxdWlyZWRcbiAgICogQHBhcmFtIHtOZXAxNDFUb2tlbn0gdG9rZW4gb3B0aW9uYWwgbmVwMTQxIHRva2VuIGluc3RhbmNlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE1QQ1N3ZWVwVHhzPn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRVbnNpZ25lZFN3ZWVwVHJhbnNhY3Rpb24oXG4gICAgdHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nLFxuICAgIHJlY2VpdmVyQWRkcmVzczogc3RyaW5nLFxuICAgIGJpdGdvS2V5OiBzdHJpbmcsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIG5ldEFtb3VudDogQmlnTnVtYmVyLFxuICAgIG5ldEdhczogQmlnTnVtYmVyLFxuICAgIHRva2VuPzogTmVwMTQxVG9rZW5cbiAgKTogUHJvbWlzZTxNUENTd2VlcFR4cz4ge1xuICAgIGNvbnN0IGlzVG9rZW5UcmFuc2FjdGlvbiA9ICEhdG9rZW47XG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHdhbGxldENvaW4gPSBpc1Rva2VuVHJhbnNhY3Rpb24gPyB0b2tlbi5uYW1lIDogdGhpcy5nZXRDaGFpbigpO1xuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgdmFsdWVTdHJpbmc6IG5ldEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICB2YWx1ZTogbmV0QW1vdW50LnRvTnVtYmVyKCksXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3Qgb3V0cHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogcmVjZWl2ZXJBZGRyZXNzLFxuICAgICAgICB2YWx1ZVN0cmluZzogbmV0QW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW5OYW1lOiB3YWxsZXRDb2luLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGNvbnN0IHNwZW5kQW1vdW50ID0gbmV0QW1vdW50LnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcGFyc2VkVHggPSB7IGlucHV0czogaW5wdXRzLCBvdXRwdXRzOiBvdXRwdXRzLCBzcGVuZEFtb3VudDogc3BlbmRBbW91bnQsIHR5cGU6ICcnIH07XG4gICAgY29uc3QgZmVlSW5mbyA9IHsgZmVlOiBuZXRHYXMudG9OdW1iZXIoKSwgZmVlU3RyaW5nOiBuZXRHYXMudG9GaXhlZCgpIH07IC8vIEluY2x1ZGUgZ2FzIGZlZXNcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBNUENUeCA9IHtcbiAgICAgIHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4LCAvLyBTZXJpYWxpemVkIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICBzY2FuSW5kZXg6IGluZGV4LCAvLyBDdXJyZW50IGluZGV4IGluIHRoZSBzY2FuXG4gICAgICBjb2luOiB3YWxsZXRDb2luLFxuICAgICAgc2lnbmFibGVIZXg6IHVuc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSwgLy8gSGV4IHBheWxvYWQgZm9yIHNpZ25pbmdcbiAgICAgIGRlcml2YXRpb25QYXRoOiBkZXJpdmF0aW9uUGF0aCwgLy8gRGVyaXZhdGlvbiBwYXRoIGZvciB0aGUgYWNjb3VudFxuICAgICAgcGFyc2VkVHg6IHBhcnNlZFR4LFxuICAgICAgZmVlSW5mbzogZmVlSW5mbyxcbiAgICAgIGNvaW5TcGVjaWZpYzogeyBjb21tb25LZXljaGFpbjogYml0Z29LZXkgfSwgLy8gSW5jbHVkZSBibG9jayBoYXNoIGZvciBORUFSXG4gICAgfTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uczogTVBDVW5zaWduZWRUeFtdID0gW3sgdW5zaWduZWRUeDogdHJhbnNhY3Rpb24sIHNpZ25hdHVyZVNoYXJlczogW10gfV07XG4gICAgY29uc3QgdHhSZXF1ZXN0OiBSZWNvdmVyeVR4UmVxdWVzdCA9IHtcbiAgICAgIHRyYW5zYWN0aW9uczogdHJhbnNhY3Rpb25zLFxuICAgICAgd2FsbGV0Q29pbjogd2FsbGV0Q29pbixcbiAgICB9O1xuICAgIHJldHVybiB7IHR4UmVxdWVzdHM6IFt0eFJlcXVlc3RdIH07XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gdG8gc2lnbiB0aGUgcmVjb3ZlcnkgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IHR4QnVpbGRlciB0aGUgbmVhciB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqIEBwYXJhbSB7TVBDUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgbXBjIHJlY292ZXJ5IG9wdGlvbnMgaW5wdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRlcml2YXRpb25QYXRoIHRoZSBkZXJpdmF0aW9uIHBhdGhcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlbmRlckFkZHJlc3MgdGhlIHNlbmRlciBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmluZz59XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25SZWNvdmVyeVRyYW5zYWN0aW9uKFxuICAgIHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyLFxuICAgIHBhcmFtczogTVBDUmVjb3ZlcnlPcHRpb25zLFxuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgLy8gU2lnbiB0aGUgdHhuXG4gICAgLyogKioqKioqKioqKioqKioqKiogU1RBUlQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLy8gVE9ETyhCRy01MTA5Mik6IFRoaXMgbG9va3MgbGlrZSBhIGNvbW1vbiBwYXJ0IHdoaWNoIGNhbiBiZSBleHRyYWN0ZWQgb3V0IHRvb1xuICAgIGlmICghcGFyYW1zLnVzZXJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1c2VyS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLmJhY2t1cEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGJhY2t1cEtleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3Npbmcgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCB3aGl0ZXNwYWNlIGZyb20gZW50ZXJlZCB2YWx1ZXNcbiAgICBjb25zdCB1c2VyS2V5ID0gcGFyYW1zLnVzZXJLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBiYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICAvLyBEZWNyeXB0IHByaXZhdGUga2V5cyBmcm9tIEtleUNhcmQgdmFsdWVzXG4gICAgbGV0IHVzZXJQcnY7XG4gICAgdHJ5IHtcbiAgICAgIHVzZXJQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBpbnB1dDogdXNlcktleSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIHVzZXIga2V5Y2hhaW46ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICAvKiogVE9ETyBCRy01MjQxOSBJbXBsZW1lbnQgQ29kZWMgZm9yIHBhcnNpbmcgKi9cbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZSh1c2VyUHJ2KSBhcyBFRERTQU1ldGhvZFR5cGVzLlVzZXJTaWduaW5nTWF0ZXJpYWw7XG5cbiAgICBsZXQgYmFja3VwUHJ2O1xuICAgIHRyeSB7XG4gICAgICBiYWNrdXBQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBpbnB1dDogYmFja3VwS2V5LFxuICAgICAgICBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgYmFja3VwIGtleWNoYWluOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgY29uc3QgYmFja3VwU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShiYWNrdXBQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuQmFja3VwU2lnbmluZ01hdGVyaWFsO1xuICAgIC8qICoqKioqKioqKioqKioqKioqKioqKiogRU5EICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgLy8gYWRkIHNpZ25hdHVyZVxuICAgIGNvbnN0IHNpZ25hdHVyZUhleCA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRUU1NTaWduYXR1cmUoXG4gICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLFxuICAgICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLFxuICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICB1bnNpZ25lZFRyYW5zYWN0aW9uXG4gICAgKTtcbiAgICBjb25zdCBwdWJsaWNLZXlPYmogPSB7IHB1Yjogc2VuZGVyQWRkcmVzcyB9O1xuICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUocHVibGljS2V5T2JqIGFzIFB1YmxpY0tleSwgc2lnbmF0dXJlSGV4KTtcblxuICAgIGNvbnN0IGNvbXBsZXRlZFRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgcmV0dXJuIGNvbXBsZXRlZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihwYXJhbXM6IE1QQ1N3ZWVwUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxNUENUeHM+IHtcbiAgICBjb25zdCByZXEgPSBwYXJhbXMuc2lnbmF0dXJlU2hhcmVzO1xuICAgIGNvbnN0IGJyb2FkY2FzdGFibGVUcmFuc2FjdGlvbnM6IE1QQ1R4W10gPSBbXTtcbiAgICBsZXQgbGFzdFNjYW5JbmRleCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcmVxW2ldLnR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcblxuICAgICAgLy8gVmFsaWRhdGUgc2lnbmF0dXJlIHNoYXJlc1xuICAgICAgaWYgKCFyZXFbaV0ub3ZjIHx8ICFyZXFbaV0ub3ZjWzBdLmVkZHNhU2lnbmF0dXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBzaWduYXR1cmUocyknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHJlcVtpXS5vdmNbMF0uZWRkc2FTaWduYXR1cmU7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHNpZ25hYmxlIGhleFxuICAgICAgaWYgKCF0cmFuc2FjdGlvbi5zaWduYWJsZUhleCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc2lnbmFibGUgaGV4Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXNzYWdlQnVmZmVyID0gQnVmZmVyLmZyb20odHJhbnNhY3Rpb24uc2lnbmFibGVIZXghLCAnaGV4Jyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VCdWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXBhcmUgdGhlIHNpZ25hdHVyZSBpbiBoZXggZm9ybWF0XG4gICAgICBjb25zdCBzaWduYXR1cmVIZXggPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShzaWduYXR1cmUuUiwgJ2hleCcpLCBCdWZmZXIuZnJvbShzaWduYXR1cmUuc2lnbWEsICdoZXgnKV0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0cmFuc2FjdGlvbi1zcGVjaWZpYyBmaWVsZHNcbiAgICAgIGlmICghdHJhbnNhY3Rpb24uY29pblNwZWNpZmljPy5jb21tb25LZXljaGFpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgY29tbW9uIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21tb25LZXljaGFpbiA9IHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyEuY29tbW9uS2V5Y2hhaW4hIGFzIHN0cmluZztcblxuICAgICAgaWYgKCF0cmFuc2FjdGlvbi5kZXJpdmF0aW9uUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZGVyaXZhdGlvbiBwYXRoJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IHRyYW5zYWN0aW9uLmRlcml2YXRpb25QYXRoIGFzIHN0cmluZztcblxuICAgICAgLy8gRGVyaXZlIGFjY291bnQgSUQgYW5kIHNlbmRlciBhZGRyZXNzXG4gICAgICBjb25zdCBhY2NvdW50SWQgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICAgIGNvbnN0IHR4bkJ1aWxkZXIgPSB0aGlzLmdldEJ1aWxkZXIoKS5mcm9tKHRyYW5zYWN0aW9uLnNlcmlhbGl6ZWRUeCBhcyBzdHJpbmcpO1xuXG4gICAgICAvLyBBZGQgdGhlIHNpZ25hdHVyZVxuICAgICAgY29uc3QgbmVhcktleVBhaXIgPSBuZXcgTmVhcktleVBhaXIoeyBwdWI6IGFjY291bnRJZCB9KTtcbiAgICAgIHR4bkJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBuZWFyS2V5UGFpci5nZXRLZXlzKCkucHViIH0sIHNpZ25hdHVyZUhleCk7XG5cbiAgICAgIC8vIEZpbmFsaXplIGFuZCBzZXJpYWxpemUgdGhlIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHR4bkJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIC8vIEFkZCB0aGUgc2lnbmVkIHRyYW5zYWN0aW9uIHRvIHRoZSBsaXN0XG4gICAgICBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zLnB1c2goe1xuICAgICAgICBzZXJpYWxpemVkVHg6IHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgc2NhbkluZGV4OiB0cmFuc2FjdGlvbi5zY2FuSW5kZXgsXG4gICAgICB9KTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBsYXN0IHNjYW4gaW5kZXggaWYgYXBwbGljYWJsZVxuICAgICAgaWYgKGkgPT09IHJlcS5sZW5ndGggLSAxICYmIHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyEubGFzdFNjYW5JbmRleCkge1xuICAgICAgICBsYXN0U2NhbkluZGV4ID0gdHJhbnNhY3Rpb24uY29pblNwZWNpZmljIS5sYXN0U2NhbkluZGV4IGFzIG51bWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJyb2FkY2FzdGFibGUgdHJhbnNhY3Rpb25zIGFuZCB0aGUgbGFzdCBzY2FuIGluZGV4XG4gICAgcmV0dXJuIHsgdHJhbnNhY3Rpb25zOiBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zLCBsYXN0U2NhbkluZGV4IH07XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIHJlcXVlc3QgdG8gb25lIG9mIHRoZSBwdWJsaWMgRU9TIG5vZGVzIGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gcGFyYW1zLnBheWxvYWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXREYXRhRnJvbU5vZGUocGFyYW1zOiB7IHBheWxvYWQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KTogUHJvbWlzZTxyZXF1ZXN0LlJlc3BvbnNlPiB7XG4gICAgY29uc3Qgbm9kZVVybHMgPSB0aGlzLmdldFB1YmxpY05vZGVVcmxzKCk7XG4gICAgZm9yIChjb25zdCBub2RlVXJsIG9mIG5vZGVVcmxzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVxdWVzdC5wb3N0KG5vZGVVcmwpLnNlbmQocGFyYW1zLnBheWxvYWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjYWxsIGVuZHBvaW50OiAnLycgZnJvbSBub2RlczogJHtfLmpvaW4obm9kZVVybHMsICcsICcpfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEFjY2Vzc0tleSh7XG4gICAgYWNjb3VudElkLFxuICAgIGJzNThFbmNvZGVkUHVibGljS2V5LFxuICB9OiB7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgYnM1OEVuY29kZWRQdWJsaWNLZXk6IHN0cmluZztcbiAgfSk6IFByb21pc2U8TmVhclR4QnVpbGRlclBhcmFtc0Zyb21Ob2RlPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldERhdGFGcm9tTm9kZSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICBpZDogJ2RvbnRjYXJlJyxcbiAgICAgICAgbWV0aG9kOiAncXVlcnknLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICByZXF1ZXN0X3R5cGU6ICd2aWV3X2FjY2Vzc19rZXknLFxuICAgICAgICAgIGZpbmFsaXR5OiAnZmluYWwnLFxuICAgICAgICAgIGFjY291bnRfaWQ6IGFjY291bnRJZCxcbiAgICAgICAgICBwdWJsaWNfa2V5OiBiczU4RW5jb2RlZFB1YmxpY0tleSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjY291bnQgbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIGNvbnN0IGFjY2Vzc0tleSA9IHJlc3BvbnNlLmJvZHkucmVzdWx0O1xuICAgIHJldHVybiB7IG5vbmNlOiBhY2Nlc3NLZXkubm9uY2UgKyAxLCBibG9ja0hhc2g6IGFjY2Vzc0tleS5ibG9ja19oYXNoIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkOiBzdHJpbmcsIHN0b3JhZ2VBbW91bnRQZXJCeXRlOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXREYXRhRnJvbU5vZGUoe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgaWQ6ICdkb250Y2FyZScsXG4gICAgICAgIG1ldGhvZDogJ3F1ZXJ5JyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgcmVxdWVzdF90eXBlOiAndmlld19hY2NvdW50JyxcbiAgICAgICAgICBmaW5hbGl0eTogJ2ZpbmFsJyxcbiAgICAgICAgICBhY2NvdW50X2lkOiBhY2NvdW50SWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcXVlcnkgYWNjb3VudCBpbmZvcm1hdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBlcnJvckNhdXNlID0gcmVzcG9uc2UuYm9keS5lcnJvcj8uY2F1c2UubmFtZTtcbiAgICBpZiAoZXJyb3JDYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JDYXVzZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjb3VudCA9IHJlc3BvbnNlLmJvZHkucmVzdWx0O1xuICAgIGNvbnN0IGNvc3RQZXJCeXRlID0gbmV3IEJpZ051bWJlcihzdG9yYWdlQW1vdW50UGVyQnl0ZSk7XG4gICAgY29uc3Qgc3RhdGVTdGFrZWQgPSBuZXcgQmlnTnVtYmVyKGFjY291bnQuc3RvcmFnZV91c2FnZSkubXVsdGlwbGllZEJ5KGNvc3RQZXJCeXRlKTtcbiAgICBjb25zdCBzdGFrZWQgPSBuZXcgQmlnTnVtYmVyKGFjY291bnQubG9ja2VkKTtcbiAgICBjb25zdCB0b3RhbEJhbGFuY2UgPSBuZXcgQmlnTnVtYmVyKGFjY291bnQuYW1vdW50KS5wbHVzKHN0YWtlZCk7XG4gICAgY29uc3QgYXZhaWxhYmxlQmFsYW5jZSA9IHRvdGFsQmFsYW5jZS5taW51cyhCaWdOdW1iZXIubWF4KHN0YWtlZCwgc3RhdGVTdGFrZWQpKTtcbiAgICByZXR1cm4gYXZhaWxhYmxlQmFsYW5jZS50b1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgZnVuZ2libGUgdG9rZW4gYmFsYW5jZSBmb3IgYW4gYWNjb3VudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWNjb3VudElkIGFjY291bnQgZm9yIHdoaWNoIHRoZSBmdCBiYWxhbmNlIHRvIGJlIGZldGNoZWRcbiAgICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSB0b2tlbiBjb250cmFjdCBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmluZz59XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0QWNjb3VudEZ1bmdpYmxlVG9rZW5CYWxhbmNlKGFjY291bnRJZDogc3RyaW5nLCB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBiYXNlNjRBcmdzID0gbmVhclV0aWxzLmNvbnZlcnRUb0Jhc2U2NCh7IGFjY291bnRfaWQ6IGFjY291bnRJZCB9KTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgIGlkOiAnZG9udGNhcmUnLFxuICAgICAgICBtZXRob2Q6ICdxdWVyeScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHJlcXVlc3RfdHlwZTogJ2NhbGxfZnVuY3Rpb24nLFxuICAgICAgICAgIGZpbmFsaXR5OiAnZmluYWwnLFxuICAgICAgICAgIGFjY291bnRfaWQ6IHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgIG1ldGhvZF9uYW1lOiAnZnRfYmFsYW5jZV9vZicsXG4gICAgICAgICAgYXJnc19iYXNlNjQ6IGJhc2U2NEFyZ3MsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggZnQgYmFsYW5jZSBvZiB0aGUgYWNjb3VudCcpO1xuICAgIH1cbiAgICBjb25zdCBlcnJvckNhdXNlID0gcmVzcG9uc2UuYm9keS5lcnJvcj8uY2F1c2U/Lm5hbWU7XG4gICAgaWYgKGVycm9yQ2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yQ2F1c2UpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRVaW50OEFycmF5OiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UuYm9keS5yZXN1bHQucmVzdWx0KTtcbiAgICBjb25zdCByYXcgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocmVzdWx0VWludDhBcnJheSk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBjaGVjayBpZiBzdG9yYWdlIGRlcG9zaXQgaXMgZW5hYmxlZCBvbiBhbiBhZGRyZXNzIGZvciBhIHRva2VuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY2NvdW50SWQgYWNjb3VudCBmb3Igd2hpY2ggdGhlIHN0b3JhZ2UgYmFsYW5jZSB0byBiZSBmZXRjaGVkXG4gICAqIEBwYXJhbSB0b2tlbkNvbnRyYWN0QWRkcmVzcyB0aGUgdG9rZW4gY29udHJhY3QgYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gdHJ1ZSBpZiB3ZSBmaW5kIHRoZSBzdG9yYWdlIGJhbGFuY2UsIGZhbHNlIGlmIHJlc3BvbnNlIGlzIG51bGxcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjaGVja0lmU3RvcmFnZURlcG9zaXRJc0VuYWJsZWQoYWNjb3VudElkOiBzdHJpbmcsIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBiYXNlNjRBcmdzID0gbmVhclV0aWxzLmNvbnZlcnRUb0Jhc2U2NCh7IGFjY291bnRfaWQ6IGFjY291bnRJZCB9KTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgIGlkOiAnZG9udGNhcmUnLFxuICAgICAgICBtZXRob2Q6ICdxdWVyeScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHJlcXVlc3RfdHlwZTogJ2NhbGxfZnVuY3Rpb24nLFxuICAgICAgICAgIGZpbmFsaXR5OiAnZmluYWwnLFxuICAgICAgICAgIGFjY291bnRfaWQ6IHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgIG1ldGhvZF9uYW1lOiAnc3RvcmFnZV9iYWxhbmNlX29mJyxcbiAgICAgICAgICBhcmdzX2Jhc2U2NDogYmFzZTY0QXJncyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBzdG9yYWdlIGRlcG9zaXQgb2YgdGhlIGFjY291bnQnKTtcbiAgICB9XG4gICAgY29uc3QgZXJyb3JDYXVzZSA9IHJlc3BvbnNlLmJvZHkuZXJyb3I/LmNhdXNlPy5uYW1lO1xuICAgIGlmIChlcnJvckNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvckNhdXNlKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0VWludDhBcnJheTogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHJlc3BvbnNlLmJvZHkucmVzdWx0LnJlc3VsdCk7XG4gICAgY29uc3QgcmF3ID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHJlc3VsdFVpbnQ4QXJyYXkpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgcmV0dXJuIGRlY29kZWQgIT09IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0UHJvdG9jb2xDb25maWcoKTogUHJvbWlzZTxQcm90b2NvbENvbmZpZ091dHB1dD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXREYXRhRnJvbU5vZGUoe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgaWQ6ICdkb250Y2FyZScsXG4gICAgICAgIG1ldGhvZDogJ0VYUEVSSU1FTlRBTF9wcm90b2NvbF9jb25maWcnLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBmaW5hbGl0eTogJ2ZpbmFsJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjY291bnQgbm90IGZvdW5kJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gcmVzcG9uc2UuYm9keS5yZXN1bHQ7XG4gICAgY29uc3Qgc3RvcmFnZUFtb3VudFBlckJ5dGUgPSBjb25maWcucnVudGltZV9jb25maWcuc3RvcmFnZV9hbW91bnRfcGVyX2J5dGU7XG4gICAgY29uc3QgdHJhbnNmZXJDb3N0RnJvbU5ldHdvcmsgPSBjb25maWcucnVudGltZV9jb25maWcudHJhbnNhY3Rpb25fY29zdHMuYWN0aW9uX2NyZWF0aW9uX2NvbmZpZy50cmFuc2Zlcl9jb3N0O1xuICAgIGNvbnN0IHRyYW5zZmVyQ29zdDogTmVhckZlZUNvbmZpZyA9IHtcbiAgICAgIHNlbmRTaXI6IHRyYW5zZmVyQ29zdEZyb21OZXR3b3JrLnNlbmRfc2lyLFxuICAgICAgc2VuZE5vdFNpcjogdHJhbnNmZXJDb3N0RnJvbU5ldHdvcmsuc2VuZF9ub3Rfc2lyLFxuICAgICAgZXhlY3V0aW9uOiB0cmFuc2ZlckNvc3RGcm9tTmV0d29yay5leGVjdXRpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlY2VpcHRDb25maWdGcm9tTmV0d29yayA9IGNvbmZpZy5ydW50aW1lX2NvbmZpZy50cmFuc2FjdGlvbl9jb3N0cy5hY3Rpb25fcmVjZWlwdF9jcmVhdGlvbl9jb25maWc7XG4gICAgY29uc3QgcmVjZWlwdENvbmZpZzogTmVhckZlZUNvbmZpZyA9IHtcbiAgICAgIHNlbmRTaXI6IHJlY2VpcHRDb25maWdGcm9tTmV0d29yay5zZW5kX3NpcixcbiAgICAgIHNlbmROb3RTaXI6IHJlY2VpcHRDb25maWdGcm9tTmV0d29yay5zZW5kX25vdF9zaXIsXG4gICAgICBleGVjdXRpb246IHJlY2VpcHRDb25maWdGcm9tTmV0d29yay5leGVjdXRpb24sXG4gICAgfTtcbiAgICByZXR1cm4geyBzdG9yYWdlQW1vdW50UGVyQnl0ZSwgdHJhbnNmZXJDb3N0LCByZWNlaXB0Q29uZmlnIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0R2FzUHJpY2UoYmxvY2tIYXNoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXREYXRhRnJvbU5vZGUoe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgaWQ6ICdkb250Y2FyZScsXG4gICAgICAgIG1ldGhvZDogJ2dhc19wcmljZScsXG4gICAgICAgIHBhcmFtczogW2Jsb2NrSGFzaF0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY2NvdW50IG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keS5yZXN1bHQuZ2FzX3ByaWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFB1YmxpY05vZGVVcmxzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLm5lYXJOb2RlVXJscztcbiAgfVxuXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBOZWFyUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPE5lYXJQYXJzZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eFByZWJ1aWxkOiBwYXJhbXMudHhQcmVidWlsZCxcbiAgICAgIHB1YmxpY0tleTogcGFyYW1zLnB1YmxpY0tleSxcbiAgICAgIGZlZUluZm86IHBhcmFtcy5mZWVJbmZvLFxuICAgIH0pO1xuXG4gICAgaWYgKCF0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZWFyVHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uIGFzIE5lYXJUcmFuc2FjdGlvbkV4cGxhbmF0aW9uO1xuICAgIGlmIChuZWFyVHJhbnNhY3Rpb24ub3V0cHV0cy5sZW5ndGggPD0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBuZWFyVHJhbnNhY3Rpb24ub3V0cHV0c1swXS5hZGRyZXNzO1xuICAgIGNvbnN0IGZlZUFtb3VudCA9IG5ldyBCaWdOdW1iZXIobmVhclRyYW5zYWN0aW9uLmZlZS5mZWUgPT09ICcnID8gJzAnIDogbmVhclRyYW5zYWN0aW9uLmZlZS5mZWUpO1xuXG4gICAgLy8gYXNzdW1lIDEgc2VuZGVyLCB3aG8gaXMgYWxzbyB0aGUgZmVlIHBheWVyXG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIobmVhclRyYW5zYWN0aW9uLm91dHB1dEFtb3VudCkucGx1cyhmZWVBbW91bnQpLnRvRml4ZWQoKSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uT3V0cHV0W10gPSBuZWFyVHJhbnNhY3Rpb24ub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihvdXRwdXQuYW1vdW50KS50b0ZpeGVkKCksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IHRvdGFsQW1vdW50ID0gbmV3IEJpZ051bWJlcigwKTtcbiAgICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSk7XG4gICAgY29uc3QgeyB0eFByZWJ1aWxkOiB0eFByZWJ1aWxkLCB0eFBhcmFtczogdHhQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihjb2luQ29uZmlnKTtcbiAgICBjb25zdCByYXdUeCA9IHR4UHJlYnVpbGQudHhIZXg7XG4gICAgaWYgKCFyYXdUeCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfVxuXG4gICAgdHJhbnNhY3Rpb24uZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICBjb25zdCBleHBsYWluZWRUeCA9IHRyYW5zYWN0aW9uLmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgLy8gdXNlcnMgZG8gbm90IGlucHV0IHJlY2lwaWVudHMgZm9yIGNvbnNvbGlkYXRpb24gcmVxdWVzdHMgYXMgdGhleSBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBzZXJ2ZXJcbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHhQYXJhbXMudHlwZSA9PT0gJ2VuYWJsZXRva2VuJykge1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSBleHBsYWluZWRUeC5vdXRwdXRzWzBdLnRva2VuTmFtZTtcbiAgICAgICAgaWYgKHRva2VuTmFtZSkge1xuICAgICAgICAgIGNvbnN0IG5lcFRva2VuID0gbmVhclV0aWxzLmdldFRva2VuSW5zdGFuY2VGcm9tVG9rZW5OYW1lKHRva2VuTmFtZSk7XG4gICAgICAgICAgaWYgKG5lcFRva2VuKSB7XG4gICAgICAgICAgICBleHBsYWluZWRUeC5vdXRwdXRzLmZvckVhY2goKG91dHB1dCkgPT4ge1xuICAgICAgICAgICAgICBpZiAob3V0cHV0LmFtb3VudCAhPT0gbmVwVG9rZW4uc3RvcmFnZURlcG9zaXRBbW91bnQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0b3JhZ2UgZGVwb3NpdCBhbW91bnQgbm90IG1hdGNoaW5nIScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRSZWNpcGllbnRzID0gdHhQYXJhbXMucmVjaXBpZW50cz8ubWFwKChyZWNpcGllbnQpID0+IHtcbiAgICAgICAgaWYgKHR4UGFyYW1zLnR5cGUgIT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgICAgICByZXR1cm4gXy5waWNrKHJlY2lwaWVudCwgWydhZGRyZXNzJywgJ2Ftb3VudCddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gXy5waWNrKHJlY2lwaWVudCwgWydhZGRyZXNzJywgJ3Rva2VuTmFtZSddKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBmaWx0ZXJlZE91dHB1dHMgPSBleHBsYWluZWRUeC5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiB7XG4gICAgICAgIGlmICh0eFBhcmFtcy50eXBlICE9PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICAgICAgcmV0dXJuIF8ucGljayhvdXRwdXQsIFsnYWRkcmVzcycsICdhbW91bnQnXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIF8ucGljayhvdXRwdXQsIFsnYWRkcmVzcycsICd0b2tlbk5hbWUnXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIV8uaXNFcXVhbChmaWx0ZXJlZE91dHB1dHMsIGZpbHRlcmVkUmVjaXBpZW50cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCByZWNpcGllbnRzIG9mIHR4UGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgICAgdG90YWxBbW91bnQgPSB0eFBhcmFtcy50eXBlICE9PSAnZW5hYmxldG9rZW4nID8gdG90YWxBbW91bnQucGx1cyhyZWNpcGllbnRzLmFtb3VudCkgOiBCaWdOdW1iZXIoMCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRvdGFsQW1vdW50LmlzRXF1YWxUbyhleHBsYWluZWRUeC5vdXRwdXRBbW91bnQpICYmIHR4UGFyYW1zLnR5cGUgIT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCB0b3RhbCBhbW91bnQgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0b3RhbCBhbW91bnQgZmllbGQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkZXIoKTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldEJhc2VDaGFpbigpKSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoeyBwcnYsIHB1YmxpY0tleSwgbXVsdGlTaWdUeXBlIH06IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKSB7XG4gICAgaWYgKG11bHRpU2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbXVsdGlTaWdUeXBlJyk7XG4gICAgfVxuICAgIGF1ZGl0RWRkc2FQcml2YXRlS2V5KHBydiwgcHVibGljS2V5ID8/ICcnKTtcbiAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/sdk-coin-near",
|
|
3
|
-
"version": "1.3.3-alpha.
|
|
3
|
+
"version": "1.3.3-alpha.360",
|
|
4
4
|
"description": "BitGo SDK coin library for Near",
|
|
5
5
|
"main": "./dist/src/index.js",
|
|
6
6
|
"types": "./dist/src/index.d.ts",
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
]
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@bitgo-beta/sdk-core": "2.4.1-alpha.
|
|
44
|
-
"@bitgo-beta/sdk-lib-mpc": "8.2.1-alpha.
|
|
45
|
-
"@bitgo-beta/statics": "10.0.1-alpha.
|
|
43
|
+
"@bitgo-beta/sdk-core": "2.4.1-alpha.361",
|
|
44
|
+
"@bitgo-beta/sdk-lib-mpc": "8.2.1-alpha.317",
|
|
45
|
+
"@bitgo-beta/statics": "10.0.1-alpha.361",
|
|
46
46
|
"@near-js/crypto": "^2.0.1",
|
|
47
47
|
"@near-js/transactions": "^2.0.1",
|
|
48
48
|
"@stablelib/hex": "^1.0.0",
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
"tweetnacl": "^1.0.3"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@bitgo-beta/sdk-api": "1.6.1-alpha.
|
|
58
|
+
"@bitgo-beta/sdk-api": "1.6.1-alpha.361",
|
|
59
59
|
"@bitgo-beta/sdk-test": "^8.0.97",
|
|
60
60
|
"@types/lodash": "^4.14.121"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "f532518cd914d03eaf012c7a61a962a459a547d9"
|
|
63
63
|
}
|