@bitgo-beta/sdk-coin-flrp 1.0.0-alpha.27 → 1.0.0-alpha.29
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/keyPair.d.ts +4 -4
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +9 -5
- package/dist/src/lib/utils.d.ts +26 -23
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +143 -58
- package/dist/test/resources/account.d.ts +49 -0
- package/dist/test/resources/account.d.ts.map +1 -0
- package/dist/test/resources/account.js +52 -0
- package/dist/test/unit/lib/importInCTxBuilder.js +3 -2
- package/dist/test/unit/lib/importInPTxBuilder.js +3 -2
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +158 -0
- package/dist/test/unit/lib/utils.js +122 -43
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -8
package/dist/src/lib/utils.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.Utils = exports.createFlexibleHexRegex = exports.createHexRegex = void 0;
|
|
7
|
+
const bech32_1 = require("bech32");
|
|
8
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
4
9
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
10
|
const secp256k1_1 = require("@bitgo-beta/secp256k1");
|
|
6
11
|
const crypto_1 = require("crypto");
|
|
@@ -18,9 +23,29 @@ const createFlexibleHexRegex = (requirePrefix = false) => {
|
|
|
18
23
|
exports.createFlexibleHexRegex = createFlexibleHexRegex;
|
|
19
24
|
class Utils {
|
|
20
25
|
constructor() {
|
|
21
|
-
this.
|
|
22
|
-
//
|
|
23
|
-
|
|
26
|
+
this.addressToString = (hrp, prefix, address) => {
|
|
27
|
+
// Convert the address bytes to 5-bit words for bech32 encoding
|
|
28
|
+
const words = bech32_1.bech32.toWords(address);
|
|
29
|
+
// Create the full bech32 address with format: P-{hrp}1{bech32_encoded_address}
|
|
30
|
+
return `${prefix}-${bech32_1.bech32.encode(hrp, words)}`;
|
|
31
|
+
};
|
|
32
|
+
this.parseAddress = (address) => {
|
|
33
|
+
return this.stringToAddress(address);
|
|
34
|
+
};
|
|
35
|
+
this.stringToAddress = (address, hrp) => {
|
|
36
|
+
const parts = address.trim().split('-');
|
|
37
|
+
if (parts.length < 2) {
|
|
38
|
+
throw new Error('Error - Valid address should include -');
|
|
39
|
+
}
|
|
40
|
+
const split = parts[1].lastIndexOf('1');
|
|
41
|
+
if (split < 0) {
|
|
42
|
+
throw new Error('Error - Valid address must include separator (1)');
|
|
43
|
+
}
|
|
44
|
+
const humanReadablePart = parts[1].slice(0, split);
|
|
45
|
+
if (humanReadablePart !== 'flare' && humanReadablePart !== 'costwo') {
|
|
46
|
+
throw new Error('Error - Invalid HRP');
|
|
47
|
+
}
|
|
48
|
+
return Buffer.from(bech32_1.bech32.fromWords(bech32_1.bech32.decode(parts[1]).words));
|
|
24
49
|
};
|
|
25
50
|
}
|
|
26
51
|
includeIn(walletAddresses, otxoOutputAddresses) {
|
|
@@ -45,23 +70,6 @@ class Utils {
|
|
|
45
70
|
isValidAddressRegex(address) {
|
|
46
71
|
return constants_1.ADDRESS_REGEX.test(address);
|
|
47
72
|
}
|
|
48
|
-
/**
|
|
49
|
-
* Checks if it is a valid blockId with length 66 including 0x
|
|
50
|
-
*
|
|
51
|
-
* @param {string} hash - blockId to be validated
|
|
52
|
-
* @returns {boolean} - the validation result
|
|
53
|
-
*/
|
|
54
|
-
/** @inheritdoc */
|
|
55
|
-
isValidBlockId(hash) {
|
|
56
|
-
// FlareJS equivalent - check if it's a valid CB58 hash with correct length
|
|
57
|
-
try {
|
|
58
|
-
const decoded = Buffer.from(hash); // FlareJS should provide CB58 utilities
|
|
59
|
-
return decoded.length === constants_1.DECODED_BLOCK_ID_LENGTH;
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
73
|
/**
|
|
66
74
|
* Checks if the string is a valid protocol public key or
|
|
67
75
|
* extended public key.
|
|
@@ -75,8 +83,7 @@ class Utils {
|
|
|
75
83
|
let pubBuf;
|
|
76
84
|
if (pub.length === constants_1.SHORT_PUB_KEY_LENGTH) {
|
|
77
85
|
try {
|
|
78
|
-
|
|
79
|
-
pubBuf = Buffer.from(pub, constants_1.HEX_ENCODING); // Temporary placeholder
|
|
86
|
+
pubBuf = this.cb58Decode(pub);
|
|
80
87
|
}
|
|
81
88
|
catch {
|
|
82
89
|
return false;
|
|
@@ -221,7 +228,11 @@ class Utils {
|
|
|
221
228
|
}
|
|
222
229
|
/** @inheritdoc */
|
|
223
230
|
isValidTransactionId(txId) {
|
|
224
|
-
|
|
231
|
+
return this.isValidId(txId);
|
|
232
|
+
}
|
|
233
|
+
/** @inheritdoc */
|
|
234
|
+
isValidBlockId(blockId) {
|
|
235
|
+
return this.isValidId(blockId);
|
|
225
236
|
}
|
|
226
237
|
/**
|
|
227
238
|
* FlareJS wrapper to create signature and return it for credentials
|
|
@@ -231,10 +242,38 @@ class Utils {
|
|
|
231
242
|
* @return signature
|
|
232
243
|
*/
|
|
233
244
|
createSignature(network, message, prv) {
|
|
234
|
-
//
|
|
245
|
+
// Used BitGo secp256k1 since FlareJS may not expose KeyPair in the same way
|
|
235
246
|
try {
|
|
236
|
-
|
|
237
|
-
|
|
247
|
+
// Hash the message first: secp256k1 signing requires a 32-byte hash as input.
|
|
248
|
+
// It is essential that the same hashing (sha256 of the message) is applied during signature recovery,
|
|
249
|
+
// otherwise the recovered public key or signature verification will fail.
|
|
250
|
+
const messageHash = (0, crypto_1.createHash)('sha256').update(message).digest();
|
|
251
|
+
// Sign with recovery parameter
|
|
252
|
+
const signature = secp256k1_1.ecc.sign(messageHash, prv);
|
|
253
|
+
// Get recovery parameter by trying both values
|
|
254
|
+
let recoveryParam = -1;
|
|
255
|
+
const pubKey = secp256k1_1.ecc.pointFromScalar(prv, true);
|
|
256
|
+
if (!pubKey) {
|
|
257
|
+
throw new Error('Failed to derive public key from private key');
|
|
258
|
+
}
|
|
259
|
+
const recovered0 = secp256k1_1.ecc.recoverPublicKey(messageHash, signature, 0, true);
|
|
260
|
+
if (recovered0 && Buffer.from(recovered0).equals(Buffer.from(pubKey))) {
|
|
261
|
+
recoveryParam = 0;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
const recovered1 = secp256k1_1.ecc.recoverPublicKey(messageHash, signature, 1, true);
|
|
265
|
+
if (recovered1 && Buffer.from(recovered1).equals(Buffer.from(pubKey))) {
|
|
266
|
+
recoveryParam = 1;
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
throw new Error('Could not determine correct recovery parameter for signature');
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Append recovery parameter to signature
|
|
273
|
+
const fullSig = Buffer.alloc(65); // 64 bytes signature + 1 byte recovery
|
|
274
|
+
fullSig.set(signature);
|
|
275
|
+
fullSig[64] = recoveryParam;
|
|
276
|
+
return fullSig;
|
|
238
277
|
}
|
|
239
278
|
catch (error) {
|
|
240
279
|
throw new Error(`Failed to create signature: ${error}`);
|
|
@@ -250,7 +289,14 @@ class Utils {
|
|
|
250
289
|
*/
|
|
251
290
|
verifySignature(network, message, signature, publicKey) {
|
|
252
291
|
try {
|
|
253
|
-
|
|
292
|
+
// Hash the message first - must match the hash used in signing
|
|
293
|
+
const messageHash = (0, crypto_1.createHash)('sha256').update(message).digest();
|
|
294
|
+
// Extract the actual signature without recovery parameter
|
|
295
|
+
if (signature.length !== 65) {
|
|
296
|
+
throw new Error('Invalid signature length - expected 65 bytes (64 bytes signature + 1 byte recovery)');
|
|
297
|
+
}
|
|
298
|
+
const sigOnly = signature.slice(0, 64);
|
|
299
|
+
return secp256k1_1.ecc.verify(messageHash, publicKey, sigOnly);
|
|
254
300
|
}
|
|
255
301
|
catch (error) {
|
|
256
302
|
return false;
|
|
@@ -265,9 +311,20 @@ class Utils {
|
|
|
265
311
|
*/
|
|
266
312
|
recoverySignature(network, message, signature) {
|
|
267
313
|
try {
|
|
268
|
-
//
|
|
269
|
-
|
|
270
|
-
|
|
314
|
+
// Hash the message first - must match the hash used in signing
|
|
315
|
+
const messageHash = (0, crypto_1.createHash)('sha256').update(message).digest();
|
|
316
|
+
// Extract recovery parameter and signature
|
|
317
|
+
if (signature.length !== 65) {
|
|
318
|
+
throw new Error('Invalid signature length - expected 65 bytes (64 bytes signature + 1 byte recovery)');
|
|
319
|
+
}
|
|
320
|
+
const recoveryParam = signature[64];
|
|
321
|
+
const sigOnly = signature.slice(0, 64);
|
|
322
|
+
// Recover public key using the provided recovery parameter
|
|
323
|
+
const recovered = secp256k1_1.ecc.recoverPublicKey(messageHash, sigOnly, recoveryParam, true);
|
|
324
|
+
if (!recovered) {
|
|
325
|
+
throw new Error('Failed to recover public key');
|
|
326
|
+
}
|
|
327
|
+
return Buffer.from(recovered);
|
|
271
328
|
}
|
|
272
329
|
catch (error) {
|
|
273
330
|
throw new Error(`Failed to recover signature: ${error}`);
|
|
@@ -409,33 +466,6 @@ class Utils {
|
|
|
409
466
|
outputidxBufferToNumber(outputidx) {
|
|
410
467
|
return parseInt(outputidx.toString(constants_1.HEX_ENCODING), constants_1.HEX_RADIX).toString();
|
|
411
468
|
}
|
|
412
|
-
/**
|
|
413
|
-
* CB58 decode function - simple Base58 decode implementation
|
|
414
|
-
* @param {string} data - CB58 encoded string
|
|
415
|
-
* @returns {Buffer} decoded buffer
|
|
416
|
-
*/
|
|
417
|
-
cb58Decode(data) {
|
|
418
|
-
// For now, use a simple hex decode as placeholder
|
|
419
|
-
// In a full implementation, this would be proper CB58 decoding
|
|
420
|
-
try {
|
|
421
|
-
return Buffer.from(data, constants_1.HEX_ENCODING);
|
|
422
|
-
}
|
|
423
|
-
catch {
|
|
424
|
-
// Fallback to buffer from string
|
|
425
|
-
return Buffer.from(data);
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
/**
|
|
429
|
-
* Convert address buffer to bech32 string
|
|
430
|
-
* @param {string} hrp - Human readable part
|
|
431
|
-
* @param {string} chainid - Chain identifier
|
|
432
|
-
* @param {Buffer} addressBuffer - Address buffer
|
|
433
|
-
* @returns {string} Address string
|
|
434
|
-
*/
|
|
435
|
-
addressToString(hrp, chainid, addressBuffer) {
|
|
436
|
-
// Simple implementation - in practice this would use bech32 encoding
|
|
437
|
-
return `${chainid}-${addressBuffer.toString(constants_1.HEX_ENCODING)}`;
|
|
438
|
-
}
|
|
439
469
|
/**
|
|
440
470
|
* Convert string to bytes for FlareJS memo
|
|
441
471
|
* Follows FlareJS utils.stringToBytes pattern
|
|
@@ -491,8 +521,63 @@ class Utils {
|
|
|
491
521
|
validateMemoSize(memoBytes, maxSize = 4096) {
|
|
492
522
|
return memoBytes.length <= maxSize;
|
|
493
523
|
}
|
|
524
|
+
/**
|
|
525
|
+
* Adds a checksum to a Buffer and returns the concatenated result
|
|
526
|
+
*/
|
|
527
|
+
addChecksum(buff) {
|
|
528
|
+
const hashSlice = (0, crypto_1.createHash)('sha256').update(buff).digest().slice(28);
|
|
529
|
+
return Buffer.concat([buff, hashSlice]);
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Validates a checksum on a Buffer and returns true if valid, false if not
|
|
533
|
+
*/
|
|
534
|
+
validateChecksum(buff) {
|
|
535
|
+
const hashSlice = buff.slice(buff.length - 4);
|
|
536
|
+
const calculatedHashSlice = (0, crypto_1.createHash)('sha256')
|
|
537
|
+
.update(buff.slice(0, buff.length - 4))
|
|
538
|
+
.digest()
|
|
539
|
+
.slice(28);
|
|
540
|
+
return hashSlice.toString('hex') === calculatedHashSlice.toString('hex');
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Encodes a Buffer as a base58 string with checksum
|
|
544
|
+
*/
|
|
545
|
+
cb58Encode(bytes) {
|
|
546
|
+
const withChecksum = this.addChecksum(bytes);
|
|
547
|
+
return bs58_1.default.encode(withChecksum);
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Decodes a base58 string with checksum to a Buffer
|
|
551
|
+
*/
|
|
552
|
+
cb58Decode(str) {
|
|
553
|
+
const decoded = bs58_1.default.decode(str);
|
|
554
|
+
if (!this.validateChecksum(Buffer.from(decoded))) {
|
|
555
|
+
throw new Error('Invalid checksum');
|
|
556
|
+
}
|
|
557
|
+
return Buffer.from(decoded.slice(0, decoded.length - 4));
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Checks if a string is a valid CB58 (base58 with checksum) format
|
|
561
|
+
*/
|
|
562
|
+
isCB58(str) {
|
|
563
|
+
try {
|
|
564
|
+
this.cb58Decode(str);
|
|
565
|
+
return true;
|
|
566
|
+
}
|
|
567
|
+
catch {
|
|
568
|
+
return false;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
isValidId(id) {
|
|
572
|
+
try {
|
|
573
|
+
return this.isCB58(id) && this.cb58Decode(id).length === constants_1.DECODED_BLOCK_ID_LENGTH;
|
|
574
|
+
}
|
|
575
|
+
catch {
|
|
576
|
+
return false;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
494
579
|
}
|
|
495
580
|
exports.Utils = Utils;
|
|
496
581
|
const utils = new Utils();
|
|
497
582
|
exports.default = utils;
|
|
498
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLG1EQVE4QjtBQUU5QixxREFBNEM7QUFDNUMsbUNBQW9DO0FBRXBDLDJDQWtCcUI7QUFFckIsNkNBQTZDO0FBQ3RDLE1BQU0sY0FBYyxHQUFHLENBQUMsTUFBYyxFQUFFLGFBQWEsR0FBRyxLQUFLLEVBQVUsRUFBRTtJQUM5RSxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sNEJBQWdCLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksNEJBQWdCLElBQUksTUFBTSxJQUFJLENBQUM7SUFDMUcsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFIVyxRQUFBLGNBQWMsa0JBR3pCO0FBRUssTUFBTSxzQkFBc0IsR0FBRyxDQUFDLGFBQWEsR0FBRyxLQUFLLEVBQVUsRUFBRTtJQUN0RSxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sNEJBQWdCLElBQUksQ0FBQyxDQUFDLENBQUMsaUNBQXFCLENBQUM7SUFDbkYsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFIVyxRQUFBLHNCQUFzQiwwQkFHakM7QUFFRixNQUFhLEtBQUs7SUFBbEI7UUE0RlMsaUJBQVksR0FBRyxDQUFDLEdBQVcsRUFBVSxFQUFFO1lBQzVDLHlDQUF5QztZQUN6QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLHdCQUFZLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjtRQUNyRSxDQUFDLENBQUM7SUFpYUosQ0FBQztJQS9mUSxTQUFTLENBQUMsZUFBeUIsRUFBRSxtQkFBNkI7UUFDdkUsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVB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QUFPLEdBQUcsSUFBSTtRQUNwRCxPQUFPLFNBQVMsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQWhnQkQsc0JBZ2dCQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFFMUIsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNmZXJhYmxlT3V0cHV0IH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7XG4gIEJhc2VVdGlscyxcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkWHBydixcbiAgaXNWYWxpZFhwdWIsXG4gIE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgRmxhcmVOZXR3b3JrIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBlY2MgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBEZXByZWNhdGVkT3V0cHV0LCBEZXByZWNhdGVkVHgsIE91dHB1dCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHtcbiAgREVDT0RFRF9CTE9DS19JRF9MRU5HVEgsXG4gIFNIT1JUX1BVQl9LRVlfTEVOR1RILFxuICBDT01QUkVTU0VEX1BVQkxJQ19LRVlfTEVOR1RILFxuICBVTkNPTVBSRVNTRURfUFVCTElDX0tFWV9MRU5HVEgsXG4gIFJBV19QUklWQVRFX0tFWV9MRU5HVEgsXG4gIFNVRkZJWEVEX1BSSVZBVEVfS0VZX0xFTkdUSCxcbiAgUFJJVkFURV9LRVlfQ09NUFJFU1NFRF9TVUZGSVgsXG4gIE9VVFBVVF9JTkRFWF9IRVhfTEVOR1RILFxuICBBRERSRVNTX1JFR0VYLFxuICBIRVhfUkVHRVgsXG4gIEhFWF9DSEFSX1BBVFRFUk4sXG4gIEhFWF9QQVRURVJOX05PX1BSRUZJWCxcbiAgRkxBUkVfQUREUkVTU19QTEFDRUhPTERFUixcbiAgSEVYX0VOQ09ESU5HLFxuICBQQURTVEFSVF9DSEFSLFxuICBIRVhfUkFESVgsXG4gIFNUUklOR19UWVBFLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8vIFJlZ2V4IHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoZXggdmFsaWRhdGlvblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUhleFJlZ2V4ID0gKGxlbmd0aDogbnVtYmVyLCByZXF1aXJlUHJlZml4ID0gZmFsc2UpOiBSZWdFeHAgPT4ge1xuICBjb25zdCBwYXR0ZXJuID0gcmVxdWlyZVByZWZpeCA/IGBeMHgke0hFWF9DSEFSX1BBVFRFUk59eyR7bGVuZ3RofX0kYCA6IGBeJHtIRVhfQ0hBUl9QQVRURVJOfXske2xlbmd0aH19JGA7XG4gIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUZsZXhpYmxlSGV4UmVnZXggPSAocmVxdWlyZVByZWZpeCA9IGZhbHNlKTogUmVnRXhwID0+IHtcbiAgY29uc3QgcGF0dGVybiA9IHJlcXVpcmVQcmVmaXggPyBgXjB4JHtIRVhfQ0hBUl9QQVRURVJOfSskYCA6IEhFWF9QQVRURVJOX05PX1BSRUZJWDtcbiAgcmV0dXJuIG5ldyBSZWdFeHAocGF0dGVybik7XG59O1xuXG5leHBvcnQgY2xhc3MgVXRpbHMgaW1wbGVtZW50cyBCYXNlVXRpbHMge1xuICBwdWJsaWMgaW5jbHVkZUluKHdhbGxldEFkZHJlc3Nlczogc3RyaW5nW10sIG90eG9PdXRwdXRBZGRyZXNzZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdhbGxldEFkZHJlc3Nlcy5tYXAoKGEpID0+IG90eG9PdXRwdXRBZGRyZXNzZXMuaW5jbHVkZXMoYSkpLnJlZHVjZSgoYSwgYikgPT4gYSAmJiBiLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgaXQgaXMgYSB2YWxpZCBhZGRyZXNzIG5vIGlsbGVnYWwgY2hhcmFjdGVyc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIGFkZHJlc3MgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYWRkcmVzc0Fycjogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KGFkZHJlc3MpID8gYWRkcmVzcyA6IGFkZHJlc3Muc3BsaXQoJ34nKTtcblxuICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiBhZGRyZXNzQXJyKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3NSZWdleChhZGRyZXNzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRBZGRyZXNzUmVnZXgoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFERFJFU1NfUkVHRVgudGVzdChhZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgaXQgaXMgYSB2YWxpZCBibG9ja0lkIHdpdGggbGVuZ3RoIDY2IGluY2x1ZGluZyAweFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGFzaCAtIGJsb2NrSWQgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIEZsYXJlSlMgZXF1aXZhbGVudCAtIGNoZWNrIGlmIGl0J3MgYSB2YWxpZCBDQjU4IGhhc2ggd2l0aCBjb3JyZWN0IGxlbmd0aFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oaGFzaCk7IC8vIEZsYXJlSlMgc2hvdWxkIHByb3ZpZGUgQ0I1OCB1dGlsaXRpZXNcbiAgICAgIHJldHVybiBkZWNvZGVkLmxlbmd0aCA9PT0gREVDT0RFRF9CTE9DS19JRF9MRU5HVEg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgcHJvdG9jb2wgcHVibGljIGtleSBvclxuICAgKiBleHRlbmRlZCBwdWJsaWMga2V5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHViIC0gdGhlICBwdWJsaWMga2V5IHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRQdWJsaWNLZXkocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoaXNWYWxpZFhwdWIocHViKSkgcmV0dXJuIHRydWU7XG5cbiAgICBsZXQgcHViQnVmOiBCdWZmZXI7XG4gICAgaWYgKHB1Yi5sZW5ndGggPT09IFNIT1JUX1BVQl9LRVlfTEVOR1RIKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBGb3IgRmxhcmVKUywgd2UnbGwgbmVlZCB0byBpbXBsZW1lbnQgQ0I1OCBkZWNvZGUgZnVuY3Rpb25hbGl0eVxuICAgICAgICBwdWJCdWYgPSBCdWZmZXIuZnJvbShwdWIsIEhFWF9FTkNPRElORyk7IC8vIFRlbXBvcmFyeSBwbGFjZWhvbGRlclxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHB1Yi5sZW5ndGggIT09IENPTVBSRVNTRURfUFVCTElDX0tFWV9MRU5HVEggJiYgcHViLmxlbmd0aCAhPT0gVU5DT01QUkVTU0VEX1BVQkxJQ19LRVlfTEVOR1RIKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RCeXRlID0gcHViLnNsaWNlKDAsIDIpO1xuXG4gICAgICAvLyB1bmNvbXByZXNzZWQgcHVibGljIGtleVxuICAgICAgaWYgKHB1Yi5sZW5ndGggPT09IFVOQ09NUFJFU1NFRF9QVUJMSUNfS0VZX0xFTkdUSCAmJiBmaXJzdEJ5dGUgIT09ICcwNCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb21wcmVzc2VkIHB1YmxpYyBrZXlcbiAgICAgIGlmIChwdWIubGVuZ3RoID09PSBDT01QUkVTU0VEX1BVQkxJQ19LRVlfTEVOR1RIICYmIGZpcnN0Qnl0ZSAhPT0gJzAyJyAmJiBmaXJzdEJ5dGUgIT09ICcwMycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuYWxsSGV4Q2hhcnMocHViKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcHViQnVmID0gQnVmZmVyLmZyb20ocHViLCAnaGV4Jyk7XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIHRoZSBwdWJsaWMga2V5IHVzaW5nIEJpdEdvIHNlY3AyNTZrMVxuICAgIHRyeSB7XG4gICAgICBlY2MuaXNQb2ludChwdWJCdWYpOyAvLyBDaGVjayBpZiBpdCdzIGEgdmFsaWQgcG9pbnRcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFyc2VBZGRyZXNzID0gKHB1Yjogc3RyaW5nKTogQnVmZmVyID0+IHtcbiAgICAvLyBGbGFyZUpTIGVxdWl2YWxlbnQgZm9yIGFkZHJlc3MgcGFyc2luZ1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShwdWIsIEhFWF9FTkNPRElORyk7IC8vIFNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb25cbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgcHJvdG9jb2wgcHJpdmF0ZSBrZXksIG9yIGV4dGVuZGVkXG4gICAqIHByaXZhdGUga2V5LlxuICAgKlxuICAgKiBUaGUgcHJvdG9jb2wga2V5IGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlIEBzdGFja3MvdHJhbnNhY3Rpb25zIG5wbSBwYWNrYWdlLCBpbiB0aGVcbiAgICogY3JlYXRlU3RhY2tzUHJpdmF0ZUtleSBmdW5jdGlvbjpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2Jsb2Nrc3RhY2svc3RhY2tzLmpzL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3RyYW5zYWN0aW9ucy9zcmMva2V5cy50cyNMMTI1XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgKG9yIGV4dGVuZGVkIHByaXZhdGUga2V5KSB0byBiZSB2YWxpZGF0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShwcnY6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChpc1ZhbGlkWHBydihwcnYpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChwcnYubGVuZ3RoICE9PSBSQVdfUFJJVkFURV9LRVlfTEVOR1RIICYmIHBydi5sZW5ndGggIT09IFNVRkZJWEVEX1BSSVZBVEVfS0VZX0xFTkdUSCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHBydi5sZW5ndGggPT09IFNVRkZJWEVEX1BSSVZBVEVfS0VZX0xFTkdUSCAmJlxuICAgICAgcHJ2LnNsaWNlKFJBV19QUklWQVRFX0tFWV9MRU5HVEgpICE9PSBQUklWQVRFX0tFWV9DT01QUkVTU0VEX1NVRkZJWFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFsbEhleENoYXJzKHBydik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgY29tcG9zZWQgb2YgaGV4IGNoYXJzIG9ubHlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1heWJlIC0gdGhlICBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgYWxsSGV4Q2hhcnMobWF5YmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBIRVhfUkVHRVgudGVzdChtYXliZSk7XG4gIH1cblxuICAvKipcbiAgICogTGlnaHR3ZWlnaHQgRXRoZXJldW0gYWRkcmVzcyB2YWxpZGF0aW9uXG4gICAqIFZhbGlkYXRlcyB0aGF0IGFuIGFkZHJlc3MgaXMgYSA0MC1jaGFyYWN0ZXIgaGV4IHN0cmluZyAob3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoIDB4KVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIHRoZSBFdGhlcmV1bSBhZGRyZXNzIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRydWUgaWYgdmFsaWQgRXRoZXJldW0gYWRkcmVzcyBmb3JtYXRcbiAgICovXG4gIGlzVmFsaWRFdGhlcmV1bUFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFhZGRyZXNzIHx8IHR5cGVvZiBhZGRyZXNzICE9PSBTVFJJTkdfVFlQRSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSAweCBwcmVmaXggaWYgcHJlc2VudFxuICAgIGNvbnN0IGNsZWFuQWRkcmVzcyA9IGFkZHJlc3Muc3RhcnRzV2l0aCgnMHgnKSA/IGFkZHJlc3Muc2xpY2UoMikgOiBhZGRyZXNzO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBleGFjdGx5IDQwIGhleCBjaGFyYWN0ZXJzXG4gICAgcmV0dXJuIGNsZWFuQWRkcmVzcy5sZW5ndGggPT09IDQwICYmIC9eWzAtOWEtZkEtRl17NDB9JC8udGVzdChjbGVhbkFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2sgc3BlY2lmaWMgcHJvcGVydGllcyBmcm9tIGFuIG9iamVjdCAocmVwbGFjZXMgbG9kYXNoLnBpY2spXG4gICAqXG4gICAqIEBwYXJhbSB7VH0gb2JqIC0gdGhlIHNvdXJjZSBvYmplY3RcbiAgICogQHBhcmFtIHtLW119IGtleXMgLSBhcnJheSBvZiBwcm9wZXJ0eSBrZXlzIHRvIHBpY2tcbiAgICogQHJldHVybnMge1BpY2s8VCwgSz59IC0gbmV3IG9iamVjdCB3aXRoIG9ubHkgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzXG4gICAqL1xuICBwaWNrPFQsIEsgZXh0ZW5kcyBrZXlvZiBUPihvYmo6IFQsIGtleXM6IEtbXSk6IFBpY2s8VCwgSz4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFBpY2s8VCwgSz47XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWVwIGVxdWFsaXR5IGNvbXBhcmlzb24gKHJlcGxhY2VzIGxvZGFzaC5pc0VxdWFsKVxuICAgKlxuICAgKiBAcGFyYW0ge3Vua25vd259IGEgLSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gYiAtIHNlY29uZCB2YWx1ZSB0byBjb21wYXJlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRydWUgaWYgdmFsdWVzIGFyZSBkZWVwbHkgZXF1YWxcbiAgICovXG4gIGlzRXF1YWwoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGEgPT09IGI7XG5cbiAgICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSAhPT0gQXJyYXkuaXNBcnJheShiKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICBjb25zdCBhcnJCID0gYiBhcyB1bmtub3duW107XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYXJyQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzRXF1YWwoYVtpXSwgYXJyQltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2JqQSA9IGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBvYmpCID0gYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gICAgICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICAgICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNBKSB7XG4gICAgICAgIGlmICgha2V5c0IuaW5jbHVkZXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMuaXNFcXVhbChvYmpBW2tleV0sIG9iakJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2lzVmFsaWRTaWduYXR1cmUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2lzVmFsaWRUcmFuc2FjdGlvbklkIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXJlSlMgd3JhcHBlciB0byBjcmVhdGUgc2lnbmF0dXJlIGFuZCByZXR1cm4gaXQgZm9yIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSBuZXR3b3JrXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSBwcnZcbiAgICogQHJldHVybiBzaWduYXR1cmVcbiAgICovXG4gIGNyZWF0ZVNpZ25hdHVyZShuZXR3b3JrOiBGbGFyZU5ldHdvcmssIG1lc3NhZ2U6IEJ1ZmZlciwgcHJ2OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIC8vIFVzZSBCaXRHbyBzZWNwMjU2azEgc2luY2UgRmxhcmVKUyBtYXkgbm90IGV4cG9zZSBLZXlQYWlyIGluIHRoZSBzYW1lIHdheVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBlY2Muc2lnbihtZXNzYWdlLCBwcnYpO1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBzaWduYXR1cmU6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZsYXJlSlMgd3JhcHBlciB0byB2ZXJpZnkgc2lnbmF0dXJlXG4gICAqIEBwYXJhbSBuZXR3b3JrXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSBzaWduYXR1cmVcbiAgICogQHBhcmFtIHB1YmxpY0tleSAtIHB1YmxpYyBrZXkgaW5zdGVhZCBvZiBwcml2YXRlIGtleSBmb3IgdmVyaWZpY2F0aW9uXG4gICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCdzIHZlcmlmeSBzdWNjZXNzZnVsXG4gICAqL1xuICB2ZXJpZnlTaWduYXR1cmUobmV0d29yazogRmxhcmVOZXR3b3JrLCBtZXNzYWdlOiBCdWZmZXIsIHNpZ25hdHVyZTogQnVmZmVyLCBwdWJsaWNLZXk6IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZWNjLnZlcmlmeShtZXNzYWdlLCBwdWJsaWNLZXksIHNpZ25hdHVyZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmxhcmVKUyB3cmFwcGVyIHRvIHJlY292ZXIgc2lnbmF0dXJlXG4gICAqIEBwYXJhbSBuZXR3b3JrXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSBzaWduYXR1cmVcbiAgICogQHJldHVybiByZWNvdmVyZWQgcHVibGljIGtleVxuICAgKi9cbiAgcmVjb3ZlcnlTaWduYXR1cmUobmV0d29yazogRmxhcmVOZXR3b3JrLCBtZXNzYWdlOiBCdWZmZXIsIHNpZ25hdHVyZTogQnVmZmVyKTogQnVmZmVyIHtcbiAgICB0cnkge1xuICAgICAgLy8gVGhpcyB3b3VsZCBuZWVkIHRvIGJlIGltcGxlbWVudGVkIHdpdGggc2VjcDI1NmsxIHJlY292ZXJ5XG4gICAgICAvLyBGb3Igbm93LCB0aHJvd2luZyBlcnJvciBzaW5jZSByZWNvdmVyeSBsb2dpYyB3b3VsZCBuZWVkIHRvIGJlIGFkYXB0ZWRcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdyZWNvdmVyeVNpZ25hdHVyZSBub3QgZnVsbHkgaW1wbGVtZW50ZWQgZm9yIEZsYXJlSlMnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVjb3ZlciBzaWduYXR1cmU6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgc2hhMjU2KGJ1ZjogVWludDhBcnJheSk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShidWYpLmRpZ2VzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSByYXcgdHJhbnNhY3Rpb24gaGFzIGEgdmFsaWQgZm9ybWF0IGluIHRoZSBibG9ja2NoYWluIGNvbnRleHQsIHRocm93IG90aGVyd2lzZS5cbiAgICogSXQncyB0byByZXVzZSBpbiBUcmFuc2FjdGlvbkJ1aWxkZXIgYW5kIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnlcbiAgICpcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uIFRyYW5zYWN0aW9uIGFzIGhleCBzdHJpbmdcbiAgICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUmF3IHRyYW5zYWN0aW9uIGlzIGVtcHR5Jyk7XG4gICAgfVxuICAgIGlmICghdXRpbHMuYWxsSGV4Q2hhcnMocmF3VHJhbnNhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdSYXcgdHJhbnNhY3Rpb24gaXMgbm90IGhleCBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdHggaXMgZm9yIHRoZSBibG9ja2NoYWluSWRcbiAgICpcbiAgICogQHBhcmFtIHtEZXByZWNhdGVkVHh9IHR4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBibG9ja2NoYWluSWRcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0eCBpcyBmb3IgYmxvY2tjaGFpbklkXG4gICAqL1xuICBpc1RyYW5zYWN0aW9uT2YodHg6IERlcHJlY2F0ZWRUeCwgYmxvY2tjaGFpbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBGbGFyZUpTIGVxdWl2YWxlbnQgLSB0aGlzIHdvdWxkIG5lZWQgcHJvcGVyIENCNTggZW5jb2RpbmcgaW1wbGVtZW50YXRpb25cbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhSZWNvcmQgPSB0eCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9ICh0eFJlY29yZC5nZXRVbnNpZ25lZFR4IGFzICgpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSgpO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSAodW5zaWduZWRUeC5nZXRUcmFuc2FjdGlvbiBhcyAoKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikoKTtcbiAgICAgIGNvbnN0IHR4QmxvY2tjaGFpbklkID0gKHRyYW5zYWN0aW9uLmdldEJsb2NrY2hhaW5JRCBhcyAoKSA9PiB1bmtub3duKSgpO1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHR4QmxvY2tjaGFpbklkIGFzIHN0cmluZykudG9TdHJpbmcoSEVYX0VOQ09ESU5HKSA9PT0gYmxvY2tjaGFpbklkO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIE91dHB1dCBpcyBmcm9tIFBWTS5cbiAgICogT3V0cHV0IGNvdWxkIGJlIEVWTSBvciBQVk0gb3V0cHV0LlxuICAgKiBAcGFyYW0ge0RlcHJlY2F0ZWRPdXRwdXR9IG91dHB1dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gb3V0cHV0IGhhcyB0cmFuc2ZlcmFibGUgb3V0cHV0IHN0cnVjdHVyZVxuICAgKi9cbiAgZGVwcmVjYXRlZElzVHJhbnNmZXJhYmxlT3V0cHV0KG91dHB1dDogRGVwcmVjYXRlZE91dHB1dCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAnZ2V0T3V0cHV0JyBpbiAob3V0cHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBPdXRwdXQgaXMgZnJvbSBQVk0uXG4gICAqIE91dHB1dCBjb3VsZCBiZSBFVk0gb3IgUFZNIG91dHB1dC5cbiAgICogQHBhcmFtIHtPdXRwdXR9IG91dHB1dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gb3V0cHV0IGlzIFRyYW5zZmVyYWJsZU91dHB1dFxuICAgKi9cbiAgaXNUcmFuc2ZlcmFibGVPdXRwdXQob3V0cHV0OiBPdXRwdXQpOiBvdXRwdXQgaXMgVHJhbnNmZXJhYmxlT3V0cHV0IHtcbiAgICByZXR1cm4gdHlwZW9mIChvdXRwdXQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZ2V0T3V0cHV0ID09PSAnZnVuY3Rpb24nO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1hcHBlciBmdW5jdGlvbiB0byB0aGF0IG5ldHdvcmsgYWRkcmVzcyByZXByZXNlbnRhdGlvbi5cbiAgICogQHBhcmFtIG5ldHdvcmsgcmVxdWlyZWQgdG8gc3RyaW5naWZ5IGFkZHJlc3Nlc1xuICAgKiBAcmV0dXJuIG1hcHBlciBmdW5jdGlvblxuICAgKi9cbiAgZGVwcmVjYXRlZE1hcE91dHB1dFRvRW50cnkobmV0d29yazogRmxhcmVOZXR3b3JrKTogKG91dHB1dDogRGVwcmVjYXRlZE91dHB1dCkgPT4gRW50cnkge1xuICAgIHJldHVybiAob3V0cHV0OiBEZXByZWNhdGVkT3V0cHV0KSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXByZWNhdGVkSXNUcmFuc2ZlcmFibGVPdXRwdXQob3V0cHV0KSkge1xuICAgICAgICAvLyBTaW1wbGlmaWVkIGltcGxlbWVudGF0aW9uIGZvciBGbGFyZUpTXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJhYmxlT3V0cHV0ID0gb3V0cHV0IGFzIHVua25vd24gYXMgVHJhbnNmZXJhYmxlT3V0cHV0O1xuICAgICAgICAgIGNvbnN0IGFtb3VudCA9IHRyYW5zZmVyYWJsZU91dHB1dC5hbW91bnQoKTtcblxuICAgICAgICAgIC8vIFNpbXBsaWZpZWQgYWRkcmVzcyBoYW5kbGluZyAtIHdvdWxkIG5lZWQgcHJvcGVyIEZsYXJlSlMgYWRkcmVzcyB1dGlsaXRpZXNcbiAgICAgICAgICBjb25zdCBhZGRyZXNzID0gRkxBUkVfQUREUkVTU19QTEFDRUhPTERFUjsgLy8gVE9ETzogaW1wbGVtZW50IHByb3BlciBhZGRyZXNzIGNvbnZlcnNpb25cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbWFwIG91dHB1dDogJHtlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIEVWTSBvdXRwdXQgY2FzZSAtIHNpbXBsaWZpZWRcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogJzAnLCAvLyBUT0RPOiBpbXBsZW1lbnQgcHJvcGVyIGFtb3VudCBleHRyYWN0aW9uXG4gICAgICAgICAgYWRkcmVzczogJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIC8vIFRPRE86IGltcGxlbWVudCBwcm9wZXIgYWRkcmVzcyBleHRyYWN0aW9uXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtYXBwZXIgZnVuY3Rpb24gdG8gdGhhdCBuZXR3b3JrIGFkZHJlc3MgcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSBuZXR3b3JrIHJlcXVpcmVkIHRvIHN0cmluZ2lmeSBhZGRyZXNzZXNcbiAgICogQHJldHVybiBtYXBwZXIgZnVuY3Rpb25cbiAgICovXG4gIG1hcE91dHB1dFRvRW50cnkobmV0d29yazogRmxhcmVOZXR3b3JrKTogKE91dHB1dCkgPT4gRW50cnkge1xuICAgIHJldHVybiAob3V0cHV0OiBPdXRwdXQpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVHJhbnNmZXJhYmxlT3V0cHV0KG91dHB1dCkpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJhYmxlT3V0cHV0ID0gb3V0cHV0IGFzIFRyYW5zZmVyYWJsZU91dHB1dDtcbiAgICAgICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHJhbnNmZXJhYmxlT3V0cHV0LmFtb3VudCgpO1xuXG4gICAgICAgIC8vIFNpbXBsaWZpZWQgYWRkcmVzcyBoYW5kbGluZyBmb3IgRmxhcmVKU1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gJ2ZsYXJlLWFkZHJlc3MtcGxhY2Vob2xkZXInOyAvLyBUT0RPOiBpbXBsZW1lbnQgcHJvcGVyIGFkZHJlc3MgY29udmVyc2lvblxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IG91dHB1dEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgb3V0cHV0IHR5cGUnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBoZXggcHJlZml4ICgweClcbiAgICogQHBhcmFtIGhleCBzdHJpbmdcbiAgICogQHJldHVybnMgaGV4IHdpdGhvdXQgMHhcbiAgICovXG4gIHJlbW92ZUhleFByZWZpeChoZXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGhleC5zdGFydHNXaXRoKCcweCcpKSB7XG4gICAgICByZXR1cm4gaGV4LnN1YnN0cmluZygyKTtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXRpZHggY29udmVydCBmcm9tIG51bWJlciAoYXMgc3RyaW5nKSB0byBidWZmZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRpZHggbnVtYmVyXG4gICAqIEByZXR1cm4ge0J1ZmZlcn0gYnVmZmVyIG9mIHNpemUgNCB3aXRoIHRoYXQgbnVtYmVyIHZhbHVlXG4gICAqL1xuICBvdXRwdXRpZHhOdW1iZXJUb0J1ZmZlcihvdXRwdXRpZHg6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgICAgTnVtYmVyKG91dHB1dGlkeCkudG9TdHJpbmcoSEVYX1JBRElYKS5wYWRTdGFydChPVVRQVVRfSU5ERVhfSEVYX0xFTkdUSCwgUEFEU1RBUlRfQ0hBUiksXG4gICAgICBIRVhfRU5DT0RJTkdcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dGlkeCBidWZmZXIgdG8gbnVtYmVyIChhcyBzdHJpbmcpXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBvdXRwdXRpZHhcbiAgICogQHJldHVybiB7c3RyaW5nfSBvdXRwdXRpZHggbnVtYmVyXG4gICAqL1xuICBvdXRwdXRpZHhCdWZmZXJUb051bWJlcihvdXRwdXRpZHg6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhcnNlSW50KG91dHB1dGlkeC50b1N0cmluZyhIRVhfRU5DT0RJTkcpLCBIRVhfUkFESVgpLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQ0I1OCBkZWNvZGUgZnVuY3Rpb24gLSBzaW1wbGUgQmFzZTU4IGRlY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YSAtIENCNTggZW5jb2RlZCBzdHJpbmdcbiAgICogQHJldHVybnMge0J1ZmZlcn0gZGVjb2RlZCBidWZmZXJcbiAgICovXG4gIGNiNThEZWNvZGUoZGF0YTogc3RyaW5nKTogQnVmZmVyIHtcbiAgICAvLyBGb3Igbm93LCB1c2UgYSBzaW1wbGUgaGV4IGRlY29kZSBhcyBwbGFjZWhvbGRlclxuICAgIC8vIEluIGEgZnVsbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCBiZSBwcm9wZXIgQ0I1OCBkZWNvZGluZ1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSwgSEVYX0VOQ09ESU5HKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGxiYWNrIHRvIGJ1ZmZlciBmcm9tIHN0cmluZ1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGFkZHJlc3MgYnVmZmVyIHRvIGJlY2gzMiBzdHJpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhycCAtIEh1bWFuIHJlYWRhYmxlIHBhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYWluaWQgLSBDaGFpbiBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBhZGRyZXNzQnVmZmVyIC0gQWRkcmVzcyBidWZmZXJcbiAgICogQHJldHVybnMge3N0cmluZ30gQWRkcmVzcyBzdHJpbmdcbiAgICovXG4gIGFkZHJlc3NUb1N0cmluZyhocnA6IHN0cmluZywgY2hhaW5pZDogc3RyaW5nLCBhZGRyZXNzQnVmZmVyOiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIC8vIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiAtIGluIHByYWN0aWNlIHRoaXMgd291bGQgdXNlIGJlY2gzMiBlbmNvZGluZ1xuICAgIHJldHVybiBgJHtjaGFpbmlkfS0ke2FkZHJlc3NCdWZmZXIudG9TdHJpbmcoSEVYX0VOQ09ESU5HKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgc3RyaW5nIHRvIGJ5dGVzIGZvciBGbGFyZUpTIG1lbW9cbiAgICogRm9sbG93cyBGbGFyZUpTIHV0aWxzLnN0cmluZ1RvQnl0ZXMgcGF0dGVyblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRleHQgdG8gY29udmVydFxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gQnl0ZSBhcnJheVxuICAgKi9cbiAgc3RyaW5nVG9CeXRlcyh0ZXh0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYnl0ZXMgdG8gc3RyaW5nIGZyb20gRmxhcmVKUyBtZW1vXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXMgLSBCeXRlcyB0byBjb252ZXJ0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IERlY29kZWQgc3RyaW5nXG4gICAqL1xuICBieXRlc1RvU3RyaW5nKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGJ5dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbWVtbyBieXRlcyBmcm9tIHZhcmlvdXMgaW5wdXQgZm9ybWF0c1xuICAgKiBTdXBwb3J0cyBzdHJpbmcsIEpTT04gb2JqZWN0LCBvciByYXcgYnl0ZXNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFVpbnQ4QXJyYXl9IG1lbW8gLSBNZW1vIGRhdGFcbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXl9IE1lbW8gYnl0ZXMgZm9yIEZsYXJlSlNcbiAgICovXG4gIGNyZWF0ZU1lbW9CeXRlcyhtZW1vOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICBpZiAobWVtbyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWVtbyA9PT0gU1RSSU5HX1RZUEUpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmluZ1RvQnl0ZXMobWVtbyBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWVtbyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmluZ1RvQnl0ZXMoSlNPTi5zdHJpbmdpZnkobWVtbykpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBtZW1vIGZvcm1hdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIG1lbW8gYnl0ZXMgdG8gc3RyaW5nXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gbWVtb0J5dGVzIC0gTWVtbyBieXRlcyBmcm9tIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge3N0cmluZ30gRGVjb2RlZCBtZW1vIHN0cmluZ1xuICAgKi9cbiAgcGFyc2VNZW1vQnl0ZXMobWVtb0J5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICBpZiAobWVtb0J5dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ieXRlc1RvU3RyaW5nKG1lbW9CeXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgbWVtbyBzaXplIChGbGFyZUpTIGhhcyB0cmFuc2FjdGlvbiBzaXplIGxpbWl0cylcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBtZW1vQnl0ZXMgLSBNZW1vIGJ5dGVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhTaXplIC0gTWF4aW11bSBzaXplIGluIGJ5dGVzIChkZWZhdWx0IDRLQilcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgbWVtbyBpcyB3aXRoaW4gc2l6ZSBsaW1pdHNcbiAgICovXG4gIHZhbGlkYXRlTWVtb1NpemUobWVtb0J5dGVzOiBVaW50OEFycmF5LCBtYXhTaXplID0gNDA5Nik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtZW1vQnl0ZXMubGVuZ3RoIDw9IG1heFNpemU7XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
|
|
583
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG1DQUFnQztBQUNoQyxnREFBd0I7QUFDeEIsbURBUThCO0FBRTlCLHFEQUE0QztBQUM1QyxtQ0FBb0M7QUFFcEMsMkNBa0JxQjtBQUVyQiw2Q0FBNkM7QUFDdEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFjLEVBQUUsYUFBYSxHQUFHLEtBQUssRUFBVSxFQUFFO0lBQzlFLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSw0QkFBZ0IsSUFBSSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSw0QkFBZ0IsSUFBSSxNQUFNLElBQUksQ0FBQztJQUMxRyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQztBQUhXLFFBQUEsY0FBYyxrQkFHekI7QUFFSyxNQUFNLHNCQUFzQixHQUFHLENBQUMsYUFBYSxHQUFHLEtBQUssRUFBVSxFQUFFO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSw0QkFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQ0FBcUIsQ0FBQztJQUNuRixPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQztBQUhXLFFBQUEsc0JBQXNCLDBCQUdqQztBQUVGLE1BQWEsS0FBSztJQUFsQjtRQUNTLG9CQUFlLEdBQUcsQ0FBQyxHQUFXLEVBQUUsTUFBYyxFQUFFLE9BQWUsRUFBVSxFQUFFO1lBQ2hGLCtEQUErRDtZQUMvRCxNQUFNLEtBQUssR0FBRyxlQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLCtFQUErRTtZQUMvRSxPQUFPLEdBQUcsTUFBTSxJQUFJLGVBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUss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QUFDLENBQUMsTUFBTSxLQUFLLG1DQUF1QixDQUFDO1FBQ25GLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFqbUJELHNCQWltQkM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBRTFCLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zZmVyYWJsZU91dHB1dCB9IGZyb20gJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcyc7XG5pbXBvcnQgeyBiZWNoMzIgfSBmcm9tICdiZWNoMzInO1xuaW1wb3J0IGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQge1xuICBCYXNlVXRpbHMsXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgaXNWYWxpZFhwcnYsXG4gIGlzVmFsaWRYcHViLFxuICBOb3RJbXBsZW1lbnRlZEVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEZsYXJlTmV0d29yayB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgZWNjIH0gZnJvbSAnQGJpdGdvLWJldGEvc2VjcDI1NmsxJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRGVwcmVjYXRlZE91dHB1dCwgRGVwcmVjYXRlZFR4LCBPdXRwdXQgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7XG4gIFNIT1JUX1BVQl9LRVlfTEVOR1RILFxuICBDT01QUkVTU0VEX1BVQkxJQ19LRVlfTEVOR1RILFxuICBVTkNPTVBSRVNTRURfUFVCTElDX0tFWV9MRU5HVEgsXG4gIFJBV19QUklWQVRFX0tFWV9MRU5HVEgsXG4gIFNVRkZJWEVEX1BSSVZBVEVfS0VZX0xFTkdUSCxcbiAgUFJJVkFURV9LRVlfQ09NUFJFU1NFRF9TVUZGSVgsXG4gIE9VVFBVVF9JTkRFWF9IRVhfTEVOR1RILFxuICBBRERSRVNTX1JFR0VYLFxuICBIRVhfUkVHRVgsXG4gIEhFWF9DSEFSX1BBVFRFUk4sXG4gIEhFWF9QQVRURVJOX05PX1BSRUZJWCxcbiAgRkxBUkVfQUREUkVTU19QTEFDRUhPTERFUixcbiAgSEVYX0VOQ09ESU5HLFxuICBQQURTVEFSVF9DSEFSLFxuICBIRVhfUkFESVgsXG4gIFNUUklOR19UWVBFLFxuICBERUNPREVEX0JMT0NLX0lEX0xFTkdUSCxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vLyBSZWdleCB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgaGV4IHZhbGlkYXRpb25cbmV4cG9ydCBjb25zdCBjcmVhdGVIZXhSZWdleCA9IChsZW5ndGg6IG51bWJlciwgcmVxdWlyZVByZWZpeCA9IGZhbHNlKTogUmVnRXhwID0+IHtcbiAgY29uc3QgcGF0dGVybiA9IHJlcXVpcmVQcmVmaXggPyBgXjB4JHtIRVhfQ0hBUl9QQVRURVJOfXske2xlbmd0aH19JGAgOiBgXiR7SEVYX0NIQVJfUEFUVEVSTn17JHtsZW5ndGh9fSRgO1xuICByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVGbGV4aWJsZUhleFJlZ2V4ID0gKHJlcXVpcmVQcmVmaXggPSBmYWxzZSk6IFJlZ0V4cCA9PiB7XG4gIGNvbnN0IHBhdHRlcm4gPSByZXF1aXJlUHJlZml4ID8gYF4weCR7SEVYX0NIQVJfUEFUVEVSTn0rJGAgOiBIRVhfUEFUVEVSTl9OT19QUkVGSVg7XG4gIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4pO1xufTtcblxuZXhwb3J0IGNsYXNzIFV0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgcHVibGljIGFkZHJlc3NUb1N0cmluZyA9IChocnA6IHN0cmluZywgcHJlZml4OiBzdHJpbmcsIGFkZHJlc3M6IEJ1ZmZlcik6IHN0cmluZyA9PiB7XG4gICAgLy8gQ29udmVydCB0aGUgYWRkcmVzcyBieXRlcyB0byA1LWJpdCB3b3JkcyBmb3IgYmVjaDMyIGVuY29kaW5nXG4gICAgY29uc3Qgd29yZHMgPSBiZWNoMzIudG9Xb3JkcyhhZGRyZXNzKTtcbiAgICAvLyBDcmVhdGUgdGhlIGZ1bGwgYmVjaDMyIGFkZHJlc3Mgd2l0aCBmb3JtYXQ6IFAte2hycH0xe2JlY2gzMl9lbmNvZGVkX2FkZHJlc3N9XG4gICAgcmV0dXJuIGAke3ByZWZpeH0tJHtiZWNoMzIuZW5jb2RlKGhycCwgd29yZHMpfWA7XG4gIH07XG5cbiAgcHVibGljIGluY2x1ZGVJbih3YWxsZXRBZGRyZXNzZXM6IHN0cmluZ1tdLCBvdHhvT3V0cHV0QWRkcmVzc2VzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3YWxsZXRBZGRyZXNzZXMubWFwKChhKSA9PiBvdHhvT3V0cHV0QWRkcmVzc2VzLmluY2x1ZGVzKGEpKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYiwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGl0IGlzIGEgdmFsaWQgYWRkcmVzcyBubyBpbGxlZ2FsIGNoYXJhY3RlcnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFkZHJlc3NBcnI6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShhZGRyZXNzKSA/IGFkZHJlc3MgOiBhZGRyZXNzLnNwbGl0KCd+Jyk7XG5cbiAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgYWRkcmVzc0Fycikge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzUmVnZXgoYWRkcmVzcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkQWRkcmVzc1JlZ2V4KGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBRERSRVNTX1JFR0VYLnRlc3QoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBwcm90b2NvbCBwdWJsaWMga2V5IG9yXG4gICAqIGV4dGVuZGVkIHB1YmxpYyBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdWIgLSB0aGUgIHB1YmxpYyBrZXkgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChpc1ZhbGlkWHB1YihwdWIpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGxldCBwdWJCdWY6IEJ1ZmZlcjtcbiAgICBpZiAocHViLmxlbmd0aCA9PT0gU0hPUlRfUFVCX0tFWV9MRU5HVEgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHB1YkJ1ZiA9IHRoaXMuY2I1OERlY29kZShwdWIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHB1Yi5sZW5ndGggIT09IENPTVBSRVNTRURfUFVCTElDX0tFWV9MRU5HVEggJiYgcHViLmxlbmd0aCAhPT0gVU5DT01QUkVTU0VEX1BVQkxJQ19LRVlfTEVOR1RIKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RCeXRlID0gcHViLnNsaWNlKDAsIDIpO1xuXG4gICAgICAvLyB1bmNvbXByZXNzZWQgcHVibGljIGtleVxuICAgICAgaWYgKHB1Yi5sZW5ndGggPT09IFVOQ09NUFJFU1NFRF9QVUJMSUNfS0VZX0xFTkdUSCAmJiBmaXJzdEJ5dGUgIT09ICcwNCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb21wcmVzc2VkIHB1YmxpYyBrZXlcbiAgICAgIGlmIChwdWIubGVuZ3RoID09PSBDT01QUkVTU0VEX1BVQkxJQ19LRVlfTEVOR1RIICYmIGZpcnN0Qnl0ZSAhPT0gJzAyJyAmJiBmaXJzdEJ5dGUgIT09ICcwMycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuYWxsSGV4Q2hhcnMocHViKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcHViQnVmID0gQnVmZmVyLmZyb20ocHViLCAnaGV4Jyk7XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIHRoZSBwdWJsaWMga2V5IHVzaW5nIEJpdEdvIHNlY3AyNTZrMVxuICAgIHRyeSB7XG4gICAgICBlY2MuaXNQb2ludChwdWJCdWYpOyAvLyBDaGVjayBpZiBpdCdzIGEgdmFsaWQgcG9pbnRcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFyc2VBZGRyZXNzID0gKGFkZHJlc3M6IHN0cmluZyk6IEJ1ZmZlciA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nVG9BZGRyZXNzKGFkZHJlc3MpO1xuICB9O1xuXG4gIHB1YmxpYyBzdHJpbmdUb0FkZHJlc3MgPSAoYWRkcmVzczogc3RyaW5nLCBocnA/OiBzdHJpbmcpOiBCdWZmZXIgPT4ge1xuICAgIGNvbnN0IHBhcnRzID0gYWRkcmVzcy50cmltKCkuc3BsaXQoJy0nKTtcbiAgICBpZiAocGFydHMubGVuZ3RoIDwgMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciAtIFZhbGlkIGFkZHJlc3Mgc2hvdWxkIGluY2x1ZGUgLScpO1xuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0ID0gcGFydHNbMV0ubGFzdEluZGV4T2YoJzEnKTtcbiAgICBpZiAoc3BsaXQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIC0gVmFsaWQgYWRkcmVzcyBtdXN0IGluY2x1ZGUgc2VwYXJhdG9yICgxKScpO1xuICAgIH1cblxuICAgIGNvbnN0IGh1bWFuUmVhZGFibGVQYXJ0ID0gcGFydHNbMV0uc2xpY2UoMCwgc3BsaXQpO1xuICAgIGlmIChodW1hblJlYWRhYmxlUGFydCAhPT0gJ2ZsYXJlJyAmJiBodW1hblJlYWRhYmxlUGFydCAhPT0gJ2Nvc3R3bycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgLSBJbnZhbGlkIEhSUCcpO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuZnJvbShiZWNoMzIuZnJvbVdvcmRzKGJlY2gzMi5kZWNvZGUocGFydHNbMV0pLndvcmRzKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHByb3RvY29sIHByaXZhdGUga2V5LCBvciBleHRlbmRlZFxuICAgKiBwcml2YXRlIGtleS5cbiAgICpcbiAgICogVGhlIHByb3RvY29sIGtleSBmb3JtYXQgaXMgZGVzY3JpYmVkIGluIHRoZSBAc3RhY2tzL3RyYW5zYWN0aW9ucyBucG0gcGFja2FnZSwgaW4gdGhlXG4gICAqIGNyZWF0ZVN0YWNrc1ByaXZhdGVLZXkgZnVuY3Rpb246XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibG9ja3N0YWNrL3N0YWNrcy5qcy9ibG9iL21hc3Rlci9wYWNrYWdlcy90cmFuc2FjdGlvbnMvc3JjL2tleXMudHMjTDEyNVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJ2IC0gdGhlIHByaXZhdGUga2V5IChvciBleHRlbmRlZCBwcml2YXRlIGtleSkgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkocHJ2OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoaXNWYWxpZFhwcnYocHJ2KSkgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAocHJ2Lmxlbmd0aCAhPT0gUkFXX1BSSVZBVEVfS0VZX0xFTkdUSCAmJiBwcnYubGVuZ3RoICE9PSBTVUZGSVhFRF9QUklWQVRFX0tFWV9MRU5HVEgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwcnYubGVuZ3RoID09PSBTVUZGSVhFRF9QUklWQVRFX0tFWV9MRU5HVEggJiZcbiAgICAgIHBydi5zbGljZShSQVdfUFJJVkFURV9LRVlfTEVOR1RIKSAhPT0gUFJJVkFURV9LRVlfQ09NUFJFU1NFRF9TVUZGSVhcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hbGxIZXhDaGFycyhwcnYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIGNvbXBvc2VkIG9mIGhleCBjaGFycyBvbmx5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXliZSAtIHRoZSAgc3RyaW5nIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGFsbEhleENoYXJzKG1heWJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSEVYX1JFR0VYLnRlc3QobWF5YmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpZ2h0d2VpZ2h0IEV0aGVyZXVtIGFkZHJlc3MgdmFsaWRhdGlvblxuICAgKiBWYWxpZGF0ZXMgdGhhdCBhbiBhZGRyZXNzIGlzIGEgNDAtY2hhcmFjdGVyIGhleCBzdHJpbmcgKG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aCAweClcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSB0aGUgRXRoZXJldW0gYWRkcmVzcyB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0cnVlIGlmIHZhbGlkIEV0aGVyZXVtIGFkZHJlc3MgZm9ybWF0XG4gICAqL1xuICBpc1ZhbGlkRXRoZXJldW1BZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghYWRkcmVzcyB8fCB0eXBlb2YgYWRkcmVzcyAhPT0gU1RSSU5HX1RZUEUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgMHggcHJlZml4IGlmIHByZXNlbnRcbiAgICBjb25zdCBjbGVhbkFkZHJlc3MgPSBhZGRyZXNzLnN0YXJ0c1dpdGgoJzB4JykgPyBhZGRyZXNzLnNsaWNlKDIpIDogYWRkcmVzcztcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgZXhhY3RseSA0MCBoZXggY2hhcmFjdGVyc1xuICAgIHJldHVybiBjbGVhbkFkZHJlc3MubGVuZ3RoID09PSA0MCAmJiAvXlswLTlhLWZBLUZdezQwfSQvLnRlc3QoY2xlYW5BZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrIHNwZWNpZmljIHByb3BlcnRpZXMgZnJvbSBhbiBvYmplY3QgKHJlcGxhY2VzIGxvZGFzaC5waWNrKVxuICAgKlxuICAgKiBAcGFyYW0ge1R9IG9iaiAtIHRoZSBzb3VyY2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7S1tdfSBrZXlzIC0gYXJyYXkgb2YgcHJvcGVydHkga2V5cyB0byBwaWNrXG4gICAqIEByZXR1cm5zIHtQaWNrPFQsIEs+fSAtIG5ldyBvYmplY3Qgd2l0aCBvbmx5IHRoZSBzcGVjaWZpZWQgcHJvcGVydGllc1xuICAgKi9cbiAgcGljazxULCBLIGV4dGVuZHMga2V5b2YgVD4ob2JqOiBULCBrZXlzOiBLW10pOiBQaWNrPFQsIEs+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBQaWNrPFQsIEs+O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gb2JqW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGVlcCBlcXVhbGl0eSBjb21wYXJpc29uIChyZXBsYWNlcyBsb2Rhc2guaXNFcXVhbClcbiAgICpcbiAgICogQHBhcmFtIHt1bmtub3dufSBhIC0gZmlyc3QgdmFsdWUgdG8gY29tcGFyZVxuICAgKiBAcGFyYW0ge3Vua25vd259IGIgLSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0cnVlIGlmIHZhbHVlcyBhcmUgZGVlcGx5IGVxdWFsXG4gICAqL1xuICBpc0VxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAoYSA9PT0gbnVsbCB8fCBhID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpIHJldHVybiBhID09PSBiO1xuXG4gICAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYSkgIT09IEFycmF5LmlzQXJyYXkoYikpIHJldHVybiBmYWxzZTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgY29uc3QgYXJyQiA9IGIgYXMgdW5rbm93bltdO1xuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGFyckIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdGhpcy5pc0VxdWFsKGFbaV0sIGFyckJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9iakEgPSBhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3Qgb2JqQiA9IGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICAgICAgY29uc3Qga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcbiAgICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzQSkge1xuICAgICAgICBpZiAoIWtleXNCLmluY2x1ZGVzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRXF1YWwob2JqQVtrZXldLCBvYmpCW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdpc1ZhbGlkU2lnbmF0dXJlIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRJZCh0eElkKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChibG9ja0lkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSWQoYmxvY2tJZCk7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmVKUyB3cmFwcGVyIHRvIGNyZWF0ZSBzaWduYXR1cmUgYW5kIHJldHVybiBpdCBmb3IgY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIG5ldHdvcmtcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHBydlxuICAgKiBAcmV0dXJuIHNpZ25hdHVyZVxuICAgKi9cbiAgY3JlYXRlU2lnbmF0dXJlKG5ldHdvcms6IEZsYXJlTmV0d29yaywgbWVzc2FnZTogQnVmZmVyLCBwcnY6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgLy8gVXNlZCBCaXRHbyBzZWNwMjU2azEgc2luY2UgRmxhcmVKUyBtYXkgbm90IGV4cG9zZSBLZXlQYWlyIGluIHRoZSBzYW1lIHdheVxuICAgIHRyeSB7XG4gICAgICAvLyBIYXNoIHRoZSBtZXNzYWdlIGZpcnN0OiBzZWNwMjU2azEgc2lnbmluZyByZXF1aXJlcyBhIDMyLWJ5dGUgaGFzaCBhcyBpbnB1dC5cbiAgICAgIC8vIEl0IGlzIGVzc2VudGlhbCB0aGF0IHRoZSBzYW1lIGhhc2hpbmcgKHNoYTI1NiBvZiB0aGUgbWVzc2FnZSkgaXMgYXBwbGllZCBkdXJpbmcgc2lnbmF0dXJlIHJlY292ZXJ5LFxuICAgICAgLy8gb3RoZXJ3aXNlIHRoZSByZWNvdmVyZWQgcHVibGljIGtleSBvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHdpbGwgZmFpbC5cbiAgICAgIGNvbnN0IG1lc3NhZ2VIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKG1lc3NhZ2UpLmRpZ2VzdCgpO1xuXG4gICAgICAvLyBTaWduIHdpdGggcmVjb3ZlcnkgcGFyYW1ldGVyXG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBlY2Muc2lnbihtZXNzYWdlSGFzaCwgcHJ2KTtcblxuICAgICAgLy8gR2V0IHJlY292ZXJ5IHBhcmFtZXRlciBieSB0cnlpbmcgYm90aCB2YWx1ZXNcbiAgICAgIGxldCByZWNvdmVyeVBhcmFtID0gLTE7XG4gICAgICBjb25zdCBwdWJLZXkgPSBlY2MucG9pbnRGcm9tU2NhbGFyKHBydiwgdHJ1ZSk7XG4gICAgICBpZiAoIXB1YktleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZXJpdmUgcHVibGljIGtleSBmcm9tIHByaXZhdGUga2V5Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWNvdmVyZWQwID0gZWNjLnJlY292ZXJQdWJsaWNLZXkobWVzc2FnZUhhc2gsIHNpZ25hdHVyZSwgMCwgdHJ1ZSk7XG4gICAgICBpZiAocmVjb3ZlcmVkMCAmJiBCdWZmZXIuZnJvbShyZWNvdmVyZWQwKS5lcXVhbHMoQnVmZmVyLmZyb20ocHViS2V5KSkpIHtcbiAgICAgICAgcmVjb3ZlcnlQYXJhbSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWNvdmVyZWQxID0gZWNjLnJlY292ZXJQdWJsaWNLZXkobWVzc2FnZUhhc2gsIHNpZ25hdHVyZSwgMSwgdHJ1ZSk7XG4gICAgICAgIGlmIChyZWNvdmVyZWQxICYmIEJ1ZmZlci5mcm9tKHJlY292ZXJlZDEpLmVxdWFscyhCdWZmZXIuZnJvbShwdWJLZXkpKSkge1xuICAgICAgICAgIHJlY292ZXJ5UGFyYW0gPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGRldGVybWluZSBjb3JyZWN0IHJlY292ZXJ5IHBhcmFtZXRlciBmb3Igc2lnbmF0dXJlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQXBwZW5kIHJlY292ZXJ5IHBhcmFtZXRlciB0byBzaWduYXR1cmVcbiAgICAgIGNvbnN0IGZ1bGxTaWcgPSBCdWZmZXIuYWxsb2MoNjUpOyAvLyA2NCBieXRlcyBzaWduYXR1cmUgKyAxIGJ5dGUgcmVjb3ZlcnlcbiAgICAgIGZ1bGxTaWcuc2V0KHNpZ25hdHVyZSk7XG4gICAgICBmdWxsU2lnWzY0XSA9IHJlY292ZXJ5UGFyYW07XG5cbiAgICAgIHJldHVybiBmdWxsU2lnO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgc2lnbmF0dXJlOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFyZUpTIHdyYXBwZXIgdG8gdmVyaWZ5IHNpZ25hdHVyZVxuICAgKiBAcGFyYW0gbmV0d29ya1xuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKiBAcGFyYW0gc2lnbmF0dXJlXG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgLSBwdWJsaWMga2V5IGluc3RlYWQgb2YgcHJpdmF0ZSBrZXkgZm9yIHZlcmlmaWNhdGlvblxuICAgKiBAcmV0dXJuIHRydWUgaWYgaXQncyB2ZXJpZnkgc3VjY2Vzc2Z1bFxuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlKG5ldHdvcms6IEZsYXJlTmV0d29yaywgbWVzc2FnZTogQnVmZmVyLCBzaWduYXR1cmU6IEJ1ZmZlciwgcHVibGljS2V5OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gSGFzaCB0aGUgbWVzc2FnZSBmaXJzdCAtIG11c3QgbWF0Y2ggdGhlIGhhc2ggdXNlZCBpbiBzaWduaW5nXG4gICAgICBjb25zdCBtZXNzYWdlSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKTtcblxuICAgICAgLy8gRXh0cmFjdCB0aGUgYWN0dWFsIHNpZ25hdHVyZSB3aXRob3V0IHJlY292ZXJ5IHBhcmFtZXRlclxuICAgICAgaWYgKHNpZ25hdHVyZS5sZW5ndGggIT09IDY1KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUgbGVuZ3RoIC0gZXhwZWN0ZWQgNjUgYnl0ZXMgKDY0IGJ5dGVzIHNpZ25hdHVyZSArIDEgYnl0ZSByZWNvdmVyeSknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ09ubHkgPSBzaWduYXR1cmUuc2xpY2UoMCwgNjQpO1xuXG4gICAgICByZXR1cm4gZWNjLnZlcmlmeShtZXNzYWdlSGFzaCwgcHVibGljS2V5LCBzaWdPbmx5KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFyZUpTIHdyYXBwZXIgdG8gcmVjb3ZlciBzaWduYXR1cmVcbiAgICogQHBhcmFtIG5ldHdvcmtcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHNpZ25hdHVyZVxuICAgKiBAcmV0dXJuIHJlY292ZXJlZCBwdWJsaWMga2V5XG4gICAqL1xuICByZWNvdmVyeVNpZ25hdHVyZShuZXR3b3JrOiBGbGFyZU5ldHdvcmssIG1lc3NhZ2U6IEJ1ZmZlciwgc2lnbmF0dXJlOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIHRyeSB7XG4gICAgICAvLyBIYXNoIHRoZSBtZXNzYWdlIGZpcnN0IC0gbXVzdCBtYXRjaCB0aGUgaGFzaCB1c2VkIGluIHNpZ25pbmdcbiAgICAgIGNvbnN0IG1lc3NhZ2VIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKG1lc3NhZ2UpLmRpZ2VzdCgpO1xuXG4gICAgICAvLyBFeHRyYWN0IHJlY292ZXJ5IHBhcmFtZXRlciBhbmQgc2lnbmF0dXJlXG4gICAgICBpZiAoc2lnbmF0dXJlLmxlbmd0aCAhPT0gNjUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZSBsZW5ndGggLSBleHBlY3RlZCA2NSBieXRlcyAoNjQgYnl0ZXMgc2lnbmF0dXJlICsgMSBieXRlIHJlY292ZXJ5KScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWNvdmVyeVBhcmFtID0gc2lnbmF0dXJlWzY0XTtcbiAgICAgIGNvbnN0IHNpZ09ubHkgPSBzaWduYXR1cmUuc2xpY2UoMCwgNjQpO1xuXG4gICAgICAvLyBSZWNvdmVyIHB1YmxpYyBrZXkgdXNpbmcgdGhlIHByb3ZpZGVkIHJlY292ZXJ5IHBhcmFtZXRlclxuICAgICAgY29uc3QgcmVjb3ZlcmVkID0gZWNjLnJlY292ZXJQdWJsaWNLZXkobWVzc2FnZUhhc2gsIHNpZ09ubHksIHJlY292ZXJ5UGFyYW0sIHRydWUpO1xuICAgICAgaWYgKCFyZWNvdmVyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVjb3ZlciBwdWJsaWMga2V5Jyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShyZWNvdmVyZWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWNvdmVyIHNpZ25hdHVyZTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICBzaGEyNTYoYnVmOiBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGJ1ZikuZGlnZXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKiBJdCdzIHRvIHJldXNlIGluIFRyYW5zYWN0aW9uQnVpbGRlciBhbmQgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeVxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gYXMgaGV4IHN0cmluZ1xuICAgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdSYXcgdHJhbnNhY3Rpb24gaXMgZW1wdHknKTtcbiAgICB9XG4gICAgaWYgKCF1dGlscy5hbGxIZXhDaGFycyhyYXdUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ1JhdyB0cmFuc2FjdGlvbiBpcyBub3QgaGV4IHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0eCBpcyBmb3IgdGhlIGJsb2NrY2hhaW5JZFxuICAgKlxuICAgKiBAcGFyYW0ge0RlcHJlY2F0ZWRUeH0gdHhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJsb2NrY2hhaW5JZFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHR4IGlzIGZvciBibG9ja2NoYWluSWRcbiAgICovXG4gIGlzVHJhbnNhY3Rpb25PZih0eDogRGVwcmVjYXRlZFR4LCBibG9ja2NoYWluSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIEZsYXJlSlMgZXF1aXZhbGVudCAtIHRoaXMgd291bGQgbmVlZCBwcm9wZXIgQ0I1OCBlbmNvZGluZyBpbXBsZW1lbnRhdGlvblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eFJlY29yZCA9IHR4IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gKHR4UmVjb3JkLmdldFVuc2lnbmVkVHggYXMgKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKCk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9ICh1bnNpZ25lZFR4LmdldFRyYW5zYWN0aW9uIGFzICgpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSgpO1xuICAgICAgY29uc3QgdHhCbG9ja2NoYWluSWQgPSAodHJhbnNhY3Rpb24uZ2V0QmxvY2tjaGFpbklEIGFzICgpID0+IHVua25vd24pKCk7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20odHhCbG9ja2NoYWluSWQgYXMgc3RyaW5nKS50b1N0cmluZyhIRVhfRU5DT0RJTkcpID09PSBibG9ja2NoYWluSWQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgT3V0cHV0IGlzIGZyb20gUFZNLlxuICAgKiBPdXRwdXQgY291bGQgYmUgRVZNIG9yIFBWTSBvdXRwdXQuXG4gICAqIEBwYXJhbSB7RGVwcmVjYXRlZE91dHB1dH0gb3V0cHV0XG4gICAqIEByZXR1cm5zIHtib29sZWFufSBvdXRwdXQgaGFzIHRyYW5zZmVyYWJsZSBvdXRwdXQgc3RydWN0dXJlXG4gICAqL1xuICBkZXByZWNhdGVkSXNUcmFuc2ZlcmFibGVPdXRwdXQob3V0cHV0OiBEZXByZWNhdGVkT3V0cHV0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICdnZXRPdXRwdXQnIGluIChvdXRwdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIE91dHB1dCBpcyBmcm9tIFBWTS5cbiAgICogT3V0cHV0IGNvdWxkIGJlIEVWTSBvciBQVk0gb3V0cHV0LlxuICAgKiBAcGFyYW0ge091dHB1dH0gb3V0cHV0XG4gICAqIEByZXR1cm5zIHtib29sZWFufSBvdXRwdXQgaXMgVHJhbnNmZXJhYmxlT3V0cHV0XG4gICAqL1xuICBpc1RyYW5zZmVyYWJsZU91dHB1dChvdXRwdXQ6IE91dHB1dCk6IG91dHB1dCBpcyBUcmFuc2ZlcmFibGVPdXRwdXQge1xuICAgIHJldHVybiB0eXBlb2YgKG91dHB1dCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5nZXRPdXRwdXQgPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWFwcGVyIGZ1bmN0aW9uIHRvIHRoYXQgbmV0d29yayBhZGRyZXNzIHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gbmV0d29yayByZXF1aXJlZCB0byBzdHJpbmdpZnkgYWRkcmVzc2VzXG4gICAqIEByZXR1cm4gbWFwcGVyIGZ1bmN0aW9uXG4gICAqL1xuICBkZXByZWNhdGVkTWFwT3V0cHV0VG9FbnRyeShuZXR3b3JrOiBGbGFyZU5ldHdvcmspOiAob3V0cHV0OiBEZXByZWNhdGVkT3V0cHV0KSA9PiBFbnRyeSB7XG4gICAgcmV0dXJuIChvdXRwdXQ6IERlcHJlY2F0ZWRPdXRwdXQpID0+IHtcbiAgICAgIGlmICh0aGlzLmRlcHJlY2F0ZWRJc1RyYW5zZmVyYWJsZU91dHB1dChvdXRwdXQpKSB7XG4gICAgICAgIC8vIFNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb24gZm9yIEZsYXJlSlNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0cmFuc2ZlcmFibGVPdXRwdXQgPSBvdXRwdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVPdXRwdXQ7XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gdHJhbnNmZXJhYmxlT3V0cHV0LmFtb3VudCgpO1xuXG4gICAgICAgICAgLy8gU2ltcGxpZmllZCBhZGRyZXNzIGhhbmRsaW5nIC0gd291bGQgbmVlZCBwcm9wZXIgRmxhcmVKUyBhZGRyZXNzIHV0aWxpdGllc1xuICAgICAgICAgIGNvbnN0IGFkZHJlc3MgPSBGTEFSRV9BRERSRVNTX1BMQUNFSE9MREVSOyAvLyBUT0RPOiBpbXBsZW1lbnQgcHJvcGVyIGFkZHJlc3MgY29udmVyc2lvblxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBhbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBtYXAgb3V0cHV0OiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGUgRVZNIG91dHB1dCBjYXNlIC0gc2ltcGxpZmllZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiAnMCcsIC8vIFRPRE86IGltcGxlbWVudCBwcm9wZXIgYW1vdW50IGV4dHJhY3Rpb25cbiAgICAgICAgICBhZGRyZXNzOiAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgLy8gVE9ETzogaW1wbGVtZW50IHByb3BlciBhZGRyZXNzIGV4dHJhY3Rpb25cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1hcHBlciBmdW5jdGlvbiB0byB0aGF0IG5ldHdvcmsgYWRkcmVzcyByZXByZXNlbnRhdGlvbi5cbiAgICogQHBhcmFtIG5ldHdvcmsgcmVxdWlyZWQgdG8gc3RyaW5naWZ5IGFkZHJlc3Nlc1xuICAgKiBAcmV0dXJuIG1hcHBlciBmdW5jdGlvblxuICAgKi9cbiAgbWFwT3V0cHV0VG9FbnRyeShuZXR3b3JrOiBGbGFyZU5ldHdvcmspOiAoT3V0cHV0KSA9PiBFbnRyeSB7XG4gICAgcmV0dXJuIChvdXRwdXQ6IE91dHB1dCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNUcmFuc2ZlcmFibGVPdXRwdXQob3V0cHV0KSkge1xuICAgICAgICBjb25zdCB0cmFuc2ZlcmFibGVPdXRwdXQgPSBvdXRwdXQgYXMgVHJhbnNmZXJhYmxlT3V0cHV0O1xuICAgICAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0cmFuc2ZlcmFibGVPdXRwdXQuYW1vdW50KCk7XG5cbiAgICAgICAgLy8gU2ltcGxpZmllZCBhZGRyZXNzIGhhbmRsaW5nIGZvciBGbGFyZUpTXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSAnZmxhcmUtYWRkcmVzcy1wbGFjZWhvbGRlcic7IC8vIFRPRE86IGltcGxlbWVudCBwcm9wZXIgYWRkcmVzcyBjb252ZXJzaW9uXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogb3V0cHV0QW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBvdXRwdXQgdHlwZScpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIGhleCBwcmVmaXggKDB4KVxuICAgKiBAcGFyYW0gaGV4IHN0cmluZ1xuICAgKiBAcmV0dXJucyBoZXggd2l0aG91dCAweFxuICAgKi9cbiAgcmVtb3ZlSGV4UHJlZml4KGhleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoaGV4LnN0YXJ0c1dpdGgoJzB4JykpIHtcbiAgICAgIHJldHVybiBoZXguc3Vic3RyaW5nKDIpO1xuICAgIH1cbiAgICByZXR1cm4gaGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dGlkeCBjb252ZXJ0IGZyb20gbnVtYmVyIChhcyBzdHJpbmcpIHRvIGJ1ZmZlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dGlkeCBudW1iZXJcbiAgICogQHJldHVybiB7QnVmZmVyfSBidWZmZXIgb2Ygc2l6ZSA0IHdpdGggdGhhdCBudW1iZXIgdmFsdWVcbiAgICovXG4gIG91dHB1dGlkeE51bWJlclRvQnVmZmVyKG91dHB1dGlkeDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICBOdW1iZXIob3V0cHV0aWR4KS50b1N0cmluZyhIRVhfUkFESVgpLnBhZFN0YXJ0KE9VVFBVVF9JTkRFWF9IRVhfTEVOR1RILCBQQURTVEFSVF9DSEFSKSxcbiAgICAgIEhFWF9FTkNPRElOR1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0aWR4IGJ1ZmZlciB0byBudW1iZXIgKGFzIHN0cmluZylcbiAgICogQHBhcmFtIHtCdWZmZXJ9IG91dHB1dGlkeFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IG91dHB1dGlkeCBudW1iZXJcbiAgICovXG4gIG91dHB1dGlkeEJ1ZmZlclRvTnVtYmVyKG91dHB1dGlkeDogQnVmZmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGFyc2VJbnQob3V0cHV0aWR4LnRvU3RyaW5nKEhFWF9FTkNPRElORyksIEhFWF9SQURJWCkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHN0cmluZyB0byBieXRlcyBmb3IgRmxhcmVKUyBtZW1vXG4gICAqIEZvbGxvd3MgRmxhcmVKUyB1dGlscy5zdHJpbmdUb0J5dGVzIHBhdHRlcm5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUZXh0IHRvIGNvbnZlcnRcbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXl9IEJ5dGUgYXJyYXlcbiAgICovXG4gIHN0cmluZ1RvQnl0ZXModGV4dDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGJ5dGVzIHRvIHN0cmluZyBmcm9tIEZsYXJlSlMgbWVtb1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzIC0gQnl0ZXMgdG8gY29udmVydFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBEZWNvZGVkIHN0cmluZ1xuICAgKi9cbiAgYnl0ZXNUb1N0cmluZyhieXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShieXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG1lbW8gYnl0ZXMgZnJvbSB2YXJpb3VzIGlucHV0IGZvcm1hdHNcbiAgICogU3VwcG9ydHMgc3RyaW5nLCBKU09OIG9iamVjdCwgb3IgcmF3IGJ5dGVzXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBVaW50OEFycmF5fSBtZW1vIC0gTWVtbyBkYXRhXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBNZW1vIGJ5dGVzIGZvciBGbGFyZUpTXG4gICAqL1xuICBjcmVhdGVNZW1vQnl0ZXMobWVtbzogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgaWYgKG1lbW8gaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1lbW8gPT09IFNUUklOR19UWVBFKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmdUb0J5dGVzKG1lbW8gYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1lbW8gPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmdUb0J5dGVzKEpTT04uc3RyaW5naWZ5KG1lbW8pKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgbWVtbyBmb3JtYXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBtZW1vIGJ5dGVzIHRvIHN0cmluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IG1lbW9CeXRlcyAtIE1lbW8gYnl0ZXMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IERlY29kZWQgbWVtbyBzdHJpbmdcbiAgICovXG4gIHBhcnNlTWVtb0J5dGVzKG1lbW9CeXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgaWYgKG1lbW9CeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnl0ZXNUb1N0cmluZyhtZW1vQnl0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIG1lbW8gc2l6ZSAoRmxhcmVKUyBoYXMgdHJhbnNhY3Rpb24gc2l6ZSBsaW1pdHMpXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gbWVtb0J5dGVzIC0gTWVtbyBieXRlc1xuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4U2l6ZSAtIE1heGltdW0gc2l6ZSBpbiBieXRlcyAoZGVmYXVsdCA0S0IpXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG1lbW8gaXMgd2l0aGluIHNpemUgbGltaXRzXG4gICAqL1xuICB2YWxpZGF0ZU1lbW9TaXplKG1lbW9CeXRlczogVWludDhBcnJheSwgbWF4U2l6ZSA9IDQwOTYpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbWVtb0J5dGVzLmxlbmd0aCA8PSBtYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGVja3N1bSB0byBhIEJ1ZmZlciBhbmQgcmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIHJlc3VsdFxuICAgKi9cbiAgcHJpdmF0ZSBhZGRDaGVja3N1bShidWZmOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IGhhc2hTbGljZSA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShidWZmKS5kaWdlc3QoKS5zbGljZSgyOCk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2J1ZmYsIGhhc2hTbGljZV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIGNoZWNrc3VtIG9uIGEgQnVmZmVyIGFuZCByZXR1cm5zIHRydWUgaWYgdmFsaWQsIGZhbHNlIGlmIG5vdFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNoZWNrc3VtKGJ1ZmY6IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc2hTbGljZSA9IGJ1ZmYuc2xpY2UoYnVmZi5sZW5ndGggLSA0KTtcbiAgICBjb25zdCBjYWxjdWxhdGVkSGFzaFNsaWNlID0gY3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAgIC51cGRhdGUoYnVmZi5zbGljZSgwLCBidWZmLmxlbmd0aCAtIDQpKVxuICAgICAgLmRpZ2VzdCgpXG4gICAgICAuc2xpY2UoMjgpO1xuICAgIHJldHVybiBoYXNoU2xpY2UudG9TdHJpbmcoJ2hleCcpID09PSBjYWxjdWxhdGVkSGFzaFNsaWNlLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGVzIGEgQnVmZmVyIGFzIGEgYmFzZTU4IHN0cmluZyB3aXRoIGNoZWNrc3VtXG4gICAqL1xuICBwdWJsaWMgY2I1OEVuY29kZShieXRlczogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB3aXRoQ2hlY2tzdW0gPSB0aGlzLmFkZENoZWNrc3VtKGJ5dGVzKTtcbiAgICByZXR1cm4gYnM1OC5lbmNvZGUod2l0aENoZWNrc3VtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgYmFzZTU4IHN0cmluZyB3aXRoIGNoZWNrc3VtIHRvIGEgQnVmZmVyXG4gICAqL1xuICBwdWJsaWMgY2I1OERlY29kZShzdHI6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgY29uc3QgZGVjb2RlZCA9IGJzNTguZGVjb2RlKHN0cik7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlQ2hlY2tzdW0oQnVmZmVyLmZyb20oZGVjb2RlZCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2tzdW0nKTtcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlY29kZWQuc2xpY2UoMCwgZGVjb2RlZC5sZW5ndGggLSA0KSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgQ0I1OCAoYmFzZTU4IHdpdGggY2hlY2tzdW0pIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBpc0NCNTgoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jYjU4RGVjb2RlKHN0cik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc1ZhbGlkSWQoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NCNTgoaWQpICYmIHRoaXMuY2I1OERlY29kZShpZCkubGVuZ3RoID09PSBERUNPREVEX0JMT0NLX0lEX0xFTkdUSDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export declare const SEED_ACCOUNT: {
|
|
2
|
+
seed: string;
|
|
3
|
+
privateKey: string;
|
|
4
|
+
publicKey: string;
|
|
5
|
+
xPrivateKey: string;
|
|
6
|
+
xPublicKey: string;
|
|
7
|
+
flrpPrivateKey: string;
|
|
8
|
+
addressMainnet: string;
|
|
9
|
+
addressTestnet: string;
|
|
10
|
+
message: string;
|
|
11
|
+
signature: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const ACCOUNT_1: {
|
|
14
|
+
seed: string;
|
|
15
|
+
privateKey: string;
|
|
16
|
+
publicKey: string;
|
|
17
|
+
xPrivateKey: string;
|
|
18
|
+
xPublicKey: string;
|
|
19
|
+
addressMainnet: string;
|
|
20
|
+
addressTestnet: string;
|
|
21
|
+
};
|
|
22
|
+
export declare const ACCOUNT_2: {
|
|
23
|
+
seed: string;
|
|
24
|
+
privateKey: string;
|
|
25
|
+
publicKey: string;
|
|
26
|
+
xPrivateKey: string;
|
|
27
|
+
xPublicKey: string;
|
|
28
|
+
};
|
|
29
|
+
export declare const ACCOUNT_3: {
|
|
30
|
+
seed: string;
|
|
31
|
+
privateKey: string;
|
|
32
|
+
publicKey: string;
|
|
33
|
+
xPrivateKey: string;
|
|
34
|
+
xPublicKey: string;
|
|
35
|
+
address: string;
|
|
36
|
+
};
|
|
37
|
+
export declare const ACCOUNT_4: {
|
|
38
|
+
seed: string;
|
|
39
|
+
privateKey: string;
|
|
40
|
+
publicKey: string;
|
|
41
|
+
xPrivateKey: string;
|
|
42
|
+
xPublicKey: string;
|
|
43
|
+
address: string;
|
|
44
|
+
};
|
|
45
|
+
export declare const INVALID_SHORT_KEYPAIR_KEY = "82A34E";
|
|
46
|
+
export declare const INVALID_PRIVATE_KEY_ERROR_MESSAGE = "Unsupported private key";
|
|
47
|
+
export declare const INVALID_PUBLIC_KEY_ERROR_MESSAGE = "Unsupported public key";
|
|
48
|
+
export declare const INVALID_LONG_KEYPAIR_PRV: string;
|
|
49
|
+
//# sourceMappingURL=account.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../test/resources/account.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY;;;;;;;;;;;CAcxB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;CAUrB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;CAQrB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;CASrB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;CASrB,CAAC;AAEF,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAElD,eAAO,MAAM,iCAAiC,4BAA4B,CAAC;AAE3E,eAAO,MAAM,gCAAgC,2BAA2B,CAAC;AAEzE,eAAO,MAAM,wBAAwB,QAAiC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.INVALID_LONG_KEYPAIR_PRV = exports.INVALID_PUBLIC_KEY_ERROR_MESSAGE = exports.INVALID_PRIVATE_KEY_ERROR_MESSAGE = exports.INVALID_SHORT_KEYPAIR_KEY = exports.ACCOUNT_4 = exports.ACCOUNT_3 = exports.ACCOUNT_2 = exports.ACCOUNT_1 = exports.SEED_ACCOUNT = void 0;
|
|
4
|
+
exports.SEED_ACCOUNT = {
|
|
5
|
+
seed: '4c3b89f6ca897cb729d2146913877f71',
|
|
6
|
+
privateKey: 'd8f07de5977843949bf4b81b0978117c85f2582c57d7dda9a0450ff3fbef19fe',
|
|
7
|
+
publicKey: '03cd9197658fb563593560b93f8eba2aeb2e4f3781262569b3277b8da7f4f727b2',
|
|
8
|
+
xPrivateKey: 'xprv9s21ZrQH143K3uPT3aSjQNaUYJQX4MyGXmavbDN5WBMAafS3PQ9XV2E5iMXLcNUppNPBh77UynnjMTL35t5BD8vuHqAYq8G3MNEbnEER3BY',
|
|
9
|
+
xPublicKey: 'xpub661MyMwAqRbcGPTv9byjmWXD6LF1Tph7tzWXPbmh4Wt9TTmBvwTn2pYZZeQqnBEH6cTYCQEeYLLkvs7rwDN9cAKrK91rbBs8ixs532ZDZgE',
|
|
10
|
+
flrpPrivateKey: 'PrivateKey-2eYRjENrQkjWdizt6PxxP1DPF3E2w6SYWaiSAMWJwDbqVWxMLW',
|
|
11
|
+
addressMainnet: 'P-flare1uyp5n76gjqltrddur7qlrsmt3kyh8fnrrqwtal',
|
|
12
|
+
addressTestnet: 'P-costwo1uyp5n76gjqltrddur7qlrsmt3kyh8fnrmwhqk7',
|
|
13
|
+
message: 'test message',
|
|
14
|
+
signature: '1692c0a25c84d389e63692ca3b7ebc89835c3b11f6e64a505ddd71664d2a3ae914e0d1be13a824ae97331805650a0631df9ae92ba133f9aa81911f3a56807ba301',
|
|
15
|
+
};
|
|
16
|
+
exports.ACCOUNT_1 = {
|
|
17
|
+
seed: '4c3b89f6ca897cb729d2146913877f71',
|
|
18
|
+
privateKey: 'a533d8419d4518e11cd8d9f049c73a8bdaf003d6602319f967ce3c243e646ba5',
|
|
19
|
+
publicKey: '02a220e5fd108996d0e6c85db43384dcef8884bcaee1203e980f9f99f65ab3d3f3',
|
|
20
|
+
xPrivateKey: 'xprv9s21ZrQH143K4SKxfadM7W3Yq1hhwJgGAFQio8sBqaXADVo8xmQiUe2cy6GwCkwsfDZMSe4W6Gv5vHTsaUF8yoYuzq8KFJPUu2p98RAXKsJ',
|
|
21
|
+
xPublicKey: 'xpub661MyMwAqRbcGvQRmcAMUdzHP3YCLmQ7XULKbXGoPv496J8HWJiy2SM6pMHM89sQnyGiLF46dfzFB5ZRTwRmpiUq2hUkp5YccrcWG5XkS3D',
|
|
22
|
+
addressMainnet: 'P-flare1evum5n0agffrdhg2dm2vg7svfgrra5ruxnmfwk',
|
|
23
|
+
addressTestnet: 'P-costwo1evum5n0agffrdhg2dm2vg7svfgrra5ru7azz9h',
|
|
24
|
+
};
|
|
25
|
+
exports.ACCOUNT_2 = {
|
|
26
|
+
seed: '4c3b89f6ca897cb729d2146913877f71',
|
|
27
|
+
privateKey: '836d24396ff6e952e632b3552fc6591566e8be7c931a6c64fa7f685be9647841',
|
|
28
|
+
publicKey: '03cd4660ac1570473e7107ed1f31425d81a624992bbc5983fd61787c560d8fd420',
|
|
29
|
+
xPrivateKey: 'xprv9s21ZrQH143K2KjD8ytSfLWDfe2585pBJNdadLgwsEKoGLbGdHCKSK5yDnfcmToazd3oPLDXprtXnCvsn9T6MDJz1qwMPaq22oTrzqvyeDQ',
|
|
30
|
+
xPublicKey: 'xprv9s21ZrQH143K2KjD8ytSfLWDfe2585pBJNdadLgwsEKoGLbGdHCKSK5yDnfcmToazd3oPLDXprtXnCvsn9T6MDJz1qwMPaq22oTrzqvyeDQ',
|
|
31
|
+
};
|
|
32
|
+
exports.ACCOUNT_3 = {
|
|
33
|
+
seed: '4c3b89f6ca897cb729d2146913877f71',
|
|
34
|
+
privateKey: '0906840926fcd038f42921709655e8b8b06613272a3ac9040510b7d4b26f09b6',
|
|
35
|
+
publicKey: '029aa4d9f18d2994f2d833c3b9dd17a5ad9b1c3e744f0fe0b4cb1595f8f67fd12c',
|
|
36
|
+
xPrivateKey: 'xprv9s21ZrQH143K4Tto9h1DW3gmMFpxGjSyUS3V1rCUjVEDDm8xzs38GCrsCryjEbrEovHhg12d55mBx4jHK1H19RyuhzJu4GQD9HBqLZCpA6b',
|
|
37
|
+
xPublicKey: 'xpub661MyMwAqRbcGwyGFiYDsBdVuHfSgCApqey5pEc6HpmC6ZU7YQMNp1BM497dJjBnQZmNFPVQFRVLnG3yJvzyA8zGjseifmTq3HkQyq1zHqq',
|
|
38
|
+
address: 'P-costwo1xqr8ps8s6qv5jke9wltc8dc9wm5q7ck2frt5hd',
|
|
39
|
+
};
|
|
40
|
+
exports.ACCOUNT_4 = {
|
|
41
|
+
seed: '4c3b89f6ca897cb729d2146913877f71',
|
|
42
|
+
privateKey: '6d19ef12622ad2e368806483f91445ba832a0cadd73d8585bfd9de59037e79b4',
|
|
43
|
+
publicKey: '026bb5037dce5714dc9427e45eabebd689fc671b9c7ba7b0ffc74c944789ece9d1',
|
|
44
|
+
xPrivateKey: 'xprv9s21ZrQH143K2rNMJAomSkL7i7rSudnEkrm4YWS4nAAPJAQKGqitmezqp5E38uVeLWkzLN7VXnkKy3uqnc3DDXqojQ2rXGLYBwtVRVcRe7d',
|
|
45
|
+
xPublicKey: 'xpub661MyMwAqRbcFLSpQCLmotGrG9gwK6W685gfLtqgLVhNAxjTpP39KTKKfLFBxxptfe4k8KbyzWCPCFbm9xuSUXQNRQTNQoebYiupV8fSPHJ',
|
|
46
|
+
address: 'P-costwo1jvjdvg6jdqez24c5kjxgsu47mqwvpyerk22yl8',
|
|
47
|
+
};
|
|
48
|
+
exports.INVALID_SHORT_KEYPAIR_KEY = '82A34E';
|
|
49
|
+
exports.INVALID_PRIVATE_KEY_ERROR_MESSAGE = 'Unsupported private key';
|
|
50
|
+
exports.INVALID_PUBLIC_KEY_ERROR_MESSAGE = 'Unsupported public key';
|
|
51
|
+
exports.INVALID_LONG_KEYPAIR_PRV = exports.SEED_ACCOUNT.privateKey + 'F1';
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvcmVzb3VyY2VzL2FjY291bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxZQUFZLEdBQUc7SUFDMUIsSUFBSSxFQUFFLGtDQUFrQztJQUN4QyxVQUFVLEVBQUUsa0VBQWtFO0lBQzlFLFNBQVMsRUFBRSxvRUFBb0U7SUFDL0UsV0FBVyxFQUNULGlIQUFpSDtJQUNuSCxVQUFVLEVBQ1IsaUhBQWlIO0lBQ25ILGNBQWMsRUFBRSwrREFBK0Q7SUFDL0UsY0FBYyxFQUFFLGdEQUFnRDtJQUNoRSxjQUFjLEVBQUUsaURBQWlEO0lBQ2pFLE9BQU8sRUFBRSxjQUFjO0lBQ3ZCLFNBQVMsRUFDUCxvSUFBb0k7Q0FDdkksQ0FBQztBQUVXLFFBQUEsU0FBUyxHQUFHO0lBQ3ZCLElBQUksRUFBRSxrQ0FBa0M7SUFDeEMsVUFBVSxFQUFFLGtFQUFrRTtJQUM5RSxTQUFTLEVBQUUsb0VBQW9FO0lBQy9FLFdBQVcsRUFDVCxpSEFBaUg7SUFDbkgsVUFBVSxFQUNSLGlIQUFpSDtJQUNuSCxjQUFjLEVBQUUsZ0RBQWdEO0lBQ2hFLGNBQWMsRUFBRSxpREFBaUQ7Q0FDbEUsQ0FBQztBQUVXLFFBQUEsU0FBUyxHQUFHO0lBQ3ZCLElBQUksRUFBRSxrQ0FBa0M7SUFDeEMsVUFBVSxFQUFFLGtFQUFrRTtJQUM5RSxTQUFTLEVBQUUsb0VBQW9FO0lBQy9FLFdBQVcsRUFDVCxpSEFBaUg7SUFDbkgsVUFBVSxFQUNSLGlIQUFpSDtDQUNwSCxDQUFDO0FBRVcsUUFBQSxTQUFTLEdBQUc7SUFDdkIsSUFBSSxFQUFFLGtDQUFrQztJQUN4QyxVQUFVLEVBQUUsa0VBQWtFO0lBQzlFLFNBQVMsRUFBRSxvRUFBb0U7SUFDL0UsV0FBVyxFQUNULGlIQUFpSDtJQUNuSCxVQUFVLEVBQ1IsaUhBQWlIO0lBQ25ILE9BQU8sRUFBRSxpREFBaUQ7Q0FDM0QsQ0FBQztBQUVXLFFBQUEsU0FBUyxHQUFHO0lBQ3ZCLElBQUksRUFBRSxrQ0FBa0M7SUFDeEMsVUFBVSxFQUFFLGtFQUFrRTtJQUM5RSxTQUFTLEVBQUUsb0VBQW9FO0lBQy9FLFdBQVcsRUFDVCxpSEFBaUg7SUFDbkgsVUFBVSxFQUNSLGlIQUFpSDtJQUNuSCxPQUFPLEVBQUUsaURBQWlEO0NBQzNELENBQUM7QUFFVyxRQUFBLHlCQUF5QixHQUFHLFFBQVEsQ0FBQztBQUVyQyxRQUFBLGlDQUFpQyxHQUFHLHlCQUF5QixDQUFDO0FBRTlELFFBQUEsZ0NBQWdDLEdBQUcsd0JBQXdCLENBQUM7QUFFNUQsUUFBQSx3QkFBd0IsR0FBRyxvQkFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgU0VFRF9BQ0NPVU5UID0ge1xuICBzZWVkOiAnNGMzYjg5ZjZjYTg5N2NiNzI5ZDIxNDY5MTM4NzdmNzEnLFxuICBwcml2YXRlS2V5OiAnZDhmMDdkZTU5Nzc4NDM5NDliZjRiODFiMDk3ODExN2M4NWYyNTgyYzU3ZDdkZGE5YTA0NTBmZjNmYmVmMTlmZScsXG4gIHB1YmxpY0tleTogJzAzY2Q5MTk3NjU4ZmI1NjM1OTM1NjBiOTNmOGViYTJhZWIyZTRmMzc4MTI2MjU2OWIzMjc3YjhkYTdmNGY3MjdiMicsXG4gIHhQcml2YXRlS2V5OlxuICAgICd4cHJ2OXMyMVpyUUgxNDNLM3VQVDNhU2pRTmFVWUpRWDRNeUdYbWF2YkRONVdCTUFhZlMzUFE5WFYyRTVpTVhMY05VcHBOUEJoNzdVeW5uak1UTDM1dDVCRDh2dUhxQVlxOEczTU5FYm5FRVIzQlknLFxuICB4UHVibGljS2V5OlxuICAgICd4cHViNjYxTXlNd0FxUmJjR1BUdjlieWptV1hENkxGMVRwaDd0eldYUGJtaDRXdDlUVG1CdndUbjJwWVpaZVFxbkJFSDZjVFlDUUVlWUxMa3ZzN3J3RE45Y0FLcks5MXJiQnM4aXhzNTMyWkRaZ0UnLFxuICBmbHJwUHJpdmF0ZUtleTogJ1ByaXZhdGVLZXktMmVZUmpFTnJRa2pXZGl6dDZQeHhQMURQRjNFMnc2U1lXYWlTQU1XSndEYnFWV3hNTFcnLFxuICBhZGRyZXNzTWFpbm5ldDogJ1AtZmxhcmUxdXlwNW43NmdqcWx0cmRkdXI3cWxyc210M2t5aDhmbnJycXd0YWwnLFxuICBhZGRyZXNzVGVzdG5ldDogJ1AtY29zdHdvMXV5cDVuNzZnanFsdHJkZHVyN3FscnNtdDNreWg4Zm5ybXdocWs3JyxcbiAgbWVzc2FnZTogJ3Rlc3QgbWVzc2FnZScsXG4gIHNpZ25hdHVyZTpcbiAgICAnMTY5MmMwYTI1Yzg0ZDM4OWU2MzY5MmNhM2I3ZWJjODk4MzVjM2IxMWY2ZTY0YTUwNWRkZDcxNjY0ZDJhM2FlOTE0ZTBkMWJlMTNhODI0YWU5NzMzMTgwNTY1MGEwNjMxZGY5YWU5MmJhMTMzZjlhYTgxOTExZjNhNTY4MDdiYTMwMScsXG59O1xuXG5leHBvcnQgY29uc3QgQUNDT1VOVF8xID0ge1xuICBzZWVkOiAnNGMzYjg5ZjZjYTg5N2NiNzI5ZDIxNDY5MTM4NzdmNzEnLFxuICBwcml2YXRlS2V5OiAnYTUzM2Q4NDE5ZDQ1MThlMTFjZDhkOWYwNDljNzNhOGJkYWYwMDNkNjYwMjMxOWY5NjdjZTNjMjQzZTY0NmJhNScsXG4gIHB1YmxpY0tleTogJzAyYTIyMGU1ZmQxMDg5OTZkMGU2Yzg1ZGI0MzM4NGRjZWY4ODg0YmNhZWUxMjAzZTk4MGY5Zjk5ZjY1YWIzZDNmMycsXG4gIHhQcml2YXRlS2V5OlxuICAgICd4cHJ2OXMyMVpyUUgxNDNLNFNLeGZhZE03VzNZcTFoaHdKZ0dBRlFpbzhzQnFhWEFEVm84eG1RaVVlMmN5Nkd3Q2t3c2ZEWk1TZTRXNkd2NXZIVHNhVUY4eW9ZdXpxOEtGSlBVdTJwOThSQVhLc0onLFxuICB4UHVibGljS2V5OlxuICAgICd4cHViNjYxTXlNd0FxUmJjR3ZRUm1jQU1VZHpIUDNZQ0xtUTdYVUxLYlhHb1B2NDk2SjhIV0ppeTJTTTZwTUhNODlzUW55R2lMRjQ2ZGZ6RkI1WlJUd1JtcGlVcTJoVWtwNVljY3JjV0c1WGtTM0QnLFxuICBhZGRyZXNzTWFpbm5ldDogJ1AtZmxhcmUxZXZ1bTVuMGFnZmZyZGhnMmRtMnZnN3N2ZmdycmE1cnV4bm1md2snLFxuICBhZGRyZXNzVGVzdG5ldDogJ1AtY29zdHdvMWV2dW01bjBhZ2ZmcmRoZzJkbTJ2ZzdzdmZncnJhNXJ1N2F6ejloJyxcbn07XG5cbmV4cG9ydCBjb25zdCBBQ0NPVU5UXzIgPSB7XG4gIHNlZWQ6ICc0YzNiODlmNmNhODk3Y2I3MjlkMjE0NjkxMzg3N2Y3MScsXG4gIHByaXZhdGVLZXk6ICc4MzZkMjQzOTZmZjZlOTUyZTYzMmIzNTUyZmM2NTkxNTY2ZThiZTdjOTMxYTZjNjRmYTdmNjg1YmU5NjQ3ODQxJyxcbiAgcHVibGljS2V5OiAnMDNjZDQ2NjBhYzE1NzA0NzNlNzEwN2VkMWYzMTQyNWQ4MWE2MjQ5OTJiYmM1OTgzZmQ2MTc4N2M1NjBkOGZkNDIwJyxcbiAgeFByaXZhdGVLZXk6XG4gICAgJ3hwcnY5czIxWnJRSDE0M0syS2pEOHl0U2ZMV0RmZTI1ODVwQkpOZGFkTGd3c0VLb0dMYkdkSENLU0s1eURuZmNtVG9hemQzb1BMRFhwcnRYbkN2c245VDZNREp6MXF3TVBhcTIyb1RyenF2eWVEUScsXG4gIHhQdWJsaWNLZXk6XG4gICAgJ3hwcnY5czIxWnJRSDE0M0syS2pEOHl0U2ZMV0RmZTI1ODVwQkpOZGFkTGd3c0VLb0dMYkdkSENLU0s1eURuZmNtVG9hemQzb1BMRFhwcnRYbkN2c245VDZNREp6MXF3TVBhcTIyb1RyenF2eWVEUScsXG59O1xuXG5leHBvcnQgY29uc3QgQUNDT1VOVF8zID0ge1xuICBzZWVkOiAnNGMzYjg5ZjZjYTg5N2NiNzI5ZDIxNDY5MTM4NzdmNzEnLFxuICBwcml2YXRlS2V5OiAnMDkwNjg0MDkyNmZjZDAzOGY0MjkyMTcwOTY1NWU4YjhiMDY2MTMyNzJhM2FjOTA0MDUxMGI3ZDRiMjZmMDliNicsXG4gIHB1YmxpY0tleTogJzAyOWFhNGQ5ZjE4ZDI5OTRmMmQ4MzNjM2I5ZGQxN2E1YWQ5YjFjM2U3NDRmMGZlMGI0Y2IxNTk1ZjhmNjdmZDEyYycsXG4gIHhQcml2YXRlS2V5OlxuICAgICd4cHJ2OXMyMVpyUUgxNDNLNFR0bzloMURXM2dtTUZweEdqU3lVUzNWMXJDVWpWRUREbTh4enMzOEdDcnNDcnlqRWJyRW92SGhnMTJkNTVtQng0akhLMUgxOVJ5dWh6SnU0R1FEOUhCcUxaQ3BBNmInLFxuICB4UHVibGljS2V5OlxuICAgICd4cHViNjYxTXlNd0FxUmJjR3d5R0ZpWURzQmRWdUhmU2dDQXBxZXk1cEVjNkhwbUM2WlU3WVFNTnAxQk00OTdkSmpCblFabU5GUFZRRlJWTG5HM3lKdnp5QTh6R2pzZWlmbVRxM0hrUXlxMXpIcXEnLFxuICBhZGRyZXNzOiAnUC1jb3N0d28xeHFyOHBzOHM2cXY1amtlOXdsdGM4ZGM5d201cTdjazJmcnQ1aGQnLFxufTtcblxuZXhwb3J0IGNvbnN0IEFDQ09VTlRfNCA9IHtcbiAgc2VlZDogJzRjM2I4OWY2Y2E4OTdjYjcyOWQyMTQ2OTEzODc3ZjcxJyxcbiAgcHJpdmF0ZUtleTogJzZkMTllZjEyNjIyYWQyZTM2ODgwNjQ4M2Y5MTQ0NWJhODMyYTBjYWRkNzNkODU4NWJmZDlkZTU5MDM3ZTc5YjQnLFxuICBwdWJsaWNLZXk6ICcwMjZiYjUwMzdkY2U1NzE0ZGM5NDI3ZTQ1ZWFiZWJkNjg5ZmM2NzFiOWM3YmE3YjBmZmM3NGM5NDQ3ODllY2U5ZDEnLFxuICB4UHJpdmF0ZUtleTpcbiAgICAneHBydjlzMjFaclFIMTQzSzJyTk1KQW9tU2tMN2k3clN1ZG5Fa3JtNFlXUzRuQUFQSkFRS0dxaXRtZXpxcDVFMzh1VmVMV2t6TE43Vlhua0t5M3VxbmMzRERYcW9qUTJyWEdMWUJ3dFZSVmNSZTdkJyxcbiAgeFB1YmxpY0tleTpcbiAgICAneHB1YjY2MU15TXdBcVJiY0ZMU3BRQ0xtb3RHckc5Z3dLNlc2ODVnZkx0cWdMVmhOQXhqVHBQMzlLVEtLZkxGQnh4cHRmZTRrOEtieXpXQ1BDRmJtOXh1U1VYUU5SUVROUW9lYllpdXBWOGZTUEhKJyxcbiAgYWRkcmVzczogJ1AtY29zdHdvMWp2amR2ZzZqZHFlejI0YzVranhnc3U0N21xd3ZweWVyazIyeWw4Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBJTlZBTElEX1NIT1JUX0tFWVBBSVJfS0VZID0gJzgyQTM0RSc7XG5cbmV4cG9ydCBjb25zdCBJTlZBTElEX1BSSVZBVEVfS0VZX0VSUk9SX01FU1NBR0UgPSAnVW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXknO1xuXG5leHBvcnQgY29uc3QgSU5WQUxJRF9QVUJMSUNfS0VZX0VSUk9SX01FU1NBR0UgPSAnVW5zdXBwb3J0ZWQgcHVibGljIGtleSc7XG5cbmV4cG9ydCBjb25zdCBJTlZBTElEX0xPTkdfS0VZUEFJUl9QUlYgPSBTRUVEX0FDQ09VTlQucHJpdmF0ZUtleSArICdGMSc7XG4iXX0=
|