@bitgo-beta/sdk-core 8.2.1-beta.1821 → 8.2.1-beta.1822
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/baseCoin/baseCoin.d.ts +14 -1
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +16 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +57 -0
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts +25 -0
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/addressVerification.js +31 -13
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +7 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +23 -32
- package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +2 -1
- package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
- package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +6 -3
- package/dist/test/unit/bitgo/utils/tss/addressVerification.js +45 -1
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +4 -1
- package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/**
|
|
7
|
+
* @prettier
|
|
8
|
+
*/
|
|
9
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
10
|
+
require("should");
|
|
11
|
+
const wallet_1 = require("../../../../src/bitgo/wallet/wallet");
|
|
12
|
+
const coins_1 = require("../../../../src/coins");
|
|
13
|
+
const OFC_ZEC_CONFIG = {
|
|
14
|
+
coin: 'ofczec',
|
|
15
|
+
decimalPlaces: 8,
|
|
16
|
+
name: 'OFCZEC',
|
|
17
|
+
type: 'ofczec',
|
|
18
|
+
backingCoin: 'zec',
|
|
19
|
+
isFiat: false,
|
|
20
|
+
};
|
|
21
|
+
describe('Wallet - OFC createAddress', function () {
|
|
22
|
+
let mockBitGo;
|
|
23
|
+
let ofcToken;
|
|
24
|
+
let keychainsGetStub;
|
|
25
|
+
function makePostChain(resolved) {
|
|
26
|
+
const chain = {};
|
|
27
|
+
chain.send = sinon_1.default.stub().returns(chain);
|
|
28
|
+
chain.result = sinon_1.default.stub().resolves(resolved);
|
|
29
|
+
return chain;
|
|
30
|
+
}
|
|
31
|
+
beforeEach(function () {
|
|
32
|
+
keychainsGetStub = sinon_1.default.stub().resolves({ id: 'user-key-id', pub: 'xpub-value' });
|
|
33
|
+
mockBitGo = {
|
|
34
|
+
url: sinon_1.default.stub().returns('https://test.bitgo.com/'),
|
|
35
|
+
post: sinon_1.default.stub(),
|
|
36
|
+
setRequestTracer: sinon_1.default.stub(),
|
|
37
|
+
};
|
|
38
|
+
ofcToken = new coins_1.OfcToken(mockBitGo, OFC_ZEC_CONFIG);
|
|
39
|
+
mockBitGo.coin = sinon_1.default.stub().returns(ofcToken);
|
|
40
|
+
sinon_1.default.stub(coins_1.OfcToken.prototype, 'keychains').returns({ get: keychainsGetStub });
|
|
41
|
+
});
|
|
42
|
+
afterEach(function () {
|
|
43
|
+
sinon_1.default.restore();
|
|
44
|
+
});
|
|
45
|
+
const mockAddressResponse = {
|
|
46
|
+
id: 'new-address-id',
|
|
47
|
+
address: 'bg-aabbccddeeff00112233445566778899',
|
|
48
|
+
chain: 0,
|
|
49
|
+
index: 1,
|
|
50
|
+
};
|
|
51
|
+
describe('single-key OFC wallet (userKeySigningRequired: true)', function () {
|
|
52
|
+
it('should create a receive address without fetching any keychains', async function () {
|
|
53
|
+
const walletData = {
|
|
54
|
+
id: 'wallet-id',
|
|
55
|
+
coin: 'ofc',
|
|
56
|
+
keys: ['user-key-id'],
|
|
57
|
+
type: 'trading',
|
|
58
|
+
multisigType: 'onchain',
|
|
59
|
+
enterprise: 'ent-id',
|
|
60
|
+
userKeySigningRequired: true,
|
|
61
|
+
};
|
|
62
|
+
const wallet = new wallet_1.Wallet(mockBitGo, ofcToken, walletData);
|
|
63
|
+
mockBitGo.post.returns(makePostChain(mockAddressResponse));
|
|
64
|
+
const result = await wallet.createAddress({ onToken: 'ofczec' });
|
|
65
|
+
result.should.have.property('id', 'new-address-id');
|
|
66
|
+
result.should.have.property('address', 'bg-aabbccddeeff00112233445566778899');
|
|
67
|
+
keychainsGetStub.called.should.be.false();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('two-key OFC wallet (userKeySigningRequired: false)', function () {
|
|
71
|
+
it('should create a receive address without fetching keychains', async function () {
|
|
72
|
+
const walletData = {
|
|
73
|
+
id: 'wallet-id',
|
|
74
|
+
coin: 'ofc',
|
|
75
|
+
keys: ['user-key-id', 'bitgo-key-id'],
|
|
76
|
+
type: 'trading',
|
|
77
|
+
multisigType: 'onchain',
|
|
78
|
+
enterprise: 'ent-id',
|
|
79
|
+
userKeySigningRequired: false,
|
|
80
|
+
};
|
|
81
|
+
const wallet = new wallet_1.Wallet(mockBitGo, ofcToken, walletData);
|
|
82
|
+
mockBitGo.post.returns(makePostChain(mockAddressResponse));
|
|
83
|
+
const result = await wallet.createAddress({ onToken: 'ofczec' });
|
|
84
|
+
result.should.have.property('id', 'new-address-id');
|
|
85
|
+
keychainsGetStub.called.should.be.false();
|
|
86
|
+
});
|
|
87
|
+
it('should succeed even if keychains().get() would fail for a server-managed key', async function () {
|
|
88
|
+
keychainsGetStub.rejects(new Error('key not found'));
|
|
89
|
+
const walletData = {
|
|
90
|
+
id: 'wallet-id',
|
|
91
|
+
coin: 'ofc',
|
|
92
|
+
keys: ['user-key-id', 'bitgo-key-id'],
|
|
93
|
+
type: 'trading',
|
|
94
|
+
multisigType: 'onchain',
|
|
95
|
+
enterprise: 'ent-id',
|
|
96
|
+
userKeySigningRequired: false,
|
|
97
|
+
};
|
|
98
|
+
const wallet = new wallet_1.Wallet(mockBitGo, ofcToken, walletData);
|
|
99
|
+
mockBitGo.post.returns(makePostChain(mockAddressResponse));
|
|
100
|
+
const result = await wallet.createAddress({ onToken: 'ofczec' });
|
|
101
|
+
result.should.have.property('id', 'new-address-id');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('non-OFC wallet (eth)', function () {
|
|
105
|
+
it('should still fetch keychains for address verification', async function () {
|
|
106
|
+
const mockEthCoin = {
|
|
107
|
+
getFamily: sinon_1.default.stub().returns('eth'),
|
|
108
|
+
isEVM: sinon_1.default.stub().returns(true),
|
|
109
|
+
supportsTss: sinon_1.default.stub().returns(false),
|
|
110
|
+
url: sinon_1.default.stub().returns('/api/v2/eth/wallet/wallet-id/address'),
|
|
111
|
+
isWalletAddress: sinon_1.default.stub().resolves(true),
|
|
112
|
+
keychains: sinon_1.default.stub().returns({ get: keychainsGetStub }),
|
|
113
|
+
};
|
|
114
|
+
const walletData = {
|
|
115
|
+
id: 'wallet-id',
|
|
116
|
+
coin: 'eth',
|
|
117
|
+
keys: ['user-key-id', 'backup-key-id', 'bitgo-key-id'],
|
|
118
|
+
coinSpecific: { pendingChainInitialization: false },
|
|
119
|
+
};
|
|
120
|
+
const wallet = new wallet_1.Wallet(mockBitGo, mockEthCoin, walletData);
|
|
121
|
+
mockBitGo.post.returns(makePostChain({ id: 'eth-addr-id', address: '0xabc', coinSpecific: {} }));
|
|
122
|
+
await wallet.createAddress({});
|
|
123
|
+
keychainsGetStub.callCount.should.equal(3);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('missing onToken parameter', function () {
|
|
127
|
+
it('should throw for OFC wallets when onToken is omitted', async function () {
|
|
128
|
+
const walletData = {
|
|
129
|
+
id: 'wallet-id',
|
|
130
|
+
coin: 'ofc',
|
|
131
|
+
keys: ['user-key-id'],
|
|
132
|
+
type: 'trading',
|
|
133
|
+
multisigType: 'onchain',
|
|
134
|
+
enterprise: 'ent-id',
|
|
135
|
+
};
|
|
136
|
+
const wallet = new wallet_1.Wallet(mockBitGo, ofcToken, walletData);
|
|
137
|
+
await wallet.createAddress({}).should.be.rejectedWith('onToken is a mandatory parameter for OFC wallets');
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjV2FsbGV0QWRkcmVzc0NyZWF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9vZmNXYWxsZXRBZGRyZXNzQ3JlYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIsZ0VBQTZEO0FBQzdELGlEQUFpRDtBQUVqRCxNQUFNLGNBQWMsR0FBRztJQUNyQixJQUFJLEVBQUUsUUFBUTtJQUNkLGFBQWEsRUFBRSxDQUFDO0lBQ2hCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLFFBQVE7SUFDZCxXQUFXLEVBQUUsS0FBSztJQUNsQixNQUFNLEVBQUUsS0FBSztDQUNkLENBQUM7QUFFRixRQUFRLENBQUMsNEJBQTRCLEVBQUU7SUFDckMsSUFBSSxTQUFjLENBQUM7SUFDbkIsSUFBSSxRQUFrQixDQUFDO0lBQ3ZCLElBQUksZ0JBQWlDLENBQUM7SUFFdEMsU0FBUyxhQUFhLENBQUMsUUFBaUI7UUFDdEMsTUFBTSxLQUFLLEdBQVEsRUFBRSxDQUFDO1FBQ3RCLEtBQUssQ0FBQyxJQUFJLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxLQUFLLENBQUMsTUFBTSxHQUFHLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsVUFBVSxDQUFDO1FBQ1QsZ0JBQWdCLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDbkYsU0FBUyxHQUFHO1lBQ1YsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FB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c0RBQXNELEVBQUUsS0FBSztZQUM5RCxNQUFNLFVBQVUsR0FBRztnQkFDakIsRUFBRSxFQUFFLFdBQVc7Z0JBQ2YsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDO2dCQUNyQixJQUFJLEVBQUUsU0FBUztnQkFDZixZQUFZLEVBQUUsU0FBUztnQkFDdkIsVUFBVSxFQUFFLFFBQVE7YUFDckIsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFM0QsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDNUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0JztcbmltcG9ydCB7IE9mY1Rva2VuIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2NvaW5zJztcblxuY29uc3QgT0ZDX1pFQ19DT05GSUcgPSB7XG4gIGNvaW46ICdvZmN6ZWMnLFxuICBkZWNpbWFsUGxhY2VzOiA4LFxuICBuYW1lOiAnT0ZDWkVDJyxcbiAgdHlwZTogJ29mY3plYycsXG4gIGJhY2tpbmdDb2luOiAnemVjJyxcbiAgaXNGaWF0OiBmYWxzZSxcbn07XG5cbmRlc2NyaWJlKCdXYWxsZXQgLSBPRkMgY3JlYXRlQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgb2ZjVG9rZW46IE9mY1Rva2VuO1xuICBsZXQga2V5Y2hhaW5zR2V0U3R1Yjogc2lub24uU2lub25TdHViO1xuXG4gIGZ1bmN0aW9uIG1ha2VQb3N0Q2hhaW4ocmVzb2x2ZWQ6IHVua25vd24pOiBhbnkge1xuICAgIGNvbnN0IGNoYWluOiBhbnkgPSB7fTtcbiAgICBjaGFpbi5zZW5kID0gc2lub24uc3R1YigpLnJldHVybnMoY2hhaW4pO1xuICAgIGNoYWluLnJlc3VsdCA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyhyZXNvbHZlZCk7XG4gICAgcmV0dXJuIGNoYWluO1xuICB9XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAga2V5Y2hhaW5zR2V0U3R1YiA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiAndXNlci1rZXktaWQnLCBwdWI6ICd4cHViLXZhbHVlJyB9KTtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdodHRwczovL3Rlc3QuYml0Z28uY29tLycpLFxuICAgICAgcG9zdDogc2lub24uc3R1YigpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG4gICAgb2ZjVG9rZW4gPSBuZXcgT2ZjVG9rZW4obW9ja0JpdEdvLCBPRkNfWkVDX0NPTkZJRyk7XG4gICAgbW9ja0JpdEdvLmNvaW4gPSBzaW5vbi5zdHViKCkucmV0dXJucyhvZmNUb2tlbik7XG4gICAgc2lub24uc3R1YihPZmNUb2tlbi5wcm90b3R5cGUsICdrZXljaGFpbnMnKS5yZXR1cm5zKHsgZ2V0OiBrZXljaGFpbnNHZXRTdHViIH0gYXMgYW55KTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGNvbnN0IG1vY2tBZGRyZXNzUmVzcG9uc2UgPSB7XG4gICAgaWQ6ICduZXctYWRkcmVzcy1pZCcsXG4gICAgYWRkcmVzczogJ2JnLWFhYmJjY2RkZWVmZjAwMTEyMjMzNDQ1NTY2Nzc4ODk5JyxcbiAgICBjaGFpbjogMCxcbiAgICBpbmRleDogMSxcbiAgfTtcblxuICBkZXNjcmliZSgnc2luZ2xlLWtleSBPRkMgd2FsbGV0ICh1c2VyS2V5U2lnbmluZ1JlcXVpcmVkOiB0cnVlKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIHJlY2VpdmUgYWRkcmVzcyB3aXRob3V0IGZldGNoaW5nIGFueSBrZXljaGFpbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXREYXRhID0ge1xuICAgICAgICBpZDogJ3dhbGxldC1pZCcsXG4gICAgICAgIGNvaW46ICdvZmMnLFxuICAgICAgICBrZXlzOiBbJ3VzZXIta2V5LWlkJ10sXG4gICAgICAgIHR5cGU6ICd0cmFkaW5nJyxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIGVudGVycHJpc2U6ICdlbnQtaWQnLFxuICAgICAgICB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBvZmNUb2tlbiwgd2FsbGV0RGF0YSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKG1ha2VQb3N0Q2hhaW4obW9ja0FkZHJlc3NSZXNwb25zZSkpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuY3JlYXRlQWRkcmVzcyh7IG9uVG9rZW46ICdvZmN6ZWMnIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2lkJywgJ25ldy1hZGRyZXNzLWlkJyk7XG4gICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FkZHJlc3MnLCAnYmctYWFiYmNjZGRlZWZmMDAxMTIyMzM0NDU1NjY3Nzg4OTknKTtcbiAgICAgIGtleWNoYWluc0dldFN0dWIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHdvLWtleSBPRkMgd2FsbGV0ICh1c2VyS2V5U2lnbmluZ1JlcXVpcmVkOiBmYWxzZSknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYSByZWNlaXZlIGFkZHJlc3Mgd2l0aG91dCBmZXRjaGluZyBrZXljaGFpbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXREYXRhID0ge1xuICAgICAgICBpZDogJ3dhbGxldC1pZCcsXG4gICAgICAgIGNvaW46ICdvZmMnLFxuICAgICAgICBrZXlzOiBbJ3VzZXIta2V5LWlkJywgJ2JpdGdvLWtleS1pZCddLFxuICAgICAgICB0eXBlOiAndHJhZGluZycsXG4gICAgICAgIG11bHRpc2lnVHlwZTogJ29uY2hhaW4nLFxuICAgICAgICBlbnRlcnByaXNlOiAnZW50LWlkJyxcbiAgICAgICAgdXNlcktleVNpZ25pbmdSZXF1aXJlZDogZmFsc2UsXG4gICAgICB9O1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChtb2NrQml0R28sIG9mY1Rva2VuLCB3YWxsZXREYXRhKTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LnJldHVybnMobWFrZVBvc3RDaGFpbihtb2NrQWRkcmVzc1Jlc3BvbnNlKSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5jcmVhdGVBZGRyZXNzKHsgb25Ub2tlbjogJ29mY3plYycgfSk7XG5cbiAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaWQnLCAnbmV3LWFkZHJlc3MtaWQnKTtcbiAgICAgIGtleWNoYWluc0dldFN0dWIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGV2ZW4gaWYga2V5Y2hhaW5zKCkuZ2V0KCkgd291bGQgZmFpbCBmb3IgYSBzZXJ2ZXItbWFuYWdlZCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBrZXljaGFpbnNHZXRTdHViLnJlamVjdHMobmV3IEVycm9yKCdrZXkgbm90IGZvdW5kJykpO1xuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgICAgaWQ6ICd3YWxsZXQtaWQnLFxuICAgICAgICBjb2luOiAnb2ZjJyxcbiAgICAgICAga2V5czogWyd1c2VyLWtleS1pZCcsICdiaXRnby1rZXktaWQnXSxcbiAgICAgICAgdHlwZTogJ3RyYWRpbmcnLFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyxcbiAgICAgICAgZW50ZXJwcmlzZTogJ2VudC1pZCcsXG4gICAgICAgIHVzZXJLZXlTaWduaW5nUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBvZmNUb2tlbiwgd2FsbGV0RGF0YSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKG1ha2VQb3N0Q2hhaW4obW9ja0FkZHJlc3NSZXNwb25zZSkpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuY3JlYXRlQWRkcmVzcyh7IG9uVG9rZW46ICdvZmN6ZWMnIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdpZCcsICduZXctYWRkcmVzcy1pZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9uLU9GQyB3YWxsZXQgKGV0aCknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdGlsbCBmZXRjaCBrZXljaGFpbnMgZm9yIGFkZHJlc3MgdmVyaWZpY2F0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja0V0aENvaW46IGFueSA9IHtcbiAgICAgICAgZ2V0RmFtaWx5OiBzaW5vbi5zdHViKCkucmV0dXJucygnZXRoJyksXG4gICAgICAgIGlzRVZNOiBzaW5vbi5zdHViKCkucmV0dXJucyh0cnVlKSxcbiAgICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL2FwaS92Mi9ldGgvd2FsbGV0L3dhbGxldC1pZC9hZGRyZXNzJyksXG4gICAgICAgIGlzV2FsbGV0QWRkcmVzczogc2lub24uc3R1YigpLnJlc29sdmVzKHRydWUpLFxuICAgICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgZ2V0OiBrZXljaGFpbnNHZXRTdHViIH0pLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICAgICAgY29pbjogJ2V0aCcsXG4gICAgICAgIGtleXM6IFsndXNlci1rZXktaWQnLCAnYmFja3VwLWtleS1pZCcsICdiaXRnby1rZXktaWQnXSxcbiAgICAgICAgY29pblNwZWNpZmljOiB7IHBlbmRpbmdDaGFpbkluaXRpYWxpemF0aW9uOiBmYWxzZSB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrRXRoQ29pbiwgd2FsbGV0RGF0YSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKG1ha2VQb3N0Q2hhaW4oeyBpZDogJ2V0aC1hZGRyLWlkJywgYWRkcmVzczogJzB4YWJjJywgY29pblNwZWNpZmljOiB7fSB9KSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5jcmVhdGVBZGRyZXNzKHt9KTtcblxuICAgICAga2V5Y2hhaW5zR2V0U3R1Yi5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDMpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbWlzc2luZyBvblRva2VuIHBhcmFtZXRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBPRkMgd2FsbGV0cyB3aGVuIG9uVG9rZW4gaXMgb21pdHRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICAgICAgY29pbjogJ29mYycsXG4gICAgICAgIGtleXM6IFsndXNlci1rZXktaWQnXSxcbiAgICAgICAgdHlwZTogJ3RyYWRpbmcnLFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyxcbiAgICAgICAgZW50ZXJwcmlzZTogJ2VudC1pZCcsXG4gICAgICB9O1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChtb2NrQml0R28sIG9mY1Rva2VuLCB3YWxsZXREYXRhKTtcblxuICAgICAgYXdhaXQgd2FsbGV0LmNyZWF0ZUFkZHJlc3Moe30pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ29uVG9rZW4gaXMgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGZvciBPRkMgd2FsbGV0cycpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|