@bitgo-beta/abstract-eth 1.0.2-beta.2194 → 1.0.2-beta.2195
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/iface.d.ts +8 -0
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/transactionBuilder.d.ts +23 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +58 -1
- package/dist/src/lib/utils.d.ts +8 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +17 -1
- package/dist/src/lib/zamaUtils.d.ts +42 -0
- package/dist/src/lib/zamaUtils.d.ts.map +1 -1
- package/dist/src/lib/zamaUtils.js +102 -2
- package/dist/test/unit/transactionBuilder/index.d.ts +1 -0
- package/dist/test/unit/transactionBuilder/index.d.ts.map +1 -1
- package/dist/test/unit/transactionBuilder/index.js +2 -1
- package/dist/test/unit/transactionBuilder/wrapERC7984.d.ts +3 -0
- package/dist/test/unit/transactionBuilder/wrapERC7984.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/wrapERC7984.js +140 -0
- package/dist/test/unit/zamaUtils.js +77 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -2,6 +2,9 @@ export declare const delegateForUserDecryptionTypes: readonly ["address", "addre
|
|
|
2
2
|
export declare const callFromParentTypes: readonly ["address", "uint256", "bytes"];
|
|
3
3
|
export declare const aclMulticallTypes: readonly ["bytes[]"];
|
|
4
4
|
export declare const approveTypes: readonly ["address", "uint256"];
|
|
5
|
+
export declare const wrapTypes: readonly ["address", "uint256"];
|
|
6
|
+
/** Max value for Solidity `uint64` / ERC-7984 confidential amount domain (`euint64`). */
|
|
7
|
+
export declare const UINT64_MAX = 18446744073709551615n;
|
|
5
8
|
/**
|
|
6
9
|
* Function selector for ACL.delegateForUserDecryption(address,address,uint64)
|
|
7
10
|
* = keccak256('delegateForUserDecryption(address,address,uint64)')[0:4]
|
|
@@ -24,6 +27,18 @@ export declare const callFromParentMethodId: string;
|
|
|
24
27
|
* Used for exact-amount (and approve(0) reset) approvals of the ERC-7984 wrapper as spender.
|
|
25
28
|
*/
|
|
26
29
|
export declare const approveMethodId: string;
|
|
30
|
+
/**
|
|
31
|
+
* Function selector for ERC-7984 wrap(address,uint256)
|
|
32
|
+
* = keccak256('wrap(address,uint256)')[0:4]
|
|
33
|
+
* Locks underlying ERC-20 in the wrapper and mints an encrypted balance to `to`.
|
|
34
|
+
*/
|
|
35
|
+
export declare const wrapMethodId: string;
|
|
36
|
+
/**
|
|
37
|
+
* Asserts that `amount * rate` fits in uint64 (ERC-7984 confidential mint domain).
|
|
38
|
+
*
|
|
39
|
+
* @throws {Error} if amount or rate is invalid, or the product exceeds uint64
|
|
40
|
+
*/
|
|
41
|
+
export declare function assertAmountTimesRateFitsUint64(amount: string | number | bigint, rate: string | number | bigint): void;
|
|
27
42
|
/**
|
|
28
43
|
* Encodes ERC-20 `approve(spender, amount)` calldata for ERC-7984 shield.
|
|
29
44
|
*
|
|
@@ -40,6 +55,33 @@ export declare const approveMethodId: string;
|
|
|
40
55
|
* @throws {Error} if the wrapper address is invalid or amount is negative
|
|
41
56
|
*/
|
|
42
57
|
export declare function buildApproveCalldata(wrapperAddress: string, amount: string | number | bigint): string;
|
|
58
|
+
/**
|
|
59
|
+
* Encodes ERC-7984 `wrap(to, amount)` calldata for the shield path.
|
|
60
|
+
*
|
|
61
|
+
* Calldata is sent to the confidential wrapper contract. `to` is the recipient of
|
|
62
|
+
* the minted encrypted balance (self-directed shields use the wallet base address).
|
|
63
|
+
* When `rate` is provided, validates that `amount × rate` fits uint64 (`euint64`).
|
|
64
|
+
* `rate` is not encoded in calldata (deserialize round-trips omit it).
|
|
65
|
+
*
|
|
66
|
+
* Does not set gasLimit — WP owns gas.
|
|
67
|
+
*
|
|
68
|
+
* @param to Recipient of confidential tokens (checksummed / lowercased accepted)
|
|
69
|
+
* @param amount Underlying ERC-20 amount to wrap (base units); must be > 0
|
|
70
|
+
* @param rate Optional on-chain wrapper `rate()` for uint64 validation
|
|
71
|
+
* @returns ABI-encoded calldata hex string (0x-prefixed)
|
|
72
|
+
* @throws {Error} if address/amount/rate is invalid or amount × rate exceeds uint64
|
|
73
|
+
*/
|
|
74
|
+
export declare function buildWrapCalldata(to: string, amount: string | number | bigint, rate?: string | number | bigint): string;
|
|
75
|
+
/**
|
|
76
|
+
* Decodes ERC-7984 `wrap(to, amount)` calldata.
|
|
77
|
+
*
|
|
78
|
+
* @param data ABI-encoded wrap calldata (0x-prefixed)
|
|
79
|
+
* @returns `{ to, amount }` with checksummed `to` and decimal-string `amount`
|
|
80
|
+
*/
|
|
81
|
+
export declare function decodeWrapCalldata(data: string): {
|
|
82
|
+
to: string;
|
|
83
|
+
amount: string;
|
|
84
|
+
};
|
|
43
85
|
/**
|
|
44
86
|
* Encodes a single ACL.delegateForUserDecryption() call.
|
|
45
87
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zamaUtils.d.ts","sourceRoot":"","sources":["../../../src/lib/zamaUtils.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,8BAA8B,2CAA4C,CAAC;AACxF,eAAO,MAAM,mBAAmB,0CAA2C,CAAC;AAC5E,eAAO,MAAM,iBAAiB,sBAAuB,CAAC;AACtD,eAAO,MAAM,YAAY,iCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"zamaUtils.d.ts","sourceRoot":"","sources":["../../../src/lib/zamaUtils.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,8BAA8B,2CAA4C,CAAC;AACxF,eAAO,MAAM,mBAAmB,0CAA2C,CAAC;AAC5E,eAAO,MAAM,iBAAiB,sBAAuB,CAAC;AACtD,eAAO,MAAM,YAAY,iCAAkC,CAAC;AAC5D,eAAO,MAAM,SAAS,iCAAkC,CAAC;AAEzD,yFAAyF;AACzF,eAAO,MAAM,UAAU,wBAAwB,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,iCAAiC,QAE7C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAElC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAmF,CAAC;AAEhH;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAA6E,CAAC;AAMvG;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAChC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAC7B,IAAI,CAsBN;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAqBrG;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAChC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAC9B,MAAM,CAyBR;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAU/E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,EACvB,oBAAoB,EAAE,MAAM,EAC5B,eAAe,EAAE,MAAM,GACtB,MAAM,CAOR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gCAAgC,CAC9C,eAAe,EAAE,MAAM,EACvB,sBAAsB,EAAE,MAAM,EAAE,EAChC,eAAe,EAAE,MAAM,GACtB,MAAM,CAyBR;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0CAA0C,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAyCrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAK5G;AAED;;;;;;;;;GASG;AACH,wBAAgB,uCAAuC,CACrD,oBAAoB,EAAE,MAAM,EAC5B,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,GACtB,MAAM,CAGR;AAED;;;;;;;GAOG;AACH,wBAAgB,wCAAwC,CAAC,IAAI,EAAE,MAAM,GAAG;IACtE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,CA8BA"}
|
|
@@ -3,8 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.approveMethodId = exports.callFromParentMethodId = exports.aclMulticallMethodId = exports.delegateForUserDecryptionMethodId = exports.approveTypes = exports.aclMulticallTypes = exports.callFromParentTypes = exports.delegateForUserDecryptionTypes = void 0;
|
|
6
|
+
exports.wrapMethodId = exports.approveMethodId = exports.callFromParentMethodId = exports.aclMulticallMethodId = exports.delegateForUserDecryptionMethodId = exports.UINT64_MAX = exports.wrapTypes = exports.approveTypes = exports.aclMulticallTypes = exports.callFromParentTypes = exports.delegateForUserDecryptionTypes = void 0;
|
|
7
|
+
exports.assertAmountTimesRateFitsUint64 = assertAmountTimesRateFitsUint64;
|
|
7
8
|
exports.buildApproveCalldata = buildApproveCalldata;
|
|
9
|
+
exports.buildWrapCalldata = buildWrapCalldata;
|
|
10
|
+
exports.decodeWrapCalldata = decodeWrapCalldata;
|
|
8
11
|
exports.buildDelegationCalldata = buildDelegationCalldata;
|
|
9
12
|
exports.buildMulticallDelegationCalldata = buildMulticallDelegationCalldata;
|
|
10
13
|
exports.wrapInCallFromParent = wrapInCallFromParent;
|
|
@@ -24,6 +27,9 @@ exports.delegateForUserDecryptionTypes = ['address', 'address', 'uint64'];
|
|
|
24
27
|
exports.callFromParentTypes = ['address', 'uint256', 'bytes'];
|
|
25
28
|
exports.aclMulticallTypes = ['bytes[]'];
|
|
26
29
|
exports.approveTypes = ['address', 'uint256'];
|
|
30
|
+
exports.wrapTypes = ['address', 'uint256'];
|
|
31
|
+
/** Max value for Solidity `uint64` / ERC-7984 confidential amount domain (`euint64`). */
|
|
32
|
+
exports.UINT64_MAX = 18446744073709551615n;
|
|
27
33
|
/**
|
|
28
34
|
* Function selector for ACL.delegateForUserDecryption(address,address,uint64)
|
|
29
35
|
* = keccak256('delegateForUserDecryption(address,address,uint64)')[0:4]
|
|
@@ -46,9 +52,45 @@ exports.callFromParentMethodId = (0, ethereumjs_util_1.addHexPrefix)(ethereumjs_
|
|
|
46
52
|
* Used for exact-amount (and approve(0) reset) approvals of the ERC-7984 wrapper as spender.
|
|
47
53
|
*/
|
|
48
54
|
exports.approveMethodId = (0, ethereumjs_util_1.addHexPrefix)(ethereumjs_abi_1.default.methodID('approve', [...exports.approveTypes]).toString('hex'));
|
|
55
|
+
/**
|
|
56
|
+
* Function selector for ERC-7984 wrap(address,uint256)
|
|
57
|
+
* = keccak256('wrap(address,uint256)')[0:4]
|
|
58
|
+
* Locks underlying ERC-20 in the wrapper and mints an encrypted balance to `to`.
|
|
59
|
+
*/
|
|
60
|
+
exports.wrapMethodId = (0, ethereumjs_util_1.addHexPrefix)(ethereumjs_abi_1.default.methodID('wrap', [...exports.wrapTypes]).toString('hex'));
|
|
49
61
|
// ---------------------------------------------------------------------------
|
|
50
62
|
// Encoding functions
|
|
51
63
|
// ---------------------------------------------------------------------------
|
|
64
|
+
/**
|
|
65
|
+
* Asserts that `amount * rate` fits in uint64 (ERC-7984 confidential mint domain).
|
|
66
|
+
*
|
|
67
|
+
* @throws {Error} if amount or rate is invalid, or the product exceeds uint64
|
|
68
|
+
*/
|
|
69
|
+
function assertAmountTimesRateFitsUint64(amount, rate) {
|
|
70
|
+
let amountBn;
|
|
71
|
+
let rateBn;
|
|
72
|
+
try {
|
|
73
|
+
amountBn = typeof amount === 'bigint' ? amount : BigInt(amount);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
throw new Error(`assertAmountTimesRateFitsUint64: invalid amount '${amount}'`);
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
rateBn = typeof rate === 'bigint' ? rate : BigInt(rate);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
throw new Error(`assertAmountTimesRateFitsUint64: invalid rate '${rate}'`);
|
|
83
|
+
}
|
|
84
|
+
if (amountBn <= 0n) {
|
|
85
|
+
throw new Error('assertAmountTimesRateFitsUint64: amount must be > 0');
|
|
86
|
+
}
|
|
87
|
+
if (rateBn <= 0n) {
|
|
88
|
+
throw new Error('assertAmountTimesRateFitsUint64: rate must be > 0');
|
|
89
|
+
}
|
|
90
|
+
if (amountBn * rateBn > exports.UINT64_MAX) {
|
|
91
|
+
throw new Error('assertAmountTimesRateFitsUint64: amount × rate exceeds uint64');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
52
94
|
/**
|
|
53
95
|
* Encodes ERC-20 `approve(spender, amount)` calldata for ERC-7984 shield.
|
|
54
96
|
*
|
|
@@ -86,6 +128,64 @@ function buildApproveCalldata(wrapperAddress, amount) {
|
|
|
86
128
|
const args = ethereumjs_abi_1.default.rawEncode([...exports.approveTypes], [checksummedWrapper, amountBn.toString()]);
|
|
87
129
|
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
|
|
88
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Encodes ERC-7984 `wrap(to, amount)` calldata for the shield path.
|
|
133
|
+
*
|
|
134
|
+
* Calldata is sent to the confidential wrapper contract. `to` is the recipient of
|
|
135
|
+
* the minted encrypted balance (self-directed shields use the wallet base address).
|
|
136
|
+
* When `rate` is provided, validates that `amount × rate` fits uint64 (`euint64`).
|
|
137
|
+
* `rate` is not encoded in calldata (deserialize round-trips omit it).
|
|
138
|
+
*
|
|
139
|
+
* Does not set gasLimit — WP owns gas.
|
|
140
|
+
*
|
|
141
|
+
* @param to Recipient of confidential tokens (checksummed / lowercased accepted)
|
|
142
|
+
* @param amount Underlying ERC-20 amount to wrap (base units); must be > 0
|
|
143
|
+
* @param rate Optional on-chain wrapper `rate()` for uint64 validation
|
|
144
|
+
* @returns ABI-encoded calldata hex string (0x-prefixed)
|
|
145
|
+
* @throws {Error} if address/amount/rate is invalid or amount × rate exceeds uint64
|
|
146
|
+
*/
|
|
147
|
+
function buildWrapCalldata(to, amount, rate) {
|
|
148
|
+
let checksummedTo;
|
|
149
|
+
try {
|
|
150
|
+
checksummedTo = ethers_1.ethers.utils.getAddress(to);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
throw new Error(`buildWrapCalldata: invalid to address '${to}'`);
|
|
154
|
+
}
|
|
155
|
+
let amountBn;
|
|
156
|
+
try {
|
|
157
|
+
amountBn = typeof amount === 'bigint' ? amount : BigInt(amount);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
throw new Error(`buildWrapCalldata: invalid amount '${amount}'`);
|
|
161
|
+
}
|
|
162
|
+
if (amountBn <= 0n) {
|
|
163
|
+
throw new Error('buildWrapCalldata: amount must be > 0');
|
|
164
|
+
}
|
|
165
|
+
if (rate !== undefined) {
|
|
166
|
+
assertAmountTimesRateFitsUint64(amountBn, rate);
|
|
167
|
+
}
|
|
168
|
+
const method = ethereumjs_abi_1.default.methodID('wrap', [...exports.wrapTypes]);
|
|
169
|
+
const args = ethereumjs_abi_1.default.rawEncode([...exports.wrapTypes], [checksummedTo, amountBn.toString()]);
|
|
170
|
+
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Decodes ERC-7984 `wrap(to, amount)` calldata.
|
|
174
|
+
*
|
|
175
|
+
* @param data ABI-encoded wrap calldata (0x-prefixed)
|
|
176
|
+
* @returns `{ to, amount }` with checksummed `to` and decimal-string `amount`
|
|
177
|
+
*/
|
|
178
|
+
function decodeWrapCalldata(data) {
|
|
179
|
+
if (!data.toLowerCase().startsWith(exports.wrapMethodId.toLowerCase())) {
|
|
180
|
+
throw new Error(`decodeWrapCalldata: expected wrap selector ${exports.wrapMethodId}, got ${data.slice(0, 10)}`);
|
|
181
|
+
}
|
|
182
|
+
const abiCoder = new ethers_1.ethers.utils.AbiCoder();
|
|
183
|
+
const decoded = abiCoder.decode([...exports.wrapTypes], '0x' + data.slice(10));
|
|
184
|
+
return {
|
|
185
|
+
to: ethers_1.ethers.utils.getAddress(decoded[0]),
|
|
186
|
+
amount: decoded[1].toString(),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
89
189
|
/**
|
|
90
190
|
* Encodes a single ACL.delegateForUserDecryption() call.
|
|
91
191
|
*
|
|
@@ -262,4 +362,4 @@ function decodeFlushERC7984ForwarderTokenCalldata(data) {
|
|
|
262
362
|
encryptedHandle,
|
|
263
363
|
};
|
|
264
364
|
}
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemFtYVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi96YW1hVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBa0VBLG9EQXFCQztBQWFELDBEQVdDO0FBZUQsNEVBNkJDO0FBZ0JELG9EQVdDO0FBYUQsZ0dBeUNDO0FBV0QsOEZBS0M7QUFZRCwwRkFPQztBQVVELDRGQWtDQztBQTNURCxxREFBc0U7QUFDdEUsb0VBQXlDO0FBQ3pDLG1DQUFnQztBQUNoQyw2Q0FBcUc7QUFFckcsOEVBQThFO0FBQzlFLFlBQVk7QUFDWiw4RUFBOEU7QUFFOUUsNEJBQTRCO0FBQ2YsUUFBQSw4QkFBOEIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFDM0UsUUFBQSxtQkFBbUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFDL0QsUUFBQSxpQkFBaUIsR0FBRyxDQUFDLFNBQVMsQ0FBVSxDQUFDO0FBQ3pDLFFBQUEsWUFBWSxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBVSxDQUFDO0FBRTVEOzs7R0FHRztBQUNVLFFBQUEsaUNBQWlDLEdBQUcsSUFBQSw4QkFBWSxFQUMzRCx3QkFBVyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDLEdBQUcsc0NBQThCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDdkcsQ0FBQztBQUVGOzs7O0dBSUc7QUFDVSxRQUFBLG9CQUFvQixHQUFHLElBQUEsOEJBQVksRUFDOUMsd0JBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyx5QkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUMxRSxDQUFDO0FBRUY7OztHQUdHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyxJQUFBLDhCQUFZLEVBQ2hELHdCQUFXLENBQUMsUUFBUSxD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Q0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0MsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsMkJBQW1CLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sb0JBQW9CLEdBQVcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sYUFBYSxHQUFXLGVBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXBFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGdEQUFtQyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLElBQUksS0FBSyxDQUNiLGtHQUFrRyxhQUFhLENBQUMsS0FBSyxDQUNuSCxDQUFDLEVBQ0QsRUFBRSxDQUNILEVBQUUsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLDZDQUFnQyxDQUFDLEVBQUUsSUFBSSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RyxNQUFNLGFBQWEsR0FBVyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsTUFBTSxlQUFlLEdBQVcsSUFBQSw2QkFBVyxFQUFDLElBQUEsMEJBQVEsRUFBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXZFLE9BQU87UUFDTCxvQkFBb0I7UUFDcEIsYUFBYTtRQUNiLGVBQWU7S0FDaEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZGRIZXhQcmVmaXgsIGJ1ZmZlclRvSGV4LCB0b0J1ZmZlciB9IGZyb20gJ2V0aGVyZXVtanMtdXRpbCc7XG5pbXBvcnQgRXRoZXJldW1BYmkgZnJvbSAnZXRoZXJldW1qcy1hYmknO1xuaW1wb3J0IHsgZXRoZXJzIH0gZnJvbSAnZXRoZXJzJztcbmltcG9ydCB7IGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZk1ldGhvZElkLCBjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2ZUeXBlcyB9IGZyb20gJy4vd2FsbGV0VXRpbCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gQUJJIHBhcmFtZXRlciB0eXBlIGFycmF5c1xuZXhwb3J0IGNvbnN0IGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlcyA9IFsnYWRkcmVzcycsICdhZGRyZXNzJywgJ3VpbnQ2NCddIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IGNhbGxGcm9tUGFyZW50VHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NicsICdieXRlcyddIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IGFjbE11bHRpY2FsbFR5cGVzID0gWydieXRlc1tdJ10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgYXBwcm92ZVR5cGVzID0gWydhZGRyZXNzJywgJ3VpbnQyNTYnXSBhcyBjb25zdDtcblxuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NClcbiAqID0ga2VjY2FrMjU2KCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpJylbMDo0XVxuICovXG5leHBvcnQgY29uc3QgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbk1ldGhvZElkID0gYWRkSGV4UHJlZml4KFxuICBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEFDTC5tdWx0aWNhbGwoYnl0ZXNbXSlcbiAqID0ga2VjY2FrMjU2KCdtdWx0aWNhbGwoYnl0ZXNbXSknKVswOjRdXG4gKiBBQ0wgaW5oZXJpdHMgT3BlblplcHBlbGluIE11bHRpY2FsbFVwZ3JhZGVhYmxlIOKAlCBwcmVzZXJ2ZXMgbXNnLnNlbmRlciB2aWEgZGVsZWdhdGVjYWxsLlxuICovXG5leHBvcnQgY29uc3QgYWNsTXVsdGljYWxsTWV0aG9kSWQgPSBhZGRIZXhQcmVmaXgoXG4gIEV0aGVyZXVtQWJpLm1ldGhvZElEKCdtdWx0aWNhbGwnLCBbLi4uYWNsTXVsdGljYWxsVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KGFkZHJlc3MsdWludDI1NixieXRlcylcbiAqID0ga2VjY2FrMjU2KCdjYWxsRnJvbVBhcmVudChhZGRyZXNzLHVpbnQyNTYsYnl0ZXMpJylbMDo0XVxuICovXG5leHBvcnQgY29uc3QgY2FsbEZyb21QYXJlbnRNZXRob2RJZCA9IGFkZEhleFByZWZpeChcbiAgRXRoZXJldW1BYmkubWV0aG9kSUQoJ2NhbGxGcm9tUGFyZW50JywgWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEVSQy0yMCBhcHByb3ZlKGFkZHJlc3MsdWludDI1NilcbiAqID0ga2VjY2FrMjU2KCdhcHByb3ZlKGFkZHJlc3MsdWludDI1NiknKVswOjRdXG4gKiBVc2VkIGZvciBleGFjdC1hbW91bnQgKGFuZCBhcHByb3ZlKDApIHJlc2V0KSBhcHByb3ZhbHMgb2YgdGhlIEVSQy03OTg0IHdyYXBwZXIgYXMgc3BlbmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcHJvdmVNZXRob2RJZCA9IGFkZEhleFByZWZpeChFdGhlcmV1bUFiaS5tZXRob2RJRCgnYXBwcm92ZScsIFsuLi5hcHByb3ZlVHlwZXNdKS50b1N0cmluZygnaGV4JykpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVuY29kaW5nIGZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRW5jb2RlcyBFUkMtMjAgYGFwcHJvdmUoc3BlbmRlciwgYW1vdW50KWAgY2FsbGRhdGEgZm9yIEVSQy03OTg0IHNoaWVsZC5cbiAqXG4gKiBUaGUgc3BlbmRlciBpcyB0aGUgY29uZmlkZW50aWFsIHdyYXBwZXIgY29udHJhY3Q7IHRoZSByZXN1bHRpbmcgY2FsbGRhdGEgaXNcbiAqIHNlbnQgdG8gdGhlIHVuZGVybHlpbmcgRVJDLTIwLiBFeGFjdC1hbW91bnQgYXBwcm92ZSBpcyB1c2VkIGZvciB0aGUgc2hpZWxkXG4gKiBwYXRoOyBgYW1vdW50ID0gMGAgaXMgdGhlIFVTRFQtc3R5bGUgYWxsb3dhbmNlIHJlc2V0IHVzZWQgd2hlblxuICogYHJlcXVpcmVzQXBwcm92YWxSZXNldGAgaXMgc2V0IG9uIHRoZSB3cmFwcGVyIHBhaXIuXG4gKlxuICogRG9lcyBub3Qgc2V0IGdhc0xpbWl0IOKAlCBXUCBvd25zIGdhcy5cbiAqXG4gKiBAcGFyYW0gd3JhcHBlckFkZHJlc3MgIEVSQy03OTg0IHdyYXBwZXIgY29udHJhY3QgKHNwZW5kZXIpXG4gKiBAcGFyYW0gYW1vdW50ICAgICAgICAgIEV4YWN0IGFsbG93YW5jZSB0byBzZXQgKGJhc2UgdW5pdHMpOyBgMGAgZm9yIHJlc2V0XG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd3JhcHBlciBhZGRyZXNzIGlzIGludmFsaWQgb3IgYW1vdW50IGlzIG5lZ2F0aXZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFwcHJvdmVDYWxsZGF0YSh3cmFwcGVyQWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCk6IHN0cmluZyB7XG4gIGxldCBjaGVja3N1bW1lZFdyYXBwZXI6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjaGVja3N1bW1lZFdyYXBwZXIgPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyh3cmFwcGVyQWRkcmVzcyk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRBcHByb3ZlQ2FsbGRhdGE6IGludmFsaWQgd3JhcHBlciBhZGRyZXNzICcke3dyYXBwZXJBZGRyZXNzfSdgKTtcbiAgfVxuXG4gIGxldCBhbW91bnRCbjogYmlnaW50O1xuICB0cnkge1xuICAgIGFtb3VudEJuID0gdHlwZW9mIGFtb3VudCA9PT0gJ2JpZ2ludCcgPyBhbW91bnQgOiBCaWdJbnQoYW1vdW50KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBidWlsZEFwcHJvdmVDYWxsZGF0YTogaW52YWxpZCBhbW91bnQgJyR7YW1vdW50fSdgKTtcbiAgfVxuICBpZiAoYW1vdW50Qm4gPCAwbikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRBcHByb3ZlQ2FsbGRhdGE6IGFtb3VudCBtdXN0IGJlID49IDAnKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdhcHByb3ZlJywgWy4uLmFwcHJvdmVUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFsuLi5hcHByb3ZlVHlwZXNdLCBbY2hlY2tzdW1tZWRXcmFwcGVyLCBhbW91bnRCbi50b1N0cmluZygpXSk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgc2luZ2xlIEFDTC5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKCkgY2FsbC5cbiAqXG4gKiBHcmFudHMgYGRlbGVnYXRlQWRkcmVzc2AgdGhlIHJpZ2h0IHRvIGRlY3J5cHQgRVJDLTc5ODQgdG9rZW4gYmFsYW5jZXMgb25cbiAqIGJlaGFsZiBvZiB0aGUgY2FsbGluZyBhZGRyZXNzIChtc2cuc2VuZGVyKSBmb3IgdGhlIHNwZWNpZmllZCB0b2tlbiBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0gZGVsZWdhdGVBZGRyZXNzICAgICAgIEJpdEdvIGVudGVycHJpc2Ugdmlld2luZyBrZXkgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzICBFUkMtNzk4NCB0b2tlbiBjb250cmFjdCBhZGRyZXNzXG4gKiBAcGFyYW0gZXhwaXJ5VGltZXN0YW1wICAgICAgIFVuaXggc2Vjb25kczsgcmVjb21tZW5kZWQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKS8xMDAwKSArIDM2NSo4NjQwMFxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbGVnYXRpb25DYWxsZGF0YShcbiAgZGVsZWdhdGVBZGRyZXNzOiBzdHJpbmcsXG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGV4cGlyeVRpbWVzdGFtcDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSxcbiAgICBbZGVsZWdhdGVBZGRyZXNzLCB0b2tlbkNvbnRyYWN0QWRkcmVzcywgZXhwaXJ5VGltZXN0YW1wXVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRW5jb2RlcyBOIGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24gY2FsbHMgYmF0Y2hlZCBpbnNpZGUgQUNMLm11bHRpY2FsbCgpLlxuICpcbiAqIFByb2R1Y2VzIGEgc2luZ2xlIFRYIHRoYXQgZ3JhbnRzIGRlbGVnYXRpb24gZm9yIGFsbCBzcGVjaWZpZWQgdG9rZW4gY29udHJhY3RzLlxuICogUmVxdWlyZXMgdG9rZW5Db250cmFjdEFkZHJlc3Nlcy5sZW5ndGggPj0gMS5cbiAqIE5vdGU6IERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlciBhbHdheXMgdXNlcyB0aGlzIGZ1bmN0aW9uIChldmVuIGZvciBhIHNpbmdsZSB0b2tlbilcbiAqIHRvIGtlZXAgdGhlIHRyYW5zYWN0aW9uIHNoYXBlIGNvbnNpc3RlbnQgcmVnYXJkbGVzcyBvZiB0b2tlbiBjb3VudC5cbiAqXG4gKiBAcGFyYW0gZGVsZWdhdGVBZGRyZXNzICAgICAgICAgIEJpdEdvIGVudGVycHJpc2Ugdmlld2luZyBrZXkgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzZXMgICBBcnJheSBvZiBFUkMtNzk4NCB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXNcbiAqIEBwYXJhbSBleHBpcnlUaW1lc3RhbXAgICAgICAgICAgVW5peCBzZWNvbmRzXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhKFxuICBkZWxlZ2F0ZUFkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5Db250cmFjdEFkZHJlc3Nlczogc3RyaW5nW10sXG4gIGV4cGlyeVRpbWVzdGFtcDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBpZiAodG9rZW5Db250cmFjdEFkZHJlc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhOiB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzIG11c3Qgbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICAvLyBCdWlsZCBlYWNoIGlubmVyIGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24gY2FsbCBhcyByYXcgYnl0ZXNcbiAgY29uc3QgaW5uZXJDYWxsczogQnVmZmVyW10gPSB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzLm1hcCgodG9rZW5BZGRyZXNzKSA9PiB7XG4gICAgY29uc3QgaW5uZXJNZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKTtcbiAgICBjb25zdCBpbm5lckFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoXG4gICAgICBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSxcbiAgICAgIFtkZWxlZ2F0ZUFkZHJlc3MsIHRva2VuQWRkcmVzcywgZXhwaXJ5VGltZXN0YW1wXVxuICAgICk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2lubmVyTWV0aG9kLCBpbm5lckFyZ3NdKTtcbiAgfSk7XG5cbiAgLy8gRW5jb2RlIG91dGVyIG11bHRpY2FsbChieXRlc1tdKVxuICAvLyBldGhlcmV1bWpzLWFiaSB2MC42LnggaGFzIGEgYnVnIHdoZXJlIGl0IG9taXRzIHRoZSBwZXItZWxlbWVudCBvZmZzZXQgdGFibGVcbiAgLy8gZm9yIGJ5dGVzW10sIHByb2R1Y2luZyBtYWxmb3JtZWQgY2FsbGRhdGEgdGhhdCBvbi1jaGFpbiBBQkkgZGVjb2RlcnMgcmVqZWN0LlxuICAvLyBVc2UgZXRoZXJzIEFiaUNvZGVyIHdoaWNoIGNvcnJlY3RseSBlbWl0cyB0aGUgaGVhZCBvZmZzZXQgd29yZHMuXG4gIGNvbnN0IG91dGVyTWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ211bHRpY2FsbCcsIFsuLi5hY2xNdWx0aWNhbGxUeXBlc10pO1xuICBjb25zdCBvdXRlckFyZ3MgPSBCdWZmZXIuZnJvbShcbiAgICBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCkuZW5jb2RlKFsuLi5hY2xNdWx0aWNhbGxUeXBlc10sIFtpbm5lckNhbGxzXSkuc2xpY2UoMiksXG4gICAgJ2hleCdcbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFtvdXRlck1ldGhvZCwgb3V0ZXJBcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBjYWxsZGF0YSBpbiBhIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KHRhcmdldCwgMCwgZGF0YSkgY2FsbC5cbiAqXG4gKiBVc2VkIHdoZW4gYSBmb3J3YXJkZXIgY29udHJhY3QgbXVzdCBiZSBtc2cuc2VuZGVyIGZvciBhbiBleHRlcm5hbCBjb250cmFjdFxuICogY2FsbCDigJQgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIGZvcndhcmRlciBpdHNlbGYgbmVlZHMgdG8gY2FsbFxuICogQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oKSBzbyB0aGF0IGl0cyBvd24gYmFsYW5jZSBjYW4gYmUgZGVjcnlwdGVkLlxuICpcbiAqIE9ubHkgdGhlIHBhcmVudEFkZHJlc3MgKHJvb3Qgd2FsbGV0KSBpcyBhbGxvd2VkIHRvIGNhbGwgY2FsbEZyb21QYXJlbnRcbiAqIChlbmZvcmNlZCBieSB0aGUgZm9yd2FyZGVyJ3Mgb25seVBhcmVudCBtb2RpZmllcikuXG4gKlxuICogQHBhcmFtIHRhcmdldEFkZHJlc3MgIEFkZHJlc3Mgb2YgdGhlIGNvbnRyYWN0IHRoZSBmb3J3YXJkZXIgd2lsbCBjYWxsIChlLmcuIEFDTClcbiAqIEBwYXJhbSBjYWxsZGF0YSAgICAgICBBQkktZW5jb2RlZCBpbm5lciBjYWxsZGF0YSAoZS5nLiBmcm9tIGJ1aWxkRGVsZWdhdGlvbkNhbGxkYXRhKVxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbEZyb21QYXJlbnQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwSW5DYWxsRnJvbVBhcmVudCh0YXJnZXRBZGRyZXNzOiBzdHJpbmcsIGNhbGxkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnY2FsbEZyb21QYXJlbnQnLCBbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgIFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSxcbiAgICBbXG4gICAgICB0YXJnZXRBZGRyZXNzLFxuICAgICAgMCwgLy8gdmFsdWU6IG5vIEVUSCB0cmFuc2ZlclxuICAgICAgdG9CdWZmZXIoY2FsbGRhdGEpLCAvLyBpbm5lciBjYWxsZGF0YSBhcyBieXRlc1xuICAgIF1cbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIERlY29kZXMgdG9rZW4gY29udHJhY3QgYWRkcmVzc2VzIGZyb20gZGVsZWdhdGlvbiBjYWxsZGF0YS5cbiAqXG4gKiBIYW5kbGVzIHR3byBzaGFwZXMgb2YgY2FsbGRhdGE6XG4gKiAgIC0gRGlyZWN0IEFDTC5tdWx0aWNhbGwoYnl0ZXNbXSkgKHJvb3Qgd2FsbGV0IHBhdGgpXG4gKiAgIC0gRm9yd2FyZGVyVjQuY2FsbEZyb21QYXJlbnQoYWRkcmVzcywgdWludDI1NiwgYnl0ZXMpIHdyYXBwaW5nIGEgbXVsdGljYWxsIChmb3J3YXJkZXIgcGF0aClcbiAqXG4gKiBAcGFyYW0gY2FsbGRhdGEgIEFCSS1lbmNvZGVkIGRlbGVnYXRpb24gY2FsbGRhdGEgKDB4LXByZWZpeGVkIG9yIHJhdyBoZXgpXG4gKiBAcmV0dXJucyBBcnJheSBvZiB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXMgKGxvd2VyY2FzZSkgZm91bmQgaW4gdGhlIGRlbGVnYXRpb24gY2FsbHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgY2FsbGRhdGEgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIHJlY29nbmlzZWQgbWV0aG9kIHNlbGVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEoY2FsbGRhdGE6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGF0YSA9IGNhbGxkYXRhLnN0YXJ0c1dpdGgoJzB4JykgPyBjYWxsZGF0YSA6ICcweCcgKyBjYWxsZGF0YTtcbiAgY29uc3QgbWV0aG9kSWQgPSBkYXRhLnNsaWNlKDAsIDEwKTtcbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG5cbiAgbGV0IG11bHRpY2FsbEhleDogc3RyaW5nO1xuXG4gIGlmIChtZXRob2RJZCA9PT0gY2FsbEZyb21QYXJlbnRNZXRob2RJZCkge1xuICAgIC8vIERlY29kZSBjYWxsRnJvbVBhcmVudChhZGRyZXNzLCB1aW50MjU2LCBieXRlcykg4oCUIGlubmVyIGJ5dGVzIGlzIHRoZSBmdWxsIG11bHRpY2FsbCBjYWxsZGF0YS5cbiAgICAvLyBldGhlcnMgdjUgcmV0dXJucyBgYnl0ZXNgIGFzIGEgaGV4IHN0cmluZzsgdXNlIGhleGxpZnkgdG8gbm9ybWFsaXNlIHRvIGEgMHgtcHJlZml4ZWQgaGV4IHN0cmluZ1xuICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcnVudGltZSByZXR1cm5zIGEgc3RyaW5nIG9yIGEgVWludDhBcnJheS5cbiAgICBjb25zdCBkZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgICBtdWx0aWNhbGxIZXggPSBldGhlcnMudXRpbHMuaGV4bGlmeShkZWNvZGVkWzJdKTtcbiAgfSBlbHNlIGlmIChtZXRob2RJZCA9PT0gYWNsTXVsdGljYWxsTWV0aG9kSWQpIHtcbiAgICBtdWx0aWNhbGxIZXggPSBkYXRhO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgdmFsaWQgZGVsZWdhdGlvbiBjYWxsZGF0YScpO1xuICB9XG5cbiAgaWYgKG11bHRpY2FsbEhleC5zbGljZSgwLCAxMCkgIT09IGFjbE11bHRpY2FsbE1ldGhvZElkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSB2YWxpZCBkZWxlZ2F0aW9uIGNhbGxkYXRhJyk7XG4gIH1cblxuICAvLyBEZWNvZGUgbXVsdGljYWxsKGJ5dGVzW10pIOKAlCBlYWNoIGVsZW1lbnQgaXMgYW4gaW5uZXIgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbiBjYWxsLlxuICAvLyBldGhlcnMgdjUgcmV0dXJucyBieXRlc1tdIGVsZW1lbnRzIGFzIGhleCBzdHJpbmdzOyB1c2UgaGV4bGlmeSB0byBub3JtYWxpc2UgZWFjaCBlbGVtZW50LlxuICBjb25zdCBkZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsnYnl0ZXNbXSddLCAnMHgnICsgbXVsdGljYWxsSGV4LnNsaWNlKDEwKSk7XG4gIGNvbnN0IGlubmVyQ2FsbHM6IHVua25vd25bXSA9IGRlY29kZWRbMF07XG5cbiAgY29uc3QgdG9rZW5BZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgaW5uZXJDYWxsIG9mIGlubmVyQ2FsbHMpIHtcbiAgICBjb25zdCBpbm5lckhleCA9IGV0aGVycy51dGlscy5oZXhsaWZ5KGlubmVyQ2FsbCBhcyBldGhlcnMudXRpbHMuQnl0ZXNMaWtlKS5zbGljZSgyKTsgLy8gc3RyaXAgMHhcbiAgICBjb25zdCBpbm5lck1ldGhvZElkID0gJzB4JyArIGlubmVySGV4LnNsaWNlKDAsIDgpO1xuICAgIGlmIChpbm5lck1ldGhvZElkICE9PSBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uTWV0aG9kSWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBEZWNvZGUgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbihhZGRyZXNzIGRlbGVnYXRlLCBhZGRyZXNzIHRva2VuQWRkcmVzcywgdWludDY0IGV4cGlyeSlcbiAgICBjb25zdCBpbm5lckRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10sICcweCcgKyBpbm5lckhleC5zbGljZSg4KSk7XG4gICAgdG9rZW5BZGRyZXNzZXMucHVzaCgoaW5uZXJEZWNvZGVkWzFdIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICByZXR1cm4gdG9rZW5BZGRyZXNzZXM7XG59XG5cbi8qKlxuICogRW5jb2RlcyBjb25maWRlbnRpYWxUcmFuc2ZlcihhZGRyZXNzIHRvLCBieXRlczMyIGVuY3J5cHRlZEhhbmRsZSkgY2FsbGRhdGEuXG4gKiBVc2VzIHRoZSBuby1wcm9vZiB2YXJpYW50IChzZWxlY3RvciAweDViZWJlZDdlKSDigJQgdmFsaWQgd2hlbiB0aGUgY2FsbGVyIChmb3J3YXJkZXIpXG4gKiBpcyBhbHJlYWR5IEFDTC1hbGxvd2VkIG9uIHRoZSBoYW5kbGUgZnJvbSB3aGVuIGl0IHJlY2VpdmVkIHRoZSB0b2tlbnMuXG4gKlxuICogQHBhcmFtIHRvQWRkcmVzcyAgICAgICBBZGRyZXNzIHRoYXQgd2lsbCByZWNlaXZlIHRoZSB0b2tlbnNcbiAqIEBwYXJhbSBlbmNyeXB0ZWRIYW5kbGUgYnl0ZXMzMiBlbmNyeXB0ZWQgYmFsYW5jZSBoYW5kbGUgZnJvbSBjb25maWRlbnRpYWxCYWxhbmNlT2ZcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlckJ5SGFuZGxlQ2FsbGRhdGEodG9BZGRyZXNzOiBzdHJpbmcsIGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbWV0aG9kID0gQnVmZmVyLmZyb20oY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQuc2xpY2UoMiksICdoZXgnKTtcbiAgY29uc3QgaGFuZGxlQnVmZmVyID0gdG9CdWZmZXIoZW5jcnlwdGVkSGFuZGxlKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShbLi4uY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mVHlwZXNdLCBbdG9BZGRyZXNzLCBoYW5kbGVCdWZmZXJdKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIGZ1bGwgZmx1c2ggY2FsbGRhdGEgZm9yIEVSQy03OTg0IGZvcndhcmRlciBjb25zb2xpZGF0aW9uOlxuICogICBjYWxsRnJvbVBhcmVudCh0b2tlbkNvbnRyYWN0QWRkcmVzcywgMCwgY29uZmlkZW50aWFsVHJhbnNmZXIocGFyZW50QWRkcmVzcywgZW5jcnlwdGVkSGFuZGxlKSlcbiAqIFRoZSBmb3J3YXJkZXIgZXhlY3V0ZXMgdGhlIGlubmVyIGNvbmZpZGVudGlhbFRyYW5zZmVyIHdpdGggbXNnLnNlbmRlciA9IGZvcndhcmRlci5cbiAqXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3MgIEVSQy03OTg0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3NcbiAqIEBwYXJhbSBwYXJlbnRBZGRyZXNzICAgICAgICAgUm9vdCB3YWxsZXQgYWRkcmVzcyAoZGVzdGluYXRpb24gb2YgZmx1c2hlZCB0b2tlbnMpXG4gKiBAcGFyYW0gZW5jcnlwdGVkSGFuZGxlICAgICAgIGJ5dGVzMzIgZW5jcnlwdGVkIGJhbGFuY2UgaGFuZGxlIGZyb20gY29uZmlkZW50aWFsQmFsYW5jZU9mXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YShcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgcGFyZW50QWRkcmVzczogc3RyaW5nLFxuICBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgaW5uZXJDYWxsZGF0YSA9IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJCeUhhbmRsZUNhbGxkYXRhKHBhcmVudEFkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSk7XG4gIHJldHVybiB3cmFwSW5DYWxsRnJvbVBhcmVudCh0b2tlbkNvbnRyYWN0QWRkcmVzcywgaW5uZXJDYWxsZGF0YSk7XG59XG5cbi8qKlxuICogRGVjb2RlcyBhIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuIGNhbGxkYXRhLlxuICogU3RyaXBzIHRoZSBvdXRlciBjYWxsRnJvbVBhcmVudCB3cmFwcGVyIGFuZCB0aGUgaW5uZXIgY29uZmlkZW50aWFsVHJhbnNmZXIuXG4gKiBSZXR1cm5zIHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHBhcmVudEFkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSB9LlxuICpcbiAqIEBwYXJhbSBkYXRhICBBQkktZW5jb2RlZCBmbHVzaCBjYWxsZGF0YSAoMHgtcHJlZml4ZWQpXG4gKiBAcmV0dXJucyBEZWNvZGVkIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YShkYXRhOiBzdHJpbmcpOiB7XG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHBhcmVudEFkZHJlc3M6IHN0cmluZztcbiAgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG59IHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoY2FsbEZyb21QYXJlbnRNZXRob2RJZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbiBjYWxsZGF0YTogZXhwZWN0ZWQgY2FsbEZyb21QYXJlbnQgc2VsZWN0b3IsIGdvdCAke2RhdGEuc2xpY2UoMCwgMTApfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG4gIGNvbnN0IG91dGVyRGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10sICcweCcgKyBkYXRhLnNsaWNlKDEwKSk7XG4gIGNvbnN0IHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcgPSBvdXRlckRlY29kZWRbMF07XG4gIGNvbnN0IGlubmVyQ2FsbGRhdGE6IHN0cmluZyA9IGV0aGVycy51dGlscy5oZXhsaWZ5KG91dGVyRGVjb2RlZFsyXSk7XG5cbiAgaWYgKCFpbm5lckNhbGxkYXRhLnN0YXJ0c1dpdGgoY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4gaW5uZXIgY2FsbGRhdGE6IGV4cGVjdGVkIGNvbmZpZGVudGlhbFRyYW5zZmVyIHNlbGVjdG9yLCBnb3QgJHtpbm5lckNhbGxkYXRhLnNsaWNlKFxuICAgICAgICAwLFxuICAgICAgICAxMFxuICAgICAgKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGlubmVyRGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mVHlwZXNdLCAnMHgnICsgaW5uZXJDYWxsZGF0YS5zbGljZSgxMCkpO1xuICBjb25zdCBwYXJlbnRBZGRyZXNzOiBzdHJpbmcgPSBpbm5lckRlY29kZWRbMF07XG4gIGNvbnN0IGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nID0gYnVmZmVyVG9IZXgodG9CdWZmZXIoaW5uZXJEZWNvZGVkWzFdKSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICBwYXJlbnRBZGRyZXNzLFxuICAgIGVuY3J5cHRlZEhhbmRsZSxcbiAgfTtcbn1cbiJdfQ==
|
|
365
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemFtYVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi96YW1hVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBbUVBLDBFQXlCQztBQWlCRCxvREFxQkM7QUFrQkQsOENBNkJDO0FBUUQsZ0RBVUM7QUFhRCwwREFXQztBQWVELDRFQTZCQztBQWdCRCxvREFXQztBQWFELGdHQXlDQztBQVdELDhGQUtDO0FBWUQsMEZBT0M7QUFVRCw0RkFrQ0M7QUF2YUQscURBQXNFO0FBQ3RFLG9FQUF5QztBQUN6QyxtQ0FBZ0M7QUFDaEMsNkNBQXFHO0FBRXJHLDhFQUE4RTtBQUM5RSxZQUFZO0FBQ1osOEVBQThFO0FBRTlFLDRCQUE0QjtBQUNmLFFBQUEsOEJBQThCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBQzNFLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBQy9ELFFBQUEsaUJBQWlCLEdBQUcsQ0FBQyxTQUFTLENBQVUsQ0FBQztBQUN6QyxRQUFBLFlBQVksR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQVUsQ0FBQztBQUMvQyxRQUFBLFNBQVMsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQVUsQ0FBQztBQUV6RCx5RkFBeUY7QUFDNUUsUUFBQSxVQUFVLEdBQUcscUJBQXFCLENBQUM7QUFFaEQ7OztHQUdHO0FBQ1UsUUFBQSxpQ0FBaUMsR0FBRyxJQUFBLDhCQUFZLEVBQzNELHdCQUFXLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLENBQUMsR0FBRyxzQ0FBOEIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUN2RyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNVLFFBQUEsb0JBQW9CLEdBQUcsSUFBQSw4QkFBWSxFQUM5Qyx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVB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bUIsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEYsTUFBTSxvQkFBb0IsR0FBVyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxhQUFhLEdBQVcsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZ0RBQW1DLENBQUMsRUFBRSxDQUFDO1FBQ25FLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0dBQWtHLGFBQWEsQ0FBQyxLQUFLLENBQ25ILENBQUMsRUFDRCxFQUFFLENBQ0gsRUFBRSxDQUNKLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsNkNBQWdDLENBQUMsRUFBRSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVHLE1BQU0sYUFBYSxHQUFXLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLGVBQWUsR0FBVyxJQUFBLDZCQUFXLEVBQUMsSUFBQSwwQkFBUSxFQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkUsT0FBTztRQUNMLG9CQUFvQjtRQUNwQixhQUFhO1FBQ2IsZUFBZTtLQUNoQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFkZEhleFByZWZpeCwgYnVmZmVyVG9IZXgsIHRvQnVmZmVyIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcbmltcG9ydCBFdGhlcmV1bUFiaSBmcm9tICdldGhlcmV1bWpzLWFiaSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQsIGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZlR5cGVzIH0gZnJvbSAnLi93YWxsZXRVdGlsJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBBQkkgcGFyYW1ldGVyIHR5cGUgYXJyYXlzXG5leHBvcnQgY29uc3QgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzID0gWydhZGRyZXNzJywgJ2FkZHJlc3MnLCAndWludDY0J10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgY2FsbEZyb21QYXJlbnRUeXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2JywgJ2J5dGVzJ10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgYWNsTXVsdGljYWxsVHlwZXMgPSBbJ2J5dGVzW10nXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBhcHByb3ZlVHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NiddIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHdyYXBUeXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2J10gYXMgY29uc3Q7XG5cbi8qKiBNYXggdmFsdWUgZm9yIFNvbGlkaXR5IGB1aW50NjRgIC8gRVJDLTc5ODQgY29uZmlkZW50aWFsIGFtb3VudCBkb21haW4gKGBldWludDY0YCkuICovXG5leHBvcnQgY29uc3QgVUlOVDY0X01BWCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1bjtcblxuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NClcbiAqID0ga2VjY2FrMjU2KCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpJylbMDo0XVxuICovXG5leHBvcnQgY29uc3QgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbk1ldGhvZElkID0gYWRkSGV4UHJlZml4KFxuICBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEFDTC5tdWx0aWNhbGwoYnl0ZXNbXSlcbiAqID0ga2VjY2FrMjU2KCdtdWx0aWNhbGwoYnl0ZXNbXSknKVswOjRdXG4gKiBBQ0wgaW5oZXJpdHMgT3BlblplcHBlbGluIE11bHRpY2FsbFVwZ3JhZGVhYmxlIOKAlCBwcmVzZXJ2ZXMgbXNnLnNlbmRlciB2aWEgZGVsZWdhdGVjYWxsLlxuICovXG5leHBvcnQgY29uc3QgYWNsTXVsdGljYWxsTWV0aG9kSWQgPSBhZGRIZXhQcmVmaXgoXG4gIEV0aGVyZXVtQWJpLm1ldGhvZElEKCdtdWx0aWNhbGwnLCBbLi4uYWNsTXVsdGljYWxsVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KGFkZHJlc3MsdWludDI1NixieXRlcylcbiAqID0ga2VjY2FrMjU2KCdjYWxsRnJvbVBhcmVudChhZGRyZXNzLHVpbnQyNTYsYnl0ZXMpJylbMDo0XVxuICovXG5leHBvcnQgY29uc3QgY2FsbEZyb21QYXJlbnRNZXRob2RJZCA9IGFkZEhleFByZWZpeChcbiAgRXRoZXJldW1BYmkubWV0aG9kSUQoJ2NhbGxGcm9tUGFyZW50JywgWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEVSQy0yMCBhcHByb3ZlKGFkZHJlc3MsdWludDI1NilcbiAqID0ga2VjY2FrMjU2KCdhcHByb3ZlKGFkZHJlc3MsdWludDI1NiknKVswOjRdXG4gKiBVc2VkIGZvciBleGFjdC1hbW91bnQgKGFuZCBhcHByb3ZlKDApIHJlc2V0KSBhcHByb3ZhbHMgb2YgdGhlIEVSQy03OTg0IHdyYXBwZXIgYXMgc3BlbmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcHJvdmVNZXRob2RJZCA9IGFkZEhleFByZWZpeChFdGhlcmV1bUFiaS5tZXRob2RJRCgnYXBwcm92ZScsIFsuLi5hcHByb3ZlVHlwZXNdKS50b1N0cmluZygnaGV4JykpO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBFUkMtNzk4NCB3cmFwKGFkZHJlc3MsdWludDI1NilcbiAqID0ga2VjY2FrMjU2KCd3cmFwKGFkZHJlc3MsdWludDI1NiknKVswOjRdXG4gKiBMb2NrcyB1bmRlcmx5aW5nIEVSQy0yMCBpbiB0aGUgd3JhcHBlciBhbmQgbWludHMgYW4gZW5jcnlwdGVkIGJhbGFuY2UgdG8gYHRvYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHdyYXBNZXRob2RJZCA9IGFkZEhleFByZWZpeChFdGhlcmV1bUFiaS5tZXRob2RJRCgnd3JhcCcsIFsuLi53cmFwVHlwZXNdKS50b1N0cmluZygnaGV4JykpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVuY29kaW5nIGZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBhbW91bnQgKiByYXRlYCBmaXRzIGluIHVpbnQ2NCAoRVJDLTc5ODQgY29uZmlkZW50aWFsIG1pbnQgZG9tYWluKS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW1vdW50IG9yIHJhdGUgaXMgaW52YWxpZCwgb3IgdGhlIHByb2R1Y3QgZXhjZWVkcyB1aW50NjRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFtb3VudFRpbWVzUmF0ZUZpdHNVaW50NjQoXG4gIGFtb3VudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICByYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbik6IHZvaWQge1xuICBsZXQgYW1vdW50Qm46IGJpZ2ludDtcbiAgbGV0IHJhdGVCbjogYmlnaW50O1xuICB0cnkge1xuICAgIGFtb3VudEJuID0gdHlwZW9mIGFtb3VudCA9PT0gJ2JpZ2ludCcgPyBhbW91bnQgOiBCaWdJbnQoYW1vdW50KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBhc3NlcnRBbW91bnRUaW1lc1JhdGVGaXRzVWludDY0OiBpbnZhbGlkIGFtb3VudCAnJHthbW91bnR9J2ApO1xuICB9XG4gIHRyeSB7XG4gICAgcmF0ZUJuID0gdHlwZW9mIHJhdGUgPT09ICdiaWdpbnQnID8gcmF0ZSA6IEJpZ0ludChyYXRlKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBhc3NlcnRBbW91bnRUaW1lc1JhdGVGaXRzVWludDY0OiBpbnZhbGlkIHJhdGUgJyR7cmF0ZX0nYCk7XG4gIH1cbiAgaWYgKGFtb3VudEJuIDw9IDBuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhc3NlcnRBbW91bnRUaW1lc1JhdGVGaXRzVWludDY0OiBhbW91bnQgbXVzdCBiZSA+IDAnKTtcbiAgfVxuICBpZiAocmF0ZUJuIDw9IDBuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhc3NlcnRBbW91bnRUaW1lc1JhdGVGaXRzVWludDY0OiByYXRlIG11c3QgYmUgPiAwJyk7XG4gIH1cbiAgaWYgKGFtb3VudEJuICogcmF0ZUJuID4gVUlOVDY0X01BWCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYXNzZXJ0QW1vdW50VGltZXNSYXRlRml0c1VpbnQ2NDogYW1vdW50IMOXIHJhdGUgZXhjZWVkcyB1aW50NjQnKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuY29kZXMgRVJDLTIwIGBhcHByb3ZlKHNwZW5kZXIsIGFtb3VudClgIGNhbGxkYXRhIGZvciBFUkMtNzk4NCBzaGllbGQuXG4gKlxuICogVGhlIHNwZW5kZXIgaXMgdGhlIGNvbmZpZGVudGlhbCB3cmFwcGVyIGNvbnRyYWN0OyB0aGUgcmVzdWx0aW5nIGNhbGxkYXRhIGlzXG4gKiBzZW50IHRvIHRoZSB1bmRlcmx5aW5nIEVSQy0yMC4gRXhhY3QtYW1vdW50IGFwcHJvdmUgaXMgdXNlZCBmb3IgdGhlIHNoaWVsZFxuICogcGF0aDsgYGFtb3VudCA9IDBgIGlzIHRoZSBVU0RULXN0eWxlIGFsbG93YW5jZSByZXNldCB1c2VkIHdoZW5cbiAqIGByZXF1aXJlc0FwcHJvdmFsUmVzZXRgIGlzIHNldCBvbiB0aGUgd3JhcHBlciBwYWlyLlxuICpcbiAqIERvZXMgbm90IHNldCBnYXNMaW1pdCDigJQgV1Agb3ducyBnYXMuXG4gKlxuICogQHBhcmFtIHdyYXBwZXJBZGRyZXNzICBFUkMtNzk4NCB3cmFwcGVyIGNvbnRyYWN0IChzcGVuZGVyKVxuICogQHBhcmFtIGFtb3VudCAgICAgICAgICBFeGFjdCBhbGxvd2FuY2UgdG8gc2V0IChiYXNlIHVuaXRzKTsgYDBgIGZvciByZXNldFxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHdyYXBwZXIgYWRkcmVzcyBpcyBpbnZhbGlkIG9yIGFtb3VudCBpcyBuZWdhdGl2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBcHByb3ZlQ2FsbGRhdGEod3JhcHBlckFkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcge1xuICBsZXQgY2hlY2tzdW1tZWRXcmFwcGVyOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY2hlY2tzdW1tZWRXcmFwcGVyID0gZXRoZXJzLnV0aWxzLmdldEFkZHJlc3Mod3JhcHBlckFkZHJlc3MpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkQXBwcm92ZUNhbGxkYXRhOiBpbnZhbGlkIHdyYXBwZXIgYWRkcmVzcyAnJHt3cmFwcGVyQWRkcmVzc30nYCk7XG4gIH1cblxuICBsZXQgYW1vdW50Qm46IGJpZ2ludDtcbiAgdHJ5IHtcbiAgICBhbW91bnRCbiA9IHR5cGVvZiBhbW91bnQgPT09ICdiaWdpbnQnID8gYW1vdW50IDogQmlnSW50KGFtb3VudCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRBcHByb3ZlQ2FsbGRhdGE6IGludmFsaWQgYW1vdW50ICcke2Ftb3VudH0nYCk7XG4gIH1cbiAgaWYgKGFtb3VudEJuIDwgMG4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1aWxkQXBwcm92ZUNhbGxkYXRhOiBhbW91bnQgbXVzdCBiZSA+PSAwJyk7XG4gIH1cblxuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnYXBwcm92ZScsIFsuLi5hcHByb3ZlVHlwZXNdKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShbLi4uYXBwcm92ZVR5cGVzXSwgW2NoZWNrc3VtbWVkV3JhcHBlciwgYW1vdW50Qm4udG9TdHJpbmcoKV0pO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRW5jb2RlcyBFUkMtNzk4NCBgd3JhcCh0bywgYW1vdW50KWAgY2FsbGRhdGEgZm9yIHRoZSBzaGllbGQgcGF0aC5cbiAqXG4gKiBDYWxsZGF0YSBpcyBzZW50IHRvIHRoZSBjb25maWRlbnRpYWwgd3JhcHBlciBjb250cmFjdC4gYHRvYCBpcyB0aGUgcmVjaXBpZW50IG9mXG4gKiB0aGUgbWludGVkIGVuY3J5cHRlZCBiYWxhbmNlIChzZWxmLWRpcmVjdGVkIHNoaWVsZHMgdXNlIHRoZSB3YWxsZXQgYmFzZSBhZGRyZXNzKS5cbiAqIFdoZW4gYHJhdGVgIGlzIHByb3ZpZGVkLCB2YWxpZGF0ZXMgdGhhdCBgYW1vdW50IMOXIHJhdGVgIGZpdHMgdWludDY0IChgZXVpbnQ2NGApLlxuICogYHJhdGVgIGlzIG5vdCBlbmNvZGVkIGluIGNhbGxkYXRhIChkZXNlcmlhbGl6ZSByb3VuZC10cmlwcyBvbWl0IGl0KS5cbiAqXG4gKiBEb2VzIG5vdCBzZXQgZ2FzTGltaXQg4oCUIFdQIG93bnMgZ2FzLlxuICpcbiAqIEBwYXJhbSB0byAgICAgIFJlY2lwaWVudCBvZiBjb25maWRlbnRpYWwgdG9rZW5zIChjaGVja3N1bW1lZCAvIGxvd2VyY2FzZWQgYWNjZXB0ZWQpXG4gKiBAcGFyYW0gYW1vdW50ICBVbmRlcmx5aW5nIEVSQy0yMCBhbW91bnQgdG8gd3JhcCAoYmFzZSB1bml0cyk7IG11c3QgYmUgPiAwXG4gKiBAcGFyYW0gcmF0ZSAgICBPcHRpb25hbCBvbi1jaGFpbiB3cmFwcGVyIGByYXRlKClgIGZvciB1aW50NjQgdmFsaWRhdGlvblxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYWRkcmVzcy9hbW91bnQvcmF0ZSBpcyBpbnZhbGlkIG9yIGFtb3VudCDDlyByYXRlIGV4Y2VlZHMgdWludDY0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFdyYXBDYWxsZGF0YShcbiAgdG86IHN0cmluZyxcbiAgYW1vdW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gIHJhdGU/OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbik6IHN0cmluZyB7XG4gIGxldCBjaGVja3N1bW1lZFRvOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY2hlY2tzdW1tZWRUbyA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKHRvKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBidWlsZFdyYXBDYWxsZGF0YTogaW52YWxpZCB0byBhZGRyZXNzICcke3RvfSdgKTtcbiAgfVxuXG4gIGxldCBhbW91bnRCbjogYmlnaW50O1xuICB0cnkge1xuICAgIGFtb3VudEJuID0gdHlwZW9mIGFtb3VudCA9PT0gJ2JpZ2ludCcgPyBhbW91bnQgOiBCaWdJbnQoYW1vdW50KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBidWlsZFdyYXBDYWxsZGF0YTogaW52YWxpZCBhbW91bnQgJyR7YW1vdW50fSdgKTtcbiAgfVxuICBpZiAoYW1vdW50Qm4gPD0gMG4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1aWxkV3JhcENhbGxkYXRhOiBhbW91bnQgbXVzdCBiZSA+IDAnKTtcbiAgfVxuXG4gIGlmIChyYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRBbW91bnRUaW1lc1JhdGVGaXRzVWludDY0KGFtb3VudEJuLCByYXRlKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCd3cmFwJywgWy4uLndyYXBUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFsuLi53cmFwVHlwZXNdLCBbY2hlY2tzdW1tZWRUbywgYW1vdW50Qm4udG9TdHJpbmcoKV0pO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRGVjb2RlcyBFUkMtNzk4NCBgd3JhcCh0bywgYW1vdW50KWAgY2FsbGRhdGEuXG4gKlxuICogQHBhcmFtIGRhdGEgQUJJLWVuY29kZWQgd3JhcCBjYWxsZGF0YSAoMHgtcHJlZml4ZWQpXG4gKiBAcmV0dXJucyBgeyB0bywgYW1vdW50IH1gIHdpdGggY2hlY2tzdW1tZWQgYHRvYCBhbmQgZGVjaW1hbC1zdHJpbmcgYGFtb3VudGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVdyYXBDYWxsZGF0YShkYXRhOiBzdHJpbmcpOiB7IHRvOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nIH0ge1xuICBpZiAoIWRhdGEudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHdyYXBNZXRob2RJZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZGVjb2RlV3JhcENhbGxkYXRhOiBleHBlY3RlZCB3cmFwIHNlbGVjdG9yICR7d3JhcE1ldGhvZElkfSwgZ290ICR7ZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gIH1cbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG4gIGNvbnN0IGRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLndyYXBUeXBlc10sICcweCcgKyBkYXRhLnNsaWNlKDEwKSk7XG4gIHJldHVybiB7XG4gICAgdG86IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKGRlY29kZWRbMF0pLFxuICAgIGFtb3VudDogZGVjb2RlZFsxXS50b1N0cmluZygpLFxuICB9O1xufVxuXG4vKipcbiAqIEVuY29kZXMgYSBzaW5nbGUgQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oKSBjYWxsLlxuICpcbiAqIEdyYW50cyBgZGVsZWdhdGVBZGRyZXNzYCB0aGUgcmlnaHQgdG8gZGVjcnlwdCBFUkMtNzk4NCB0b2tlbiBiYWxhbmNlcyBvblxuICogYmVoYWxmIG9mIHRoZSBjYWxsaW5nIGFkZHJlc3MgKG1zZy5zZW5kZXIpIGZvciB0aGUgc3BlY2lmaWVkIHRva2VuIGNvbnRyYWN0LlxuICpcbiAqIEBwYXJhbSBkZWxlZ2F0ZUFkZHJlc3MgICAgICAgQml0R28gZW50ZXJwcmlzZSB2aWV3aW5nIGtleSBhZGRyZXNzXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3MgIEVSQy03OTg0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3NcbiAqIEBwYXJhbSBleHBpcnlUaW1lc3RhbXAgICAgICAgVW5peCBzZWNvbmRzOyByZWNvbW1lbmRlZDogTWF0aC5mbG9vcihEYXRlLm5vdygpLzEwMDApICsgMzY1Kjg2NDAwXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGVsZWdhdGlvbkNhbGxkYXRhKFxuICBkZWxlZ2F0ZUFkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgZXhwaXJ5VGltZXN0YW1wOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uJywgWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdLFxuICAgIFtkZWxlZ2F0ZUFkZHJlc3MsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBleHBpcnlUaW1lc3RhbXBdXG4gICk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIE4gZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbiBjYWxscyBiYXRjaGVkIGluc2lkZSBBQ0wubXVsdGljYWxsKCkuXG4gKlxuICogUHJvZHVjZXMgYSBzaW5nbGUgVFggdGhhdCBncmFudHMgZGVsZWdhdGlvbiBmb3IgYWxsIHNwZWNpZmllZCB0b2tlbiBjb250cmFjdHMuXG4gKiBSZXF1aXJlcyB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzLmxlbmd0aCA+PSAxLlxuICogTm90ZTogRGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyIGFsd2F5cyB1c2VzIHRoaXMgZnVuY3Rpb24gKGV2ZW4gZm9yIGEgc2luZ2xlIHRva2VuKVxuICogdG8ga2VlcCB0aGUgdHJhbnNhY3Rpb24gc2hhcGUgY29uc2lzdGVudCByZWdhcmRsZXNzIG9mIHRva2VuIGNvdW50LlxuICpcbiAqIEBwYXJhbSBkZWxlZ2F0ZUFkZHJlc3MgICAgICAgICAgQml0R28gZW50ZXJwcmlzZSB2aWV3aW5nIGtleSBhZGRyZXNzXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3NlcyAgIEFycmF5IG9mIEVSQy03OTg0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3Nlc1xuICogQHBhcmFtIGV4cGlyeVRpbWVzdGFtcCAgICAgICAgICBVbml4IHNlY29uZHNcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGEoXG4gIGRlbGVnYXRlQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzOiBzdHJpbmdbXSxcbiAgZXhwaXJ5VGltZXN0YW1wOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIGlmICh0b2tlbkNvbnRyYWN0QWRkcmVzc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGE6IHRva2VuQ29udHJhY3RBZGRyZXNzZXMgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIGVhY2ggaW5uZXIgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbiBjYWxsIGFzIHJhdyBieXRlc1xuICBjb25zdCBpbm5lckNhbGxzOiBCdWZmZXJbXSA9IHRva2VuQ29udHJhY3RBZGRyZXNzZXMubWFwKCh0b2tlbkFkZHJlc3MpID0+IHtcbiAgICBjb25zdCBpbm5lck1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uJywgWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10pO1xuICAgIGNvbnN0IGlubmVyQXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICAgIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdLFxuICAgICAgW2RlbGVnYXRlQWRkcmVzcywgdG9rZW5BZGRyZXNzLCBleHBpcnlUaW1lc3RhbXBdXG4gICAgKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbaW5uZXJNZXRob2QsIGlubmVyQXJnc10pO1xuICB9KTtcblxuICAvLyBFbmNvZGUgb3V0ZXIgbXVsdGljYWxsKGJ5dGVzW10pXG4gIC8vIGV0aGVyZXVtanMtYWJpIHYwLjYueCBoYXMgYSBidWcgd2hlcmUgaXQgb21pdHMgdGhlIHBlci1lbGVtZW50IG9mZnNldCB0YWJsZVxuICAvLyBmb3IgYnl0ZXNbXSwgcHJvZHVjaW5nIG1hbGZvcm1lZCBjYWxsZGF0YSB0aGF0IG9uLWNoYWluIEFCSSBkZWNvZGVycyByZWplY3QuXG4gIC8vIFVzZSBldGhlcnMgQWJpQ29kZXIgd2hpY2ggY29ycmVjdGx5IGVtaXRzIHRoZSBoZWFkIG9mZnNldCB3b3Jkcy5cbiAgY29uc3Qgb3V0ZXJNZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnbXVsdGljYWxsJywgWy4uLmFjbE11bHRpY2FsbFR5cGVzXSk7XG4gIGNvbnN0IG91dGVyQXJncyA9IEJ1ZmZlci5mcm9tKFxuICAgIG5ldyBldGhlcnMudXRpbHMuQWJpQ29kZXIoKS5lbmNvZGUoWy4uLmFjbE11bHRpY2FsbFR5cGVzXSwgW2lubmVyQ2FsbHNdKS5zbGljZSgyKSxcbiAgICAnaGV4J1xuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW291dGVyTWV0aG9kLCBvdXRlckFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIFdyYXBzIGNhbGxkYXRhIGluIGEgRm9yd2FyZGVyVjQuY2FsbEZyb21QYXJlbnQodGFyZ2V0LCAwLCBkYXRhKSBjYWxsLlxuICpcbiAqIFVzZWQgd2hlbiBhIGZvcndhcmRlciBjb250cmFjdCBtdXN0IGJlIG1zZy5zZW5kZXIgZm9yIGFuIGV4dGVybmFsIGNvbnRyYWN0XG4gKiBjYWxsIOKAlCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgZm9yd2FyZGVyIGl0c2VsZiBuZWVkcyB0byBjYWxsXG4gKiBBQ0wuZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbigpIHNvIHRoYXQgaXRzIG93biBiYWxhbmNlIGNhbiBiZSBkZWNyeXB0ZWQuXG4gKlxuICogT25seSB0aGUgcGFyZW50QWRkcmVzcyAocm9vdCB3YWxsZXQpIGlzIGFsbG93ZWQgdG8gY2FsbCBjYWxsRnJvbVBhcmVudFxuICogKGVuZm9yY2VkIGJ5IHRoZSBmb3J3YXJkZXIncyBvbmx5UGFyZW50IG1vZGlmaWVyKS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0QWRkcmVzcyAgQWRkcmVzcyBvZiB0aGUgY29udHJhY3QgdGhlIGZvcndhcmRlciB3aWxsIGNhbGwgKGUuZy4gQUNMKVxuICogQHBhcmFtIGNhbGxkYXRhICAgICAgIEFCSS1lbmNvZGVkIGlubmVyIGNhbGxkYXRhIChlLmcuIGZyb20gYnVpbGREZWxlZ2F0aW9uQ2FsbGRhdGEpXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsRnJvbVBhcmVudCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJbkNhbGxGcm9tUGFyZW50KHRhcmdldEFkZHJlc3M6IHN0cmluZywgY2FsbGRhdGE6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdjYWxsRnJvbVBhcmVudCcsIFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoXG4gICAgWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdLFxuICAgIFtcbiAgICAgIHRhcmdldEFkZHJlc3MsXG4gICAgICAwLCAvLyB2YWx1ZTogbm8gRVRIIHRyYW5zZmVyXG4gICAgICB0b0J1ZmZlcihjYWxsZGF0YSksIC8vIGlubmVyIGNhbGxkYXRhIGFzIGJ5dGVzXG4gICAgXVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRGVjb2RlcyB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXMgZnJvbSBkZWxlZ2F0aW9uIGNhbGxkYXRhLlxuICpcbiAqIEhhbmRsZXMgdHdvIHNoYXBlcyBvZiBjYWxsZGF0YTpcbiAqICAgLSBEaXJlY3QgQUNMLm11bHRpY2FsbChieXRlc1tdKSAocm9vdCB3YWxsZXQgcGF0aClcbiAqICAgLSBGb3J3YXJkZXJWNC5jYWxsRnJvbVBhcmVudChhZGRyZXNzLCB1aW50MjU2LCBieXRlcykgd3JhcHBpbmcgYSBtdWx0aWNhbGwgKGZvcndhcmRlciBwYXRoKVxuICpcbiAqIEBwYXJhbSBjYWxsZGF0YSAgQUJJLWVuY29kZWQgZGVsZWdhdGlvbiBjYWxsZGF0YSAoMHgtcHJlZml4ZWQgb3IgcmF3IGhleClcbiAqIEByZXR1cm5zIEFycmF5IG9mIHRva2VuIGNvbnRyYWN0IGFkZHJlc3NlcyAobG93ZXJjYXNlKSBmb3VuZCBpbiB0aGUgZGVsZWdhdGlvbiBjYWxsc1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBjYWxsZGF0YSBkb2VzIG5vdCBzdGFydCB3aXRoIGEgcmVjb2duaXNlZCBtZXRob2Qgc2VsZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRva2VuQWRkcmVzc2VzRnJvbURlbGVnYXRpb25DYWxsZGF0YShjYWxsZGF0YTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBkYXRhID0gY2FsbGRhdGEuc3RhcnRzV2l0aCgnMHgnKSA/IGNhbGxkYXRhIDogJzB4JyArIGNhbGxkYXRhO1xuICBjb25zdCBtZXRob2RJZCA9IGRhdGEuc2xpY2UoMCwgMTApO1xuICBjb25zdCBhYmlDb2RlciA9IG5ldyBldGhlcnMudXRpbHMuQWJpQ29kZXIoKTtcblxuICBsZXQgbXVsdGljYWxsSGV4OiBzdHJpbmc7XG5cbiAgaWYgKG1ldGhvZElkID09PSBjYWxsRnJvbVBhcmVudE1ldGhvZElkKSB7XG4gICAgLy8gRGVjb2RlIGNhbGxGcm9tUGFyZW50KGFkZHJlc3MsIHVpbnQyNTYsIGJ5dGVzKSDigJQgaW5uZXIgYnl0ZXMgaXMgdGhlIGZ1bGwgbXVsdGljYWxsIGNhbGxkYXRhLlxuICAgIC8vIGV0aGVycyB2NSByZXR1cm5zIGBieXRlc2AgYXMgYSBoZXggc3RyaW5nOyB1c2UgaGV4bGlmeSB0byBub3JtYWxpc2UgdG8gYSAweC1wcmVmaXhlZCBoZXggc3RyaW5nXG4gICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBydW50aW1lIHJldHVybnMgYSBzdHJpbmcgb3IgYSBVaW50OEFycmF5LlxuICAgIGNvbnN0IGRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdLCAnMHgnICsgZGF0YS5zbGljZSgxMCkpO1xuICAgIG11bHRpY2FsbEhleCA9IGV0aGVycy51dGlscy5oZXhsaWZ5KGRlY29kZWRbMl0pO1xuICB9IGVsc2UgaWYgKG1ldGhvZElkID09PSBhY2xNdWx0aWNhbGxNZXRob2RJZCkge1xuICAgIG11bHRpY2FsbEhleCA9IGRhdGE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSB2YWxpZCBkZWxlZ2F0aW9uIGNhbGxkYXRhJyk7XG4gIH1cblxuICBpZiAobXVsdGljYWxsSGV4LnNsaWNlKDAsIDEwKSAhPT0gYWNsTXVsdGljYWxsTWV0aG9kSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIGRlbGVnYXRpb24gY2FsbGRhdGEnKTtcbiAgfVxuXG4gIC8vIERlY29kZSBtdWx0aWNhbGwoYnl0ZXNbXSkg4oCUIGVhY2ggZWxlbWVudCBpcyBhbiBpbm5lciBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uIGNhbGwuXG4gIC8vIGV0aGVycyB2NSByZXR1cm5zIGJ5dGVzW10gZWxlbWVudHMgYXMgaGV4IHN0cmluZ3M7IHVzZSBoZXhsaWZ5IHRvIG5vcm1hbGlzZSBlYWNoIGVsZW1lbnQuXG4gIGNvbnN0IGRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWydieXRlc1tdJ10sICcweCcgKyBtdWx0aWNhbGxIZXguc2xpY2UoMTApKTtcbiAgY29uc3QgaW5uZXJDYWxsczogdW5rbm93bltdID0gZGVjb2RlZFswXTtcblxuICBjb25zdCB0b2tlbkFkZHJlc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBpbm5lckNhbGwgb2YgaW5uZXJDYWxscykge1xuICAgIGNvbnN0IGlubmVySGV4ID0gZXRoZXJzLnV0aWxzLmhleGxpZnkoaW5uZXJDYWxsIGFzIGV0aGVycy51dGlscy5CeXRlc0xpa2UpLnNsaWNlKDIpOyAvLyBzdHJpcCAweFxuICAgIGNvbnN0IGlubmVyTWV0aG9kSWQgPSAnMHgnICsgaW5uZXJIZXguc2xpY2UoMCwgOCk7XG4gICAgaWYgKGlubmVyTWV0aG9kSWQgIT09IGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25NZXRob2RJZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIERlY29kZSBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKGFkZHJlc3MgZGVsZWdhdGUsIGFkZHJlc3MgdG9rZW5BZGRyZXNzLCB1aW50NjQgZXhwaXJ5KVxuICAgIGNvbnN0IGlubmVyRGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSwgJzB4JyArIGlubmVySGV4LnNsaWNlKDgpKTtcbiAgICB0b2tlbkFkZHJlc3Nlcy5wdXNoKChpbm5lckRlY29kZWRbMV0gYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbkFkZHJlc3Nlcztcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGNvbmZpZGVudGlhbFRyYW5zZmVyKGFkZHJlc3MgdG8sIGJ5dGVzMzIgZW5jcnlwdGVkSGFuZGxlKSBjYWxsZGF0YS5cbiAqIFVzZXMgdGhlIG5vLXByb29mIHZhcmlhbnQgKHNlbGVjdG9yIDB4NWJlYmVkN2UpIOKAlCB2YWxpZCB3aGVuIHRoZSBjYWxsZXIgKGZvcndhcmRlcilcbiAqIGlzIGFscmVhZHkgQUNMLWFsbG93ZWQgb24gdGhlIGhhbmRsZSBmcm9tIHdoZW4gaXQgcmVjZWl2ZWQgdGhlIHRva2Vucy5cbiAqXG4gKiBAcGFyYW0gdG9BZGRyZXNzICAgICAgIEFkZHJlc3MgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIHRva2Vuc1xuICogQHBhcmFtIGVuY3J5cHRlZEhhbmRsZSBieXRlczMyIGVuY3J5cHRlZCBiYWxhbmNlIGhhbmRsZSBmcm9tIGNvbmZpZGVudGlhbEJhbGFuY2VPZlxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbmZpZGVudGlhbFRyYW5zZmVyQnlIYW5kbGVDYWxsZGF0YSh0b0FkZHJlc3M6IHN0cmluZywgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSBCdWZmZXIuZnJvbShjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2ZNZXRob2RJZC5zbGljZSgyKSwgJ2hleCcpO1xuICBjb25zdCBoYW5kbGVCdWZmZXIgPSB0b0J1ZmZlcihlbmNyeXB0ZWRIYW5kbGUpO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFsuLi5jb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2ZUeXBlc10sIFt0b0FkZHJlc3MsIGhhbmRsZUJ1ZmZlcl0pO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRW5jb2RlcyB0aGUgZnVsbCBmbHVzaCBjYWxsZGF0YSBmb3IgRVJDLTc5ODQgZm9yd2FyZGVyIGNvbnNvbGlkYXRpb246XG4gKiAgIGNhbGxGcm9tUGFyZW50KHRva2VuQ29udHJhY3RBZGRyZXNzLCAwLCBjb25maWRlbnRpYWxUcmFuc2ZlcihwYXJlbnRBZGRyZXNzLCBlbmNyeXB0ZWRIYW5kbGUpKVxuICogVGhlIGZvcndhcmRlciBleGVjdXRlcyB0aGUgaW5uZXIgY29uZmlkZW50aWFsVHJhbnNmZXIgd2l0aCBtc2cuc2VuZGVyID0gZm9yd2FyZGVyLlxuICpcbiAqIEBwYXJhbSB0b2tlbkNvbnRyYWN0QWRkcmVzcyAgRVJDLTc5ODQgdG9rZW4gY29udHJhY3QgYWRkcmVzc1xuICogQHBhcmFtIHBhcmVudEFkZHJlc3MgICAgICAgICBSb290IHdhbGxldCBhZGRyZXNzIChkZXN0aW5hdGlvbiBvZiBmbHVzaGVkIHRva2VucylcbiAqIEBwYXJhbSBlbmNyeXB0ZWRIYW5kbGUgICAgICAgYnl0ZXMzMiBlbmNyeXB0ZWQgYmFsYW5jZSBoYW5kbGUgZnJvbSBjb25maWRlbnRpYWxCYWxhbmNlT2ZcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbkNhbGxkYXRhKFxuICB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBwYXJlbnRBZGRyZXNzOiBzdHJpbmcsXG4gIGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBpbm5lckNhbGxkYXRhID0gYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlckJ5SGFuZGxlQ2FsbGRhdGEocGFyZW50QWRkcmVzcywgZW5jcnlwdGVkSGFuZGxlKTtcbiAgcmV0dXJuIHdyYXBJbkNhbGxGcm9tUGFyZW50KHRva2VuQ29udHJhY3RBZGRyZXNzLCBpbm5lckNhbGxkYXRhKTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIGEgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4gY2FsbGRhdGEuXG4gKiBTdHJpcHMgdGhlIG91dGVyIGNhbGxGcm9tUGFyZW50IHdyYXBwZXIgYW5kIHRoZSBpbm5lciBjb25maWRlbnRpYWxUcmFuc2Zlci5cbiAqIFJldHVybnMgeyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgcGFyZW50QWRkcmVzcywgZW5jcnlwdGVkSGFuZGxlIH0uXG4gKlxuICogQHBhcmFtIGRhdGEgIEFCSS1lbmNvZGVkIGZsdXNoIGNhbGxkYXRhICgweC1wcmVmaXhlZClcbiAqIEByZXR1cm5zIERlY29kZWQgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbkNhbGxkYXRhKGRhdGE6IHN0cmluZyk6IHtcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZztcbiAgcGFyZW50QWRkcmVzczogc3RyaW5nO1xuICBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZztcbn0ge1xuICBpZiAoIWRhdGEuc3RhcnRzV2l0aChjYWxsRnJvbVBhcmVudE1ldGhvZElkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuIGNhbGxkYXRhOiBleHBlY3RlZCBjYWxsRnJvbVBhcmVudCBzZWxlY3RvciwgZ290ICR7ZGF0YS5zbGljZSgwLCAxMCl9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBhYmlDb2RlciA9IG5ldyBldGhlcnMudXRpbHMuQWJpQ29kZXIoKTtcbiAgY29uc3Qgb3V0ZXJEZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgY29uc3QgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZyA9IG91dGVyRGVjb2RlZFswXTtcbiAgY29uc3QgaW5uZXJDYWxsZGF0YTogc3RyaW5nID0gZXRoZXJzLnV0aWxzLmhleGxpZnkob3V0ZXJEZWNvZGVkWzJdKTtcblxuICBpZiAoIWlubmVyQ2FsbGRhdGEuc3RhcnRzV2l0aChjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2ZNZXRob2RJZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbiBpbm5lciBjYWxsZGF0YTogZXhwZWN0ZWQgY29uZmlkZW50aWFsVHJhbnNmZXIgc2VsZWN0b3IsIGdvdCAke2lubmVyQ2FsbGRhdGEuc2xpY2UoXG4gICAgICAgIDAsXG4gICAgICAgIDEwXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5uZXJEZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsuLi5jb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2ZUeXBlc10sICcweCcgKyBpbm5lckNhbGxkYXRhLnNsaWNlKDEwKSk7XG4gIGNvbnN0IHBhcmVudEFkZHJlc3M6IHN0cmluZyA9IGlubmVyRGVjb2RlZFswXTtcbiAgY29uc3QgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmcgPSBidWZmZXJUb0hleCh0b0J1ZmZlcihpbm5lckRlY29kZWRbMV0pKTtcblxuICByZXR1cm4ge1xuICAgIHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgIHBhcmVudEFkZHJlc3MsXG4gICAgZW5jcnlwdGVkSGFuZGxlLFxuICB9O1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
|
|
@@ -20,4 +20,5 @@ __exportStar(require("./walletInitialization"), exports);
|
|
|
20
20
|
__exportStar(require("./flushNft"), exports);
|
|
21
21
|
__exportStar(require("./decryptionDelegation"), exports);
|
|
22
22
|
__exportStar(require("./flushERC7984"), exports);
|
|
23
|
-
|
|
23
|
+
__exportStar(require("./wrapERC7984"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwREFBd0M7QUFDeEMseUNBQXVCO0FBQ3ZCLHlEQUF1QztBQUN2Qyw2Q0FBMkI7QUFDM0IseURBQXVDO0FBQ3ZDLGlEQUErQjtBQUMvQixnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FkZHJlc3NJbml0aWFsaXphdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3NlbmQnO1xuZXhwb3J0ICogZnJvbSAnLi93YWxsZXRJbml0aWFsaXphdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2ZsdXNoTmZ0JztcbmV4cG9ydCAqIGZyb20gJy4vZGVjcnlwdGlvbkRlbGVnYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9mbHVzaEVSQzc5ODQnO1xuZXhwb3J0ICogZnJvbSAnLi93cmFwRVJDNzk4NCc7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapERC7984.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/wrapERC7984.ts"],"names":[],"mappings":"AAWA,OAAO,EAAsB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAUtE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,kBAAkB,GAAG,IAAI,CAqI5G"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runWrapERC7984Tests = runWrapERC7984Tests;
|
|
7
|
+
/**
|
|
8
|
+
* TransactionBuilder tests for WrapERC7984 transaction type.
|
|
9
|
+
*
|
|
10
|
+
* Verifies:
|
|
11
|
+
* - Building a WrapERC7984 tx from scratch (legacy and EIP-1559 fees)
|
|
12
|
+
* - Signing and serialization round-trip
|
|
13
|
+
* - classifyTransaction correctly identifies wrap(address,uint256)
|
|
14
|
+
* - Error cases for missing fields / invalid amount
|
|
15
|
+
*/
|
|
16
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
17
|
+
const should_1 = __importDefault(require("should"));
|
|
18
|
+
const src_1 = require("../../../src");
|
|
19
|
+
const zamaUtils_1 = require("../../../src/lib/zamaUtils");
|
|
20
|
+
const utils_1 = require("../../../src/lib/utils");
|
|
21
|
+
const WRAPPER_ADDRESS = '0x2debbe0487ef921df4457f9e36ed05be2df1ac75'; // hteth:cusdt
|
|
22
|
+
const RECIPIENT = '0x1111111111111111111111111111111111111111';
|
|
23
|
+
const AMOUNT = '1000000';
|
|
24
|
+
const RATE = '1';
|
|
25
|
+
const TEST_PRV_KEY = 'FAC4D04AA0025ECF200D74BC9B5E4616E4B8338B69B61362AAAD49F76E68EF28';
|
|
26
|
+
function runWrapERC7984Tests(coinName, getBuilder) {
|
|
27
|
+
describe(`${coinName} transaction builder — WrapERC7984`, () => {
|
|
28
|
+
let txBuilder;
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
txBuilder = getBuilder(coinName);
|
|
31
|
+
txBuilder.fee({ fee: '1000000000', gasLimit: '200000' });
|
|
32
|
+
txBuilder.counter(1);
|
|
33
|
+
});
|
|
34
|
+
describe('classifyTransaction', () => {
|
|
35
|
+
it('should classify wrap(address,uint256) as WrapERC7984', () => {
|
|
36
|
+
const calldata = (0, zamaUtils_1.buildWrapCalldata)(RECIPIENT, AMOUNT, RATE);
|
|
37
|
+
should_1.default.equal((0, utils_1.classifyTransaction)(calldata), sdk_core_1.TransactionType.WrapERC7984);
|
|
38
|
+
});
|
|
39
|
+
it('should NOT classify approve as WrapERC7984', () => {
|
|
40
|
+
should_1.default.equal((0, utils_1.classifyTransaction)('0x095ea7b3' + '00'.repeat(64)), sdk_core_1.TransactionType.ContractCall);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('build from scratch', () => {
|
|
44
|
+
it('should build a WrapERC7984 transaction', async () => {
|
|
45
|
+
txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
|
|
46
|
+
txBuilder.contract(WRAPPER_ADDRESS);
|
|
47
|
+
txBuilder.wrapRecipient(RECIPIENT);
|
|
48
|
+
txBuilder.wrapAmount(AMOUNT);
|
|
49
|
+
txBuilder.wrapRate(RATE);
|
|
50
|
+
const tx = await txBuilder.build();
|
|
51
|
+
const json = tx.toJson();
|
|
52
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.WrapERC7984);
|
|
53
|
+
json.to.toLowerCase().should.equal(WRAPPER_ADDRESS.toLowerCase());
|
|
54
|
+
json.data.should.startWith(zamaUtils_1.wrapMethodId);
|
|
55
|
+
json.value.should.equal('0');
|
|
56
|
+
const decoded = (0, zamaUtils_1.decodeWrapCalldata)(json.data);
|
|
57
|
+
decoded.to.toLowerCase().should.equal(RECIPIENT.toLowerCase());
|
|
58
|
+
decoded.amount.should.equal(AMOUNT);
|
|
59
|
+
});
|
|
60
|
+
it('should build with EIP-1559 fee model', async () => {
|
|
61
|
+
const builder = getBuilder(coinName);
|
|
62
|
+
builder.fee({
|
|
63
|
+
fee: '30000000000',
|
|
64
|
+
eip1559: {
|
|
65
|
+
maxFeePerGas: '30000000000',
|
|
66
|
+
maxPriorityFeePerGas: '1000000000',
|
|
67
|
+
},
|
|
68
|
+
gasLimit: '200000',
|
|
69
|
+
});
|
|
70
|
+
builder.counter(1);
|
|
71
|
+
builder.type(sdk_core_1.TransactionType.WrapERC7984);
|
|
72
|
+
builder.contract(WRAPPER_ADDRESS);
|
|
73
|
+
builder.wrapRecipient(RECIPIENT);
|
|
74
|
+
builder.wrapAmount(AMOUNT);
|
|
75
|
+
builder.wrapRate(RATE);
|
|
76
|
+
const tx = await builder.build();
|
|
77
|
+
const json = tx.toJson();
|
|
78
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.WrapERC7984);
|
|
79
|
+
json._type.should.equal(src_1.ETHTransactionType.EIP1559);
|
|
80
|
+
json.data.should.startWith(zamaUtils_1.wrapMethodId);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('signing and round-trip', () => {
|
|
84
|
+
it('should produce a signed transaction with v, r, s and from fields', async () => {
|
|
85
|
+
txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
|
|
86
|
+
txBuilder.contract(WRAPPER_ADDRESS);
|
|
87
|
+
txBuilder.wrapRecipient(RECIPIENT);
|
|
88
|
+
txBuilder.wrapAmount(AMOUNT);
|
|
89
|
+
txBuilder.wrapRate(RATE);
|
|
90
|
+
txBuilder.sign({ key: TEST_PRV_KEY });
|
|
91
|
+
const tx = await txBuilder.build();
|
|
92
|
+
const json = tx.toJson();
|
|
93
|
+
should_1.default.exist(json.v);
|
|
94
|
+
should_1.default.exist(json.r);
|
|
95
|
+
should_1.default.exist(json.s);
|
|
96
|
+
should_1.default.exist(json.from);
|
|
97
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.WrapERC7984);
|
|
98
|
+
});
|
|
99
|
+
it('should serialize and deserialize to the same transaction', async () => {
|
|
100
|
+
txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
|
|
101
|
+
txBuilder.contract(WRAPPER_ADDRESS);
|
|
102
|
+
txBuilder.wrapRecipient(RECIPIENT);
|
|
103
|
+
txBuilder.wrapAmount(AMOUNT);
|
|
104
|
+
txBuilder.wrapRate(RATE);
|
|
105
|
+
const originalTx = await txBuilder.build();
|
|
106
|
+
const rawHex = originalTx.toBroadcastFormat();
|
|
107
|
+
const rebuiltBuilder = getBuilder(coinName);
|
|
108
|
+
rebuiltBuilder.from(rawHex);
|
|
109
|
+
const rebuiltTx = await rebuiltBuilder.build();
|
|
110
|
+
rebuiltTx.toBroadcastFormat().should.equal(rawHex);
|
|
111
|
+
should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.WrapERC7984);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe('validation', () => {
|
|
115
|
+
it('should reject missing wrapRecipient', async () => {
|
|
116
|
+
txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
|
|
117
|
+
txBuilder.contract(WRAPPER_ADDRESS);
|
|
118
|
+
txBuilder.wrapAmount(AMOUNT);
|
|
119
|
+
txBuilder.wrapRate(RATE);
|
|
120
|
+
await txBuilder.build().should.be.rejectedWith(/missing wrapRecipient/);
|
|
121
|
+
});
|
|
122
|
+
it('should reject missing wrapAmount', async () => {
|
|
123
|
+
txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
|
|
124
|
+
txBuilder.contract(WRAPPER_ADDRESS);
|
|
125
|
+
txBuilder.wrapRecipient(RECIPIENT);
|
|
126
|
+
txBuilder.wrapRate(RATE);
|
|
127
|
+
await txBuilder.build().should.be.rejectedWith(/missing wrapAmount/);
|
|
128
|
+
});
|
|
129
|
+
it('should reject amount 0 via buildWrapCalldata', async () => {
|
|
130
|
+
txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
|
|
131
|
+
txBuilder.contract(WRAPPER_ADDRESS);
|
|
132
|
+
txBuilder.wrapRecipient(RECIPIENT);
|
|
133
|
+
txBuilder.wrapAmount('0');
|
|
134
|
+
txBuilder.wrapRate(RATE);
|
|
135
|
+
await txBuilder.build().should.be.rejectedWith(/amount must be > 0/);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcEVSQzc5ODQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3dyYXBFUkM3OTg0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBcUJBLGtEQXFJQztBQTFKRDs7Ozs7Ozs7R0FRRztBQUNILG1EQUF1RDtBQUN2RCxvREFBNEI7QUFDNUIsc0NBQXNFO0FBQ3RFLDBEQUFpRztBQUNqRyxrREFBNkQ7QUFFN0QsTUFBTSxlQUFlLEdBQUcsNENBQTRDLENBQUMsQ0FBQyxjQUFjO0FBQ3BGLE1BQU0sU0FBUyxHQUFHLDRDQUE0QyxDQUFDO0FBQy9ELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUN6QixNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7QUFDakIsTUFBTSxZQUFZLEdBQUcsa0VBQWtFLENBQUM7QUFFeEYsU0FBZ0IsbUJBQW1CLENBQUMsUUFBZ0IsRUFBRSxVQUFnRDtJQUNwRyxRQUFRLENBQUMsR0FBRyxRQUFRLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtRQUM3RCxJQUFJLFNBQTZCLENBQUM7UUFFbEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLFNBQVMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7WUFDbkMsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtnQkFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBQSw2QkFBaUIsRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1RCxnQkFBTSxD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U0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNhY3Rpb25CdWlsZGVyIHRlc3RzIGZvciBXcmFwRVJDNzk4NCB0cmFuc2FjdGlvbiB0eXBlLlxuICpcbiAqIFZlcmlmaWVzOlxuICogICAtIEJ1aWxkaW5nIGEgV3JhcEVSQzc5ODQgdHggZnJvbSBzY3JhdGNoIChsZWdhY3kgYW5kIEVJUC0xNTU5IGZlZXMpXG4gKiAgIC0gU2lnbmluZyBhbmQgc2VyaWFsaXphdGlvbiByb3VuZC10cmlwXG4gKiAgIC0gY2xhc3NpZnlUcmFuc2FjdGlvbiBjb3JyZWN0bHkgaWRlbnRpZmllcyB3cmFwKGFkZHJlc3MsdWludDI1NilcbiAqICAgLSBFcnJvciBjYXNlcyBmb3IgbWlzc2luZyBmaWVsZHMgLyBpbnZhbGlkIGFtb3VudFxuICovXG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBFVEhUcmFuc2FjdGlvblR5cGUsIFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBidWlsZFdyYXBDYWxsZGF0YSwgZGVjb2RlV3JhcENhbGxkYXRhLCB3cmFwTWV0aG9kSWQgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3phbWFVdGlscyc7XG5pbXBvcnQgeyBjbGFzc2lmeVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5cbmNvbnN0IFdSQVBQRVJfQUREUkVTUyA9ICcweDJkZWJiZTA0ODdlZjkyMWRmNDQ1N2Y5ZTM2ZWQwNWJlMmRmMWFjNzUnOyAvLyBodGV0aDpjdXNkdFxuY29uc3QgUkVDSVBJRU5UID0gJzB4MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSc7XG5jb25zdCBBTU9VTlQgPSAnMTAwMDAwMCc7XG5jb25zdCBSQVRFID0gJzEnO1xuY29uc3QgVEVTVF9QUlZfS0VZID0gJ0ZBQzREMDRBQTAwMjVFQ0YyMDBENzRCQzlCNUU0NjE2RTRCODMzOEI2OUI2MTM2MkFBQUQ0OUY3NkU2OEVGMjgnO1xuXG5leHBvcnQgZnVuY3Rpb24gcnVuV3JhcEVSQzc5ODRUZXN0cyhjb2luTmFtZTogc3RyaW5nLCBnZXRCdWlsZGVyOiAoY29pbjogc3RyaW5nKSA9PiBUcmFuc2FjdGlvbkJ1aWxkZXIpOiB2b2lkIHtcbiAgZGVzY3JpYmUoYCR7Y29pbk5hbWV9IHRyYW5zYWN0aW9uIGJ1aWxkZXIg4oCUIFdyYXBFUkM3OTg0YCwgKCkgPT4ge1xuICAgIGxldCB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcjtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTAwMDAwMDAwMCcsIGdhc0xpbWl0OiAnMjAwMDAwJyB9KTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NsYXNzaWZ5VHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGNsYXNzaWZ5IHdyYXAoYWRkcmVzcyx1aW50MjU2KSBhcyBXcmFwRVJDNzk4NCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGRhdGEgPSBidWlsZFdyYXBDYWxsZGF0YShSRUNJUElFTlQsIEFNT1VOVCwgUkFURSk7XG4gICAgICAgIHNob3VsZC5lcXVhbChjbGFzc2lmeVRyYW5zYWN0aW9uKGNhbGxkYXRhKSwgVHJhbnNhY3Rpb25UeXBlLldyYXBFUkM3OTg0KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIE5PVCBjbGFzc2lmeSBhcHByb3ZlIGFzIFdyYXBFUkM3OTg0JywgKCkgPT4ge1xuICAgICAgICBzaG91bGQuZXF1YWwoY2xhc3NpZnlUcmFuc2FjdGlvbignMHgwOTVlYTdiMycgKyAnMDAnLnJlcGVhdCg2NCkpLCBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2J1aWxkIGZyb20gc2NyYXRjaCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBXcmFwRVJDNzk4NCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldyYXBFUkM3OTg0KTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KFdSQVBQRVJfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci53cmFwUmVjaXBpZW50KFJFQ0lQSUVOVCk7XG4gICAgICAgIHR4QnVpbGRlci53cmFwQW1vdW50KEFNT1VOVCk7XG4gICAgICAgIHR4QnVpbGRlci53cmFwUmF0ZShSQVRFKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5XcmFwRVJDNzk4NCk7XG4gICAgICAgIGpzb24udG8udG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwoV1JBUFBFUl9BRERSRVNTLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBqc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCh3cmFwTWV0aG9kSWQpO1xuICAgICAgICBqc29uLnZhbHVlLnNob3VsZC5lcXVhbCgnMCcpO1xuXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVXcmFwQ2FsbGRhdGEoanNvbi5kYXRhKTtcbiAgICAgICAgZGVjb2RlZC50by50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbChSRUNJUElFTlQudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGRlY29kZWQuYW1vdW50LnNob3VsZC5lcXVhbChBTU9VTlQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBFSVAtMTU1OSBmZWUgbW9kZWwnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBnZXRCdWlsZGVyKGNvaW5OYW1lKTtcbiAgICAgICAgYnVpbGRlci5mZWUoe1xuICAgICAgICAgIGZlZTogJzMwMDAwMDAwMDAwJyxcbiAgICAgICAgICBlaXAxNTU5OiB7XG4gICAgICAgICAgICBtYXhGZWVQZXJHYXM6ICczMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogJzEwMDAwMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2FzTGltaXQ6ICcyMDAwMDAnLFxuICAgICAgICB9KTtcbiAgICAgICAgYnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgICBidWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldyYXBFUkM3OTg0KTtcbiAgICAgICAgYnVpbGRlci5jb250cmFjdChXUkFQUEVSX0FERFJFU1MpO1xuICAgICAgICBidWlsZGVyLndyYXBSZWNpcGllbnQoUkVDSVBJRU5UKTtcbiAgICAgICAgYnVpbGRlci53cmFwQW1vdW50KEFNT1VOVCk7XG4gICAgICAgIGJ1aWxkZXIud3JhcFJhdGUoUkFURSk7XG5cbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLldyYXBFUkM3OTg0KTtcbiAgICAgICAganNvbi5fdHlwZS5zaG91bGQuZXF1YWwoRVRIVHJhbnNhY3Rpb25UeXBlLkVJUDE1NTkpO1xuICAgICAgICBqc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCh3cmFwTWV0aG9kSWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2lnbmluZyBhbmQgcm91bmQtdHJpcCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgcHJvZHVjZSBhIHNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIHYsIHIsIHMgYW5kIGZyb20gZmllbGRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV3JhcEVSQzc5ODQpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoV1JBUFBFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSZWNpcGllbnQoUkVDSVBJRU5UKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBBbW91bnQoQU1PVU5UKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSYXRlKFJBVEUpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogVEVTVF9QUlZfS0VZIH0pO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXhpc3QoanNvbi52KTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGpzb24ucik7XG4gICAgICAgIHNob3VsZC5leGlzdChqc29uLnMpO1xuICAgICAgICBzaG91bGQuZXhpc3QoanNvbi5mcm9tKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5XcmFwRVJDNzk4NCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIHRvIHRoZSBzYW1lIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV3JhcEVSQzc5ODQpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoV1JBUFBFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSZWNpcGllbnQoUkVDSVBJRU5UKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBBbW91bnQoQU1PVU5UKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSYXRlKFJBVEUpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3SGV4ID0gb3JpZ2luYWxUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIGNvbnN0IHJlYnVpbHRCdWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSk7XG4gICAgICAgIHJlYnVpbHRCdWlsZGVyLmZyb20ocmF3SGV4KTtcbiAgICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsdEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3SGV4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuV3JhcEVSQzc5ODQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgndmFsaWRhdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IG1pc3Npbmcgd3JhcFJlY2lwaWVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldyYXBFUkM3OTg0KTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KFdSQVBQRVJfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci53cmFwQW1vdW50KEFNT1VOVCk7XG4gICAgICAgIHR4QnVpbGRlci53cmFwUmF0ZShSQVRFKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbWlzc2luZyB3cmFwUmVjaXBpZW50Lyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgbWlzc2luZyB3cmFwQW1vdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV3JhcEVSQzc5ODQpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoV1JBUFBFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSZWNpcGllbnQoUkVDSVBJRU5UKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSYXRlKFJBVEUpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9taXNzaW5nIHdyYXBBbW91bnQvKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJlamVjdCBhbW91bnQgMCB2aWEgYnVpbGRXcmFwQ2FsbGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XcmFwRVJDNzk4NCk7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChXUkFQUEVSX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIud3JhcFJlY2lwaWVudChSRUNJUElFTlQpO1xuICAgICAgICB0eEJ1aWxkZXIud3JhcEFtb3VudCgnMCcpO1xuICAgICAgICB0eEJ1aWxkZXIud3JhcFJhdGUoUkFURSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2Ftb3VudCBtdXN0IGJlID4gMC8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
|