@bitgo-beta/sdk-coin-sol 2.4.3-beta.998 → 7.6.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 (142) hide show
  1. package/dist/src/bigint-buffer-guard.d.ts +1 -0
  2. package/dist/src/bigint-buffer-guard.d.ts.map +1 -0
  3. package/dist/src/bigint-buffer-guard.js +29 -0
  4. package/dist/src/config/token2022StaticConfig.d.ts +3 -0
  5. package/dist/src/config/token2022StaticConfig.d.ts.map +1 -0
  6. package/dist/src/config/token2022StaticConfig.js +50 -0
  7. package/dist/src/index.d.ts +1 -0
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +2 -1
  10. package/dist/src/lib/constants.d.ts +35 -2
  11. package/dist/src/lib/constants.d.ts.map +1 -1
  12. package/dist/src/lib/constants.js +41 -2
  13. package/dist/src/lib/customInstructionBuilder.d.ts +72 -0
  14. package/dist/src/lib/customInstructionBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/customInstructionBuilder.js +289 -0
  16. package/dist/src/lib/iface.d.ts +79 -5
  17. package/dist/src/lib/iface.d.ts.map +1 -1
  18. package/dist/src/lib/iface.js +1 -1
  19. package/dist/src/lib/index.d.ts +1 -0
  20. package/dist/src/lib/index.d.ts.map +1 -1
  21. package/dist/src/lib/index.js +4 -2
  22. package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
  23. package/dist/src/lib/instructionParamsFactory.js +364 -78
  24. package/dist/src/lib/jitoStakePoolOperations.d.ts +113 -0
  25. package/dist/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  26. package/dist/src/lib/jitoStakePoolOperations.js +200 -0
  27. package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
  28. package/dist/src/lib/solInstructionFactory.js +266 -69
  29. package/dist/src/lib/stakingActivateBuilder.d.ts +16 -5
  30. package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
  31. package/dist/src/lib/stakingActivateBuilder.js +23 -10
  32. package/dist/src/lib/stakingDeactivateBuilder.d.ts +16 -5
  33. package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  34. package/dist/src/lib/stakingDeactivateBuilder.js +43 -20
  35. package/dist/src/lib/token2022Config.d.ts +44 -0
  36. package/dist/src/lib/token2022Config.d.ts.map +1 -0
  37. package/dist/src/lib/token2022Config.js +27 -0
  38. package/dist/src/lib/tokenTransferBuilder.js +7 -7
  39. package/dist/src/lib/transaction.d.ts +31 -4
  40. package/dist/src/lib/transaction.d.ts.map +1 -1
  41. package/dist/src/lib/transaction.js +134 -46
  42. package/dist/src/lib/transactionBuilder.d.ts +18 -2
  43. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  44. package/dist/src/lib/transactionBuilder.js +78 -2
  45. package/dist/src/lib/transactionBuilderFactory.d.ts +5 -0
  46. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  47. package/dist/src/lib/transactionBuilderFactory.js +10 -1
  48. package/dist/src/lib/utils.d.ts +34 -1
  49. package/dist/src/lib/utils.d.ts.map +1 -1
  50. package/dist/src/lib/utils.js +88 -24
  51. package/dist/src/sol.d.ts +36 -13
  52. package/dist/src/sol.d.ts.map +1 -1
  53. package/dist/src/sol.js +230 -38
  54. package/dist/test/fixtures/sol.d.ts +1152 -0
  55. package/dist/test/fixtures/sol.d.ts.map +1 -0
  56. package/dist/test/fixtures/sol.js +1433 -0
  57. package/dist/test/resources/sol.d.ts +238 -0
  58. package/dist/test/resources/sol.d.ts.map +1 -0
  59. package/dist/test/resources/sol.js +320 -0
  60. package/dist/test/unit/fixtures/solBackupKey.d.ts +5 -0
  61. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  62. package/dist/test/unit/fixtures/solBackupKey.js +8 -0
  63. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  64. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  65. package/dist/test/unit/getBuilderFactory.js +10 -0
  66. package/dist/test/unit/instructionParamsFactory.d.ts +2 -0
  67. package/dist/test/unit/instructionParamsFactory.d.ts.map +1 -0
  68. package/dist/test/unit/instructionParamsFactory.js +412 -0
  69. package/dist/test/unit/instructionParamsFactory.staking.d.ts +2 -0
  70. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  71. package/dist/test/unit/instructionParamsFactory.staking.js +1059 -0
  72. package/dist/test/unit/keyPair.d.ts +2 -0
  73. package/dist/test/unit/keyPair.d.ts.map +1 -0
  74. package/dist/test/unit/keyPair.js +177 -0
  75. package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
  76. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  77. package/dist/test/unit/messages/messageBuilderFactory.js +118 -0
  78. package/dist/test/unit/messages/simpleMessageBuilder.d.ts +2 -0
  79. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  80. package/dist/test/unit/messages/simpleMessageBuilder.js +194 -0
  81. package/dist/test/unit/sol.d.ts +2 -0
  82. package/dist/test/unit/sol.d.ts.map +1 -0
  83. package/dist/test/unit/sol.js +3108 -0
  84. package/dist/test/unit/solInstructionFactory.d.ts +2 -0
  85. package/dist/test/unit/solInstructionFactory.d.ts.map +1 -0
  86. package/dist/test/unit/solInstructionFactory.js +454 -0
  87. package/dist/test/unit/solToken.d.ts +2 -0
  88. package/dist/test/unit/solToken.d.ts.map +1 -0
  89. package/dist/test/unit/solToken.js +31 -0
  90. package/dist/test/unit/transaction.d.ts +2 -0
  91. package/dist/test/unit/transaction.d.ts.map +1 -0
  92. package/dist/test/unit/transaction.js +983 -0
  93. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +2 -0
  94. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  95. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  96. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts +2 -0
  97. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  98. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
  99. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts +2 -0
  100. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  101. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  102. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts +2 -0
  103. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  104. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  105. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +2 -0
  106. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  107. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  108. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +2 -0
  109. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  110. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  111. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts +2 -0
  112. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  113. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  114. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +2 -0
  115. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  116. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  117. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  118. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  119. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
  120. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  121. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  122. package/dist/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  123. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  124. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  125. package/dist/test/unit/transactionBuilder/transferBuilder.js +286 -0
  126. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts +2 -0
  127. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  128. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
  129. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts +2 -0
  130. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  131. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  132. package/dist/test/unit/utils.d.ts +2 -0
  133. package/dist/test/unit/utils.d.ts.map +1 -0
  134. package/dist/test/unit/utils.js +505 -0
  135. package/dist/test/unit/versionedTransaction.d.ts +2 -0
  136. package/dist/test/unit/versionedTransaction.d.ts.map +1 -0
  137. package/dist/test/unit/versionedTransaction.js +207 -0
  138. package/dist/tsconfig.tsbuildinfo +1 -0
  139. package/package.json +14 -9
  140. package/.eslintignore +0 -5
  141. package/.mocharc.yml +0 -8
  142. package/CHANGELOG.md +0 -1223
