@bitgo/sdk-core 38.22.0 → 38.23.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/bitgo/errors.d.ts +2 -1
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +3 -2
- package/dist/src/bitgo/safe/index.d.ts +1 -0
- package/dist/src/bitgo/safe/index.d.ts.map +1 -1
- package/dist/src/bitgo/safe/index.js +2 -1
- package/dist/src/bitgo/safe/recovery.d.ts +92 -0
- package/dist/src/bitgo/safe/recovery.d.ts.map +1 -0
- package/dist/src/bitgo/safe/recovery.js +148 -0
- package/dist/test/unit/bitgo/recovery/initiate.js +1 -30
- package/dist/test/unit/bitgo/safe/recovery.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/recovery.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/recovery.js +313 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -36,15 +36,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
require("should");
|
|
37
37
|
const sinon = __importStar(require("sinon"));
|
|
38
38
|
const sjcl = __importStar(require("@bitgo/sjcl"));
|
|
39
|
-
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
40
|
-
const sdk_lib_safes_1 = require("@bitgo/sdk-lib-safes");
|
|
41
39
|
const initiate_1 = require("../../../../src/bitgo/recovery/initiate");
|
|
42
40
|
// A deterministic xprv used across all tests.
|
|
43
41
|
const TEST_XPRV = 'xprv9s21ZrQH143K2fJ91S4BRsupcYrE6mmY96fcX5HkhoTrrwmwjd16Cn87cWinJjByrfpojjx7ezsJLx7TAKLT8m8hM5Kax9YcoxnBeJZ3t2k';
|
|
44
42
|
const TEST_XPUB = 'xpub661MyMwAqRbcF9Nc7TbBo1rZAagiWEVPWKbDKThNG8zqjk76HAKLkaSbTn6dK2dQPfuD7xjicxCZVWvj67fP5nQ9W7QURmoMVAX8m6jZsGp';
|
|
45
|
-
const SAFE_USER_ROOT_SEED = '000102030405060708090a0b0c0d0e0f';
|
|
46
|
-
const SAFE_BACKUP_ROOT_SEED = '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f';
|
|
47
|
-
const SAFE_BITGO_ROOT_SEED = '1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100';
|
|
48
43
|
/**
|
|
49
44
|
* Encrypt plaintext with SJCL (legacy v1 envelope, matching `encryptionVersion: 1`).
|
|
50
45
|
*/
|
|
@@ -141,30 +136,6 @@ describe('getBip32Keys', () => {
|
|
|
141
136
|
keys.should.have.length(3);
|
|
142
137
|
keys[2].neutered().toBase58().should.equal(TEST_XPUB);
|
|
143
138
|
});
|
|
144
|
-
it('accepts a derived slot-1 triplet without decrypting user or backup keys', async () => {
|
|
145
|
-
const userRoot = utxo_lib_1.bip32.fromSeed(Buffer.from(SAFE_USER_ROOT_SEED, 'hex'));
|
|
146
|
-
const backupRoot = utxo_lib_1.bip32.fromSeed(Buffer.from(SAFE_BACKUP_ROOT_SEED, 'hex'));
|
|
147
|
-
const bitgoRoot = utxo_lib_1.bip32.fromSeed(Buffer.from(SAFE_BITGO_ROOT_SEED, 'hex'));
|
|
148
|
-
const triplet = (0, sdk_lib_safes_1.deriveSafeSecp256k1MultisigTriplet)({
|
|
149
|
-
userRootXprv: userRoot.toBase58(),
|
|
150
|
-
backupRootXprv: backupRoot.toBase58(),
|
|
151
|
-
bitgoRootXpub: bitgoRoot.neutered().toBase58(),
|
|
152
|
-
index: 999,
|
|
153
|
-
});
|
|
154
|
-
const bitgo = makeMockBitGo(() => {
|
|
155
|
-
throw new Error('derived raw keys must bypass decrypt');
|
|
156
|
-
});
|
|
157
|
-
const keys = await (0, initiate_1.getBip32Keys)(bitgo, {
|
|
158
|
-
userKey: triplet.user.prv,
|
|
159
|
-
backupKey: triplet.backup.prv,
|
|
160
|
-
bitgoKey: triplet.bitgo.pub,
|
|
161
|
-
recoveryDestination: 'addr',
|
|
162
|
-
}, { requireBitGoXpub: true });
|
|
163
|
-
keys[0].toBase58().should.equal(triplet.user.prv);
|
|
164
|
-
keys[1].toBase58().should.equal(triplet.backup.prv);
|
|
165
|
-
keys[2].neutered().toBase58().should.equal(triplet.bitgo.pub);
|
|
166
|
-
bitgo.decrypt.callCount.should.equal(0);
|
|
167
|
-
});
|
|
168
139
|
it('calls decrypt for encrypted user key', async () => {
|
|
169
140
|
const passphrase = 'pass1';
|
|
170
141
|
const encryptedUserKey = sjclEncrypt(passphrase, TEST_XPRV);
|
|
@@ -185,4 +156,4 @@ describe('getBip32Keys', () => {
|
|
|
185
156
|
await (0, initiate_1.getBip32Keys)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, recoveryDestination: 'addr' }, { requireBitGoXpub: true }).should.be.rejectedWith('BitGo xpub required but not provided');
|
|
186
157
|
});
|
|
187
158
|
});
|
|
188
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vcmVjb3ZlcnkvaW5pdGlhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIsNkNBQStCO0FBQy9CLGtEQUFvQztBQUNwQyw4Q0FBd0M7QUFDeEMsd0RBQTBFO0FBQzFFLHNFQUFvRjtBQUdwRiw4Q0FBOEM7QUFDOUMsTUFBTSxTQUFTLEdBQ2IsaUhBQWlILENBQUM7QUFDcEgsTUFBTSxTQUFTLEdBQ2IsaUhBQWlILENBQUM7QUFDcEgsTUFBTSxtQkFBbUIsR0FBRyxrQ0FBa0MsQ0FBQztBQUMvRCxNQUFNLHFCQUFxQixHQUFHLGtFQUFrRSxDQUFDO0FBQ2pHLE1BQU0sb0JBQW9CLEdBQUcsa0VBQWtFLENBQUM7QUFFaEc7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxRQUFnQixFQUFFLEtBQWE7SUFDbEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQXNCLENBQUM7QUFDNUQsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLFdBQXFFO0lBQzFGLE9BQU87UUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBNEMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVHLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFO0tBQ0UsQ0FBQztBQUM1QixDQUFDO0FBRUQsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7SUFDM0IsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0RUFBNEUsRUFBRSxLQUFLLElBQUks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LEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLEVBQ3pFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQzNCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICogYXMgc2pjbCBmcm9tICdAYml0Z28vc2pjbCc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBkZXJpdmVTYWZlU2VjcDI1NmsxTXVsdGlzaWdUcmlwbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1saWItc2FmZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVLZXksIGdldEJpcDMyS2V5cyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby9yZWNvdmVyeS9pbml0aWF0ZSc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vYml0Z29CYXNlJztcblxuLy8gQSBkZXRlcm1pbmlzdGljIHhwcnYgdXNlZCBhY3Jvc3MgYWxsIHRlc3RzLlxuY29uc3QgVEVTVF9YUFJWID1cbiAgJ3hwcnY5czIxWnJRSDE0M0syZko5MVM0QlJzdXBjWXJFNm1tWTk2ZmNYNUhraG9UcnJ3bXdqZDE2Q244N2NXaW5KakJ5cmZwb2pqeDdlenNKTHg3VEFLTFQ4bThoTTVLYXg5WWNveG5CZUpaM3Qyayc7XG5jb25zdCBURVNUX1hQVUIgPVxuICAneHB1YjY2MU15TXdBcVJiY0Y5TmM3VGJCbzFyWkFhZ2lXRVZQV0tiREtUaE5HOHpxams3NkhBS0xrYVNiVG42ZEsyZFFQZnVEN3hqaWN4Q1pWV3ZqNjdmUDVuUTlXN1FVUm1vTVZBWDhtNmpac0dwJztcbmNvbnN0IFNBRkVfVVNFUl9ST09UX1NFRUQgPSAnMDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGYnO1xuY29uc3QgU0FGRV9CQUNLVVBfUk9PVF9TRUVEID0gJzAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmMTAxMTEyMTMxNDE1MTYxNzE4MTkxYTFiMWMxZDFlMWYnO1xuY29uc3QgU0FGRV9CSVRHT19ST09UX1NFRUQgPSAnMWYxZTFkMWMxYjFhMTkxODE3MTYxNTE0MTMxMjExMTAwZjBlMGQwYzBiMGEwOTA4MDcwNjA1MDQwMzAyMDEwMCc7XG5cbi8qKlxuICogRW5jcnlwdCBwbGFpbnRleHQgd2l0aCBTSkNMIChsZWdhY3kgdjEgZW52ZWxvcGUsIG1hdGNoaW5nIGBlbmNyeXB0aW9uVmVyc2lvbjogMWApLlxuICovXG5mdW5jdGlvbiBzamNsRW5jcnlwdChwYXNzd29yZDogc3RyaW5nLCBpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNqY2wuZW5jcnlwdChwYXNzd29yZCwgaW5wdXQpIGFzIHVua25vd24gYXMgc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBtYWtlTW9ja0JpdEdvKGRlY3J5cHRJbXBsOiAocGFyYW1zOiB7IHBhc3N3b3JkPzogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IHN0cmluZyk6IEJpdEdvQmFzZSB7XG4gIHJldHVybiB7XG4gICAgZGVjcnlwdDogc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAocGFyYW1zOiB7IHBhc3N3b3JkPzogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IGRlY3J5cHRJbXBsKHBhcmFtcykpLFxuICAgIGVuY3J5cHQ6IHNpbm9uLnN0dWIoKSxcbiAgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcbn1cblxuZGVzY3JpYmUoJ3ZhbGlkYXRlS2V5JywgKCkgPT4ge1xuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgYSBCSVAzMiBub2RlIGRpcmVjdGx5IHdoZW4ga2V5IHN0YXJ0cyB3aXRoIHhwcnYgKGJ5cGFzc2VzIGRlY3J5cHQpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgY29uc3Qgbm9kZSA9IGF3YWl0IHZhbGlkYXRlS2V5KGJpdGdvLCB7XG4gICAgICBrZXk6IFRFU1RfWFBSVixcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgcGFzc3BocmFzZTogJ3NlY3JldCcsXG4gICAgICBpc1Vuc2lnbmVkU3dlZXA6IGZhbHNlLFxuICAgICAgaXNLcnNSZWNvdmVyeTogZmFsc2UsXG4gICAgfSk7XG4gICAgbm9kZS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICAgIChiaXRnby5kZWNyeXB0IGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbENvdW50LnNob3VsZC5lcXVhbCgwKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbGxzIGRlY3J5cHQgYW5kIHJldHVybnMgQklQMzIgbm9kZSB3aGVuIGtleSBpcyBlbmNyeXB0ZWQgKG5vdCB4cHJ2KScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXNzcGhyYXNlID0gJ2h1bnRlcjInO1xuICAgIGNvbnN0IGVuY3J5cHRlZEtleSA9IHNqY2xFbmNyeXB0KHBhc3NwaHJhc2UsIFRFU1RfWFBSVik7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCh7IHBhc3N3b3JkLCBpbnB1dCB9KSA9PiB7XG4gICAgICBpZiAoaW5wdXQgPT09IGVuY3J5cHRlZEtleSAmJiBwYXNzd29yZCA9PT0gcGFzc3BocmFzZSkgcmV0dXJuIFRFU1RfWFBSVjtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBkZWNyeXB0IGNhbGwnKTtcbiAgICB9KTtcbiAgICBjb25zdCBub2RlID0gYXdhaXQgdmFsaWRhdGVLZXkoYml0Z28sIHtcbiAgICAgIGtleTogZW5jcnlwdGVkS2V5LFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgaXNVbnNpZ25lZFN3ZWVwOiBmYWxzZSxcbiAgICAgIGlzS3JzUmVjb3Zlcnk6IGZhbHNlLFxuICAgIH0pO1xuICAgIG5vZGUudG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFJWKTtcbiAgICAoYml0Z28uZGVjcnlwdCBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIHdpdGggZnJpZW5kbHkgbWVzc2FnZSB3aGVuIGRlY3J5cHQgZmFpbHMgKHdyb25nIHBhc3NwaHJhc2UpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NqY2w6IGNjbTogdGFnIGRvZXMgbm90IG1hdGNoJyk7XG4gICAgfSk7XG4gICAgYXdhaXQgdmFsaWRhdGVLZXkoYml0Z28sIHtcbiAgICAgIGtleTogJ25vdEFuWHBydicsXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIHBhc3NwaHJhc2U6ICd3cm9uZycsXG4gICAgICBpc1Vuc2lnbmVkU3dlZXA6IGZhbHNlLFxuICAgICAgaXNLcnNSZWNvdmVyeTogZmFsc2UsXG4gICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnRmFpbGVkIHRvIGRlY3J5cHQgdXNlciBrZXkgd2l0aCBwYXNzY29kZSAtIHRyeSBhZ2FpbiEnKTtcbiAgfSk7XG5cbiAgaXQoJ3NraXBzIGRlY3J5cHQgZm9yIHVuc2lnbmVkIHN3ZWVwIChpc1Vuc2lnbmVkU3dlZXAgPSB0cnVlKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCB2YWxpZGF0ZUtleShiaXRnbywge1xuICAgICAga2V5OiBURVNUX1hQVUIsXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIHBhc3NwaHJhc2U6ICdzZWNyZXQnLFxuICAgICAgaXNVbnNpZ25lZFN3ZWVwOiB0cnVlLFxuICAgICAgaXNLcnNSZWNvdmVyeTogZmFsc2UsXG4gICAgfSk7XG4gICAgbm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBVQik7XG4gICAgKGJpdGdvLmRlY3J5cHQgYXMgc2lub24uU2lub25TdHViKS5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnZ2V0QmlwMzJLZXlzJywgKCkgPT4ge1xuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgW3VzZXJLZXksIGJhY2t1cEtleV0gd2hlbiBib3RoIGFyZSBwcm92aWRlZCBhcyB4cHJ2JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IGdldEJpcDMyS2V5cyhcbiAgICAgIGJpdGdvLFxuICAgICAgeyB1c2VyS2V5OiBURVNUX1hQUlYsIGJhY2t1cEtleTogVEVTVF9YUFJWLCByZWNvdmVyeURlc3RpbmF0aW9uOiAnYWRkcicgfSxcbiAgICAgIHsgcmVxdWlyZUJpdEdvWHB1YjogZmFsc2UgfVxuICAgICk7XG4gICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAga2V5c1swXS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICAgIGtleXNbMV0udG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFJWKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgdGhyZWUga2V5cyB3aGVuIHJlcXVpcmVCaXRHb1hwdWIgaXMgdHJ1ZSBhbmQgYml0Z29LZXkgaXMgdmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIG5vdCBiZSBjYWxsZWQnKTtcbiAgICB9KTtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgZ2V0QmlwMzJLZXlzKFxuICAgICAgYml0Z28sXG4gICAgICB7IHVzZXJLZXk6IFRFU1RfWFBSViwgYmFja3VwS2V5OiBURVNUX1hQUlYsIGJpdGdvS2V5OiBURVNUX1hQVUIsIHJlY292ZXJ5RGVzdGluYXRpb246ICdhZGRyJyB9LFxuICAgICAgeyByZXF1aXJlQml0R29YcHViOiB0cnVlIH1cbiAgICApO1xuICAgIGtleXMuc2hvdWxkLmhhdmUubGVuZ3RoKDMpO1xuICAgIGtleXNbMl0ubmV1dGVyZWQoKS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQVUIpO1xuICB9KTtcblxuICBpdCgnYWNjZXB0cyBhIGRlcml2ZWQgc2xvdC0xIHRyaXBsZXQgd2l0aG91dCBkZWNyeXB0aW5nIHVzZXIgb3IgYmFja3VwIGtleXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdXNlclJvb3QgPSBiaXAzMi5mcm9tU2VlZChCdWZmZXIuZnJvbShTQUZFX1VTRVJfUk9PVF9TRUVELCAnaGV4JykpO1xuICAgIGNvbnN0IGJhY2t1cFJvb3QgPSBiaXAzMi5mcm9tU2VlZChCdWZmZXIuZnJvbShTQUZFX0JBQ0tVUF9ST09UX1NFRUQsICdoZXgnKSk7XG4gICAgY29uc3QgYml0Z29Sb290ID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oU0FGRV9CSVRHT19ST09UX1NFRUQsICdoZXgnKSk7XG4gICAgY29uc3QgdHJpcGxldCA9IGRlcml2ZVNhZmVTZWNwMjU2azFNdWx0aXNpZ1RyaXBsZXQoe1xuICAgICAgdXNlclJvb3RYcHJ2OiB1c2VyUm9vdC50b0Jhc2U1OCgpLFxuICAgICAgYmFja3VwUm9vdFhwcnY6IGJhY2t1cFJvb3QudG9CYXNlNTgoKSxcbiAgICAgIGJpdGdvUm9vdFhwdWI6IGJpdGdvUm9vdC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICBpbmRleDogOTk5LFxuICAgIH0pO1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlcml2ZWQgcmF3IGtleXMgbXVzdCBieXBhc3MgZGVjcnlwdCcpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IGdldEJpcDMyS2V5cyhcbiAgICAgIGJpdGdvLFxuICAgICAge1xuICAgICAgICB1c2VyS2V5OiB0cmlwbGV0LnVzZXIucHJ2LFxuICAgICAgICBiYWNrdXBLZXk6IHRyaXBsZXQuYmFja3VwLnBydixcbiAgICAgICAgYml0Z29LZXk6IHRyaXBsZXQuYml0Z28ucHViLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiAnYWRkcicsXG4gICAgICB9LFxuICAgICAgeyByZXF1aXJlQml0R29YcHViOiB0cnVlIH1cbiAgICApO1xuXG4gICAga2V5c1swXS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbCh0cmlwbGV0LnVzZXIucHJ2KTtcbiAgICBrZXlzWzFdLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKHRyaXBsZXQuYmFja3VwLnBydik7XG4gICAga2V5c1syXS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKHRyaXBsZXQuYml0Z28ucHViKTtcbiAgICAoYml0Z28uZGVjcnlwdCBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBkZWNyeXB0IGZvciBlbmNyeXB0ZWQgdXNlciBrZXknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGFzc3BocmFzZSA9ICdwYXNzMSc7XG4gICAgY29uc3QgZW5jcnlwdGVkVXNlcktleSA9IHNqY2xFbmNyeXB0KHBhc3NwaHJhc2UsIFRFU1RfWFBSVik7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCh7IHBhc3N3b3JkLCBpbnB1dCB9KSA9PiB7XG4gICAgICBpZiAoaW5wdXQgPT09IGVuY3J5cHRlZFVzZXJLZXkgJiYgcGFzc3dvcmQgPT09IHBhc3NwaHJhc2UpIHJldHVybiBURVNUX1hQUlY7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZGVjcnlwdCBjYWxsJyk7XG4gICAgfSk7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IGdldEJpcDMyS2V5cyhcbiAgICAgIGJpdGdvLFxuICAgICAgeyB1c2VyS2V5OiBlbmNyeXB0ZWRVc2VyS2V5LCBiYWNrdXBLZXk6IFRFU1RfWFBSViwgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSwgcmVjb3ZlcnlEZXN0aW5hdGlvbjogJ2FkZHInIH0sXG4gICAgICB7IHJlcXVpcmVCaXRHb1hwdWI6IGZhbHNlIH1cbiAgICApO1xuICAgIGtleXMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgIGtleXNbMF0udG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFJWKTtcbiAgICAoYml0Z28uZGVjcnlwdCBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIHdoZW4gcmVxdWlyZUJpdEdvWHB1YiBpcyB0cnVlIGJ1dCBiaXRnb0tleSBpcyBtaXNzaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgYXdhaXQgZ2V0QmlwMzJLZXlzKFxuICAgICAgYml0Z28sXG4gICAgICB7IHVzZXJLZXk6IFRFU1RfWFBSViwgYmFja3VwS2V5OiBURVNUX1hQUlYsIHJlY292ZXJ5RGVzdGluYXRpb246ICdhZGRyJyB9LFxuICAgICAgeyByZXF1aXJlQml0R29YcHViOiB0cnVlIH1cbiAgICApLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0JpdEdvIHhwdWIgcmVxdWlyZWQgYnV0IG5vdCBwcm92aWRlZCcpO1xuICB9KTtcbn0pO1xuIl19
|
|
159
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vcmVjb3ZlcnkvaW5pdGlhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIsNkNBQStCO0FBQy9CLGtEQUFvQztBQUNwQyxzRUFBb0Y7QUFHcEYsOENBQThDO0FBQzlDLE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0FBQ3BILE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0FBRXBIOztHQUVHO0FBQ0gsU0FBUyxXQUFXLENBQUMsUUFBZ0IsRUFBRSxLQUFhO0lBQ2xELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFzQixDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxXQUFxRTtJQUMxRixPQUFPO1FBQ0wsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQTRDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTtLQUNFLENBQUM7QUFDNUIsQ0FBQztBQUVELFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO0lBQzNCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNEVBQTRFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUYsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxN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SSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsS0FBSyxDQUFDLE9BQTJCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsK0RBQStELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDN0UsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUEsdUJBQVksRUFDaEIsS0FBSyxFQUNMLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxFQUN6RSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUMzQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvL3NqY2wnO1xuaW1wb3J0IHsgdmFsaWRhdGVLZXksIGdldEJpcDMyS2V5cyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby9yZWNvdmVyeS9pbml0aWF0ZSc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vYml0Z29CYXNlJztcblxuLy8gQSBkZXRlcm1pbmlzdGljIHhwcnYgdXNlZCBhY3Jvc3MgYWxsIHRlc3RzLlxuY29uc3QgVEVTVF9YUFJWID1cbiAgJ3hwcnY5czIxWnJRSDE0M0syZko5MVM0QlJzdXBjWXJFNm1tWTk2ZmNYNUhraG9UcnJ3bXdqZDE2Q244N2NXaW5KakJ5cmZwb2pqeDdlenNKTHg3VEFLTFQ4bThoTTVLYXg5WWNveG5CZUpaM3Qyayc7XG5jb25zdCBURVNUX1hQVUIgPVxuICAneHB1YjY2MU15TXdBcVJiY0Y5TmM3VGJCbzFyWkFhZ2lXRVZQV0tiREtUaE5HOHpxams3NkhBS0xrYVNiVG42ZEsyZFFQZnVEN3hqaWN4Q1pWV3ZqNjdmUDVuUTlXN1FVUm1vTVZBWDhtNmpac0dwJztcblxuLyoqXG4gKiBFbmNyeXB0IHBsYWludGV4dCB3aXRoIFNKQ0wgKGxlZ2FjeSB2MSBlbnZlbG9wZSwgbWF0Y2hpbmcgYGVuY3J5cHRpb25WZXJzaW9uOiAxYCkuXG4gKi9cbmZ1bmN0aW9uIHNqY2xFbmNyeXB0KHBhc3N3b3JkOiBzdHJpbmcsIGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBpbnB1dCkgYXMgdW5rbm93biBhcyBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIG1ha2VNb2NrQml0R28oZGVjcnlwdEltcGw6IChwYXJhbXM6IHsgcGFzc3dvcmQ/OiBzdHJpbmc7IGlucHV0OiBzdHJpbmcgfSkgPT4gc3RyaW5nKTogQml0R29CYXNlIHtcbiAgcmV0dXJuIHtcbiAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jIChwYXJhbXM6IHsgcGFzc3dvcmQ/OiBzdHJpbmc7IGlucHV0OiBzdHJpbmcgfSkgPT4gZGVjcnlwdEltcGwocGFyYW1zKSksXG4gICAgZW5jcnlwdDogc2lub24uc3R1YigpLFxuICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xufVxuXG5kZXNjcmliZSgndmFsaWRhdGVLZXknLCAoKSA9PiB7XG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBhIEJJUDMyIG5vZGUgZGlyZWN0bHkgd2hlbiBrZXkgc3RhcnRzIHdpdGggeHBydiAoYnlwYXNzZXMgZGVjcnlwdCknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIG5vdCBiZSBjYWxsZWQnKTtcbiAgICB9KTtcbiAgICBjb25zdCBub2RlID0gYXdhaXQgdmFsaWRhdGVLZXkoYml0Z28sIHtcbiAgICAgIGtleTogVEVTVF9YUFJWLFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBwYXNzcGhyYXNlOiAnc2VjcmV0JyxcbiAgICAgIGlzVW5zaWduZWRTd2VlcDogZmFsc2UsXG4gICAgICBpc0tyc1JlY292ZXJ5OiBmYWxzZSxcbiAgICB9KTtcbiAgICBub2RlLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBSVik7XG4gICAgKGJpdGdvLmRlY3J5cHQgYXMgc2lub24uU2lub25TdHViKS5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDApO1xuICB9KTtcblxuICBpdCgnY2FsbHMgZGVjcnlwdCBhbmQgcmV0dXJucyBCSVAzMiBub2RlIHdoZW4ga2V5IGlzIGVuY3J5cHRlZCAobm90IHhwcnYpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3NwaHJhc2UgPSAnaHVudGVyMic7XG4gICAgY29uc3QgZW5jcnlwdGVkS2V5ID0gc2pjbEVuY3J5cHQocGFzc3BocmFzZSwgVEVTVF9YUFJWKTtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKHsgcGFzc3dvcmQsIGlucHV0IH0pID0+IHtcbiAgICAgIGlmIChpbnB1dCA9PT0gZW5jcnlwdGVkS2V5ICYmIHBhc3N3b3JkID09PSBwYXNzcGhyYXNlKSByZXR1cm4gVEVTVF9YUFJWO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGRlY3J5cHQgY2FsbCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCB2YWxpZGF0ZUtleShiaXRnbywge1xuICAgICAga2V5OiBlbmNyeXB0ZWRLZXksXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBpc1Vuc2lnbmVkU3dlZXA6IGZhbHNlLFxuICAgICAgaXNLcnNSZWNvdmVyeTogZmFsc2UsXG4gICAgfSk7XG4gICAgbm9kZS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICAgIChiaXRnby5kZWNyeXB0IGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbENvdW50LnNob3VsZC5lcXVhbCgxKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgd2l0aCBmcmllbmRseSBtZXNzYWdlIHdoZW4gZGVjcnlwdCBmYWlscyAod3JvbmcgcGFzc3BocmFzZSknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2pjbDogY2NtOiB0YWcgZG9lcyBub3QgbWF0Y2gnKTtcbiAgICB9KTtcbiAgICBhd2FpdCB2YWxpZGF0ZUtleShiaXRnbywge1xuICAgICAga2V5OiAnbm90QW5YcHJ2JyxcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgcGFzc3BocmFzZTogJ3dyb25nJyxcbiAgICAgIGlzVW5zaWduZWRTd2VlcDogZmFsc2UsXG4gICAgICBpc0tyc1JlY292ZXJ5OiBmYWxzZSxcbiAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdGYWlsZWQgdG8gZGVjcnlwdCB1c2VyIGtleSB3aXRoIHBhc3Njb2RlIC0gdHJ5IGFnYWluIScpO1xuICB9KTtcblxuICBpdCgnc2tpcHMgZGVjcnlwdCBmb3IgdW5zaWduZWQgc3dlZXAgKGlzVW5zaWduZWRTd2VlcCA9IHRydWUpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgY29uc3Qgbm9kZSA9IGF3YWl0IHZhbGlkYXRlS2V5KGJpdGdvLCB7XG4gICAgICBrZXk6IFRFU1RfWFBVQixcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgcGFzc3BocmFzZTogJ3NlY3JldCcsXG4gICAgICBpc1Vuc2lnbmVkU3dlZXA6IHRydWUsXG4gICAgICBpc0tyc1JlY292ZXJ5OiBmYWxzZSxcbiAgICB9KTtcbiAgICBub2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFVCKTtcbiAgICAoYml0Z28uZGVjcnlwdCBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdnZXRCaXAzMktleXMnLCAoKSA9PiB7XG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBbdXNlcktleSwgYmFja3VwS2V5XSB3aGVuIGJvdGggYXJlIHByb3ZpZGVkIGFzIHhwcnYnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIG5vdCBiZSBjYWxsZWQnKTtcbiAgICB9KTtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgZ2V0QmlwMzJLZXlzKFxuICAgICAgYml0Z28sXG4gICAgICB7IHVzZXJLZXk6IFRFU1RfWFBSViwgYmFja3VwS2V5OiBURVNUX1hQUlYsIHJlY292ZXJ5RGVzdGluYXRpb246ICdhZGRyJyB9LFxuICAgICAgeyByZXF1aXJlQml0R29YcHViOiBmYWxzZSB9XG4gICAgKTtcbiAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICBrZXlzWzBdLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBSVik7XG4gICAga2V5c1sxXS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyB0aHJlZSBrZXlzIHdoZW4gcmVxdWlyZUJpdEdvWHB1YiBpcyB0cnVlIGFuZCBiaXRnb0tleSBpcyB2YWxpZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBnZXRCaXAzMktleXMoXG4gICAgICBiaXRnbyxcbiAgICAgIHsgdXNlcktleTogVEVTVF9YUFJWLCBiYWNrdXBLZXk6IFRFU1RfWFBSViwgYml0Z29LZXk6IFRFU1RfWFBVQiwgcmVjb3ZlcnlEZXN0aW5hdGlvbjogJ2FkZHInIH0sXG4gICAgICB7IHJlcXVpcmVCaXRHb1hwdWI6IHRydWUgfVxuICAgICk7XG4gICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoMyk7XG4gICAga2V5c1syXS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBVQik7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBkZWNyeXB0IGZvciBlbmNyeXB0ZWQgdXNlciBrZXknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGFzc3BocmFzZSA9ICdwYXNzMSc7XG4gICAgY29uc3QgZW5jcnlwdGVkVXNlcktleSA9IHNqY2xFbmNyeXB0KHBhc3NwaHJhc2UsIFRFU1RfWFBSVik7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCh7IHBhc3N3b3JkLCBpbnB1dCB9KSA9PiB7XG4gICAgICBpZiAoaW5wdXQgPT09IGVuY3J5cHRlZFVzZXJLZXkgJiYgcGFzc3dvcmQgPT09IHBhc3NwaHJhc2UpIHJldHVybiBURVNUX1hQUlY7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZGVjcnlwdCBjYWxsJyk7XG4gICAgfSk7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IGdldEJpcDMyS2V5cyhcbiAgICAgIGJpdGdvLFxuICAgICAgeyB1c2VyS2V5OiBlbmNyeXB0ZWRVc2VyS2V5LCBiYWNrdXBLZXk6IFRFU1RfWFBSViwgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSwgcmVjb3ZlcnlEZXN0aW5hdGlvbjogJ2FkZHInIH0sXG4gICAgICB7IHJlcXVpcmVCaXRHb1hwdWI6IGZhbHNlIH1cbiAgICApO1xuICAgIGtleXMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgIGtleXNbMF0udG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFJWKTtcbiAgICAoYml0Z28uZGVjcnlwdCBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIHdoZW4gcmVxdWlyZUJpdEdvWHB1YiBpcyB0cnVlIGJ1dCBiaXRnb0tleSBpcyBtaXNzaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgYXdhaXQgZ2V0QmlwMzJLZXlzKFxuICAgICAgYml0Z28sXG4gICAgICB7IHVzZXJLZXk6IFRFU1RfWFBSViwgYmFja3VwS2V5OiBURVNUX1hQUlYsIHJlY292ZXJ5RGVzdGluYXRpb246ICdhZGRyJyB9LFxuICAgICAgeyByZXF1aXJlQml0R29YcHViOiB0cnVlIH1cbiAgICApLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0JpdEdvIHhwdWIgcmVxdWlyZWQgYnV0IG5vdCBwcm92aWRlZCcpO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/safe/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
require("should");
|
|
37
|
+
const sinon = __importStar(require("sinon"));
|
|
38
|
+
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
39
|
+
const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
|
|
40
|
+
const keyShareEnvelope_1 = require("../../../../src/bitgo/utils/tss/keyShareEnvelope");
|
|
41
|
+
const errors_1 = require("../../../../src/bitgo/errors");
|
|
42
|
+
const recovery_1 = require("../../../../src/bitgo/safe/recovery");
|
|
43
|
+
const PASSWORD = 'safe-password';
|
|
44
|
+
function makeMockBitGo(decryptImpl) {
|
|
45
|
+
return {
|
|
46
|
+
decrypt: sinon.stub().callsFake(async (params) => decryptImpl(params)),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** A fake decrypt that only recognizes the user/backup tokens; any other input (e.g. a Box C public) throws. */
|
|
50
|
+
function makeDecryptMap(entries) {
|
|
51
|
+
return ({ password, input }) => {
|
|
52
|
+
password.should.equal(PASSWORD);
|
|
53
|
+
if (!(input in entries)) {
|
|
54
|
+
throw new Error(`unexpected decrypt input: ${input}`);
|
|
55
|
+
}
|
|
56
|
+
return entries[input];
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function box(values) {
|
|
60
|
+
return JSON.stringify(values);
|
|
61
|
+
}
|
|
62
|
+
describe('decryptSafeKeycard', () => {
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
sinon.restore();
|
|
65
|
+
});
|
|
66
|
+
it('decrypts onchain roots to strings and returns Box C verbatim', async () => {
|
|
67
|
+
const userBox = box({
|
|
68
|
+
secp256k1Multisig: 'enc-user-secp',
|
|
69
|
+
ed25519Multisig: 'enc-user-ed25519',
|
|
70
|
+
ecdsaMpc: 'enc-user-ecdsa',
|
|
71
|
+
eddsaMpc: 'enc-user-eddsa',
|
|
72
|
+
});
|
|
73
|
+
const backupBox = box({
|
|
74
|
+
secp256k1Multisig: 'enc-backup-secp',
|
|
75
|
+
ed25519Multisig: 'enc-backup-ed25519',
|
|
76
|
+
ecdsaMpc: 'enc-backup-ecdsa',
|
|
77
|
+
eddsaMpc: 'enc-backup-eddsa',
|
|
78
|
+
});
|
|
79
|
+
const bitgoBox = box({
|
|
80
|
+
secp256k1Multisig: 'xpub-secp-bitgo',
|
|
81
|
+
ed25519Multisig: 'pub-ed25519-bitgo',
|
|
82
|
+
ecdsaMpc: 'common-ecdsa-bitgo',
|
|
83
|
+
eddsaMpc: 'common-eddsa-bitgo',
|
|
84
|
+
});
|
|
85
|
+
const mpcUser = (0, keyShareEnvelope_1.buildSafeMpcKeyEnvelopes)(Buffer.from('user-signing'), Buffer.from('user-reduced'), Buffer.from('user-vrf'));
|
|
86
|
+
const mpcBackup = (0, keyShareEnvelope_1.buildSafeMpcKeyEnvelopes)(Buffer.from('backup-signing'), Buffer.from('backup-reduced'), Buffer.from('backup-vrf'));
|
|
87
|
+
const bitgo = makeMockBitGo(makeDecryptMap({
|
|
88
|
+
'enc-user-secp': 'xprv-user',
|
|
89
|
+
'enc-backup-secp': 'xprv-backup',
|
|
90
|
+
'enc-user-ed25519': 'S-user-seed',
|
|
91
|
+
'enc-backup-ed25519': 'S-backup-seed',
|
|
92
|
+
'enc-user-ecdsa': mpcUser.reducedEnvelope.toString('base64'),
|
|
93
|
+
'enc-backup-ecdsa': mpcBackup.reducedEnvelope.toString('base64'),
|
|
94
|
+
'enc-user-eddsa': mpcUser.reducedEnvelope.toString('base64'),
|
|
95
|
+
'enc-backup-eddsa': mpcBackup.reducedEnvelope.toString('base64'),
|
|
96
|
+
}));
|
|
97
|
+
const result = await (0, recovery_1.decryptSafeKeycard)({
|
|
98
|
+
bitgo,
|
|
99
|
+
userKeyBox: userBox,
|
|
100
|
+
backupKeyBox: backupBox,
|
|
101
|
+
bitgoKeyBox: bitgoBox,
|
|
102
|
+
password: PASSWORD,
|
|
103
|
+
});
|
|
104
|
+
result.secp256k1Multisig.user.should.equal('xprv-user');
|
|
105
|
+
result.secp256k1Multisig.backup.should.equal('xprv-backup');
|
|
106
|
+
result.secp256k1Multisig.bitgo.should.equal('xpub-secp-bitgo');
|
|
107
|
+
result.ed25519Multisig.user.should.equal('S-user-seed');
|
|
108
|
+
result.ed25519Multisig.backup.should.equal('S-backup-seed');
|
|
109
|
+
result.ed25519Multisig.bitgo.should.equal('pub-ed25519-bitgo');
|
|
110
|
+
result.ecdsaMpc.user.signing.toString('hex').should.equal(Buffer.from('user-reduced').toString('hex'));
|
|
111
|
+
result.ecdsaMpc.user.vrf.toString('hex').should.equal(Buffer.from('user-vrf').toString('hex'));
|
|
112
|
+
result.ecdsaMpc.backup.signing.toString('hex').should.equal(Buffer.from('backup-reduced').toString('hex'));
|
|
113
|
+
result.ecdsaMpc.backup.vrf.toString('hex').should.equal(Buffer.from('backup-vrf').toString('hex'));
|
|
114
|
+
result.ecdsaMpc.bitgo.should.equal('common-ecdsa-bitgo');
|
|
115
|
+
result.eddsaMpc.bitgo.should.equal('common-eddsa-bitgo');
|
|
116
|
+
// 4 slots × (user + backup) = 8 decrypts; BitGo (Box C) is never decrypted.
|
|
117
|
+
bitgo.decrypt.callCount.should.equal(8);
|
|
118
|
+
});
|
|
119
|
+
it('throws IncorrectPasswordError when decryption fails (wrong password)', async () => {
|
|
120
|
+
const userBox = box({
|
|
121
|
+
secp256k1Multisig: 'enc-user-secp',
|
|
122
|
+
ed25519Multisig: 'enc-user-ed25519',
|
|
123
|
+
ecdsaMpc: 'enc-user-ecdsa',
|
|
124
|
+
eddsaMpc: 'enc-user-eddsa',
|
|
125
|
+
});
|
|
126
|
+
const bitgo = makeMockBitGo(() => {
|
|
127
|
+
throw new Error('argon2: tag does not match');
|
|
128
|
+
});
|
|
129
|
+
await (0, recovery_1.decryptSafeKeycard)({
|
|
130
|
+
bitgo,
|
|
131
|
+
userKeyBox: userBox,
|
|
132
|
+
backupKeyBox: userBox,
|
|
133
|
+
bitgoKeyBox: userBox,
|
|
134
|
+
password: 'wrong-password',
|
|
135
|
+
}).should.be.rejectedWith(errors_1.IncorrectPasswordError);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
const MPC_ROOT = { signing: Buffer.alloc(0), vrf: Buffer.alloc(0) };
|
|
139
|
+
function makeRoots(secp) {
|
|
140
|
+
return {
|
|
141
|
+
secp256k1Multisig: secp,
|
|
142
|
+
ed25519Multisig: { user: 'u', backup: 'b', bitgo: 'g' },
|
|
143
|
+
ecdsaMpc: { user: MPC_ROOT, backup: MPC_ROOT, bitgo: 'g' },
|
|
144
|
+
eddsaMpc: { user: MPC_ROOT, backup: MPC_ROOT, bitgo: 'g' },
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
describe('deriveSafeWalletKeys', () => {
|
|
148
|
+
const userRoot = utxo_lib_1.bip32.fromSeed(Buffer.from('000102030405060708090a0b0c0d0e0f', 'hex'));
|
|
149
|
+
const backupRoot = utxo_lib_1.bip32.fromSeed(Buffer.from('1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100', 'hex'));
|
|
150
|
+
const bitgoRoot = utxo_lib_1.bip32
|
|
151
|
+
.fromSeed(Buffer.from('2f2e2d2c2b2a292827262524232221201f1e1d1c1b1a19181716151413121110', 'hex'))
|
|
152
|
+
.neutered();
|
|
153
|
+
const roots = makeRoots({
|
|
154
|
+
user: userRoot.toBase58(),
|
|
155
|
+
backup: backupRoot.toBase58(),
|
|
156
|
+
bitgo: bitgoRoot.toBase58(),
|
|
157
|
+
});
|
|
158
|
+
it('derives the BIP44 child triplet for slot 1', async () => {
|
|
159
|
+
const result = await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'btc', slot: 'secp256k1Multisig', account: 0, roots });
|
|
160
|
+
if (result.slot !== 'secp256k1Multisig') {
|
|
161
|
+
throw new Error('expected secp256k1Multisig slot');
|
|
162
|
+
}
|
|
163
|
+
result.path.should.equal("m/44'/0'/1'/0'");
|
|
164
|
+
result.keys.user.prv.should.equal(userRoot.derivePath("m/44'/0'/1'/0'").toBase58());
|
|
165
|
+
result.keys.user.pub.should.equal(userRoot.derivePath("m/44'/0'/1'/0'").neutered().toBase58());
|
|
166
|
+
result.keys.backup.prv.should.equal(backupRoot.derivePath('m/44/0/1/0').toBase58());
|
|
167
|
+
result.keys.bitgo.pub.should.equal(bitgoRoot.derivePath('m/44/0/1/0').toBase58());
|
|
168
|
+
});
|
|
169
|
+
it('varies the path with the account', async () => {
|
|
170
|
+
const result = await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'btc', slot: 'secp256k1Multisig', account: 2, roots });
|
|
171
|
+
result.path.should.equal("m/44'/0'/1'/2'");
|
|
172
|
+
});
|
|
173
|
+
it('derives the ecdsaMpc child via the DKLs ceremony', async () => {
|
|
174
|
+
const [userDkg, backupDkg] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
175
|
+
const [vrfUser, vrfBackup] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
176
|
+
const mpcRoots = {
|
|
177
|
+
...roots,
|
|
178
|
+
ecdsaMpc: {
|
|
179
|
+
user: { signing: userDkg.getReducedKeyShare(), vrf: vrfUser.getKeyShare() },
|
|
180
|
+
backup: { signing: backupDkg.getReducedKeyShare(), vrf: vrfBackup.getKeyShare() },
|
|
181
|
+
bitgo: 'g',
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
const result = await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'eth', slot: 'ecdsaMpc', account: 0, roots: mpcRoots });
|
|
185
|
+
if (result.slot !== 'ecdsaMpc') {
|
|
186
|
+
throw new Error('expected ecdsaMpc slot');
|
|
187
|
+
}
|
|
188
|
+
result.path.should.equal("m/44'/60'/3'/0'");
|
|
189
|
+
result.keys.commonKeychain.should.be.a.String();
|
|
190
|
+
result.keys.user.should.be.a.String();
|
|
191
|
+
result.keys.backup.should.be.a.String();
|
|
192
|
+
});
|
|
193
|
+
it('rejects unsupported slots', async () => {
|
|
194
|
+
await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'btc', slot: 'eddsaMpc', account: 0, roots }).should.be.rejectedWith(/not supported yet/);
|
|
195
|
+
});
|
|
196
|
+
it('rejects a non-integer account', async () => {
|
|
197
|
+
await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'btc', slot: 'secp256k1Multisig', account: 1.5, roots }).should.be.rejectedWith(/invalid account/);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe('buildSafeRecoverKeyParams', () => {
|
|
201
|
+
afterEach(() => {
|
|
202
|
+
sinon.restore();
|
|
203
|
+
});
|
|
204
|
+
const userRoot = utxo_lib_1.bip32.fromSeed(Buffer.from('000102030405060708090a0b0c0d0e0f', 'hex'));
|
|
205
|
+
const backupRoot = utxo_lib_1.bip32.fromSeed(Buffer.from('1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100', 'hex'));
|
|
206
|
+
const bitgoRoot = utxo_lib_1.bip32
|
|
207
|
+
.fromSeed(Buffer.from('2f2e2d2c2b2a292827262524232221201f1e1d1c1b1a19181716151413121110', 'hex'))
|
|
208
|
+
.neutered();
|
|
209
|
+
const keys = {
|
|
210
|
+
user: { prv: userRoot.toBase58(), pub: userRoot.neutered().toBase58() },
|
|
211
|
+
backup: { prv: backupRoot.toBase58(), pub: backupRoot.neutered().toBase58() },
|
|
212
|
+
bitgo: { pub: bitgoRoot.toBase58() },
|
|
213
|
+
};
|
|
214
|
+
it('signed mode re-encrypts child xprvs under a single ephemeral passphrase', async () => {
|
|
215
|
+
const passphrases = [];
|
|
216
|
+
const encrypt = sinon.stub().callsFake(async ({ input, password, encryptionVersion }) => {
|
|
217
|
+
passphrases.push(password);
|
|
218
|
+
encryptionVersion.should.equal(1);
|
|
219
|
+
return `enc(${input})`;
|
|
220
|
+
});
|
|
221
|
+
const bitgo = { encrypt };
|
|
222
|
+
const result = await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
223
|
+
bitgo,
|
|
224
|
+
coin: 'btc',
|
|
225
|
+
slot: 'secp256k1Multisig',
|
|
226
|
+
keys,
|
|
227
|
+
mode: 'signed',
|
|
228
|
+
});
|
|
229
|
+
result.userKey.should.equal(`enc(${keys.user.prv})`);
|
|
230
|
+
result.backupKey.should.equal(`enc(${keys.backup.prv})`);
|
|
231
|
+
result.bitgoKey.should.equal(keys.bitgo.pub);
|
|
232
|
+
result.walletPassphrase.should.be.a.String();
|
|
233
|
+
passphrases.should.have.length(2);
|
|
234
|
+
passphrases[0].should.equal(passphrases[1]);
|
|
235
|
+
passphrases[0].should.equal(result.walletPassphrase);
|
|
236
|
+
encrypt.callCount.should.equal(2);
|
|
237
|
+
});
|
|
238
|
+
it('rejects non-private child keys in signed mode', async () => {
|
|
239
|
+
const bitgo = { encrypt: sinon.stub() };
|
|
240
|
+
await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
241
|
+
bitgo,
|
|
242
|
+
coin: 'btc',
|
|
243
|
+
slot: 'secp256k1Multisig',
|
|
244
|
+
keys: { user: { prv: keys.user.pub, pub: keys.user.pub }, backup: keys.backup, bitgo: keys.bitgo },
|
|
245
|
+
mode: 'signed',
|
|
246
|
+
}).should.be.rejectedWith(/must be private xprvs/);
|
|
247
|
+
});
|
|
248
|
+
it('unsigned mode returns pubs and never encrypts', async () => {
|
|
249
|
+
const encrypt = sinon.stub().callsFake(async () => {
|
|
250
|
+
throw new Error('encrypt should not be called');
|
|
251
|
+
});
|
|
252
|
+
const bitgo = { encrypt };
|
|
253
|
+
const result = await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
254
|
+
bitgo,
|
|
255
|
+
coin: 'btc',
|
|
256
|
+
slot: 'secp256k1Multisig',
|
|
257
|
+
keys,
|
|
258
|
+
mode: 'unsigned',
|
|
259
|
+
});
|
|
260
|
+
result.userKey.should.equal(keys.user.pub);
|
|
261
|
+
result.backupKey.should.equal(keys.backup.pub);
|
|
262
|
+
result.bitgoKey.should.equal(keys.bitgo.pub);
|
|
263
|
+
result.should.not.have.property('walletPassphrase');
|
|
264
|
+
encrypt.callCount.should.equal(0);
|
|
265
|
+
});
|
|
266
|
+
it('rejects unsupported slots', async () => {
|
|
267
|
+
const bitgo = { encrypt: sinon.stub() };
|
|
268
|
+
await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
269
|
+
bitgo,
|
|
270
|
+
coin: 'btc',
|
|
271
|
+
slot: 'eddsaMpc',
|
|
272
|
+
keys,
|
|
273
|
+
mode: 'signed',
|
|
274
|
+
}).should.be.rejectedWith(/not supported yet/);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
describe('Safe ecdsaMpc derive → sign (gate)', function () {
|
|
278
|
+
it('derives a child, rebuilds 2-of-2 shares, and signs a message verified at m/0', async function () {
|
|
279
|
+
const [userDkg, backupDkg] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
280
|
+
const [vrfUser, vrfBackup] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
281
|
+
const rootCommonKeychain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(userDkg.getKeyShare());
|
|
282
|
+
const { commonKeychain, userChild, backupChild } = await sdk_lib_mpc_1.DklsVrfUtils.deriveSafeEcdsaMpcChild({
|
|
283
|
+
userRoot: { signing: userDkg.getReducedKeyShare(), vrf: vrfUser.getKeyShare() },
|
|
284
|
+
backupRoot: { signing: backupDkg.getReducedKeyShare(), vrf: vrfBackup.getKeyShare() },
|
|
285
|
+
account: 0,
|
|
286
|
+
coinType: 60,
|
|
287
|
+
});
|
|
288
|
+
// The derived child must never be the root (the "root envelope in the child position" footgun).
|
|
289
|
+
commonKeychain.should.not.equal(rootCommonKeychain);
|
|
290
|
+
// Rebuild 2-of-2 keyshares from the derived reduced CBOR, exactly as the signer's retrofit does.
|
|
291
|
+
const toRetrofit = (b64) => {
|
|
292
|
+
const reduced = sdk_lib_mpc_1.DklsTypes.getDecodedReducedKeyShare(Buffer.from(b64, 'base64'));
|
|
293
|
+
return {
|
|
294
|
+
xShare: {
|
|
295
|
+
x: Buffer.from(reduced.prv).toString('hex'),
|
|
296
|
+
y: Buffer.from(reduced.pub).toString('hex'),
|
|
297
|
+
chaincode: Buffer.from(reduced.rootChainCode).toString('hex'),
|
|
298
|
+
},
|
|
299
|
+
xiList: reduced.xList.slice(0, 2),
|
|
300
|
+
};
|
|
301
|
+
};
|
|
302
|
+
const [user2of2, backup2of2] = await sdk_lib_mpc_1.DklsUtils.generate2of2KeyShares(toRetrofit(userChild), toRetrofit(backupChild));
|
|
303
|
+
const messageHash = Buffer.from('0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', 'hex');
|
|
304
|
+
const userDsg = new sdk_lib_mpc_1.DklsDsg.Dsg(user2of2.getKeyShare(), 0, 'm/0', messageHash);
|
|
305
|
+
const backupDsg = new sdk_lib_mpc_1.DklsDsg.Dsg(backup2of2.getKeyShare(), 1, 'm/0', messageHash);
|
|
306
|
+
const signatureString = sdk_lib_mpc_1.DklsUtils.verifyAndConvertDklsSignature(messageHash, (await sdk_lib_mpc_1.DklsUtils.executeTillRound(5, userDsg, backupDsg)), commonKeychain, 'm/0', undefined, false);
|
|
307
|
+
// verifyAndConvertDklsSignature recovers the pubkey from the signature and checks it against
|
|
308
|
+
// deriveUnhardened(childCK, 'm/0'); it throws on mismatch, so a returned string is proof.
|
|
309
|
+
signatureString.should.be.a.String();
|
|
310
|
+
signatureString.should.match(/^\d+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+$/);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vc2FmZS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtCQUFnQjtBQUNoQiw2Q0FBK0I7QUFDL0IsOENBQXdDO0FBQ3hDLG9EQUFpRjtBQUNqRix1RkFBNEY7QUFDNUYseURBQXNFO0FBQ3RFLGtFQUs2QztBQUc3QyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUM7QUFFakMsU0FBUyxhQUFhLENBQUMsV0FBb0U7SUFDekYsT0FBTztRQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUEyQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDcEYsQ0FBQztBQUM1QixDQUFDO0FBRUQsZ0hBQWdIO0FBQ2hILFNBQVMsY0FBYyxDQUFDLE9BQStCO0lBQ3JELE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQzdCLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxNQUtaO0lBQ0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLFNB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QyxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbkYsTUFBTSxlQUFlLEdBQUcsdUJBQVMsQ0FBQyw2QkFBNkIsQ0FDN0QsV0FBVyxFQUNYLENBQUMsTUFBTSx1QkFBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQXdDLEVBQ2hHLGNBQWMsRUFDZCxLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssQ0FDTixDQUFDO1FBRUYsNkZBQTZGO1FBQzdGLDBGQUEwRjtRQUMxRixlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgRGtsc0RzZywgRGtsc1R5cGVzLCBEa2xzVXRpbHMsIERrbHNWcmZVdGlscyB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBidWlsZFNhZmVNcGNLZXlFbnZlbG9wZXMgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2tleVNoYXJlRW52ZWxvcGUnO1xuaW1wb3J0IHsgSW5jb3JyZWN0UGFzc3dvcmRFcnJvciB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgRGVjcnlwdGVkU2FmZVJvb3RzLFxuICBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zLFxuICBkZWNyeXB0U2FmZUtleWNhcmQsXG4gIGRlcml2ZVNhZmVXYWxsZXRLZXlzLFxufSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9yZWNvdmVyeSc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vYml0Z29CYXNlJztcblxuY29uc3QgUEFTU1dPUkQgPSAnc2FmZS1wYXNzd29yZCc7XG5cbmZ1bmN0aW9uIG1ha2VNb2NrQml0R28oZGVjcnlwdEltcGw6IChwYXJhbXM6IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBzdHJpbmcpOiBCaXRHb0Jhc2Uge1xuICByZXR1cm4ge1xuICAgIGRlY3J5cHQ6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoYXN5bmMgKHBhcmFtczogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IGRlY3J5cHRJbXBsKHBhcmFtcykpLFxuICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xufVxuXG4vKiogQSBmYWtlIGRlY3J5cHQgdGhhdCBvbmx5IHJlY29nbml6ZXMgdGhlIHVzZXIvYmFja3VwIHRva2VuczsgYW55IG90aGVyIGlucHV0IChlLmcuIGEgQm94IEMgcHVibGljKSB0aHJvd3MuICovXG5mdW5jdGlvbiBtYWtlRGVjcnlwdE1hcChlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogKHBhcmFtczogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IHN0cmluZyB7XG4gIHJldHVybiAoeyBwYXNzd29yZCwgaW5wdXQgfSkgPT4ge1xuICAgIHBhc3N3b3JkLnNob3VsZC5lcXVhbChQQVNTV09SRCk7XG4gICAgaWYgKCEoaW5wdXQgaW4gZW50cmllcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBkZWNyeXB0IGlucHV0OiAke2lucHV0fWApO1xuICAgIH1cbiAgICByZXR1cm4gZW50cmllc1tpbnB1dF07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJveCh2YWx1ZXM6IHtcbiAgc2VjcDI1NmsxTXVsdGlzaWc6IHN0cmluZztcbiAgZWQyNTUxOU11bHRpc2lnOiBzdHJpbmc7XG4gIGVjZHNhTXBjOiBzdHJpbmc7XG4gIGVkZHNhTXBjOiBzdHJpbmc7XG59KTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlcyk7XG59XG5cbmRlc2NyaWJlKCdkZWNyeXB0U2FmZUtleWNhcmQnLCAoKSA9PiB7XG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnZGVjcnlwdHMgb25jaGFpbiByb290cyB0byBzdHJpbmdzIGFuZCByZXR1cm5zIEJveCBDIHZlcmJhdGltJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVzZXJCb3ggPSBib3goe1xuICAgICAgc2VjcDI1NmsxTXVsdGlzaWc6ICdlbmMtdXNlci1zZWNwJyxcbiAgICAgIGVkMjU1MTlNdWx0aXNpZzogJ2VuYy11c2VyLWVkMjU1MTknLFxuICAgICAgZWNkc2FNcGM6ICdlbmMtdXNlci1lY2RzYScsXG4gICAgICBlZGRzYU1wYzogJ2VuYy11c2VyLWVkZHNhJyxcbiAgICB9KTtcbiAgICBjb25zdCBiYWNrdXBCb3ggPSBib3goe1xuICAgICAgc2VjcDI1NmsxTXVsdGlzaWc6ICdlbmMtYmFja3VwLXNlY3AnLFxuICAgICAgZWQyNTUxOU11bHRpc2lnOiAnZW5jLWJhY2t1cC1lZDI1NTE5JyxcbiAgICAgIGVjZHNhTXBjOiAnZW5jLWJhY2t1cC1lY2RzYScsXG4gICAgICBlZGRzYU1wYzogJ2VuYy1iYWNrdXAtZWRkc2EnLFxuICAgIH0pO1xuICAgIGNvbnN0IGJpdGdvQm94ID0gYm94KHtcbiAgICAgIHNlY3AyNTZrMU11bHRpc2lnOiAneHB1Yi1zZWNwLWJpdGdvJyxcbiAgICAgIGVkMjU1MTlNdWx0aXNpZzogJ3B1Yi1lZDI1NTE5LWJpdGdvJyxcbiAgICAgIGVjZHNhTXBjOiAnY29tbW9uLWVjZHNhLWJpdGdvJyxcbiAgICAgIGVkZHNhTXBjOiAnY29tbW9uLWVkZHNhLWJpdGdvJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1wY1VzZXIgPSBidWlsZFNhZmVNcGNLZXlFbnZlbG9wZXMoXG4gICAgICBCdWZmZXIuZnJvbSgndXNlci1zaWduaW5nJyksXG4gICAgICBCdWZmZXIuZnJvbSgndXNlci1yZWR1Y2VkJyksXG4gICAgICBCdWZmZXIuZnJvbSgndXNlci12cmYnKVxuICAgICk7XG4gICAgY29uc3QgbXBjQmFja3VwID0gYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzKFxuICAgICAgQnVmZmVyLmZyb20oJ2JhY2t1cC1zaWduaW5nJyksXG4gICAgICBCdWZmZXIuZnJvbSgnYmFja3VwLXJlZHVjZWQnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCdiYWNrdXAtdnJmJylcbiAgICApO1xuXG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKFxuICAgICAgbWFrZURlY3J5cHRNYXAoe1xuICAgICAgICAnZW5jLXVzZXItc2VjcCc6ICd4cHJ2LXVzZXInLFxuICAgICAgICAnZW5jLWJhY2t1cC1zZWNwJzogJ3hwcnYtYmFja3VwJyxcbiAgICAgICAgJ2VuYy11c2VyLWVkMjU1MTknOiAnUy11c2VyLXNlZWQnLFxuICAgICAgICAnZW5jLWJhY2t1cC1lZDI1NTE5JzogJ1MtYmFja3VwLXNlZWQnLFxuICAgICAgICAnZW5jLXVzZXItZWNkc2EnOiBtcGNVc2VyLnJlZHVjZWRFbnZlbG9wZS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgICdlbmMtYmFja3VwLWVjZHNhJzogbXBjQmFja3VwLnJlZHVjZWRFbnZlbG9wZS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgICdlbmMtdXNlci1lZGRzYSc6IG1wY1VzZXIucmVkdWNlZEVudmVsb3BlLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgJ2VuYy1iYWNrdXAtZWRkc2EnOiBtcGNCYWNrdXAucmVkdWNlZEVudmVsb3BlLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlY3J5cHRTYWZlS2V5Y2FyZCh7XG4gICAgICBiaXRnbyxcbiAgICAgIHVzZXJLZXlCb3g6IHVzZXJCb3gsXG4gICAgICBiYWNrdXBLZXlCb3g6IGJhY2t1cEJveCxcbiAgICAgIGJpdGdvS2V5Qm94OiBiaXRnb0JveCxcbiAgICAgIHBhc3N3b3JkOiBQQVNTV09SRCxcbiAgICB9KTtcblxuICAgIHJlc3VsdC5zZWNwMjU2azFNdWx0aXNpZy51c2VyLnNob3VsZC5lcXVhbCgneHBydi11c2VyJyk7XG4gICAgcmVzdWx0LnNlY3AyNTZrMU11bHRpc2lnLmJhY2t1cC5zaG91bGQuZXF1YWwoJ3hwcnYtYmFja3VwJyk7XG4gICAgcmVzdWx0LnNlY3AyNTZrMU11bHRpc2lnLmJpdGdvLnNob3VsZC5lcXVhbCgneHB1Yi1zZWNwLWJpdGdvJyk7XG5cbiAgICByZXN1bHQuZWQyNTUxOU11bHRpc2lnLnVzZXIuc2hvdWxkLmVxdWFsKCdTLXVzZXItc2VlZCcpO1xuICAgIHJlc3VsdC5lZDI1NTE5TXVsdGlzaWcuYmFja3VwLnNob3VsZC5lcXVhbCgnUy1iYWNrdXAtc2VlZCcpO1xuICAgIHJlc3VsdC5lZDI1NTE5TXVsdGlzaWcuYml0Z28uc2hvdWxkLmVxdWFsKCdwdWItZWQyNTUxOS1iaXRnbycpO1xuXG4gICAgcmVzdWx0LmVjZHNhTXBjLnVzZXIuc2lnbmluZy50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKCd1c2VyLXJlZHVjZWQnKS50b1N0cmluZygnaGV4JykpO1xuICAgIHJlc3VsdC5lY2RzYU1wYy51c2VyLnZyZi50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKCd1c2VyLXZyZicpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgcmVzdWx0LmVjZHNhTXBjLmJhY2t1cC5zaWduaW5nLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oJ2JhY2t1cC1yZWR1Y2VkJykudG9TdHJpbmcoJ2hleCcpKTtcbiAgICByZXN1bHQuZWNkc2FNcGMuYmFja3VwLnZyZi50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKCdiYWNrdXAtdnJmJykudG9TdHJpbmcoJ2hleCcpKTtcbiAgICByZXN1bHQuZWNkc2FNcGMuYml0Z28uc2hvdWxkLmVxdWFsKCdjb21tb24tZWNkc2EtYml0Z28nKTtcblxuICAgIHJlc3VsdC5lZGRzYU1wYy5iaXRnby5zaG91bGQuZXF1YWwoJ2NvbW1vbi1lZGRzYS1iaXRnbycpO1xuXG4gICAgLy8gNCBzbG90cyDDlyAodXNlciArIGJhY2t1cCkgPSA4IGRlY3J5cHRzOyBCaXRHbyAoQm94IEMpIGlzIG5ldmVyIGRlY3J5cHRlZC5cbiAgICAoYml0Z28uZGVjcnlwdCBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoOCk7XG4gIH0pO1xuXG4gIGl0KCd0aHJvd3MgSW5jb3JyZWN0UGFzc3dvcmRFcnJvciB3aGVuIGRlY3J5cHRpb24gZmFpbHMgKHdyb25nIHBhc3N3b3JkKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1c2VyQm94ID0gYm94KHtcbiAgICAgIHNlY3AyNTZrMU11bHRpc2lnOiAnZW5jLXVzZXItc2VjcCcsXG4gICAgICBlZDI1NTE5TXVsdGlzaWc6ICdlbmMtdXNlci1lZDI1NTE5JyxcbiAgICAgIGVjZHNhTXBjOiAnZW5jLXVzZXItZWNkc2EnLFxuICAgICAgZWRkc2FNcGM6ICdlbmMtdXNlci1lZGRzYScsXG4gICAgfSk7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXJnb24yOiB0YWcgZG9lcyBub3QgbWF0Y2gnKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IGRlY3J5cHRTYWZlS2V5Y2FyZCh7XG4gICAgICBiaXRnbyxcbiAgICAgIHVzZXJLZXlCb3g6IHVzZXJCb3gsXG4gICAgICBiYWNrdXBLZXlCb3g6IHVzZXJCb3gsXG4gICAgICBiaXRnb0tleUJveDogdXNlckJveCxcbiAgICAgIHBhc3N3b3JkOiAnd3JvbmctcGFzc3dvcmQnLFxuICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoSW5jb3JyZWN0UGFzc3dvcmRFcnJvcik7XG4gIH0pO1xufSk7XG5cbmNvbnN0IE1QQ19ST09UID0geyBzaWduaW5nOiBCdWZmZXIuYWxsb2MoMCksIHZyZjogQnVmZmVyLmFsbG9jKDApIH07XG5cbmZ1bmN0aW9uIG1ha2VSb290cyhzZWNwOiB7IHVzZXI6IHN0cmluZzsgYmFja3VwOiBzdHJpbmc7IGJpdGdvOiBzdHJpbmcgfSk6IERlY3J5cHRlZFNhZmVSb290cyB7XG4gIHJldHVybiB7XG4gICAgc2VjcDI1NmsxTXVsdGlzaWc6IHNlY3AsXG4gICAgZWQyNTUxOU11bHRpc2lnOiB7IHVzZXI6ICd1JywgYmFja3VwOiAnYicsIGJpdGdvOiAnZycgfSxcbiAgICBlY2RzYU1wYzogeyB1c2VyOiBNUENfUk9PVCwgYmFja3VwOiBNUENfUk9PVCwgYml0Z286ICdnJyB9LFxuICAgIGVkZHNhTXBjOiB7IHVzZXI6IE1QQ19ST09ULCBiYWNrdXA6IE1QQ19ST09ULCBiaXRnbzogJ2cnIH0sXG4gIH07XG59XG5cbmRlc2NyaWJlKCdkZXJpdmVTYWZlV2FsbGV0S2V5cycsICgpID0+IHtcbiAgY29uc3QgdXNlclJvb3QgPSBiaXAzMi5mcm9tU2VlZChCdWZmZXIuZnJvbSgnMDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGYnLCAnaGV4JykpO1xuICBjb25zdCBiYWNrdXBSb290ID0gYmlwMzIuZnJvbVNlZWQoXG4gICAgQnVmZmVyLmZyb20oJzFmMWUxZDFjMWIxYTE5MTgxNzE2MTUxNDEzMTIxMTEwMGYwZTBkMGMwYjBhMDkwODA3MDYwNTA0MDMwMjAxMDAnLCAnaGV4JylcbiAgKTtcbiAgY29uc3QgYml0Z29Sb290ID0gYmlwMzJcbiAgICAuZnJvbVNlZWQoQnVmZmVyLmZyb20oJzJmMmUyZDJjMmIyYTI5MjgyNzI2MjUyNDIzMjIyMTIwMWYxZTFkMWMxYjFhMTkxODE3MTYxNTE0MTMxMjExMTAnLCAnaGV4JykpXG4gICAgLm5ldXRlcmVkKCk7XG5cbiAgY29uc3Qgcm9vdHMgPSBtYWtlUm9vdHMoe1xuICAgIHVzZXI6IHVzZXJSb290LnRvQmFzZTU4KCksXG4gICAgYmFja3VwOiBiYWNrdXBSb290LnRvQmFzZTU4KCksXG4gICAgYml0Z286IGJpdGdvUm9vdC50b0Jhc2U1OCgpLFxuICB9KTtcblxuICBpdCgnZGVyaXZlcyB0aGUgQklQNDQgY2hpbGQgdHJpcGxldCBmb3Igc2xvdCAxJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlcml2ZVNhZmVXYWxsZXRLZXlzKHsgY29pbjogJ2J0YycsIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsIGFjY291bnQ6IDAsIHJvb3RzIH0pO1xuICAgIGlmIChyZXN1bHQuc2xvdCAhPT0gJ3NlY3AyNTZrMU11bHRpc2lnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzZWNwMjU2azFNdWx0aXNpZyBzbG90Jyk7XG4gICAgfVxuXG4gICAgcmVzdWx0LnBhdGguc2hvdWxkLmVxdWFsKFwibS80NCcvMCcvMScvMCdcIik7XG4gICAgcmVzdWx0LmtleXMudXNlci5wcnYuc2hvdWxkLmVxdWFsKHVzZXJSb290LmRlcml2ZVBhdGgoXCJtLzQ0Jy8wJy8xJy8wJ1wiKS50b0Jhc2U1OCgpKTtcbiAgICByZXN1bHQua2V5cy51c2VyLnB1Yi5zaG91bGQuZXF1YWwodXNlclJvb3QuZGVyaXZlUGF0aChcIm0vNDQnLzAnLzEnLzAnXCIpLm5ldXRlcmVkKCkudG9CYXNlNTgoKSk7XG4gICAgcmVzdWx0LmtleXMuYmFja3VwLnBydi5zaG91bGQuZXF1YWwoYmFja3VwUm9vdC5kZXJpdmVQYXRoKCdtLzQ0LzAvMS8wJykudG9CYXNlNTgoKSk7XG4gICAgcmVzdWx0LmtleXMuYml0Z28ucHViLnNob3VsZC5lcXVhbChiaXRnb1Jvb3QuZGVyaXZlUGF0aCgnbS80NC8wLzEvMCcpLnRvQmFzZTU4KCkpO1xuICB9KTtcblxuICBpdCgndmFyaWVzIHRoZSBwYXRoIHdpdGggdGhlIGFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVyaXZlU2FmZVdhbGxldEtleXMoeyBjb2luOiAnYnRjJywgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJywgYWNjb3VudDogMiwgcm9vdHMgfSk7XG4gICAgcmVzdWx0LnBhdGguc2hvdWxkLmVxdWFsKFwibS80NCcvMCcvMScvMidcIik7XG4gIH0pO1xuXG4gIGl0KCdkZXJpdmVzIHRoZSBlY2RzYU1wYyBjaGlsZCB2aWEgdGhlIERLTHMgY2VyZW1vbnknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3VzZXJEa2csIGJhY2t1cERrZ10gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbdnJmVXNlciwgdnJmQmFja3VwXSA9IGF3YWl0IERrbHNWcmZVdGlscy5nZW5lcmF0ZVZyZkRLR0tleVNoYXJlcygpO1xuXG4gICAgY29uc3QgbXBjUm9vdHM6IERlY3J5cHRlZFNhZmVSb290cyA9IHtcbiAgICAgIC4uLnJvb3RzLFxuICAgICAgZWNkc2FNcGM6IHtcbiAgICAgICAgdXNlcjogeyBzaWduaW5nOiB1c2VyRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLCB2cmY6IHZyZlVzZXIuZ2V0S2V5U2hhcmUoKSB9LFxuICAgICAgICBiYWNrdXA6IHsgc2lnbmluZzogYmFja3VwRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLCB2cmY6IHZyZkJhY2t1cC5nZXRLZXlTaGFyZSgpIH0sXG4gICAgICAgIGJpdGdvOiAnZycsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXJpdmVTYWZlV2FsbGV0S2V5cyh7IGNvaW46ICdldGgnLCBzbG90OiAnZWNkc2FNcGMnLCBhY2NvdW50OiAwLCByb290czogbXBjUm9vdHMgfSk7XG4gICAgaWYgKHJlc3VsdC5zbG90ICE9PSAnZWNkc2FNcGMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGVjZHNhTXBjIHNsb3QnKTtcbiAgICB9XG5cbiAgICByZXN1bHQucGF0aC5zaG91bGQuZXF1YWwoXCJtLzQ0Jy82MCcvMycvMCdcIik7XG4gICAgcmVzdWx0LmtleXMuY29tbW9uS2V5Y2hhaW4uc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgcmVzdWx0LmtleXMudXNlci5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICByZXN1bHQua2V5cy5iYWNrdXAuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIHVuc3VwcG9ydGVkIHNsb3RzJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGRlcml2ZVNhZmVXYWxsZXRLZXlzKHsgY29pbjogJ2J0YycsIHNsb3Q6ICdlZGRzYU1wYycsIGFjY291bnQ6IDAsIHJvb3RzIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAvbm90IHN1cHBvcnRlZCB5ZXQvXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSBub24taW50ZWdlciBhY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGRlcml2ZVNhZmVXYWxsZXRLZXlzKHsgY29pbjogJ2J0YycsIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsIGFjY291bnQ6IDEuNSwgcm9vdHMgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgIC9pbnZhbGlkIGFjY291bnQvXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2J1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMnLCAoKSA9PiB7XG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBjb25zdCB1c2VyUm9vdCA9IGJpcDMyLmZyb21TZWVkKEJ1ZmZlci5mcm9tKCcwMDAxMDIwMzA0MDUwNjA3MDgwOTBhMGIwYzBkMGUwZicsICdoZXgnKSk7XG4gIGNvbnN0IGJhY2t1cFJvb3QgPSBiaXAzMi5mcm9tU2VlZChcbiAgICBCdWZmZXIuZnJvbSgnMWYxZTFkMWMxYjFhMTkxODE3MTYxNTE0MTMxMjExMTAwZjBlMGQwYzBiMGEwOTA4MDcwNjA1MDQwMzAyMDEwMCcsICdoZXgnKVxuICApO1xuICBjb25zdCBiaXRnb1Jvb3QgPSBiaXAzMlxuICAgIC5mcm9tU2VlZChCdWZmZXIuZnJvbSgnMmYyZTJkMmMyYjJhMjkyODI3MjYyNTI0MjMyMjIxMjAxZjFlMWQxYzFiMWExOTE4MTcxNjE1MTQxMzEyMTExMCcsICdoZXgnKSlcbiAgICAubmV1dGVyZWQoKTtcblxuICBjb25zdCBrZXlzID0ge1xuICAgIHVzZXI6IHsgcHJ2OiB1c2VyUm9vdC50b0Jhc2U1OCgpLCBwdWI6IHVzZXJSb290Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSB9LFxuICAgIGJhY2t1cDogeyBwcnY6IGJhY2t1cFJvb3QudG9CYXNlNTgoKSwgcHViOiBiYWNrdXBSb290Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSB9LFxuICAgIGJpdGdvOiB7IHB1YjogYml0Z29Sb290LnRvQmFzZTU4KCkgfSxcbiAgfTtcblxuICBpdCgnc2lnbmVkIG1vZGUgcmUtZW5jcnlwdHMgY2hpbGQgeHBydnMgdW5kZXIgYSBzaW5nbGUgZXBoZW1lcmFsIHBhc3NwaHJhc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGFzc3BocmFzZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZW5jcnlwdCA9IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoYXN5bmMgKHsgaW5wdXQsIHBhc3N3b3JkLCBlbmNyeXB0aW9uVmVyc2lvbiB9KSA9PiB7XG4gICAgICBwYXNzcGhyYXNlcy5wdXNoKHBhc3N3b3JkKTtcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHJldHVybiBgZW5jKCR7aW5wdXR9KWA7XG4gICAgfSk7XG4gICAgY29uc3QgYml0Z28gPSB7IGVuY3J5cHQgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMoe1xuICAgICAgYml0Z28sXG4gICAgICBjb2luOiAnYnRjJyxcbiAgICAgIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsXG4gICAgICBrZXlzLFxuICAgICAgbW9kZTogJ3NpZ25lZCcsXG4gICAgfSk7XG5cbiAgICByZXN1bHQudXNlcktleS5zaG91bGQuZXF1YWwoYGVuYygke2tleXMudXNlci5wcnZ9KWApO1xuICAgIHJlc3VsdC5iYWNrdXBLZXkuc2hvdWxkLmVxdWFsKGBlbmMoJHtrZXlzLmJhY2t1cC5wcnZ9KWApO1xuICAgIHJlc3VsdC5iaXRnb0tleS5zaG91bGQuZXF1YWwoa2V5cy5iaXRnby5wdWIpO1xuICAgIChyZXN1bHQud2FsbGV0UGFzc3BocmFzZSBhcyBzdHJpbmcpLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgIHBhc3NwaHJhc2VzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICBwYXNzcGhyYXNlc1swXS5zaG91bGQuZXF1YWwocGFzc3BocmFzZXNbMV0pO1xuICAgIHBhc3NwaHJhc2VzWzBdLnNob3VsZC5lcXVhbChyZXN1bHQud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgZW5jcnlwdC5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDIpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBub24tcHJpdmF0ZSBjaGlsZCBrZXlzIGluIHNpZ25lZCBtb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0geyBlbmNyeXB0OiBzaW5vbi5zdHViKCkgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcbiAgICBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgIGJpdGdvLFxuICAgICAgY29pbjogJ2J0YycsXG4gICAgICBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnLFxuICAgICAga2V5czogeyB1c2VyOiB7IHBydjoga2V5cy51c2VyLnB1YiwgcHViOiBrZXlzLnVzZXIucHViIH0sIGJhY2t1cDoga2V5cy5iYWNrdXAsIGJpdGdvOiBrZXlzLmJpdGdvIH0sXG4gICAgICBtb2RlOiAnc2lnbmVkJyxcbiAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9tdXN0IGJlIHByaXZhdGUgeHBydnMvKTtcbiAgfSk7XG5cbiAgaXQoJ3Vuc2lnbmVkIG1vZGUgcmV0dXJucyBwdWJzIGFuZCBuZXZlciBlbmNyeXB0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbmNyeXB0ID0gc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHQgc2hvdWxkIG5vdCBiZSBjYWxsZWQnKTtcbiAgICB9KTtcbiAgICBjb25zdCBiaXRnbyA9IHsgZW5jcnlwdCB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyh7XG4gICAgICBiaXRnbyxcbiAgICAgIGNvaW46ICdidGMnLFxuICAgICAgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJyxcbiAgICAgIGtleXMsXG4gICAgICBtb2RlOiAndW5zaWduZWQnLFxuICAgIH0pO1xuXG4gICAgcmVzdWx0LnVzZXJLZXkuc2hvdWxkLmVxdWFsKGtleXMudXNlci5wdWIpO1xuICAgIHJlc3VsdC5iYWNrdXBLZXkuc2hvdWxkLmVxdWFsKGtleXMuYmFja3VwLnB1Yik7XG4gICAgcmVzdWx0LmJpdGdvS2V5LnNob3VsZC5lcXVhbChrZXlzLmJpdGdvLnB1Yik7XG4gICAgcmVzdWx0LnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnd2FsbGV0UGFzc3BocmFzZScpO1xuICAgIGVuY3J5cHQuY2FsbENvdW50LnNob3VsZC5lcXVhbCgwKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgdW5zdXBwb3J0ZWQgc2xvdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSB7IGVuY3J5cHQ6IHNpbm9uLnN0dWIoKSB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgIGF3YWl0IGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMoe1xuICAgICAgYml0Z28sXG4gICAgICBjb2luOiAnYnRjJyxcbiAgICAgIHNsb3Q6ICdlZGRzYU1wYycsXG4gICAgICBrZXlzLFxuICAgICAgbW9kZTogJ3NpZ25lZCcsXG4gICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm90IHN1cHBvcnRlZCB5ZXQvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1NhZmUgZWNkc2FNcGMgZGVyaXZlIOKGkiBzaWduIChnYXRlKScsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2Rlcml2ZXMgYSBjaGlsZCwgcmVidWlsZHMgMi1vZi0yIHNoYXJlcywgYW5kIHNpZ25zIGEgbWVzc2FnZSB2ZXJpZmllZCBhdCBtLzAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgW3VzZXJEa2csIGJhY2t1cERrZ10gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbdnJmVXNlciwgdnJmQmFja3VwXSA9IGF3YWl0IERrbHNWcmZVdGlscy5nZW5lcmF0ZVZyZkRLR0tleVNoYXJlcygpO1xuXG4gICAgY29uc3Qgcm9vdENvbW1vbktleWNoYWluID0gRGtsc1R5cGVzLmdldENvbW1vbktleWNoYWluKHVzZXJEa2cuZ2V0S2V5U2hhcmUoKSk7XG5cbiAgICBjb25zdCB7IGNvbW1vbktleWNoYWluLCB1c2VyQ2hpbGQsIGJhY2t1cENoaWxkIH0gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZGVyaXZlU2FmZUVjZHNhTXBjQ2hpbGQoe1xuICAgICAgdXNlclJvb3Q6IHsgc2lnbmluZzogdXNlckRrZy5nZXRSZWR1Y2VkS2V5U2hhcmUoKSwgdnJmOiB2cmZVc2VyLmdldEtleVNoYXJlKCkgfSxcbiAgICAgIGJhY2t1cFJvb3Q6IHsgc2lnbmluZzogYmFja3VwRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLCB2cmY6IHZyZkJhY2t1cC5nZXRLZXlTaGFyZSgpIH0sXG4gICAgICBhY2NvdW50OiAwLFxuICAgICAgY29pblR5cGU6IDYwLFxuICAgIH0pO1xuXG4gICAgLy8gVGhlIGRlcml2ZWQgY2hpbGQgbXVzdCBuZXZlciBiZSB0aGUgcm9vdCAodGhlIFwicm9vdCBlbnZlbG9wZSBpbiB0aGUgY2hpbGQgcG9zaXRpb25cIiBmb290Z3VuKS5cbiAgICBjb21tb25LZXljaGFpbi5zaG91bGQubm90LmVxdWFsKHJvb3RDb21tb25LZXljaGFpbik7XG5cbiAgICAvLyBSZWJ1aWxkIDItb2YtMiBrZXlzaGFyZXMgZnJvbSB0aGUgZGVyaXZlZCByZWR1Y2VkIENCT1IsIGV4YWN0bHkgYXMgdGhlIHNpZ25lcidzIHJldHJvZml0IGRvZXMuXG4gICAgY29uc3QgdG9SZXRyb2ZpdCA9IChiNjQ6IHN0cmluZyk6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEgPT4ge1xuICAgICAgY29uc3QgcmVkdWNlZCA9IERrbHNUeXBlcy5nZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKEJ1ZmZlci5mcm9tKGI2NCwgJ2Jhc2U2NCcpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHhTaGFyZToge1xuICAgICAgICAgIHg6IEJ1ZmZlci5mcm9tKHJlZHVjZWQucHJ2KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgeTogQnVmZmVyLmZyb20ocmVkdWNlZC5wdWIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBjaGFpbmNvZGU6IEJ1ZmZlci5mcm9tKHJlZHVjZWQucm9vdENoYWluQ29kZSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9LFxuICAgICAgICB4aUxpc3Q6IHJlZHVjZWQueExpc3Quc2xpY2UoMCwgMiksXG4gICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgW3VzZXIyb2YyLCBiYWNrdXAyb2YyXSA9IGF3YWl0IERrbHNVdGlscy5nZW5lcmF0ZTJvZjJLZXlTaGFyZXMoXG4gICAgICB0b1JldHJvZml0KHVzZXJDaGlsZCksXG4gICAgICB0b1JldHJvZml0KGJhY2t1cENoaWxkKVxuICAgICk7XG5cbiAgICBjb25zdCBtZXNzYWdlSGFzaCA9IEJ1ZmZlci5mcm9tKCcwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmJywgJ2hleCcpO1xuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRGtsc0RzZy5Ec2codXNlcjJvZjIuZ2V0S2V5U2hhcmUoKSwgMCwgJ20vMCcsIG1lc3NhZ2VIYXNoKTtcbiAgICBjb25zdCBiYWNrdXBEc2cgPSBuZXcgRGtsc0RzZy5Ec2coYmFja3VwMm9mMi5nZXRLZXlTaGFyZSgpLCAxLCAnbS8wJywgbWVzc2FnZUhhc2gpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVN0cmluZyA9IERrbHNVdGlscy52ZXJpZnlBbmRDb252ZXJ0RGtsc1NpZ25hdHVyZShcbiAgICAgIG1lc3NhZ2VIYXNoLFxuICAgICAgKGF3YWl0IERrbHNVdGlscy5leGVjdXRlVGlsbFJvdW5kKDUsIHVzZXJEc2csIGJhY2t1cERzZykpIGFzIERrbHNUeXBlcy5EZXNlcmlhbGl6ZWREa2xzU2lnbmF0dXJlLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICAnbS8wJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGZhbHNlXG4gICAgKTtcblxuICAgIC8vIHZlcmlmeUFuZENvbnZlcnREa2xzU2lnbmF0dXJlIHJlY292ZXJzIHRoZSBwdWJrZXkgZnJvbSB0aGUgc2lnbmF0dXJlIGFuZCBjaGVja3MgaXQgYWdhaW5zdFxuICAgIC8vIGRlcml2ZVVuaGFyZGVuZWQoY2hpbGRDSywgJ20vMCcpOyBpdCB0aHJvd3Mgb24gbWlzbWF0Y2gsIHNvIGEgcmV0dXJuZWQgc3RyaW5nIGlzIHByb29mLlxuICAgIHNpZ25hdHVyZVN0cmluZy5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICBzaWduYXR1cmVTdHJpbmcuc2hvdWxkLm1hdGNoKC9eXFxkKzpbMC05YS1mXSs6WzAtOWEtZl0rOlswLTlhLWZdKyQvKTtcbiAgfSk7XG59KTtcbiJdfQ==
|