@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.
Files changed (65) hide show
  1. package/dist/test/integration/index.d.ts +1 -0
  2. package/dist/test/integration/index.d.ts.map +1 -0
  3. package/dist/test/integration/index.js +1 -0
  4. package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
  5. package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
  6. package/dist/test/local_fullnode/RpcClient.js +111 -0
  7. package/dist/test/local_fullnode/faucet.d.ts +6 -0
  8. package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
  9. package/dist/test/local_fullnode/faucet.js +17 -0
  10. package/dist/test/local_fullnode/transactions.d.ts +2 -0
  11. package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
  12. package/dist/test/local_fullnode/transactions.js +190 -0
  13. package/dist/test/resources/sui.d.ts +463 -0
  14. package/dist/test/resources/sui.d.ts.map +1 -0
  15. package/dist/test/resources/sui.js +632 -0
  16. package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
  17. package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
  18. package/dist/test/unit/compareTransactionBlocks.js +64 -0
  19. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  20. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  21. package/dist/test/unit/getBuilderFactory.js +10 -0
  22. package/dist/test/unit/keyPair.d.ts +2 -0
  23. package/dist/test/unit/keyPair.d.ts.map +1 -0
  24. package/dist/test/unit/keyPair.js +72 -0
  25. package/dist/test/unit/sui.d.ts +2 -0
  26. package/dist/test/unit/sui.d.ts.map +1 -0
  27. package/dist/test/unit/sui.js +2399 -0
  28. package/dist/test/unit/suiToken.d.ts +2 -0
  29. package/dist/test/unit/suiToken.d.ts.map +1 -0
  30. package/dist/test/unit/suiToken.js +39 -0
  31. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  32. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  33. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
  34. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  35. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  36. package/dist/test/unit/transactionBuilder/stakingBuilder.js +152 -0
  37. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  38. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  39. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +149 -0
  40. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  41. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  42. package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
  43. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  44. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  45. package/dist/test/unit/transactionBuilder/transferBuilder.js +192 -0
  46. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
  47. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
  48. package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
  49. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
  50. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
  51. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +162 -0
  52. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
  53. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
  54. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +181 -0
  55. package/dist/test/unit/transferTransaction.d.ts +2 -0
  56. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  57. package/dist/test/unit/transferTransaction.js +94 -0
  58. package/dist/test/unit/utils.d.ts +2 -0
  59. package/dist/test/unit/utils.d.ts.map +1 -0
  60. package/dist/test/unit/utils.js +81 -0
  61. package/dist/tsconfig.tsbuildinfo +1 -0
  62. package/package.json +10 -7
  63. package/.eslintignore +0 -6
  64. package/.mocharc.yml +0 -7
  65. 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=