@bitgo-beta/sdk-coin-vet 1.0.1-beta.48 → 1.0.1-beta.481
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/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/lib/constants.d.ts +25 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +27 -2
- package/dist/src/lib/iface.d.ts +26 -2
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +19 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +40 -2
- package/dist/src/lib/transaction/addressInitializationTransaction.d.ts +31 -0
- package/dist/src/lib/transaction/addressInitializationTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/addressInitializationTransaction.js +170 -0
- package/dist/src/lib/transaction/burnNftTransaction.d.ts +26 -0
- package/dist/src/lib/transaction/burnNftTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/burnNftTransaction.js +131 -0
- package/dist/src/lib/transaction/claimRewards.d.ts +41 -0
- package/dist/src/lib/transaction/claimRewards.d.ts.map +1 -0
- package/dist/src/lib/transaction/claimRewards.js +210 -0
- package/dist/src/lib/transaction/delegateClauseTransaction.d.ts +27 -0
- package/dist/src/lib/transaction/delegateClauseTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/delegateClauseTransaction.js +156 -0
- package/dist/src/lib/transaction/exitDelegation.d.ts +26 -0
- package/dist/src/lib/transaction/exitDelegation.d.ts.map +1 -0
- package/dist/src/lib/transaction/exitDelegation.js +136 -0
- package/dist/src/lib/transaction/flushTokenTransaction.d.ts +20 -0
- package/dist/src/lib/transaction/flushTokenTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/flushTokenTransaction.js +98 -0
- package/dist/src/lib/transaction/nftTransaction.d.ts +17 -0
- package/dist/src/lib/transaction/nftTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/nftTransaction.js +108 -0
- package/dist/src/lib/transaction/stakeClauseTransaction.d.ts +27 -0
- package/dist/src/lib/transaction/stakeClauseTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/stakeClauseTransaction.js +158 -0
- package/dist/src/lib/transaction/stakingTransaction.d.ts +31 -0
- package/dist/src/lib/transaction/stakingTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/stakingTransaction.js +169 -0
- package/dist/src/lib/transaction/tokenTransaction.d.ts +14 -0
- package/dist/src/lib/transaction/tokenTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/tokenTransaction.js +95 -0
- package/dist/src/lib/transaction/transaction.d.ts +18 -28
- package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction/transaction.js +97 -57
- package/dist/src/lib/transactionBuilder/addressInitializationBuilder.d.ts +78 -0
- package/dist/src/lib/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/addressInitializationBuilder.js +158 -0
- package/dist/src/lib/transactionBuilder/burnNftBuilder.d.ts +59 -0
- package/dist/src/lib/transactionBuilder/burnNftBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/burnNftBuilder.js +118 -0
- package/dist/src/lib/transactionBuilder/claimRewardsBuilder.d.ts +57 -0
- package/dist/src/lib/transactionBuilder/claimRewardsBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/claimRewardsBuilder.js +142 -0
- package/dist/src/lib/transactionBuilder/delegateTxnBuilder.d.ts +66 -0
- package/dist/src/lib/transactionBuilder/delegateTxnBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/delegateTxnBuilder.js +120 -0
- package/dist/src/lib/transactionBuilder/exitDelegationBuilder.d.ts +58 -0
- package/dist/src/lib/transactionBuilder/exitDelegationBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/exitDelegationBuilder.js +115 -0
- package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.d.ts +66 -0
- package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.js +129 -0
- package/dist/src/lib/transactionBuilder/nftTransactionBuilder.d.ts +23 -0
- package/dist/src/lib/transactionBuilder/nftTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/nftTransactionBuilder.js +93 -0
- package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.d.ts +73 -0
- package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.js +146 -0
- package/dist/src/lib/transactionBuilder/stakingBuilder.d.ts +73 -0
- package/dist/src/lib/transactionBuilder/stakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/stakingBuilder.js +147 -0
- package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.d.ts +21 -0
- package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.js +70 -0
- package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts +10 -9
- package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder/transactionBuilder.js +25 -19
- package/dist/src/lib/transactionBuilderFactory.d.ts +52 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +115 -1
- package/dist/src/lib/types.d.ts +24 -0
- package/dist/src/lib/types.d.ts.map +1 -1
- package/dist/src/lib/types.js +1 -1
- package/dist/src/lib/utils.d.ts +98 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +262 -8
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +9 -1
- package/dist/src/vet.d.ts +80 -2
- package/dist/src/vet.d.ts.map +1 -1
- package/dist/src/vet.js +478 -8
- package/dist/src/vetNFTCollection.d.ts +18 -0
- package/dist/src/vetNFTCollection.d.ts.map +1 -0
- package/dist/src/vetNFTCollection.js +52 -0
- package/dist/src/vetToken.d.ts +19 -0
- package/dist/src/vetToken.d.ts.map +1 -0
- package/dist/src/vetToken.js +52 -0
- package/dist/test/resources/vet.d.ts +70 -0
- package/dist/test/resources/vet.d.ts.map +1 -0
- package/dist/test/resources/vet.js +125 -0
- package/dist/test/transactionBuilder/addressInitializationBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/addressInitializationBuilder.js +141 -0
- package/dist/test/transactionBuilder/burnNftBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/burnNftBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/burnNftBuilder.js +154 -0
- package/dist/test/transactionBuilder/claimRewardsBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/claimRewardsBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/claimRewardsBuilder.js +246 -0
- package/dist/test/transactionBuilder/delegateClauseTxnBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/delegateClauseTxnBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/delegateClauseTxnBuilder.js +173 -0
- package/dist/test/transactionBuilder/exitDelegationBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/exitDelegationBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/exitDelegationBuilder.js +154 -0
- package/dist/test/transactionBuilder/flushTokenTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/flushTokenTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/flushTokenTransactionBuilder.js +132 -0
- package/dist/test/transactionBuilder/nftTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/nftTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/nftTransactionBuilder.js +242 -0
- package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.js +248 -0
- package/dist/test/transactionBuilder/stakingTransaction.d.ts +2 -0
- package/dist/test/transactionBuilder/stakingTransaction.d.ts.map +1 -0
- package/dist/test/transactionBuilder/stakingTransaction.js +250 -0
- package/dist/test/transactionBuilder/tokenTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/tokenTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/tokenTransactionBuilder.js +249 -0
- package/dist/test/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/transferBuilder.js +214 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +181 -0
- package/dist/test/unit/stakingFlowE2E.d.ts +2 -0
- package/dist/test/unit/stakingFlowE2E.d.ts.map +1 -0
- package/dist/test/unit/stakingFlowE2E.js +229 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +106 -0
- package/dist/test/unit/vet.d.ts +2 -0
- package/dist/test/unit/vet.d.ts.map +1 -0
- package/dist/test/unit/vet.js +251 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -10
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -34
|
@@ -0,0 +1,242 @@
|
|
|
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 should_1 = __importDefault(require("should"));
|
|
40
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
41
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
42
|
+
const src_1 = require("../../src");
|
|
43
|
+
const testData = __importStar(require("../resources/vet"));
|
|
44
|
+
describe('nftTransactionBuilder', () => {
|
|
45
|
+
const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tvet:sdt'));
|
|
46
|
+
/**
|
|
47
|
+
* Sets up an NFT transaction builder with common parameters for testing.
|
|
48
|
+
* @param txBuilder - The transaction builder to set up
|
|
49
|
+
* @param senderAddress - The sender's address
|
|
50
|
+
* @param recipients - The recipients for the transaction
|
|
51
|
+
* @param nftCollectionId - Optional NFT collection ID
|
|
52
|
+
* @param tokenId - Optional token ID
|
|
53
|
+
*/
|
|
54
|
+
function setupNFTTransactionBuilder(txBuilder, senderAddress, recipients, nftCollectionId, tokenId) {
|
|
55
|
+
txBuilder.sender(senderAddress);
|
|
56
|
+
txBuilder.gas(21000);
|
|
57
|
+
txBuilder.nonce('64248');
|
|
58
|
+
txBuilder.blockRef('0x014ead140e77bbc1');
|
|
59
|
+
txBuilder.expiration(64);
|
|
60
|
+
txBuilder.gasPriceCoef(128);
|
|
61
|
+
if (nftCollectionId) {
|
|
62
|
+
txBuilder.nftCollectionId(nftCollectionId);
|
|
63
|
+
}
|
|
64
|
+
if (tokenId) {
|
|
65
|
+
txBuilder.tokenId(tokenId);
|
|
66
|
+
}
|
|
67
|
+
txBuilder.recipients(recipients);
|
|
68
|
+
txBuilder.addFeePayerAddress(testData.feePayer.address);
|
|
69
|
+
}
|
|
70
|
+
describe('Succeed', () => {
|
|
71
|
+
it('should build a nft transfer transaction', async function () {
|
|
72
|
+
const transaction = new src_1.NFTTransaction(statics_1.coins.get('tvet:sdt'));
|
|
73
|
+
const txBuilder = factory.getNFTTransactionBuilder(transaction);
|
|
74
|
+
setupNFTTransactionBuilder(txBuilder, testData.addresses.validAddresses[0], testData.nftRecipients, testData.NFT_CONTRACT_ADDRESS, '100131');
|
|
75
|
+
const tx = (await txBuilder.build());
|
|
76
|
+
should_1.default.equal(tx.sender, testData.addresses.validAddresses[0]);
|
|
77
|
+
should_1.default.equal(tx.recipients[0].address, testData.nftRecipients[0].address);
|
|
78
|
+
should_1.default.equal(tx.recipients[0].amount, testData.nftRecipients[0].amount);
|
|
79
|
+
should_1.default.equal(tx.gas, 21000);
|
|
80
|
+
should_1.default.equal(tx.getFee(), '315411764705882352');
|
|
81
|
+
should_1.default.equal(tx.nonce, '64248');
|
|
82
|
+
should_1.default.equal(tx.expiration, 64);
|
|
83
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendNFT);
|
|
84
|
+
tx.inputs.length.should.equal(1);
|
|
85
|
+
tx.inputs[0].should.deepEqual({
|
|
86
|
+
address: testData.addresses.validAddresses[0],
|
|
87
|
+
value: testData.nftRecipients[0].amount,
|
|
88
|
+
coin: 'tvet:sdt',
|
|
89
|
+
});
|
|
90
|
+
tx.outputs.length.should.equal(1);
|
|
91
|
+
tx.outputs[0].should.deepEqual({
|
|
92
|
+
address: testData.nftRecipients[0].address,
|
|
93
|
+
value: testData.nftRecipients[0].amount,
|
|
94
|
+
coin: 'tvet:sdt',
|
|
95
|
+
});
|
|
96
|
+
const rawTx = tx.toBroadcastFormat();
|
|
97
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
98
|
+
rawTx.should.equal(testData.UNSIGNED_TRANSACTION_4);
|
|
99
|
+
});
|
|
100
|
+
it('should build a transaction from signed hex', async function () {
|
|
101
|
+
const txBuilder = factory.from(testData.SPONSORED_NFT_TRANSACTION);
|
|
102
|
+
txBuilder.getNonce().should.equal('64248');
|
|
103
|
+
const tx = (await txBuilder.build());
|
|
104
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendNFT);
|
|
105
|
+
tx.inputs.length.should.equal(1);
|
|
106
|
+
tx.inputs[0].should.deepEqual({
|
|
107
|
+
address: testData.addresses.validAddresses[3],
|
|
108
|
+
value: '1',
|
|
109
|
+
coin: 'tvet:sdt',
|
|
110
|
+
});
|
|
111
|
+
tx.outputs.length.should.equal(1);
|
|
112
|
+
tx.outputs[0].should.deepEqual({
|
|
113
|
+
address: testData.addresses.validAddresses[0],
|
|
114
|
+
value: '1',
|
|
115
|
+
coin: 'tvet:sdt',
|
|
116
|
+
});
|
|
117
|
+
should_1.default.equal(tx.id, '0xfdd0343df857268994a737494ea9c2ac22b5a1c46c57e89d44c3e7be0fc52d56');
|
|
118
|
+
should_1.default.equal(tx.gas, 21000);
|
|
119
|
+
should_1.default.equal(tx.getFee(), '315411764705882352');
|
|
120
|
+
should_1.default.equal(tx.nonce, '64248');
|
|
121
|
+
should_1.default.equal(tx.expiration, 64);
|
|
122
|
+
should_1.default.equal(tx.nftCollectionId, '0x1ec1d168574603ec35b9d229843b7c2b44bcb770');
|
|
123
|
+
should_1.default.equal(tx.tokenId, '100131');
|
|
124
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendNFT);
|
|
125
|
+
const rawTx = tx.toBroadcastFormat();
|
|
126
|
+
should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
|
|
127
|
+
should_1.default.equal(rawTx, testData.SPONSORED_NFT_TRANSACTION);
|
|
128
|
+
});
|
|
129
|
+
it('should validate a valid signablePayload', async function () {
|
|
130
|
+
const transaction = new src_1.NFTTransaction(statics_1.coins.get('tvet:sdt'));
|
|
131
|
+
const txBuilder = factory.getNFTTransactionBuilder(transaction);
|
|
132
|
+
setupNFTTransactionBuilder(txBuilder, testData.addresses.validAddresses[3], testData.nftRecipients2, testData.NFT_CONTRACT_ADDRESS, '100131');
|
|
133
|
+
const tx = (await txBuilder.build());
|
|
134
|
+
const signablePayload = tx.signablePayload;
|
|
135
|
+
should_1.default.equal(signablePayload.toString('hex'), testData.VALID_NFT_SIGNABLE_PAYLOAD);
|
|
136
|
+
});
|
|
137
|
+
it('should build a unsigned tx and validate its toJson', async function () {
|
|
138
|
+
const transaction = new src_1.NFTTransaction(statics_1.coins.get('tvet:sdt'));
|
|
139
|
+
const txBuilder = factory.getNFTTransactionBuilder(transaction);
|
|
140
|
+
setupNFTTransactionBuilder(txBuilder, testData.addresses.validAddresses[3], testData.nftRecipients2, testData.NFT_CONTRACT_ADDRESS, '100131');
|
|
141
|
+
const tx = (await txBuilder.build());
|
|
142
|
+
const toJson = tx.toJson();
|
|
143
|
+
should_1.default.equal(toJson.sender, testData.addresses.validAddresses[3]);
|
|
144
|
+
should_1.default.deepEqual(toJson.recipients, [
|
|
145
|
+
{
|
|
146
|
+
address: testData.nftRecipients2[0].address,
|
|
147
|
+
amount: testData.nftRecipients2[0].amount,
|
|
148
|
+
},
|
|
149
|
+
]);
|
|
150
|
+
should_1.default.equal(toJson.nonce, '64248');
|
|
151
|
+
should_1.default.equal(toJson.gas, 21000);
|
|
152
|
+
should_1.default.equal(toJson.gasPriceCoef, 128);
|
|
153
|
+
should_1.default.equal(toJson.expiration, 64);
|
|
154
|
+
should_1.default.equal(toJson.feePayer, testData.feePayer.address);
|
|
155
|
+
should_1.default.equal(toJson.nftCollectionId, testData.NFT_CONTRACT_ADDRESS);
|
|
156
|
+
should_1.default.equal(toJson.tokenId, '100131');
|
|
157
|
+
});
|
|
158
|
+
it('should build a signed tx and validate its toJson', async function () {
|
|
159
|
+
const txBuilder = factory.from(testData.SPONSORED_NFT_TRANSACTION);
|
|
160
|
+
const tx = (await txBuilder.build());
|
|
161
|
+
const toJson = tx.toJson();
|
|
162
|
+
should_1.default.equal(toJson.sender, testData.addresses.validAddresses[3]);
|
|
163
|
+
should_1.default.deepEqual(toJson.recipients, [
|
|
164
|
+
{
|
|
165
|
+
address: testData.nftRecipients2[0].address,
|
|
166
|
+
amount: testData.nftRecipients2[0].amount,
|
|
167
|
+
},
|
|
168
|
+
]);
|
|
169
|
+
should_1.default.equal(toJson.nonce, '64248');
|
|
170
|
+
should_1.default.equal(toJson.gas, 21000);
|
|
171
|
+
should_1.default.equal(toJson.gasPriceCoef, 128);
|
|
172
|
+
should_1.default.equal(toJson.expiration, 64);
|
|
173
|
+
should_1.default.equal(toJson.nftCollectionId, testData.NFT_CONTRACT_ADDRESS);
|
|
174
|
+
should_1.default.equal(toJson.tokenId, '100131');
|
|
175
|
+
});
|
|
176
|
+
it('should build a unsigned tx then add sender sig and build again', async function () {
|
|
177
|
+
const transaction = new src_1.NFTTransaction(statics_1.coins.get('tvet:sdt'));
|
|
178
|
+
const txBuilder = factory.getNFTTransactionBuilder(transaction);
|
|
179
|
+
setupNFTTransactionBuilder(txBuilder, testData.addresses.validAddresses[3], testData.nftRecipients2, testData.NFT_CONTRACT_ADDRESS, '100131');
|
|
180
|
+
const tx = (await txBuilder.build());
|
|
181
|
+
const unsignedSerializedTx = tx.toBroadcastFormat();
|
|
182
|
+
const builder1 = factory.from(unsignedSerializedTx);
|
|
183
|
+
builder1.addSenderSignature(Buffer.from(testData.senderSig3, 'hex'));
|
|
184
|
+
const senderSignedTx = await builder1.build();
|
|
185
|
+
const senderSignedSerializedTx = senderSignedTx.toBroadcastFormat();
|
|
186
|
+
should_1.default.equal(senderSignedSerializedTx, testData.senderSignedSerializedHex3);
|
|
187
|
+
const builder2 = factory.from(testData.senderSignedSerializedHex3);
|
|
188
|
+
builder2.addSenderSignature(Buffer.from(testData.senderSig3, 'hex'));
|
|
189
|
+
builder2.addFeePayerSignature(Buffer.from(testData.feePayerSig3, 'hex'));
|
|
190
|
+
const completelySignedTx = await builder2.build();
|
|
191
|
+
should_1.default.equal(completelySignedTx.toBroadcastFormat(), testData.completeSignedSerializedHex3);
|
|
192
|
+
should_1.default.equal(completelySignedTx.id, '0xfdd0343df857268994a737494ea9c2ac22b5a1c46c57e89d44c3e7be0fc52d56');
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe('Fail', () => {
|
|
196
|
+
it('should fail for invalid sender', async function () {
|
|
197
|
+
const transaction = new src_1.Transaction(statics_1.coins.get('tvet:sdt'));
|
|
198
|
+
const builder = factory.getNFTTransactionBuilder(transaction);
|
|
199
|
+
(0, should_1.default)(() => builder.sender('randomString')).throwError('Invalid address randomString');
|
|
200
|
+
});
|
|
201
|
+
it('should fail for invalid recipient', async function () {
|
|
202
|
+
const builder = factory.getNFTTransactionBuilder();
|
|
203
|
+
(0, should_1.default)(() => builder.recipients([testData.invalidRecipients[0]])).throwError('Invalid address randomString');
|
|
204
|
+
(0, should_1.default)(() => builder.recipients([testData.invalidRecipients[1]])).throwError('Value cannot be anything other than 1 for NFT transfer');
|
|
205
|
+
(0, should_1.default)(() => builder.recipients([testData.invalidRecipients[2]])).throwError('Invalid amount format');
|
|
206
|
+
(0, should_1.default)(() => builder.recipients([testData.invalidRecipients[3]])).throwError('Value cannot be anything other than 1 for NFT transfer');
|
|
207
|
+
});
|
|
208
|
+
it('should fail for invalid gas amount', async function () {
|
|
209
|
+
const builder = factory.getNFTTransactionBuilder();
|
|
210
|
+
(0, should_1.default)(() => builder.gas(-1)).throwError('Value cannot be less than zero');
|
|
211
|
+
});
|
|
212
|
+
it('should fail to build if NFT Collection ID is not set', async function () {
|
|
213
|
+
const transaction = new src_1.NFTTransaction(statics_1.coins.get('tvet:sdt'));
|
|
214
|
+
const txBuilder = factory.getNFTTransactionBuilder(transaction);
|
|
215
|
+
setupNFTTransactionBuilder(txBuilder, testData.addresses.validAddresses[0], testData.nftRecipients);
|
|
216
|
+
try {
|
|
217
|
+
await txBuilder.build();
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
should_1.default.equal(err.message, 'NFT collection id is not set');
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
it('should fail to build if Token id is not set', async function () {
|
|
224
|
+
const transaction = new src_1.NFTTransaction(statics_1.coins.get('tvet:sdt'));
|
|
225
|
+
const txBuilder = factory.getNFTTransactionBuilder(transaction);
|
|
226
|
+
setupNFTTransactionBuilder(txBuilder, testData.addresses.validAddresses[0], testData.nftRecipients, testData.NFT_CONTRACT_ADDRESS);
|
|
227
|
+
try {
|
|
228
|
+
await txBuilder.build();
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
should_1.default.equal(err.message, 'Token id is not set');
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
it('should fail on setting invalid contract address', async function () {
|
|
235
|
+
const transaction = new src_1.NFTTransaction(statics_1.coins.get('tvet:vtho'));
|
|
236
|
+
const txBuilder = factory.getNFTTransactionBuilder(transaction);
|
|
237
|
+
setupNFTTransactionBuilder(txBuilder, testData.addresses.validAddresses[0], testData.nftRecipients, undefined, '100131');
|
|
238
|
+
(0, should_1.default)(() => txBuilder.nftCollectionId('InvalidTokenAddress')).throwError('Invalid nftCollectionId, must be a valid contract address');
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmZ0VHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC90cmFuc2FjdGlvbkJ1aWxkZXIvbmZ0VHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLGlEQUE0QztBQUM1QyxtREFBdUQ7QUFDdkQsbUNBQTBHO0FBQzFHLDJEQUE2QztBQUU3QyxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBRXJFOzs7Ozs7O09BT0c7SUFDSCxTQUFTLDBCQUEwQixDQUNqQyxTQUFnQyxFQUNoQyxhQUFxQixFQUNyQixVQUFpRCxFQUNqRCxlQUF3QixFQUN4QixPQUFnQjtRQUVoQixTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QixTQUFTLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDekMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsU0FBUyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQ3ZCLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLO1lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUksb0JBQWMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDOUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLDBCQUEwQixDQUN4QixTQUFTLEVBQ1QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQ3BDLFFBQVEsQ0FBQyxhQUFhLEVBQ3RCLFFBQVEsQ0FBQyxvQkFBb0IsRUFDN0IsUUFBUSxDQUNULENBQUM7WUFDRixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFtQixDQUFDO1lBQ3ZELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztZQUNoRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUM3QyxLQUFLLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2dCQUN2QyxJQUFJLEVBQUUsVUFBVTthQUNqQixDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztnQkFDMUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtnQkFDdkMsSUFBSSxFQUFFLFVBQVU7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNELEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUs7WUFDcEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNuRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUUzQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFtQixDQUFDO1lBQ3ZELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDNUIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsSUFBSSxFQUFFLFVBQVU7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLEtBQUssRUFBRSxHQUFHO2dCQUNWLElBQUksRUFBRSxVQUFVO2FBQ2pCLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsb0VBQW9FLENBQUMsQ0FBQztZQUMxRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVCLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2hELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLDRDQUE0QyxDQUFDLENBQUM7WUFDL0UsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNELGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLO1lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUksb0JBQWMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDOUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLDBCQUEwQixDQUN4QixTQUFTLEVBQ1QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQ3BDLFFBQVEsQ0FBQyxjQUFjLEVBQ3ZCLFFBQVEsQ0FBQyxvQkFBb0IsRUFDN0IsUUFBUSxDQUNULENBQUM7WUFDRixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1lBQ3BELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFDM0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxLQUFLO1lBQzVELE1BQU0sV0FBVyxHQUFHLElBQUksb0JBQWMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDOUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLDBCQUEwQixDQUN4QixTQUFTLEVBQ1QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQ3BDLFFBQVEsQ0FBQyxjQUFjLEVBQ3ZCLFFBQVEsQ0FBQyxvQkFBb0IsRUFDN0IsUUFBUSxDQUNULENBQUM7WUFDRixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1lBQ3BELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEUsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtnQkFDbEM7b0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztvQkFDM0MsTUFBTSxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtpQkFDMUM7YUFDRixDQUFDLENBQUM7WUFDSCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN2QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3BFLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSztZQUMxRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQW1CLENBQUM7WUFDdkQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRSxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUNsQztvQkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO29CQUMzQyxNQUFNLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2lCQUMxQzthQUNGLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDcEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNwRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLEtBQUs7WUFDeEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxvQkFBYyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM5RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEUsMEJBQTBCLENBQ3hCLFNBQVMsRUFDVCxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFDcEMsUUFBUSxDQUFDLGNBQWMsRUFDdkIsUUFBUSxDQUFDLG9CQUFvQixFQUM3QixRQUFRLENBQ1QsQ0FBQztZQUNGLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7WUFDcEQsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNwRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDcEQsUUFBUSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sY0FBYyxHQUFHLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlDLE1BQU0sd0JBQXdCLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDcEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFFNUUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUNuRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxRQUFRLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM1RixnQkFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsb0VBQW9FLENBQUMsQ0FBQztRQUM1RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDcEIsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEtBQUs7WUFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxpQkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMzRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUQsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxLQUFLO1lBQzNDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ25ELElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzdHLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDMUUsd0RBQXdELENBQ3pELENBQUM7WUFDRixJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN0RyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQzFFLHdEQUF3RCxDQUN6RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSztZQUM1QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNuRCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDN0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0RBQXNELEVBQUUsS0FBSztZQUM5RCxNQUFNLFdBQVcsR0FBRyxJQUFJLG9CQUFjLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzlELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRSwwQkFBMEIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BHLElBQUksQ0FBQztnQkFDSCxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxQixDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixnQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDhCQUE4QixDQUFDLENBQUM7WUFDNUQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEtBQUs7WUFDckQsTUFBTSxXQUFXLEdBQUcsSUFBSSxvQkFBYyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM5RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEUsMEJBQTBCLENBQ3hCLFNBQVMsRUFDVCxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFDcEMsUUFBUSxDQUFDLGFBQWEsRUFDdEIsUUFBUSxDQUFDLG9CQUFvQixDQUM5QixDQUFDO1lBQ0YsSUFBSSxDQUFDO2dCQUNILE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLGdCQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSztZQUN6RCxNQUFNLFdBQVcsR0FBRyxJQUFJLG9CQUFjLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRSwwQkFBMEIsQ0FDeEIsU0FBUyxFQUNULFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUNwQyxRQUFRLENBQUMsYUFBYSxFQUN0QixTQUFTLEVBQ1QsUUFBUSxDQUNULENBQUM7WUFDRixJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUN2RSwyREFBMkQsQ0FDNUQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBUcmFuc2FjdGlvbiwgTkZUVHJhbnNhY3Rpb24sIE5GVFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvdmV0JztcblxuZGVzY3JpYmUoJ25mdFRyYW5zYWN0aW9uQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndHZldDpzZHQnKSk7XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgYW4gTkZUIHRyYW5zYWN0aW9uIGJ1aWxkZXIgd2l0aCBjb21tb24gcGFyYW1ldGVycyBmb3IgdGVzdGluZy5cbiAgICogQHBhcmFtIHR4QnVpbGRlciAtIFRoZSB0cmFuc2FjdGlvbiBidWlsZGVyIHRvIHNldCB1cFxuICAgKiBAcGFyYW0gc2VuZGVyQWRkcmVzcyAtIFRoZSBzZW5kZXIncyBhZGRyZXNzXG4gICAqIEBwYXJhbSByZWNpcGllbnRzIC0gVGhlIHJlY2lwaWVudHMgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gbmZ0Q29sbGVjdGlvbklkIC0gT3B0aW9uYWwgTkZUIGNvbGxlY3Rpb24gSURcbiAgICogQHBhcmFtIHRva2VuSWQgLSBPcHRpb25hbCB0b2tlbiBJRFxuICAgKi9cbiAgZnVuY3Rpb24gc2V0dXBORlRUcmFuc2FjdGlvbkJ1aWxkZXIoXG4gICAgdHhCdWlsZGVyOiBORlRUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nLFxuICAgIHJlY2lwaWVudHM6IHsgYWRkcmVzczogc3RyaW5nOyBhbW91bnQ6IHN0cmluZyB9W10sXG4gICAgbmZ0Q29sbGVjdGlvbklkPzogc3RyaW5nLFxuICAgIHRva2VuSWQ/OiBzdHJpbmdcbiAgKSB7XG4gICAgdHhCdWlsZGVyLnNlbmRlcihzZW5kZXJBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIuZ2FzKDIxMDAwKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UoJzY0MjQ4Jyk7XG4gICAgdHhCdWlsZGVyLmJsb2NrUmVmKCcweDAxNGVhZDE0MGU3N2JiYzEnKTtcbiAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbig2NCk7XG4gICAgdHhCdWlsZGVyLmdhc1ByaWNlQ29lZigxMjgpO1xuICAgIGlmIChuZnRDb2xsZWN0aW9uSWQpIHtcbiAgICAgIHR4QnVpbGRlci5uZnRDb2xsZWN0aW9uSWQobmZ0Q29sbGVjdGlvbklkKTtcbiAgICB9XG4gICAgaWYgKHRva2VuSWQpIHtcbiAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgIH1cbiAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyhyZWNpcGllbnRzKTtcbiAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICB9XG5cbiAgZGVzY3JpYmUoJ1N1Y2NlZWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIG5mdCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IE5GVFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHZldDpzZHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldE5GVFRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICBzZXR1cE5GVFRyYW5zYWN0aW9uQnVpbGRlcihcbiAgICAgICAgdHhCdWlsZGVyLFxuICAgICAgICB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sXG4gICAgICAgIHRlc3REYXRhLm5mdFJlY2lwaWVudHMsXG4gICAgICAgIHRlc3REYXRhLk5GVF9DT05UUkFDVF9BRERSRVNTLFxuICAgICAgICAnMTAwMTMxJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBORlRUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hZGRyZXNzLCB0ZXN0RGF0YS5uZnRSZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHNbMF0uYW1vdW50LCB0ZXN0RGF0YS5uZnRSZWNpcGllbnRzWzBdLmFtb3VudCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzLCAyMTAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2V0RmVlKCksICczMTU0MTE3NjQ3MDU4ODIzNTInKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5ub25jZSwgJzY0MjQ4Jyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvbiwgNjQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kTkZUKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5uZnRSZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3R2ZXQ6c2R0JyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEubmZ0UmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEubmZ0UmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0dmV0OnNkdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuVU5TSUdORURfVFJBTlNBQ1RJT05fNCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNhY3Rpb24gZnJvbSBzaWduZWQgaGV4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNQT05TT1JFRF9ORlRfVFJBTlNBQ1RJT04pO1xuICAgICAgdHhCdWlsZGVyLmdldE5vbmNlKCkuc2hvdWxkLmVxdWFsKCc2NDI0OCcpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgTkZUVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmRORlQpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1szXSxcbiAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgY29pbjogJ3R2ZXQ6c2R0JyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLFxuICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICBjb2luOiAndHZldDpzZHQnLFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaWQsICcweGZkZDAzNDNkZjg1NzI2ODk5NGE3Mzc0OTRlYTljMmFjMjJiNWExYzQ2YzU3ZTg5ZDQ0YzNlN2JlMGZjNTJkNTYnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXMsIDIxMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nZXRGZWUoKSwgJzMxNTQxMTc2NDcwNTg4MjM1MicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm5vbmNlLCAnNjQyNDgnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5leHBpcmF0aW9uLCA2NCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgubmZ0Q29sbGVjdGlvbklkLCAnMHgxZWMxZDE2ODU3NDYwM2VjMzViOWQyMjk4NDNiN2MyYjQ0YmNiNzcwJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudG9rZW5JZCwgJzEwMDEzMScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kTkZUKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlNQT05TT1JFRF9ORlRfVFJBTlNBQ1RJT04pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIHZhbGlkIHNpZ25hYmxlUGF5bG9hZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IE5GVFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHZldDpzZHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldE5GVFRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICBzZXR1cE5GVFRyYW5zYWN0aW9uQnVpbGRlcihcbiAgICAgICAgdHhCdWlsZGVyLFxuICAgICAgICB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbM10sXG4gICAgICAgIHRlc3REYXRhLm5mdFJlY2lwaWVudHMyLFxuICAgICAgICB0ZXN0RGF0YS5ORlRfQ09OVFJBQ1RfQUREUkVTUyxcbiAgICAgICAgJzEwMDEzMSdcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSwgdGVzdERhdGEuVkFMSURfTkZUX1NJR05BQkxFX1BBWUxPQUQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHVuc2lnbmVkIHR4IGFuZCB2YWxpZGF0ZSBpdHMgdG9Kc29uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgTkZUVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0dmV0OnNkdCcpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0TkZUVHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgIHNldHVwTkZUVHJhbnNhY3Rpb25CdWlsZGVyKFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1szXSxcbiAgICAgICAgdGVzdERhdGEubmZ0UmVjaXBpZW50czIsXG4gICAgICAgIHRlc3REYXRhLk5GVF9DT05UUkFDVF9BRERSRVNTLFxuICAgICAgICAnMTAwMTMxJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHRvSnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZW5kZXIsIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1szXSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5uZnRSZWNpcGllbnRzMlswXS5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdGVzdERhdGEubmZ0UmVjaXBpZW50czJbMF0uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLm5vbmNlLCAnNjQyNDgnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZ2FzLCAyMTAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmdhc1ByaWNlQ29lZiwgMTI4KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZXhwaXJhdGlvbiwgNjQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5mZWVQYXllciwgdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLm5mdENvbGxlY3Rpb25JZCwgdGVzdERhdGEuTkZUX0NPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi50b2tlbklkLCAnMTAwMTMxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2lnbmVkIHR4IGFuZCB2YWxpZGF0ZSBpdHMgdG9Kc29uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNQT05TT1JFRF9ORlRfVFJBTlNBQ1RJT04pO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIE5GVFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlbmRlciwgdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzNdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodG9Kc29uLnJlY2lwaWVudHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLm5mdFJlY2lwaWVudHMyWzBdLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5uZnRSZWNpcGllbnRzMlswXS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24ubm9uY2UsICc2NDI0OCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5nYXMsIDIxMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZ2FzUHJpY2VDb2VmLCAxMjgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5leHBpcmF0aW9uLCA2NCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLm5mdENvbGxlY3Rpb25JZCwgdGVzdERhdGEuTkZUX0NPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi50b2tlbklkLCAnMTAwMTMxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdW5zaWduZWQgdHggdGhlbiBhZGQgc2VuZGVyIHNpZyBhbmQgYnVpbGQgYWdhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBORlRUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3R2ZXQ6c2R0JykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRORlRUcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgc2V0dXBORlRUcmFuc2FjdGlvbkJ1aWxkZXIoXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzNdLFxuICAgICAgICB0ZXN0RGF0YS5uZnRSZWNpcGllbnRzMixcbiAgICAgICAgdGVzdERhdGEuTkZUX0NPTlRSQUNUX0FERFJFU1MsXG4gICAgICAgICcxMDAxMzEnXG4gICAgICApO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdW5zaWduZWRTZXJpYWxpemVkVHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgYnVpbGRlcjEgPSBmYWN0b3J5LmZyb20odW5zaWduZWRTZXJpYWxpemVkVHgpO1xuICAgICAgYnVpbGRlcjEuYWRkU2VuZGVyU2lnbmF0dXJlKEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlclNpZzMsICdoZXgnKSk7XG4gICAgICBjb25zdCBzZW5kZXJTaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIxLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzZW5kZXJTaWduZWRTZXJpYWxpemVkVHggPSBzZW5kZXJTaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNlbmRlclNpZ25lZFNlcmlhbGl6ZWRUeCwgdGVzdERhdGEuc2VuZGVyU2lnbmVkU2VyaWFsaXplZEhleDMpO1xuXG4gICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5zZW5kZXJTaWduZWRTZXJpYWxpemVkSGV4Myk7XG4gICAgICBidWlsZGVyMi5hZGRTZW5kZXJTaWduYXR1cmUoQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyU2lnMywgJ2hleCcpKTtcbiAgICAgIGJ1aWxkZXIyLmFkZEZlZVBheWVyU2lnbmF0dXJlKEJ1ZmZlci5mcm9tKHRlc3REYXRhLmZlZVBheWVyU2lnMywgJ2hleCcpKTtcbiAgICAgIGNvbnN0IGNvbXBsZXRlbHlTaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwoY29tcGxldGVseVNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLmNvbXBsZXRlU2lnbmVkU2VyaWFsaXplZEhleDMpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbXBsZXRlbHlTaWduZWRUeC5pZCwgJzB4ZmRkMDM0M2RmODU3MjY4OTk0YTczNzQ5NGVhOWMyYWMyMmI1YTFjNDZjNTdlODlkNDRjM2U3YmUwZmM1MmQ1NicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRmFpbCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgc2VuZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0dmV0OnNkdCcpKTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldE5GVFRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5zZW5kZXIoJ3JhbmRvbVN0cmluZycpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGFkZHJlc3MgcmFuZG9tU3RyaW5nJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgcmVjaXBpZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0TkZUVHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5yZWNpcGllbnRzKFt0ZXN0RGF0YS5pbnZhbGlkUmVjaXBpZW50c1swXV0pKS50aHJvd0Vycm9yKCdJbnZhbGlkIGFkZHJlc3MgcmFuZG9tU3RyaW5nJyk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5yZWNpcGllbnRzKFt0ZXN0RGF0YS5pbnZhbGlkUmVjaXBpZW50c1sxXV0pKS50aHJvd0Vycm9yKFxuICAgICAgICAnVmFsdWUgY2Fubm90IGJlIGFueXRoaW5nIG90aGVyIHRoYW4gMSBmb3IgTkZUIHRyYW5zZmVyJ1xuICAgICAgKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnJlY2lwaWVudHMoW3Rlc3REYXRhLmludmFsaWRSZWNpcGllbnRzWzJdXSkpLnRocm93RXJyb3IoJ0ludmFsaWQgYW1vdW50IGZvcm1hdCcpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIucmVjaXBpZW50cyhbdGVzdERhdGEuaW52YWxpZFJlY2lwaWVudHNbM11dKSkudGhyb3dFcnJvcihcbiAgICAgICAgJ1ZhbHVlIGNhbm5vdCBiZSBhbnl0aGluZyBvdGhlciB0aGFuIDEgZm9yIE5GVCB0cmFuc2ZlcidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgZ2FzIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldE5GVFRyYW5zYWN0aW9uQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuZ2FzKC0xKSkudGhyb3dFcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgTkZUIENvbGxlY3Rpb24gSUQgaXMgbm90IHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IE5GVFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHZldDpzZHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldE5GVFRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICBzZXR1cE5GVFRyYW5zYWN0aW9uQnVpbGRlcih0eEJ1aWxkZXIsIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSwgdGVzdERhdGEubmZ0UmVjaXBpZW50cyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzaG91bGQuZXF1YWwoZXJyLm1lc3NhZ2UsICdORlQgY29sbGVjdGlvbiBpZCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgVG9rZW4gaWQgaXMgbm90IHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IE5GVFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHZldDpzZHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldE5GVFRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICBzZXR1cE5GVFRyYW5zYWN0aW9uQnVpbGRlcihcbiAgICAgICAgdHhCdWlsZGVyLFxuICAgICAgICB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sXG4gICAgICAgIHRlc3REYXRhLm5mdFJlY2lwaWVudHMsXG4gICAgICAgIHRlc3REYXRhLk5GVF9DT05UUkFDVF9BRERSRVNTXG4gICAgICApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGVyci5tZXNzYWdlLCAnVG9rZW4gaWQgaXMgbm90IHNldCcpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHNldHRpbmcgaW52YWxpZCBjb250cmFjdCBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgTkZUVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0dmV0OnZ0aG8nKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldE5GVFRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICBzZXR1cE5GVFRyYW5zYWN0aW9uQnVpbGRlcihcbiAgICAgICAgdHhCdWlsZGVyLFxuICAgICAgICB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sXG4gICAgICAgIHRlc3REYXRhLm5mdFJlY2lwaWVudHMsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgJzEwMDEzMSdcbiAgICAgICk7XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLm5mdENvbGxlY3Rpb25JZCgnSW52YWxpZFRva2VuQWRkcmVzcycpKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW52YWxpZCBuZnRDb2xsZWN0aW9uSWQsIG11c3QgYmUgYSB2YWxpZCBjb250cmFjdCBhZGRyZXNzJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stakeClauseTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../test/transactionBuilder/stakeClauseTransactionBuilder.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,248 @@
|
|
|
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 statics_1 = require("@bitgo-beta/statics");
|
|
40
|
+
const lib_1 = require("../../src/lib");
|
|
41
|
+
const should_1 = __importDefault(require("should"));
|
|
42
|
+
const constants_1 = require("../../src/lib/constants");
|
|
43
|
+
const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
|
|
44
|
+
const testData = __importStar(require("../resources/vet"));
|
|
45
|
+
describe('VET Staking Transaction', function () {
|
|
46
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tvet'));
|
|
47
|
+
const stakingContractAddress = constants_1.STARGATE_NFT_ADDRESS_TESTNET;
|
|
48
|
+
const amountToStake = '1000000000000000000'; // 1 VET in wei
|
|
49
|
+
const levelId = 8; // Test level ID
|
|
50
|
+
// Helper function to create a basic transaction builder with common properties
|
|
51
|
+
const createBasicTxBuilder = () => {
|
|
52
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
53
|
+
txBuilder.sender('0x9378c12BD7502A11F770a5C1F223c959B2805dA9');
|
|
54
|
+
txBuilder.chainTag(0x27); // Testnet chain tag
|
|
55
|
+
txBuilder.blockRef('0x0000000000000000');
|
|
56
|
+
txBuilder.expiration(64);
|
|
57
|
+
txBuilder.gas(100000);
|
|
58
|
+
txBuilder.gasPriceCoef(0);
|
|
59
|
+
txBuilder.nonce('12345');
|
|
60
|
+
return txBuilder;
|
|
61
|
+
};
|
|
62
|
+
it('should build a staking transaction', async function () {
|
|
63
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
64
|
+
txBuilder.stakingContractAddress(stakingContractAddress);
|
|
65
|
+
txBuilder.amountToStake(amountToStake);
|
|
66
|
+
txBuilder.levelId(levelId);
|
|
67
|
+
txBuilder.sender('0x9378c12BD7502A11F770a5C1F223c959B2805dA9');
|
|
68
|
+
txBuilder.chainTag(0x27); // Testnet chain tag
|
|
69
|
+
txBuilder.blockRef('0x0000000000000000');
|
|
70
|
+
txBuilder.expiration(64);
|
|
71
|
+
txBuilder.gas(100000);
|
|
72
|
+
txBuilder.gasPriceCoef(0);
|
|
73
|
+
txBuilder.nonce('12345');
|
|
74
|
+
const tx = await txBuilder.build();
|
|
75
|
+
should_1.default.exist(tx);
|
|
76
|
+
tx.should.be.instanceof(lib_1.Transaction);
|
|
77
|
+
tx.should.be.instanceof(lib_1.StakeClauseTransaction);
|
|
78
|
+
const stakingTx = tx;
|
|
79
|
+
stakingTx.stakingContractAddress.should.equal(stakingContractAddress);
|
|
80
|
+
stakingTx.amountToStake.should.equal(amountToStake);
|
|
81
|
+
stakingTx.levelId.should.equal(levelId);
|
|
82
|
+
// Verify clauses
|
|
83
|
+
stakingTx.clauses.length.should.equal(1);
|
|
84
|
+
should_1.default.exist(stakingTx.clauses[0].to);
|
|
85
|
+
stakingTx.clauses[0].to?.should.equal(stakingContractAddress);
|
|
86
|
+
stakingTx.clauses[0].value.should.equal(amountToStake);
|
|
87
|
+
// Verify transaction data is correctly encoded using ethereumABI
|
|
88
|
+
should_1.default.exist(stakingTx.clauses[0].data);
|
|
89
|
+
const txData = stakingTx.clauses[0].data;
|
|
90
|
+
txData.should.startWith(constants_1.STAKE_CLAUSE_METHOD_ID);
|
|
91
|
+
// Verify the encoded data matches what we expect from ethereumABI
|
|
92
|
+
const methodName = 'stake';
|
|
93
|
+
const types = ['uint8'];
|
|
94
|
+
const params = [levelId];
|
|
95
|
+
const method = ethereumjs_abi_1.default.methodID(methodName, types);
|
|
96
|
+
const args = ethereumjs_abi_1.default.rawEncode(types, params);
|
|
97
|
+
const expectedData = '0x' + Buffer.concat([method, args]).toString('hex');
|
|
98
|
+
txData.should.equal(expectedData);
|
|
99
|
+
// Verify recipients
|
|
100
|
+
stakingTx.recipients.length.should.equal(1);
|
|
101
|
+
stakingTx.recipients[0].address.should.equal(stakingContractAddress);
|
|
102
|
+
stakingTx.recipients[0].amount.should.equal(amountToStake);
|
|
103
|
+
});
|
|
104
|
+
describe('Failure scenarios', function () {
|
|
105
|
+
it('should throw error when stakingContractAddress is missing', async function () {
|
|
106
|
+
const txBuilder = createBasicTxBuilder();
|
|
107
|
+
txBuilder.amountToStake(amountToStake);
|
|
108
|
+
txBuilder.levelId(levelId);
|
|
109
|
+
await txBuilder.build().should.be.rejectedWith('Staking contract address is required');
|
|
110
|
+
});
|
|
111
|
+
it('should throw error when levelId is missing', async function () {
|
|
112
|
+
const txBuilder = createBasicTxBuilder();
|
|
113
|
+
txBuilder.stakingContractAddress(stakingContractAddress);
|
|
114
|
+
txBuilder.amountToStake(amountToStake);
|
|
115
|
+
await txBuilder.build().should.be.rejectedWith('Level ID is required');
|
|
116
|
+
});
|
|
117
|
+
it('should throw error when amountToStake is missing', async function () {
|
|
118
|
+
const txBuilder = createBasicTxBuilder();
|
|
119
|
+
txBuilder.stakingContractAddress(stakingContractAddress);
|
|
120
|
+
txBuilder.levelId(levelId);
|
|
121
|
+
await txBuilder.build().should.be.rejectedWith('Amount to stake is required');
|
|
122
|
+
});
|
|
123
|
+
it('should throw error when stakingContractAddress is invalid', async function () {
|
|
124
|
+
const txBuilder = createBasicTxBuilder();
|
|
125
|
+
// Invalid address (wrong format)
|
|
126
|
+
(0, should_1.default)(() => {
|
|
127
|
+
txBuilder.stakingContractAddress('invalid-address');
|
|
128
|
+
}).throw(/Invalid address/);
|
|
129
|
+
});
|
|
130
|
+
it('should throw error when amountToStake is not a valid number string', async function () {
|
|
131
|
+
const txBuilder = createBasicTxBuilder();
|
|
132
|
+
txBuilder.stakingContractAddress(stakingContractAddress);
|
|
133
|
+
txBuilder.levelId(levelId);
|
|
134
|
+
// Invalid amount (not a number)
|
|
135
|
+
txBuilder.amountToStake('not-a-number');
|
|
136
|
+
// Should fail when building the transaction due to invalid amount
|
|
137
|
+
await txBuilder.build().should.be.rejected();
|
|
138
|
+
});
|
|
139
|
+
it('should allow zero amountToStake but encode it properly', async function () {
|
|
140
|
+
const txBuilder = createBasicTxBuilder();
|
|
141
|
+
txBuilder.stakingContractAddress(stakingContractAddress);
|
|
142
|
+
txBuilder.levelId(levelId);
|
|
143
|
+
txBuilder.amountToStake('0');
|
|
144
|
+
const tx = await txBuilder.build();
|
|
145
|
+
tx.should.be.instanceof(lib_1.StakeClauseTransaction);
|
|
146
|
+
const stakingTx = tx;
|
|
147
|
+
// Verify the amount is correctly set to zero
|
|
148
|
+
stakingTx.amountToStake.should.equal('0');
|
|
149
|
+
// Verify the transaction data is correctly encoded with levelId for stake
|
|
150
|
+
// Expected data for stake(8) where 8 is levelId
|
|
151
|
+
const expectedData = '0x604f21770000000000000000000000000000000000000000000000000000000000000008';
|
|
152
|
+
stakingTx.clauses[0].data.should.equal(expectedData);
|
|
153
|
+
});
|
|
154
|
+
it('should build transaction with undefined sender but include it in inputs', async function () {
|
|
155
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
156
|
+
txBuilder.stakingContractAddress(stakingContractAddress);
|
|
157
|
+
txBuilder.amountToStake(amountToStake);
|
|
158
|
+
txBuilder.levelId(levelId);
|
|
159
|
+
txBuilder.chainTag(0x27);
|
|
160
|
+
txBuilder.blockRef('0x0000000000000000');
|
|
161
|
+
txBuilder.expiration(64);
|
|
162
|
+
txBuilder.gas(100000);
|
|
163
|
+
txBuilder.gasPriceCoef(0);
|
|
164
|
+
txBuilder.nonce('12345');
|
|
165
|
+
// Not setting sender
|
|
166
|
+
const tx = await txBuilder.build();
|
|
167
|
+
tx.should.be.instanceof(lib_1.StakeClauseTransaction);
|
|
168
|
+
const stakingTx = tx;
|
|
169
|
+
// Verify the transaction has inputs but with undefined address
|
|
170
|
+
stakingTx.inputs.length.should.equal(1);
|
|
171
|
+
should_1.default.not.exist(stakingTx.inputs[0].address);
|
|
172
|
+
// Verify the transaction has the correct output
|
|
173
|
+
stakingTx.outputs.length.should.equal(1);
|
|
174
|
+
stakingTx.outputs[0].address.should.equal(stakingContractAddress);
|
|
175
|
+
stakingTx.outputs[0].value.should.equal(amountToStake);
|
|
176
|
+
});
|
|
177
|
+
it('should use network default chainTag when not explicitly set', async function () {
|
|
178
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
179
|
+
txBuilder.stakingContractAddress(stakingContractAddress);
|
|
180
|
+
txBuilder.amountToStake(amountToStake);
|
|
181
|
+
txBuilder.levelId(levelId);
|
|
182
|
+
// Not setting chainTag
|
|
183
|
+
txBuilder.blockRef('0x0000000000000000');
|
|
184
|
+
txBuilder.expiration(64);
|
|
185
|
+
txBuilder.gas(100000);
|
|
186
|
+
txBuilder.gasPriceCoef(0);
|
|
187
|
+
txBuilder.nonce('12345');
|
|
188
|
+
txBuilder.sender('0x9378c12BD7502A11F770a5C1F223c959B2805dA9');
|
|
189
|
+
const tx = await txBuilder.build();
|
|
190
|
+
tx.should.be.instanceof(lib_1.StakeClauseTransaction);
|
|
191
|
+
const stakingTx = tx;
|
|
192
|
+
// Verify the chainTag is set to the testnet default (39)
|
|
193
|
+
stakingTx.chainTag.should.equal(39);
|
|
194
|
+
});
|
|
195
|
+
it('should verify ABI encoding matches expected output for different amounts', async function () {
|
|
196
|
+
const txBuilder = createBasicTxBuilder();
|
|
197
|
+
txBuilder.stakingContractAddress(stakingContractAddress);
|
|
198
|
+
txBuilder.levelId(levelId);
|
|
199
|
+
// Test with a different amount
|
|
200
|
+
const differentAmount = '500000000000000000'; // 0.5 VET
|
|
201
|
+
txBuilder.amountToStake(differentAmount);
|
|
202
|
+
const tx = await txBuilder.build();
|
|
203
|
+
const stakingTx = tx;
|
|
204
|
+
// Manually encode the expected data for stake method
|
|
205
|
+
const methodName = 'stake';
|
|
206
|
+
const types = ['uint8'];
|
|
207
|
+
const params = [levelId];
|
|
208
|
+
const method = ethereumjs_abi_1.default.methodID(methodName, types);
|
|
209
|
+
const args = ethereumjs_abi_1.default.rawEncode(types, params);
|
|
210
|
+
const expectedData = '0x' + Buffer.concat([method, args]).toString('hex');
|
|
211
|
+
// Verify the transaction data matches our manual encoding
|
|
212
|
+
stakingTx.clauses[0].data.should.equal(expectedData);
|
|
213
|
+
stakingTx.clauses[0].data.should.startWith(constants_1.STAKE_CLAUSE_METHOD_ID);
|
|
214
|
+
});
|
|
215
|
+
it('should handle extremely large stake amounts correctly', async function () {
|
|
216
|
+
const txBuilder = createBasicTxBuilder();
|
|
217
|
+
txBuilder.stakingContractAddress(stakingContractAddress);
|
|
218
|
+
txBuilder.levelId(levelId);
|
|
219
|
+
// Test with a very large amount (near uint256 max)
|
|
220
|
+
const largeAmount = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // 2^256 - 1
|
|
221
|
+
txBuilder.amountToStake(largeAmount);
|
|
222
|
+
const tx = await txBuilder.build();
|
|
223
|
+
const stakingTx = tx;
|
|
224
|
+
// Verify the amount is stored correctly
|
|
225
|
+
stakingTx.amountToStake.should.equal(largeAmount);
|
|
226
|
+
// The data should still be properly encoded
|
|
227
|
+
stakingTx.clauses[0].data.should.startWith(constants_1.STAKE_CLAUSE_METHOD_ID);
|
|
228
|
+
// Verify recipients
|
|
229
|
+
stakingTx.recipients[0].amount.should.equal(largeAmount);
|
|
230
|
+
});
|
|
231
|
+
it('should build a signed tx and validate its toJson', async function () {
|
|
232
|
+
const txBuilder = factory.from(testData.STAKE_CLAUSE_TRANSACTION);
|
|
233
|
+
const tx = txBuilder.transaction;
|
|
234
|
+
const toJson = tx.toJson();
|
|
235
|
+
toJson.id.should.equal('0x2f96e4c16d70bd3e2dabec29a07eb3d6066691ba5b812d6e897676f6ebc0a798');
|
|
236
|
+
toJson.stakingContractAddress?.should.equal('0x1ec1d168574603ec35b9d229843b7c2b44bcb770');
|
|
237
|
+
toJson.amountToStake?.should.equal('0xde0b6b3a7640000');
|
|
238
|
+
toJson.nonce.should.equal('504440');
|
|
239
|
+
toJson.gas.should.equal(392538);
|
|
240
|
+
toJson.gasPriceCoef.should.equal(128);
|
|
241
|
+
toJson.expiration.should.equal(64);
|
|
242
|
+
toJson.chainTag.should.equal(39);
|
|
243
|
+
// in stake txn, nftTokenId indicates the levelId
|
|
244
|
+
toJson.nftTokenId?.should.equal(8);
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2VDbGF1c2VUcmFuc2FjdGlvbkJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3RyYW5zYWN0aW9uQnVpbGRlci9zdGFrZUNsYXVzZVRyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUE0QztBQUM1Qyx1Q0FBK0Y7QUFDL0Ysb0RBQTRCO0FBQzVCLHVEQUErRjtBQUMvRixvRUFBeUM7QUFDekMsMkRBQTZDO0FBRTdDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtJQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRSxNQUFNLHNCQUFzQixHQUFHLHdDQUE0QixDQUFDO0lBQzVELE1BQU0sYUFBYSxHQUFHLHFCQUFxQixDQUFDLENBQUMsZUFBZTtJQUM1RCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7SUFFbkMsK0VBQStFO0lBQy9FLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxFQUFFO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3RELFNBQVMsQ0FBQyxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUMvRCxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CO1FBQzlDLFNBQVMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN6QyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsS0FBSyxDQUFDLE9B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QyxFQUFFLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakMsaURBQWlEO1lBQ2pELE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgVHJhbnNhY3Rpb24sIFN0YWtlQ2xhdXNlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFNUQUtFX0NMQVVTRV9NRVRIT0RfSUQsIFNUQVJHQVRFX05GVF9BRERSRVNTX1RFU1RORVQgfSBmcm9tICcuLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgRXRoZXJldW1BYmkgZnJvbSAnZXRoZXJldW1qcy1hYmknO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3ZldCc7XG5cbmRlc2NyaWJlKCdWRVQgU3Rha2luZyBUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndHZldCcpKTtcbiAgY29uc3Qgc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyA9IFNUQVJHQVRFX05GVF9BRERSRVNTX1RFU1RORVQ7XG4gIGNvbnN0IGFtb3VudFRvU3Rha2UgPSAnMTAwMDAwMDAwMDAwMDAwMDAwMCc7IC8vIDEgVkVUIGluIHdlaVxuICBjb25zdCBsZXZlbElkID0gODsgLy8gVGVzdCBsZXZlbCBJRFxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBiYXNpYyB0cmFuc2FjdGlvbiBidWlsZGVyIHdpdGggY29tbW9uIHByb3BlcnRpZXNcbiAgY29uc3QgY3JlYXRlQmFzaWNUeEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQWN0aXZhdGVCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcignMHg5Mzc4YzEyQkQ3NTAyQTExRjc3MGE1QzFGMjIzYzk1OUIyODA1ZEE5Jyk7XG4gICAgdHhCdWlsZGVyLmNoYWluVGFnKDB4MjcpOyAvLyBUZXN0bmV0IGNoYWluIHRhZ1xuICAgIHR4QnVpbGRlci5ibG9ja1JlZignMHgwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgdHhCdWlsZGVyLmV4cGlyYXRpb24oNjQpO1xuICAgIHR4QnVpbGRlci5nYXMoMTAwMDAwKTtcbiAgICB0eEJ1aWxkZXIuZ2FzUHJpY2VDb2VmKDApO1xuICAgIHR4QnVpbGRlci5ub25jZSgnMTIzNDUnKTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSBzdGFraW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0FjdGl2YXRlQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5hbW91bnRUb1N0YWtlKGFtb3VudFRvU3Rha2UpO1xuICAgIHR4QnVpbGRlci5sZXZlbElkKGxldmVsSWQpO1xuICAgIHR4QnVpbGRlci5zZW5kZXIoJzB4OTM3OGMxMkJENzUwMkExMUY3NzBhNUMxRjIyM2M5NTlCMjgwNWRBOScpO1xuICAgIHR4QnVpbGRlci5jaGFpblRhZygweDI3KTsgLy8gVGVzdG5ldCBjaGFpbiB0YWdcbiAgICB0eEJ1aWxkZXIuYmxvY2tSZWYoJzB4MDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKDY0KTtcbiAgICB0eEJ1aWxkZXIuZ2FzKDEwMDAwMCk7XG4gICAgdHhCdWlsZGVyLmdhc1ByaWNlQ29lZigwKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UoJzEyMzQ1Jyk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5leGlzdCh0eCk7XG4gICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgIHR4LnNob3VsZC5iZS5pbnN0YW5jZW9mKFN0YWtlQ2xhdXNlVHJhbnNhY3Rpb24pO1xuXG4gICAgY29uc3Qgc3Rha2luZ1R4ID0gdHggYXMgU3Rha2VDbGF1c2VUcmFuc2FjdGlvbjtcbiAgICBzdGFraW5nVHguc3Rha2luZ0NvbnRyYWN0QWRkcmVzcy5zaG91bGQuZXF1YWwoc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyk7XG4gICAgc3Rha2luZ1R4LmFtb3VudFRvU3Rha2Uuc2hvdWxkLmVxdWFsKGFtb3VudFRvU3Rha2UpO1xuICAgIHN0YWtpbmdUeC5sZXZlbElkLnNob3VsZC5lcXVhbChsZXZlbElkKTtcblxuICAgIC8vIFZlcmlmeSBjbGF1c2VzXG4gICAgc3Rha2luZ1R4LmNsYXVzZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1R4LmNsYXVzZXNbMF0udG8pO1xuICAgIHN0YWtpbmdUeC5jbGF1c2VzWzBdLnRvPy5zaG91bGQuZXF1YWwoc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyk7XG4gICAgc3Rha2luZ1R4LmNsYXVzZXNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKGFtb3VudFRvU3Rha2UpO1xuXG4gICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIGRhdGEgaXMgY29ycmVjdGx5IGVuY29kZWQgdXNpbmcgZXRoZXJldW1BQklcbiAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1R4LmNsYXVzZXNbMF0uZGF0YSk7XG4gICAgY29uc3QgdHhEYXRhID0gc3Rha2luZ1R4LmNsYXVzZXNbMF0uZGF0YTtcbiAgICB0eERhdGEuc2hvdWxkLnN0YXJ0V2l0aChTVEFLRV9DTEFVU0VfTUVUSE9EX0lEKTtcblxuICAgIC8vIFZlcmlmeSB0aGUgZW5jb2RlZCBkYXRhIG1hdGNoZXMgd2hhdCB3ZSBleHBlY3QgZnJvbSBldGhlcmV1bUFCSVxuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSAnc3Rha2UnO1xuICAgIGNvbnN0IHR5cGVzID0gWyd1aW50OCddO1xuICAgIGNvbnN0IHBhcmFtcyA9IFtsZXZlbElkXTtcblxuICAgIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKG1ldGhvZE5hbWUsIHR5cGVzKTtcbiAgICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKHR5cGVzLCBwYXJhbXMpO1xuICAgIGNvbnN0IGV4cGVjdGVkRGF0YSA9ICcweCcgKyBCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICB0eERhdGEuc2hvdWxkLmVxdWFsKGV4cGVjdGVkRGF0YSk7XG5cbiAgICAvLyBWZXJpZnkgcmVjaXBpZW50c1xuICAgIHN0YWtpbmdUeC5yZWNpcGllbnRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgc3Rha2luZ1R4LnJlY2lwaWVudHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyk7XG4gICAgc3Rha2luZ1R4LnJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChhbW91bnRUb1N0YWtlKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZhaWx1cmUgc2NlbmFyaW9zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBzdGFraW5nQ29udHJhY3RBZGRyZXNzIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVCYXNpY1R4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmFtb3VudFRvU3Rha2UoYW1vdW50VG9TdGFrZSk7XG4gICAgICB0eEJ1aWxkZXIubGV2ZWxJZChsZXZlbElkKTtcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnU3Rha2luZyBjb250cmFjdCBhZGRyZXNzIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gbGV2ZWxJZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlQmFzaWNUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLmFtb3VudFRvU3Rha2UoYW1vdW50VG9TdGFrZSk7XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0xldmVsIElEIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gYW1vdW50VG9TdGFrZSBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlQmFzaWNUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLmxldmVsSWQobGV2ZWxJZCk7XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0Ftb3VudCB0byBzdGFrZSBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHN0YWtpbmdDb250cmFjdEFkZHJlc3MgaXMgaW52YWxpZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZUJhc2ljVHhCdWlsZGVyKCk7XG5cbiAgICAgIC8vIEludmFsaWQgYWRkcmVzcyAod3JvbmcgZm9ybWF0KVxuICAgICAgc2hvdWxkKCgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnN0YWtpbmdDb250cmFjdEFkZHJlc3MoJ2ludmFsaWQtYWRkcmVzcycpO1xuICAgICAgfSkudGhyb3coL0ludmFsaWQgYWRkcmVzcy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIGFtb3VudFRvU3Rha2UgaXMgbm90IGEgdmFsaWQgbnVtYmVyIHN0cmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZUJhc2ljVHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyhzdGFraW5nQ29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5sZXZlbElkKGxldmVsSWQpO1xuXG4gICAgICAvLyBJbnZhbGlkIGFtb3VudCAobm90IGEgbnVtYmVyKVxuICAgICAgdHhCdWlsZGVyLmFtb3VudFRvU3Rha2UoJ25vdC1hLW51bWJlcicpO1xuXG4gICAgICAvLyBTaG91bGQgZmFpbCB3aGVuIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbiBkdWUgdG8gaW52YWxpZCBhbW91bnRcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyB6ZXJvIGFtb3VudFRvU3Rha2UgYnV0IGVuY29kZSBpdCBwcm9wZXJseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZUJhc2ljVHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyhzdGFraW5nQ29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5sZXZlbElkKGxldmVsSWQpO1xuICAgICAgdHhCdWlsZGVyLmFtb3VudFRvU3Rha2UoJzAnKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LnNob3VsZC5iZS5pbnN0YW5jZW9mKFN0YWtlQ2xhdXNlVHJhbnNhY3Rpb24pO1xuXG4gICAgICBjb25zdCBzdGFraW5nVHggPSB0eCBhcyBTdGFrZUNsYXVzZVRyYW5zYWN0aW9uO1xuICAgICAgLy8gVmVyaWZ5IHRoZSBhbW91bnQgaXMgY29ycmVjdGx5IHNldCB0byB6ZXJvXG4gICAgICBzdGFraW5nVHguYW1vdW50VG9TdGFrZS5zaG91bGQuZXF1YWwoJzAnKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSB0cmFuc2FjdGlvbiBkYXRhIGlzIGNvcnJlY3RseSBlbmNvZGVkIHdpdGggbGV2ZWxJZCBmb3Igc3Rha2VcbiAgICAgIC8vIEV4cGVjdGVkIGRhdGEgZm9yIHN0YWtlKDgpIHdoZXJlIDggaXMgbGV2ZWxJZFxuICAgICAgY29uc3QgZXhwZWN0ZWREYXRhID0gJzB4NjA0ZjIxNzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4JztcbiAgICAgIHN0YWtpbmdUeC5jbGF1c2VzWzBdLmRhdGEuc2hvdWxkLmVxdWFsKGV4cGVjdGVkRGF0YSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggdW5kZWZpbmVkIHNlbmRlciBidXQgaW5jbHVkZSBpdCBpbiBpbnB1dHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdBY3RpdmF0ZUJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLmFtb3VudFRvU3Rha2UoYW1vdW50VG9TdGFrZSk7XG4gICAgICB0eEJ1aWxkZXIubGV2ZWxJZChsZXZlbElkKTtcbiAgICAgIHR4QnVpbGRlci5jaGFpblRhZygweDI3KTtcbiAgICAgIHR4QnVpbGRlci5ibG9ja1JlZignMHgwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbig2NCk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzKDEwMDAwMCk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzUHJpY2VDb2VmKDApO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKCcxMjM0NScpO1xuICAgICAgLy8gTm90IHNldHRpbmcgc2VuZGVyXG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5zaG91bGQuYmUuaW5zdGFuY2VvZihTdGFrZUNsYXVzZVRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1R4ID0gdHggYXMgU3Rha2VDbGF1c2VUcmFuc2FjdGlvbjtcbiAgICAgIC8vIFZlcmlmeSB0aGUgdHJhbnNhY3Rpb24gaGFzIGlucHV0cyBidXQgd2l0aCB1bmRlZmluZWQgYWRkcmVzc1xuICAgICAgc3Rha2luZ1R4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChzdGFraW5nVHguaW5wdXRzWzBdLmFkZHJlc3MpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIHRyYW5zYWN0aW9uIGhhcyB0aGUgY29ycmVjdCBvdXRwdXRcbiAgICAgIHN0YWtpbmdUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzdGFraW5nVHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChzdGFraW5nQ29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHN0YWtpbmdUeC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbChhbW91bnRUb1N0YWtlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIG5ldHdvcmsgZGVmYXVsdCBjaGFpblRhZyB3aGVuIG5vdCBleHBsaWNpdGx5IHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0FjdGl2YXRlQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtpbmdDb250cmFjdEFkZHJlc3Moc3Rha2luZ0NvbnRyYWN0QWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuYW1vdW50VG9TdGFrZShhbW91bnRUb1N0YWtlKTtcbiAgICAgIHR4QnVpbGRlci5sZXZlbElkKGxldmVsSWQpO1xuICAgICAgLy8gTm90IHNldHRpbmcgY2hhaW5UYWdcbiAgICAgIHR4QnVpbGRlci5ibG9ja1JlZignMHgwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbig2NCk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzKDEwMDAwMCk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzUHJpY2VDb2VmKDApO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKCcxMjM0NScpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcignMHg5Mzc4YzEyQkQ3NTAyQTExRjc3MGE1QzFGMjIzYzk1OUIyODA1ZEE5Jyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5zaG91bGQuYmUuaW5zdGFuY2VvZihTdGFrZUNsYXVzZVRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1R4ID0gdHggYXMgU3Rha2VDbGF1c2VUcmFuc2FjdGlvbjtcbiAgICAgIC8vIFZlcmlmeSB0aGUgY2hhaW5UYWcgaXMgc2V0IHRvIHRoZSB0ZXN0bmV0IGRlZmF1bHQgKDM5KVxuICAgICAgc3Rha2luZ1R4LmNoYWluVGFnLnNob3VsZC5lcXVhbCgzOSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBBQkkgZW5jb2RpbmcgbWF0Y2hlcyBleHBlY3RlZCBvdXRwdXQgZm9yIGRpZmZlcmVudCBhbW91bnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlQmFzaWNUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLmxldmVsSWQobGV2ZWxJZCk7XG5cbiAgICAgIC8vIFRlc3Qgd2l0aCBhIGRpZmZlcmVudCBhbW91bnRcbiAgICAgIGNvbnN0IGRpZmZlcmVudEFtb3VudCA9ICc1MDAwMDAwMDAwMDAwMDAwMDAnOyAvLyAwLjUgVkVUXG4gICAgICB0eEJ1aWxkZXIuYW1vdW50VG9TdGFrZShkaWZmZXJlbnRBbW91bnQpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qgc3Rha2luZ1R4ID0gdHggYXMgU3Rha2VDbGF1c2VUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gTWFudWFsbHkgZW5jb2RlIHRoZSBleHBlY3RlZCBkYXRhIGZvciBzdGFrZSBtZXRob2RcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSAnc3Rha2UnO1xuICAgICAgY29uc3QgdHlwZXMgPSBbJ3VpbnQ4J107XG4gICAgICBjb25zdCBwYXJhbXMgPSBbbGV2ZWxJZF07XG5cbiAgICAgIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKG1ldGhvZE5hbWUsIHR5cGVzKTtcbiAgICAgIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUodHlwZXMsIHBhcmFtcyk7XG4gICAgICBjb25zdCBleHBlY3RlZERhdGEgPSAnMHgnICsgQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIHRyYW5zYWN0aW9uIGRhdGEgbWF0Y2hlcyBvdXIgbWFudWFsIGVuY29kaW5nXG4gICAgICBzdGFraW5nVHguY2xhdXNlc1swXS5kYXRhLnNob3VsZC5lcXVhbChleHBlY3RlZERhdGEpO1xuICAgICAgc3Rha2luZ1R4LmNsYXVzZXNbMF0uZGF0YS5zaG91bGQuc3RhcnRXaXRoKFNUQUtFX0NMQVVTRV9NRVRIT0RfSUQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZXh0cmVtZWx5IGxhcmdlIHN0YWtlIGFtb3VudHMgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlQmFzaWNUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQ29udHJhY3RBZGRyZXNzKHN0YWtpbmdDb250cmFjdEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLmxldmVsSWQobGV2ZWxJZCk7XG5cbiAgICAgIC8vIFRlc3Qgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IChuZWFyIHVpbnQyNTYgbWF4KVxuICAgICAgY29uc3QgbGFyZ2VBbW91bnQgPSAnMTE1NzkyMDg5MjM3MzE2MTk1NDIzNTcwOTg1MDA4Njg3OTA3ODUzMjY5OTg0NjY1NjQwNTY0MDM5NDU3NTg0MDA3OTEzMTI5NjM5OTM1JzsgLy8gMl4yNTYgLSAxXG4gICAgICB0eEJ1aWxkZXIuYW1vdW50VG9TdGFrZShsYXJnZUFtb3VudCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzdGFraW5nVHggPSB0eCBhcyBTdGFrZUNsYXVzZVRyYW5zYWN0aW9uO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIGFtb3VudCBpcyBzdG9yZWQgY29ycmVjdGx5XG4gICAgICBzdGFraW5nVHguYW1vdW50VG9TdGFrZS5zaG91bGQuZXF1YWwobGFyZ2VBbW91bnQpO1xuXG4gICAgICAvLyBUaGUgZGF0YSBzaG91bGQgc3RpbGwgYmUgcHJvcGVybHkgZW5jb2RlZFxuICAgICAgc3Rha2luZ1R4LmNsYXVzZXNbMF0uZGF0YS5zaG91bGQuc3RhcnRXaXRoKFNUQUtFX0NMQVVTRV9NRVRIT0RfSUQpO1xuXG4gICAgICAvLyBWZXJpZnkgcmVjaXBpZW50c1xuICAgICAgc3Rha2luZ1R4LnJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChsYXJnZUFtb3VudCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2lnbmVkIHR4IGFuZCB2YWxpZGF0ZSBpdHMgdG9Kc29uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNUQUtFX0NMQVVTRV9UUkFOU0FDVElPTik7XG4gICAgICBjb25zdCB0eCA9IHR4QnVpbGRlci50cmFuc2FjdGlvbiBhcyBTdGFrZUNsYXVzZVRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0b0pzb24uaWQuc2hvdWxkLmVxdWFsKCcweDJmOTZlNGMxNmQ3MGJkM2UyZGFiZWMyOWEwN2ViM2Q2MDY2NjkxYmE1YjgxMmQ2ZTg5NzY3NmY2ZWJjMGE3OTgnKTtcbiAgICAgIHRvSnNvbi5zdGFraW5nQ29udHJhY3RBZGRyZXNzPy5zaG91bGQuZXF1YWwoJzB4MWVjMWQxNjg1NzQ2MDNlYzM1YjlkMjI5ODQzYjdjMmI0NGJjYjc3MCcpO1xuICAgICAgdG9Kc29uLmFtb3VudFRvU3Rha2U/LnNob3VsZC5lcXVhbCgnMHhkZTBiNmIzYTc2NDAwMDAnKTtcbiAgICAgIHRvSnNvbi5ub25jZS5zaG91bGQuZXF1YWwoJzUwNDQ0MCcpO1xuICAgICAgdG9Kc29uLmdhcy5zaG91bGQuZXF1YWwoMzkyNTM4KTtcbiAgICAgIHRvSnNvbi5nYXNQcmljZUNvZWYuc2hvdWxkLmVxdWFsKDEyOCk7XG4gICAgICB0b0pzb24uZXhwaXJhdGlvbi5zaG91bGQuZXF1YWwoNjQpO1xuICAgICAgdG9Kc29uLmNoYWluVGFnLnNob3VsZC5lcXVhbCgzOSk7XG4gICAgICAvLyBpbiBzdGFrZSB0eG4sIG5mdFRva2VuSWQgaW5kaWNhdGVzIHRoZSBsZXZlbElkXG4gICAgICB0b0pzb24ubmZ0VG9rZW5JZD8uc2hvdWxkLmVxdWFsKDgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stakingTransaction.d.ts","sourceRoot":"","sources":["../../../test/transactionBuilder/stakingTransaction.ts"],"names":[],"mappings":""}
|