@bitgo/sdk-coin-sui 5.19.2 → 5.19.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
- package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
- package/dist/test/local_fullnode/RpcClient.js +111 -0
- package/dist/test/local_fullnode/faucet.d.ts +6 -0
- package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
- package/dist/test/local_fullnode/faucet.js +17 -0
- package/dist/test/local_fullnode/transactions.d.ts +2 -0
- package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
- package/dist/test/local_fullnode/transactions.js +190 -0
- package/dist/test/resources/sui.d.ts +463 -0
- package/dist/test/resources/sui.d.ts.map +1 -0
- package/dist/test/resources/sui.js +632 -0
- package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
- package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
- package/dist/test/unit/compareTransactionBlocks.js +64 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -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 +72 -0
- package/dist/test/unit/sui.d.ts +2 -0
- package/dist/test/unit/sui.d.ts.map +1 -0
- package/dist/test/unit/sui.js +2399 -0
- package/dist/test/unit/suiToken.d.ts +2 -0
- package/dist/test/unit/suiToken.d.ts.map +1 -0
- package/dist/test/unit/suiToken.js +39 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.js +152 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +149 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +192 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +162 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +181 -0
- package/dist/test/unit/transferTransaction.d.ts +2 -0
- package/dist/test/unit/transferTransaction.d.ts.map +1 -0
- package/dist/test/unit/transferTransaction.js +94 -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 +81 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +10 -7
- package/.eslintignore +0 -6
- package/.mocharc.yml +0 -7
- package/CHANGELOG.md +0 -1166
|
@@ -0,0 +1,639 @@
|
|
|
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 getBuilderFactory_1 = require("../getBuilderFactory");
|
|
40
|
+
const testData = __importStar(require("../../resources/sui"));
|
|
41
|
+
const should_1 = __importDefault(require("should"));
|
|
42
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
43
|
+
const iface_1 = require("../../../src/lib/iface");
|
|
44
|
+
const sui_1 = require("../../resources/sui");
|
|
45
|
+
const keyPair_1 = require("../../../src/lib/keyPair");
|
|
46
|
+
const constants_1 = require("../../../src/lib/constants");
|
|
47
|
+
describe('Sui Transaction Builder', async () => {
|
|
48
|
+
let builders;
|
|
49
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsui');
|
|
50
|
+
describe('Transfer TX', async () => {
|
|
51
|
+
beforeEach(function (done) {
|
|
52
|
+
builders = [factory.getTransferBuilder()];
|
|
53
|
+
done();
|
|
54
|
+
});
|
|
55
|
+
it('should build a transfer transaction and serialize it and deserialize it', async function () {
|
|
56
|
+
const txBuilder = factory.getTransferBuilder();
|
|
57
|
+
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
58
|
+
txBuilder.sender(testData.sender.address);
|
|
59
|
+
txBuilder.send(sui_1.recipients);
|
|
60
|
+
txBuilder.gasData(testData.gasData);
|
|
61
|
+
const tx = await txBuilder.build();
|
|
62
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
63
|
+
const rawTx = tx.toBroadcastFormat();
|
|
64
|
+
should_1.default.equal(rawTx, testData.TRANSFER);
|
|
65
|
+
const reserialized = await factory.from(rawTx).build();
|
|
66
|
+
reserialized.should.be.deepEqual(tx);
|
|
67
|
+
reserialized.toBroadcastFormat().should.equal(rawTx);
|
|
68
|
+
});
|
|
69
|
+
it('should build and sign a transfer tx with gasPayment', async function () {
|
|
70
|
+
const txBuilder = factory.getTransferBuilder();
|
|
71
|
+
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
72
|
+
txBuilder.sender(testData.sender.address);
|
|
73
|
+
txBuilder.send(sui_1.recipients);
|
|
74
|
+
txBuilder.gasData(testData.gasData);
|
|
75
|
+
const tx = await txBuilder.build();
|
|
76
|
+
should_1.default.equal(tx.id, 'UNAVAILABLE');
|
|
77
|
+
const rawTx = tx.toBroadcastFormat();
|
|
78
|
+
should_1.default.equal(rawTx, testData.TRANSFER);
|
|
79
|
+
const txBuilder2 = await factory.from(rawTx);
|
|
80
|
+
await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
81
|
+
const signedTx = await txBuilder2.build();
|
|
82
|
+
should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.Send);
|
|
83
|
+
should_1.default.equal(signedTx.id, 'BxoeGXbBCuw6VFEcgwHHUAKrCoAsGanPB39kdVVKZZcR');
|
|
84
|
+
const rawSignedTx = signedTx.toBroadcastFormat();
|
|
85
|
+
should_1.default.equal(rawSignedTx, testData.TRANSFER);
|
|
86
|
+
const reserializedTxBuilder = factory.from(rawSignedTx);
|
|
87
|
+
reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
88
|
+
const reserialized = await reserializedTxBuilder.build();
|
|
89
|
+
reserialized.should.be.deepEqual(signedTx);
|
|
90
|
+
reserialized.toBroadcastFormat().should.equal(rawSignedTx);
|
|
91
|
+
});
|
|
92
|
+
it('should build and sign a transfer tx with gasPayment as different owner', async function () {
|
|
93
|
+
const txBuilder = factory.getTransferBuilder();
|
|
94
|
+
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
95
|
+
txBuilder.sender(testData.sender.address);
|
|
96
|
+
txBuilder.send(sui_1.recipients);
|
|
97
|
+
txBuilder.gasData(testData.gasDataHavingDifferentOwner);
|
|
98
|
+
const tx = await txBuilder.build();
|
|
99
|
+
should_1.default.equal(tx.id, 'UNAVAILABLE');
|
|
100
|
+
const rawTx = tx.toBroadcastFormat();
|
|
101
|
+
should_1.default.equal(rawTx, testData.FEE_SPONSOR_TRANSFER);
|
|
102
|
+
const txBuilder2 = await factory.from(rawTx);
|
|
103
|
+
await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
104
|
+
await txBuilder2.addFeePayerSignature({ pub: testData.feePayer.publicKey }, Buffer.from(testData.feePayer.signatureHex));
|
|
105
|
+
const signedTx = await txBuilder2.build();
|
|
106
|
+
should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.Send);
|
|
107
|
+
should_1.default.equal(signedTx.id, 'Co5d6tiLQuwUPrfPp7vfmcJMNK5gWZ3StFR6cvzq6R12');
|
|
108
|
+
const rawSignedTx = signedTx.toBroadcastFormat();
|
|
109
|
+
should_1.default.equal(rawSignedTx, testData.FEE_SPONSOR_TRANSFER);
|
|
110
|
+
const reserializedTxBuilder = factory.from(rawSignedTx);
|
|
111
|
+
reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
112
|
+
reserializedTxBuilder.addFeePayerSignature({ pub: testData.feePayer.publicKey }, Buffer.from(testData.feePayer.signatureHex));
|
|
113
|
+
const reserialized = await reserializedTxBuilder.build();
|
|
114
|
+
reserialized.should.be.deepEqual(signedTx);
|
|
115
|
+
reserialized.toBroadcastFormat().should.equal(rawSignedTx);
|
|
116
|
+
});
|
|
117
|
+
it('should submit a transfer transaction with private keys', async () => {
|
|
118
|
+
const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
|
|
119
|
+
const keyPairRecipient = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey2 });
|
|
120
|
+
const senderAddress = keyPairSender.getAddress();
|
|
121
|
+
const receiveAddress = keyPairRecipient.getAddress();
|
|
122
|
+
const expectedTransferTxSig = 'AI8Q9KINqSCOeHvhv6MJ6Vf3TWbTcxhpclg0PD9gBgand2kLQZxEJS/HJASganLKfZ277Il4mAifKHzvtb2fCA+lzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
|
|
123
|
+
const expectedTransferTxHex = 'AAACAAgA4fUFAAAAAAAgtev+nncDfTtowJZEPHUMsJXia4wKmT/Xpgtrzsy6O38CAgABAQAAAQECAAABAQCQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
|
|
124
|
+
const coins = [
|
|
125
|
+
{
|
|
126
|
+
digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
|
|
127
|
+
objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
|
|
128
|
+
version: 1126,
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
|
|
132
|
+
objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
|
|
133
|
+
version: 1126,
|
|
134
|
+
},
|
|
135
|
+
];
|
|
136
|
+
const txBuilder_1 = factory.getTransferBuilder();
|
|
137
|
+
txBuilder_1.type(iface_1.SuiTransactionType.Transfer);
|
|
138
|
+
txBuilder_1.sender(senderAddress);
|
|
139
|
+
txBuilder_1.send([{ address: receiveAddress, amount: '100000000' }]);
|
|
140
|
+
const gasData = {
|
|
141
|
+
payment: coins,
|
|
142
|
+
owner: senderAddress,
|
|
143
|
+
budget: testData.GAS_BUDGET,
|
|
144
|
+
price: 1000,
|
|
145
|
+
};
|
|
146
|
+
txBuilder_1.gasData(gasData);
|
|
147
|
+
const tx_1 = await txBuilder_1.build();
|
|
148
|
+
const signable_1 = tx_1.signablePayload;
|
|
149
|
+
const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
|
|
150
|
+
txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
|
|
151
|
+
const signedTx_1 = (await txBuilder_1.build());
|
|
152
|
+
const txHex_1 = signedTx_1.toBroadcastFormat();
|
|
153
|
+
const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
|
|
154
|
+
const txBuilderFromRaw_2 = factory.getTransferBuilder();
|
|
155
|
+
txBuilderFromRaw_2.from(txHex_1);
|
|
156
|
+
const signable_2 = tx_1.signablePayload;
|
|
157
|
+
txBuilderFromRaw_2.sign({ key: testData.privateKeys.prvKey1 });
|
|
158
|
+
const signedTx_2 = (await txBuilderFromRaw_2.build());
|
|
159
|
+
const txHex_2 = signedTx_2.toBroadcastFormat();
|
|
160
|
+
const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
|
|
161
|
+
should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
|
|
162
|
+
should_1.default.equal(txHex_1, txHex_2);
|
|
163
|
+
should_1.default.equal(txHex_1, expectedTransferTxHex);
|
|
164
|
+
should_1.default.equal(txHex_2, expectedTransferTxHex);
|
|
165
|
+
should_1.default.equal(sig_1, sig_2);
|
|
166
|
+
should_1.default.equal(sig_1, expectedTransferTxSig);
|
|
167
|
+
should_1.default.equal(sig_2, expectedTransferTxSig);
|
|
168
|
+
});
|
|
169
|
+
it('should submit a slit coin transaction with private keys', async () => {
|
|
170
|
+
const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
|
|
171
|
+
const senderAddress = keyPairSender.getAddress();
|
|
172
|
+
const expectedTransferTxSig = 'AGGWHZuyUjsxMhMoPoqdsZRTC50a8mByDhupwE0WrDlvvqzwaRO7R5sY20/IYgabUA9fep3o35ssnRhUZ0jDqwmlzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
|
|
173
|
+
const expectedTransferTxHex = 'AAAVAAgA4fUFAAAAAAAgkAdCu5I+qQalbzJaF1l3UuzTrDAmu6luDt/0XejbM6sACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAKAIAAQEAAAEBAgAAAQEAAgABAQIAAQECAgABAQACAAEBAwABAQIEAAEBAAIAAQEEAAEBAgYAAQEAAgABAQUAAQECCAABAQACAAEBBgABAQIKAAEBAAIAAQEHAAEBAgwAAQEAAgABAQgAAQECDgABAQACAAEBCQABAQIQAAEBAAIAAQEKAAEBAhIAAQEAAgABAQsAAQECFAABAQACAAEBDAABAQIWAAEBAAIAAQENAAEBAhgAAQEAAgABAQ4AAQECGgABAQACAAEBDwABAQIcAAEBAAIAAQEQAAEBAh4AAQEAAgABAREAAQECIAABAQACAAEBEgABAQIiAAEBAAIAAQETAAEBAiQAAQEAAgABARQAAQECJgABAQCQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
|
|
174
|
+
const coins = [
|
|
175
|
+
{
|
|
176
|
+
digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
|
|
177
|
+
objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
|
|
178
|
+
version: 1126,
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
|
|
182
|
+
objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
|
|
183
|
+
version: 1126,
|
|
184
|
+
},
|
|
185
|
+
];
|
|
186
|
+
const txBuilder_1 = factory.getTransferBuilder();
|
|
187
|
+
txBuilder_1.type(iface_1.SuiTransactionType.Transfer);
|
|
188
|
+
txBuilder_1.sender(senderAddress);
|
|
189
|
+
txBuilder_1.send(Array(20).fill({ address: senderAddress, amount: '100000000' }));
|
|
190
|
+
const gasData = {
|
|
191
|
+
payment: coins,
|
|
192
|
+
owner: senderAddress,
|
|
193
|
+
budget: testData.GAS_BUDGET,
|
|
194
|
+
price: 1000,
|
|
195
|
+
};
|
|
196
|
+
txBuilder_1.gasData(gasData);
|
|
197
|
+
const tx_1 = await txBuilder_1.build();
|
|
198
|
+
const signable_1 = tx_1.signablePayload;
|
|
199
|
+
const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
|
|
200
|
+
txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
|
|
201
|
+
const signedTx_1 = (await txBuilder_1.build());
|
|
202
|
+
const txHex_1 = signedTx_1.toBroadcastFormat();
|
|
203
|
+
const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
|
|
204
|
+
const txBuilderFromRaw_2 = factory.getTransferBuilder();
|
|
205
|
+
txBuilderFromRaw_2.from(txHex_1);
|
|
206
|
+
const signable_2 = tx_1.signablePayload;
|
|
207
|
+
const signature_2 = keyPairSender.signMessageinUint8Array(signable_2);
|
|
208
|
+
txBuilderFromRaw_2.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_2));
|
|
209
|
+
const signedTx_2 = (await txBuilderFromRaw_2.build());
|
|
210
|
+
const txHex_2 = signedTx_2.toBroadcastFormat();
|
|
211
|
+
const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
|
|
212
|
+
should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
|
|
213
|
+
should_1.default.equal(txHex_1, txHex_2);
|
|
214
|
+
should_1.default.equal(txHex_1, expectedTransferTxHex);
|
|
215
|
+
should_1.default.equal(txHex_2, expectedTransferTxHex);
|
|
216
|
+
should_1.default.equal(sig_1, sig_2);
|
|
217
|
+
should_1.default.equal(sig_1, expectedTransferTxSig);
|
|
218
|
+
should_1.default.equal(sig_2, expectedTransferTxSig);
|
|
219
|
+
});
|
|
220
|
+
it('should fail to build if missing type', async function () {
|
|
221
|
+
for (const txBuilder of builders) {
|
|
222
|
+
txBuilder.sender(testData.sender.address);
|
|
223
|
+
txBuilder.send(sui_1.recipients);
|
|
224
|
+
txBuilder.gasData(testData.gasData);
|
|
225
|
+
await txBuilder.build().should.rejectedWith('type is required before building');
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
it('should fail to build if missing sender', async function () {
|
|
229
|
+
for (const txBuilder of builders) {
|
|
230
|
+
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
231
|
+
txBuilder.send(sui_1.recipients);
|
|
232
|
+
txBuilder.gasData(testData.gasData);
|
|
233
|
+
await txBuilder.build().should.rejectedWith('sender is required before building');
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
it('should fail to build if missing recipients', async function () {
|
|
237
|
+
for (const txBuilder of builders) {
|
|
238
|
+
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
239
|
+
txBuilder.sender(testData.sender.address);
|
|
240
|
+
txBuilder.gasData(testData.gasData);
|
|
241
|
+
await txBuilder.build().should.rejectedWith('at least one recipient is required before building');
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
it('should fail to build if missing gasData', async function () {
|
|
245
|
+
for (const txBuilder of builders) {
|
|
246
|
+
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
247
|
+
txBuilder.sender(testData.sender.address);
|
|
248
|
+
txBuilder.send(sui_1.recipients);
|
|
249
|
+
await txBuilder.build().should.rejectedWith('gasData is required before building');
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
it('should fail to build if missing payment coins in gasData', async function () {
|
|
253
|
+
for (const txBuilder of builders) {
|
|
254
|
+
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
255
|
+
txBuilder.sender(testData.sender.address);
|
|
256
|
+
txBuilder.send(sui_1.recipients);
|
|
257
|
+
(0, should_1.default)(() => txBuilder.gasData(testData.gasDataWithoutGasPayment)).throwError(`gas payment is required before building`);
|
|
258
|
+
await txBuilder.build().should.rejectedWith('gasData is required before building');
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
it('should build a send from rawTx', async function () {
|
|
262
|
+
const txBuilder = factory.from(testData.TRANSFER);
|
|
263
|
+
const builtTx = await txBuilder.build();
|
|
264
|
+
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.Send);
|
|
265
|
+
should_1.default.equal(builtTx.id, 'BxoeGXbBCuw6VFEcgwHHUAKrCoAsGanPB39kdVVKZZcR');
|
|
266
|
+
builtTx.inputs.length.should.equal(1);
|
|
267
|
+
builtTx.inputs[0].should.deepEqual({
|
|
268
|
+
address: testData.sender.address,
|
|
269
|
+
value: (testData.AMOUNT * 2).toString(),
|
|
270
|
+
coin: 'tsui',
|
|
271
|
+
});
|
|
272
|
+
builtTx.outputs.length.should.equal(2);
|
|
273
|
+
builtTx.outputs[0].should.deepEqual({
|
|
274
|
+
address: testData.recipients[0].address,
|
|
275
|
+
value: testData.recipients[0].amount,
|
|
276
|
+
coin: 'tsui',
|
|
277
|
+
});
|
|
278
|
+
builtTx.outputs[1].should.deepEqual({
|
|
279
|
+
address: testData.recipients[1].address,
|
|
280
|
+
value: testData.recipients[1].amount,
|
|
281
|
+
coin: 'tsui',
|
|
282
|
+
});
|
|
283
|
+
const jsonTx = builtTx.toJson();
|
|
284
|
+
jsonTx.gasData.should.deepEqual(testData.gasData);
|
|
285
|
+
jsonTx.kind.ProgrammableTransaction.should.deepEqual({
|
|
286
|
+
inputs: testData.txInputs,
|
|
287
|
+
transactions: testData.txTransactions,
|
|
288
|
+
});
|
|
289
|
+
jsonTx.sender.should.equal(testData.sender.address);
|
|
290
|
+
jsonTx.gasData.should.deepEqual(testData.gasData);
|
|
291
|
+
builtTx.toBroadcastFormat().should.equal(testData.TRANSFER);
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
describe('Staking TX', async () => {
|
|
295
|
+
beforeEach(function (done) {
|
|
296
|
+
builders = [factory.getStakingBuilder()];
|
|
297
|
+
done();
|
|
298
|
+
});
|
|
299
|
+
it('should build an add staking transaction and serialize it and deserialize it', async function () {
|
|
300
|
+
const txBuilder = factory.getStakingBuilder();
|
|
301
|
+
txBuilder.type(iface_1.SuiTransactionType.AddStake);
|
|
302
|
+
txBuilder.sender(testData.sender.address);
|
|
303
|
+
txBuilder.stake([testData.requestAddStake]);
|
|
304
|
+
txBuilder.gasData(testData.gasData);
|
|
305
|
+
const tx = await txBuilder.build();
|
|
306
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingAdd);
|
|
307
|
+
const rawTx = tx.toBroadcastFormat();
|
|
308
|
+
should_1.default.equal(rawTx, testData.ADD_STAKE);
|
|
309
|
+
const reserialized = await factory.from(rawTx).build();
|
|
310
|
+
reserialized.toBroadcastFormat().should.equal(rawTx);
|
|
311
|
+
});
|
|
312
|
+
it('should build an stakeMany transaction and serialize it and deserialize it', async function () {
|
|
313
|
+
const txBuilder = factory.getStakingBuilder();
|
|
314
|
+
txBuilder.type(iface_1.SuiTransactionType.AddStake);
|
|
315
|
+
txBuilder.sender(testData.sender.address);
|
|
316
|
+
txBuilder.stake(testData.requestAddStakeMany);
|
|
317
|
+
txBuilder.gasData(testData.gasData);
|
|
318
|
+
const tx = await txBuilder.build();
|
|
319
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingAdd);
|
|
320
|
+
const rawTx = tx.toBroadcastFormat();
|
|
321
|
+
should_1.default.equal(rawTx, testData.STAKE_MANY);
|
|
322
|
+
const reserialized = await factory.from(rawTx).build();
|
|
323
|
+
// reserialized.should.be.deepEqual(tx);
|
|
324
|
+
reserialized.toBroadcastFormat().should.equal(rawTx);
|
|
325
|
+
});
|
|
326
|
+
it('should build and sign a staking tx with gasPayment', async function () {
|
|
327
|
+
const txBuilder = factory.getStakingBuilder();
|
|
328
|
+
txBuilder.type(iface_1.SuiTransactionType.AddStake);
|
|
329
|
+
txBuilder.sender(testData.sender.address);
|
|
330
|
+
txBuilder.stake([testData.requestAddStake]);
|
|
331
|
+
txBuilder.gasData(testData.gasData);
|
|
332
|
+
const tx = await txBuilder.build();
|
|
333
|
+
should_1.default.equal(tx.id, 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh');
|
|
334
|
+
const rawTx = tx.toBroadcastFormat();
|
|
335
|
+
should_1.default.equal(rawTx, testData.ADD_STAKE);
|
|
336
|
+
const txBuilder2 = await factory.from(rawTx);
|
|
337
|
+
await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
338
|
+
const signedTx = await txBuilder2.build();
|
|
339
|
+
should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.StakingAdd);
|
|
340
|
+
should_1.default.equal(signedTx.id, 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh');
|
|
341
|
+
const rawSignedTx = signedTx.toBroadcastFormat();
|
|
342
|
+
should_1.default.equal(rawSignedTx, testData.ADD_STAKE);
|
|
343
|
+
const reserializedTxBuilder = factory.from(rawSignedTx);
|
|
344
|
+
reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
345
|
+
const reserialized = await reserializedTxBuilder.build();
|
|
346
|
+
reserialized.should.be.deepEqual(signedTx);
|
|
347
|
+
reserialized.toBroadcastFormat().should.equal(rawSignedTx);
|
|
348
|
+
});
|
|
349
|
+
it('should build and sign a staking transaction with private keys', async () => {
|
|
350
|
+
const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
|
|
351
|
+
const senderAddress = keyPairSender.getAddress();
|
|
352
|
+
const expectedStakingTxSig = 'AD8755e+kA3/Iy+3oRxBbQiK0Iz4qmD4sZcpoQN0UMPxIXv7Qx4twvuAiZf9H2nHYa/Ae0asM4Rkz1SCP0dhXgqlzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
|
|
353
|
+
const expectedStakingTxHex = 'AAAJAAgALTEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBAAAAAAAAAAEAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjAAgArCP8BgAAAAAgRLGzGeI0lZlfyDfa/Sj8avi2Re3d/w/BRn8a1jE2LCYACAAtMQEAAAAAACBEsbMZ4jSVmV/IN9r9KPxq+LZF7d3/D8FGfxrWMTYsJgAIAKwj/AYAAAAAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjCAIAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACAAABAgACAAEBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKc3VpX3N5c3RlbRFyZXF1ZXN0X2FkZF9zdGFrZQADAQEAAgIAAQQAAgABAQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCnN1aV9zeXN0ZW0RcmVxdWVzdF9hZGRfc3Rha2UAAwEBAAIEAAEGAAIAAQEHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACBgABCACQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
|
|
354
|
+
const coins = [
|
|
355
|
+
{
|
|
356
|
+
digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
|
|
357
|
+
objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
|
|
358
|
+
version: 1126,
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
|
|
362
|
+
objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
|
|
363
|
+
version: 1126,
|
|
364
|
+
},
|
|
365
|
+
];
|
|
366
|
+
const txBuilder_1 = factory.getStakingBuilder();
|
|
367
|
+
txBuilder_1.type(iface_1.SuiTransactionType.AddStake);
|
|
368
|
+
txBuilder_1.sender(senderAddress);
|
|
369
|
+
txBuilder_1.stake(testData.requestAddStakeMany);
|
|
370
|
+
const gasData = {
|
|
371
|
+
payment: coins,
|
|
372
|
+
owner: senderAddress,
|
|
373
|
+
budget: testData.GAS_BUDGET,
|
|
374
|
+
price: 1000,
|
|
375
|
+
};
|
|
376
|
+
txBuilder_1.gasData(gasData);
|
|
377
|
+
const tx_1 = await txBuilder_1.build();
|
|
378
|
+
const signable_1 = tx_1.signablePayload;
|
|
379
|
+
const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
|
|
380
|
+
txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
|
|
381
|
+
const signedTx_1 = (await txBuilder_1.build());
|
|
382
|
+
const txHex_1 = signedTx_1.toBroadcastFormat();
|
|
383
|
+
const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
|
|
384
|
+
const txBuilderFromRaw_2 = factory.getStakingBuilder();
|
|
385
|
+
txBuilderFromRaw_2.from(txHex_1);
|
|
386
|
+
const signable_2 = tx_1.signablePayload;
|
|
387
|
+
txBuilderFromRaw_2.sign({ key: testData.privateKeys.prvKey1 });
|
|
388
|
+
const signedTx_2 = (await txBuilderFromRaw_2.build());
|
|
389
|
+
const txHex_2 = signedTx_2.toBroadcastFormat();
|
|
390
|
+
const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
|
|
391
|
+
should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
|
|
392
|
+
should_1.default.equal(txHex_1, txHex_2);
|
|
393
|
+
should_1.default.equal(txHex_1, expectedStakingTxHex);
|
|
394
|
+
should_1.default.equal(txHex_2, expectedStakingTxHex);
|
|
395
|
+
should_1.default.equal(sig_1, sig_2);
|
|
396
|
+
should_1.default.equal(sig_1, expectedStakingTxSig);
|
|
397
|
+
should_1.default.equal(sig_2, expectedStakingTxSig);
|
|
398
|
+
});
|
|
399
|
+
it('should fail to build if missing type', async function () {
|
|
400
|
+
for (const txBuilder of builders) {
|
|
401
|
+
txBuilder.sender(testData.sender.address);
|
|
402
|
+
txBuilder.stake([testData.requestAddStake]);
|
|
403
|
+
txBuilder.gasData(testData.gasData);
|
|
404
|
+
await txBuilder.build().should.rejectedWith('type is required before building');
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
it('should fail to build if missing sender', async function () {
|
|
408
|
+
for (const txBuilder of builders) {
|
|
409
|
+
txBuilder.type(iface_1.SuiTransactionType.AddStake);
|
|
410
|
+
txBuilder.stake([testData.requestAddStake]);
|
|
411
|
+
txBuilder.gasData(testData.gasData);
|
|
412
|
+
await txBuilder.build().should.rejectedWith('sender is required before building');
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
it('should fail to build if missing gasData', async function () {
|
|
416
|
+
for (const txBuilder of builders) {
|
|
417
|
+
txBuilder.sender(testData.sender.address);
|
|
418
|
+
txBuilder.type(iface_1.SuiTransactionType.AddStake);
|
|
419
|
+
txBuilder.stake([testData.requestAddStake]);
|
|
420
|
+
await txBuilder.build().should.rejectedWith('gasData is required before building');
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
it('should fail to build if missing payment coins in gasData', async function () {
|
|
424
|
+
for (const txBuilder of builders) {
|
|
425
|
+
txBuilder.sender(testData.sender.address);
|
|
426
|
+
txBuilder.type(iface_1.SuiTransactionType.AddStake);
|
|
427
|
+
txBuilder.stake([testData.requestAddStake]);
|
|
428
|
+
(0, should_1.default)(() => txBuilder.gasData(testData.gasDataWithoutGasPayment)).throwError(`gas payment is required before building`);
|
|
429
|
+
await txBuilder.build().should.rejectedWith('gasData is required before building');
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
it('should build a send from rawTx', async function () {
|
|
433
|
+
const txBuilder = factory.from(testData.ADD_STAKE);
|
|
434
|
+
const builtTx = await txBuilder.build();
|
|
435
|
+
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.StakingAdd);
|
|
436
|
+
should_1.default.equal(builtTx.id, 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh');
|
|
437
|
+
builtTx.inputs.length.should.equal(1);
|
|
438
|
+
builtTx.inputs[0].should.deepEqual({
|
|
439
|
+
address: testData.sender.address,
|
|
440
|
+
value: sui_1.STAKING_AMOUNT.toString(),
|
|
441
|
+
coin: 'tsui',
|
|
442
|
+
});
|
|
443
|
+
builtTx.outputs.length.should.equal(1);
|
|
444
|
+
builtTx.outputs[0].should.deepEqual({
|
|
445
|
+
address: testData.requestAddStake.validatorAddress,
|
|
446
|
+
value: sui_1.STAKING_AMOUNT.toString(),
|
|
447
|
+
coin: 'tsui',
|
|
448
|
+
});
|
|
449
|
+
const jsonTx = builtTx.toJson();
|
|
450
|
+
jsonTx.gasData.should.deepEqual(testData.gasData);
|
|
451
|
+
jsonTx.kind.ProgrammableTransaction.should.deepEqual({
|
|
452
|
+
inputs: testData.txInputsAddStake,
|
|
453
|
+
transactions: testData.txTransactionsAddStake,
|
|
454
|
+
});
|
|
455
|
+
jsonTx.sender.should.equal(testData.sender.address);
|
|
456
|
+
jsonTx.gasData.should.deepEqual(testData.gasData);
|
|
457
|
+
builtTx.toBroadcastFormat().should.equal(testData.ADD_STAKE);
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
describe('Unstaking TX', async () => {
|
|
461
|
+
beforeEach(function (done) {
|
|
462
|
+
builders = [factory.getUnstakingBuilder()];
|
|
463
|
+
done();
|
|
464
|
+
});
|
|
465
|
+
it('should build an unstaking transaction and serialize it and deserialize it', async function () {
|
|
466
|
+
const txBuilder = factory.getUnstakingBuilder();
|
|
467
|
+
txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
|
|
468
|
+
txBuilder.sender(testData.sender.address);
|
|
469
|
+
txBuilder.unstake(testData.requestWithdrawStakedSui);
|
|
470
|
+
txBuilder.gasData(testData.gasData);
|
|
471
|
+
const tx = await txBuilder.build();
|
|
472
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingClaim);
|
|
473
|
+
const rawTx = tx.toBroadcastFormat();
|
|
474
|
+
should_1.default.equal(rawTx, testData.WITHDRAW_STAKED_SUI);
|
|
475
|
+
const reserialized = await factory.from(rawTx).build();
|
|
476
|
+
reserialized.toBroadcastFormat().should.equal(rawTx);
|
|
477
|
+
});
|
|
478
|
+
it('should build and sign a staking tx with gasPayment', async function () {
|
|
479
|
+
const txBuilder = factory.getUnstakingBuilder();
|
|
480
|
+
txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
|
|
481
|
+
txBuilder.sender(testData.sender.address);
|
|
482
|
+
txBuilder.unstake(testData.requestWithdrawStakedSui);
|
|
483
|
+
txBuilder.gasData(testData.gasData);
|
|
484
|
+
const tx = await txBuilder.build();
|
|
485
|
+
should_1.default.equal(tx.id, 'Rixz9C2yQ6jDFFsovUs84Y6yw2dco8HH4QhK7RCQYNo');
|
|
486
|
+
const rawTx = tx.toBroadcastFormat();
|
|
487
|
+
should_1.default.equal(rawTx, testData.WITHDRAW_STAKED_SUI);
|
|
488
|
+
const txBuilder2 = await factory.from(rawTx);
|
|
489
|
+
await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
490
|
+
const signedTx = await txBuilder2.build();
|
|
491
|
+
should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.StakingClaim);
|
|
492
|
+
should_1.default.equal(signedTx.id, 'Rixz9C2yQ6jDFFsovUs84Y6yw2dco8HH4QhK7RCQYNo');
|
|
493
|
+
const rawSignedTx = signedTx.toBroadcastFormat();
|
|
494
|
+
should_1.default.equal(rawSignedTx, testData.WITHDRAW_STAKED_SUI);
|
|
495
|
+
const reserializedTxBuilder = factory.from(rawSignedTx);
|
|
496
|
+
reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
497
|
+
const reserialized = await reserializedTxBuilder.build();
|
|
498
|
+
reserialized.should.be.deepEqual(signedTx);
|
|
499
|
+
reserialized.toBroadcastFormat().should.equal(rawSignedTx);
|
|
500
|
+
});
|
|
501
|
+
it('should build and sign a staking transaction with private keys', async () => {
|
|
502
|
+
const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
|
|
503
|
+
const senderAddress = keyPairSender.getAddress();
|
|
504
|
+
const expectedStakingTxSig = 'ABqwaOIsxZjf/LIE985SJK2lH56oNxIuHVpZhN+6L9uZFYFuipa6zsg5fnprxuBPIUVTorw3yEJcoKNGZwOpQgKlzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
|
|
505
|
+
const expectedStakingTxHex = 'AAACAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQEAAAAAAAAAAQEA7m38PaMuIVQaKurfzSUPigoju3q9qciYhAf8MgaMN0ZhBAAAAAAAACDJYCWUFis6HawzxGyErvRT03pYayRliLki0kYsV0XCBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKc3VpX3N5c3RlbRZyZXF1ZXN0X3dpdGhkcmF3X3N0YWtlAAIBAAABAQCQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
|
|
506
|
+
const coins = [
|
|
507
|
+
{
|
|
508
|
+
digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
|
|
509
|
+
objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
|
|
510
|
+
version: 1126,
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
|
|
514
|
+
objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
|
|
515
|
+
version: 1126,
|
|
516
|
+
},
|
|
517
|
+
];
|
|
518
|
+
const txBuilder_1 = factory.getUnstakingBuilder();
|
|
519
|
+
txBuilder_1.type(iface_1.SuiTransactionType.WithdrawStake);
|
|
520
|
+
txBuilder_1.sender(senderAddress);
|
|
521
|
+
txBuilder_1.unstake(testData.requestWithdrawStakedSui);
|
|
522
|
+
const gasData = {
|
|
523
|
+
payment: coins,
|
|
524
|
+
owner: senderAddress,
|
|
525
|
+
budget: testData.GAS_BUDGET,
|
|
526
|
+
price: 1000,
|
|
527
|
+
};
|
|
528
|
+
txBuilder_1.gasData(gasData);
|
|
529
|
+
const tx_1 = await txBuilder_1.build();
|
|
530
|
+
const signable_1 = tx_1.signablePayload;
|
|
531
|
+
const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
|
|
532
|
+
txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
|
|
533
|
+
const signedTx_1 = (await txBuilder_1.build());
|
|
534
|
+
const txHex_1 = signedTx_1.toBroadcastFormat();
|
|
535
|
+
const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
|
|
536
|
+
const txBuilderFromRaw_2 = factory.getUnstakingBuilder();
|
|
537
|
+
txBuilderFromRaw_2.from(txHex_1);
|
|
538
|
+
const signable_2 = tx_1.signablePayload;
|
|
539
|
+
txBuilderFromRaw_2.sign({ key: testData.privateKeys.prvKey1 });
|
|
540
|
+
const signedTx_2 = (await txBuilderFromRaw_2.build());
|
|
541
|
+
const txHex_2 = signedTx_2.toBroadcastFormat();
|
|
542
|
+
const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
|
|
543
|
+
should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
|
|
544
|
+
should_1.default.equal(txHex_1, txHex_2);
|
|
545
|
+
should_1.default.equal(txHex_1, expectedStakingTxHex);
|
|
546
|
+
should_1.default.equal(txHex_2, expectedStakingTxHex);
|
|
547
|
+
should_1.default.equal(sig_1, sig_2);
|
|
548
|
+
should_1.default.equal(sig_1, expectedStakingTxSig);
|
|
549
|
+
should_1.default.equal(sig_2, expectedStakingTxSig);
|
|
550
|
+
});
|
|
551
|
+
it('should fail to build if missing type', async function () {
|
|
552
|
+
for (const txBuilder of builders) {
|
|
553
|
+
txBuilder.sender(testData.sender.address);
|
|
554
|
+
txBuilder.unstake(testData.requestWithdrawStakedSui);
|
|
555
|
+
txBuilder.gasData(testData.gasData);
|
|
556
|
+
await txBuilder.build().should.rejectedWith('type is required before building');
|
|
557
|
+
}
|
|
558
|
+
});
|
|
559
|
+
it('should fail to build if missing sender', async function () {
|
|
560
|
+
for (const txBuilder of builders) {
|
|
561
|
+
txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
|
|
562
|
+
txBuilder.unstake(testData.requestWithdrawStakedSui);
|
|
563
|
+
txBuilder.gasData(testData.gasData);
|
|
564
|
+
await txBuilder.build().should.rejectedWith('sender is required before building');
|
|
565
|
+
}
|
|
566
|
+
});
|
|
567
|
+
it('should fail to build if missing gasData', async function () {
|
|
568
|
+
for (const txBuilder of builders) {
|
|
569
|
+
txBuilder.sender(testData.sender.address);
|
|
570
|
+
txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
|
|
571
|
+
txBuilder.unstake(testData.requestWithdrawStakedSui);
|
|
572
|
+
await txBuilder.build().should.rejectedWith('gasData is required before building');
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
it('should fail to build if missing payment coins in gasData', async function () {
|
|
576
|
+
for (const txBuilder of builders) {
|
|
577
|
+
txBuilder.sender(testData.sender.address);
|
|
578
|
+
txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
|
|
579
|
+
txBuilder.unstake(testData.requestWithdrawStakedSui);
|
|
580
|
+
(0, should_1.default)(() => txBuilder.gasData(testData.gasDataWithoutGasPayment)).throwError(`gas payment is required before building`);
|
|
581
|
+
await txBuilder.build().should.rejectedWith('gasData is required before building');
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
it('should build a send from rawTx', async function () {
|
|
585
|
+
const txBuilder = factory.from(testData.WITHDRAW_STAKED_SUI);
|
|
586
|
+
const builtTx = await txBuilder.build();
|
|
587
|
+
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.StakingClaim);
|
|
588
|
+
should_1.default.equal(builtTx.id, 'Rixz9C2yQ6jDFFsovUs84Y6yw2dco8HH4QhK7RCQYNo');
|
|
589
|
+
builtTx.inputs.length.should.equal(1);
|
|
590
|
+
builtTx.inputs[0].should.deepEqual({
|
|
591
|
+
address: testData.requestWithdrawStakedSui.stakedSui.objectId,
|
|
592
|
+
value: constants_1.AMOUNT_UNKNOWN_TEXT,
|
|
593
|
+
coin: 'tsui',
|
|
594
|
+
});
|
|
595
|
+
builtTx.outputs.length.should.equal(1);
|
|
596
|
+
builtTx.outputs[0].should.deepEqual({
|
|
597
|
+
address: testData.sender.address,
|
|
598
|
+
value: constants_1.AMOUNT_UNKNOWN_TEXT,
|
|
599
|
+
coin: 'tsui',
|
|
600
|
+
});
|
|
601
|
+
const jsonTx = builtTx.toJson();
|
|
602
|
+
jsonTx.gasData.should.deepEqual(testData.gasData);
|
|
603
|
+
jsonTx.kind.ProgrammableTransaction.should.deepEqual({
|
|
604
|
+
inputs: testData.txInputWithdrawStaked,
|
|
605
|
+
transactions: testData.txTransactionsWithdrawStaked,
|
|
606
|
+
});
|
|
607
|
+
jsonTx.sender.should.equal(testData.sender.address);
|
|
608
|
+
jsonTx.gasData.should.deepEqual(testData.gasData);
|
|
609
|
+
builtTx.toBroadcastFormat().should.equal(testData.WITHDRAW_STAKED_SUI);
|
|
610
|
+
});
|
|
611
|
+
it('should determine correct type for withdrawal with amount', async function () {
|
|
612
|
+
const txBuilder = factory.from(testData.WITHDRAW_STAKED_SUI_WITH_AMOUNT);
|
|
613
|
+
const tx = await txBuilder.build();
|
|
614
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingClaim);
|
|
615
|
+
});
|
|
616
|
+
});
|
|
617
|
+
describe('Custom TX', async () => {
|
|
618
|
+
it('should sign a custom tx', async function () {
|
|
619
|
+
const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
|
|
620
|
+
const txBuilder = factory.from(sui_1.CUSTOM_TX_STAKING_POOL_SPLIT);
|
|
621
|
+
const tx = await txBuilder.build();
|
|
622
|
+
const unsignedTxHex = tx.toBroadcastFormat();
|
|
623
|
+
const signable = tx.signablePayload;
|
|
624
|
+
const signatureBytes = keyPairSender.signMessageinUint8Array(signable);
|
|
625
|
+
txBuilder.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signatureBytes));
|
|
626
|
+
const signedTx = (await txBuilder.build());
|
|
627
|
+
const signedTxHex = signedTx.toBroadcastFormat();
|
|
628
|
+
should_1.default.equal(signedTxHex, unsignedTxHex);
|
|
629
|
+
should_1.default.equal(signedTx.signature.length, 1);
|
|
630
|
+
should_1.default.equal(signedTx.signature[0], Buffer.from(signatureBytes).toString('hex'));
|
|
631
|
+
const serializedSig = Buffer.from(signedTx.serializedSig).toString('base64');
|
|
632
|
+
should_1.default.equal(serializedSig, 'APGQHoYbVSyL6M7lOQL5w2YYzeeVcTMEbe0Y4jVphQA+0QHq3VEDoXVwIukkL44z+vqsekviS4gQ0ZwUPTWHFQilzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==');
|
|
633
|
+
});
|
|
634
|
+
it('should fail to build if unsupported txn type', async function () {
|
|
635
|
+
(0, should_1.default)(() => factory.from(sui_1.UNSUPPORTED_TX)).throwError('unsupported target method 0000000000000000000000000000000000000000000000000000000000000003::staking_pool::split_staked_sui');
|
|
636
|
+
});
|
|
637
|
+
});
|
|
638
|
+
});
|
|
639
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0REFBeUQ7QUFDekQsOERBQWdEO0FBQ2hELG9EQUE0QjtBQUM1Qiw4Q0FBa0Q7QUFDbEQsa0RBQTREO0FBQzVELDZDQUErRztBQUMvRyxzREFBbUQ7QUFJbkQsMERBQWlFO0FBR2pFLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLElBQUksRUFBRTtJQUM3QyxJQUFJLFFBQVEsQ0FBQztJQUNiLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNqQyxVQUFVLENBQUMsVUFBVSxJQUFJO1lBQ3ZCLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDMUMsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5RUFBeUUsRUFBRSxLQUFLO1lBQ2pGLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQVUsQ0FBQyxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFD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QUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUVqRixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0UsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsYUFBYSxFQUNiLHNJQUFzSSxDQUN2SSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUUsS0FBSztZQUN0RCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBYyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQ25ELDRIQUE0SCxDQUM3SCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc3VpJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBTdWlUcmFuc2FjdGlvblR5cGUgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCB7IENVU1RPTV9UWF9TVEFLSU5HX1BPT0xfU1BMSVQsIHJlY2lwaWVudHMsIFNUQUtJTkdfQU1PVU5ULCBVTlNVUFBPUlRFRF9UWCB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9zdWknO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIva2V5UGFpcic7XG5pbXBvcnQgeyBHYXNEYXRhIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9teXN0ZW5sYWIvdHlwZXMnO1xuaW1wb3J0IHsgU3Rha2luZ1RyYW5zYWN0aW9uLCBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IFVuc3Rha2luZ1RyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91bnN0YWtpbmdUcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBBTU9VTlRfVU5LTk9XTl9URVhUIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ3VzdG9tVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2N1c3RvbVRyYW5zYWN0aW9uJztcblxuZGVzY3JpYmUoJ1N1aSBUcmFuc2FjdGlvbiBCdWlsZGVyJywgYXN5bmMgKCkgPT4ge1xuICBsZXQgYnVpbGRlcnM7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHN1aScpO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2ZlciBUWCcsIGFzeW5jICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICBidWlsZGVycyA9IFtmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpXTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBhbmQgc2VyaWFsaXplIGl0IGFuZCBkZXNlcmlhbGl6ZSBpdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZChyZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlRSQU5TRkVSKTtcbiAgICAgIGNvbnN0IHJlc2VyaWFsaXplZCA9IGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKTtcbiAgICAgIHJlc2VyaWFsaXplZC5zaG91bGQuYmUuZGVlcEVxdWFsKHR4KTtcbiAgICAgIHJlc2VyaWFsaXplZC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzaWduIGEgdHJhbnNmZXIgdHggd2l0aCBnYXNQYXltZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlkLCAnVU5BVkFJTEFCTEUnKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuVFJBTlNGRVIpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlcjIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5pZCwgJ0J4b2VHWGJCQ3V3NlZGRWNnd0hIVUFLckNvQXNHYW5QQjM5a2RWVktaWmNSJyk7XG5cbiAgICAgIGNvbnN0IHJhd1NpZ25lZFR4ID0gc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdTaWduZWRUeCwgdGVzdERhdGEuVFJBTlNGRVIpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkVHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1NpZ25lZFR4KTtcbiAgICAgIHJlc2VyaWFsaXplZFR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkID0gYXdhaXQgcmVzZXJpYWxpemVkVHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHJlc2VyaWFsaXplZC5zaG91bGQuYmUuZGVlcEVxdWFsKHNpZ25lZFR4KTtcbiAgICAgIHJlc2VyaWFsaXplZC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdTaWduZWRUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzaWduIGEgdHJhbnNmZXIgdHggd2l0aCBnYXNQYXltZW50IGFzIGRpZmZlcmVudCBvd25lcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZChyZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGFIYXZpbmdEaWZmZXJlbnRPd25lcik7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlkLCAnVU5BVkFJTEFCTEUnKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuRkVFX1NQT05TT1JfVFJBTlNGRVIpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlcjIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlcjIuYWRkRmVlUGF5ZXJTaWduYXR1cmUoXG4gICAgICAgIHsgcHViOiB0ZXN0RGF0YS5mZWVQYXllci5wdWJsaWNLZXkgfSxcbiAgICAgICAgQnVmZmVyLmZyb20odGVzdERhdGEuZmVlUGF5ZXIuc2lnbmF0dXJlSGV4KVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5pZCwgJ0NvNWQ2dGlMUXV3VVByZlBwN3ZmbWNKTU5LNWdXWjNTdEZSNmN2enE2UjEyJyk7XG5cbiAgICAgIGNvbnN0IHJhd1NpZ25lZFR4ID0gc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdTaWduZWRUeCwgdGVzdERhdGEuRkVFX1NQT05TT1JfVFJBTlNGRVIpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkVHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1NpZ25lZFR4KTtcbiAgICAgIHJlc2VyaWFsaXplZFR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgcmVzZXJpYWxpemVkVHhCdWlsZGVyLmFkZEZlZVBheWVyU2lnbmF0dXJlKFxuICAgICAgICB7IHB1YjogdGVzdERhdGEuZmVlUGF5ZXIucHVibGljS2V5IH0sXG4gICAgICAgIEJ1ZmZlci5mcm9tKHRlc3REYXRhLmZlZVBheWVyLnNpZ25hdHVyZUhleClcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWQgPSBhd2FpdCByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgcmVzZXJpYWxpemVkLnNob3VsZC5iZS5kZWVwRXF1YWwoc2lnbmVkVHgpO1xuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VibWl0IGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBwcml2YXRlIGtleXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyU2VuZGVyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTEgfSk7XG4gICAgICBjb25zdCBrZXlQYWlyUmVjaXBpZW50ID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTIgfSk7XG4gICAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0ga2V5UGFpclNlbmRlci5nZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCByZWNlaXZlQWRkcmVzcyA9IGtleVBhaXJSZWNpcGllbnQuZ2V0QWRkcmVzcygpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnID1cbiAgICAgICAgJ0FJOFE5S0lOcVNDT2VIdmh2Nk1KNlZmM1RXYlRjeGhwY2xnMFBEOWdCZ2FuZDJrTFFaeEVKUy9ISkFTZ2FuTEtmWjI3N0lsNG1BaWZLSHp2dGIyZkNBK2x6YXExajR3TXVDaVh1Rlc0b2pGZnVvQmhFaUJ5L0s0ZUI1QmtIWitlWnc9PSc7XG4gICAgICBjb25zdCBleHBlY3RlZFRyYW5zZmVyVHhIZXggPVxuICAgICAgICAnQUFBQ0FBZ0E0ZlVGQUFBQUFBQWd0ZXYrbm5jRGZUdG93SlpFUEhVTXNKWGlhNHdLbVQvWHBndHJ6c3k2TzM4Q0FnQUJBUUFBQVFFQ0FBQUJBUUNRQjBLN2tqNnBCcVZ2TWxvWFdYZFM3Tk9zTUNhN3FXNE8zL1JkNk5zenF3SjNBYmlJd1dNNW1zMWJnRVl6d2REbE1yd3hROC92Tk1vMkMrWUh4bzNONzJZRUFBQUFBQUFBSURyTWNFT1RpZGpPZHA3YTFKL2pqSjl0T2piNlAyV1R5QlN3UXFBSGlBMS95ZlZsYStjWUl3RTlrMzRHVk9zKzNMSmhsYS9TTUFtK21ybHVmejh0d2dObUJBQUFBQUFBQUNBaFhua1hvYlMyRS9SWi9jTERRL24zQkgvVHhBakt2NVZ4c2JMRVpDVXh1NUFIUXJ1U1Bxa0dwVzh5V2hkWmQxTHMwNnd3SnJ1cGJnN2Y5RjNvMnpPcjZBTUFBQUFBQUFBQUxURUJBQUFBQUFBPSc7XG5cbiAgICAgIGNvbnN0IGNvaW5zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgZGlnZXN0OiAnNHhYVEdoaHROVWpCVThuTWl2c0xXVE1SV3ZaUmM1UldETWd5VE1ublJEWVMnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg3NzAxYjg4OGMxNjMzOTlhY2Q1YjgwNDYzM2MxZDBlNTMyYmMzMTQzY2ZlZjM0Y2EzNjBiZTYwN2M2OGRjZGVmJyxcbiAgICAgICAgICB2ZXJzaW9uOiAxMTI2LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGlnZXN0OiAnM0ZHMU5mazVIclExdFdZS1M4Qlg5eW5aVFNwckw1aExuM3BndzdrZGoxUlUnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHhjOWY1NjU2YmU3MTgyMzAxM2Q5MzdlMDY1NGViM2VkY2IyNjE5NWFmZDIzMDA5YmU5YWI5NmU3ZjNmMmRjMjAzJyxcbiAgICAgICAgICB2ZXJzaW9uOiAxMTI2LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcl8xID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlcl8xLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlcl8xLnNlbmRlcihzZW5kZXJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlcl8xLnNlbmQoW3sgYWRkcmVzczogcmVjZWl2ZUFkZHJlc3MsIGFtb3VudDogJzEwMDAwMDAwMCcgfV0pO1xuICAgICAgY29uc3QgZ2FzRGF0YTogR2FzRGF0YSA9IHtcbiAgICAgICAgcGF5bWVudDogY29pbnMsXG4gICAgICAgIG93bmVyOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBidWRnZXQ6IHRlc3REYXRhLkdBU19CVURHRVQsXG4gICAgICAgIHByaWNlOiAxMDAwLFxuICAgICAgfTtcbiAgICAgIHR4QnVpbGRlcl8xLmdhc0RhdGEoZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4XzEgPSBhd2FpdCB0eEJ1aWxkZXJfMS5idWlsZCgpO1xuICAgICAgY29uc3Qgc2lnbmFibGVfMSA9IHR4XzEuc2lnbmFibGVQYXlsb2FkO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlXzEgPSBrZXlQYWlyU2VuZGVyLnNpZ25NZXNzYWdlaW5VaW50OEFycmF5KHNpZ25hYmxlXzEpO1xuICAgICAgdHhCdWlsZGVyXzEuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyU2VuZGVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlXzEpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzEgPSAoYXdhaXQgdHhCdWlsZGVyXzEuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SGV4XzEgPSBzaWduZWRUeF8xLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBzaWdfMSA9IEJ1ZmZlci5mcm9tKHNpZ25lZFR4XzEuc2VyaWFsaXplZFNpZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXJGcm9tUmF3XzIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyRnJvbVJhd18yLmZyb20odHhIZXhfMSk7XG4gICAgICBjb25zdCBzaWduYWJsZV8yID0gdHhfMS5zaWduYWJsZVBheWxvYWQ7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzIgPSAoYXdhaXQgdHhCdWlsZGVyRnJvbVJhd18yLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEhleF8yID0gc2lnbmVkVHhfMi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3Qgc2lnXzIgPSBCdWZmZXIuZnJvbShzaWduZWRUeF8yLnNlcmlhbGl6ZWRTaWcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hYmxlXzEpLnRvU3RyaW5nKCdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmFibGVfMikudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCB0eEhleF8yKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCBleHBlY3RlZFRyYW5zZmVyVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzIsIGV4cGVjdGVkVHJhbnNmZXJUeEhleCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnXzEsIHNpZ18yKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMSwgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMiwgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VibWl0IGEgc2xpdCBjb2luIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXlzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpclNlbmRlciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxIH0pO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IGtleVBhaXJTZW5kZXIuZ2V0QWRkcmVzcygpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnID1cbiAgICAgICAgJ0FHR1dIWnV5VWpzeE1oTW9Qb3Fkc1pSVEM1MGE4bUJ5RGh1cHdFMFdyRGx2dnF6d2FSTzdSNXNZMjAvSVlnYWJVQTlmZXAzbzM1c3NuUmhVWjBqRHF3bWx6YXExajR3TXVDaVh1Rlc0b2pGZnVvQmhFaUJ5L0s0ZUI1QmtIWitlWnc9PSc7XG4gICAgICBjb25zdCBleHBlY3RlZFRyYW5zZmVyVHhIZXggPVxuICAgICAgICAnQUFBVkFBZ0E0ZlVGQUFBQUFBQWdrQWRDdTVJK3FRYWxiekphRjFsM1V1elRyREFtdTZsdUR0LzBYZWpiTTZzQUNBRGg5UVVBQUFBQUFBZ0E0ZlVGQUFBQUFBQUlBT0gxQlFBQUFBQUFDQURoOVFVQUFBQUFBQWdBNGZVRkFBQUFBQUFJQU9IMUJRQUFBQUFBQ0FEaDlRVUFBQUFBQUFnQTRmVUZBQUFBQUFBSUFPSDFCUUFBQUFBQUNBRGg5UVVBQUFBQUFBZ0E0ZlVGQUFBQUFBQUlBT0gxQlFBQUFBQUFDQURoOVFVQUFBQUFBQWdBNGZVRkFBQUFBQUFJQU9IMUJRQUFBQUFBQ0FEaDlRVUFBQUFBQUFnQTRmVUZBQUFBQUFBSUFPSDFCUUFBQUFBQUNBRGg5UVVBQUFBQUtBSUFBUUVBQUFFQkFnQUFBUUVBQWdBQkFRSUFBUUVDQWdBQkFRQUNBQUVCQXdBQkFRSUVBQUVCQUFJQUFRRUVBQUVCQWdZQUFRRUFBZ0FCQVFVQUFRRUNDQUFCQVFBQ0FBRUJCZ0FCQVFJS0FBRUJBQUlBQVFFSEFBRUJBZ3dBQVFFQUFnQUJBUWdBQVFFQ0RnQUJBUUFDQUFFQkNRQUJBUUlRQUFFQkFBSUFBUUVLQUFFQkFoSUFBUUVBQWdBQkFRc0FBUUVDRkFBQkFRQUNBQUVCREFBQkFRSVdBQUVCQUFJQUFRRU5BQUVCQWhnQUFRRUFBZ0FCQVE0QUFRRUNHZ0FCQVFBQ0FBRUJEd0FCQVFJY0FBRUJBQUlBQVFFUUFBRUJBaDRBQVFFQUFnQUJBUkVBQVFFQ0lBQUJBUUFDQUFFQkVnQUJBUUlpQUFFQkFBSUFBUUVUQUFFQkFpUUFBUUVBQWdBQkFSUUFBUUVDSmdBQkFRQ1FCMEs3a2o2cEJxVnZNbG9YV1hkUzdOT3NNQ2E3cVc0TzMvUmQ2TnN6cXdKM0FiaUl3V001bXMxYmdFWXp3ZERsTXJ3eFE4L3ZOTW8yQytZSHhvM043MllFQUFBQUFBQUFJRHJNY0VPVGlkak9kcDdhMUovampKOXRPamI2UDJXVHlCU3dRcUFIaUExL3lmVmxhK2NZSXdFOWszNEdWT3MrM0xKaGxhL1NNQW0rbXJsdWZ6OHR3Z05tQkFBQUFBQUFBQ0FoWG5rWG9iUzJFL1JaL2NMRFEvbjNCSC9UeEFqS3Y1VnhzYkxFWkNVeHU1QUhRcnVTUHFrR3BXOHlXaGRaZDFMczA2d3dKcnVwYmc3ZjlGM28yek9yNkFNQUFBQUFBQUFBTFRFQkFBQUFBQUE9JztcblxuICAgICAgY29uc3QgY29pbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICc0eFhUR2hodE5VakJVOG5NaXZzTFdUTVJXdlpSYzVSV0RNZ3lUTW5uUkRZUycsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDc3MDFiODg4YzE2MzM5OWFjZDViODA0NjMzYzFkMGU1MzJiYzMxNDNjZmVmMzRjYTM2MGJlNjA3YzY4ZGNkZWYnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICczRkcxTmZrNUhyUTF0V1lLUzhCWDl5blpUU3ByTDVoTG4zcGd3N2tkajFSVScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweGM5ZjU2NTZiZTcxODIzMDEzZDkzN2UwNjU0ZWIzZWRjYjI2MTk1YWZkMjMwMDliZTlhYjk2ZTdmM2YyZGMyMDMnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgdHhCdWlsZGVyXzEgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyXzEudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyXzEuc2VuZGVyKHNlbmRlckFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyXzEuc2VuZChBcnJheSgyMCkuZmlsbCh7IGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsIGFtb3VudDogJzEwMDAwMDAwMCcgfSkpO1xuICAgICAgY29uc3QgZ2FzRGF0YTogR2FzRGF0YSA9IHtcbiAgICAgICAgcGF5bWVudDogY29pbnMsXG4gICAgICAgIG93bmVyOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBidWRnZXQ6IHRlc3REYXRhLkdBU19CVURHRVQsXG4gICAgICAgIHByaWNlOiAxMDAwLFxuICAgICAgfTtcbiAgICAgIHR4QnVpbGRlcl8xLmdhc0RhdGEoZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4XzEgPSBhd2FpdCB0eEJ1aWxkZXJfMS5idWlsZCgpO1xuICAgICAgY29uc3Qgc2lnbmFibGVfMSA9IHR4XzEuc2lnbmFibGVQYXlsb2FkO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlXzEgPSBrZXlQYWlyU2VuZGVyLnNpZ25NZXNzYWdlaW5VaW50OEFycmF5KHNpZ25hYmxlXzEpO1xuICAgICAgdHhCdWlsZGVyXzEuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyU2VuZGVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlXzEpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzEgPSAoYXdhaXQgdHhCdWlsZGVyXzEuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SGV4XzEgPSBzaWduZWRUeF8xLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBzaWdfMSA9IEJ1ZmZlci5mcm9tKHNpZ25lZFR4XzEuc2VyaWFsaXplZFNpZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXJGcm9tUmF3XzIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyRnJvbVJhd18yLmZyb20odHhIZXhfMSk7XG4gICAgICBjb25zdCBzaWduYWJsZV8yID0gdHhfMS5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBjb25zdCBzaWduYXR1cmVfMiA9IGtleVBhaXJTZW5kZXIuc2lnbk1lc3NhZ2VpblVpbnQ4QXJyYXkoc2lnbmFibGVfMik7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyU2VuZGVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlXzIpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzIgPSAoYXdhaXQgdHhCdWlsZGVyRnJvbVJhd18yLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEhleF8yID0gc2lnbmVkVHhfMi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3Qgc2lnXzIgPSBCdWZmZXIuZnJvbShzaWduZWRUeF8yLnNlcmlhbGl6ZWRTaWcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hYmxlXzEpLnRvU3RyaW5nKCdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmFibGVfMikudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCB0eEhleF8yKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCBleHBlY3RlZFRyYW5zZmVyVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzIsIGV4cGVjdGVkVHJhbnNmZXJUeEhleCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnXzEsIHNpZ18yKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMSwgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMiwgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmQocmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCd0eXBlIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3Npbmcgc2VuZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmQocmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdzZW5kZXIgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdhdCBsZWFzdCBvbmUgcmVjaXBpZW50IGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgZ2FzRGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZChyZWNpcGllbnRzKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnZ2FzRGF0YSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHBheW1lbnQgY29pbnMgaW4gZ2FzRGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZChyZWNpcGllbnRzKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGFXaXRob3V0R2FzUGF5bWVudCkpLnRocm93RXJyb3IoXG4gICAgICAgICAgYGdhcyBwYXltZW50IGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZ2BcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnZ2FzRGF0YSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzZW5kIGZyb20gcmF3VHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuVFJBTlNGRVIpO1xuICAgICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHguaWQsICdCeG9lR1hiQkN1dzZWRkVjZ3dISFVBS3JDb0FzR2FuUEIzOWtkVlZLWlpjUicpO1xuICAgICAgYnVpbHRUeC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGJ1aWx0VHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6ICh0ZXN0RGF0YS5BTU9VTlQgKiAyKS50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIGJ1aWx0VHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgYnVpbHRUeC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfSk7XG4gICAgICBidWlsdFR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYW1vdW50LFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGpzb25UeCA9IGJ1aWx0VHgudG9Kc29uKCk7XG4gICAgICBqc29uVHguZ2FzRGF0YS5zaG91bGQuZGVlcEVxdWFsKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAganNvblR4LmtpbmQuUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGlucHV0czogdGVzdERhdGEudHhJbnB1dHMsXG4gICAgICAgIHRyYW5zYWN0aW9uczogdGVzdERhdGEudHhUcmFuc2FjdGlvbnMsXG4gICAgICB9KTtcbiAgICAgIGpzb25UeC5zZW5kZXIuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGpzb25UeC5nYXNEYXRhLnNob3VsZC5kZWVwRXF1YWwodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHRlc3REYXRhLlRSQU5TRkVSKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdTdGFraW5nIFRYJywgYXN5bmMgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGJ1aWxkZXJzID0gW2ZhY3RvcnkuZ2V0U3Rha2luZ0J1aWxkZXIoKV07XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuIGFkZCBzdGFraW5nIHRyYW5zYWN0aW9uIGFuZCBzZXJpYWxpemUgaXQgYW5kIGRlc2VyaWFsaXplIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2VdKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FkZCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFERF9TVEFLRSk7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWQgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCk7XG4gICAgICByZXNlcmlhbGl6ZWQudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbiBzdGFrZU1hbnkgdHJhbnNhY3Rpb24gYW5kIHNlcmlhbGl6ZSBpdCBhbmQgZGVzZXJpYWxpemUgaXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2UodGVzdERhdGEucmVxdWVzdEFkZFN0YWtlTWFueSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBZGQpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5TVEFLRV9NQU5ZKTtcbiAgICAgIGNvbnN0IHJlc2VyaWFsaXplZCA9IGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKTtcbiAgICAgIC8vIHJlc2VyaWFsaXplZC5zaG91bGQuYmUuZGVlcEVxdWFsKHR4KTtcbiAgICAgIHJlc2VyaWFsaXplZC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzaWduIGEgc3Rha2luZyB0eCB3aXRoIGdhc1BheW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlkLCAnYlA3OGJvWjQ4c0RkSnNnMlYxdEphaHBHeUJ3YUM5R1NUTDJydnlBRG5zaCcpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BRERfU1RBS0UpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlcjIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5pZCwgJ2JQNzhib1o0OHNEZEpzZzJWMXRKYWhwR3lCd2FDOUdTVEwycnZ5QURuc2gnKTtcblxuICAgICAgY29uc3QgcmF3U2lnbmVkVHggPSBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4LCB0ZXN0RGF0YS5BRERfU1RBS0UpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkVHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1NpZ25lZFR4KTtcbiAgICAgIHJlc2VyaWFsaXplZFR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkID0gYXdhaXQgcmVzZXJpYWxpemVkVHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHJlc2VyaWFsaXplZC5zaG91bGQuYmUuZGVlcEVxdWFsKHNpZ25lZFR4KTtcbiAgICAgIHJlc2VyaWFsaXplZC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdTaWduZWRUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzaWduIGEgc3Rha2luZyB0cmFuc2FjdGlvbiB3aXRoIHByaXZhdGUga2V5cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXJTZW5kZXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcbiAgICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBrZXlQYWlyU2VuZGVyLmdldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3Rha2luZ1R4U2lnID1cbiAgICAgICAgJ0FEODc1NWUra0EzL0l5KzNvUnhCYlFpSzBJejRxbUQ0c1pjcG9RTjBVTVB4SVh2N1F4NHR3dnVBaVpmOUgybkhZYS9BZTBhc000Umt6MVNDUDBkaFhncWx6YXExajR3TXVDaVh1Rlc0b2pGZnVvQmhFaUJ5L0s0ZUI1QmtIWitlWnc9PSc7XG4gICAgICBjb25zdCBleHBlY3RlZFN0YWtpbmdUeEhleCA9XG4gICAgICAgICdBQUFKQUFnQUxURUJBQUFBQUFFQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVVCQUFBQUFBQUFBQUVBSUVTeHN4bmlOSldaWDhnMzJ2MG8vR3I0dGtYdDNmOFB3VVovR3RZeE5pd2pBQWdBckNQOEJnQUFBQUFnUkxHekdlSTBsWmxmeURmYS9TajhhdmkyUmUzZC93L0JSbjhhMWpFMkxDWUFDQUF0TVFFQUFBQUFBQ0JFc2JNWjRqU1ZtVi9JTjlyOUtQeHErTFpGN2QzL0Q4RkdmeHJXTVRZc0pnQUlBS3dqL0FZQUFBQUFJRVN4c3huaU5KV1pYOGczMnYwby9HcjR0a1h0M2Y4UHdVWi9HdFl4Tml3akNBSUFBUUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd3B6ZFdsZmMzbHpkR1Z0RVhKbGNYVmxjM1JmWVdSa1gzTjBZV3RsQUFNQkFRQUNBQUFCQWdBQ0FBRUJBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUtjM1ZwWDNONWMzUmxiUkZ5WlhGMVpYTjBYMkZrWkY5emRHRnJaUUFEQVFFQUFnSUFBUVFBQWdBQkFRVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRENuTjFhVjl6ZVhOMFpXMFJjbVZ4ZFdWemRGOWhaR1JmYzNSaGEyVUFBd0VCQUFJRUFBRUdBQUlBQVFFSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdwemRXbGZjM2x6ZEdWdEVYSmxjWFZsYzNSZllXUmtYM04wWVd0bEFBTUJBUUFDQmdBQkNBQ1FCMEs3a2o2cEJxVnZNbG9YV1hkUzdOT3NNQ2E3cVc0TzMvUmQ2TnN6cXdKM0FiaUl3V001bXMxYmdFWXp3ZERsTXJ3eFE4L3ZOTW8yQytZSHhvM043MllFQUFBQUFBQUFJRHJNY0VPVGlkak9kcDdhMUovampKOXRPamI2UDJXVHlCU3dRcUFIaUExL3lmVmxhK2NZSXdFOWszNEdWT3MrM0xKaGxhL1NNQW0rbXJsdWZ6OHR3Z05tQkFBQUFBQUFBQ0FoWG5rWG9iUzJFL1JaL2NMRFEvbjNCSC9UeEFqS3Y1VnhzYkxFWkNVeHU1QUhRcnVTUHFrR3BXOHlXaGRaZDFMczA2d3dKcnVwYmc3ZjlGM28yek9yNkFNQUFBQUFBQUFBTFRFQkFBQUFBQUE9JztcblxuICAgICAgY29uc3QgY29pbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICc0eFhUR2hodE5VakJVOG5NaXZzTFdUTVJXdlpSYzVSV0RNZ3lUTW5uUkRZUycsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDc3MDFiODg4YzE2MzM5OWFjZDViODA0NjMzYzFkMGU1MzJiYzMxNDNjZmVmMzRjYTM2MGJlNjA3YzY4ZGNkZWYnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICczRkcxTmZrNUhyUTF0V1lLUzhCWDl5blpUU3ByTDVoTG4zcGd3N2tkajFSVScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweGM5ZjU2NTZiZTcxODIzMDEzZDkzN2UwNjU0ZWIzZWRjYjI2MTk1YWZkMjMwMDliZTlhYjk2ZTdmM2YyZGMyMDMnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgdHhCdWlsZGVyXzEgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXJfMS50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZSk7XG4gICAgICB0eEJ1aWxkZXJfMS5zZW5kZXIoc2VuZGVyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXJfMS5zdGFrZSh0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2VNYW55KTtcbiAgICAgIGNvbnN0IGdhc0RhdGE6IEdhc0RhdGEgPSB7XG4gICAgICAgIHBheW1lbnQ6IGNvaW5zLFxuICAgICAgICBvd25lcjogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYnVkZ2V0OiB0ZXN0RGF0YS5HQVNfQlVER0VULFxuICAgICAgICBwcmljZTogMTAwMCxcbiAgICAgIH07XG4gICAgICB0eEJ1aWxkZXJfMS5nYXNEYXRhKGdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eF8xID0gYXdhaXQgdHhCdWlsZGVyXzEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlXzEgPSB0eF8xLnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZV8xID0ga2V5UGFpclNlbmRlci5zaWduTWVzc2FnZWluVWludDhBcnJheShzaWduYWJsZV8xKTtcbiAgICAgIHR4QnVpbGRlcl8xLmFkZFNpZ25hdHVyZSh7IHB1Yjoga2V5UGFpclNlbmRlci5nZXRLZXlzKCkucHViIH0sIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZV8xKSk7XG4gICAgICBjb25zdCBzaWduZWRUeF8xID0gKGF3YWl0IHR4QnVpbGRlcl8xLmJ1aWxkKCkpIGFzIFN0YWtpbmdUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SGV4XzEgPSBzaWduZWRUeF8xLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBzaWdfMSA9IEJ1ZmZlci5mcm9tKHNpZ25lZFR4XzEuc2VyaWFsaXplZFNpZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXJGcm9tUmF3XzIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuZnJvbSh0eEhleF8xKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlXzIgPSB0eF8xLnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIHR4QnVpbGRlckZyb21SYXdfMi5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxIH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHhfMiA9IChhd2FpdCB0eEJ1aWxkZXJGcm9tUmF3XzIuYnVpbGQoKSkgYXMgU3Rha2luZ1RyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhIZXhfMiA9IHNpZ25lZFR4XzIudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHNpZ18yID0gQnVmZmVyLmZyb20oc2lnbmVkVHhfMi5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShzaWduYWJsZV8xKS50b1N0cmluZygnaGV4JyksIEJ1ZmZlci5mcm9tKHNpZ25hYmxlXzIpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMSwgdHhIZXhfMik7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMSwgZXhwZWN0ZWRTdGFraW5nVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzIsIGV4cGVjdGVkU3Rha2luZ1R4SGV4KTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMSwgc2lnXzIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ18xLCBleHBlY3RlZFN0YWtpbmdUeFNpZyk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnXzIsIGV4cGVjdGVkU3Rha2luZ1R4U2lnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2VdKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ3R5cGUgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBzZW5kZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnc2VuZGVyIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgZ2FzRGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdnYXNEYXRhIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgcGF5bWVudCBjb2lucyBpbiBnYXNEYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZSk7XG4gICAgICAgIHR4QnVpbGRlci5zdGFrZShbdGVzdERhdGEucmVxdWVzdEFkZFN0YWtlXSk7XG4gICAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhV2l0aG91dEdhc1BheW1lbnQpKS50aHJvd0Vycm9yKFxuICAgICAgICAgIGBnYXMgcGF5bWVudCBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmdgXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ2dhc0RhdGEgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2VuZCBmcm9tIHJhd1R4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLkFERF9TVEFLRSk7XG4gICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FkZCk7XG4gICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC5pZCwgJ2JQNzhib1o0OHNEZEpzZzJWMXRKYWhwR3lCd2FDOUdTVEwycnZ5QURuc2gnKTtcbiAgICAgIGJ1aWx0VHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBidWlsdFR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiBTVEFLSU5HX0FNT1VOVC50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIGJ1aWx0VHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgYnVpbHRUeC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2UudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IFNUQUtJTkdfQU1PVU5ULnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QganNvblR4ID0gYnVpbHRUeC50b0pzb24oKTtcbiAgICAgIGpzb25UeC5nYXNEYXRhLnNob3VsZC5kZWVwRXF1YWwodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBqc29uVHgua2luZC5Qcm9ncmFtbWFibGVUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgaW5wdXRzOiB0ZXN0RGF0YS50eElucHV0c0FkZFN0YWtlLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IHRlc3REYXRhLnR4VHJhbnNhY3Rpb25zQWRkU3Rha2UsXG4gICAgICB9KTtcbiAgICAgIGpzb25UeC5zZW5kZXIuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGpzb25UeC5nYXNEYXRhLnNob3VsZC5kZWVwRXF1YWwodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERF9TVEFLRSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnVW5zdGFraW5nIFRYJywgYXN5bmMgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGJ1aWxkZXJzID0gW2ZhY3RvcnkuZ2V0VW5zdGFraW5nQnVpbGRlcigpXTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gdW5zdGFraW5nIHRyYW5zYWN0aW9uIGFuZCBzZXJpYWxpemUgaXQgYW5kIGRlc2VyaWFsaXplIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRVbnN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci51bnN0YWtlKHRlc3REYXRhLnJlcXVlc3RXaXRoZHJhd1N0YWtlZFN1aSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLldJVEhEUkFXX1NUQUtFRF9TVUkpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KS5idWlsZCgpO1xuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNpZ24gYSBzdGFraW5nIHR4IHdpdGggZ2FzUGF5bWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VW5zdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLldpdGhkcmF3U3Rha2UpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIudW5zdGFrZSh0ZXN0RGF0YS5yZXF1ZXN0V2l0aGRyYXdTdGFrZWRTdWkpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlkLCAnUml4ejlDMnlRNmpERkZzb3ZVczg0WTZ5dzJkY284SEg0UWhLN1JDUVlObycpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5XSVRIRFJBV19TVEFLRURfU1VJKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0NsYWltKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5pZCwgJ1JpeHo5QzJ5UTZqREZGc292VXM4NFk2eXcyZGNvOEhINFFoSzdSQ1FZTm8nKTtcblxuICAgICAgY29uc3QgcmF3U2lnbmVkVHggPSBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4LCB0ZXN0RGF0YS5XSVRIRFJBV19TVEFLRURfU1VJKTtcbiAgICAgIGNvbnN0IHJlc2VyaWFsaXplZFR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdTaWduZWRUeCk7XG4gICAgICByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlc2VyaWFsaXplZCA9IGF3YWl0IHJlc2VyaWFsaXplZFR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICByZXNlcmlhbGl6ZWQuc2hvdWxkLmJlLmRlZXBFcXVhbChzaWduZWRUeCk7XG4gICAgICByZXNlcmlhbGl6ZWQudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3U2lnbmVkVHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbiBhIHN0YWtpbmcgdHJhbnNhY3Rpb24gd2l0aCBwcml2YXRlIGtleXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyU2VuZGVyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTEgfSk7XG4gICAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0ga2V5UGFpclNlbmRlci5nZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCBleHBlY3RlZFN0YWtpbmdUeFNpZyA9XG4gICAgICAgICdBQnF3YU9Jc3haamYvTElFOTg1U0pLMmxINTZvTnhJdUhWcFpoTis2TDl1WkZZRnVpcGE2enNnNWZucHJ4dUJQSVVWVG9ydzN5RUpjb0tOR1p3T3BRZ0tsemFxMWo0d011Q2lYdUZXNG9qRmZ1b0JoRWlCeS9LNGVCNUJrSForZVp3PT0nO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nVHhIZXggPVxuICAgICAgICAnQUFBQ0FRRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlFFQUFBQUFBQUFBQVFFQTdtMzhQYU11SVZRYUt1cmZ6U1VQaWdvanUzcTlxY2lZaEFmOE1nYU1OMFpoQkFBQUFBQUFBQ0RKWUNXVUZpczZIYXd6eEd5RXJ2UlQwM3BZYXlSbGlMa2kwa1lzVjBYQ0JBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNS2MzVnBYM041YzNSbGJSWnlaWEYxWlhOMFgzZHBkR2hrY21GM1gzTjBZV3RsQUFJQkFBQUJBUUNRQjBLN2tqNnBCcVZ2TWxvWFdYZFM3Tk9zTUNhN3FXNE8zL1JkNk5zenF3SjNBYmlJd1dNNW1zMWJnRVl6d2REbE1yd3hROC92Tk1vMkMrWUh4bzNONzJZRUFBQUFBQUFBSURyTWNFT1RpZGpPZHA3YTFKL2pqSjl0T2piNlAyV1R5QlN3UXFBSGlBMS95ZlZsYStjWUl3RTlrMzRHVk9zKzNMSmhsYS9TTUFtK21ybHVmejh0d2dObUJBQUFBQUFBQUNBaFhua1hvYlMyRS9SWi9jTERRL24zQkgvVHhBakt2NVZ4c2JMRVpDVXh1NUFIUXJ1U1Bxa0dwVzh5V2hkWmQxTHMwNnd3SnJ1cGJnN2Y5RjNvMnpPcjZBTUFBQUFBQUFBQUxURUJBQUFBQUFBPSc7XG5cbiAgICAgIGNvbnN0IGNvaW5zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgZGlnZXN0OiAnNHhYVEdoaHROVWpCVThuTWl2c0xXVE1SV3ZaUmM1UldETWd5VE1ublJEWVMnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg3NzAxYjg4OGMxNjMzOTlhY2Q1YjgwNDYzM2MxZDBlNTMyYmMzMTQzY2ZlZjM0Y2EzNjBiZTYwN2M2OGRjZGVmJyxcbiAgICAgICAgICB2ZXJzaW9uOiAxMTI2LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGlnZXN0OiAnM0ZHMU5mazVIclExdFdZS1M4Qlg5eW5aVFNwckw1aExuM3BndzdrZGoxUlUnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHhjOWY1NjU2YmU3MTgyMzAxM2Q5MzdlMDY1NGViM2VkY2IyNjE5NWFmZDIzMDA5YmU5YWI5NmU3ZjNmMmRjMjAzJyxcbiAgICAgICAgICB2ZXJzaW9uOiAxMTI2LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcl8xID0gZmFjdG9yeS5nZXRVbnN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXJfMS50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd1N0YWtlKTtcbiAgICAgIHR4QnVpbGRlcl8xLnNlbmRlcihzZW5kZXJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlcl8xLnVuc3Rha2UodGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpKTtcbiAgICAgIGNvbnN0IGdhc0RhdGE6IEdhc0RhdGEgPSB7XG4gICAgICAgIHBheW1lbnQ6IGNvaW5zLFxuICAgICAgICBvd25lcjogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYnVkZ2V0OiB0ZXN0RGF0YS5HQVNfQlVER0VULFxuICAgICAgICBwcmljZTogMTAwMCxcbiAgICAgIH07XG4gICAgICB0eEJ1aWxkZXJfMS5nYXNEYXRhKGdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eF8xID0gYXdhaXQgdHhCdWlsZGVyXzEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlXzEgPSB0eF8xLnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZV8xID0ga2V5UGFpclNlbmRlci5zaWduTWVzc2FnZWluVWludDhBcnJheShzaWduYWJsZV8xKTtcbiAgICAgIHR4QnVpbGRlcl8xLmFkZFNpZ25hdHVyZSh7IHB1Yjoga2V5UGFpclNlbmRlci5nZXRLZXlzKCkucHViIH0sIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZV8xKSk7XG4gICAgICBjb25zdCBzaWduZWRUeF8xID0gKGF3YWl0IHR4QnVpbGRlcl8xLmJ1aWxkKCkpIGFzIFVuc3Rha2luZ1RyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhIZXhfMSA9IHNpZ25lZFR4XzEudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHNpZ18xID0gQnVmZmVyLmZyb20oc2lnbmVkVHhfMS5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlckZyb21SYXdfMiA9IGZhY3RvcnkuZ2V0VW5zdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyRnJvbVJhd18yLmZyb20odHhIZXhfMSk7XG4gICAgICBjb25zdCBzaWduYWJsZV8yID0gdHhfMS5zaWduYWJsZVBheWxvYWQ7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzIgPSAoYXdhaXQgdHhCdWlsZGVyRnJvbVJhd18yLmJ1aWxkKCkpIGFzIFVuc3Rha2luZ1RyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhIZXhfMiA9IHNpZ25lZFR4XzIudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHNpZ18yID0gQnVmZmVyLmZyb20oc2lnbmVkVHhfMi5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShzaWduYWJsZV8xKS50b1N0cmluZygnaGV4JyksIEJ1ZmZlci5mcm9tKHNpZ25hYmxlXzIpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMSwgdHhIZXhfMik7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMSwgZXhwZWN0ZWRTdGFraW5nVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzIsIGV4cGVjdGVkU3Rha2luZ1R4SGV4KTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMSwgc2lnXzIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ18xLCBleHBlY3RlZFN0YWtpbmdUeFNpZyk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnXzIsIGV4cGVjdGVkU3Rha2luZ1R4U2lnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnVuc3Rha2UodGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ3R5cGUgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBzZW5kZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZSk7XG4gICAgICAgIHR4QnVpbGRlci51bnN0YWtlKHRlc3REYXRhLnJlcXVlc3RXaXRoZHJhd1N0YWtlZFN1aSk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdzZW5kZXIgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBnYXNEYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd1N0YWtlKTtcbiAgICAgICAgdHhCdWlsZGVyLnVuc3Rha2UodGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnZ2FzRGF0YSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHBheW1lbnQgY29pbnMgaW4gZ2FzRGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZSk7XG4gICAgICAgIHR4QnVpbGRlci51bnN0YWtlKHRlc3REYXRhLnJlcXVlc3RXaXRoZHJhd1N0YWtlZFN1aSk7XG4gICAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhV2l0aG91dEdhc1BheW1lbnQpKS50aHJvd0Vycm9yKFxuICAgICAgICAgIGBnYXMgcGF5bWVudCBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmdgXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ2dhc0RhdGEgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2VuZCBmcm9tIHJhd1R4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLldJVEhEUkFXX1NUQUtFRF9TVUkpO1xuICAgICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbSk7XG4gICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC5pZCwgJ1JpeHo5QzJ5UTZqREZGc292VXM4NFk2eXcyZGNvOEhINFFoSzdSQ1FZTm8nKTtcbiAgICAgIGJ1aWx0VHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBidWlsdFR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpLnN0YWtlZFN1aS5vYmplY3RJZCxcbiAgICAgICAgdmFsdWU6IEFNT1VOVF9VTktOT1dOX1RFWFQsXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH0pO1xuICAgICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBidWlsdFR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogQU1PVU5UX1VOS05PV05fVEVYVCxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBqc29uVHggPSBidWlsdFR4LnRvSnNvbigpO1xuICAgICAganNvblR4Lmdhc0RhdGEuc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGpzb25UeC5raW5kLlByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBpbnB1dHM6IHRlc3REYXRhLnR4SW5wdXRXaXRoZHJhd1N0YWtlZCxcbiAgICAgICAgdHJhbnNhY3Rpb25zOiB0ZXN0RGF0YS50eFRyYW5zYWN0aW9uc1dpdGhkcmF3U3Rha2VkLFxuICAgICAgfSk7XG4gICAgICBqc29uVHguc2VuZGVyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBqc29uVHguZ2FzRGF0YS5zaG91bGQuZGVlcEVxdWFsKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5XSVRIRFJBV19TVEFLRURfU1VJKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGV0ZXJtaW5lIGNvcnJlY3QgdHlwZSBmb3Igd2l0aGRyYXdhbCB3aXRoIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5XSVRIRFJBV19TVEFLRURfU1VJX1dJVEhfQU1PVU5UKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnQ3VzdG9tIFRYJywgYXN5bmMgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2lnbiBhIGN1c3RvbSB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXJTZW5kZXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKENVU1RPTV9UWF9TVEFLSU5HX1BPT0xfU1BMSVQpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3Qgc2lnbmFibGUgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBjb25zdCBzaWduYXR1cmVCeXRlcyA9IGtleVBhaXJTZW5kZXIuc2lnbk1lc3NhZ2VpblVpbnQ4QXJyYXkoc2lnbmFibGUpO1xuICAgICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjoga2V5UGFpclNlbmRlci5nZXRLZXlzKCkucHViIH0sIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZUJ5dGVzKSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzaWduZWRUeEhleCA9IHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHhIZXgsIHVuc2lnbmVkVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnNpZ25hdHVyZVswXSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlQnl0ZXMpLnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTaWcgPSBCdWZmZXIuZnJvbShzaWduZWRUeC5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIHNlcmlhbGl6ZWRTaWcsXG4gICAgICAgICdBUEdRSG9ZYlZTeUw2TTdsT1FMNXcyWVl6ZWVWY1RNRWJlMFk0alZwaFFBKzBRSHEzVkVEb1hWd0l1a2tMNDR6K3Zxc2VrdmlTNGdRMFp3VVBUV0hGUWlsemFxMWo0d011Q2lYdUZXNG9qRmZ1b0JoRWlCeS9LNGVCNUJrSForZVp3PT0nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIHVuc3VwcG9ydGVkIHR4biB0eXBlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkKCgpID0+IGZhY3RvcnkuZnJvbShVTlNVUFBPUlRFRF9UWCkpLnRocm93RXJyb3IoXG4gICAgICAgICd1bnN1cHBvcnRlZCB0YXJnZXQgbWV0aG9kIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM6OnN0YWtpbmdfcG9vbDo6c3BsaXRfc3Rha2VkX3N1aSdcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|