@@ -0,0 +1,471 @@
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 src_1 = require("../../../src");
40
+ const should_1 = __importDefault(require("should"));
41
+ const testData = __importStar(require("../../resources/sol"));
42
+ const getBuilderFactory_1 = require("../getBuilderFactory");
43
+ describe('Sol Associated Token Account Builder', () => {
44
+ function verifyInputOutputAndRawTransaction(tx, rawTx, owner = sender) {
45
+ tx.inputs.length.should.equal(0);
46
+ tx.outputs.length.should.equal(0);
47
+ const instructions = tx.toJson().instructionsData;
48
+ let ataInitInstruction;
49
+ for (const instruction of instructions) {
50
+ if (instruction.type === 'CreateAssociatedTokenAccount') {
51
+ ataInitInstruction = instruction;
52
+ break;
53
+ }
54
+ }
55
+ should_1.default.exist(ataInitInstruction);
56
+ ataInitInstruction.params.tokenName.should.equal(mint);
57
+ should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
58
+ }
59
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('sol');
60
+ const ataInitBuilder = () => {
61
+ const txBuilder = factory.getAtaInitializationBuilder();
62
+ txBuilder.nonce(recentBlockHash);
63
+ txBuilder.sender(account.pub);
64
+ txBuilder.mint(mint);
65
+ txBuilder.rentExemptAmount(rentAmount);
66
+ return txBuilder;
67
+ };
68
+ const account = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[0]).getKeys();
69
+ const nonceAccount = new src_1.KeyPair(testData.nonceAccount).getKeys();
70
+ const sender = {
71
+ pubkey: account.pub,
72
+ ataPubkey: testData.associatedTokenAccounts.accounts[0].ata,
73
+ };
74
+ const wrongAccount = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
75
+ const mint = testData.associatedTokenAccounts.mint;
76
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
77
+ const rentAmount = '30000';
78
+ // for diff owner case
79
+ const accountOwner = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[1]).getKeys();
80
+ const ownerPubkeys = {
81
+ pubkey: accountOwner.pub,
82
+ ataPubkey: testData.associatedTokenAccounts.accounts[1].ata,
83
+ };
84
+ describe('Build and sign', () => {
85
+ describe('Succeed', () => {
86
+ it('build an associated token account init tx unsigned', async () => {
87
+ const txBuilder = ataInitBuilder();
88
+ const tx = await txBuilder.build();
89
+ const rawTx = tx.toBroadcastFormat();
90
+ verifyInputOutputAndRawTransaction(tx, rawTx);
91
+ should_1.default.equal(rawTx, testData.ATA_INIT_UNSIGNED_TX);
92
+ });
93
+ it('build an associated token account init tx unsigned with memo', async () => {
94
+ const txBuilder = ataInitBuilder();
95
+ txBuilder.memo('test memo please ignore');
96
+ const tx = await txBuilder.build();
97
+ const rawTx = tx.toBroadcastFormat();
98
+ verifyInputOutputAndRawTransaction(tx, rawTx);
99
+ should_1.default.equal(rawTx, testData.ATA_INIT_UNSIGNED_TX_WITH_MEMO);
100
+ });
101
+ it('build an associated token account init tx signed', async () => {
102
+ const txBuilder = ataInitBuilder();
103
+ txBuilder.sender(account.pub);
104
+ txBuilder.sign({ key: account.prv });
105
+ const tx = await txBuilder.build();
106
+ const rawTx = tx.toBroadcastFormat();
107
+ verifyInputOutputAndRawTransaction(tx, rawTx);
108
+ should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX);
109
+ });
110
+ it('build an associated token account init tx with memo signed', async () => {
111
+ const txBuilder = ataInitBuilder();
112
+ txBuilder.memo('test memo please ignore');
113
+ txBuilder.sender(account.pub);
114
+ txBuilder.sign({ key: account.prv });
115
+ const tx = await txBuilder.build();
116
+ const rawTx = tx.toBroadcastFormat();
117
+ verifyInputOutputAndRawTransaction(tx, rawTx);
118
+ should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX_WITH_MEMO);
119
+ });
120
+ it('build an associated token account init tx with durable nonce unsigned', async () => {
121
+ const txBuilder = ataInitBuilder();
122
+ txBuilder.memo('test memo please ignore');
123
+ txBuilder.sender(account.pub);
124
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: account.pub });
125
+ const tx = await txBuilder.build();
126
+ const rawTx = tx.toBroadcastFormat();
127
+ verifyInputOutputAndRawTransaction(tx, rawTx);
128
+ should_1.default.equal(rawTx, testData.ATA_INIT_UNSIGNED_TX_DURABLE_NONCE);
129
+ });
130
+ it('build an associated token account init tx with durable nonce signed', async () => {
131
+ const txBuilder = ataInitBuilder();
132
+ txBuilder.memo('test memo please ignore');
133
+ txBuilder.sender(account.pub);
134
+ txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: account.pub });
135
+ txBuilder.sign({ key: account.prv });
136
+ const tx = await txBuilder.build();
137
+ const rawTx = tx.toBroadcastFormat();
138
+ verifyInputOutputAndRawTransaction(tx, rawTx);
139
+ should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX_DURABLE_NONCE);
140
+ });
141
+ });
142
+ describe('ATA creation with different owner', () => {
143
+ it('build an associated token account init for diff owner tx unsigned', async () => {
144
+ const txBuilder = ataInitBuilder();
145
+ txBuilder.owner(accountOwner.pub);
146
+ const tx = await txBuilder.build();
147
+ const rawTx = tx.toBroadcastFormat();
148
+ verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
149
+ should_1.default.equal(rawTx, testData.ATA_INIT_UNSIGNED_DIFF_OWNER_TX);
150
+ });
151
+ it('build an associated token account init for diff owner tx unsigned with memo', async () => {
152
+ const txBuilder = ataInitBuilder();
153
+ txBuilder.owner(accountOwner.pub);
154
+ txBuilder.memo('test memo please ignore');
155
+ const tx = await txBuilder.build();
156
+ const rawTx = tx.toBroadcastFormat();
157
+ verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
158
+ should_1.default.equal(rawTx, testData.ATA_INIT_UNSIGNED_DIFF_OWNER_TX_WITH_MEMO);
159
+ });
160
+ it('build an associated token account init for diff owner tx signed', async () => {
161
+ const txBuilder = ataInitBuilder();
162
+ txBuilder.owner(accountOwner.pub);
163
+ txBuilder.sign({ key: account.prv });
164
+ const tx = await txBuilder.build();
165
+ const rawTx = tx.toBroadcastFormat();
166
+ verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
167
+ should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_DIFF_OWNER_TX);
168
+ });
169
+ it('build an associated token account init for diff owner tx with memo signed', async () => {
170
+ const txBuilder = ataInitBuilder();
171
+ txBuilder.owner(accountOwner.pub);
172
+ txBuilder.memo('test memo please ignore');
173
+ txBuilder.sign({ key: account.prv });
174
+ const tx = await txBuilder.build();
175
+ const rawTx = tx.toBroadcastFormat();
176
+ verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
177
+ should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_DIFF_OWNER_TX_WITH_MEMO);
178
+ });
179
+ });
180
+ describe('Fail', () => {
181
+ it('build an associated token account init tx when mint is invalid', () => {
182
+ const txBuilder = ataInitBuilder();
183
+ (0, should_1.default)(() => txBuilder.mint('invalidToken')).throwError('Invalid transaction: invalid token name, got: invalidToken');
184
+ });
185
+ it('build a wallet init tx and sign with an incorrect account', async () => {
186
+ const txBuilder = ataInitBuilder();
187
+ txBuilder.sender(account.pub);
188
+ txBuilder.sign({ key: wrongAccount.prv });
189
+ await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
190
+ });
191
+ it('build when nonce is not provided', async () => {
192
+ const txBuilder = factory.getAtaInitializationBuilder();
193
+ txBuilder.sender(account.pub);
194
+ txBuilder.mint(mint);
195
+ txBuilder.sign({ key: account.prv });
196
+ await txBuilder.build().should.rejectedWith('Invalid transaction: missing nonce blockhash');
197
+ });
198
+ it('build when sender is not provided', async () => {
199
+ const txBuilder = factory.getAtaInitializationBuilder();
200
+ txBuilder.nonce(recentBlockHash);
201
+ txBuilder.mint(mint);
202
+ txBuilder.sign({ key: account.prv });
203
+ await txBuilder.build().should.rejectedWith('Invalid transaction: missing sender');
204
+ });
205
+ it('build when mint is not provided', async () => {
206
+ const txBuilder = factory.getAtaInitializationBuilder();
207
+ txBuilder.sender(account.pub);
208
+ txBuilder.nonce(recentBlockHash);
209
+ txBuilder.sign({ key: account.prv });
210
+ await txBuilder.build().should.rejectedWith('Mint must be set before building the transaction');
211
+ });
212
+ it('build when mint is invalid', async () => {
213
+ const txBuilder = factory.getAtaInitializationBuilder();
214
+ (0, should_1.default)(() => txBuilder.mint('sol:invalid mint')).throwError('Invalid transaction: invalid token name, got: sol:invalid mint');
215
+ });
216
+ it('build when rentExemptAmount is invalid', async () => {
217
+ const txBuilder = ataInitBuilder();
218
+ (0, should_1.default)(() => txBuilder.rentExemptAmount('invalid amount')).throwError('Invalid tokenAccountRentExemptAmount, got: invalid amount');
219
+ (0, should_1.default)(() => txBuilder.associatedTokenAccountRent('invalid amount')).throwError('Invalid tokenAccountRentExemptAmount, got: invalid amount');
220
+ });
221
+ it('build when owner is invalid', async () => {
222
+ const txBuilder = ataInitBuilder();
223
+ (0, should_1.default)(() => txBuilder.owner('invalid owner')).throwError('Invalid or missing ownerAddress, got: invalid owner');
224
+ });
225
+ it('to sign twice with the same key', () => {
226
+ const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_TX);
227
+ txBuilder.sign({ key: account.prv });
228
+ (0, should_1.default)(() => txBuilder.sign({ key: account.prv })).throwError('Duplicated signer: ' + account.prv?.toString());
229
+ });
230
+ });
231
+ });
232
+ describe('Build and sign with enableToken', () => {
233
+ const recipients = [
234
+ {
235
+ ownerAddress: sender.pubkey,
236
+ tokenName: mint,
237
+ ataAddress: sender.ataPubkey,
238
+ },
239
+ {
240
+ ownerAddress: ownerPubkeys.pubkey,
241
+ tokenName: 'sol:ray',
242
+ ataAddress: 'ACEuzYtR4gBFt6HLQTYisg2T7k8Vh4ss1SpnqmbVQSNy',
243
+ },
244
+ {
245
+ ownerAddress: ownerPubkeys.pubkey,
246
+ tokenName: 'tsol:ams',
247
+ ataAddress: 'ACEuzYtR4gBFt6HLQTYisg2T7k8Vh4ss1SpnqmbVQSNy',
248
+ tokenAddress: 'F4uLeXioFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
249
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
250
+ },
251
+ ];
252
+ const multiAtaInitBuilder = (recipients) => {
253
+ const txBuilder = factory.getAtaInitializationBuilder();
254
+ txBuilder.nonce(recentBlockHash);
255
+ recipients.forEach((recipient) => {
256
+ txBuilder.enableToken(recipient);
257
+ });
258
+ txBuilder.sender(sender.pubkey);
259
+ txBuilder.rentExemptAmount(rentAmount);
260
+ return txBuilder;
261
+ };
262
+ describe('ATA creation for multiple recipients', () => {
263
+ it('build an associated token account init for multiple recipients', async () => {
264
+ const txBuilder = multiAtaInitBuilder(recipients);
265
+ const tx = await txBuilder.build();
266
+ const rawTx = tx.toBroadcastFormat();
267
+ const ownerRayATA = 'ACEuzYtR4gBFt6HLQTYisg2T7k8Vh4ss1SpnqmbVQSNy';
268
+ tx.inputs.length.should.equal(0);
269
+ tx.outputs.length.should.equal(0);
270
+ const instructions = tx.toJson().instructionsData;
271
+ instructions.length.should.equal(3);
272
+ instructions[0].params.tokenName.should.equal(mint);
273
+ instructions[0].params.ownerAddress.should.equal(sender.pubkey);
274
+ instructions[0].params.ataAddress.should.equal(sender.ataPubkey);
275
+ instructions[1].params.tokenName.should.equal('sol:ray');
276
+ instructions[1].params.ownerAddress.should.equal(ownerPubkeys.pubkey);
277
+ instructions[1].params.ataAddress.should.equal(ownerRayATA);
278
+ instructions[2].params.tokenName.should.equal('tsol:ams');
279
+ should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_UNSIGNED_TX_WITH_OPTIONAL_PARAMS);
280
+ });
281
+ it('build an associated token account init for multiple recipients with memo', async () => {
282
+ const txBuilder = multiAtaInitBuilder(recipients);
283
+ txBuilder.memo('test memo please ignore');
284
+ const tx = await txBuilder.build();
285
+ const rawTx = tx.toBroadcastFormat();
286
+ should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_UNSIGNED_TX_WITH_MEMO_OPTIONAL_PARAM);
287
+ });
288
+ it('build an associated token account init tx for multiple recipients signed', async () => {
289
+ const txBuilder = multiAtaInitBuilder(recipients);
290
+ txBuilder.sign({ key: account.prv });
291
+ const tx = await txBuilder.build();
292
+ const rawTx = tx.toBroadcastFormat();
293
+ should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_SIGNED_TX_OPTIONAL_PARAM);
294
+ });
295
+ it('build an associated token account init for multiple recipients tx with memo signed', async () => {
296
+ const txBuilder = multiAtaInitBuilder(recipients);
297
+ txBuilder.memo('test memo please ignore');
298
+ txBuilder.sign({ key: account.prv });
299
+ const tx = await txBuilder.build();
300
+ const rawTx = tx.toBroadcastFormat();
301
+ should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_SIGNED_TX_WITH_MEMO_OPTIONAL_PARAM);
302
+ });
303
+ });
304
+ describe('Fail', () => {
305
+ it('should fail to build an associated token account init with duplicate recipients', async () => {
306
+ const duplicateRecipient = {
307
+ ownerAddress: sender.pubkey,
308
+ tokenName: mint,
309
+ ataAddress: sender.ataPubkey,
310
+ };
311
+ const txBuilder = multiAtaInitBuilder(recipients);
312
+ (0, should_1.default)(() => txBuilder.enableToken(duplicateRecipient)).throwError('Invalid transaction: invalid duplicate recipients, got: owner 12f6D3WubGVeQoH2m8kTvvcrasWdXWwtVzUCyRNDZxA2 and tokenName sol:usdc twice');
313
+ });
314
+ it('build an associated token account init tx when mint is invalid', () => {
315
+ const errorMintRecipient = {
316
+ ownerAddress: ownerPubkeys.pubkey,
317
+ tokenName: 'invalidToken',
318
+ ataAddress: ownerPubkeys.ataPubkey,
319
+ };
320
+ const txBuilder = multiAtaInitBuilder(recipients);
321
+ (0, should_1.default)(() => txBuilder.enableToken(errorMintRecipient)).throwError('Invalid transaction: invalid token name, got: invalidToken');
322
+ });
323
+ it('build a wallet init tx and sign with an incorrect account', async () => {
324
+ const txBuilder = multiAtaInitBuilder(recipients);
325
+ txBuilder.sender(account.pub);
326
+ txBuilder.sign({ key: wrongAccount.prv });
327
+ await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
328
+ });
329
+ it('build when nonce is not provided', async () => {
330
+ const txBuilder = factory.getAtaInitializationBuilder();
331
+ txBuilder.sender(account.pub);
332
+ txBuilder.enableToken({
333
+ ownerAddress: account.pub,
334
+ tokenName: mint,
335
+ ataAddress: sender.ataPubkey,
336
+ });
337
+ txBuilder.sign({ key: account.prv });
338
+ await txBuilder.build().should.rejectedWith('Invalid transaction: missing nonce blockhash');
339
+ });
340
+ it('build when sender is not provided', async () => {
341
+ const txBuilder = factory.getAtaInitializationBuilder();
342
+ txBuilder.nonce(recentBlockHash);
343
+ txBuilder.enableToken({
344
+ ownerAddress: account.pub,
345
+ tokenName: mint,
346
+ ataAddress: sender.ataPubkey,
347
+ });
348
+ txBuilder.sign({ key: account.prv });
349
+ await txBuilder.build().should.rejectedWith('Invalid transaction: missing sender');
350
+ });
351
+ it('build when recipient is not provided', async () => {
352
+ const txBuilder = factory.getAtaInitializationBuilder();
353
+ txBuilder.sender(account.pub);
354
+ txBuilder.nonce(recentBlockHash);
355
+ txBuilder.sign({ key: account.prv });
356
+ await txBuilder.build().should.rejectedWith('Mint must be set before building the transaction');
357
+ });
358
+ it('build when rentExemptAmount is invalid', async () => {
359
+ const txBuilder = multiAtaInitBuilder(recipients);
360
+ (0, should_1.default)(() => txBuilder.rentExemptAmount('invalid amount')).throwError('Invalid tokenAccountRentExemptAmount, got: invalid amount');
361
+ (0, should_1.default)(() => txBuilder.associatedTokenAccountRent('invalid amount')).throwError('Invalid tokenAccountRentExemptAmount, got: invalid amount');
362
+ });
363
+ it('build when token owner is invalid', async () => {
364
+ const invalidOwner = {
365
+ ownerAddress: 'invalid owner',
366
+ tokenName: mint,
367
+ ataAddress: sender.ataPubkey,
368
+ };
369
+ const txBuilder = multiAtaInitBuilder(recipients);
370
+ (0, should_1.default)(() => txBuilder.enableToken(invalidOwner)).throwError('Invalid or missing ownerAddress, got: invalid owner');
371
+ });
372
+ it('to sign twice with the same key', () => {
373
+ const txBuilder = factory.from(testData.MULTI_ATA_INIT_UNSIGNED_TX);
374
+ txBuilder.sign({ key: account.prv });
375
+ (0, should_1.default)(() => txBuilder.sign({ key: account.prv })).throwError('Duplicated signer: ' + account.prv?.toString());
376
+ });
377
+ });
378
+ });
379
+ describe('From and sign', () => {
380
+ describe('Succeed', () => {
381
+ it('build from a unsigned ATA init and sign it', async () => {
382
+ const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_TX);
383
+ txBuilder.rentExemptAmount(rentAmount);
384
+ txBuilder.sign({ key: account.prv });
385
+ const tx = await txBuilder.build();
386
+ const rawTx = tx.toBroadcastFormat();
387
+ verifyInputOutputAndRawTransaction(tx, rawTx);
388
+ should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX);
389
+ });
390
+ it('build from a unsigned ATA init with memo and sign it', async () => {
391
+ const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_TX_WITH_MEMO);
392
+ txBuilder.rentExemptAmount(rentAmount);
393
+ txBuilder.sign({ key: account.prv });
394
+ const tx = await txBuilder.build();
395
+ const rawTx = tx.toBroadcastFormat();
396
+ verifyInputOutputAndRawTransaction(tx, rawTx);
397
+ should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX_WITH_MEMO);
398
+ });
399
+ it('build from a unsigned ATA init with diff owner and sign it', async () => {
400
+ const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_DIFF_OWNER_TX);
401
+ txBuilder.rentExemptAmount(rentAmount);
402
+ txBuilder.sign({ key: account.prv });
403
+ const tx = await txBuilder.build();
404
+ const rawTx = tx.toBroadcastFormat();
405
+ verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
406
+ should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_DIFF_OWNER_TX);
407
+ });
408
+ it('build from a unsigned ATA init with diff owner with memo and sign it', async () => {
409
+ const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_DIFF_OWNER_TX_WITH_MEMO);
410
+ txBuilder.rentExemptAmount(rentAmount);
411
+ txBuilder.sign({ key: account.prv });
412
+ const tx = await txBuilder.build();
413
+ const rawTx = tx.toBroadcastFormat();
414
+ verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
415
+ should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_DIFF_OWNER_TX_WITH_MEMO);
416
+ });
417
+ it('build from a unsigned ATA init for multi recipients and sign it', async () => {
418
+ const txBuilder = factory.from(testData.MULTI_ATA_INIT_UNSIGNED_TX);
419
+ txBuilder.rentExemptAmount(rentAmount);
420
+ txBuilder.sign({ key: account.prv });
421
+ const tx = await txBuilder.build();
422
+ const rawTx = tx.toBroadcastFormat();
423
+ should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_SIGNED_TX);
424
+ });
425
+ it('build from a unsigned ATA init for multi recipients with memo and sign it', async () => {
426
+ const txBuilder = factory.from(testData.MULTI_ATA_INIT_UNSIGNED_TX_WITH_MEMO);
427
+ txBuilder.rentExemptAmount(rentAmount);
428
+ txBuilder.sign({ key: account.prv });
429
+ const tx = await txBuilder.build();
430
+ const rawTx = tx.toBroadcastFormat();
431
+ should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_SIGNED_TX_WITH_MEMO);
432
+ });
433
+ it('build from a unsigned ATA init for multi recipients with memo and sign it with optinal param', async () => {
434
+ const txBuilder = factory.from(testData.MULTI_ATA_INIT_UNSIGNED_TX_WITH_MEMO_OPTIONAL_PARAM);
435
+ txBuilder.rentExemptAmount(rentAmount);
436
+ txBuilder.sign({ key: account.prv });
437
+ const tx = await txBuilder.build();
438
+ const rawTx = tx.toBroadcastFormat();
439
+ should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_SIGNED_TX_WITH_MEMO_OPTIONAL_PARAM1);
440
+ });
441
+ it('build from a unsigned raw token transfer with optinal param', async () => {
442
+ const txBuilder = factory.from(testData.TOKEN_TRANSFER_UNSIGNED_WITH_CREATE_ATA_AND_MEMO_AND_DURABLE_NONCE_WITH_OPTIONAL_PARAMS);
443
+ txBuilder._sendParams[0].tokenName = 'tsol:ams';
444
+ txBuilder._createAtaParams[0].tokenName = 'tsol:ams';
445
+ const tx = await txBuilder.build();
446
+ const rawTx = tx.toBroadcastFormat();
447
+ should_1.default.equal(rawTx, testData.TOKEN_TRANSFER_UNSIGNED_WITH_CREATE_ATA_AND_MEMO_AND_DURABLE_NONCE_WITH_OPTIONAL_PARAMS);
448
+ });
449
+ it('build from an unsigned ATA init with durable nonce and sign it', async () => {
450
+ const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_TX_DURABLE_NONCE);
451
+ txBuilder.sign({ key: account.prv });
452
+ const tx = await txBuilder.build();
453
+ const rawTx = tx.toBroadcastFormat();
454
+ should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX_DURABLE_NONCE);
455
+ });
456
+ });
457
+ describe('Fail', () => {
458
+ it('build from a unsigned ATA init and fail to sign it', async () => {
459
+ const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_TX);
460
+ txBuilder.sign({ key: wrongAccount.prv });
461
+ await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
462
+ });
463
+ it('build from a signed ATA init and fail to sign it', async () => {
464
+ const txBuilder = factory.from(testData.ATA_INIT_SIGNED_TX);
465
+ txBuilder.sign({ key: wrongAccount.prv });
466
+ await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
467
+ });
468
+ });
469
+ });
470
+ });
471
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhSW5pdEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL2F0YUluaXRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0NBQThGO0FBQzlGLG9EQUE0QjtBQUM1Qiw4REFBZ0Q7QUFFaEQsNERBQXlEO0FBRXpELFFBQVEsQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7SUFDcEQsU0FBUyxrQ0FBa0MsQ0FDekMsRUFBbUIsRUFDbkIsS0FBYSxFQUNiLFFBQStDLE1BQU07UUFFckQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNsRCxJQUFJLGtCQUFrQixDQUFDO1FBQ3ZCLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7WUFDdkMsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLDhCQUE4QixFQUFFLENBQUM7Z0JBQ3hELGtCQUFrQixHQUFHLFdBQVcsQ0FBQztnQkFDakMsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBQ0QsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNqQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxD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RUFBRSxLQUFLLElBQUksRUFBRTtnQkFDbEUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDOUQsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDMUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1lBQzlHLENBQUMsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNoRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUM1RCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7WUFDOUcsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBLZXlQYWlyLCBVdGlscywgQXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyLCBUb2tlblRyYW5zZmVyQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuXG5kZXNjcmliZSgnU29sIEFzc29jaWF0ZWQgVG9rZW4gQWNjb3VudCBCdWlsZGVyJywgKCkgPT4ge1xuICBmdW5jdGlvbiB2ZXJpZnlJbnB1dE91dHB1dEFuZFJhd1RyYW5zYWN0aW9uKFxuICAgIHR4OiBCYXNlVHJhbnNhY3Rpb24sXG4gICAgcmF3VHg6IHN0cmluZyxcbiAgICBvd25lcjogeyBwdWJrZXk6IHN0cmluZzsgYXRhUHVia2V5OiBzdHJpbmcgfSA9IHNlbmRlclxuICApIHtcbiAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gdHgudG9Kc29uKCkuaW5zdHJ1Y3Rpb25zRGF0YTtcbiAgICBsZXQgYXRhSW5pdEluc3RydWN0aW9uO1xuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24udHlwZSA9PT0gJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKSB7XG4gICAgICAgIGF0YUluaXRJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc2hvdWxkLmV4aXN0KGF0YUluaXRJbnN0cnVjdGlvbik7XG4gICAgYXRhSW5pdEluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKG1pbnQpO1xuXG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCdzb2wnKTtcbiAgY29uc3QgYXRhSW5pdEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICB0eEJ1aWxkZXIubWludChtaW50KTtcbiAgICB0eEJ1aWxkZXIucmVudEV4ZW1wdEFtb3VudChyZW50QW1vdW50KTtcblxuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgYWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdKS5nZXRLZXlzKCk7XG4gIGNvbnN0IG5vbmNlQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLm5vbmNlQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCBzZW5kZXIgPSB7XG4gICAgcHVia2V5OiBhY2NvdW50LnB1YixcbiAgICBhdGFQdWJrZXk6IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLmF0YSxcbiAgfTtcbiAgY29uc3Qgd3JvbmdBY2NvdW50ID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnBydktleXMucHJ2S2V5MS5iYXNlNTggfSkuZ2V0S2V5cygpO1xuICBjb25zdCBtaW50ID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMubWludDtcbiAgY29uc3QgcmVjZW50QmxvY2tIYXNoID0gJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJztcbiAgY29uc3QgcmVudEFtb3VudCA9ICczMDAwMCc7XG5cbiAgLy8gZm9yIGRpZmYgb3duZXIgY2FzZVxuICBjb25zdCBhY2NvdW50T3duZXIgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1sxXSkuZ2V0S2V5cygpO1xuICBjb25zdCBvd25lclB1YmtleXMgPSB7XG4gICAgcHVia2V5OiBhY2NvdW50T3duZXIucHViLFxuICAgIGF0YVB1YmtleTogdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMV0uYXRhLFxuICB9O1xuXG4gIGRlc2NyaWJlKCdCdWlsZCBhbmQgc2lnbicsICgpID0+IHtcbiAgICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICAgIGl0KCdidWlsZCBhbiBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgaW5pdCB0eCB1bnNpZ25lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHZlcmlmeUlucHV0T3V0cHV0QW5kUmF3VHJhbnNhY3Rpb24odHgsIHJhd1R4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BVEFfSU5JVF9VTlNJR05FRF9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IHR4IHVuc2lnbmVkIHdpdGggbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lbW8oJ3Rlc3QgbWVtbyBwbGVhc2UgaWdub3JlJyk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICB2ZXJpZnlJbnB1dE91dHB1dEFuZFJhd1RyYW5zYWN0aW9uKHR4LCByYXdUeCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfVFhfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgdHggc2lnbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBhdGFJbml0QnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IHR4IHdpdGggbWVtbyBzaWduZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGF0YUluaXRCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5tZW1vKCd0ZXN0IG1lbW8gcGxlYXNlIGlnbm9yZScpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCBhbiBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgaW5pdCB0eCB3aXRoIGR1cmFibGUgbm9uY2UgdW5zaWduZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGF0YUluaXRCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5tZW1vKCd0ZXN0IG1lbW8gcGxlYXNlIGlnbm9yZScpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBhY2NvdW50LnB1YiB9KTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfVFhfRFVSQUJMRV9OT05DRSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IHR4IHdpdGggZHVyYWJsZSBub25jZSBzaWduZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGF0YUluaXRCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5tZW1vKCd0ZXN0IG1lbW8gcGxlYXNlIGlnbm9yZScpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBhY2NvdW50LnB1YiB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICB2ZXJpZnlJbnB1dE91dHB1dEFuZFJhd1RyYW5zYWN0aW9uKHR4LCByYXdUeCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BVEFfSU5JVF9TSUdORURfVFhfRFVSQUJMRV9OT05DRSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdBVEEgY3JlYXRpb24gd2l0aCBkaWZmZXJlbnQgb3duZXInLCAoKSA9PiB7XG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgZm9yIGRpZmYgb3duZXIgdHggdW5zaWduZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGF0YUluaXRCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5vd25lcihhY2NvdW50T3duZXIucHViKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHZlcmlmeUlucHV0T3V0cHV0QW5kUmF3VHJhbnNhY3Rpb24odHgsIHJhd1R4LCBvd25lclB1YmtleXMpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1VOU0lHTkVEX0RJRkZfT1dORVJfVFgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCBhbiBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgaW5pdCBmb3IgZGlmZiBvd25lciB0eCB1bnNpZ25lZCB3aXRoIG1lbW8nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGF0YUluaXRCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5vd25lcihhY2NvdW50T3duZXIucHViKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lbW8oJ3Rlc3QgbWVtbyBwbGVhc2UgaWdub3JlJyk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICB2ZXJpZnlJbnB1dE91dHB1dEFuZFJhd1RyYW5zYWN0aW9uKHR4LCByYXdUeCwgb3duZXJQdWJrZXlzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BVEFfSU5JVF9VTlNJR05FRF9ESUZGX09XTkVSX1RYX1dJVEhfTUVNTyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IGZvciBkaWZmIG93bmVyIHR4IHNpZ25lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLm93bmVyKGFjY291bnRPd25lci5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICB2ZXJpZnlJbnB1dE91dHB1dEFuZFJhd1RyYW5zYWN0aW9uKHR4LCByYXdUeCwgb3duZXJQdWJrZXlzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BVEFfSU5JVF9TSUdORURfRElGRl9PV05FUl9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IGZvciBkaWZmIG93bmVyIHR4IHdpdGggbWVtbyBzaWduZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGF0YUluaXRCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5vd25lcihhY2NvdW50T3duZXIucHViKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lbW8oJ3Rlc3QgbWVtbyBwbGVhc2UgaWdub3JlJyk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHZlcmlmeUlucHV0T3V0cHV0QW5kUmF3VHJhbnNhY3Rpb24odHgsIHJhd1R4LCBvd25lclB1YmtleXMpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9ESUZGX09XTkVSX1RYX1dJVEhfTUVNTyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdGYWlsJywgKCkgPT4ge1xuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IHR4IHdoZW4gbWludCBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBhdGFJbml0QnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLm1pbnQoJ2ludmFsaWRUb2tlbicpKS50aHJvd0Vycm9yKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uOiBpbnZhbGlkIHRva2VuIG5hbWUsIGdvdDogaW52YWxpZFRva2VuJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCBhIHdhbGxldCBpbml0IHR4IGFuZCBzaWduIHdpdGggYW4gaW5jb3JyZWN0IGFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGF0YUluaXRCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd3JvbmdBY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgndW5rbm93biBzaWduZXI6IENQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIHdoZW4gbm9uY2UgaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICAgICAgdHhCdWlsZGVyLm1pbnQobWludCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBub25jZSBibG9ja2hhc2gnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgd2hlbiBzZW5kZXIgaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgICAgdHhCdWlsZGVyLm1pbnQobWludCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBzZW5kZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgd2hlbiBtaW50IGlzIG5vdCBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcihhY2NvdW50LnB1Yik7XG4gICAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ01pbnQgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCB3aGVuIG1pbnQgaXMgaW52YWxpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5taW50KCdzb2w6aW52YWxpZCBtaW50JykpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgdG9rZW4gbmFtZSwgZ290OiBzb2w6aW52YWxpZCBtaW50J1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCB3aGVuIHJlbnRFeGVtcHRBbW91bnQgaXMgaW52YWxpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5yZW50RXhlbXB0QW1vdW50KCdpbnZhbGlkIGFtb3VudCcpKS50aHJvd0Vycm9yKFxuICAgICAgICAgICdJbnZhbGlkIHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQsIGdvdDogaW52YWxpZCBhbW91bnQnXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYXNzb2NpYXRlZFRva2VuQWNjb3VudFJlbnQoJ2ludmFsaWQgYW1vdW50JykpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCwgZ290OiBpbnZhbGlkIGFtb3VudCdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgd2hlbiBvd25lciBpcyBpbnZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBhdGFJbml0QnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLm93bmVyKCdpbnZhbGlkIG93bmVyJykpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgb3IgbWlzc2luZyBvd25lckFkZHJlc3MsIGdvdDogaW52YWxpZCBvd25lcidcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgndG8gc2lnbiB0d2ljZSB3aXRoIHRoZSBzYW1lIGtleScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLkFUQV9JTklUX1VOU0lHTkVEX1RYKTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pKS50aHJvd0Vycm9yKCdEdXBsaWNhdGVkIHNpZ25lcjogJyArIGFjY291bnQucHJ2Py50b1N0cmluZygpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQnVpbGQgYW5kIHNpZ24gd2l0aCBlbmFibGVUb2tlbicsICgpID0+IHtcbiAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAge1xuICAgICAgICBvd25lckFkZHJlc3M6IHNlbmRlci5wdWJrZXksXG4gICAgICAgIHRva2VuTmFtZTogbWludCxcbiAgICAgICAgYXRhQWRkcmVzczogc2VuZGVyLmF0YVB1YmtleSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG93bmVyQWRkcmVzczogb3duZXJQdWJrZXlzLnB1YmtleSxcbiAgICAgICAgdG9rZW5OYW1lOiAnc29sOnJheScsXG4gICAgICAgIGF0YUFkZHJlc3M6ICdBQ0V1ell0UjRnQkZ0NkhMUVRZaXNnMlQ3azhWaDRzczFTcG5xbWJWUVNOeScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBvd25lckFkZHJlc3M6IG93bmVyUHVia2V5cy5wdWJrZXksXG4gICAgICAgIHRva2VuTmFtZTogJ3Rzb2w6YW1zJyxcbiAgICAgICAgYXRhQWRkcmVzczogJ0FDRXV6WXRSNGdCRnQ2SExRVFlpc2cyVDdrOFZoNHNzMVNwbnFtYlZRU055JyxcbiAgICAgICAgdG9rZW5BZGRyZXNzOiAnRjR1TGVYaW9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBjb25zdCBtdWx0aUF0YUluaXRCdWlsZGVyID0gKHJlY2lwaWVudHMpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHJlY2lwaWVudHMuZm9yRWFjaCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci5lbmFibGVUb2tlbihyZWNpcGllbnQpO1xuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHNlbmRlci5wdWJrZXkpO1xuICAgICAgdHhCdWlsZGVyLnJlbnRFeGVtcHRBbW91bnQocmVudEFtb3VudCk7XG5cbiAgICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gICAgfTtcblxuICAgIGRlc2NyaWJlKCdBVEEgY3JlYXRpb24gZm9yIG11bHRpcGxlIHJlY2lwaWVudHMnLCAoKSA9PiB7XG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgZm9yIG11bHRpcGxlIHJlY2lwaWVudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG11bHRpQXRhSW5pdEJ1aWxkZXIocmVjaXBpZW50cyk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgY29uc3Qgb3duZXJSYXlBVEEgPSAnQUNFdXpZdFI0Z0JGdDZITFFUWWlzZzJUN2s4Vmg0c3MxU3BucW1iVlFTTnknO1xuXG4gICAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGE7XG5cbiAgICAgICAgaW5zdHJ1Y3Rpb25zLmxlbmd0aC5zaG91bGQuZXF1YWwoMyk7XG4gICAgICAgIGluc3RydWN0aW9uc1swXS5wYXJhbXMudG9rZW5OYW1lLnNob3VsZC5lcXVhbChtaW50KTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25zWzBdLnBhcmFtcy5vd25lckFkZHJlc3Muc2hvdWxkLmVxdWFsKHNlbmRlci5wdWJrZXkpO1xuICAgICAgICBpbnN0cnVjdGlvbnNbMF0ucGFyYW1zLmF0YUFkZHJlc3Muc2hvdWxkLmVxdWFsKHNlbmRlci5hdGFQdWJrZXkpO1xuICAgICAgICBpbnN0cnVjdGlvbnNbMV0ucGFyYW1zLnRva2VuTmFtZS5zaG91bGQuZXF1YWwoJ3NvbDpyYXknKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25zWzFdLnBhcmFtcy5vd25lckFkZHJlc3Muc2hvdWxkLmVxdWFsKG93bmVyUHVia2V5cy5wdWJrZXkpO1xuICAgICAgICBpbnN0cnVjdGlvbnNbMV0ucGFyYW1zLmF0YUFkZHJlc3Muc2hvdWxkLmVxdWFsKG93bmVyUmF5QVRBKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25zWzJdLnBhcmFtcy50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKCd0c29sOmFtcycpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1VTFRJX0FUQV9JTklUX1VOU0lHTkVEX1RYX1dJVEhfT1BUSU9OQUxfUEFSQU1TKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgZm9yIG11bHRpcGxlIHJlY2lwaWVudHMgd2l0aCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBtdWx0aUF0YUluaXRCdWlsZGVyKHJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIubWVtbygndGVzdCBtZW1vIHBsZWFzZSBpZ25vcmUnKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuTVVMVElfQVRBX0lOSVRfVU5TSUdORURfVFhfV0lUSF9NRU1PX09QVElPTkFMX1BBUkFNKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgdHggZm9yIG11bHRpcGxlIHJlY2lwaWVudHMgc2lnbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBtdWx0aUF0YUluaXRCdWlsZGVyKHJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1VTFRJX0FUQV9JTklUX1NJR05FRF9UWF9PUFRJT05BTF9QQVJBTSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IGZvciBtdWx0aXBsZSByZWNpcGllbnRzIHR4IHdpdGggbWVtbyBzaWduZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG11bHRpQXRhSW5pdEJ1aWxkZXIocmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlci5tZW1vKCd0ZXN0IG1lbW8gcGxlYXNlIGlnbm9yZScpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1VTFRJX0FUQV9JTklUX1NJR05FRF9UWF9XSVRIX01FTU9fT1BUSU9OQUxfUEFSQU0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnRmFpbCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBhbiBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgaW5pdCB3aXRoIGR1cGxpY2F0ZSByZWNpcGllbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBkdXBsaWNhdGVSZWNpcGllbnQgPSB7XG4gICAgICAgICAgb3duZXJBZGRyZXNzOiBzZW5kZXIucHVia2V5LFxuICAgICAgICAgIHRva2VuTmFtZTogbWludCxcbiAgICAgICAgICBhdGFBZGRyZXNzOiBzZW5kZXIuYXRhUHVia2V5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBtdWx0aUF0YUluaXRCdWlsZGVyKHJlY2lwaWVudHMpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmVuYWJsZVRva2VuKGR1cGxpY2F0ZVJlY2lwaWVudCkpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgZHVwbGljYXRlIHJlY2lwaWVudHMsIGdvdDogb3duZXIgMTJmNkQzV3ViR1ZlUW9IMm04a1R2dmNyYXNXZFhXd3RWelVDeVJORFp4QTIgYW5kIHRva2VuTmFtZSBzb2w6dXNkYyB0d2ljZSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgdHggd2hlbiBtaW50IGlzIGludmFsaWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9yTWludFJlY2lwaWVudCA9IHtcbiAgICAgICAgICBvd25lckFkZHJlc3M6IG93bmVyUHVia2V5cy5wdWJrZXksXG4gICAgICAgICAgdG9rZW5OYW1lOiAnaW52YWxpZFRva2VuJyxcbiAgICAgICAgICBhdGFBZGRyZXNzOiBvd25lclB1YmtleXMuYXRhUHVia2V5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBtdWx0aUF0YUluaXRCdWlsZGVyKHJlY2lwaWVudHMpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmVuYWJsZVRva2VuKGVycm9yTWludFJlY2lwaWVudCkpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgdG9rZW4gbmFtZSwgZ290OiBpbnZhbGlkVG9rZW4nXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGEgd2FsbGV0IGluaXQgdHggYW5kIHNpZ24gd2l0aCBhbiBpbmNvcnJlY3QgYWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gbXVsdGlBdGFJbml0QnVpbGRlcihyZWNpcGllbnRzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcihhY2NvdW50LnB1Yik7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3cm9uZ0FjY291bnQucHJ2IH0pO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCd1bmtub3duIHNpZ25lcjogQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgd2hlbiBub25jZSBpcyBub3QgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIuZW5hYmxlVG9rZW4oe1xuICAgICAgICAgIG93bmVyQWRkcmVzczogYWNjb3VudC5wdWIsXG4gICAgICAgICAgdG9rZW5OYW1lOiBtaW50LFxuICAgICAgICAgIGF0YUFkZHJlc3M6IHNlbmRlci5hdGFQdWJrZXksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9uY2UgYmxvY2toYXNoJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIHdoZW4gc2VuZGVyIGlzIG5vdCBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICAgIHR4QnVpbGRlci5lbmFibGVUb2tlbih7XG4gICAgICAgICAgb3duZXJBZGRyZXNzOiBhY2NvdW50LnB1YixcbiAgICAgICAgICB0b2tlbk5hbWU6IG1pbnQsXG4gICAgICAgICAgYXRhQWRkcmVzczogc2VuZGVyLmF0YVB1YmtleSxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBzZW5kZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgd2hlbiByZWNpcGllbnQgaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnTWludCBtdXN0IGJlIHNldCBiZWZvcmUgYnVpbGRpbmcgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIHdoZW4gcmVudEV4ZW1wdEFtb3VudCBpcyBpbnZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBtdWx0aUF0YUluaXRCdWlsZGVyKHJlY2lwaWVudHMpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLnJlbnRFeGVtcHRBbW91bnQoJ2ludmFsaWQgYW1vdW50JykpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCwgZ290OiBpbnZhbGlkIGFtb3VudCdcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hc3NvY2lhdGVkVG9rZW5BY2NvdW50UmVudCgnaW52YWxpZCBhbW91bnQnKSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCB0b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50LCBnb3Q6IGludmFsaWQgYW1vdW50J1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCB3aGVuIHRva2VuIG93bmVyIGlzIGludmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGludmFsaWRPd25lciA9IHtcbiAgICAgICAgICBvd25lckFkZHJlc3M6ICdpbnZhbGlkIG93bmVyJyxcbiAgICAgICAgICB0b2tlbk5hbWU6IG1pbnQsXG4gICAgICAgICAgYXRhQWRkcmVzczogc2VuZGVyLmF0YVB1YmtleSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gbXVsdGlBdGFJbml0QnVpbGRlcihyZWNpcGllbnRzKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5lbmFibGVUb2tlbihpbnZhbGlkT3duZXIpKS50aHJvd0Vycm9yKFxuICAgICAgICAgICdJbnZhbGlkIG9yIG1pc3Npbmcgb3duZXJBZGRyZXNzLCBnb3Q6IGludmFsaWQgb3duZXInXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3RvIHNpZ24gdHdpY2Ugd2l0aCB0aGUgc2FtZSBrZXknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5NVUxUSV9BVEFfSU5JVF9VTlNJR05FRF9UWCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KSkudGhyb3dFcnJvcignRHVwbGljYXRlZCBzaWduZXI6ICcgKyBhY2NvdW50LnBydj8udG9TdHJpbmcoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Zyb20gYW5kIHNpZ24nLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ1N1Y2NlZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnYnVpbGQgZnJvbSBhIHVuc2lnbmVkIEFUQSBpbml0IGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfVFgpO1xuICAgICAgICAodHhCdWlsZGVyIGFzIEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcikucmVudEV4ZW1wdEFtb3VudChyZW50QW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGZyb20gYSB1bnNpZ25lZCBBVEEgaW5pdCB3aXRoIG1lbW8gYW5kIHNpZ24gaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5BVEFfSU5JVF9VTlNJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgICAgICAodHhCdWlsZGVyIGFzIEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcikucmVudEV4ZW1wdEFtb3VudChyZW50QW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCBmcm9tIGEgdW5zaWduZWQgQVRBIGluaXQgd2l0aCBkaWZmIG93bmVyIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfRElGRl9PV05FUl9UWCk7XG4gICAgICAgICh0eEJ1aWxkZXIgYXMgQXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyKS5yZW50RXhlbXB0QW1vdW50KHJlbnRBbW91bnQpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICB2ZXJpZnlJbnB1dE91dHB1dEFuZFJhd1RyYW5zYWN0aW9uKHR4LCByYXdUeCwgb3duZXJQdWJrZXlzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BVEFfSU5JVF9TSUdORURfRElGRl9PV05FUl9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGZyb20gYSB1bnNpZ25lZCBBVEEgaW5pdCB3aXRoIGRpZmYgb3duZXIgd2l0aCBtZW1vIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfRElGRl9PV05FUl9UWF9XSVRIX01FTU8pO1xuICAgICAgICAodHhCdWlsZGVyIGFzIEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcikucmVudEV4ZW1wdEFtb3VudChyZW50QW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgsIG93bmVyUHVia2V5cyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuQVRBX0lOSVRfU0lHTkVEX0RJRkZfT1dORVJfVFhfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgZnJvbSBhIHVuc2lnbmVkIEFUQSBpbml0IGZvciBtdWx0aSByZWNpcGllbnRzIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuTVVMVElfQVRBX0lOSVRfVU5TSUdORURfVFgpO1xuICAgICAgICAodHhCdWlsZGVyIGFzIEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcikucmVudEV4ZW1wdEFtb3VudChyZW50QW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5NVUxUSV9BVEFfSU5JVF9TSUdORURfVFgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCBmcm9tIGEgdW5zaWduZWQgQVRBIGluaXQgZm9yIG11bHRpIHJlY2lwaWVudHMgd2l0aCBtZW1vIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuTVVMVElfQVRBX0lOSVRfVU5TSUdORURfVFhfV0lUSF9NRU1PKTtcbiAgICAgICAgKHR4QnVpbGRlciBhcyBBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIpLnJlbnRFeGVtcHRBbW91bnQocmVudEFtb3VudCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuTVVMVElfQVRBX0lOSVRfU0lHTkVEX1RYX1dJVEhfTUVNTyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGZyb20gYSB1bnNpZ25lZCBBVEEgaW5pdCBmb3IgbXVsdGkgcmVjaXBpZW50cyB3aXRoIG1lbW8gYW5kIHNpZ24gaXQgd2l0aCBvcHRpbmFsIHBhcmFtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuTVVMVElfQVRBX0lOSVRfVU5TSUdORURfVFhfV0lUSF9NRU1PX09QVElPTkFMX1BBUkFNKTtcbiAgICAgICAgKHR4QnVpbGRlciBhcyBBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIpLnJlbnRFeGVtcHRBbW91bnQocmVudEFtb3VudCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuTVVMVElfQVRBX0lOSVRfU0lHTkVEX1RYX1dJVEhfTUVNT19PUFRJT05BTF9QQVJBTTEpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCBmcm9tIGEgdW5zaWduZWQgcmF3IHRva2VuIHRyYW5zZmVyIHdpdGggb3B0aW5hbCBwYXJhbScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKFxuICAgICAgICAgIHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSX1VOU0lHTkVEX1dJVEhfQ1JFQVRFX0FUQV9BTkRfTUVNT19BTkRfRFVSQUJMRV9OT05DRV9XSVRIX09QVElPTkFMX1BBUkFNU1xuICAgICAgICApIGFzIFRva2VuVHJhbnNmZXJCdWlsZGVyO1xuXG4gICAgICAgICh0eEJ1aWxkZXIgYXMgYW55KS5fc2VuZFBhcmFtc1swXS50b2tlbk5hbWUgPSAndHNvbDphbXMnO1xuICAgICAgICAodHhCdWlsZGVyIGFzIGFueSkuX2NyZWF0ZUF0YVBhcmFtc1swXS50b2tlbk5hbWUgPSAndHNvbDphbXMnO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgcmF3VHgsXG4gICAgICAgICAgdGVzdERhdGEuVE9LRU5fVFJBTlNGRVJfVU5TSUdORURfV0lUSF9DUkVBVEVfQVRBX0FORF9NRU1PX0FORF9EVVJBQkxFX05PTkNFX1dJVEhfT1BUSU9OQUxfUEFSQU1TXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGZyb20gYW4gdW5zaWduZWQgQVRBIGluaXQgd2l0aCBkdXJhYmxlIG5vbmNlIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfVFhfRFVSQUJMRV9OT05DRSk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BVEFfSU5JVF9TSUdORURfVFhfRFVSQUJMRV9OT05DRSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdGYWlsJywgKCkgPT4ge1xuICAgICAgaXQoJ2J1aWxkIGZyb20gYSB1bnNpZ25lZCBBVEEgaW5pdCBhbmQgZmFpbCB0byBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfVFgpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd3JvbmdBY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgndW5rbm93biBzaWduZXI6IENQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdidWlsZCBmcm9tIGEgc2lnbmVkIEFUQSBpbml0IGFuZCBmYWlsIHRvIHNpZ24gaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5BVEFfSU5JVF9TSUdORURfVFgpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd3JvbmdBY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgndW5rbm93biBzaWduZXI6IENQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=customInstructionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customInstructionBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/customInstructionBuilder.ts"],"names":[],"mappings":""}