@bitgo/sdk-coin-cspr 2.4.2 → 2.4.4

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.
Files changed (47) hide show
  1. package/dist/test/fixtures/cspr.d.ts +4 -0
  2. package/dist/test/fixtures/cspr.d.ts.map +1 -0
  3. package/dist/test/fixtures/cspr.js +7 -0
  4. package/dist/test/fixtures/resources.d.ts +92 -0
  5. package/dist/test/fixtures/resources.d.ts.map +1 -0
  6. package/dist/test/fixtures/resources.js +96 -0
  7. package/dist/test/integration/index.d.ts +1 -0
  8. package/dist/test/integration/index.d.ts.map +1 -0
  9. package/dist/test/integration/index.js +1 -0
  10. package/dist/test/unit/cspr.d.ts +2 -0
  11. package/dist/test/unit/cspr.d.ts.map +1 -0
  12. package/dist/test/unit/cspr.js +680 -0
  13. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  14. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  15. package/dist/test/unit/lib/keyPair.js +159 -0
  16. package/dist/test/unit/lib/signMessage.d.ts +2 -0
  17. package/dist/test/unit/lib/signMessage.d.ts.map +1 -0
  18. package/dist/test/unit/lib/signMessage.js +68 -0
  19. package/dist/test/unit/lib/transaction.d.ts +2 -0
  20. package/dist/test/unit/lib/transaction.d.ts.map +1 -0
  21. package/dist/test/unit/lib/transaction.js +271 -0
  22. package/dist/test/unit/lib/transactionBuilder/delegateBuilder.d.ts +2 -0
  23. package/dist/test/unit/lib/transactionBuilder/delegateBuilder.d.ts.map +1 -0
  24. package/dist/test/unit/lib/transactionBuilder/delegateBuilder.js +191 -0
  25. package/dist/test/unit/lib/transactionBuilder/transactionBuilder.d.ts +2 -0
  26. package/dist/test/unit/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  27. package/dist/test/unit/lib/transactionBuilder/transactionBuilder.js +315 -0
  28. package/dist/test/unit/lib/transactionBuilder/transferBuilder.d.ts +2 -0
  29. package/dist/test/unit/lib/transactionBuilder/transferBuilder.d.ts.map +1 -0
  30. package/dist/test/unit/lib/transactionBuilder/transferBuilder.js +519 -0
  31. package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.d.ts +2 -0
  32. package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.d.ts.map +1 -0
  33. package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.js +192 -0
  34. package/dist/test/unit/lib/transactionBuilder/walletInitialization.d.ts +2 -0
  35. package/dist/test/unit/lib/transactionBuilder/walletInitialization.d.ts.map +1 -0
  36. package/dist/test/unit/lib/transactionBuilder/walletInitialization.js +338 -0
  37. package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
  38. package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
  39. package/dist/test/unit/lib/transactionBuilderFactory.js +328 -0
  40. package/dist/test/unit/lib/util.d.ts +2 -0
  41. package/dist/test/unit/lib/util.d.ts.map +1 -0
  42. package/dist/test/unit/lib/util.js +176 -0
  43. package/dist/tsconfig.tsbuildinfo +1 -0
  44. package/package.json +10 -7
  45. package/.eslintignore +0 -4
  46. package/.mocharc.yml +0 -8
  47. package/CHANGELOG.md +0 -851
