@bitgo/sdk-lib-mpc 10.12.0 → 10.14.0
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/tss/eddsa-mps/derive.d.ts +18 -0
- package/dist/src/tss/eddsa-mps/derive.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/derive.js +51 -0
- package/dist/src/tss/eddsa-mps/dkg.d.ts +3 -1
- package/dist/src/tss/eddsa-mps/dkg.d.ts.map +1 -1
- package/dist/src/tss/eddsa-mps/dkg.js +7 -3
- package/dist/src/tss/eddsa-mps/dsg.d.ts +2 -0
- package/dist/src/tss/eddsa-mps/dsg.d.ts.map +1 -1
- package/dist/src/tss/eddsa-mps/dsg.js +7 -1
- package/dist/src/tss/eddsa-mps/index.d.ts +1 -0
- package/dist/src/tss/eddsa-mps/index.d.ts.map +1 -1
- package/dist/src/tss/eddsa-mps/index.js +4 -2
- package/dist/src/tss/eddsa-mps/types.d.ts +2 -0
- package/dist/src/tss/eddsa-mps/types.d.ts.map +1 -1
- package/dist/src/tss/eddsa-mps/types.js +3 -1
- package/dist/src/tss/eddsa-mps/util.d.ts +26 -0
- package/dist/src/tss/eddsa-mps/util.d.ts.map +1 -1
- package/dist/src/tss/eddsa-mps/util.js +82 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -1,6 +1,15 @@
|
|
|
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.concatBytes = concatBytes;
|
|
7
|
+
exports.generateEdDsaDKGKeyShares = generateEdDsaDKGKeyShares;
|
|
8
|
+
exports.executeTillRound = executeTillRound;
|
|
9
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
10
|
+
const assert_1 = __importDefault(require("assert"));
|
|
11
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
12
|
+
const dkg_1 = require("./dkg");
|
|
4
13
|
/**
|
|
5
14
|
* Concatenates multiple Uint8Array instances into a single Uint8Array
|
|
6
15
|
* @param chunks - Array of Uint8Array instances to concatenate
|
|
@@ -10,4 +19,76 @@ function concatBytes(chunks) {
|
|
|
10
19
|
const buffers = chunks.map((chunk) => Buffer.from(chunk));
|
|
11
20
|
return new Uint8Array(Buffer.concat(buffers));
|
|
12
21
|
}
|
|
13
|
-
|
|
22
|
+
function generateX25519Keypair(seed) {
|
|
23
|
+
const privKey = seed ? seed.subarray(0, 32) : crypto_1.default.randomBytes(32);
|
|
24
|
+
const pubKey = Buffer.from(ed25519_1.x25519.getPublicKey(privKey));
|
|
25
|
+
return { privKey: Buffer.from(privKey), pubKey };
|
|
26
|
+
}
|
|
27
|
+
function validateSeed(seed) {
|
|
28
|
+
(0, assert_1.default)(!seed?.encKey || seed.encKey.length >= 32, 'encKey must be at least 32 bytes');
|
|
29
|
+
(0, assert_1.default)(!seed?.dkgSeed || seed.dkgSeed.length >= 32, 'dkgSeed must be at least 32 bytes');
|
|
30
|
+
return seed ?? {};
|
|
31
|
+
}
|
|
32
|
+
/** See `EdDsaDKGPartySeed`. Mirrors `DklsUtils.generateDKGKeyShares` for ECDSA DKLS. */
|
|
33
|
+
async function generateEdDsaDKGKeyShares(seedUser, seedBackup, seedBitgo) {
|
|
34
|
+
const { encKey: userEncKey, dkgSeed: userDkgSeed } = validateSeed(seedUser);
|
|
35
|
+
const { encKey: backupEncKey, dkgSeed: backupDkgSeed } = validateSeed(seedBackup);
|
|
36
|
+
const { encKey: bitgoEncKey, dkgSeed: bitgoDkgSeed } = validateSeed(seedBitgo);
|
|
37
|
+
const user = new dkg_1.DKG(3, 2, 0);
|
|
38
|
+
const backup = new dkg_1.DKG(3, 2, 1);
|
|
39
|
+
const bitgo = new dkg_1.DKG(3, 2, 2);
|
|
40
|
+
const userKP = generateX25519Keypair(userEncKey);
|
|
41
|
+
const backupKP = generateX25519Keypair(backupEncKey);
|
|
42
|
+
const bitgoKP = generateX25519Keypair(bitgoEncKey);
|
|
43
|
+
await user.initDkg(userKP.privKey, [backupKP.pubKey, bitgoKP.pubKey]);
|
|
44
|
+
await backup.initDkg(backupKP.privKey, [userKP.pubKey, bitgoKP.pubKey]);
|
|
45
|
+
await bitgo.initDkg(bitgoKP.privKey, [userKP.pubKey, backupKP.pubKey]);
|
|
46
|
+
const r1Messages = [
|
|
47
|
+
user.getFirstMessage(userDkgSeed),
|
|
48
|
+
backup.getFirstMessage(backupDkgSeed),
|
|
49
|
+
bitgo.getFirstMessage(bitgoDkgSeed),
|
|
50
|
+
];
|
|
51
|
+
const r2Messages = [
|
|
52
|
+
...user.handleIncomingMessages(r1Messages),
|
|
53
|
+
...backup.handleIncomingMessages(r1Messages),
|
|
54
|
+
...bitgo.handleIncomingMessages(r1Messages),
|
|
55
|
+
];
|
|
56
|
+
user.handleIncomingMessages(r2Messages);
|
|
57
|
+
backup.handleIncomingMessages(r2Messages);
|
|
58
|
+
bitgo.handleIncomingMessages(r2Messages);
|
|
59
|
+
return [user, backup, bitgo];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Initializes two DSG parties and drives them through the protocol until the specified round.
|
|
63
|
+
*
|
|
64
|
+
* @param round - Round to execute until (1–3). Returns intermediate message arrays for 1–2,
|
|
65
|
+
* or the 64-byte Ed25519 signature Buffer for 3.
|
|
66
|
+
* @param party1Dsg - First DSG party (`new DSG(partyIdx)`), not yet initialized.
|
|
67
|
+
* @param party2Dsg - Second DSG party (`new DSG(partyIdx)`), not yet initialized.
|
|
68
|
+
* @param keyShare1 - Key share for the first party.
|
|
69
|
+
* @param keyShare2 - Key share for the second party.
|
|
70
|
+
* @param message - Raw message bytes to sign.
|
|
71
|
+
* @param derivationPath - BIP-32-style derivation path, e.g. `"m"` or `"m/0/0"`.
|
|
72
|
+
*/
|
|
73
|
+
function executeTillRound(round, party1Dsg, party2Dsg, keyShare1, keyShare2, message, derivationPath) {
|
|
74
|
+
if (round < 1 || round > 3) {
|
|
75
|
+
throw Error('Invalid round number');
|
|
76
|
+
}
|
|
77
|
+
party1Dsg.initDsg(keyShare1, message, derivationPath, party2Dsg.getPartyIdx());
|
|
78
|
+
party2Dsg.initDsg(keyShare2, message, derivationPath, party1Dsg.getPartyIdx());
|
|
79
|
+
const party1Round0Message = party1Dsg.getFirstMessage();
|
|
80
|
+
const party2Round0Message = party2Dsg.getFirstMessage();
|
|
81
|
+
const [party2Round1Messages] = party2Dsg.handleIncomingMessages([party1Round0Message, party2Round0Message]);
|
|
82
|
+
const [party1Round1Messages] = party1Dsg.handleIncomingMessages([party1Round0Message, party2Round0Message]);
|
|
83
|
+
if (round === 1)
|
|
84
|
+
return [[party1Round1Messages], [party2Round1Messages]];
|
|
85
|
+
const [party1Round2Messages] = party1Dsg.handleIncomingMessages([party1Round1Messages, party2Round1Messages]);
|
|
86
|
+
const [party2Round2Messages] = party2Dsg.handleIncomingMessages([party1Round1Messages, party2Round1Messages]);
|
|
87
|
+
if (round === 2)
|
|
88
|
+
return [[party1Round2Messages], [party2Round2Messages]];
|
|
89
|
+
party1Dsg.handleIncomingMessages([party1Round2Messages, party2Round2Messages]);
|
|
90
|
+
party2Dsg.handleIncomingMessages([party1Round2Messages, party2Round2Messages]);
|
|
91
|
+
(0, assert_1.default)(party1Dsg.getSignature().toString('hex') === party2Dsg.getSignature().toString('hex'));
|
|
92
|
+
return party1Dsg.getSignature();
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWRkc2EtbXBzL3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFZQSxrQ0FHQztBQXdCRCw4REFzQ0M7QUFjRCw0Q0E4QkM7QUF6SEQsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixtREFBK0M7QUFDL0MsK0JBQTRCO0FBSTVCOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQUMsTUFBb0I7SUFDOUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFELE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLElBQWE7SUFDMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNuRCxDQUFDO0FBV0QsU0FBUyxZQUFZLENBQUMsSUFBd0I7SUFDNUMsSUFBQSxnQkFBTSxFQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztJQUN0RixJQUFBLGdCQUFNLEVBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3pGLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsd0ZBQXdGO0FBQ2pGLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsUUFBNEIsRUFDNUIsVUFBOEIsRUFDOUIsU0FBNkI7SUFFN0IsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFL0UsTUFBTSxJQUFJLEdBQUcsSUFBSSxTQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksU0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFL0IsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckQsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFbkQsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RSxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFdkUsTUFBTSxVQUFVLEdBQUc7UUFDakIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUM7UUFDakMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUM7UUFDckMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7S0FDcEMsQ0FBQztJQUVGLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQztRQUMxQyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUM7UUFDNUMsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDO0tBQzVDLENBQUM7SUFFRixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV6QyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FDOUIsS0FBYSxFQUNiLFNBQWMsRUFDZCxTQUFjLEVBQ2QsU0FBaUIsRUFDakIsU0FBaUIsRUFDakIsT0FBZSxFQUNmLGNBQXNCO0lBRXRCLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMvRSxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3hELE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBRXhELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUM1RyxNQUFNLENBQUMsb0JBQW9CLENBQUMsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDNUcsSUFBSSxLQUFLLEtBQUssQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFFekUsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQzlHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUM5RyxJQUFJLEtBQUssS0FBSyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUV6RSxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFDL0UsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBRS9FLElBQUEsZ0JBQU0sRUFBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RixPQUFPLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgeDI1NTE5IH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9lZDI1NTE5JztcbmltcG9ydCB7IERLRyB9IGZyb20gJy4vZGtnJztcbmltcG9ydCB7IERTRyB9IGZyb20gJy4vZHNnJztcbmltcG9ydCB7IERlc2VyaWFsaXplZE1lc3NhZ2VzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIG11bHRpcGxlIFVpbnQ4QXJyYXkgaW5zdGFuY2VzIGludG8gYSBzaW5nbGUgVWludDhBcnJheVxuICogQHBhcmFtIGNodW5rcyAtIEFycmF5IG9mIFVpbnQ4QXJyYXkgaW5zdGFuY2VzIHRvIGNvbmNhdGVuYXRlXG4gKiBAcmV0dXJucyBDb25jYXRlbmF0ZWQgVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0Qnl0ZXMoY2h1bmtzOiBVaW50OEFycmF5W10pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgYnVmZmVycyA9IGNodW5rcy5tYXAoKGNodW5rKSA9PiBCdWZmZXIuZnJvbShjaHVuaykpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmNvbmNhdChidWZmZXJzKSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlWDI1NTE5S2V5cGFpcihzZWVkPzogQnVmZmVyKTogeyBwcml2S2V5OiBCdWZmZXI7IHB1YktleTogQnVmZmVyIH0ge1xuICBjb25zdCBwcml2S2V5ID0gc2VlZCA/IHNlZWQuc3ViYXJyYXkoMCwgMzIpIDogY3J5cHRvLnJhbmRvbUJ5dGVzKDMyKTtcbiAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oeDI1NTE5LmdldFB1YmxpY0tleShwcml2S2V5KSk7XG4gIHJldHVybiB7IHByaXZLZXk6IEJ1ZmZlci5mcm9tKHByaXZLZXkpLCBwdWJLZXkgfTtcbn1cblxuLyoqXG4gKiBQZXItcGFydHkgZGV0ZXJtaW5pc3RpYyBzZWVkIG1hdGVyaWFsLiBUbyB1c2UgdGhlIHNhbWUgc2VlZCBmb3IgYm90aCwgcGFzcyBpdCBhcyBib3RoIGZpZWxkcy5cbiAqIGBlbmNLZXlgIHNlZWRzIHRoZSBYMjU1MTkgZW5jcnlwdGlvbiBrZXk7IGBka2dTZWVkYCBzZWVkcyBES0cgcm91bmQgMC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZERzYURLR1BhcnR5U2VlZCB7XG4gIGVuY0tleT86IEJ1ZmZlcjtcbiAgZGtnU2VlZD86IEJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTZWVkKHNlZWQ/OiBFZERzYURLR1BhcnR5U2VlZCk6IEVkRHNhREtHUGFydHlTZWVkIHtcbiAgYXNzZXJ0KCFzZWVkPy5lbmNLZXkgfHwgc2VlZC5lbmNLZXkubGVuZ3RoID49IDMyLCAnZW5jS2V5IG11c3QgYmUgYXQgbGVhc3QgMzIgYnl0ZXMnKTtcbiAgYXNzZXJ0KCFzZWVkPy5ka2dTZWVkIHx8IHNlZWQuZGtnU2VlZC5sZW5ndGggPj0gMzIsICdka2dTZWVkIG11c3QgYmUgYXQgbGVhc3QgMzIgYnl0ZXMnKTtcbiAgcmV0dXJuIHNlZWQgPz8ge307XG59XG5cbi8qKiBTZWUgYEVkRHNhREtHUGFydHlTZWVkYC4gTWlycm9ycyBgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzYCBmb3IgRUNEU0EgREtMUy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkRHNhREtHS2V5U2hhcmVzKFxuICBzZWVkVXNlcj86IEVkRHNhREtHUGFydHlTZWVkLFxuICBzZWVkQmFja3VwPzogRWREc2FES0dQYXJ0eVNlZWQsXG4gIHNlZWRCaXRnbz86IEVkRHNhREtHUGFydHlTZWVkXG4pOiBQcm9taXNlPFtES0csIERLRywgREtHXT4ge1xuICBjb25zdCB7IGVuY0tleTogdXNlckVuY0tleSwgZGtnU2VlZDogdXNlckRrZ1NlZWQgfSA9IHZhbGlkYXRlU2VlZChzZWVkVXNlcik7XG4gIGNvbnN0IHsgZW5jS2V5OiBiYWNrdXBFbmNLZXksIGRrZ1NlZWQ6IGJhY2t1cERrZ1NlZWQgfSA9IHZhbGlkYXRlU2VlZChzZWVkQmFja3VwKTtcbiAgY29uc3QgeyBlbmNLZXk6IGJpdGdvRW5jS2V5LCBka2dTZWVkOiBiaXRnb0RrZ1NlZWQgfSA9IHZhbGlkYXRlU2VlZChzZWVkQml0Z28pO1xuXG4gIGNvbnN0IHVzZXIgPSBuZXcgREtHKDMsIDIsIDApO1xuICBjb25zdCBiYWNrdXAgPSBuZXcgREtHKDMsIDIsIDEpO1xuICBjb25zdCBiaXRnbyA9IG5ldyBES0coMywgMiwgMik7XG5cbiAgY29uc3QgdXNlcktQID0gZ2VuZXJhdGVYMjU1MTlLZXlwYWlyKHVzZXJFbmNLZXkpO1xuICBjb25zdCBiYWNrdXBLUCA9IGdlbmVyYXRlWDI1NTE5S2V5cGFpcihiYWNrdXBFbmNLZXkpO1xuICBjb25zdCBiaXRnb0tQID0gZ2VuZXJhdGVYMjU1MTlLZXlwYWlyKGJpdGdvRW5jS2V5KTtcblxuICBhd2FpdCB1c2VyLmluaXREa2codXNlcktQLnByaXZLZXksIFtiYWNrdXBLUC5wdWJLZXksIGJpdGdvS1AucHViS2V5XSk7XG4gIGF3YWl0IGJhY2t1cC5pbml0RGtnKGJhY2t1cEtQLnByaXZLZXksIFt1c2VyS1AucHViS2V5LCBiaXRnb0tQLnB1YktleV0pO1xuICBhd2FpdCBiaXRnby5pbml0RGtnKGJpdGdvS1AucHJpdktleSwgW3VzZXJLUC5wdWJLZXksIGJhY2t1cEtQLnB1YktleV0pO1xuXG4gIGNvbnN0IHIxTWVzc2FnZXMgPSBbXG4gICAgdXNlci5nZXRGaXJzdE1lc3NhZ2UodXNlckRrZ1NlZWQpLFxuICAgIGJhY2t1cC5nZXRGaXJzdE1lc3NhZ2UoYmFja3VwRGtnU2VlZCksXG4gICAgYml0Z28uZ2V0Rmlyc3RNZXNzYWdlKGJpdGdvRGtnU2VlZCksXG4gIF07XG5cbiAgY29uc3QgcjJNZXNzYWdlcyA9IFtcbiAgICAuLi51c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMocjFNZXNzYWdlcyksXG4gICAgLi4uYmFja3VwLmhhbmRsZUluY29taW5nTWVzc2FnZXMocjFNZXNzYWdlcyksXG4gICAgLi4uYml0Z28uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyMU1lc3NhZ2VzKSxcbiAgXTtcblxuICB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMocjJNZXNzYWdlcyk7XG4gIGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHIyTWVzc2FnZXMpO1xuICBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHIyTWVzc2FnZXMpO1xuXG4gIHJldHVybiBbdXNlciwgYmFja3VwLCBiaXRnb107XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdHdvIERTRyBwYXJ0aWVzIGFuZCBkcml2ZXMgdGhlbSB0aHJvdWdoIHRoZSBwcm90b2NvbCB1bnRpbCB0aGUgc3BlY2lmaWVkIHJvdW5kLlxuICpcbiAqIEBwYXJhbSByb3VuZCAtIFJvdW5kIHRvIGV4ZWN1dGUgdW50aWwgKDHigJMzKS4gUmV0dXJucyBpbnRlcm1lZGlhdGUgbWVzc2FnZSBhcnJheXMgZm9yIDHigJMyLFxuICogICBvciB0aGUgNjQtYnl0ZSBFZDI1NTE5IHNpZ25hdHVyZSBCdWZmZXIgZm9yIDMuXG4gKiBAcGFyYW0gcGFydHkxRHNnIC0gRmlyc3QgRFNHIHBhcnR5IChgbmV3IERTRyhwYXJ0eUlkeClgKSwgbm90IHlldCBpbml0aWFsaXplZC5cbiAqIEBwYXJhbSBwYXJ0eTJEc2cgLSBTZWNvbmQgRFNHIHBhcnR5IChgbmV3IERTRyhwYXJ0eUlkeClgKSwgbm90IHlldCBpbml0aWFsaXplZC5cbiAqIEBwYXJhbSBrZXlTaGFyZTEgLSBLZXkgc2hhcmUgZm9yIHRoZSBmaXJzdCBwYXJ0eS5cbiAqIEBwYXJhbSBrZXlTaGFyZTIgLSBLZXkgc2hhcmUgZm9yIHRoZSBzZWNvbmQgcGFydHkuXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24uXG4gKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggLSBCSVAtMzItc3R5bGUgZGVyaXZhdGlvbiBwYXRoLCBlLmcuIGBcIm1cImAgb3IgYFwibS8wLzBcImAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlVGlsbFJvdW5kKFxuICByb3VuZDogbnVtYmVyLFxuICBwYXJ0eTFEc2c6IERTRyxcbiAgcGFydHkyRHNnOiBEU0csXG4gIGtleVNoYXJlMTogQnVmZmVyLFxuICBrZXlTaGFyZTI6IEJ1ZmZlcixcbiAgbWVzc2FnZTogQnVmZmVyLFxuICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nXG4pOiBEZXNlcmlhbGl6ZWRNZXNzYWdlc1tdIHwgQnVmZmVyIHtcbiAgaWYgKHJvdW5kIDwgMSB8fCByb3VuZCA+IDMpIHtcbiAgICB0aHJvdyBFcnJvcignSW52YWxpZCByb3VuZCBudW1iZXInKTtcbiAgfVxuICBwYXJ0eTFEc2cuaW5pdERzZyhrZXlTaGFyZTEsIG1lc3NhZ2UsIGRlcml2YXRpb25QYXRoLCBwYXJ0eTJEc2cuZ2V0UGFydHlJZHgoKSk7XG4gIHBhcnR5MkRzZy5pbml0RHNnKGtleVNoYXJlMiwgbWVzc2FnZSwgZGVyaXZhdGlvblBhdGgsIHBhcnR5MURzZy5nZXRQYXJ0eUlkeCgpKTtcbiAgY29uc3QgcGFydHkxUm91bmQwTWVzc2FnZSA9IHBhcnR5MURzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgY29uc3QgcGFydHkyUm91bmQwTWVzc2FnZSA9IHBhcnR5MkRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcblxuICBjb25zdCBbcGFydHkyUm91bmQxTWVzc2FnZXNdID0gcGFydHkyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3BhcnR5MVJvdW5kME1lc3NhZ2UsIHBhcnR5MlJvdW5kME1lc3NhZ2VdKTtcbiAgY29uc3QgW3BhcnR5MVJvdW5kMU1lc3NhZ2VzXSA9IHBhcnR5MURzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtwYXJ0eTFSb3VuZDBNZXNzYWdlLCBwYXJ0eTJSb3VuZDBNZXNzYWdlXSk7XG4gIGlmIChyb3VuZCA9PT0gMSkgcmV0dXJuIFtbcGFydHkxUm91bmQxTWVzc2FnZXNdLCBbcGFydHkyUm91bmQxTWVzc2FnZXNdXTtcblxuICBjb25zdCBbcGFydHkxUm91bmQyTWVzc2FnZXNdID0gcGFydHkxRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3BhcnR5MVJvdW5kMU1lc3NhZ2VzLCBwYXJ0eTJSb3VuZDFNZXNzYWdlc10pO1xuICBjb25zdCBbcGFydHkyUm91bmQyTWVzc2FnZXNdID0gcGFydHkyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3BhcnR5MVJvdW5kMU1lc3NhZ2VzLCBwYXJ0eTJSb3VuZDFNZXNzYWdlc10pO1xuICBpZiAocm91bmQgPT09IDIpIHJldHVybiBbW3BhcnR5MVJvdW5kMk1lc3NhZ2VzXSwgW3BhcnR5MlJvdW5kMk1lc3NhZ2VzXV07XG5cbiAgcGFydHkxRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3BhcnR5MVJvdW5kMk1lc3NhZ2VzLCBwYXJ0eTJSb3VuZDJNZXNzYWdlc10pO1xuICBwYXJ0eTJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcGFydHkxUm91bmQyTWVzc2FnZXMsIHBhcnR5MlJvdW5kMk1lc3NhZ2VzXSk7XG5cbiAgYXNzZXJ0KHBhcnR5MURzZy5nZXRTaWduYXR1cmUoKS50b1N0cmluZygnaGV4JykgPT09IHBhcnR5MkRzZy5nZXRTaWduYXR1cmUoKS50b1N0cmluZygnaGV4JykpO1xuICByZXR1cm4gcGFydHkxRHNnLmdldFNpZ25hdHVyZSgpO1xufVxuIl19
|