@bitgo-beta/sdk-coin-btc 1.2.3-alpha.406 → 1.2.3-alpha.407
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/test/unit/btc.d.ts +2 -0
- package/dist/test/unit/btc.d.ts.map +1 -0
- package/dist/test/unit/btc.js +220 -0
- package/dist/test/unit/fixtures/btcBackupKey.d.ts +4 -0
- package/dist/test/unit/fixtures/btcBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/btcBackupKey.js +10 -0
- package/dist/test/unit/fixtures/index.d.ts +2 -0
- package/dist/test/unit/fixtures/index.d.ts.map +1 -0
- package/dist/test/unit/fixtures/index.js +18 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +12 -9
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -839
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"btc.d.ts","sourceRoot":"","sources":["../../../test/unit/btc.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,220 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
require("should");
|
|
40
|
+
const assert_1 = __importDefault(require("assert"));
|
|
41
|
+
const fixtures_1 = require("./fixtures");
|
|
42
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
43
|
+
const src_1 = require("../../src");
|
|
44
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
45
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
46
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
47
|
+
describe('BTC:', () => {
|
|
48
|
+
let bitgo;
|
|
49
|
+
before(() => {
|
|
50
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
51
|
+
bitgo.safeRegister('tbtc', src_1.Tbtc.createInstance);
|
|
52
|
+
bitgo.initializeTestVars();
|
|
53
|
+
});
|
|
54
|
+
describe('Address validation:', () => {
|
|
55
|
+
let coin;
|
|
56
|
+
before(() => {
|
|
57
|
+
coin = bitgo.coin('tbtc');
|
|
58
|
+
});
|
|
59
|
+
it('should validate a base58 address', () => {
|
|
60
|
+
const validBase58Address = '2Mv1fGp8gHSqsiXYG7WqcYmHZdurDGVtUbn';
|
|
61
|
+
coin.isValidAddress(validBase58Address).should.be.true();
|
|
62
|
+
const invalidBase58Address = '2MV1FGP8GHSQSSXYG7WQCYMHZDURDGVTUBN';
|
|
63
|
+
coin.isValidAddress(invalidBase58Address).should.be.false();
|
|
64
|
+
});
|
|
65
|
+
it('should validate a bech32 address', () => {
|
|
66
|
+
const validBech32Address = 'tb1qtxxqmkkdx4n4lcp0nt2cct89uh3h3dlcu940kw9fcqyyq36peh0st94hfp';
|
|
67
|
+
coin.isValidAddress(validBech32Address).should.be.true();
|
|
68
|
+
coin.isValidAddress(validBech32Address.toUpperCase()).should.be.false();
|
|
69
|
+
});
|
|
70
|
+
it('should validate a bech32m address', () => {
|
|
71
|
+
// https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki#Test_vectors_for_Bech32m
|
|
72
|
+
const validBech32mAddress = 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7';
|
|
73
|
+
coin.isValidAddress(validBech32mAddress).should.be.true();
|
|
74
|
+
coin.isValidAddress(validBech32mAddress.toUpperCase()).should.be.false();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('Post Build Validation', () => {
|
|
78
|
+
let coin;
|
|
79
|
+
before(() => {
|
|
80
|
+
coin = bitgo.coin('tbtc');
|
|
81
|
+
});
|
|
82
|
+
it('should not modify locktime on postProcessPrebuild', async () => {
|
|
83
|
+
const txHex = '0100000001a8ec78f09f7acb0d344622ed3082c1a98e51ba1b1ab65406044f6e0a801609020100000000ffffffff02a0860100000000001976a9149f9a7abd600c0caa03983a77c8c3df8e062cb2fa88acfbf2150000000000220020b922cc1e737e679d24ff2d2b18cfa9fff4e35a733b4fba94282eaa1b7cfe56d200000000';
|
|
84
|
+
const blockHeight = 100;
|
|
85
|
+
const preBuild = { txHex, blockHeight };
|
|
86
|
+
const postProcessBuilt = await coin.postProcessPrebuild(preBuild);
|
|
87
|
+
const transaction = utxolib.bitgo.createTransactionFromHex(postProcessBuilt.txHex, utxolib.networks.bitcoin);
|
|
88
|
+
transaction.locktime.should.equal(0);
|
|
89
|
+
const inputs = transaction.ins;
|
|
90
|
+
for (const input of inputs) {
|
|
91
|
+
input.sequence.should.equal(0xffffffff);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('Audit Key', () => {
|
|
96
|
+
const { key } = fixtures_1.btcBackupKey;
|
|
97
|
+
let coin;
|
|
98
|
+
before(() => {
|
|
99
|
+
coin = bitgo.coin('tbtc');
|
|
100
|
+
});
|
|
101
|
+
it('should return for valid inputs', () => {
|
|
102
|
+
coin.assertIsValidKey({
|
|
103
|
+
encryptedPrv: key,
|
|
104
|
+
walletPassphrase: 'kAm[EFQ6o=SxlcLFDw%,',
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
it('should throw error if the walletPassphrase is incorrect', () => {
|
|
108
|
+
assert_1.default.throws(() => coin.assertIsValidKey({
|
|
109
|
+
encryptedPrv: key,
|
|
110
|
+
walletPassphrase: 'foo',
|
|
111
|
+
}), { message: "failed to decrypt prv: ccm: tag doesn't match" });
|
|
112
|
+
});
|
|
113
|
+
it('should return throw if the key is altered', () => {
|
|
114
|
+
const alteredKey = key.replace(/[0-9]/g, '0');
|
|
115
|
+
assert_1.default.throws(() => coin.assertIsValidKey({
|
|
116
|
+
encryptedPrv: alteredKey,
|
|
117
|
+
walletPassphrase: 'kAm[EFQ6o=SxlcLFDw%,',
|
|
118
|
+
}), { message: 'failed to decrypt prv: json decrypt: invalid parameters' });
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('Unspent management spoofability - Consolidation (BUILD_SIGN_SEND)', () => {
|
|
122
|
+
let coin;
|
|
123
|
+
let bitgoTest;
|
|
124
|
+
before(() => {
|
|
125
|
+
bitgoTest = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
126
|
+
bitgoTest.safeRegister('tbtc', src_1.Tbtc.createInstance);
|
|
127
|
+
bitgoTest.initializeTestVars();
|
|
128
|
+
coin = bitgoTest.coin('tbtc');
|
|
129
|
+
});
|
|
130
|
+
it('should detect hex spoofing in BUILD_SIGN_SEND', async () => {
|
|
131
|
+
const keyTriple = utxolib.testutil.getKeyTriple('default');
|
|
132
|
+
const rootWalletKey = new utxolib.bitgo.RootWalletKeys(keyTriple);
|
|
133
|
+
const [user] = keyTriple;
|
|
134
|
+
const wallet = new sdk_core_1.Wallet(bitgoTest, coin, {
|
|
135
|
+
id: '5b34252f1bf349930e34020a',
|
|
136
|
+
coin: 'tbtc',
|
|
137
|
+
keys: ['user', 'backup', 'bitgo'],
|
|
138
|
+
});
|
|
139
|
+
const originalPsbt = utxolib.testutil.constructPsbt([{ scriptType: 'p2wsh', value: BigInt(10000) }], [{ address: 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7', value: BigInt(9000) }], coin.network, rootWalletKey, 'unsigned');
|
|
140
|
+
utxolib.bitgo.addXpubsToPsbt(originalPsbt, rootWalletKey);
|
|
141
|
+
const spoofedPsbt = utxolib.testutil.constructPsbt([{ scriptType: 'p2wsh', value: BigInt(10000) }], [{ address: 'tb1pjgg9ty3s2ztp60v6lhgrw76f7hxydzuk9t9mjsndh3p2gf2ah7gs4850kn', value: BigInt(9000) }], coin.network, rootWalletKey, 'unsigned');
|
|
142
|
+
utxolib.bitgo.addXpubsToPsbt(spoofedPsbt, rootWalletKey);
|
|
143
|
+
const spoofedHex = spoofedPsbt.toHex();
|
|
144
|
+
const bgUrl = bitgoTest._baseUrl;
|
|
145
|
+
const nock = require('nock');
|
|
146
|
+
nock(bgUrl)
|
|
147
|
+
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/consolidateUnspents`)
|
|
148
|
+
.reply(200, { txHex: spoofedHex, consolidateId: 'test' });
|
|
149
|
+
nock(bgUrl)
|
|
150
|
+
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/send`)
|
|
151
|
+
.reply((requestBody) => {
|
|
152
|
+
if (requestBody?.txHex === spoofedHex) {
|
|
153
|
+
throw new Error('Spoofed transaction was sent: spoofing protection failed');
|
|
154
|
+
}
|
|
155
|
+
return [200, { txid: 'test-txid-123', status: 'signed' }];
|
|
156
|
+
});
|
|
157
|
+
const pubs = keyTriple.map((k) => k.neutered().toBase58());
|
|
158
|
+
const responses = [
|
|
159
|
+
{ pub: pubs[0], encryptedPrv: (0, sdk_api_1.encrypt)('pass', user.toBase58()) },
|
|
160
|
+
{ pub: pubs[1] },
|
|
161
|
+
{ pub: pubs[2] },
|
|
162
|
+
];
|
|
163
|
+
wallet
|
|
164
|
+
.keyIds()
|
|
165
|
+
.forEach((id, i) => nock(bgUrl).get(`/api/v2/${wallet.coin()}/key/${id}`).reply(200, responses[i]));
|
|
166
|
+
await assert_1.default.rejects(wallet.consolidateUnspents({ walletPassphrase: 'pass' }), (e) => typeof e?.message === 'string' &&
|
|
167
|
+
e.message.includes('prebuild attempts to spend to unintended external recipients'));
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('Unspent management spoofability - Fanout (BUILD_SIGN_SEND)', () => {
|
|
171
|
+
let coin;
|
|
172
|
+
let bitgoTest;
|
|
173
|
+
before(() => {
|
|
174
|
+
bitgoTest = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
175
|
+
bitgoTest.safeRegister('tbtc', src_1.Tbtc.createInstance);
|
|
176
|
+
bitgoTest.initializeTestVars();
|
|
177
|
+
coin = bitgoTest.coin('tbtc');
|
|
178
|
+
});
|
|
179
|
+
it('should detect hex spoofing in fanout BUILD_SIGN_SEND', async () => {
|
|
180
|
+
const keyTriple = utxolib.testutil.getKeyTriple('default');
|
|
181
|
+
const rootWalletKey = new utxolib.bitgo.RootWalletKeys(keyTriple);
|
|
182
|
+
const [user] = keyTriple;
|
|
183
|
+
const wallet = new sdk_core_1.Wallet(bitgoTest, coin, {
|
|
184
|
+
id: '5b34252f1bf349930e34020a',
|
|
185
|
+
coin: 'tbtc',
|
|
186
|
+
keys: ['user', 'backup', 'bitgo'],
|
|
187
|
+
});
|
|
188
|
+
const originalPsbt = utxolib.testutil.constructPsbt([{ scriptType: 'p2wsh', value: BigInt(10000) }], [{ address: 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7', value: BigInt(9000) }], coin.network, rootWalletKey, 'unsigned');
|
|
189
|
+
utxolib.bitgo.addXpubsToPsbt(originalPsbt, rootWalletKey);
|
|
190
|
+
const spoofedPsbt = utxolib.testutil.constructPsbt([{ scriptType: 'p2wsh', value: BigInt(10000) }], [{ address: 'tb1pjgg9ty3s2ztp60v6lhgrw76f7hxydzuk9t9mjsndh3p2gf2ah7gs4850kn', value: BigInt(9000) }], coin.network, rootWalletKey, 'unsigned');
|
|
191
|
+
utxolib.bitgo.addXpubsToPsbt(spoofedPsbt, rootWalletKey);
|
|
192
|
+
const spoofedHex = spoofedPsbt.toHex();
|
|
193
|
+
const bgUrl = bitgoTest._baseUrl;
|
|
194
|
+
const nock = require('nock');
|
|
195
|
+
nock(bgUrl)
|
|
196
|
+
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/fanoutUnspents`)
|
|
197
|
+
.reply(200, { txHex: spoofedHex, fanoutId: 'test' });
|
|
198
|
+
nock(bgUrl)
|
|
199
|
+
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/send`)
|
|
200
|
+
.reply((requestBody) => {
|
|
201
|
+
if (requestBody?.txHex === spoofedHex) {
|
|
202
|
+
throw new Error('Spoofed transaction was sent: spoofing protection failed');
|
|
203
|
+
}
|
|
204
|
+
return [200, { txid: 'test-txid-123', status: 'signed' }];
|
|
205
|
+
});
|
|
206
|
+
const pubs = keyTriple.map((k) => k.neutered().toBase58());
|
|
207
|
+
const responses = [
|
|
208
|
+
{ pub: pubs[0], encryptedPrv: (0, sdk_api_1.encrypt)('pass', user.toBase58()) },
|
|
209
|
+
{ pub: pubs[1] },
|
|
210
|
+
{ pub: pubs[2] },
|
|
211
|
+
];
|
|
212
|
+
wallet
|
|
213
|
+
.keyIds()
|
|
214
|
+
.forEach((id, i) => nock(bgUrl).get(`/api/v2/${wallet.coin()}/key/${id}`).reply(200, responses[i]));
|
|
215
|
+
await assert_1.default.rejects(wallet.fanoutUnspents({ walletPassphrase: 'pass' }), (e) => typeof e?.message === 'string' &&
|
|
216
|
+
e.message.includes('prebuild attempts to spend to unintended external recipients'));
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnRjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2J0Yy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtCQUFnQjtBQUNoQixvREFBNEI7QUFDNUIseUNBQTBDO0FBRTFDLG1EQUFvRTtBQUVwRSxtQ0FBaUM7QUFDakMsaURBQXdEO0FBQ3hELDhEQUFnRDtBQUVoRCxtREFBOEM7QUFFOUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7SUFDcEIsSUFBSSxLQUFtQixDQUFDO0lBRXhCLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDVixLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM3QixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7UUFDbkMsSUFBSSxJQUFVLENBQUM7UUFDZixNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFTLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO1lBQzFDLE1BQU0sa0JBQWtCLEdBQUcscUNBQXFDLENBQUM7WUFDakUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekQsTUFBTSxvQkFBb0IsR0FBRyxxQ0FBcUMsQ0FBQztZQUNuRSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFv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QyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDM0QsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBQSxpQkFBTyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRTtnQkFDaEUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNoQixFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7YUFDakIsQ0FBQztZQUNGLE1BQU07aUJBQ0gsTUFBTSxFQUFFO2lCQUNSLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdEcsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQ25ELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FDVCxPQUFPLENBQUMsRUFBRSxPQUFPLEtBQUssUUFBUTtnQkFDOUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsOERBQThELENBQUMsQ0FDckYsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGJ0Y0JhY2t1cEtleSB9IGZyb20gJy4vZml4dHVyZXMnO1xuXG5pbXBvcnQgeyB0eXBlIFRlc3RCaXRHb0FQSSwgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuXG5pbXBvcnQgeyBUYnRjIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IEJpdEdvQVBJLCBlbmNyeXB0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5kZXNjcmliZSgnQlRDOicsICgpID0+IHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG5cbiAgYmVmb3JlKCgpID0+IHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICd0ZXN0JyB9KTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RidGMnLCBUYnRjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0FkZHJlc3MgdmFsaWRhdGlvbjonLCAoKSA9PiB7XG4gICAgbGV0IGNvaW46IFRidGM7XG4gICAgYmVmb3JlKCgpID0+IHtcbiAgICAgIGNvaW4gPSBiaXRnby5jb2luKCd0YnRjJykgYXMgVGJ0YztcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYSBiYXNlNTggYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkQmFzZTU4QWRkcmVzcyA9ICcyTXYxZkdwOGdIU3FzaVhZRzdXcWNZbUhaZHVyREdWdFVibic7XG4gICAgICBjb2luLmlzVmFsaWRBZGRyZXNzKHZhbGlkQmFzZTU4QWRkcmVzcykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGNvbnN0IGludmFsaWRCYXNlNThBZGRyZXNzID0gJzJNVjFGR1A4R0hTUVNTWFlHN1dRQ1lNSFpEVVJER1ZUVUJOJztcbiAgICAgIGNvaW4uaXNWYWxpZEFkZHJlc3MoaW52YWxpZEJhc2U1OEFkZHJlc3MpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIGJlY2gzMiBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRCZWNoMzJBZGRyZXNzID0gJ3RiMXF0eHhxbWtrZHg0bjRsY3AwbnQyY2N0ODl1aDNoM2RsY3U5NDBrdzlmY3F5eXEzNnBlaDBzdDk0aGZwJztcbiAgICAgIGNvaW4uaXNWYWxpZEFkZHJlc3ModmFsaWRCZWNoMzJBZGRyZXNzKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgY29pbi5pc1ZhbGlkQWRkcmVzcyh2YWxpZEJlY2gzMkFkZHJlc3MudG9VcHBlckNhc2UoKSkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgYmVjaDMybSBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDM1MC5tZWRpYXdpa2kjVGVzdF92ZWN0b3JzX2Zvcl9CZWNoMzJtXG4gICAgICBjb25zdCB2YWxpZEJlY2gzMm1BZGRyZXNzID0gJ3RiMXFycDMzZzBxNWM1dHhzcDlhcnlzcng0azZ6ZGtmczRuY2U0eGowZ2RjY2NlZnZweXN4ZjNxMHNsNWs3JztcbiAgICAgIGNvaW4uaXNWYWxpZEFkZHJlc3ModmFsaWRCZWNoMzJtQWRkcmVzcykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGNvaW4uaXNWYWxpZEFkZHJlc3ModmFsaWRCZWNoMzJtQWRkcmVzcy50b1VwcGVyQ2FzZSgpKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Bvc3QgQnVpbGQgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBsZXQgY29pbjogVGJ0YztcbiAgICBiZWZvcmUoKCkgPT4ge1xuICAgICAgY29pbiA9IGJpdGdvLmNvaW4oJ3RidGMnKSBhcyBUYnRjO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgbW9kaWZ5IGxvY2t0aW1lIG9uIHBvc3RQcm9jZXNzUHJlYnVpbGQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEhleCA9XG4gICAgICAgICcwMTAwMDAwMDAxYThlYzc4ZjA5ZjdhY2IwZDM0NDYyMmVkMzA4MmMxYTk4ZTUxYmExYjFhYjY1NDA2MDQ0ZjZlMGE4MDE2MDkwMjAxMDAwMDAwMDBmZmZmZmZmZjAyYTA4NjAxMDAwMDAwMDAwMDE5NzZhOTE0OWY5YTdhYmQ2MDBjMGNhYTAzOTgzYTc3YzhjM2RmOGUwNjJjYjJmYTg4YWNmYmYyMTUwMDAwMDAwMDAwMjIwMDIwYjkyMmNjMWU3MzdlNjc5ZDI0ZmYyZDJiMThjZmE5ZmZmNGUzNWE3MzNiNGZiYTk0MjgyZWFhMWI3Y2ZlNTZkMjAwMDAwMDAwJztcbiAgICAgIGNvbnN0IGJsb2NrSGVpZ2h0ID0gMTAwO1xuICAgICAgY29uc3QgcHJlQnVpbGQgPSB7IHR4SGV4LCBibG9ja0hlaWdodCB9O1xuICAgICAgY29uc3QgcG9zdFByb2Nlc3NCdWlsdCA9IGF3YWl0IGNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChwcmVCdWlsZCk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KFxuICAgICAgICBwb3N0UHJvY2Vzc0J1aWx0LnR4SGV4IGFzIHN0cmluZyxcbiAgICAgICAgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luXG4gICAgICApO1xuXG4gICAgICB0cmFuc2FjdGlvbi5sb2NrdGltZS5zaG91bGQuZXF1YWwoMCk7XG4gICAgICBjb25zdCBpbnB1dHMgPSB0cmFuc2FjdGlvbi5pbnM7XG4gICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykge1xuICAgICAgICBpbnB1dC5zZXF1ZW5jZS5zaG91bGQuZXF1YWwoMHhmZmZmZmZmZik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBdWRpdCBLZXknLCAoKSA9PiB7XG4gICAgY29uc3QgeyBrZXkgfSA9IGJ0Y0JhY2t1cEtleTtcbiAgICBsZXQgY29pbjogVGJ0YztcbiAgICBiZWZvcmUoKCkgPT4ge1xuICAgICAgY29pbiA9IGJpdGdvLmNvaW4oJ3RidGMnKSBhcyBUYnRjO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZm9yIHZhbGlkIGlucHV0cycsICgpID0+IHtcbiAgICAgIGNvaW4uYXNzZXJ0SXNWYWxpZEtleSh7XG4gICAgICAgIGVuY3J5cHRlZFBydjoga2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAna0FtW0VGUTZvPVN4bGNMRkR3JSwnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIGluY29ycmVjdCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgY29pbi5hc3NlcnRJc1ZhbGlkS2V5KHtcbiAgICAgICAgICAgIGVuY3J5cHRlZFBydjoga2V5LFxuICAgICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ2ZvbycsXG4gICAgICAgICAgfSksXG4gICAgICAgIHsgbWVzc2FnZTogXCJmYWlsZWQgdG8gZGVjcnlwdCBwcnY6IGNjbTogdGFnIGRvZXNuJ3QgbWF0Y2hcIiB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhyb3cgaWYgdGhlIGtleSBpcyBhbHRlcmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWx0ZXJlZEtleSA9IGtleS5yZXBsYWNlKC9bMC05XS9nLCAnMCcpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBjb2luLmFzc2VydElzVmFsaWRLZXkoe1xuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhbHRlcmVkS2V5LFxuICAgICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ2tBbVtFRlE2bz1TeGxjTEZEdyUsJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgeyBtZXNzYWdlOiAnZmFpbGVkIHRvIGRlY3J5cHQgcHJ2OiBqc29uIGRlY3J5cHQ6IGludmFsaWQgcGFyYW1ldGVycycgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Vuc3BlbnQgbWFuYWdlbWVudCBzcG9vZmFiaWxpdHkgLSBDb25zb2xpZGF0aW9uIChCVUlMRF9TSUdOX1NFTkQpJywgKCkgPT4ge1xuICAgIGxldCBjb2luOiBUYnRjO1xuICAgIGxldCBiaXRnb1Rlc3Q6IFRlc3RCaXRHb0FQSTtcbiAgICBiZWZvcmUoKCkgPT4ge1xuICAgICAgYml0Z29UZXN0ID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgICAgYml0Z29UZXN0LnNhZmVSZWdpc3RlcigndGJ0YycsIFRidGMuY3JlYXRlSW5zdGFuY2UpO1xuICAgICAgYml0Z29UZXN0LmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgICAgY29pbiA9IGJpdGdvVGVzdC5jb2luKCd0YnRjJykgYXMgVGJ0YztcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGV0ZWN0IGhleCBzcG9vZmluZyBpbiBCVUlMRF9TSUdOX1NFTkQnLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBrZXlUcmlwbGUgPSB1dHhvbGliLnRlc3R1dGlsLmdldEtleVRyaXBsZSgnZGVmYXVsdCcpO1xuICAgICAgY29uc3Qgcm9vdFdhbGxldEtleSA9IG5ldyB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKGtleVRyaXBsZSk7XG4gICAgICBjb25zdCBbdXNlcl0gPSBrZXlUcmlwbGU7XG5cbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z29UZXN0LCBjb2luLCB7XG4gICAgICAgIGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhJyxcbiAgICAgICAgY29pbjogJ3RidGMnLFxuICAgICAgICBrZXlzOiBbJ3VzZXInLCAnYmFja3VwJywgJ2JpdGdvJ10sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3JpZ2luYWxQc2J0ID0gdXR4b2xpYi50ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KFxuICAgICAgICBbeyBzY3JpcHRUeXBlOiAncDJ3c2gnIGFzIGNvbnN0LCB2YWx1ZTogQmlnSW50KDEwMDAwKSB9XSxcbiAgICAgICAgW3sgYWRkcmVzczogJ3RiMXFycDMzZzBxNWM1dHhzcDlhcnlzcng0azZ6ZGtmczRuY2U0eGowZ2RjY2NlZnZweXN4ZjNxMHNsNWs3JywgdmFsdWU6IEJpZ0ludCg5MDAwKSB9XSxcbiAgICAgICAgY29pbi5uZXR3b3JrLFxuICAgICAgICByb290V2FsbGV0S2V5LFxuICAgICAgICAndW5zaWduZWQnIGFzIGNvbnN0XG4gICAgICApO1xuICAgICAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChvcmlnaW5hbFBzYnQsIHJvb3RXYWxsZXRLZXkpO1xuICAgICAgY29uc3Qgc3Bvb2ZlZFBzYnQgPSB1dHhvbGliLnRlc3R1dGlsLmNvbnN0cnVjdFBzYnQoXG4gICAgICAgIFt7IHNjcmlwdFR5cGU6ICdwMndzaCcgYXMgY29uc3QsIHZhbHVlOiBCaWdJbnQoMTAwMDApIH1dLFxuICAgICAgICBbeyBhZGRyZXNzOiAndGIxcGpnZzl0eTNzMnp0cDYwdjZsaGdydzc2ZjdoeHlkenVrOXQ5bWpzbmRoM3AyZ2YyYWg3Z3M0ODUwa24nLCB2YWx1ZTogQmlnSW50KDkwMDApIH1dLFxuICAgICAgICBjb2luLm5ldHdvcmssXG4gICAgICAgIHJvb3RXYWxsZXRLZXksXG4gICAgICAgICd1bnNpZ25lZCcgYXMgY29uc3RcbiAgICAgICk7XG4gICAgICB1dHhvbGliLmJpdGdvLmFkZFhwdWJzVG9Qc2J0KHNwb29mZWRQc2J0LCByb290V2FsbGV0S2V5KTtcbiAgICAgIGNvbnN0IHNwb29mZWRIZXg6IHN0cmluZyA9IHNwb29mZWRQc2J0LnRvSGV4KCk7XG5cbiAgICAgIGNvbnN0IGJnVXJsOiBzdHJpbmcgPSAoYml0Z29UZXN0IGFzIGFueSkuX2Jhc2VVcmw7XG4gICAgICBjb25zdCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuXG4gICAgICBub2NrKGJnVXJsKVxuICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS9jb25zb2xpZGF0ZVVuc3BlbnRzYClcbiAgICAgICAgLnJlcGx5KDIwMCwgeyB0eEhleDogc3Bvb2ZlZEhleCwgY29uc29saWRhdGVJZDogJ3Rlc3QnIH0pO1xuXG4gICAgICBub2NrKGJnVXJsKVxuICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS90eC9zZW5kYClcbiAgICAgICAgLnJlcGx5KChyZXF1ZXN0Qm9keTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcXVlc3RCb2R5Py50eEhleCA9PT0gc3Bvb2ZlZEhleCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTcG9vZmVkIHRyYW5zYWN0aW9uIHdhcyBzZW50OiBzcG9vZmluZyBwcm90ZWN0aW9uIGZhaWxlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gWzIwMCwgeyB0eGlkOiAndGVzdC10eGlkLTEyMycsIHN0YXR1czogJ3NpZ25lZCcgfV07XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwdWJzID0ga2V5VHJpcGxlLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpO1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gW1xuICAgICAgICB7IHB1YjogcHVic1swXSwgZW5jcnlwdGVkUHJ2OiBlbmNyeXB0KCdwYXNzJywgdXNlci50b0Jhc2U1OCgpKSB9LFxuICAgICAgICB7IHB1YjogcHVic1sxXSB9LFxuICAgICAgICB7IHB1YjogcHVic1syXSB9LFxuICAgICAgXTtcbiAgICAgIHdhbGxldFxuICAgICAgICAua2V5SWRzKClcbiAgICAgICAgLmZvckVhY2goKGlkLCBpKSA9PiBub2NrKGJnVXJsKS5nZXQoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS9rZXkvJHtpZH1gKS5yZXBseSgyMDAsIHJlc3BvbnNlc1tpXSkpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgd2FsbGV0LmNvbnNvbGlkYXRlVW5zcGVudHMoeyB3YWxsZXRQYXNzcGhyYXNlOiAncGFzcycgfSksXG4gICAgICAgIChlOiBhbnkpID0+XG4gICAgICAgICAgdHlwZW9mIGU/Lm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgZS5tZXNzYWdlLmluY2x1ZGVzKCdwcmVidWlsZCBhdHRlbXB0cyB0byBzcGVuZCB0byB1bmludGVuZGVkIGV4dGVybmFsIHJlY2lwaWVudHMnKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Vuc3BlbnQgbWFuYWdlbWVudCBzcG9vZmFiaWxpdHkgLSBGYW5vdXQgKEJVSUxEX1NJR05fU0VORCknLCAoKSA9PiB7XG4gICAgbGV0IGNvaW46IFRidGM7XG4gICAgbGV0IGJpdGdvVGVzdDogVGVzdEJpdEdvQVBJO1xuICAgIGJlZm9yZSgoKSA9PiB7XG4gICAgICBiaXRnb1Rlc3QgPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgICBiaXRnb1Rlc3Quc2FmZVJlZ2lzdGVyKCd0YnRjJywgVGJ0Yy5jcmVhdGVJbnN0YW5jZSk7XG4gICAgICBiaXRnb1Rlc3QuaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgICBjb2luID0gYml0Z29UZXN0LmNvaW4oJ3RidGMnKSBhcyBUYnRjO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZXRlY3QgaGV4IHNwb29maW5nIGluIGZhbm91dCBCVUlMRF9TSUdOX1NFTkQnLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBrZXlUcmlwbGUgPSB1dHhvbGliLnRlc3R1dGlsLmdldEtleVRyaXBsZSgnZGVmYXVsdCcpO1xuICAgICAgY29uc3Qgcm9vdFdhbGxldEtleSA9IG5ldyB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKGtleVRyaXBsZSk7XG4gICAgICBjb25zdCBbdXNlcl0gPSBrZXlUcmlwbGU7XG5cbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z29UZXN0LCBjb2luLCB7XG4gICAgICAgIGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhJyxcbiAgICAgICAgY29pbjogJ3RidGMnLFxuICAgICAgICBrZXlzOiBbJ3VzZXInLCAnYmFja3VwJywgJ2JpdGdvJ10sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3JpZ2luYWxQc2J0ID0gdXR4b2xpYi50ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KFxuICAgICAgICBbeyBzY3JpcHRUeXBlOiAncDJ3c2gnIGFzIGNvbnN0LCB2YWx1ZTogQmlnSW50KDEwMDAwKSB9XSxcbiAgICAgICAgW3sgYWRkcmVzczogJ3RiMXFycDMzZzBxNWM1dHhzcDlhcnlzcng0azZ6ZGtmczRuY2U0eGowZ2RjY2NlZnZweXN4ZjNxMHNsNWs3JywgdmFsdWU6IEJpZ0ludCg5MDAwKSB9XSxcbiAgICAgICAgY29pbi5uZXR3b3JrLFxuICAgICAgICByb290V2FsbGV0S2V5LFxuICAgICAgICAndW5zaWduZWQnIGFzIGNvbnN0XG4gICAgICApO1xuICAgICAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChvcmlnaW5hbFBzYnQsIHJvb3RXYWxsZXRLZXkpO1xuXG4gICAgICBjb25zdCBzcG9vZmVkUHNidCA9IHV0eG9saWIudGVzdHV0aWwuY29uc3RydWN0UHNidChcbiAgICAgICAgW3sgc2NyaXB0VHlwZTogJ3Ayd3NoJyBhcyBjb25zdCwgdmFsdWU6IEJpZ0ludCgxMDAwMCkgfV0sXG4gICAgICAgIFt7IGFkZHJlc3M6ICd0YjFwamdnOXR5M3MyenRwNjB2NmxoZ3J3NzZmN2h4eWR6dWs5dDltanNuZGgzcDJnZjJhaDdnczQ4NTBrbicsIHZhbHVlOiBCaWdJbnQoOTAwMCkgfV0sXG4gICAgICAgIGNvaW4ubmV0d29yayxcbiAgICAgICAgcm9vdFdhbGxldEtleSxcbiAgICAgICAgJ3Vuc2lnbmVkJyBhcyBjb25zdFxuICAgICAgKTtcbiAgICAgIHV0eG9saWIuYml0Z28uYWRkWHB1YnNUb1BzYnQoc3Bvb2ZlZFBzYnQsIHJvb3RXYWxsZXRLZXkpO1xuICAgICAgY29uc3Qgc3Bvb2ZlZEhleDogc3RyaW5nID0gc3Bvb2ZlZFBzYnQudG9IZXgoKTtcblxuICAgICAgY29uc3QgYmdVcmw6IHN0cmluZyA9IChiaXRnb1Rlc3QgYXMgYW55KS5fYmFzZVVybDtcbiAgICAgIGNvbnN0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5cbiAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgIC5wb3N0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0vd2FsbGV0LyR7d2FsbGV0LmlkKCl9L2Zhbm91dFVuc3BlbnRzYClcbiAgICAgICAgLnJlcGx5KDIwMCwgeyB0eEhleDogc3Bvb2ZlZEhleCwgZmFub3V0SWQ6ICd0ZXN0JyB9KTtcblxuICAgICAgbm9jayhiZ1VybClcbiAgICAgICAgLnBvc3QoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vdHgvc2VuZGApXG4gICAgICAgIC5yZXBseSgocmVxdWVzdEJvZHk6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXF1ZXN0Qm9keT8udHhIZXggPT09IHNwb29mZWRIZXgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3Bvb2ZlZCB0cmFuc2FjdGlvbiB3YXMgc2VudDogc3Bvb2ZpbmcgcHJvdGVjdGlvbiBmYWlsZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFsyMDAsIHsgdHhpZDogJ3Rlc3QtdHhpZC0xMjMnLCBzdGF0dXM6ICdzaWduZWQnIH1dO1xuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgcHVicyA9IGtleVRyaXBsZS5tYXAoKGspID0+IGsubmV1dGVyZWQoKS50b0Jhc2U1OCgpKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IFtcbiAgICAgICAgeyBwdWI6IHB1YnNbMF0sIGVuY3J5cHRlZFBydjogZW5jcnlwdCgncGFzcycsIHVzZXIudG9CYXNlNTgoKSkgfSxcbiAgICAgICAgeyBwdWI6IHB1YnNbMV0gfSxcbiAgICAgICAgeyBwdWI6IHB1YnNbMl0gfSxcbiAgICAgIF07XG4gICAgICB3YWxsZXRcbiAgICAgICAgLmtleUlkcygpXG4gICAgICAgIC5mb3JFYWNoKChpZCwgaSkgPT4gbm9jayhiZ1VybCkuZ2V0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0va2V5LyR7aWR9YCkucmVwbHkoMjAwLCByZXNwb25zZXNbaV0pKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIHdhbGxldC5mYW5vdXRVbnNwZW50cyh7IHdhbGxldFBhc3NwaHJhc2U6ICdwYXNzJyB9KSxcbiAgICAgICAgKGU6IGFueSkgPT5cbiAgICAgICAgICB0eXBlb2YgZT8ubWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBlLm1lc3NhZ2UuaW5jbHVkZXMoJ3ByZWJ1aWxkIGF0dGVtcHRzIHRvIHNwZW5kIHRvIHVuaW50ZW5kZWQgZXh0ZXJuYWwgcmVjaXBpZW50cycpXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"btcBackupKey.d.ts","sourceRoot":"","sources":["../../../../test/unit/fixtures/btcBackupKey.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY;;CAMxB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.btcBackupKey = void 0;
|
|
4
|
+
exports.btcBackupKey = {
|
|
5
|
+
key: '{"iv":"JgqqE4W45/tKBSMSYqD+qg==","v":1,"iter":10000,"ks":256,"ts":64,"mode"' +
|
|
6
|
+
':"ccm","adata":"","cipher":"aes","salt":"kiLPf8VSdI0=","ct":"zUh4Oko/06g02E' +
|
|
7
|
+
'wnqOfzJbTwtE2p3b19jDk8Tum07Jv3N/RP7Bo0w/ObLBO1uIJFossO3nJ1JS+7t/vPQhdCtN8oD' +
|
|
8
|
+
'6YrZnEZYrRwN6JQkL1uYPnZ1PoWbYI9navK5CLU1KQwDTO9YEN46++OrzFH+CjpQVLblaw="}',
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnRjQmFja3VwS2V5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2ZpeHR1cmVzL2J0Y0JhY2t1cEtleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLFlBQVksR0FBRztJQUMxQixHQUFHLEVBQ0QsNkVBQTZFO1FBQzdFLDZFQUE2RTtRQUM3RSw2RUFBNkU7UUFDN0UsMkVBQTJFO0NBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgYnRjQmFja3VwS2V5ID0ge1xuICBrZXk6XG4gICAgJ3tcIml2XCI6XCJKZ3FxRTRXNDUvdEtCU01TWXFEK3FnPT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiJyArXG4gICAgJzpcImNjbVwiLFwiYWRhdGFcIjpcIlwiLFwiY2lwaGVyXCI6XCJhZXNcIixcInNhbHRcIjpcImtpTFBmOFZTZEkwPVwiLFwiY3RcIjpcInpVaDRPa28vMDZnMDJFJyArXG4gICAgJ3ducU9mekpiVHd0RTJwM2IxOWpEazhUdW0wN0p2M04vUlA3Qm8wdy9PYkxCTzF1SUpGb3NzTzNuSjFKUys3dC92UFFoZEN0TjhvRCcgK1xuICAgICc2WXJabkVaWXJSd042SlFrTDF1WVBuWjFQb1diWUk5bmF2SzVDTFUxS1F3RFRPOVlFTjQ2KytPcnpGSCtDanBRVkxibGF3PVwifScsXG59O1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../test/unit/fixtures/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./btcBackupKey"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvZml4dHVyZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUErQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYnRjQmFja3VwS2V5JztcbiJdfQ==
|