@@ -0,0 +1,315 @@
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
+ const _ = __importStar(require("lodash"));
40
+ const assert_1 = __importDefault(require("assert"));
41
+ const should = __importStar(require("should"));
42
+ const testData = __importStar(require("../../../fixtures/resources"));
43
+ const lib_1 = require("../../../../src/lib");
44
+ const utils_1 = require("../../../../src/lib/utils");
45
+ const constants_1 = require("../../../../src/lib/constants");
46
+ const statics_1 = require("@bitgo/statics");
47
+ describe('Casper Transaction Builder', () => {
48
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
49
+ const owner1Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress();
50
+ const owner2Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress();
51
+ const owner3Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress();
52
+ const sourceAddress = new lib_1.KeyPair({ pub: testData.ROOT_ACCOUNT.publicKey }).getAddress();
53
+ const initTransferBuilder = () => {
54
+ const txBuilder = factory.getTransferBuilder();
55
+ txBuilder.fee({ gasLimit: testData.FEE.gasLimit, gasPrice: testData.FEE.gasPrice });
56
+ txBuilder.source({ address: owner1Address });
57
+ txBuilder.to(owner2Address);
58
+ txBuilder.transferId(255);
59
+ txBuilder.amount(testData.MIN_MOTES_AMOUNT);
60
+ return txBuilder;
61
+ };
62
+ const initWalletBuilder = () => {
63
+ const txBuilder = factory.getWalletInitializationBuilder();
64
+ txBuilder.fee(testData.FEE);
65
+ txBuilder.owner(owner1Address);
66
+ txBuilder.owner(owner2Address);
67
+ txBuilder.owner(owner3Address);
68
+ txBuilder.source({ address: sourceAddress });
69
+ return txBuilder;
70
+ };
71
+ const initDelegateBuilder = () => {
72
+ const txBuilder = factory.getDelegateBuilder();
73
+ txBuilder.fee({ gasLimit: testData.FEE.gasLimit, gasPrice: testData.FEE.gasPrice });
74
+ txBuilder.source({ address: sourceAddress });
75
+ txBuilder.amount(testData.MIN_MOTES_AMOUNT);
76
+ return txBuilder;
77
+ };
78
+ const initUndelegateBuilder = () => {
79
+ const txBuilder = factory.getUndelegateBuilder();
80
+ txBuilder.fee({ gasLimit: testData.FEE.gasLimit, gasPrice: testData.FEE.gasPrice });
81
+ txBuilder.source({ address: sourceAddress });
82
+ txBuilder.amount(testData.MIN_MOTES_AMOUNT);
83
+ return txBuilder;
84
+ };
85
+ describe('should validate', () => {
86
+ it('an empty raw transaction', () => {
87
+ const txBuilder = factory.getTransferBuilder();
88
+ assert_1.default.throws(() => {
89
+ txBuilder.validateRawTransaction('');
90
+ }, (e) => e.message === testData.ERROR_EMPTY_RAW_TRANSACTION);
91
+ });
92
+ it('an invalid raw transfer transaction', () => {
93
+ const txBuilder = factory.getTransferBuilder();
94
+ assert_1.default.throws(() => {
95
+ txBuilder.validateRawTransaction(testData.INVALID_RAW_TRANSACTION);
96
+ }, (e) => e.message === testData.ERROR_JSON_PARSING);
97
+ });
98
+ it('an invalid raw wallet init transaction', () => {
99
+ const txBuilder = factory.getWalletInitializationBuilder();
100
+ assert_1.default.throws(() => {
101
+ txBuilder.validateRawTransaction(testData.INVALID_RAW_TRANSACTION);
102
+ }, (e) => e.message === testData.ERROR_JSON_PARSING);
103
+ });
104
+ it('a valid raw transfer transaction', async () => {
105
+ const builder = initTransferBuilder();
106
+ builder.sign({ key: testData.ACCOUNT_1.privateKey });
107
+ builder.sign({ key: testData.ACCOUNT_2.privateKey });
108
+ const tx = await builder.build();
109
+ const txJson = tx.toJson();
110
+ should.doesNotThrow(() => {
111
+ builder.validateRawTransaction(JSON.stringify(txJson));
112
+ });
113
+ });
114
+ it('a valid raw transfer transaction both accounts using extended keys', async () => {
115
+ const builder = initTransferBuilder();
116
+ builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
117
+ builder.sign({ key: testData.ACCOUNT_2.xPrivateKey });
118
+ const tx = await builder.build();
119
+ const txJson = tx.toJson();
120
+ should.doesNotThrow(() => {
121
+ builder.validateRawTransaction(JSON.stringify(txJson));
122
+ });
123
+ });
124
+ it('a valid raw transfer transaction one account using extended key', async () => {
125
+ const builder = initTransferBuilder();
126
+ builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
127
+ builder.sign({ key: testData.ACCOUNT_2.privateKey });
128
+ const tx = await builder.build();
129
+ const txJson = tx.toJson();
130
+ should.doesNotThrow(() => {
131
+ builder.validateRawTransaction(JSON.stringify(txJson));
132
+ });
133
+ });
134
+ it('a valid raw wallet init transaction', async () => {
135
+ const builder = initWalletBuilder();
136
+ const tx = await builder.build();
137
+ const txJson = tx.toJson();
138
+ should.doesNotThrow(() => {
139
+ builder.validateRawTransaction(JSON.stringify(txJson));
140
+ });
141
+ });
142
+ it('an invalid expiration time', async () => {
143
+ const builder = initWalletBuilder();
144
+ assert_1.default.throws(() => builder.expiration(testData.MAX_TRANSACTION_EXPIRATION + 1), (e) => e.message === testData.INVALID_TRANSACTION_EXPIRATION_MESSAGE);
145
+ });
146
+ it('should validate addresses', async function () {
147
+ // validate secp256k1 address
148
+ const builder = initTransferBuilder();
149
+ let tx = await builder.build();
150
+ let txJson = tx.toJson();
151
+ should.doesNotThrow(() => {
152
+ builder.validateAddress({ address: txJson.to });
153
+ });
154
+ // validate ed25519 address
155
+ const ed25519Address = '01513fa90c1a74c34a8958dd86055e9736edb1ead918bd4d4d750ca851946be7aa';
156
+ builder.to(ed25519Address);
157
+ tx = await builder.build();
158
+ txJson = tx.toJson();
159
+ should.doesNotThrow(() => {
160
+ builder.validateAddress({ address: txJson.to });
161
+ });
162
+ });
163
+ });
164
+ describe('signatures', function () {
165
+ it('should sign a transaction', async function () {
166
+ const builder = initWalletBuilder();
167
+ builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
168
+ const tx = (await builder.build());
169
+ should.exists(tx.casperTx.approvals[0].signer);
170
+ should.exists(tx.casperTx.approvals[0].signature);
171
+ should.equal(tx.casperTx.approvals[0].signer, sourceAddress);
172
+ const txJson = tx.toJson();
173
+ should.doesNotThrow(() => {
174
+ builder.validateRawTransaction(JSON.stringify(txJson));
175
+ });
176
+ });
177
+ it('should sign a transaction using extended key', async function () {
178
+ const builder = initWalletBuilder();
179
+ builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
180
+ const tx = (await builder.build());
181
+ should.exists(tx.casperTx.approvals[0].signer);
182
+ should.exists(tx.casperTx.approvals[0].signature);
183
+ should.equal(tx.casperTx.approvals[0].signer, sourceAddress);
184
+ const txJson = tx.toJson();
185
+ should.doesNotThrow(() => {
186
+ builder.validateRawTransaction(JSON.stringify(txJson));
187
+ });
188
+ });
189
+ it('should process signing only once per signer', async function () {
190
+ const builder = initWalletBuilder();
191
+ builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
192
+ let tx = (await builder.build());
193
+ tx.casperTx.approvals.length.should.equal(1);
194
+ should.equal(tx.casperTx.approvals[0].signer, sourceAddress);
195
+ tx = (await builder.build());
196
+ tx.casperTx.approvals.length.should.equal(1);
197
+ should.equal(tx.casperTx.approvals[0].signer, sourceAddress);
198
+ });
199
+ it('should process signing only once per signer with extended key', async function () {
200
+ const builder = initWalletBuilder();
201
+ builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
202
+ let tx = (await builder.build());
203
+ tx.casperTx.approvals.length.should.equal(1);
204
+ should.equal(tx.casperTx.approvals[0].signer, sourceAddress);
205
+ tx = (await builder.build());
206
+ tx.casperTx.approvals.length.should.equal(1);
207
+ should.equal(tx.casperTx.approvals[0].signer, sourceAddress);
208
+ });
209
+ it('should add a signature to a transaction', async function () {
210
+ const builder = initWalletBuilder();
211
+ const sig = '0072f40621663fd03c5e13b413d5c354cdf4c7e76672aa61fd8ede0f1ac09f5de107d725eb40e1efb9037940d74ef9b2efaa1d66d0991a5322639481c2d4280775';
212
+ const pub = '03dca7d5d68fba12a604e992a47504d10e6795cdc6db438abb741788c71c4b7428';
213
+ const signingKeyPair = new lib_1.KeyPair({ pub });
214
+ builder.signature(sig, signingKeyPair);
215
+ const tx = (await builder.build());
216
+ const signer = tx.casperTx.approvals[0].signer;
217
+ const signature = tx.casperTx.approvals[0].signature;
218
+ (0, utils_1.removeAlgoPrefixFromHexValue)(signer).should.equal(pub);
219
+ (0, utils_1.removeAlgoPrefixFromHexValue)(signature).should.equal(_.toLower(sig));
220
+ const txJson = tx.toJson();
221
+ should.doesNotThrow(() => {
222
+ builder.validateRawTransaction(JSON.stringify(txJson));
223
+ });
224
+ });
225
+ it('should add a signature to a transaction using extended key', async function () {
226
+ const builder = initWalletBuilder();
227
+ const sig = '0220ade206fc0e7bf19c672aae122e037a7c0ad6c82fb65126735e61f370923f2706114647f9ea1e405fdbf9915c7eaf4325a5ddf9faf24935b20333526cf3b44d';
228
+ const xPub = 'xpub661MyMwAqRbcH4WAWt79QwMXc1MKaqxU8axkYJGfECGg3gTMuxHYfZzW8AyrRJwFrGZxdA1CgYtXtjVToMyUyfzQrjBayP47pbdWuhdrbYz';
229
+ const signingKeyPair = new lib_1.KeyPair({ pub: xPub });
230
+ builder.signature(sig, signingKeyPair);
231
+ const tx = (await builder.build());
232
+ const signer = tx.casperTx.approvals[0].signer;
233
+ const signature = tx.casperTx.approvals[0].signature;
234
+ (0, utils_1.removeAlgoPrefixFromHexValue)(signer).should.equal(signingKeyPair.getKeys().pub);
235
+ (0, utils_1.removeAlgoPrefixFromHexValue)(signature).should.equal(_.toLower(sig));
236
+ const txJson = tx.toJson();
237
+ should.doesNotThrow(() => {
238
+ builder.validateRawTransaction(JSON.stringify(txJson));
239
+ });
240
+ });
241
+ it('should process signing only once per signature added', async function () {
242
+ const builder = initWalletBuilder();
243
+ const sig = '0072f40621663fd03c5e13b413d5c354cdf4c7e76672aa61fd8ede0f1ac09f5de107d725eb40e1efb9037940d74ef9b2efaa1d66d0991a5322639481c2d4280775';
244
+ const pub = '03dca7d5d68fba12a604e992a47504d10e6795cdc6db438abb741788c71c4b7428';
245
+ const signingKeyPair = new lib_1.KeyPair({ pub });
246
+ builder.signature(sig, signingKeyPair);
247
+ let tx = (await builder.build());
248
+ tx.casperTx.approvals.length.should.equal(1);
249
+ tx = (await builder.build());
250
+ tx.casperTx.approvals.length.should.equal(1);
251
+ });
252
+ it('should process signing only once per signature added using extended key', async function () {
253
+ const builder = initWalletBuilder();
254
+ const sig = '0220ade206fc0e7bf19c672aae122e037a7c0ad6c82fb65126735e61f370923f2706114647f9ea1e405fdbf9915c7eaf4325a5ddf9faf24935b20333526cf3b44d';
255
+ const xPub = 'xpub661MyMwAqRbcH4WAWt79QwMXc1MKaqxU8axkYJGfECGg3gTMuxHYfZzW8AyrRJwFrGZxdA1CgYtXtjVToMyUyfzQrjBayP47pbdWuhdrbYz';
256
+ const signingKeyPair = new lib_1.KeyPair({ pub: xPub });
257
+ builder.signature(sig, signingKeyPair);
258
+ let tx = (await builder.build());
259
+ tx.casperTx.approvals.length.should.equal(1);
260
+ should.equal(tx.casperTx.approvals[0].signer, sourceAddress);
261
+ tx = (await builder.build());
262
+ tx.casperTx.approvals.length.should.equal(1);
263
+ should.equal(tx.casperTx.approvals[0].signer, sourceAddress);
264
+ });
265
+ });
266
+ describe('chain name', function () {
267
+ describe('has default value for', function () {
268
+ it('transfer transaction', function () {
269
+ const txBuilder = initTransferBuilder();
270
+ should.doesNotThrow(() => txBuilder.validateMandatoryFields());
271
+ txBuilder.chainName.should.equals(constants_1.DEFAULT_CHAIN_NAMES.testnet);
272
+ });
273
+ it('wallet initialization transaction', function () {
274
+ const txBuilder = initWalletBuilder();
275
+ should.doesNotThrow(() => txBuilder.validateMandatoryFields());
276
+ txBuilder.chainName.should.equals(constants_1.DEFAULT_CHAIN_NAMES.testnet);
277
+ });
278
+ it('delegation transaction', function () {
279
+ const txBuilder = initDelegateBuilder();
280
+ should.doesNotThrow(() => txBuilder.validateMandatoryFields());
281
+ txBuilder.chainName.should.equals(constants_1.DEFAULT_CHAIN_NAMES.testnet);
282
+ });
283
+ it('undelegation transaction', function () {
284
+ const txBuilder = initUndelegateBuilder();
285
+ should.doesNotThrow(() => txBuilder.validateMandatoryFields());
286
+ txBuilder.chainName.should.equals(constants_1.DEFAULT_CHAIN_NAMES.testnet);
287
+ });
288
+ });
289
+ describe('can be manually set for', function () {
290
+ it('transfer transaction', function () {
291
+ const txBuilder = initTransferBuilder()
292
+ .amount(testData.MIN_MOTES_AMOUNT)
293
+ .nodeChainName(testData.CUSTOM_CHAIN_NAME);
294
+ should.doesNotThrow(() => txBuilder.validateMandatoryFields());
295
+ txBuilder.chainName.should.equals(testData.CUSTOM_CHAIN_NAME);
296
+ });
297
+ it('wallet initialization transaction', function () {
298
+ const txBuilder = initWalletBuilder().nodeChainName(testData.CUSTOM_CHAIN_NAME);
299
+ should.doesNotThrow(() => txBuilder.validateMandatoryFields());
300
+ txBuilder.chainName.should.equals(testData.CUSTOM_CHAIN_NAME);
301
+ });
302
+ it('delegation transaction', function () {
303
+ const txBuilder = initDelegateBuilder().nodeChainName(testData.CUSTOM_CHAIN_NAME);
304
+ should.doesNotThrow(() => txBuilder.validateMandatoryFields());
305
+ txBuilder.chainName.should.equals(testData.CUSTOM_CHAIN_NAME);
306
+ });
307
+ it('undelegation transaction', function () {
308
+ const txBuilder = initUndelegateBuilder().nodeChainName(testData.CUSTOM_CHAIN_NAME);
309
+ should.doesNotThrow(() => txBuilder.validateMandatoryFields());
310
+ txBuilder.chainName.should.equals(testData.CUSTOM_CHAIN_NAME);
311
+ });
312
+ });
313
+ });
314
+ });
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIvdHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMENBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QiwrQ0FBaUM7QUFDakMsc0VBQXdEO0FBQ3hELDZDQUF5RTtBQUV6RSxxREFBeUU7QUFDekUsNkRBQW9FO0FBQ3BFLDRDQUF1QztBQUV2QyxRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RGLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUV6RixNQUFNLG1CQUFtQixHQUFHLEdBQUcsRUFBRTtRQUMvQixNQUFNLFNBQVMsR0FB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QUUsQ0FBQywwQkFBMEIsRUFBRTtnQkFDN0IsTUFBTSxTQUFTLEdBQUcscUJBQXFCLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3BGLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQztnQkFDL0QsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi8uLi9maXh0dXJlcy9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgS2V5UGFpciwgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IHJlbW92ZUFsZ29QcmVmaXhGcm9tSGV4VmFsdWUgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IERFRkFVTFRfQ0hBSU5fTkFNRVMgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcblxuZGVzY3JpYmUoJ0Nhc3BlciBUcmFuc2FjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0Y3NwcicpKTtcbiAgY29uc3Qgb3duZXIxQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgb3duZXIyQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgb3duZXIzQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgc291cmNlQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcblxuICBjb25zdCBpbml0VHJhbnNmZXJCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZlZSh7IGdhc0xpbWl0OiB0ZXN0RGF0YS5GRUUuZ2FzTGltaXQsIGdhc1ByaWNlOiB0ZXN0RGF0YS5GRUUuZ2FzUHJpY2UgfSk7XG4gICAgdHhCdWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IG93bmVyMUFkZHJlc3MgfSk7XG4gICAgdHhCdWlsZGVyLnRvKG93bmVyMkFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci50cmFuc2ZlcklkKDI1NSk7XG4gICAgdHhCdWlsZGVyLmFtb3VudCh0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UKTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IGluaXRXYWxsZXRCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgIHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLm93bmVyKG93bmVyM0FkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgaW5pdERlbGVnYXRlQnVpbGRlciA9ICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRlQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5mZWUoeyBnYXNMaW1pdDogdGVzdERhdGEuRkVFLmdhc0xpbWl0LCBnYXNQcmljZTogdGVzdERhdGEuRkVFLmdhc1ByaWNlIH0pO1xuICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgIHR4QnVpbGRlci5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBpbml0VW5kZWxlZ2F0ZUJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRVbmRlbGVnYXRlQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5mZWUoeyBnYXNMaW1pdDogdGVzdERhdGEuRkVFLmdhc0xpbWl0LCBnYXNQcmljZTogdGVzdERhdGEuRkVFLmdhc1ByaWNlIH0pO1xuICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgIHR4QnVpbGRlci5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHZhbGlkYXRlJywgKCkgPT4ge1xuICAgIGl0KCdhbiBlbXB0eSByYXcgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKCcnKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLkVSUk9SX0VNUFRZX1JBV19UUkFOU0FDVElPTlxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBpbnZhbGlkIHJhdyB0cmFuc2ZlciB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuSU5WQUxJRF9SQVdfVFJBTlNBQ1RJT04pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZSA9PT0gdGVzdERhdGEuRVJST1JfSlNPTl9QQVJTSU5HXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGludmFsaWQgcmF3IHdhbGxldCBpbml0IHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5JTlZBTElEX1JBV19UUkFOU0FDVElPTik7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlID09PSB0ZXN0RGF0YS5FUlJPUl9KU09OX1BBUlNJTkdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB2YWxpZCByYXcgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gaW5pdFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8yLnByaXZhdGVLZXkgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihKU09OLnN0cmluZ2lmeSh0eEpzb24pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdmFsaWQgcmF3IHRyYW5zZmVyIHRyYW5zYWN0aW9uIGJvdGggYWNjb3VudHMgdXNpbmcgZXh0ZW5kZWQga2V5cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS54UHJpdmF0ZUtleSB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8yLnhQcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkodHhKc29uKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHZhbGlkIHJhdyB0cmFuc2ZlciB0cmFuc2FjdGlvbiBvbmUgYWNjb3VudCB1c2luZyBleHRlbmRlZCBrZXknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gaW5pdFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEueFByaXZhdGVLZXkgfSk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMi5wcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkodHhKc29uKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHZhbGlkIHJhdyB3YWxsZXQgaW5pdCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0V2FsbGV0QnVpbGRlcigpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkodHhKc29uKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBpbnZhbGlkIGV4cGlyYXRpb24gdGltZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0V2FsbGV0QnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5leHBpcmF0aW9uKHRlc3REYXRhLk1BWF9UUkFOU0FDVElPTl9FWFBJUkFUSU9OICsgMSksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlID09PSB0ZXN0RGF0YS5JTlZBTElEX1RSQU5TQUNUSU9OX0VYUElSQVRJT05fTUVTU0FHRVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gdmFsaWRhdGUgc2VjcDI1NmsxIGFkZHJlc3NcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBsZXQgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBsZXQgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzOiB0eEpzb24udG8gfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gdmFsaWRhdGUgZWQyNTUxOSBhZGRyZXNzXG4gICAgICBjb25zdCBlZDI1NTE5QWRkcmVzcyA9ICcwMTUxM2ZhOTBjMWE3NGMzNGE4OTU4ZGQ4NjA1NWU5NzM2ZWRiMWVhZDkxOGJkNGQ0ZDc1MGNhODUxOTQ2YmU3YWEnO1xuICAgICAgYnVpbGRlci50byhlZDI1NTE5QWRkcmVzcyk7XG4gICAgICB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogdHhKc29uLnRvIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2lnbiBhIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRXYWxsZXRCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5leGlzdHModHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25lcik7XG4gICAgICBzaG91bGQuZXhpc3RzKHR4LmNhc3BlclR4LmFwcHJvdmFsc1swXS5zaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmNhc3BlclR4LmFwcHJvdmFsc1swXS5zaWduZXIsIHNvdXJjZUFkZHJlc3MpO1xuXG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkodHhKc29uKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiBhIHRyYW5zYWN0aW9uIHVzaW5nIGV4dGVuZGVkIGtleScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0V2FsbGV0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQueFByaXZhdGVLZXkgfSk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmV4aXN0cyh0eC5jYXNwZXJUeC5hcHByb3ZhbHNbMF0uc2lnbmVyKTtcbiAgICAgIHNob3VsZC5leGlzdHModHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25lciwgc291cmNlQWRkcmVzcyk7XG5cbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihKU09OLnN0cmluZ2lmeSh0eEpzb24pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIHNpZ25pbmcgb25seSBvbmNlIHBlciBzaWduZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gaW5pdFdhbGxldEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnByaXZhdGVLZXkgfSk7XG4gICAgICBsZXQgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmNhc3BlclR4LmFwcHJvdmFsc1swXS5zaWduZXIsIHNvdXJjZUFkZHJlc3MpO1xuXG4gICAgICB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgdHguY2FzcGVyVHguYXBwcm92YWxzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25lciwgc291cmNlQWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2Nlc3Mgc2lnbmluZyBvbmx5IG9uY2UgcGVyIHNpZ25lciB3aXRoIGV4dGVuZGVkIGtleScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0V2FsbGV0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQueFByaXZhdGVLZXkgfSk7XG4gICAgICBsZXQgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmNhc3BlclR4LmFwcHJvdmFsc1swXS5zaWduZXIsIHNvdXJjZUFkZHJlc3MpO1xuXG4gICAgICB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgdHguY2FzcGVyVHguYXBwcm92YWxzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25lciwgc291cmNlQWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBhIHNpZ25hdHVyZSB0byBhIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRXYWxsZXRCdWlsZGVyKCk7XG4gICAgICBjb25zdCBzaWcgPVxuICAgICAgICAnMDA3MmY0MDYyMTY2M2ZkMDNjNWUxM2I0MTNkNWMzNTRjZGY0YzdlNzY2NzJhYTYxZmQ4ZWRlMGYxYWMwOWY1ZGUxMDdkNzI1ZWI0MGUxZWZiOTAzNzk0MGQ3NGVmOWIyZWZhYTFkNjZkMDk5MWE1MzIyNjM5NDgxYzJkNDI4MDc3NSc7XG4gICAgICBjb25zdCBwdWIgPSAnMDNkY2E3ZDVkNjhmYmExMmE2MDRlOTkyYTQ3NTA0ZDEwZTY3OTVjZGM2ZGI0MzhhYmI3NDE3ODhjNzFjNGI3NDI4JztcbiAgICAgIGNvbnN0IHNpZ25pbmdLZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWIgfSk7XG4gICAgICBidWlsZGVyLnNpZ25hdHVyZShzaWcsIHNpZ25pbmdLZXlQYWlyKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzaWduZXIgPSB0eC5jYXNwZXJUeC5hcHByb3ZhbHNbMF0uc2lnbmVyO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25hdHVyZTtcblxuICAgICAgcmVtb3ZlQWxnb1ByZWZpeEZyb21IZXhWYWx1ZShzaWduZXIpLnNob3VsZC5lcXVhbChwdWIpO1xuICAgICAgcmVtb3ZlQWxnb1ByZWZpeEZyb21IZXhWYWx1ZShzaWduYXR1cmUpLnNob3VsZC5lcXVhbChfLnRvTG93ZXIoc2lnKSk7XG5cbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihKU09OLnN0cmluZ2lmeSh0eEpzb24pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgYSBzaWduYXR1cmUgdG8gYSB0cmFuc2FjdGlvbiB1c2luZyBleHRlbmRlZCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gaW5pdFdhbGxldEJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHNpZyA9XG4gICAgICAgICcwMjIwYWRlMjA2ZmMwZTdiZjE5YzY3MmFhZTEyMmUwMzdhN2MwYWQ2YzgyZmI2NTEyNjczNWU2MWYzNzA5MjNmMjcwNjExNDY0N2Y5ZWExZTQwNWZkYmY5OTE1YzdlYWY0MzI1YTVkZGY5ZmFmMjQ5MzViMjAzMzM1MjZjZjNiNDRkJztcbiAgICAgIGNvbnN0IHhQdWIgPVxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0g0V0FXdDc5UXdNWGMxTUthcXhVOGF4a1lKR2ZFQ0dnM2dUTXV4SFlmWnpXOEF5clJKd0ZyR1p4ZEExQ2dZdFh0alZUb015VXlmelFyakJheVA0N3BiZFd1aGRyYll6JztcbiAgICAgIGNvbnN0IHNpZ25pbmdLZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IHhQdWIgfSk7XG4gICAgICBidWlsZGVyLnNpZ25hdHVyZShzaWcsIHNpZ25pbmdLZXlQYWlyKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzaWduZXIgPSB0eC5jYXNwZXJUeC5hcHByb3ZhbHNbMF0uc2lnbmVyO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25hdHVyZTtcblxuICAgICAgcmVtb3ZlQWxnb1ByZWZpeEZyb21IZXhWYWx1ZShzaWduZXIpLnNob3VsZC5lcXVhbChzaWduaW5nS2V5UGFpci5nZXRLZXlzKCkucHViKTtcbiAgICAgIHJlbW92ZUFsZ29QcmVmaXhGcm9tSGV4VmFsdWUoc2lnbmF0dXJlKS5zaG91bGQuZXF1YWwoXy50b0xvd2VyKHNpZykpO1xuXG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkodHhKc29uKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBzaWduaW5nIG9ubHkgb25jZSBwZXIgc2lnbmF0dXJlIGFkZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRXYWxsZXRCdWlsZGVyKCk7XG4gICAgICBjb25zdCBzaWcgPVxuICAgICAgICAnMDA3MmY0MDYyMTY2M2ZkMDNjNWUxM2I0MTNkNWMzNTRjZGY0YzdlNzY2NzJhYTYxZmQ4ZWRlMGYxYWMwOWY1ZGUxMDdkNzI1ZWI0MGUxZWZiOTAzNzk0MGQ3NGVmOWIyZWZhYTFkNjZkMDk5MWE1MzIyNjM5NDgxYzJkNDI4MDc3NSc7XG4gICAgICBjb25zdCBwdWIgPSAnMDNkY2E3ZDVkNjhmYmExMmE2MDRlOTkyYTQ3NTA0ZDEwZTY3OTVjZGM2ZGI0MzhhYmI3NDE3ODhjNzFjNGI3NDI4JztcbiAgICAgIGNvbnN0IHNpZ25pbmdLZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWIgfSk7XG4gICAgICBidWlsZGVyLnNpZ25hdHVyZShzaWcsIHNpZ25pbmdLZXlQYWlyKTtcbiAgICAgIGxldCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgdHguY2FzcGVyVHguYXBwcm92YWxzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG5cbiAgICAgIHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBzaWduaW5nIG9ubHkgb25jZSBwZXIgc2lnbmF0dXJlIGFkZGVkIHVzaW5nIGV4dGVuZGVkIGtleScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0V2FsbGV0QnVpbGRlcigpO1xuICAgICAgY29uc3Qgc2lnID1cbiAgICAgICAgJzAyMjBhZGUyMDZmYzBlN2JmMTljNjcyYWFlMTIyZTAzN2E3YzBhZDZjODJmYjY1MTI2NzM1ZTYxZjM3MDkyM2YyNzA2MTE0NjQ3ZjllYTFlNDA1ZmRiZjk5MTVjN2VhZjQzMjVhNWRkZjlmYWYyNDkzNWIyMDMzMzUyNmNmM2I0NGQnO1xuICAgICAgY29uc3QgeFB1YiA9XG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjSDRXQVd0NzlRd01YYzFNS2FxeFU4YXhrWUpHZkVDR2czZ1RNdXhIWWZaelc4QXlyUkp3RnJHWnhkQTFDZ1l0WHRqVlRvTXlVeWZ6UXJqQmF5UDQ3cGJkV3VoZHJiWXonO1xuICAgICAgY29uc3Qgc2lnbmluZ0tleVBhaXIgPSBuZXcgS2V5UGFpcih7IHB1YjogeFB1YiB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbmF0dXJlKHNpZywgc2lnbmluZ0tleVBhaXIpO1xuICAgICAgbGV0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5jYXNwZXJUeC5hcHByb3ZhbHNbMF0uc2lnbmVyLCBzb3VyY2VBZGRyZXNzKTtcblxuICAgICAgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmNhc3BlclR4LmFwcHJvdmFsc1swXS5zaWduZXIsIHNvdXJjZUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2hhaW4gbmFtZScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnaGFzIGRlZmF1bHQgdmFsdWUgZm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3RyYW5zZmVyIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlTWFuZGF0b3J5RmllbGRzKCkpO1xuICAgICAgICB0eEJ1aWxkZXIuY2hhaW5OYW1lLnNob3VsZC5lcXVhbHMoREVGQVVMVF9DSEFJTl9OQU1FUy50ZXN0bmV0KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnd2FsbGV0IGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0V2FsbGV0QnVpbGRlcigpO1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZU1hbmRhdG9yeUZpZWxkcygpKTtcbiAgICAgICAgdHhCdWlsZGVyLmNoYWluTmFtZS5zaG91bGQuZXF1YWxzKERFRkFVTFRfQ0hBSU5fTkFNRVMudGVzdG5ldCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RlbGVnYXRpb24gdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXREZWxlZ2F0ZUJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVNYW5kYXRvcnlGaWVsZHMoKSk7XG4gICAgICAgIHR4QnVpbGRlci5jaGFpbk5hbWUuc2hvdWxkLmVxdWFscyhERUZBVUxUX0NIQUlOX05BTUVTLnRlc3RuZXQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd1bmRlbGVnYXRpb24gdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRVbmRlbGVnYXRlQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZU1hbmRhdG9yeUZpZWxkcygpKTtcbiAgICAgICAgdHhCdWlsZGVyLmNoYWluTmFtZS5zaG91bGQuZXF1YWxzKERFRkFVTFRfQ0hBSU5fTkFNRVMudGVzdG5ldCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnY2FuIGJlIG1hbnVhbGx5IHNldCBmb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgndHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAgIC5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVClcbiAgICAgICAgICAubm9kZUNoYWluTmFtZSh0ZXN0RGF0YS5DVVNUT01fQ0hBSU5fTkFNRSk7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlTWFuZGF0b3J5RmllbGRzKCkpO1xuICAgICAgICB0eEJ1aWxkZXIuY2hhaW5OYW1lLnNob3VsZC5lcXVhbHModGVzdERhdGEuQ1VTVE9NX0NIQUlOX05BTUUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd3YWxsZXQgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRXYWxsZXRCdWlsZGVyKCkubm9kZUNoYWluTmFtZSh0ZXN0RGF0YS5DVVNUT01fQ0hBSU5fTkFNRSk7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlTWFuZGF0b3J5RmllbGRzKCkpO1xuICAgICAgICB0eEJ1aWxkZXIuY2hhaW5OYW1lLnNob3VsZC5lcXVhbHModGVzdERhdGEuQ1VTVE9NX0NIQUlOX05BTUUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0RGVsZWdhdGVCdWlsZGVyKCkubm9kZUNoYWluTmFtZSh0ZXN0RGF0YS5DVVNUT01fQ0hBSU5fTkFNRSk7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlTWFuZGF0b3J5RmllbGRzKCkpO1xuICAgICAgICB0eEJ1aWxkZXIuY2hhaW5OYW1lLnNob3VsZC5lcXVhbHModGVzdERhdGEuQ1VTVE9NX0NIQUlOX05BTUUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd1bmRlbGVnYXRpb24gdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRVbmRlbGVnYXRlQnVpbGRlcigpLm5vZGVDaGFpbk5hbWUodGVzdERhdGEuQ1VTVE9NX0NIQUlOX05BTUUpO1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZU1hbmRhdG9yeUZpZWxkcygpKTtcbiAgICAgICAgdHhCdWlsZGVyLmNoYWluTmFtZS5zaG91bGQuZXF1YWxzKHRlc3REYXRhLkNVU1RPTV9DSEFJTl9OQU1FKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../../../test/unit/lib/transactionBuilder/transferBuilder.ts"],"names":[],"mappings":""}