@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,2399 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const should_1 = __importDefault(require("should"));
40
+ const sdk_test_1 = require("@bitgo/sdk-test");
41
+ const sdk_api_1 = require("@bitgo/sdk-api");
42
+ const src_1 = require("../../src");
43
+ const testData = __importStar(require("../resources/sui"));
44
+ const lodash_1 = __importDefault(require("lodash"));
45
+ const sinon_1 = __importDefault(require("sinon"));
46
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
47
+ const assert_1 = __importDefault(require("assert"));
48
+ const iface_1 = require("../../src/lib/iface");
49
+ const getBuilderFactory_1 = require("./getBuilderFactory");
50
+ const sui_1 = require("../resources/sui");
51
+ const buffer_1 = require("buffer");
52
+ const sdk_core_1 = require("@bitgo/sdk-core");
53
+ const nock_1 = __importDefault(require("nock"));
54
+ describe('SUI:', function () {
55
+ let bitgo;
56
+ let basecoin;
57
+ let newTxPrebuild;
58
+ let newTxParams;
59
+ const txPrebuild = {
60
+ txHex: buffer_1.Buffer.from(testData.TRANSFER, 'base64').toString('hex'),
61
+ txInfo: {},
62
+ };
63
+ const txParams = {
64
+ recipients: testData.recipients,
65
+ };
66
+ before(function () {
67
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
68
+ bitgo.safeRegister('sui', src_1.Sui.createInstance);
69
+ bitgo.safeRegister('tsui', src_1.Tsui.createInstance);
70
+ bitgo.initializeTestVars();
71
+ basecoin = bitgo.coin('tsui');
72
+ newTxPrebuild = () => {
73
+ return lodash_1.default.cloneDeep(txPrebuild);
74
+ };
75
+ newTxParams = () => {
76
+ return lodash_1.default.cloneDeep(txParams);
77
+ };
78
+ });
79
+ it('should return the right info', function () {
80
+ const sui = bitgo.coin('sui');
81
+ const tsui = bitgo.coin('tsui');
82
+ sui.getChain().should.equal('sui');
83
+ sui.getFamily().should.equal('sui');
84
+ sui.getFullName().should.equal('Sui');
85
+ sui.getBaseFactor().should.equal(1e9);
86
+ tsui.getChain().should.equal('tsui');
87
+ tsui.getFamily().should.equal('sui');
88
+ tsui.getFullName().should.equal('Testnet Sui');
89
+ tsui.getBaseFactor().should.equal(1e9);
90
+ });
91
+ describe('Verify transaction: ', () => {
92
+ it('should succeed to verify transaction', async function () {
93
+ const txPrebuild = newTxPrebuild();
94
+ const txParams = newTxParams();
95
+ const verification = {};
96
+ const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
97
+ isTransactionVerified.should.equal(true);
98
+ });
99
+ it('should succeed to verify transaction when recipients amount are numbers', async function () {
100
+ const txPrebuild = newTxPrebuild();
101
+ const txParamsWithNumberAmounts = newTxParams();
102
+ txParamsWithNumberAmounts.recipients = txParamsWithNumberAmounts.recipients.map(({ address, amount }) => {
103
+ return { address, amount: Number(amount) };
104
+ });
105
+ const verification = {};
106
+ const isTransactionVerified = await basecoin.verifyTransaction({
107
+ txParams: txParamsWithNumberAmounts,
108
+ txPrebuild,
109
+ verification,
110
+ });
111
+ isTransactionVerified.should.equal(true);
112
+ });
113
+ it('should fail to verify transaction with invalid param', async function () {
114
+ const txPrebuild = {};
115
+ const txParams = newTxParams();
116
+ txParams.recipients = undefined;
117
+ await basecoin
118
+ .verifyTransaction({
119
+ txParams,
120
+ txPrebuild,
121
+ })
122
+ .should.rejectedWith('missing required tx prebuild property txHex');
123
+ });
124
+ it('should verify a split transaction', async function () {
125
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsui');
126
+ const txBuilder = factory.getTransferBuilder();
127
+ txBuilder.type(iface_1.SuiTransactionType.Transfer);
128
+ txBuilder.sender(testData.sender.address);
129
+ const amount = 1000000000;
130
+ const recipients = new Array(100).fill({ address: testData.sender.address, amount: amount.toString() });
131
+ txBuilder.send(recipients);
132
+ txBuilder.gasData(testData.gasData);
133
+ const tx = await txBuilder.build();
134
+ const txPrebuild = {
135
+ txHex: buffer_1.Buffer.from(tx.toBroadcastFormat(), 'base64').toString('hex'),
136
+ txInfo: {},
137
+ };
138
+ const txParams = {
139
+ recipients,
140
+ };
141
+ const verify = await basecoin.verifyTransaction({
142
+ txParams,
143
+ txPrebuild,
144
+ });
145
+ verify.should.equal(true);
146
+ });
147
+ it('should fail to verify a spoofed consolidation transaction', async function () {
148
+ // Set up wallet data
149
+ const walletData = {
150
+ id: '62e156dbd641c000076bbabe04041a90',
151
+ coin: 'tsui',
152
+ keys: [
153
+ '5b3424f91bf349930e34017500000000',
154
+ '5b3424f91bf349930e34017600000000',
155
+ '5b3424f91bf349930e34017700000000',
156
+ ],
157
+ coinSpecific: {
158
+ rootAddress: '0x6f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd8',
159
+ },
160
+ multisigType: 'tss',
161
+ };
162
+ const consolidationTx = {
163
+ txRequestId: '13857c1a-9b61-4b85-96f1-10af125f68a0',
164
+ walletId: '644c3d6c5232f00007680040',
165
+ txHex: '0000020008e6e6753b0000000000206f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd80202000101000001010200000101001670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddad01222b818b450dcd2164b25ba5a57b0507e59a4c8eb6d7cadd08ea609db17c611d4e12d014000000002023fc27576626762904339b0abe1ff99c99799c93bea46e8bf452f23c68992db11670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddade8030000000000001ae324000000000000',
166
+ feeInfo: {
167
+ fee: 2417434,
168
+ feeString: '2417434',
169
+ },
170
+ txInfo: {
171
+ minerFee: '2417434',
172
+ spendAmount: '997582566',
173
+ spendAmounts: [
174
+ {
175
+ coinName: 'tsui',
176
+ amountString: '997582566',
177
+ },
178
+ ],
179
+ payGoFee: '0',
180
+ outputs: [
181
+ {
182
+ address: '0x6f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd8',
183
+ value: 997582566,
184
+ wallet: '644c3d6c5232f00007680040',
185
+ wallets: ['644c3d6c5232f00007680040'],
186
+ enterprise: '62cc59b727443a0007089033',
187
+ enterprises: ['62cc59b727443a0007089033'],
188
+ valueString: '997582566',
189
+ coinName: 'tsui',
190
+ walletType: 'hot',
191
+ walletTypes: ['hot'],
192
+ },
193
+ ],
194
+ inputs: [
195
+ {
196
+ value: 997582566,
197
+ address: '0x1670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddad',
198
+ valueString: '997582566',
199
+ },
200
+ ],
201
+ type: 'Transfer',
202
+ },
203
+ consolidateId: '68b648892ee9355c97e4b96d0945b2ca',
204
+ coin: 'tsui',
205
+ };
206
+ const bgUrl = sdk_core_1.common.Environments['mock'].uri;
207
+ const walletObj = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
208
+ (0, nock_1.default)(bgUrl)
209
+ .post('/api/v2/tsui/wallet/62e156dbd641c000076bbabe04041a90/consolidateAccount/build')
210
+ .reply(200, [
211
+ {
212
+ ...consolidationTx,
213
+ txHex: '000002000800e1f5050000000000208771273969acf0356ed0f33c1c52b109bbfe0de3369e9fb9837d52a5a438c6500202000101000001010200000101006f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd80122de95b31347a2f0d9715c560dfdfc8fd351782ca5e275d4bc3a98ea78769bce4f12d0140000000020ea639081929603fe2580873f4aa64701746d089f973b0827a222d784e992ee266f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd8e803000000000000a48821000000000000',
214
+ },
215
+ ]);
216
+ (0, nock_1.default)(bgUrl)
217
+ .get('/api/v2/tsui/key/5b3424f91bf349930e34017500000000')
218
+ .reply(200, [
219
+ {
220
+ encryptedPrv: 'fakePrv',
221
+ },
222
+ ]);
223
+ // Call the function to test
224
+ await assert_1.default.rejects(async () => {
225
+ await walletObj.sendAccountConsolidations({
226
+ walletPassphrase: 'password',
227
+ verification: {
228
+ consolidationToBaseAddress: true,
229
+ },
230
+ });
231
+ }, {
232
+ message: 'Consolidation transaction output address does not match wallet base address',
233
+ });
234
+ });
235
+ it('should verify valid a consolidation transaction', async () => {
236
+ // Set up wallet data
237
+ const walletData = {
238
+ id: '62e156dbd641c000076bbabe04041a90',
239
+ coin: 'tsui',
240
+ keys: [
241
+ '5b3424f91bf349930e34017500000000',
242
+ '5b3424f91bf349930e34017600000000',
243
+ '5b3424f91bf349930e34017700000000',
244
+ ],
245
+ coinSpecific: {
246
+ rootAddress: '0x6f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd8',
247
+ },
248
+ multisigType: 'tss',
249
+ };
250
+ const consolidationTx = {
251
+ txRequestId: '13857c1a-9b61-4b85-96f1-10af125f68a0',
252
+ walletId: '644c3d6c5232f00007680040',
253
+ txHex: '0000020008e6e6753b0000000000206f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd80202000101000001010200000101001670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddad01222b818b450dcd2164b25ba5a57b0507e59a4c8eb6d7cadd08ea609db17c611d4e12d014000000002023fc27576626762904339b0abe1ff99c99799c93bea46e8bf452f23c68992db11670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddade8030000000000001ae324000000000000',
254
+ feeInfo: {
255
+ fee: 2417434,
256
+ feeString: '2417434',
257
+ },
258
+ txInfo: {
259
+ minerFee: '2417434',
260
+ spendAmount: '997582566',
261
+ spendAmounts: [
262
+ {
263
+ coinName: 'tsui',
264
+ amountString: '997582566',
265
+ },
266
+ ],
267
+ payGoFee: '0',
268
+ outputs: [
269
+ {
270
+ address: '0x6f0f4e0eef19176628ee0ebc80eef89194afd9e19e59444e64b997f1254f6cd8',
271
+ value: 997582566,
272
+ wallet: '644c3d6c5232f00007680040',
273
+ wallets: ['644c3d6c5232f00007680040'],
274
+ enterprise: '62cc59b727443a0007089033',
275
+ enterprises: ['62cc59b727443a0007089033'],
276
+ valueString: '997582566',
277
+ coinName: 'tsui',
278
+ walletType: 'hot',
279
+ walletTypes: ['hot'],
280
+ },
281
+ ],
282
+ inputs: [
283
+ {
284
+ value: 997582566,
285
+ address: '0x1670472c44b59058032840b94a7fd7405b4b87cbf67f4eb60e1b7781ce03ddad',
286
+ valueString: '997582566',
287
+ },
288
+ ],
289
+ type: 'Transfer',
290
+ },
291
+ consolidateId: '68b648892ee9355c97e4b96d0945b2ca',
292
+ coin: 'tsui',
293
+ };
294
+ try {
295
+ if (!(await basecoin.verifyTransaction({
296
+ blockhash: '',
297
+ feePayer: '',
298
+ txParams: {},
299
+ txPrebuild: consolidationTx,
300
+ walletType: 'tss',
301
+ wallet: new sdk_core_1.Wallet(bitgo, basecoin, walletData),
302
+ verification: {
303
+ consolidationToBaseAddress: true,
304
+ },
305
+ }))) {
306
+ assert_1.default.fail('Transaction should pass verification');
307
+ }
308
+ }
309
+ catch (e) {
310
+ assert_1.default.fail('Transaction should pass verification');
311
+ }
312
+ });
313
+ });
314
+ describe('Explain Transaction: ', () => {
315
+ it('should explain a transfer transaction', async function () {
316
+ const explainedTransaction = await basecoin.explainTransaction({
317
+ txHex: buffer_1.Buffer.from(testData.TRANSFER, 'base64').toString('hex'),
318
+ });
319
+ explainedTransaction.should.deepEqual({
320
+ displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
321
+ id: 'BxoeGXbBCuw6VFEcgwHHUAKrCoAsGanPB39kdVVKZZcR',
322
+ outputs: [
323
+ {
324
+ address: testData.recipients[0].address,
325
+ amount: testData.recipients[0].amount,
326
+ },
327
+ {
328
+ address: testData.recipients[1].address,
329
+ amount: testData.recipients[1].amount,
330
+ },
331
+ ],
332
+ outputAmount: `${testData.AMOUNT * 2}`,
333
+ changeOutputs: [],
334
+ changeAmount: '0',
335
+ fee: { fee: testData.gasData.budget.toString() },
336
+ type: 0,
337
+ });
338
+ });
339
+ it('should explain a split transfer transaction', async function () {
340
+ const explainedTransaction = await basecoin.explainTransaction({
341
+ txHex: '000065000800ca9a3b000000000020574895fe83b409b009e2e0433ad1823ec0d538af7fea52390a198bdfe7676f13000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000c801020001010000010102000001010002000101020001010202000101000200010103000101020400010100020001010400010102060001010002000101050001010208000101000200010106000101020a000101000200010107000101020c000101000200010108000101020e000101000200010109000101021000010100020001010a000101021200010100020001010b000101021400010100020001010c000101021600010100020001010d000101021800010100020001010e000101021a00010100020001010f000101021c000101000200010110000101021e00010100020001011100010102200001010002000101120001010222000101000200010113000101022400010100020001011400010102260001010002000101150001010228000101000200010116000101022a000101000200010117000101022c000101000200010118000101022e000101000200010119000101023000010100020001011a000101023200010100020001011b000101023400010100020001011c000101023600010100020001011d000101023800010100020001011e000101023a00010100020001011f000101023c000101000200010120000101023e00010100020001012100010102400001010002000101220001010242000101000200010123000101024400010100020001012400010102460001010002000101250001010248000101000200010126000101024a000101000200010127000101024c000101000200010128000101024e000101000200010129000101025000010100020001012a000101025200010100020001012b000101025400010100020001012c000101025600010100020001012d000101025800010100020001012e000101025a00010100020001012f000101025c000101000200010130000101025e00010100020001013100010102600001010002000101320001010262000101000200010133000101026400010100020001013400010102660001010002000101350001010268000101000200010136000101026a000101000200010137000101026c000101000200010138000101026e000101000200010139000101027000010100020001013a000101027200010100020001013b000101027400010100020001013c000101027600010100020001013d000101027800010100020001013e000101027a00010100020001013f000101027c000101000200010140000101027e00010100020001014100010102800001010002000101420001010282000101000200010143000101028400010100020001014400010102860001010002000101450001010288000101000200010146000101028a000101000200010147000101028c000101000200010148000101028e000101000200010149000101029000010100020001014a000101029200010100020001014b000101029400010100020001014c000101029600010100020001014d000101029800010100020001014e000101029a00010100020001014f000101029c000101000200010150000101029e00010100020001015100010102a000010100020001015200010102a200010100020001015300010102a400010100020001015400010102a600010100020001015500010102a800010100020001015600010102aa00010100020001015700010102ac00010100020001015800010102ae00010100020001015900010102b000010100020001015a00010102b200010100020001015b00010102b400010100020001015c00010102b600010100020001015d00010102b800010100020001015e00010102ba00010100020001015f00010102bc00010100020001016000010102be00010100020001016100010102c000010100020001016200010102c200010100020001016300010102c400010100020001016400010102c600010100574895fe83b409b009e2e0433ad1823ec0d538af7fea52390a198bdfe7676f1303034f403ff9b73b5794b79a89ebbcd810331fea52878db0b4dc1a1c88f4c0dc5616000000000000002003caf7e677c72b241d61d00e600b6df25639c582987d0aa78ceea0b9953eac52a60b0e51f9ffa398f6ee1d3101d6c9efa13d1800e412d7e0832e2616f1793fd79ce91700000000002050435a49f0635bc2f2c3bbdce05a16b24faf0368edaa25c8fbce16ef62602da5cda44ae47f380f45d3cd4911880f4e9a24b52fe424683c66cf3c7769dd3ca22c1000000000000000200c78fa20236bb86871eacfe2b4f2158eaa68f4f4565d8cf9865ee9f279e4bd40574895fe83b409b009e2e0433ad1823ec0d538af7fea52390a198bdfe7676f13e80300000000000000e1f5050000000000',
342
+ });
343
+ explainedTransaction.outputs.length.should.equal(100);
344
+ });
345
+ it('should explain a staking transaction', async function () {
346
+ const explainedTransaction = await basecoin.explainTransaction({
347
+ txHex: buffer_1.Buffer.from(testData.ADD_STAKE, 'base64').toString('hex'),
348
+ });
349
+ explainedTransaction.should.deepEqual({
350
+ displayOrder: [
351
+ 'id',
352
+ 'outputs',
353
+ 'outputAmount',
354
+ 'changeOutputs',
355
+ 'changeAmount',
356
+ 'fee',
357
+ 'type',
358
+ 'module',
359
+ 'function',
360
+ 'validatorAddress',
361
+ ],
362
+ id: 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh',
363
+ outputs: [
364
+ {
365
+ address: testData.requestAddStake.validatorAddress,
366
+ amount: testData.requestAddStake.amount.toString(),
367
+ },
368
+ ],
369
+ outputAmount: testData.STAKING_AMOUNT.toString(),
370
+ changeOutputs: [],
371
+ changeAmount: '0',
372
+ fee: { fee: testData.gasData.budget.toString() },
373
+ type: 25,
374
+ });
375
+ });
376
+ it('should fail to explain transaction with missing params', async function () {
377
+ try {
378
+ await basecoin.explainTransaction({});
379
+ }
380
+ catch (error) {
381
+ should_1.default.equal(error.message, 'Invalid transaction');
382
+ }
383
+ });
384
+ it('should fail to explain transaction with invalid params', async function () {
385
+ try {
386
+ await basecoin.explainTransaction({ txHex: 'randomString' });
387
+ }
388
+ catch (error) {
389
+ should_1.default.equal(error.message, 'Invalid transaction');
390
+ }
391
+ });
392
+ });
393
+ describe('Parse Transactions: ', () => {
394
+ const transferInputsResponse = [
395
+ {
396
+ address: testData.recipients[0].address,
397
+ amount: new bignumber_js_1.default(testData.AMOUNT).plus(testData.AMOUNT).plus(testData.gasData.budget).toFixed(),
398
+ },
399
+ ];
400
+ const transferOutputsResponse = [
401
+ {
402
+ address: testData.recipients[0].address,
403
+ amount: testData.recipients[0].amount,
404
+ },
405
+ {
406
+ address: testData.recipients[1].address,
407
+ amount: testData.recipients[1].amount,
408
+ },
409
+ ];
410
+ it('should parse a transfer transaction', async function () {
411
+ const parsedTransaction = await basecoin.parseTransaction({
412
+ txHex: buffer_1.Buffer.from(testData.TRANSFER, 'base64').toString('hex'),
413
+ });
414
+ parsedTransaction.should.deepEqual({
415
+ inputs: transferInputsResponse,
416
+ outputs: transferOutputsResponse,
417
+ fee: new bignumber_js_1.default(20000000),
418
+ });
419
+ });
420
+ it('should fail to parse a transfer transaction when explainTransaction response is undefined', async function () {
421
+ const stub = sinon_1.default.stub(src_1.Sui.prototype, 'explainTransaction');
422
+ stub.resolves(undefined);
423
+ await basecoin.parseTransaction({ txHex: testData.TRANSFER }).should.be.rejectedWith('Invalid transaction');
424
+ stub.restore();
425
+ });
426
+ });
427
+ describe('Address Validation', () => {
428
+ let keychains;
429
+ let commonKeychain;
430
+ before(function () {
431
+ commonKeychain =
432
+ '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781';
433
+ keychains = [
434
+ {
435
+ id: '6424c353eaf78d000766e95949868468',
436
+ source: 'user',
437
+ type: 'tss',
438
+ commonKeychain: '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781',
439
+ encryptedPrv: '{"iv":"cZd5i7L4RxtwrALW2rK7UA==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"5zgoH1Bd3Fw=","ct":"9vVlnXFRtrM9FVEo+d2chbGHlM9lFZemueBuAs3BIkPo33Fo7jzwwNK/kIWkEyg+NmEBd5IaqAS157nvvvwzzsmMWlQdUz9qbmXNv3pg987cXFR08exS+4uhwP1YNOjJTRvRNcO9ZqHb46d4fmyJ/yC9/susCge7r/EsbaN5C3afv1dzybuq912FwaQElZLYYp5BICudFOMZ9k0UDMfKM/PMDkH7WexoGHr9GKq/bgCH2B39TZZyHKU6Uy47lXep2s6h0DrMwHOrnmiL3DZjOj88Ynvphlzxuo4eOlD2UHia2+nvIaISYs29Pr0DAvREutchvcBpExj1kWWPv7hQYrv8F0NAdatsbWl3w+xKyfiMKo1USlrwyJviypGtQtXOJyw0XPN0rv2+L5lW8BbjpzHfYYN13fJTedlGTFhhkzVtbbPAKE02kx7zCJcjYaiexdSTsrDLScYNT9/Jhdt27KpsooehwVohLfSKz4vbFfRu2MPZw3/+c/hfiJNgtz6esWbnxGrcE8U2IwPYCaK+Ghk4DcqWNIni59RI5B5kAsQOToII40qPN510uTgxBSPO7q7MHgkxdd4CqBq+ojr9j0P7oao8E5Y+CBDJrojDoCh1oCCDW9vo2dXlVcD8SIbw7U/9AfvEbA4xyE/5md1M7CIwLnWs2Ynv0YtaKoqhdS9x6FmHlMDhN/DKHinrwmowtrTT82fOkpO5g9saSmgU7Qy3gLt8t+VwdEyeFeQUKRSyci8qgqXQaZIg4+aXgaSOnlCFMtmB8ekYxEhTY5uzRfrNgS4s1QeqFBpNtUF+Ydi297pbVXnJoXAN+SVWd80GCx+yI2dpVC89k3rOWK9WeyqlnzuLJWp2RIOB9cdW8GFv/fN+QAJpYeVxOE4+nZDsKnsj8nKcg9t4Dlx1G6gLM1/Vq9YxNLbuzuRC0asUYvdMnoMvszmpm++TxndYisgNYscpZSoz7wvcazJNEPfhPVjEkd6tUUuN4GM35H0DmKCUQNT+a6B6hmHlTZvjxiyGAg5bY59hdjvJ+22QduazlEEC6LI3HrA7uK0TpplWzS1tCIFvTMUhj65DEZmNJ2+ZY9bQ4vsMf+DRR3OOG4t+DMlNfjOd3zNv3QoY95BjfWpryFwPzDq7bCP67JDsoj7j2TY5FRSrRkD77H0Ewlux2cWfjRTwcMHcdQxxuV0OP0aNjGDjybFN"}',
440
+ },
441
+ {
442
+ id: '6424c353eaf78d000766e96137d4404b',
443
+ source: 'backup',
444
+ type: 'tss',
445
+ commonKeychain: '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781',
446
+ encryptedPrv: '{"iv":"vi0dPef/Rx7kG/pRySQi6Q==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"9efhQsiEvVs=","ct":"Gw6atvf6gxKzsjtl3xseipO3rAxp1mAz7Yu1ihFsi5/lf2vMZegApgZx+pyILFS9KKLHbNF3U6WgSYdrr2t4vzdLsXkH1WIxfHS+cd2C5N59yADZDnPJBT6pv/IRvaYelP0Ck3nIYQ2hSMm8op+VOWC/SzHeh7slYDqwEHTGan0Wigfvk1yRd7CCJTaEAomnc/4eFi2NY3X3gt/3opy9IAgknnwUFohn96EWpEQ0F6pbzH/Z8VF6gF+DUcrrByAxExUPnHQZiFk3YHU/vVV4FxBU/mVAE8xBsBn5ul5e5SUMPfc7TBuJWv4BByTNg9xDShF/91Yx2nbfUm5d9QmM8lpKgzzQvcK8POAPk87gRCuKnsGh5vNS0UppkHc+ocfzRQlGA6jze7QyyQO0rMj5Ly8kWjwk2vISvKYHYS1NR7VU549UIXo7NXjatunKSc3+IreoRUHIshiaLg6hl+pxCCuc0qQ43V0mdIfCjTN8gkGWLNk8R7tAGPz9jyapQPcPEGHgEz0ATIi6yMNWCsibS2eLiE1uVEJONoM4lk6FPl3Q2CHbW2MeEbqjY8hbaw18mNb2xSBH/Fwpiial+Tvi2imqgnCO4ZpO9bllKftZPcQy0stN+eGBlb5ufyflKkDSiChHYroGjEpmiFicdde48cJszF52uKNnf1q67fA9/S2FAHQab3EXojxH2Gbk+kkV2h/TYKFFZSWC3vi4e8mO+vjMUcR0AdsgPFyEIz0SCGuba3CnTLNdEuZwsauAeHkx2vUTnRgJPVgNeeuXmsVG76Sy2ggJHuals0Hj8U2Xda0qO1RuFfoCWfss9wn6HGRwPPkhSB/8oNguAqmRVGKkd8Zwt3IvrTd9fk0/rFFDJKGz7WyNHkYgUmNiGcItD12v0jx7FZ52EJzl3Av1RyJUQK18+8EYPh3SGiU9dt7VX0aF0uo6JouKhOeldUvMP+AugQz8fUclwTQsbboVg27Yxo0DyATVwThW5a56R6Qf5ZiQJluFuzs5y98rq0S5q046lE6o3vVmJpEdwjeSCJoET5CL4nTgkXyWvhm4eB8u/e66l3o0qbaSx8q9YYmT9EpRcl5TP4ThLBKETYdzVvg4exjQfektMatk5EyUpEIhZPXh5vXpJZesdfO9LJ8zTaHBsBjDPU7cdNgQMbebpataRi8A0el2/IJXl+E+olgAz5zC4i2O1Q=="}',
447
+ },
448
+ {
449
+ id: '6424c353eaf78d000766e9510b125fba',
450
+ source: 'bitgo',
451
+ type: 'tss',
452
+ commonKeychain: '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781',
453
+ verifiedVssProof: true,
454
+ isBitGo: true,
455
+ },
456
+ ];
457
+ });
458
+ it('should return true when validating a well formatted address', async function () {
459
+ const address = 'f941ae3cbe5645dccc15da8346b533f7f91f202089a5521653c062b2ff10b304';
460
+ basecoin.isValidAddress(address).should.equal(true);
461
+ });
462
+ it('should return true when validating a well formatted address prefixed with 0x', async function () {
463
+ const address = '0xf941ae3cbe5645dccc15da8346b533f7f91f202089a5521653c062b2ff10b304';
464
+ basecoin.isValidAddress(address).should.equal(true);
465
+ });
466
+ it('should return false when validating an old address', async function () {
467
+ const address = '0x2959bfc3fdb7dc23fed8deba2fafb70f3e606a59';
468
+ basecoin.isValidAddress(address).should.equal(false);
469
+ });
470
+ it('should return false when validating an incorrectly formatted', async function () {
471
+ const address = 'wrongaddress';
472
+ basecoin.isValidAddress(address).should.equal(false);
473
+ });
474
+ it('should return true for isWalletAddress with valid address for index 4', async function () {
475
+ const newAddress = '0x8b3c7807730d75792dd6c49732cf9f014d6984a9c77d386bdb1072a9e537d8d8';
476
+ const index = 4;
477
+ const params = { commonKeychain, address: newAddress, index, keychains };
478
+ (await basecoin.isWalletAddress(params)).should.equal(true);
479
+ });
480
+ it('should throw error for isWalletAddress when keychains is missing', async function () {
481
+ const address = '0x2959bfc3fdb7dc23fed8deba2fafb70f3e606a59';
482
+ const index = 0;
483
+ const params = { commonKeychain, address, index };
484
+ await assert_1.default.rejects(async () => basecoin.isWalletAddress(params));
485
+ });
486
+ it('should throw error for isWalletAddress when new address is invalid', async function () {
487
+ const wrongAddress = 'badAddress';
488
+ const index = 0;
489
+ const params = { commonKeychain, address: wrongAddress, index };
490
+ await assert_1.default.rejects(async () => basecoin.isWalletAddress(params), {
491
+ message: `invalid address: ${wrongAddress}`,
492
+ });
493
+ });
494
+ });
495
+ describe('Recover Transactions:', () => {
496
+ const sandBox = sinon_1.default.createSandbox();
497
+ const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
498
+ const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
499
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
500
+ let getBalanceStub;
501
+ let getInputCoinsStub;
502
+ let getFeeEstimateStub;
503
+ beforeEach(() => {
504
+ getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
505
+ getBalanceStub.withArgs(senderAddress0).resolves('1900000000');
506
+ getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
507
+ getInputCoinsStub.withArgs(senderAddress0).resolves([
508
+ {
509
+ coinType: '0x2::sui::SUI',
510
+ objectId: '0xc05c765e26e6ae84c78fa245f38a23fb20406a5cf3f61b57bd323a0df9d98003',
511
+ version: '195',
512
+ digest: '7BJLb32LKN7wt5uv4xgXW4AbFKoMNcPE76o41TQEvUZb',
513
+ balance: new bignumber_js_1.default('1900000000'),
514
+ },
515
+ ]);
516
+ getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
517
+ getFeeEstimateStub
518
+ .withArgs('AAACAAgA0klrAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQCR8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdowHAXHZeJuauhMePokXziiP7IEBqXPP2G1e9MjoN+dmAA8MAAAAAAAAAIFvJiJBdEAhi14cxcSr/HUIhBZMbLMd4rczUTCMIb3UmkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaPoAwAAAAAAAADh9QUAAAAAAA==')
519
+ .resolves(new bignumber_js_1.default(1997880));
520
+ });
521
+ afterEach(() => {
522
+ sandBox.restore();
523
+ });
524
+ it('should recover a txn for non-bitgo recovery', async function () {
525
+ const res = await basecoin.recover({
526
+ userKey: sui_1.keys.userKey,
527
+ backupKey: sui_1.keys.backupKey,
528
+ bitgoKey: sui_1.keys.bitgoKey,
529
+ recoveryDestination,
530
+ walletPassphrase,
531
+ });
532
+ res.should.not.be.empty();
533
+ res.should.hasOwnProperty('transactions');
534
+ const tx = res.transactions[0];
535
+ tx.scanIndex.should.equal(0);
536
+ tx.recoveryAmount.should.equal('1897802332');
537
+ tx.serializedTx.should.equal('AAACAAhcKh5xAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQCR8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdowHAXHZeJuauhMePokXziiP7IEBqXPP2G1e9MjoN+dmAA8MAAAAAAAAAIFvJiJBdEAhi14cxcSr/HUIhBZMbLMd4rczUTCMIb3UmkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaPoAwAAAAAAAKSIIQAAAAAAAA==');
538
+ const NonBitGoTxnDeserialize = new src_1.TransferTransaction(basecoin);
539
+ NonBitGoTxnDeserialize.fromRawTransaction(tx.serializedTx);
540
+ const NonBitGoTxnJson = NonBitGoTxnDeserialize.toJson();
541
+ should_1.default.equal(NonBitGoTxnJson.id, 'FDCBUNqLUAW4qBTnFjTCPZazL8VnRBP2gS3GmEnwtEcg');
542
+ should_1.default.equal(NonBitGoTxnJson.sender, senderAddress0);
543
+ sandBox.assert.callCount(basecoin.getBalance, 1);
544
+ sandBox.assert.callCount(basecoin.getInputCoins, 1);
545
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
546
+ });
547
+ it('should recover a txn for unsigned sweep recovery', async function () {
548
+ const res = await basecoin.recover({
549
+ bitgoKey: sui_1.keys.bitgoKey,
550
+ recoveryDestination,
551
+ });
552
+ res.should.deepEqual({
553
+ txRequests: [
554
+ {
555
+ transactions: [
556
+ {
557
+ unsignedTx: {
558
+ serializedTx: '00000200085c2a1e7100000000002000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e38902020001010000010102000001010091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da301c05c765e26e6ae84c78fa245f38a23fb20406a5cf3f61b57bd323a0df9d98003c300000000000000205bc988905d100862d78731712aff1d422105931b2cc778adccd44c23086f752691f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3e803000000000000a48821000000000000',
559
+ scanIndex: 0,
560
+ coin: 'tsui',
561
+ signableHex: '873748a31e766f5f8f0077d8d0003548fae4f4c1344067a7c3799cfa73808fb7',
562
+ derivationPath: 'm/0',
563
+ parsedTx: {
564
+ inputs: [
565
+ {
566
+ address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
567
+ valueString: '1897802332',
568
+ value: new bignumber_js_1.default(1897802332),
569
+ },
570
+ ],
571
+ outputs: [
572
+ {
573
+ address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
574
+ valueString: '1897802332',
575
+ coinName: 'tsui',
576
+ },
577
+ ],
578
+ spendAmount: '1897802332',
579
+ type: 'Transfer',
580
+ },
581
+ feeInfo: { fee: 2197668, feeString: '2197668' },
582
+ coinSpecific: {
583
+ commonKeychain: '3b89eec9d2d2f3b049ecda2e7b5f47827f7927fe6618d6e8b13f64e7c95f4b00b9577ab01395ecf8eeb804b590cedae14ff5fd3947bf3b7a95b9327c49e27c54',
584
+ },
585
+ },
586
+ signatureShares: [],
587
+ },
588
+ ],
589
+ walletCoin: 'tsui',
590
+ },
591
+ ],
592
+ });
593
+ const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
594
+ const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
595
+ const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
596
+ unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
597
+ const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
598
+ should_1.default.equal(unsignedSweepTxnJson.id, 'FDCBUNqLUAW4qBTnFjTCPZazL8VnRBP2gS3GmEnwtEcg');
599
+ should_1.default.equal(unsignedSweepTxnJson.sender, senderAddress0);
600
+ sandBox.assert.callCount(basecoin.getBalance, 1);
601
+ sandBox.assert.callCount(basecoin.getInputCoins, 1);
602
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
603
+ });
604
+ it('should recover a txn for unsigned sweep recovery with multiple input coins', async function () {
605
+ const senderAddress = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
606
+ getBalanceStub.withArgs(senderAddress).resolves('1798002120');
607
+ getInputCoinsStub.withArgs(senderAddress).resolves([
608
+ {
609
+ coinType: '0x2::sui::SUI',
610
+ objectId: '0x60aefaffa35daa32a1e561f2ba9c18753057d2feb502f32804e573ea2875a39c',
611
+ version: '195',
612
+ digest: 'jKjduy8gHDE244ZJWcP3JXfXPKjqY67avMqhzHw98CL',
613
+ balance: new bignumber_js_1.default('98002120'),
614
+ },
615
+ {
616
+ coinType: '0x2::sui::SUI',
617
+ objectId: '0x9a363c91d29b50832ab98094b6c1933941280fc298a2ec232739f14ce31e2582',
618
+ version: '197',
619
+ digest: 'ELnbgmW7crPYr3B9pWVqfg9uLeJt43KPofkfdR6LWftu',
620
+ balance: new bignumber_js_1.default('1700000000'),
621
+ },
622
+ ]);
623
+ getFeeEstimateStub
624
+ .withArgs('AAACAAjIdDVlAAAAAAAgMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8wCAgABAQAAAQECAAABAQAA5OqmopH+ApGEUuZFtWU80mCl/A+zX2GT1YCRaqnjiQKaNjyR0ptQgyq5gJS2wZM5QSgPwpii7CMnOfFM4x4lgsUAAAAAAAAAIMY5hfUFzuMVaY3+LwmZTvypRSAJRLNXocRYR9yKalXyYK76/6NdqjKh5WHyupwYdTBX0v61AvMoBOVz6ih1o5zDAAAAAAAAACAK15PtO6gwSNx0bHksVJOcN96AYyc+3YVpJzaYMMhHbQDk6qaikf4CkYRS5kW1ZTzSYKX8D7NfYZPVgJFqqeOJ6AMAAAAAAAAA4fUFAAAAAAA=')
625
+ .resolves(new bignumber_js_1.default(1997880));
626
+ const res = await basecoin.recover({
627
+ bitgoKey: '7d91f69c285c0b3b0a0d6371020f194d45956ee556289e7854f6d114e07805720eec673c6a2\n72b7da4137db7b1289f38af4f4b824ef0de65c5f53e3e66617617',
628
+ recoveryDestination: '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc',
629
+ });
630
+ res.should.deepEqual({
631
+ txRequests: [
632
+ {
633
+ transactions: [
634
+ {
635
+ unsignedTx: {
636
+ serializedTx: '000002000824cd096b00000000002032d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc02020001010000010102000001010000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389029a363c91d29b50832ab98094b6c1933941280fc298a2ec232739f14ce31e2582c50000000000000020c63985f505cee315698dfe2f09994efca945200944b357a1c45847dc8a6a55f260aefaffa35daa32a1e561f2ba9c18753057d2feb502f32804e573ea2875a39cc300000000000000200ad793ed3ba83048dc746c792c54939c37de8063273edd856927369830c8476d00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389e803000000000000a48821000000000000',
637
+ scanIndex: 0,
638
+ coin: 'tsui',
639
+ signableHex: '3eec395ccaee7d6a0b9fa5488dd00bfeb89dc4bd37e3139ebebb62c2e60bc00d',
640
+ derivationPath: 'm/0',
641
+ parsedTx: {
642
+ inputs: [
643
+ {
644
+ address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
645
+ valueString: '1795804452',
646
+ value: new bignumber_js_1.default(1795804452),
647
+ },
648
+ ],
649
+ outputs: [
650
+ {
651
+ address: '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc',
652
+ valueString: '1795804452',
653
+ coinName: 'tsui',
654
+ },
655
+ ],
656
+ spendAmount: '1795804452',
657
+ type: 'Transfer',
658
+ },
659
+ feeInfo: { fee: 2197668, feeString: '2197668' },
660
+ coinSpecific: {
661
+ commonKeychain: '7d91f69c285c0b3b0a0d6371020f194d45956ee556289e7854f6d114e07805720eec673c6a272b7da4137db7b1289f38af4f4b824ef0de65c5f53e3e66617617',
662
+ },
663
+ },
664
+ signatureShares: [],
665
+ },
666
+ ],
667
+ walletCoin: 'tsui',
668
+ },
669
+ ],
670
+ });
671
+ const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
672
+ const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
673
+ const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
674
+ unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
675
+ const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
676
+ should_1.default.equal(unsignedSweepTxnJson.id, '7Jyx3KUVXxs1Q2i1RqXtj4hFgUgBon6PUQAovL84Y3eP');
677
+ should_1.default.equal(unsignedSweepTxnJson.sender, senderAddress);
678
+ sandBox.assert.callCount(basecoin.getBalance, 1);
679
+ sandBox.assert.callCount(basecoin.getInputCoins, 1);
680
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
681
+ });
682
+ });
683
+ describe('Recover Token Transactions:', () => {
684
+ const sandBox = sinon_1.default.createSandbox();
685
+ const coinType = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP';
686
+ const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
687
+ const senderAddressColdWallet = '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421';
688
+ const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
689
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
690
+ const tokenContractAddress = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
691
+ let getBalanceStub;
692
+ let getInputCoinsStub;
693
+ let getFeeEstimateStub;
694
+ beforeEach(() => {
695
+ getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
696
+ getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
697
+ getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
698
+ });
699
+ afterEach(() => {
700
+ sandBox.restore();
701
+ });
702
+ it('should recover a token txn for non-bitgo recovery', async function () {
703
+ getBalanceStub.withArgs(senderAddress0, coinType).resolves('1000');
704
+ getInputCoinsStub.withArgs(senderAddress0, coinType).resolves([
705
+ {
706
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
707
+ objectId: '0x924ab69ebba304f2975a588372b41e4e1f5db7fa824868f84199eeb1e0a15a2d',
708
+ version: '34696807',
709
+ digest: '7XRbWQTiwAUCjLLsZVpJMrABCheJBkzKVfCr7aTZZVkd',
710
+ balance: new bignumber_js_1.default(1000),
711
+ },
712
+ ]);
713
+ getInputCoinsStub.withArgs(senderAddress0).resolves([
714
+ {
715
+ coinType: '0x2::sui::SUI',
716
+ objectId: '0x9146928f557cb8ab1915a5886c1362435a05b4709b586bb01d4c70e85bb53161',
717
+ version: '239',
718
+ digest: 'GLSzR6HJ319nPKAFm5x3TWHcaHZzCFSBCqhvZ1qwT5wr',
719
+ balance: new bignumber_js_1.default('1230261076'),
720
+ },
721
+ {
722
+ coinType: '0x2::sui::SUI',
723
+ objectId: '0x93f700dc82e229f699f47b167859c5108288b78f54068800cc290900d0de8429',
724
+ version: '149',
725
+ digest: '2wXDxt2ZxekBxN6oW3BqVDXZcX49C87n1AN26Nyu7kPR',
726
+ balance: new bignumber_js_1.default('169611024'),
727
+ },
728
+ {
729
+ coinType: '0x2::sui::SUI',
730
+ objectId: '0xb869b45744ca2c4a663c6e8679db5a632bead0364273842d3990d7ff65d57b1e',
731
+ version: '237',
732
+ digest: 'F1xWKPVHV5WL72ErjgQxrjn3RNH2GHjyN9jTgwW7Qphk',
733
+ balance: new bignumber_js_1.default('101976'),
734
+ },
735
+ ]);
736
+ getFeeEstimateStub
737
+ .withArgs('AAADAQCSSraeu6ME8pdaWINytB5OH123+oJIaPhBme6x4KFaLWduEQIAAAAAIGDxWv07uqv0hEZiOG0FC/xG830WBmRDZLOLmMp61gdSAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECAJHyXiN7g6AKYnJP3EqB5D9JTca0GhJBSSgm025NEx2jAZFGko9VfLirGRWliGwTYkNaBbRwm1hrsB1McOhbtTFh7wAAAAAAAAAg49q55eJGGM5xtoJzY233UnL2dj1Kb5N90YxZ70QopW2R8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdo+gDAAAAAAAAAOH1BQAAAAAA')
738
+ .resolves(new bignumber_js_1.default(2345504));
739
+ const res = await basecoin.recover({
740
+ userKey: sui_1.keys.userKey,
741
+ backupKey: sui_1.keys.backupKey,
742
+ bitgoKey: sui_1.keys.bitgoKey,
743
+ recoveryDestination,
744
+ walletPassphrase,
745
+ tokenContractAddress,
746
+ });
747
+ res.should.not.be.empty();
748
+ res.should.hasOwnProperty('transactions');
749
+ const tx = res.transactions[0];
750
+ tx.scanIndex.should.equal(0);
751
+ tx.recoveryAmount.should.equal('1000');
752
+ tx.serializedTx.should.equal('AAADAQCSSraeu6ME8pdaWINytB5OH123+oJIaPhBme6x4KFaLWduEQIAAAAAIGDxWv07uqv0hEZiOG0FC/xG830WBmRDZLOLmMp61gdSAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECAJHyXiN7g6AKYnJP3EqB5D9JTca0GhJBSSgm025NEx2jAZFGko9VfLirGRWliGwTYkNaBbRwm1hrsB1McOhbtTFh7wAAAAAAAAAg49q55eJGGM5xtoJzY233UnL2dj1Kb5N90YxZ70QopW2R8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdo+gDAAAAAAAAVl4nAAAAAAAA');
753
+ const NonBitGoTxnDeserialize = new src_1.TokenTransferTransaction(basecoin);
754
+ NonBitGoTxnDeserialize.fromRawTransaction(tx.serializedTx);
755
+ const NonBitGoTxnJson = NonBitGoTxnDeserialize.toJson();
756
+ should_1.default.equal(NonBitGoTxnJson.id, 'DYW9mA8AZGQntk7HGQUEoEdy8BaH8Hh9Ts294EnqGTEr');
757
+ should_1.default.equal(NonBitGoTxnJson.sender, senderAddress0);
758
+ sandBox.assert.callCount(basecoin.getBalance, 2);
759
+ sandBox.assert.callCount(basecoin.getInputCoins, 2);
760
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
761
+ });
762
+ it('should recover a token txn for unsigned sweep recovery', async function () {
763
+ getBalanceStub.withArgs(senderAddressColdWallet).resolves('298980240');
764
+ getBalanceStub.withArgs(senderAddressColdWallet, coinType).resolves('1000');
765
+ getInputCoinsStub.withArgs(senderAddressColdWallet, coinType).resolves([
766
+ {
767
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
768
+ objectId: '0x4c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7',
769
+ version: '34696809',
770
+ digest: 'Afy4LW46tuczj341TbCLeeynxrupj9Lw2qBQUpndHc1c',
771
+ balance: new bignumber_js_1.default(1000),
772
+ },
773
+ ]);
774
+ getInputCoinsStub.withArgs(senderAddressColdWallet).resolves([
775
+ {
776
+ coinType: '0x2::sui::SUI',
777
+ objectId: '0x98114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068',
778
+ version: '34696809',
779
+ digest: 'DBtoqvWtrcYHE1HjQUo4igTkHYxY7D83iHSoKXi9A85W',
780
+ balance: new bignumber_js_1.default(200000000),
781
+ },
782
+ {
783
+ coinType: '0x2::sui::SUI',
784
+ objectId: '0x9ec13440647b0bee74f45409589ad2ff5a18c9615f99d5d914f988b834da493e',
785
+ version: '239',
786
+ digest: '9d3uVsQ4p37TGnzTpnXXw2pFoggbVfVp9CdC4jpZq664',
787
+ balance: new bignumber_js_1.default(98980240),
788
+ },
789
+ ]);
790
+ getFeeEstimateStub
791
+ .withArgs('AAADAQBMHMzG0DUQvXSpX4Gyt9oIEZyxjixWVDXnrXFeaq3Fp2luEQIAAAAAII+0ozS4Kazey/oqMoZCr6JNb5U3QPdoMIDuDks9OpYvAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECAAFkld3adIwRaiGCQoNdNkcJ1sXuXIoe1oTE70M9MUQhAZgRTy3e/j8W2dLgFhlLUsTDr0MMFgG9s1OcvSN8vKBoaW4RAgAAAAAgtRahW1A0vNQkJUQMVkzzb0OVQviGce95nd4GYeeJoAkBZJXd2nSMEWohgkKDXTZHCdbF7lyKHtaExO9DPTFEIegDAAAAAAAAAOH1BQAAAAAA')
792
+ .resolves(new bignumber_js_1.default(2345504));
793
+ const res = await basecoin.recover({
794
+ bitgoKey: sui_1.keys.bitgoKeyColdWallet,
795
+ recoveryDestination,
796
+ tokenContractAddress,
797
+ });
798
+ res.should.deepEqual({
799
+ txRequests: [
800
+ {
801
+ transactions: [
802
+ {
803
+ unsignedTx: {
804
+ serializedTx: '00000301004c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7696e110200000000208fb4a334b829acdecbfa2a328642afa24d6f953740f7683080ee0e4b3d3a962f0008e803000000000000002000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e3890202010000010101000101020000010200016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210198114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068696e11020000000020b516a15b5034bcd42425440c564cf36f439542f88671ef799dde0661e789a009016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000565e27000000000000',
805
+ scanIndex: 0,
806
+ coin: 'tsui:deep',
807
+ signableHex: 'e3547a58b9c48840a2774aeb71b8652a70b67ee59c3fa5b1f743738d8b295199',
808
+ derivationPath: 'm/0',
809
+ parsedTx: {
810
+ inputs: [
811
+ {
812
+ address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
813
+ valueString: '1000',
814
+ value: new bignumber_js_1.default(1000),
815
+ },
816
+ ],
817
+ outputs: [
818
+ {
819
+ address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
820
+ valueString: '1000',
821
+ coinName: 'tsui:deep',
822
+ },
823
+ ],
824
+ spendAmount: '1000',
825
+ type: 'TokenTransfer',
826
+ },
827
+ feeInfo: {
828
+ fee: 2580054,
829
+ feeString: '2580054',
830
+ },
831
+ coinSpecific: {
832
+ commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
833
+ },
834
+ },
835
+ signatureShares: [],
836
+ },
837
+ ],
838
+ walletCoin: 'tsui:deep',
839
+ },
840
+ ],
841
+ });
842
+ const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
843
+ const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
844
+ const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
845
+ unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
846
+ const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
847
+ should_1.default.equal(unsignedSweepTxnJson.id, 'F8wrUjZYf6xvDW2LzW9DohAKyJFcWgGEvjMoKLxCajmV');
848
+ should_1.default.equal(unsignedSweepTxnJson.sender, senderAddressColdWallet);
849
+ sandBox.assert.callCount(basecoin.getBalance, 2);
850
+ sandBox.assert.callCount(basecoin.getInputCoins, 2);
851
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
852
+ });
853
+ it('should recover a token txn for unsigned sweep recovery with multiple input coins', async function () {
854
+ getBalanceStub.withArgs(senderAddressColdWallet).resolves('298980240');
855
+ getBalanceStub.withArgs(senderAddressColdWallet, coinType).resolves('11000');
856
+ getInputCoinsStub.withArgs(senderAddressColdWallet, coinType).resolves([
857
+ {
858
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
859
+ objectId: '0x4c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7',
860
+ version: '34696809',
861
+ digest: 'Afy4LW46tuczj341TbCLeeynxrupj9Lw2qBQUpndHc1c',
862
+ balance: new bignumber_js_1.default('1000'),
863
+ },
864
+ {
865
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
866
+ objectId: '0x72ad99130abd3790db7bac8908d50d3412a800a8fcd10c1cfbd64b8215537558',
867
+ version: '34696865',
868
+ digest: 'X8uaNDkSfYKa6PBzJJUe9StP4nRWR9RZoa2nJHqv5mn',
869
+ balance: new bignumber_js_1.default('10000'),
870
+ },
871
+ ]);
872
+ getInputCoinsStub.withArgs(senderAddressColdWallet).resolves([
873
+ {
874
+ coinType: '0x2::sui::SUI',
875
+ objectId: '0x98114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068',
876
+ version: '34696809',
877
+ digest: 'DBtoqvWtrcYHE1HjQUo4igTkHYxY7D83iHSoKXi9A85W',
878
+ balance: new bignumber_js_1.default('200000000'),
879
+ },
880
+ {
881
+ coinType: '0x2::sui::SUI',
882
+ objectId: '0x9ec13440647b0bee74f45409589ad2ff5a18c9615f99d5d914f988b834da493e',
883
+ version: '239',
884
+ digest: '9d3uVsQ4p37TGnzTpnXXw2pFoggbVfVp9CdC4jpZq664',
885
+ balance: new bignumber_js_1.default('98980240'),
886
+ },
887
+ ]);
888
+ getFeeEstimateStub
889
+ .withArgs('AAAEAQByrZkTCr03kNt7rIkI1Q00EqgAqPzRDBz71kuCFVN1WKFuEQIAAAAAIAe4XTi24bSF8UVZMNJylhCAgcqs12ZMSNfV9IVy7iu9AQBMHMzG0DUQvXSpX4Gyt9oIEZyxjixWVDXnrXFeaq3Fp2luEQIAAAAAII+0ozS4Kazey/oqMoZCr6JNb5U3QPdoMIDuDks9OpYvAAj4KgAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kDAwEAAAEBAQACAQAAAQECAAEBAgEAAQMAAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCEBmBFPLd7+PxbZ0uAWGUtSxMOvQwwWAb2zU5y9I3y8oGhpbhECAAAAACC1FqFbUDS81CQlRAxWTPNvQ5VC+IZx73md3gZh54mgCQFkld3adIwRaiGCQoNdNkcJ1sXuXIoe1oTE70M9MUQh6AMAAAAAAAAA4fUFAAAAAAA=')
890
+ .resolves(new bignumber_js_1.default(1036328));
891
+ const res = await basecoin.recover({
892
+ bitgoKey: sui_1.keys.bitgoKeyColdWallet,
893
+ recoveryDestination,
894
+ tokenContractAddress,
895
+ });
896
+ res.should.deepEqual({
897
+ txRequests: [
898
+ {
899
+ transactions: [
900
+ {
901
+ unsignedTx: {
902
+ serializedTx: '000004010072ad99130abd3790db7bac8908d50d3412a800a8fcd10c1cfbd64b8215537558a16e1102000000002007b85d38b6e1b485f1455930d27296108081caacd7664c48d7d5f48572ee2bbd01004c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7696e110200000000208fb4a334b829acdecbfa2a328642afa24d6f953740f7683080ee0e4b3d3a962f0008f82a000000000000002000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e38903030100000101010002010000010102000101020100010300016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210198114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068696e11020000000020b516a15b5034bcd42425440c564cf36f439542f88671ef799dde0661e789a009016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000f86411000000000000',
903
+ scanIndex: 0,
904
+ coin: 'tsui:deep',
905
+ signableHex: 'cd028c401f815dab7f6c5e8a33976879c5c799ae7c9fde01cafd0aee0075a174',
906
+ derivationPath: 'm/0',
907
+ parsedTx: {
908
+ inputs: [
909
+ {
910
+ address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
911
+ valueString: '11000',
912
+ value: new bignumber_js_1.default('11000'),
913
+ },
914
+ ],
915
+ outputs: [
916
+ {
917
+ address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
918
+ valueString: '11000',
919
+ coinName: 'tsui:deep',
920
+ },
921
+ ],
922
+ spendAmount: '11000',
923
+ type: 'TokenTransfer',
924
+ },
925
+ feeInfo: {
926
+ fee: 1139960,
927
+ feeString: '1139960',
928
+ },
929
+ coinSpecific: {
930
+ commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
931
+ },
932
+ },
933
+ signatureShares: [],
934
+ },
935
+ ],
936
+ walletCoin: 'tsui:deep',
937
+ },
938
+ ],
939
+ });
940
+ const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
941
+ const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
942
+ const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
943
+ unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
944
+ const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
945
+ should_1.default.equal(unsignedSweepTxnJson.id, '4qeXJP7pTa6pmyAKuJZG9AkGsKM53SDqHVcPjRMFHjc5');
946
+ should_1.default.equal(unsignedSweepTxnJson.sender, senderAddressColdWallet);
947
+ sandBox.assert.callCount(basecoin.getBalance, 2);
948
+ sandBox.assert.callCount(basecoin.getInputCoins, 2);
949
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
950
+ });
951
+ });
952
+ describe('Recover Transactions for wallet with multiple addresses:', () => {
953
+ const sandBox = sinon_1.default.createSandbox();
954
+ const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
955
+ const senderAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
956
+ const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
957
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
958
+ beforeEach(function () {
959
+ let callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
960
+ callBack.withArgs(senderAddress0).resolves('0').withArgs(senderAddress1).resolves('1800000000');
961
+ callBack = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
962
+ callBack.withArgs(senderAddress1).resolves([
963
+ {
964
+ coinType: '0x2::sui::SUI',
965
+ objectId: '0xff93adc2f516fcaa0c6040e01f50027a23f9b1767f5040eb2282790a6900ce7f',
966
+ version: '196',
967
+ digest: 'XrjRM9ZM98xdNWigHYQjCpGoWt6aZLpqXdSEixnhb4p',
968
+ balance: new bignumber_js_1.default('1800000000'),
969
+ },
970
+ ]);
971
+ callBack = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
972
+ callBack
973
+ .withArgs('AAACAAgA8VNlAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAH/k63C9Rb8qgxgQOAfUAJ6I/mxdn9QQOsignkKaQDOf8QAAAAAAAAAIAfnp90gMsdBGGz1tW/sFQlArhkRmYjdiXTXx+CvxHjVMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8zoAwAAAAAAAADh9QUAAAAAAA==')
974
+ .resolves(new bignumber_js_1.default(1997880));
975
+ });
976
+ afterEach(function () {
977
+ sandBox.restore();
978
+ });
979
+ it('should recover a txn for non-bitgo recoveries at address 1 but search from address 0', async function () {
980
+ const res = await basecoin.recover({
981
+ userKey: sui_1.keys.userKey,
982
+ backupKey: sui_1.keys.backupKey,
983
+ bitgoKey: sui_1.keys.bitgoKey,
984
+ recoveryDestination,
985
+ walletPassphrase,
986
+ });
987
+ res.should.not.be.empty();
988
+ res.should.hasOwnProperty('transactions');
989
+ const tx = res.transactions[0];
990
+ tx.scanIndex.should.equal(1);
991
+ tx.recoveryAmount.should.equal('1797802332');
992
+ tx.serializedTx.should.equal('AAACAAhcSShrAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAH/k63C9Rb8qgxgQOAfUAJ6I/mxdn9QQOsignkKaQDOf8QAAAAAAAAAIAfnp90gMsdBGGz1tW/sFQlArhkRmYjdiXTXx+CvxHjVMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8zoAwAAAAAAAKSIIQAAAAAAAA==');
993
+ const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
994
+ UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
995
+ const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
996
+ should_1.default.equal(UnsignedSweepTxnJson.id, 'BqHcCR51mqUyi5GJYEED3cw9AgpJ3SraTrt5aE9nLkLj');
997
+ should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
998
+ sandBox.assert.callCount(basecoin.getBalance, 2);
999
+ sandBox.assert.callCount(basecoin.getInputCoins, 1);
1000
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
1001
+ });
1002
+ it('should recover a txn for non-bitgo recoveries at address 1 but search from address 1', async function () {
1003
+ const res = await basecoin.recover({
1004
+ userKey: sui_1.keys.userKey,
1005
+ backupKey: sui_1.keys.backupKey,
1006
+ bitgoKey: sui_1.keys.bitgoKey,
1007
+ recoveryDestination,
1008
+ walletPassphrase,
1009
+ startingScanIndex: 1,
1010
+ });
1011
+ res.should.not.be.empty();
1012
+ res.should.hasOwnProperty('transactions');
1013
+ const tx = res.transactions[0];
1014
+ tx.scanIndex.should.equal(1);
1015
+ tx.recoveryAmount.should.equal('1797802332');
1016
+ tx.serializedTx.should.equal('AAACAAhcSShrAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAH/k63C9Rb8qgxgQOAfUAJ6I/mxdn9QQOsignkKaQDOf8QAAAAAAAAAIAfnp90gMsdBGGz1tW/sFQlArhkRmYjdiXTXx+CvxHjVMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8zoAwAAAAAAAKSIIQAAAAAAAA==');
1017
+ const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
1018
+ UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
1019
+ const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
1020
+ should_1.default.equal(UnsignedSweepTxnJson.id, 'BqHcCR51mqUyi5GJYEED3cw9AgpJ3SraTrt5aE9nLkLj');
1021
+ should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
1022
+ sandBox.assert.callCount(basecoin.getBalance, 1);
1023
+ sandBox.assert.callCount(basecoin.getInputCoins, 1);
1024
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
1025
+ });
1026
+ });
1027
+ describe('Recover Token Transactions for wallet with multiple addresses:', () => {
1028
+ const sandBox = sinon_1.default.createSandbox();
1029
+ const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
1030
+ const senderAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
1031
+ const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
1032
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
1033
+ const packageId = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
1034
+ const coinType = `${packageId}::deep::DEEP`;
1035
+ let getBalanceStub;
1036
+ let getInputCoinsStub;
1037
+ let getFeeEstimateStub;
1038
+ beforeEach(function () {
1039
+ getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
1040
+ getBalanceStub
1041
+ .withArgs(senderAddress0)
1042
+ .resolves('706875692')
1043
+ .withArgs(senderAddress0, coinType)
1044
+ .resolves('0')
1045
+ .withArgs(senderAddress1)
1046
+ .resolves('120101976')
1047
+ .withArgs(senderAddress1, coinType)
1048
+ .resolves('1000');
1049
+ getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
1050
+ getInputCoinsStub.withArgs(senderAddress1, coinType).resolves([
1051
+ {
1052
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
1053
+ objectId: '0xcdba76bdc3f460ed0d6af834fc17b082eb9eabd0b886f9af17cd4291f2f862fa',
1054
+ version: '34696866',
1055
+ digest: '7vbSgaGytATtnQ2fLRQo3VtCwYr9KjxsuxLLMj2dfCsU',
1056
+ balance: new bignumber_js_1.default('1000'),
1057
+ },
1058
+ ]);
1059
+ getInputCoinsStub.withArgs(senderAddress1).resolves([
1060
+ {
1061
+ coinType: '0x2::sui::SUI',
1062
+ objectId: '0x0eca78901e342b2515fbf99be243b3f00ade0a7a50675b37307f44cc195c9046',
1063
+ version: '34696875',
1064
+ digest: 'APE3nj4zYm4hY2Xn9C2n3ynyPiYqxgTRejYT7ParhpU7',
1065
+ balance: new bignumber_js_1.default('120000000'),
1066
+ },
1067
+ {
1068
+ coinType: '0x2::sui::SUI',
1069
+ objectId: '0x761222340db80dd9da144d55098870bc81a788205e0bbdd34c2f8df12cf45aeb',
1070
+ version: '227',
1071
+ digest: '9bwyjaSH3X8anrjGUpD1NqMrLFUtGSCK9LFuLbhjX69E',
1072
+ balance: new bignumber_js_1.default('101976'),
1073
+ },
1074
+ ]);
1075
+ getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
1076
+ getFeeEstimateStub
1077
+ .withArgs('AAADAQDNuna9w/Rg7Q1q+DT8F7CC656r0LiG+a8XzUKR8vhi+qJuEQIAAAAAIGbg2VphuEezzTVLyBTrQGC+GJWMRSV5YJWka7fwmD9LAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGq24RAgAAAAAgi2q2sUgd0frgxWZVkgajJAb1V5f1VzaTrXEYIxkLqDAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAAOH1BQAAAAAA')
1078
+ .resolves(new bignumber_js_1.default(2345504));
1079
+ });
1080
+ afterEach(function () {
1081
+ sandBox.restore();
1082
+ });
1083
+ it('should recover a token txn for non-bitgo recoveries at address 1 but search from address 0', async function () {
1084
+ const res = await basecoin.recover({
1085
+ userKey: sui_1.keys.userKey,
1086
+ backupKey: sui_1.keys.backupKey,
1087
+ bitgoKey: sui_1.keys.bitgoKey,
1088
+ recoveryDestination,
1089
+ walletPassphrase,
1090
+ tokenContractAddress: packageId,
1091
+ });
1092
+ res.should.not.be.empty();
1093
+ res.should.hasOwnProperty('transactions');
1094
+ const tx = res.transactions[0];
1095
+ tx.scanIndex.should.equal(1);
1096
+ tx.recoveryAmount.should.equal('1000');
1097
+ tx.serializedTx.should.equal('AAADAQDNuna9w/Rg7Q1q+DT8F7CC656r0LiG+a8XzUKR8vhi+qJuEQIAAAAAIGbg2VphuEezzTVLyBTrQGC+GJWMRSV5YJWka7fwmD9LAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGq24RAgAAAAAgi2q2sUgd0frgxWZVkgajJAb1V5f1VzaTrXEYIxkLqDAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAVl4nAAAAAAAA');
1098
+ const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
1099
+ UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
1100
+ const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
1101
+ should_1.default.equal(UnsignedSweepTxnJson.id, 'GFuk1VKy3wzTFeAUtrmUe6sxRhtezzrGDfKdpQTxv9so');
1102
+ should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
1103
+ sandBox.assert.callCount(basecoin.getBalance, 4);
1104
+ sandBox.assert.callCount(basecoin.getInputCoins, 2);
1105
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
1106
+ });
1107
+ it('should recover a token txn for non-bitgo recoveries at address 1 but search from address 1', async function () {
1108
+ const res = await basecoin.recover({
1109
+ userKey: sui_1.keys.userKey,
1110
+ backupKey: sui_1.keys.backupKey,
1111
+ bitgoKey: sui_1.keys.bitgoKey,
1112
+ recoveryDestination,
1113
+ walletPassphrase,
1114
+ tokenContractAddress: packageId,
1115
+ startingScanIndex: 1,
1116
+ });
1117
+ res.should.not.be.empty();
1118
+ res.should.hasOwnProperty('transactions');
1119
+ const tx = res.transactions[0];
1120
+ tx.scanIndex.should.equal(1);
1121
+ tx.recoveryAmount.should.equal('1000');
1122
+ tx.serializedTx.should.equal('AAADAQDNuna9w/Rg7Q1q+DT8F7CC656r0LiG+a8XzUKR8vhi+qJuEQIAAAAAIGbg2VphuEezzTVLyBTrQGC+GJWMRSV5YJWka7fwmD9LAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGq24RAgAAAAAgi2q2sUgd0frgxWZVkgajJAb1V5f1VzaTrXEYIxkLqDAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAVl4nAAAAAAAA');
1123
+ const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
1124
+ UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
1125
+ const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
1126
+ should_1.default.equal(UnsignedSweepTxnJson.id, 'GFuk1VKy3wzTFeAUtrmUe6sxRhtezzrGDfKdpQTxv9so');
1127
+ should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
1128
+ sandBox.assert.callCount(basecoin.getBalance, 2);
1129
+ sandBox.assert.callCount(basecoin.getInputCoins, 2);
1130
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
1131
+ });
1132
+ });
1133
+ describe('Recover Consolidation Transactions', () => {
1134
+ const sandBox = sinon_1.default.createSandbox();
1135
+ const receiveAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
1136
+ const receiveAddress2 = '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c';
1137
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
1138
+ const seedReceiveAddress1 = '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a';
1139
+ const seedReceiveAddress2 = '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9';
1140
+ beforeEach(function () {
1141
+ let callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
1142
+ callBack
1143
+ .withArgs(receiveAddress1)
1144
+ .resolves('200101976')
1145
+ .withArgs(receiveAddress2)
1146
+ .resolves('200000000')
1147
+ .withArgs(seedReceiveAddress1)
1148
+ .resolves('500000000')
1149
+ .withArgs(seedReceiveAddress2)
1150
+ .resolves('200000000');
1151
+ callBack = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
1152
+ callBack
1153
+ .withArgs(receiveAddress1)
1154
+ .resolves([
1155
+ {
1156
+ coinType: '0x2::sui::SUI',
1157
+ objectId: '0x996aab365d4551b6d1274f520bbfa7b0a566d548b2d590b5565c623812e7e76d',
1158
+ version: '201',
1159
+ digest: 'HXpNTfx9TBdxFcXHi4RziZsQuDAHavRasK6Ri15rVwuA',
1160
+ balance: new bignumber_js_1.default('200000000'),
1161
+ },
1162
+ {
1163
+ coinType: '0x2::sui::SUI',
1164
+ objectId: '0xb39c5f380208cce7fe1ba1258c8d19befb02a80f14952617ed37098dbd4d2df0',
1165
+ version: '199',
1166
+ digest: 'mqk37hXLkiUYgkYxk2MyqNykCkCXwe97uMus7bDPhe2',
1167
+ balance: new bignumber_js_1.default('101976'),
1168
+ },
1169
+ ])
1170
+ .withArgs(receiveAddress2)
1171
+ .resolves([
1172
+ {
1173
+ coinType: '0x2::sui::SUI',
1174
+ objectId: '0xfa04105eedebdabf729dccecf01d0cf5f1b770892fac2ed8f1e69d71a32a2d24',
1175
+ version: '202',
1176
+ digest: 'DeApRVSrTa9ttXvNyLexT4PJcAkyyxSpi3JQeUg4ua8Q',
1177
+ balance: new bignumber_js_1.default('200000000'),
1178
+ },
1179
+ ])
1180
+ .withArgs(seedReceiveAddress1)
1181
+ .resolves([
1182
+ {
1183
+ coinType: '0x2::sui::SUI',
1184
+ objectId: '0x86e728fd7242b3be60e9c1941add2c47fb655779108c3500a216310218748e2d',
1185
+ version: '147',
1186
+ digest: '6PJeyEX4L8RkjsNaF5GSMCwRjmFGYrQB7fbmJPFMMPHL',
1187
+ balance: '500000000',
1188
+ },
1189
+ ])
1190
+ .withArgs(seedReceiveAddress2)
1191
+ .resolves([
1192
+ {
1193
+ coinType: '0x2::sui::SUI',
1194
+ objectId: '0xfd66dbfe7a1497f210747b0532f62e6926cb144c75e519f2dfff17a4f6e515fc',
1195
+ version: '148',
1196
+ digest: 'PJ3jfS1ERShSMtFWZgma4h6duWX8nm5Bei1z3BszyBk',
1197
+ balance: '200000000',
1198
+ },
1199
+ ]);
1200
+ callBack = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
1201
+ callBack
1202
+ .withArgs('AAACAAhYb/cFAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAKZaqs2XUVRttEnT1ILv6ewpWbVSLLVkLVWXGI4EufnbckAAAAAAAAAIPWf+f1EklW1ggi3rwo5Jw3Lftu9W/UsyrZrI0FYsBTZs5xfOAIIzOf+G6EljI0ZvvsCqA8UlSYX7TcJjb1NLfDHAAAAAAAAACALfKsZ4T9Y2y1rrlBxQQ2BouS9VFjBgVfvbbFf9U+f8zLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/M6AMAAAAAAAAA4fUFAAAAAAA=')
1203
+ .resolves(new bignumber_js_1.default('1019760'))
1204
+ .withArgs('AAACAAgA4fUFAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQDfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHAH6BBBe7evav3KdzOzwHQz18bdwiS+sLtjx5p1xoyotJMoAAAAAAAAAILvR1XjlKKylRGh9pX4UpBFBsCv5At6RBn+XXDAbnfRB30B+PiXpQA+Xeax1cVN8I2FoQZTxql2xJqj1dLXthRzoAwAAAAAAAADh9QUAAAAAAA==')
1205
+ .resolves(new bignumber_js_1.default('1997880'))
1206
+ .withArgs('AAACAAgAhNcXAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgABAQAAAQECAAABAQDSAVZuagvAIP0ub3LpveIiP1UNZNqmE5jNkXwvdQEySgGG5yj9ckKzvmDpwZQa3SxH+2VXeRCMNQCiFjECGHSOLZMAAAAAAAAAIFABLLLjMJc51R0P8DHy0PbXwsYUD0b5gvVmiZsupafr0gFWbmoLwCD9Lm9y6b3iIj9VDWTaphOYzZF8L3UBMkroAwAAAAAAAADh9QUAAAAAAA==')
1207
+ .resolves(new bignumber_js_1.default('1997880'))
1208
+ .withArgs('AAACAAgA4fUFAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgABAQAAAQECAAABAQAvpdg5S9a+xVJblVC/Q74HW4NCLQEHwFxwCUTj6uwm+QH9Ztv+ehSX8hB0ewUy9i5pJssUTHXlGfLf/xek9uUV/JQAAAAAAAAAIAW2DZdVWJ9ENnvL4Z2POOHfK2Z74DgSgDQci60MdQuXL6XYOUvWvsVSW5VQv0O+B1uDQi0BB8BccAlE4+rsJvnoAwAAAAAAAADh9QUAAAAAAA==')
1209
+ .resolves(new bignumber_js_1.default('1997880'));
1210
+ });
1211
+ afterEach(function () {
1212
+ sandBox.restore();
1213
+ });
1214
+ it('should build signed consolidation transactions for hot wallet', async function () {
1215
+ const res = await basecoin.recoverConsolidations({
1216
+ userKey: sui_1.keys.userKey,
1217
+ backupKey: sui_1.keys.backupKey,
1218
+ bitgoKey: sui_1.keys.bitgoKey,
1219
+ walletPassphrase,
1220
+ startingScanIndex: 1,
1221
+ endingScanIndex: 3,
1222
+ });
1223
+ const transactions = res.transactions;
1224
+ transactions.length.should.equal(2);
1225
+ const txn1 = transactions[0];
1226
+ txn1.scanIndex.should.equal(1);
1227
+ txn1.recoveryAmount.should.equal('198980240');
1228
+ txn1.serializedTx.should.equal('AAACAAiQMtwLAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAKZaqs2XUVRttEnT1ILv6ewpWbVSLLVkLVWXGI4EufnbckAAAAAAAAAIPWf+f1EklW1ggi3rwo5Jw3Lftu9W/UsyrZrI0FYsBTZs5xfOAIIzOf+G6EljI0ZvvsCqA8UlSYX7TcJjb1NLfDHAAAAAAAAACALfKsZ4T9Y2y1rrlBxQQ2BouS9VFjBgVfvbbFf9U+f8zLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/M6AMAAAAAAADIHREAAAAAAAA=');
1229
+ const txn2 = transactions[1];
1230
+ txn2.scanIndex.should.equal(2);
1231
+ txn2.recoveryAmount.should.equal('197802332');
1232
+ txn2.serializedTx.should.equal('AAACAAhcOcoLAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQDfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHAH6BBBe7evav3KdzOzwHQz18bdwiS+sLtjx5p1xoyotJMoAAAAAAAAAILvR1XjlKKylRGh9pX4UpBFBsCv5At6RBn+XXDAbnfRB30B+PiXpQA+Xeax1cVN8I2FoQZTxql2xJqj1dLXthRzoAwAAAAAAAKSIIQAAAAAAAA==');
1233
+ res.lastScanIndex.should.equal(2);
1234
+ sandBox.assert.callCount(basecoin.getBalance, 2);
1235
+ sandBox.assert.callCount(basecoin.getInputCoins, 2);
1236
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
1237
+ });
1238
+ it('should build unsigned consolidation transactions for cold wallet', async function () {
1239
+ const res = await basecoin.recoverConsolidations({
1240
+ bitgoKey: sui_1.keys.bitgoKey,
1241
+ startingScanIndex: 1,
1242
+ endingScanIndex: 3,
1243
+ });
1244
+ res.should.deepEqual({
1245
+ txRequests: [
1246
+ {
1247
+ transactions: [
1248
+ {
1249
+ unsignedTx: {
1250
+ serializedTx: '00000200089032dc0b00000000002091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da302020001010000010102000001010032d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc02996aab365d4551b6d1274f520bbfa7b0a566d548b2d590b5565c623812e7e76dc90000000000000020f59ff9fd449255b58208b7af0a39270dcb7edbbd5bf52ccab66b234158b014d9b39c5f380208cce7fe1ba1258c8d19befb02a80f14952617ed37098dbd4d2df0c700000000000000200b7cab19e13f58db2d6bae5071410d81a2e4bd5458c18157ef6db15ff54f9ff332d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcce803000000000000c81d11000000000000',
1251
+ scanIndex: 1,
1252
+ coin: 'tsui',
1253
+ signableHex: 'ab84c9d09c678c038439f63fcd40d26535cc1485151257f4f175b6e8a0e94316',
1254
+ derivationPath: 'm/1',
1255
+ parsedTx: {
1256
+ inputs: [
1257
+ {
1258
+ address: '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc',
1259
+ valueString: '198980240',
1260
+ value: new bignumber_js_1.default('198980240'),
1261
+ },
1262
+ ],
1263
+ outputs: [
1264
+ {
1265
+ address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
1266
+ valueString: '198980240',
1267
+ coinName: 'tsui',
1268
+ },
1269
+ ],
1270
+ spendAmount: '198980240',
1271
+ type: 'Transfer',
1272
+ },
1273
+ feeInfo: {
1274
+ fee: 1121736,
1275
+ feeString: '1121736',
1276
+ },
1277
+ coinSpecific: {
1278
+ commonKeychain: '3b89eec9d2d2f3b049ecda2e7b5f47827f7927fe6618d6e8b13f64e7c95f4b00b9577ab01395ecf8eeb804b590cedae14ff5fd3947bf3b7a95b9327c49e27c54',
1279
+ },
1280
+ },
1281
+ signatureShares: [],
1282
+ },
1283
+ ],
1284
+ walletCoin: 'tsui',
1285
+ },
1286
+ {
1287
+ transactions: [
1288
+ {
1289
+ unsignedTx: {
1290
+ serializedTx: '00000200085c39ca0b00000000002091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3020200010100000101020000010100df407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c01fa04105eedebdabf729dccecf01d0cf5f1b770892fac2ed8f1e69d71a32a2d24ca0000000000000020bbd1d578e528aca544687da57e14a41141b02bf902de91067f975c301b9df441df407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851ce803000000000000a48821000000000000',
1291
+ scanIndex: 2,
1292
+ coin: 'tsui',
1293
+ signableHex: '66d650b4c4dedf5ab33c9381ee46140b30bb896cf2c66b7b241cae70d1414f16',
1294
+ derivationPath: 'm/2',
1295
+ parsedTx: {
1296
+ inputs: [
1297
+ {
1298
+ address: '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c',
1299
+ valueString: '197802332',
1300
+ value: new bignumber_js_1.default('197802332'),
1301
+ },
1302
+ ],
1303
+ outputs: [
1304
+ {
1305
+ address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
1306
+ valueString: '197802332',
1307
+ coinName: 'tsui',
1308
+ },
1309
+ ],
1310
+ spendAmount: '197802332',
1311
+ type: 'Transfer',
1312
+ },
1313
+ feeInfo: {
1314
+ fee: 2197668,
1315
+ feeString: '2197668',
1316
+ },
1317
+ coinSpecific: {
1318
+ commonKeychain: '3b89eec9d2d2f3b049ecda2e7b5f47827f7927fe6618d6e8b13f64e7c95f4b00b9577ab01395ecf8eeb804b590cedae14ff5fd3947bf3b7a95b9327c49e27c54',
1319
+ lastScanIndex: 2,
1320
+ },
1321
+ },
1322
+ signatureShares: [],
1323
+ },
1324
+ ],
1325
+ walletCoin: 'tsui',
1326
+ },
1327
+ ],
1328
+ });
1329
+ sandBox.assert.callCount(basecoin.getBalance, 2);
1330
+ sandBox.assert.callCount(basecoin.getInputCoins, 2);
1331
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
1332
+ });
1333
+ it('should build unsigned consolidation transactions for cold wallet with seed', async function () {
1334
+ const res = await basecoin.recoverConsolidations({
1335
+ bitgoKey: sui_1.keys.bitgoKeyWithSeed,
1336
+ startingScanIndex: 1,
1337
+ endingScanIndex: 3,
1338
+ seed: '123',
1339
+ });
1340
+ res.should.deepEqual({
1341
+ txRequests: [
1342
+ {
1343
+ transactions: [
1344
+ {
1345
+ unsignedTx: {
1346
+ serializedTx: '00000200085cdcab1d00000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404020200010100000101020000010100d201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a0186e728fd7242b3be60e9c1941add2c47fb655779108c3500a216310218748e2d93000000000000002050012cb2e3309739d51d0ff031f2d0f6d7c2c6140f46f982f566899b2ea5a7ebd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324ae803000000000000a48821000000000000',
1347
+ scanIndex: 1,
1348
+ coin: 'tsui',
1349
+ signableHex: '6d7a4c4882745707c2cd40b0c57566601a2a4d269f5cb0a692828551212cf452',
1350
+ derivationPath: 'm/999999/94862622/157363509/1',
1351
+ parsedTx: {
1352
+ inputs: [
1353
+ {
1354
+ address: '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a',
1355
+ valueString: '497802332',
1356
+ value: new bignumber_js_1.default(497802332),
1357
+ },
1358
+ ],
1359
+ outputs: [
1360
+ {
1361
+ address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
1362
+ valueString: '497802332',
1363
+ coinName: 'tsui',
1364
+ },
1365
+ ],
1366
+ spendAmount: '497802332',
1367
+ type: 'Transfer',
1368
+ },
1369
+ feeInfo: {
1370
+ fee: 2197668,
1371
+ feeString: '2197668',
1372
+ },
1373
+ coinSpecific: {
1374
+ commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
1375
+ },
1376
+ },
1377
+ signatureShares: [],
1378
+ },
1379
+ ],
1380
+ walletCoin: 'tsui',
1381
+ },
1382
+ {
1383
+ transactions: [
1384
+ {
1385
+ unsignedTx: {
1386
+ serializedTx: '00000200085c39ca0b00000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b24040202000101000001010200000101002fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f901fd66dbfe7a1497f210747b0532f62e6926cb144c75e519f2dfff17a4f6e515fc94000000000000002005b60d9755589f44367bcbe19d8f38e1df2b667be0381280341c8bad0c750b972fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9e803000000000000a48821000000000000',
1387
+ scanIndex: 2,
1388
+ coin: 'tsui',
1389
+ signableHex: '32a00a6d892630467c7d0666390d3b27caaf4aefee3dda9e0c97c3f8bc06bcea',
1390
+ derivationPath: 'm/999999/94862622/157363509/2',
1391
+ parsedTx: {
1392
+ inputs: [
1393
+ {
1394
+ address: '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9',
1395
+ valueString: '197802332',
1396
+ value: new bignumber_js_1.default(197802332),
1397
+ },
1398
+ ],
1399
+ outputs: [
1400
+ {
1401
+ address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
1402
+ valueString: '197802332',
1403
+ coinName: 'tsui',
1404
+ },
1405
+ ],
1406
+ spendAmount: '197802332',
1407
+ type: 'Transfer',
1408
+ },
1409
+ feeInfo: {
1410
+ fee: 2197668,
1411
+ feeString: '2197668',
1412
+ },
1413
+ coinSpecific: {
1414
+ commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
1415
+ lastScanIndex: 2,
1416
+ },
1417
+ },
1418
+ signatureShares: [],
1419
+ },
1420
+ ],
1421
+ walletCoin: 'tsui',
1422
+ },
1423
+ ],
1424
+ });
1425
+ sandBox.assert.callCount(basecoin.getBalance, 2);
1426
+ sandBox.assert.callCount(basecoin.getInputCoins, 2);
1427
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
1428
+ });
1429
+ });
1430
+ describe('Recover Token Consolidation Transactions', () => {
1431
+ const sandBox = sinon_1.default.createSandbox();
1432
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
1433
+ const seedReceiveAddress1 = '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a';
1434
+ const seedReceiveAddress2 = '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9';
1435
+ const packageId = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
1436
+ const coinType = `${packageId}::deep::DEEP`;
1437
+ const hotWalletReceiveAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
1438
+ const hotWalletReceiveAddress2 = '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c';
1439
+ const coldWalletReceiveAddress1 = '0xa992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f';
1440
+ const coldWalletReceiveAddress2 = '0xc3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39';
1441
+ let getBalanceStub;
1442
+ let getInputCoinsStub;
1443
+ let getFeeEstimateStub;
1444
+ beforeEach(function () {
1445
+ getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
1446
+ getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
1447
+ getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
1448
+ });
1449
+ afterEach(function () {
1450
+ sandBox.restore();
1451
+ });
1452
+ it('should build signed token consolidation transactions for hot wallet', async function () {
1453
+ getBalanceStub
1454
+ .withArgs(hotWalletReceiveAddress1)
1455
+ .resolves('116720144')
1456
+ .withArgs(hotWalletReceiveAddress1, coinType)
1457
+ .resolves('1500')
1458
+ .withArgs(hotWalletReceiveAddress2)
1459
+ .resolves('120101976')
1460
+ .withArgs(hotWalletReceiveAddress2, coinType)
1461
+ .resolves('2000');
1462
+ getInputCoinsStub
1463
+ .withArgs(hotWalletReceiveAddress1, coinType)
1464
+ .resolves([
1465
+ {
1466
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
1467
+ objectId: '0x8d2da577227e9b7166dbb9b3cce480968cf549b448c662771d1124d6420bf792',
1468
+ version: '34696878',
1469
+ digest: 'BniWiG3v71ozzRirb3hNKEP16pTu3CpNt3voy1uzgMi9',
1470
+ balance: new bignumber_js_1.default('1500'),
1471
+ },
1472
+ ])
1473
+ .withArgs(hotWalletReceiveAddress1)
1474
+ .resolves([
1475
+ {
1476
+ coinType: '0x2::sui::SUI',
1477
+ objectId: '0x0eca78901e342b2515fbf99be243b3f00ade0a7a50675b37307f44cc195c9046',
1478
+ version: '34696877',
1479
+ digest: 'D8XqJXrkVGoer952GvHBdBDXpof8H4F4pRJJ1wSnESNW',
1480
+ balance: new bignumber_js_1.default('116618168'),
1481
+ },
1482
+ {
1483
+ coinType: '0x2::sui::SUI',
1484
+ objectId: '0x761222340db80dd9da144d55098870bc81a788205e0bbdd34c2f8df12cf45aeb',
1485
+ version: '227',
1486
+ digest: '9bwyjaSH3X8anrjGUpD1NqMrLFUtGSCK9LFuLbhjX69E',
1487
+ balance: new bignumber_js_1.default('101976'),
1488
+ },
1489
+ ])
1490
+ .withArgs(hotWalletReceiveAddress2, coinType)
1491
+ .resolves([
1492
+ {
1493
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
1494
+ objectId: '0x8e18bd14c34e33f81c494f4d6c18d07c686c7f3619682d2066b3f55ecfe707a2',
1495
+ version: '34696868',
1496
+ digest: '6jZFu8PRWLJYPewW7K3o4GLVPYnRyNo3kP6454eLuHZm',
1497
+ balance: new bignumber_js_1.default('2000'),
1498
+ },
1499
+ ])
1500
+ .withArgs(hotWalletReceiveAddress2)
1501
+ .resolves([
1502
+ {
1503
+ coinType: '0x2::sui::SUI',
1504
+ objectId: '0x811a75066134945e3b033f4ac54ec885ec0384f42a80994d88a48d7d18c4260a',
1505
+ version: '236',
1506
+ digest: '32N9ZyferGDEV7PY3ykijVVKhLjEFSL6itqcfRPCy4oW',
1507
+ balance: new bignumber_js_1.default('101976'),
1508
+ },
1509
+ {
1510
+ coinType: '0x2::sui::SUI',
1511
+ objectId: '0xf85a738a30566d558800228f2d5c193a5ca3ddbbddca2a65a48a9332306715cc',
1512
+ version: '34696876',
1513
+ digest: '7gJgCMDEPdQaMeuXZ5CFNonFKMPQyw6k5sT1RpaHEXpe',
1514
+ balance: new bignumber_js_1.default('120000000'),
1515
+ },
1516
+ ]);
1517
+ getFeeEstimateStub
1518
+ .withArgs('AAADAQCNLaV3In6bcWbbubPM5ICWjPVJtEjGYncdESTWQgv3kq5uEQIAAAAAIKBK8Zjq4yz/PTFZLg6jf6gDTsogig63pduXeiKgzMVKAAjcBQAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGrW4RAgAAAAAgtDor6b9EJHOSWdJZCQdLkKpS2cPoBc5b28KpX1rg7lsy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAAOH1BQAAAAAA')
1519
+ .resolves(new bignumber_js_1.default('2345504'))
1520
+ .withArgs('AAADAQCOGL0Uw04z+BxJT01sGNB8aGx/NhloLSBms/Vez+cHoqRuEQIAAAAAIFUxTTQyTKM6bVjeFHHT8KVrV2fgTOCX7Uoevk2r5JPcAAjQBwAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECAN9Afj4l6UAPl3msdXFTfCNhaEGU8apdsSao9XS17YUcAfhac4owVm1ViAAijy1cGTpco9273coqZaSKkzIwZxXMrG4RAgAAAAAgYzfCWiypCmme8IJZhqn5nT8+zoP3S7sfQKfezW99YWvfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHOgDAAAAAAAAAOH1BQAAAAAA')
1521
+ .resolves(new bignumber_js_1.default('2345504'));
1522
+ const res = await basecoin.recoverConsolidations({
1523
+ userKey: sui_1.keys.userKey,
1524
+ backupKey: sui_1.keys.backupKey,
1525
+ bitgoKey: sui_1.keys.bitgoKey,
1526
+ walletPassphrase,
1527
+ tokenContractAddress: packageId,
1528
+ startingScanIndex: 1,
1529
+ endingScanIndex: 3,
1530
+ });
1531
+ const transactions = res.transactions;
1532
+ transactions.length.should.equal(2);
1533
+ const txn1 = transactions[0];
1534
+ txn1.scanIndex.should.equal(1);
1535
+ txn1.recoveryAmount.should.equal('1500');
1536
+ txn1.serializedTx.should.equal('AAADAQCNLaV3In6bcWbbubPM5ICWjPVJtEjGYncdESTWQgv3kq5uEQIAAAAAIKBK8Zjq4yz/PTFZLg6jf6gDTsogig63pduXeiKgzMVKAAjcBQAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGrW4RAgAAAAAgtDor6b9EJHOSWdJZCQdLkKpS2cPoBc5b28KpX1rg7lsy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAVl4nAAAAAAAA');
1537
+ const txn2 = transactions[1];
1538
+ txn2.scanIndex.should.equal(2);
1539
+ txn2.recoveryAmount.should.equal('2000');
1540
+ txn2.serializedTx.should.equal('AAADAQCOGL0Uw04z+BxJT01sGNB8aGx/NhloLSBms/Vez+cHoqRuEQIAAAAAIFUxTTQyTKM6bVjeFHHT8KVrV2fgTOCX7Uoevk2r5JPcAAjQBwAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECAN9Afj4l6UAPl3msdXFTfCNhaEGU8apdsSao9XS17YUcAfhac4owVm1ViAAijy1cGTpco9273coqZaSKkzIwZxXMrG4RAgAAAAAgYzfCWiypCmme8IJZhqn5nT8+zoP3S7sfQKfezW99YWvfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHOgDAAAAAAAAVl4nAAAAAAAA');
1541
+ res.lastScanIndex.should.equal(2);
1542
+ sandBox.assert.callCount(basecoin.getBalance, 4);
1543
+ sandBox.assert.callCount(basecoin.getInputCoins, 4);
1544
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
1545
+ });
1546
+ it('should build unsigned token consolidation transactions for cold wallet', async function () {
1547
+ getBalanceStub
1548
+ .withArgs(coldWalletReceiveAddress1)
1549
+ .resolves('116720144')
1550
+ .withArgs(coldWalletReceiveAddress1, coinType)
1551
+ .resolves('4000')
1552
+ .withArgs(coldWalletReceiveAddress2)
1553
+ .resolves('120101976')
1554
+ .withArgs(coldWalletReceiveAddress2, coinType)
1555
+ .resolves('6000');
1556
+ getInputCoinsStub
1557
+ .withArgs(coldWalletReceiveAddress1, coinType)
1558
+ .resolves([
1559
+ {
1560
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
1561
+ objectId: '0x9e2618685fff38b999355e93a4693c4bd18f68dd6b654ff6555f1f4ad229dcdb',
1562
+ version: '34696876',
1563
+ digest: 'F5iGjs95CnScCtXHFuTJhdZkfLyagWR1Qm1zDH6SngMG',
1564
+ balance: new bignumber_js_1.default('4000'),
1565
+ },
1566
+ ])
1567
+ .withArgs(coldWalletReceiveAddress1)
1568
+ .resolves([
1569
+ {
1570
+ coinType: '0x2::sui::SUI',
1571
+ objectId: '0x8f3f7c8961997327166b1571117ff67232ccd1267ec52a7e973677ba0431ffad',
1572
+ version: '226',
1573
+ digest: 'AWh7tPmS9xmH4a2zYLCG73YDiskCf8uizbLjpCStHhNV',
1574
+ balance: new bignumber_js_1.default('98980240'),
1575
+ },
1576
+ {
1577
+ coinType: '0x2::sui::SUI',
1578
+ objectId: '0x916e35a0ac6b525b7d38a44b667394aaee7cde41dffc876980cfbc8845590cdd',
1579
+ version: '34696878',
1580
+ digest: '14PfNwUvfcR3mNAS1bcNXToaooVLnXQHDdGxPFRJQtY',
1581
+ balance: new bignumber_js_1.default('120000000'),
1582
+ },
1583
+ ])
1584
+ .withArgs(coldWalletReceiveAddress2, coinType)
1585
+ .resolves([
1586
+ {
1587
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
1588
+ objectId: '0xc548c220454d20e0712bd2858b07260c829a1c847f3818b47805961b574813ab',
1589
+ version: '34696877',
1590
+ digest: '8mANdoskG8eLLy7zVU5rmHRAXVHUyJPABfS1mYHSmAYt',
1591
+ balance: new bignumber_js_1.default('6000'),
1592
+ },
1593
+ ])
1594
+ .withArgs(coldWalletReceiveAddress2)
1595
+ .resolves([
1596
+ {
1597
+ coinType: '0x2::sui::SUI',
1598
+ objectId: '0x396ab09ee58fb2c9fbcca887c00ef01a33d5bfe55a5d50514e32a59f948e9a05',
1599
+ version: '234',
1600
+ digest: 'HWKW56dt8BNxSTvXiW7dtDVmM2gxEexFyNVzGj8HPVp4',
1601
+ balance: new bignumber_js_1.default('101976'),
1602
+ },
1603
+ {
1604
+ coinType: '0x2::sui::SUI',
1605
+ objectId: '0xd4bfefa532827d7619a58279a87db81632e267cc48e6b94ab81a4367f02cbefa',
1606
+ version: '34696879',
1607
+ digest: 'GJnp1oXNjVXLcYY6hqRV8Rm7G7obmk3s8Nhj1bFsfkUo',
1608
+ balance: new bignumber_js_1.default('120000000'),
1609
+ },
1610
+ ]);
1611
+ getFeeEstimateStub
1612
+ .withArgs('AAADAQCeJhhoX/84uZk1XpOkaTxL0Y9o3WtlT/ZVXx9K0inc26xuEQIAAAAAINE4mxs1hGMmovTU5dfnFoouWOPdVn0nRDPbuXymALPLAAigDwAAAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgEAAAEBAQABAQIAAAECAKmScJWR3rdHH7MN2g8znberVI0zkaidPx+gxy0gkmdfAZFuNaCsa1JbfTikS2ZzlKrufN5B3/yHaYDPvIhFWQzdrm4RAgAAAAAgAAPVeleb8pMu7o/cp9MwtGsUMwKA28CviO+5N79foNGpknCVkd63Rx+zDdoPM523q1SNM5GonT8foMctIJJnX+gDAAAAAAAAAOH1BQAAAAAA')
1613
+ .resolves(new bignumber_js_1.default('2345504'))
1614
+ .withArgs('AAADAQDFSMIgRU0g4HEr0oWLByYMgpochH84GLR4BZYbV0gTq61uEQIAAAAAIHNR9lF7b7NdhWgutklx5vwLmihijROI6T24ctzx9g6tAAhwFwAAAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgEAAAEBAQABAQIAAAECAMOsKobjW2K/rag/Y4j/J8fdpwks8Lgp0tH0woE+KK45AdS/76Uygn12GaWCeah9uBYy4mfMSOa5SrgaQ2fwLL76r24RAgAAAAAg42350Lqqaanub5TpjJnYlKiupjF2Xc+qgDIoiPOkU6jDrCqG41tiv62oP2OI/yfH3acJLPC4KdLR9MKBPiiuOegDAAAAAAAAAOH1BQAAAAAA')
1615
+ .resolves(new bignumber_js_1.default('2345504'));
1616
+ const res = await basecoin.recoverConsolidations({
1617
+ bitgoKey: sui_1.keys.bitgoKeyColdWallet,
1618
+ tokenContractAddress: packageId,
1619
+ startingScanIndex: 1,
1620
+ endingScanIndex: 3,
1621
+ });
1622
+ res.should.deepEqual({
1623
+ txRequests: [
1624
+ {
1625
+ transactions: [
1626
+ {
1627
+ unsignedTx: {
1628
+ serializedTx: '00000301009e2618685fff38b999355e93a4693c4bd18f68dd6b654ff6555f1f4ad229dcdbac6e11020000000020d1389b1b35846326a2f4d4e5d7e7168a2e58e3dd567d274433dbb97ca600b3cb0008a00f0000000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210202010000010101000101020000010200a992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f01916e35a0ac6b525b7d38a44b667394aaee7cde41dffc876980cfbc8845590cddae6e110200000000200003d57a579bf2932eee8fdca7d330b46b14330280dbc0af88efb937bf5fa0d1a992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675fe803000000000000565e27000000000000',
1629
+ scanIndex: 1,
1630
+ coin: 'tsui:deep',
1631
+ signableHex: 'cedade6c1c99e3531c90536fa228f0fb148f35605d1a4edfbe8eb739bdc99a48',
1632
+ derivationPath: 'm/1',
1633
+ parsedTx: {
1634
+ inputs: [
1635
+ {
1636
+ address: '0xa992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f',
1637
+ valueString: '4000',
1638
+ value: new bignumber_js_1.default('4000'),
1639
+ },
1640
+ ],
1641
+ outputs: [
1642
+ {
1643
+ address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
1644
+ valueString: '4000',
1645
+ coinName: 'tsui:deep',
1646
+ },
1647
+ ],
1648
+ spendAmount: '4000',
1649
+ type: 'TokenTransfer',
1650
+ },
1651
+ feeInfo: {
1652
+ fee: 2580054,
1653
+ feeString: '2580054',
1654
+ },
1655
+ coinSpecific: {
1656
+ commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
1657
+ },
1658
+ },
1659
+ signatureShares: [],
1660
+ },
1661
+ ],
1662
+ walletCoin: 'tsui:deep',
1663
+ },
1664
+ {
1665
+ transactions: [
1666
+ {
1667
+ unsignedTx: {
1668
+ serializedTx: '0000030100c548c220454d20e0712bd2858b07260c829a1c847f3818b47805961b574813abad6e110200000000207351f6517b6fb35d85682eb64971e6fc0b9a28628d1388e93db872dcf1f60ead000870170000000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210202010000010101000101020000010200c3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae3901d4bfefa532827d7619a58279a87db81632e267cc48e6b94ab81a4367f02cbefaaf6e11020000000020e36df9d0baaa69a9ee6f94e98c99d894a8aea631765dcfaa80322888f3a453a8c3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39e803000000000000565e27000000000000',
1669
+ scanIndex: 2,
1670
+ coin: 'tsui:deep',
1671
+ signableHex: 'd0551409d248accdd894713a4c03a6d8f240349a5e85b90aef019b5f426062c8',
1672
+ derivationPath: 'm/2',
1673
+ parsedTx: {
1674
+ inputs: [
1675
+ {
1676
+ address: '0xc3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39',
1677
+ valueString: '6000',
1678
+ value: new bignumber_js_1.default('6000'),
1679
+ },
1680
+ ],
1681
+ outputs: [
1682
+ {
1683
+ address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
1684
+ valueString: '6000',
1685
+ coinName: 'tsui:deep',
1686
+ },
1687
+ ],
1688
+ spendAmount: '6000',
1689
+ type: 'TokenTransfer',
1690
+ },
1691
+ feeInfo: {
1692
+ fee: 2580054,
1693
+ feeString: '2580054',
1694
+ },
1695
+ coinSpecific: {
1696
+ commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
1697
+ lastScanIndex: 2,
1698
+ },
1699
+ },
1700
+ signatureShares: [],
1701
+ },
1702
+ ],
1703
+ walletCoin: 'tsui:deep',
1704
+ },
1705
+ ],
1706
+ });
1707
+ sandBox.assert.callCount(basecoin.getBalance, 4);
1708
+ sandBox.assert.callCount(basecoin.getInputCoins, 4);
1709
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
1710
+ });
1711
+ it('should build unsigned token consolidation transactions for cold wallet with seed', async function () {
1712
+ getBalanceStub
1713
+ .withArgs(seedReceiveAddress1)
1714
+ .resolves('120199788')
1715
+ .withArgs(seedReceiveAddress1, coinType)
1716
+ .resolves('1500')
1717
+ .withArgs(seedReceiveAddress2)
1718
+ .resolves('120199788')
1719
+ .withArgs(seedReceiveAddress2, coinType)
1720
+ .resolves('2000');
1721
+ getInputCoinsStub
1722
+ .withArgs(seedReceiveAddress1, coinType)
1723
+ .resolves([
1724
+ {
1725
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
1726
+ objectId: '0xa7a8c91028035ab49977e72b084e145eb1c1ddcfe2e06925f0f833cef2d1f69f',
1727
+ version: '34696878',
1728
+ digest: 'CKiuXkFMaVkn12iKinZCr9aDHfGpCQiPdyZUQzNDJ9Qx',
1729
+ balance: new bignumber_js_1.default('1500'),
1730
+ },
1731
+ ])
1732
+ .withArgs(seedReceiveAddress1)
1733
+ .resolves([
1734
+ {
1735
+ coinType: '0x2::sui::SUI',
1736
+ objectId: '0x5eea0353f078016b71a84cb494e6f791e97cb8de5344def3baedffc89c27a4b5',
1737
+ version: '34696879',
1738
+ digest: '6KqrwjKHhJCe4DXfdH2yMLG8bXGcSQoTeJy4shghDbTZ',
1739
+ balance: new bignumber_js_1.default('120000000'),
1740
+ },
1741
+ {
1742
+ coinType: '0x2::sui::SUI',
1743
+ objectId: '0x86e728fd7242b3be60e9c1941add2c47fb655779108c3500a216310218748e2d',
1744
+ version: '148',
1745
+ digest: 'B9zJfEYkiXnAuLE6q3XFJeLbPc3K7qmjgDrHVvJnT5wa',
1746
+ balance: new bignumber_js_1.default('199788'),
1747
+ },
1748
+ ])
1749
+ .withArgs(seedReceiveAddress2, coinType)
1750
+ .resolves([
1751
+ {
1752
+ coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
1753
+ objectId: '0xe191f166e71b1ef20ffda0c91b24da95ecc93b657c464d8a06f561d4692722f0',
1754
+ version: '34696880',
1755
+ digest: '4KyhzfPQcTUrnp4UBvR3GsPE3DLccVDEPgBjDxaWVRcr',
1756
+ balance: new bignumber_js_1.default('2000'),
1757
+ },
1758
+ ])
1759
+ .withArgs(seedReceiveAddress2)
1760
+ .resolves([
1761
+ {
1762
+ coinType: '0x2::sui::SUI',
1763
+ objectId: '0xd32f94889d0bfc05c24ed6c023d5d3d3654294a837d850d3738b0e352e1f4867',
1764
+ version: '34696880',
1765
+ digest: '5Po12YiuL3NkNTAvyWvRwtR55JviyPVbcDfTvCwQrTkr',
1766
+ balance: new bignumber_js_1.default('120000000'),
1767
+ },
1768
+ {
1769
+ coinType: '0x2::sui::SUI',
1770
+ objectId: '0xfd66dbfe7a1497f210747b0532f62e6926cb144c75e519f2dfff17a4f6e515fc',
1771
+ version: '149',
1772
+ digest: '5eVcbbm3NTF6jqadTb4GjZMzn75KDZBqcspRz3sVrpbR',
1773
+ balance: new bignumber_js_1.default('199788'),
1774
+ },
1775
+ ]);
1776
+ getFeeEstimateStub
1777
+ .withArgs('AAADAQCnqMkQKANatJl35ysIThRescHdz+LgaSXw+DPO8tH2n65uEQIAAAAAIKg8ZMeF2XLLbBdPQyPmfu8bYqCB2z/uaR5sG7Fobl7VAAjcBQAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECANIBVm5qC8Ag/S5vcum94iI/VQ1k2qYTmM2RfC91ATJKAV7qA1PweAFrcahMtJTm95HpfLjeU0Te87rt/8icJ6S1r24RAgAAAAAgTx4i+RgcLdA5q+vymM+WETpvCnqEqR4oY7RqQdNj2ozSAVZuagvAIP0ub3LpveIiP1UNZNqmE5jNkXwvdQEySugDAAAAAAAAAOH1BQAAAAAA')
1778
+ .resolves(new bignumber_js_1.default('2345504'))
1779
+ .withArgs('AAADAQDhkfFm5xse8g/9oMkbJNqV7Mk7ZXxGTYoG9WHUaSci8LBuEQIAAAAAIDFvokinBxoWyeL64lPM9mJVOpB0UOjZjDu+J1skPcQPAAjQBwAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECAC+l2DlL1r7FUluVUL9Dvgdbg0ItAQfAXHAJROPq7Cb5AdMvlIidC/wFwk7WwCPV09NlQpSoN9hQ03OLDjUuH0hnsG4RAgAAAAAgQUWJ0/tPZt++q7KnLYmAPWRRonn/W/XGYxzxY689zK8vpdg5S9a+xVJblVC/Q74HW4NCLQEHwFxwCUTj6uwm+egDAAAAAAAAAOH1BQAAAAAA')
1780
+ .resolves(new bignumber_js_1.default('2345504'));
1781
+ const res = await basecoin.recoverConsolidations({
1782
+ bitgoKey: sui_1.keys.bitgoKeyWithSeed,
1783
+ tokenContractAddress: packageId,
1784
+ startingScanIndex: 1,
1785
+ endingScanIndex: 3,
1786
+ seed: '123',
1787
+ });
1788
+ res.should.deepEqual({
1789
+ txRequests: [
1790
+ {
1791
+ transactions: [
1792
+ {
1793
+ unsignedTx: {
1794
+ serializedTx: '0000030100a7a8c91028035ab49977e72b084e145eb1c1ddcfe2e06925f0f833cef2d1f69fae6e11020000000020a83c64c785d972cb6c174f4323e67eef1b62a081db3fee691e6c1bb1686e5ed50008dc05000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b24040202010000010101000101020000010200d201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a015eea0353f078016b71a84cb494e6f791e97cb8de5344def3baedffc89c27a4b5af6e110200000000204f1e22f9181c2dd039abebf298cf96113a6f0a7a84a91e2863b46a41d363da8cd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324ae803000000000000565e27000000000000',
1795
+ scanIndex: 1,
1796
+ coin: 'tsui:deep',
1797
+ signableHex: '22defa9101ea3a3839c3c0026b27a9837165c07fcecff8e94353bcf3d5a01328',
1798
+ derivationPath: 'm/999999/94862622/157363509/1',
1799
+ parsedTx: {
1800
+ inputs: [
1801
+ {
1802
+ address: '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a',
1803
+ valueString: '1500',
1804
+ value: new bignumber_js_1.default('1500'),
1805
+ },
1806
+ ],
1807
+ outputs: [
1808
+ {
1809
+ address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
1810
+ valueString: '1500',
1811
+ coinName: 'tsui:deep',
1812
+ },
1813
+ ],
1814
+ spendAmount: '1500',
1815
+ type: 'TokenTransfer',
1816
+ },
1817
+ feeInfo: {
1818
+ fee: 2580054,
1819
+ feeString: '2580054',
1820
+ },
1821
+ coinSpecific: {
1822
+ commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
1823
+ },
1824
+ },
1825
+ signatureShares: [],
1826
+ },
1827
+ ],
1828
+ walletCoin: 'tsui:deep',
1829
+ },
1830
+ {
1831
+ transactions: [
1832
+ {
1833
+ unsignedTx: {
1834
+ serializedTx: '0000030100e191f166e71b1ef20ffda0c91b24da95ecc93b657c464d8a06f561d4692722f0b06e11020000000020316fa248a7071a16c9e2fae253ccf662553a907450e8d98c3bbe275b243dc40f0008d007000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b240402020100000101010001010200000102002fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f901d32f94889d0bfc05c24ed6c023d5d3d3654294a837d850d3738b0e352e1f4867b06e11020000000020414589d3fb4f66dfbeabb2a72d89803d6451a279ff5bf5c6631cf163af3dccaf2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9e803000000000000565e27000000000000',
1835
+ scanIndex: 2,
1836
+ coin: 'tsui:deep',
1837
+ signableHex: '2e6bb17166ee197102729bda47b06b7c0b5962bf431bbb0562b91e267b75129d',
1838
+ derivationPath: 'm/999999/94862622/157363509/2',
1839
+ parsedTx: {
1840
+ inputs: [
1841
+ {
1842
+ address: '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9',
1843
+ valueString: '2000',
1844
+ value: new bignumber_js_1.default('2000'),
1845
+ },
1846
+ ],
1847
+ outputs: [
1848
+ {
1849
+ address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
1850
+ valueString: '2000',
1851
+ coinName: 'tsui:deep',
1852
+ },
1853
+ ],
1854
+ spendAmount: '2000',
1855
+ type: 'TokenTransfer',
1856
+ },
1857
+ feeInfo: {
1858
+ fee: 2580054,
1859
+ feeString: '2580054',
1860
+ },
1861
+ coinSpecific: {
1862
+ commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
1863
+ lastScanIndex: 2,
1864
+ },
1865
+ },
1866
+ signatureShares: [],
1867
+ },
1868
+ ],
1869
+ walletCoin: 'tsui:deep',
1870
+ },
1871
+ ],
1872
+ });
1873
+ sandBox.assert.callCount(basecoin.getBalance, 4);
1874
+ sandBox.assert.callCount(basecoin.getInputCoins, 4);
1875
+ sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
1876
+ });
1877
+ });
1878
+ describe('Create Broadcastable MPC Transaction', () => {
1879
+ it('create broadcastable MPC transaction for OVC signed sweep transaction', async function () {
1880
+ const signatureShares = {
1881
+ signatureShares: [
1882
+ {
1883
+ txRequest: {
1884
+ transactions: [
1885
+ {
1886
+ unsignedTx: {
1887
+ serializedTx: '0000020008c88b902f000000000020df407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c020200010100000101020000010100016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421014553b0f6f79ed95942141835de3ab086bf38d1f1d96272981e1390b84fb86b36c900000000000000200b1de8fdfbbb8a6fa2c65ec79a55703c9a9f0c2685a768f2b81a0426bc932ec3016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000a48821000000000000',
1888
+ scanIndex: 0,
1889
+ coin: 'tsui',
1890
+ signableHex: 'a4ce8eb11362cd45c09936e745044dc78b2689e5d8147b9ea9a7de43ee43923a',
1891
+ derivationPath: 'm/0',
1892
+ parsedTx: {
1893
+ inputs: [
1894
+ {
1895
+ address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
1896
+ valueString: '798002120',
1897
+ value: {
1898
+ s: 1,
1899
+ e: 8,
1900
+ c: [798002120],
1901
+ },
1902
+ },
1903
+ ],
1904
+ outputs: [
1905
+ {
1906
+ address: '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c',
1907
+ valueString: '798002120',
1908
+ coinName: 'tsui',
1909
+ },
1910
+ ],
1911
+ spendAmount: '798002120',
1912
+ type: 'Transfer',
1913
+ },
1914
+ feeInfo: {
1915
+ fee: 2197668,
1916
+ feeString: '2197668',
1917
+ },
1918
+ coinSpecific: {
1919
+ commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
1920
+ },
1921
+ },
1922
+ signatureShares: [],
1923
+ signatureShare: {
1924
+ from: 'backup',
1925
+ to: 'user',
1926
+ share: '6f470906df88c33b27c8d113ed944ed0a4fc499ba6cc76f00b8924942812d7835792ee455cbc8941faba7bcc93b15a9cd198a20dc3f0b629f5fdceab34e66100',
1927
+ publicShare: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
1928
+ },
1929
+ },
1930
+ ],
1931
+ walletCoin: 'tsui',
1932
+ },
1933
+ tssVersion: '0.0.1',
1934
+ ovc: [
1935
+ {
1936
+ eddsaSignature: {
1937
+ y: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
1938
+ R: '6f470906df88c33b27c8d113ed944ed0a4fc499ba6cc76f00b8924942812d783',
1939
+ sigma: '5c23a8c72ce192731e702da460aea79ed66334b4a783dcf6dd2758347d6c9f0d',
1940
+ },
1941
+ },
1942
+ ],
1943
+ },
1944
+ ],
1945
+ };
1946
+ const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
1947
+ res.should.deepEqual({
1948
+ transactions: [
1949
+ {
1950
+ serializedTx: 'AAACAAjIi5AvAAAAAAAg30B+PiXpQA+Xeax1cVN8I2FoQZTxql2xJqj1dLXthRwCAgABAQAAAQECAAABAQABZJXd2nSMEWohgkKDXTZHCdbF7lyKHtaExO9DPTFEIQFFU7D2957ZWUIUGDXeOrCGvzjR8dlicpgeE5C4T7hrNskAAAAAAAAAIAsd6P37u4pvosZex5pVcDyanwwmhado8rgaBCa8ky7DAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCHoAwAAAAAAAKSIIQAAAAAAAA==',
1951
+ scanIndex: 0,
1952
+ signature: 'AG9HCQbfiMM7J8jRE+2UTtCk/Embpsx28AuJJJQoEteDXCOoxyzhknMecC2kYK6nntZjNLSng9z23SdYNH1snw0oRJbKBMxgOCP3mTrvE/cvMx2XCFshhNempGOpCqkn0A==',
1953
+ recoveryAmount: '798002120',
1954
+ },
1955
+ ],
1956
+ lastScanIndex: 0,
1957
+ });
1958
+ });
1959
+ it('create broadcastable MPC token transaction for OVC signed sweep transaction', async function () {
1960
+ const signatureShares = {
1961
+ signatureShares: [
1962
+ {
1963
+ txRequest: {
1964
+ transactions: [
1965
+ {
1966
+ unsignedTx: {
1967
+ serializedTx: '000004010072ad99130abd3790db7bac8908d50d3412a800a8fcd10c1cfbd64b8215537558a16e1102000000002007b85d38b6e1b485f1455930d27296108081caacd7664c48d7d5f48572ee2bbd01004c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7696e110200000000208fb4a334b829acdecbfa2a328642afa24d6f953740f7683080ee0e4b3d3a962f0008f82a000000000000002091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da303030100000101010002010000010102000101020100010300016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210198114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068696e11020000000020b516a15b5034bcd42425440c564cf36f439542f88671ef799dde0661e789a009016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000f86411000000000000',
1968
+ scanIndex: 0,
1969
+ coin: 'tsui:deep',
1970
+ signableHex: '449ade19590685b1eb0cefcb2ec41f4c68e37d8eaf75687c45965e288e71caa4',
1971
+ derivationPath: 'm/0',
1972
+ parsedTx: {
1973
+ inputs: [
1974
+ {
1975
+ address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
1976
+ valueString: '11000',
1977
+ value: {
1978
+ s: 1,
1979
+ e: 4,
1980
+ c: [11000],
1981
+ },
1982
+ },
1983
+ ],
1984
+ outputs: [
1985
+ {
1986
+ address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
1987
+ valueString: '11000',
1988
+ coinName: 'tsui:deep',
1989
+ },
1990
+ ],
1991
+ spendAmount: '11000',
1992
+ type: 'TokenTransfer',
1993
+ },
1994
+ feeInfo: {
1995
+ fee: 1139960,
1996
+ feeString: '1139960',
1997
+ },
1998
+ coinSpecific: {
1999
+ commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
2000
+ },
2001
+ },
2002
+ signatureShares: [],
2003
+ signatureShare: {
2004
+ from: 'backup',
2005
+ to: 'user',
2006
+ share: '23c53e54f271386578d99a6932ff708960900188ab3e5bce1aec1f019e53a85d3197f8b64a9feadbedbbd37aa42e4444609f000743adc0a94ffcc721c7057d04',
2007
+ publicShare: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
2008
+ },
2009
+ },
2010
+ ],
2011
+ walletCoin: 'tsui:deep',
2012
+ },
2013
+ tssVersion: '0.0.1',
2014
+ ovc: [
2015
+ {
2016
+ eddsaSignature: {
2017
+ y: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
2018
+ R: '23c53e54f271386578d99a6932ff708960900188ab3e5bce1aec1f019e53a85d',
2019
+ sigma: '9b52b45c4d539fad906805f9fcbab6fb5e4152243caee252855c36c34048cc09',
2020
+ },
2021
+ },
2022
+ ],
2023
+ },
2024
+ ],
2025
+ };
2026
+ const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
2027
+ res.should.deepEqual({
2028
+ transactions: [
2029
+ {
2030
+ serializedTx: 'AAAEAQByrZkTCr03kNt7rIkI1Q00EqgAqPzRDBz71kuCFVN1WKFuEQIAAAAAIAe4XTi24bSF8UVZMNJylhCAgcqs12ZMSNfV9IVy7iu9AQBMHMzG0DUQvXSpX4Gyt9oIEZyxjixWVDXnrXFeaq3Fp2luEQIAAAAAII+0ozS4Kazey/oqMoZCr6JNb5U3QPdoMIDuDks9OpYvAAj4KgAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMDAwEAAAEBAQACAQAAAQECAAEBAgEAAQMAAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCEBmBFPLd7+PxbZ0uAWGUtSxMOvQwwWAb2zU5y9I3y8oGhpbhECAAAAACC1FqFbUDS81CQlRAxWTPNvQ5VC+IZx73md3gZh54mgCQFkld3adIwRaiGCQoNdNkcJ1sXuXIoe1oTE70M9MUQh6AMAAAAAAAD4ZBEAAAAAAAA=',
2031
+ scanIndex: 0,
2032
+ signature: 'ACPFPlTycThleNmaaTL/cIlgkAGIqz5bzhrsHwGeU6hdm1K0XE1Tn62QaAX5/Lq2+15BUiQ8ruJShVw2w0BIzAkoRJbKBMxgOCP3mTrvE/cvMx2XCFshhNempGOpCqkn0A==',
2033
+ recoveryAmount: '11000',
2034
+ },
2035
+ ],
2036
+ lastScanIndex: 0,
2037
+ });
2038
+ });
2039
+ it('create broadcastable MPC transaction for OVC signed consolidation transactions', async function () {
2040
+ const signatureShares = {
2041
+ signatureShares: [
2042
+ {
2043
+ txRequest: {
2044
+ transactions: [
2045
+ {
2046
+ unsignedTx: {
2047
+ serializedTx: '000002000820c2d605000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421020200010100000101020000010100a992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f01568beffe7651033a081a7375a3bb43d4d2a8e290a396e826236e73d0973b49b5d000000000000000208bc0764a454de7538b5ecea6fd0bd221c9c85207af297612944a967d43e8dd3ba992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675fe803000000000000a48821000000000000',
2048
+ scanIndex: 1,
2049
+ coin: 'tsui',
2050
+ signableHex: '857a2f26687c011a61a060a41d4c80c10b2fd31e98fe6704d6bcda26f57b03bb',
2051
+ derivationPath: 'm/1',
2052
+ parsedTx: {
2053
+ inputs: [
2054
+ {
2055
+ address: '0xa992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f',
2056
+ valueString: '97960480',
2057
+ value: {
2058
+ s: 1,
2059
+ e: 7,
2060
+ c: [97960480],
2061
+ },
2062
+ },
2063
+ ],
2064
+ outputs: [
2065
+ {
2066
+ address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
2067
+ valueString: '97960480',
2068
+ coinName: 'tsui',
2069
+ },
2070
+ ],
2071
+ spendAmount: '97960480',
2072
+ type: 'Transfer',
2073
+ },
2074
+ feeInfo: {
2075
+ fee: 2197668,
2076
+ feeString: '2197668',
2077
+ },
2078
+ coinSpecific: {
2079
+ commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
2080
+ },
2081
+ },
2082
+ signatureShares: [],
2083
+ signatureShare: {
2084
+ from: 'backup',
2085
+ to: 'user',
2086
+ share: 'cdfe15d7c0f80f8aad89d878706673ce242947b126852c00ee309ef05f7a8301b2e902b90d37ea7dfe86ce79c7a99b2b27a175c3f714c310fd9e10ea877cc60f',
2087
+ publicShare: 'e445bd092a467df577001cfbd6081b1445ca0f75147233561ed2f53f6a30e45a',
2088
+ },
2089
+ },
2090
+ ],
2091
+ walletCoin: 'tsui',
2092
+ },
2093
+ tssVersion: '0.0.1',
2094
+ ovc: [
2095
+ {
2096
+ eddsaSignature: {
2097
+ y: 'e445bd092a467df577001cfbd6081b1445ca0f75147233561ed2f53f6a30e45a',
2098
+ R: 'cdfe15d7c0f80f8aad89d878706673ce242947b126852c00ee309ef05f7a8301',
2099
+ sigma: '2a31329b2e5ef8c3f222eb91cd9d70e716f229ee19d3ca9417c8acc16b1da100',
2100
+ },
2101
+ },
2102
+ ],
2103
+ },
2104
+ {
2105
+ txRequest: {
2106
+ transactions: [
2107
+ {
2108
+ unsignedTx: {
2109
+ serializedTx: '000002000800c2eb0b000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421020200010100000101020000010100c3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae3901d68feb4780886ccfa81a37036958ec9c8bfabfe75a0bb7c4d1a4587992343f5bcf00000000000000205ad4f631a378f8b09542d4df66942b6dabb2f65cb20cf8f628c91c64f9352e4ec3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39e803000000000000a48821000000000000',
2110
+ scanIndex: 2,
2111
+ coin: 'tsui',
2112
+ signableHex: 'f2b56a74e787b2a98decf189e71b1e0c5d4ccee88697b3991a48de2910676020',
2113
+ derivationPath: 'm/2',
2114
+ parsedTx: {
2115
+ inputs: [
2116
+ {
2117
+ address: '0xc3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39',
2118
+ valueString: '200000000',
2119
+ value: {
2120
+ s: 1,
2121
+ e: 8,
2122
+ c: [200000000],
2123
+ },
2124
+ },
2125
+ ],
2126
+ outputs: [
2127
+ {
2128
+ address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
2129
+ valueString: '200000000',
2130
+ coinName: 'tsui',
2131
+ },
2132
+ ],
2133
+ spendAmount: '200000000',
2134
+ type: 'Transfer',
2135
+ },
2136
+ feeInfo: {
2137
+ fee: 2197668,
2138
+ feeString: '2197668',
2139
+ },
2140
+ coinSpecific: {
2141
+ commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
2142
+ lastScanIndex: 20,
2143
+ },
2144
+ },
2145
+ signatureShares: [],
2146
+ signatureShare: {
2147
+ from: 'backup',
2148
+ to: 'user',
2149
+ share: '3518613ea5cefa36cd22e1b092742d8d052744188518040397f1a65a754f9e95324889312d70146811dbdc2a96245c518e16fc61bd1a5a2b53b53ebcec5d4a03',
2150
+ publicShare: '4b143a12835bdda04831a9ed851f9eadd7ba5b46e9c07fd087b751f46a3f364d',
2151
+ },
2152
+ },
2153
+ ],
2154
+ walletCoin: 'tsui',
2155
+ },
2156
+ tssVersion: '0.0.1',
2157
+ ovc: [
2158
+ {
2159
+ eddsaSignature: {
2160
+ y: '4b143a12835bdda04831a9ed851f9eadd7ba5b46e9c07fd087b751f46a3f364d',
2161
+ R: '3518613ea5cefa36cd22e1b092742d8d052744188518040397f1a65a754f9e95',
2162
+ sigma: '2df48ed60ff62b0e8689c5ebe57318f3dad76288647524b420acf7b1a84cc000',
2163
+ },
2164
+ },
2165
+ ],
2166
+ },
2167
+ ],
2168
+ };
2169
+ const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
2170
+ res.should.deepEqual({
2171
+ transactions: [
2172
+ {
2173
+ serializedTx: 'AAACAAggwtYFAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgABAQAAAQECAAABAQCpknCVkd63Rx+zDdoPM523q1SNM5GonT8foMctIJJnXwFWi+/+dlEDOggac3Wju0PU0qjikKOW6CYjbnPQlztJtdAAAAAAAAAAIIvAdkpFTedTi17Opv0L0iHJyFIHryl2EpRKln1D6N07qZJwlZHet0cfsw3aDzOdt6tUjTORqJ0/H6DHLSCSZ1/oAwAAAAAAAKSIIQAAAAAAAA==',
2174
+ scanIndex: 1,
2175
+ signature: 'AM3+FdfA+A+KrYnYeHBmc84kKUexJoUsAO4wnvBfeoMBKjEymy5e+MPyIuuRzZ1w5xbyKe4Z08qUF8iswWsdoQDkRb0JKkZ99XcAHPvWCBsURcoPdRRyM1Ye0vU/ajDkWg==',
2176
+ recoveryAmount: '97960480',
2177
+ },
2178
+ {
2179
+ serializedTx: 'AAACAAgAwusLAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgABAQAAAQECAAABAQDDrCqG41tiv62oP2OI/yfH3acJLPC4KdLR9MKBPiiuOQHWj+tHgIhsz6gaNwNpWOyci/q/51oLt8TRpFh5kjQ/W88AAAAAAAAAIFrU9jGjePiwlULU32aUK22rsvZcsgz49ijJHGT5NS5Ow6wqhuNbYr+tqD9jiP8nx92nCSzwuCnS0fTCgT4orjnoAwAAAAAAAKSIIQAAAAAAAA==',
2180
+ scanIndex: 2,
2181
+ signature: 'ADUYYT6lzvo2zSLhsJJ0LY0FJ0QYhRgEA5fxplp1T56VLfSO1g/2Kw6GicXr5XMY89rXYohkdSS0IKz3sahMwABLFDoSg1vdoEgxqe2FH56t17pbRunAf9CHt1H0aj82TQ==',
2182
+ recoveryAmount: '200000000',
2183
+ },
2184
+ ],
2185
+ lastScanIndex: 20,
2186
+ });
2187
+ });
2188
+ it('create broadcastable MPC transaction for OVC signed token consolidation transactions', async function () {
2189
+ const signatureShares = {
2190
+ signatureShares: [
2191
+ {
2192
+ txRequest: {
2193
+ transactions: [
2194
+ {
2195
+ unsignedTx: {
2196
+ serializedTx: '0000030100a7a8c91028035ab49977e72b084e145eb1c1ddcfe2e06925f0f833cef2d1f69fae6e11020000000020a83c64c785d972cb6c174f4323e67eef1b62a081db3fee691e6c1bb1686e5ed50008dc05000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b24040202010000010101000101020000010200d201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a015eea0353f078016b71a84cb494e6f791e97cb8de5344def3baedffc89c27a4b5af6e110200000000204f1e22f9181c2dd039abebf298cf96113a6f0a7a84a91e2863b46a41d363da8cd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324ae803000000000000565e27000000000000',
2197
+ scanIndex: 1,
2198
+ coin: 'tsui:deep',
2199
+ signableHex: '22defa9101ea3a3839c3c0026b27a9837165c07fcecff8e94353bcf3d5a01328',
2200
+ derivationPath: 'm/999999/94862622/157363509/1',
2201
+ parsedTx: {
2202
+ inputs: [
2203
+ {
2204
+ address: '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a',
2205
+ valueString: '1500',
2206
+ value: {
2207
+ s: 1,
2208
+ e: 3,
2209
+ c: [1500],
2210
+ },
2211
+ },
2212
+ ],
2213
+ outputs: [
2214
+ {
2215
+ address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
2216
+ valueString: '1500',
2217
+ coinName: 'tsui:deep',
2218
+ },
2219
+ ],
2220
+ spendAmount: '1500',
2221
+ type: 'TokenTransfer',
2222
+ },
2223
+ feeInfo: {
2224
+ fee: 2580054,
2225
+ feeString: '2580054',
2226
+ },
2227
+ coinSpecific: {
2228
+ commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
2229
+ },
2230
+ },
2231
+ signatureShares: [],
2232
+ signatureShare: {
2233
+ from: 'backup',
2234
+ to: 'user',
2235
+ share: '1989420ce800e35e1c590907f2017b5529945484b3ff884f8e88390da88936e6a5844e4860df0f489e2a0975519c1d6f5f0255dd091edbf859c74063a7f1e20e',
2236
+ publicShare: '408c7a11967152efee953f3eb16191004946685fdc4dd8087b91e3afcb77c916',
2237
+ },
2238
+ },
2239
+ ],
2240
+ walletCoin: 'tsui:deep',
2241
+ },
2242
+ tssVersion: '0.0.1',
2243
+ ovc: [
2244
+ {
2245
+ eddsaSignature: {
2246
+ y: '408c7a11967152efee953f3eb16191004946685fdc4dd8087b91e3afcb77c916',
2247
+ R: '1989420ce800e35e1c590907f2017b5529945484b3ff884f8e88390da88936e6',
2248
+ sigma: 'c2ce528f1f323fe9af256abb57428973b2e97e4fa54fa6f50c3943036815860e',
2249
+ },
2250
+ },
2251
+ ],
2252
+ },
2253
+ {
2254
+ txRequest: {
2255
+ transactions: [
2256
+ {
2257
+ unsignedTx: {
2258
+ serializedTx: '0000030100e191f166e71b1ef20ffda0c91b24da95ecc93b657c464d8a06f561d4692722f0b06e11020000000020316fa248a7071a16c9e2fae253ccf662553a907450e8d98c3bbe275b243dc40f0008d007000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b240402020100000101010001010200000102002fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f901d32f94889d0bfc05c24ed6c023d5d3d3654294a837d850d3738b0e352e1f4867b06e11020000000020414589d3fb4f66dfbeabb2a72d89803d6451a279ff5bf5c6631cf163af3dccaf2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9e803000000000000565e27000000000000',
2259
+ scanIndex: 2,
2260
+ coin: 'tsui:deep',
2261
+ signableHex: '2e6bb17166ee197102729bda47b06b7c0b5962bf431bbb0562b91e267b75129d',
2262
+ derivationPath: 'm/999999/94862622/157363509/2',
2263
+ parsedTx: {
2264
+ inputs: [
2265
+ {
2266
+ address: '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9',
2267
+ valueString: '2000',
2268
+ value: {
2269
+ s: 1,
2270
+ e: 3,
2271
+ c: [2000],
2272
+ },
2273
+ },
2274
+ ],
2275
+ outputs: [
2276
+ {
2277
+ address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
2278
+ valueString: '2000',
2279
+ coinName: 'tsui:deep',
2280
+ },
2281
+ ],
2282
+ spendAmount: '2000',
2283
+ type: 'TokenTransfer',
2284
+ },
2285
+ feeInfo: {
2286
+ fee: 2580054,
2287
+ feeString: '2580054',
2288
+ },
2289
+ coinSpecific: {
2290
+ commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
2291
+ lastScanIndex: 20,
2292
+ },
2293
+ },
2294
+ signatureShares: [],
2295
+ signatureShare: {
2296
+ from: 'backup',
2297
+ to: 'user',
2298
+ share: '9e1d0fd6640780cf4dc209fa6ed8957d6958e0d0272d8a2fd48438c011f67a2200de1a78e23bc2a7d261d0d02a422145301aa9ce97d3d306b3501b1f44d95606',
2299
+ publicShare: '362d716a5a230d683b60d29ece941197e09627c234c71449facab514c3a7abaf',
2300
+ },
2301
+ },
2302
+ ],
2303
+ walletCoin: 'tsui:deep',
2304
+ },
2305
+ tssVersion: '0.0.1',
2306
+ ovc: [
2307
+ {
2308
+ eddsaSignature: {
2309
+ y: '362d716a5a230d683b60d29ece941197e09627c234c71449facab514c3a7abaf',
2310
+ R: '9e1d0fd6640780cf4dc209fa6ed8957d6958e0d0272d8a2fd48438c011f67a22',
2311
+ sigma: '15a82f7c4aedb9ebd4ab481b4281d6fcadb2a8422635f16e4e31967097001806',
2312
+ },
2313
+ },
2314
+ ],
2315
+ },
2316
+ ],
2317
+ };
2318
+ const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
2319
+ res.should.deepEqual({
2320
+ transactions: [
2321
+ {
2322
+ serializedTx: 'AAADAQCnqMkQKANatJl35ysIThRescHdz+LgaSXw+DPO8tH2n65uEQIAAAAAIKg8ZMeF2XLLbBdPQyPmfu8bYqCB2z/uaR5sG7Fobl7VAAjcBQAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECANIBVm5qC8Ag/S5vcum94iI/VQ1k2qYTmM2RfC91ATJKAV7qA1PweAFrcahMtJTm95HpfLjeU0Te87rt/8icJ6S1r24RAgAAAAAgTx4i+RgcLdA5q+vymM+WETpvCnqEqR4oY7RqQdNj2ozSAVZuagvAIP0ub3LpveIiP1UNZNqmE5jNkXwvdQEySugDAAAAAAAAVl4nAAAAAAAA',
2323
+ scanIndex: 1,
2324
+ signature: 'ABmJQgzoAONeHFkJB/IBe1UplFSEs/+IT46IOQ2oiTbmws5Sjx8yP+mvJWq7V0KJc7Lpfk+lT6b1DDlDA2gVhg5AjHoRlnFS7+6VPz6xYZEASUZoX9xN2Ah7keOvy3fJFg==',
2325
+ recoveryAmount: '1500',
2326
+ },
2327
+ {
2328
+ serializedTx: 'AAADAQDhkfFm5xse8g/9oMkbJNqV7Mk7ZXxGTYoG9WHUaSci8LBuEQIAAAAAIDFvokinBxoWyeL64lPM9mJVOpB0UOjZjDu+J1skPcQPAAjQBwAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECAC+l2DlL1r7FUluVUL9Dvgdbg0ItAQfAXHAJROPq7Cb5AdMvlIidC/wFwk7WwCPV09NlQpSoN9hQ03OLDjUuH0hnsG4RAgAAAAAgQUWJ0/tPZt++q7KnLYmAPWRRonn/W/XGYxzxY689zK8vpdg5S9a+xVJblVC/Q74HW4NCLQEHwFxwCUTj6uwm+egDAAAAAAAAVl4nAAAAAAAA',
2329
+ scanIndex: 2,
2330
+ signature: 'AJ4dD9ZkB4DPTcIJ+m7YlX1pWODQJy2KL9SEOMAR9noiFagvfErtuevUq0gbQoHW/K2yqEImNfFuTjGWcJcAGAY2LXFqWiMNaDtg0p7OlBGX4JYnwjTHFEn6yrUUw6errw==',
2331
+ recoveryAmount: '2000',
2332
+ },
2333
+ ],
2334
+ lastScanIndex: 20,
2335
+ });
2336
+ });
2337
+ });
2338
+ describe('Recover Transaction Failures:', () => {
2339
+ const sandBox = sinon_1.default.createSandbox();
2340
+ const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
2341
+ const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
2342
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
2343
+ afterEach(function () {
2344
+ sandBox.restore();
2345
+ });
2346
+ it('should fail to recover due to non-zero fund but insufficient funds address', async function () {
2347
+ const callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
2348
+ callBack.withArgs(senderAddress0).resolves('9800212');
2349
+ await basecoin
2350
+ .recover({
2351
+ userKey: sui_1.keys.userKey,
2352
+ backupKey: sui_1.keys.backupKey,
2353
+ bitgoKey: sui_1.keys.bitgoKey,
2354
+ recoveryDestination,
2355
+ walletPassphrase,
2356
+ startingScanIndex: '0',
2357
+ scan: 1,
2358
+ })
2359
+ .should.rejectedWith('Did not find an address with sufficient funds to recover. Please start the next scan at address index 1. If it is token transaction, please keep sufficient Sui balance in the address for the transaction fee.');
2360
+ sandBox.assert.callCount(basecoin.getBalance, 1);
2361
+ });
2362
+ it('should fail to recover due to not finding an address with funds', async function () {
2363
+ const callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
2364
+ callBack.resolves('0');
2365
+ await basecoin
2366
+ .recover({
2367
+ userKey: sui_1.keys.userKey,
2368
+ backupKey: sui_1.keys.backupKey,
2369
+ bitgoKey: sui_1.keys.bitgoKey,
2370
+ recoveryDestination,
2371
+ walletPassphrase,
2372
+ scan: '10',
2373
+ })
2374
+ .should.rejectedWith('Did not find an address with sufficient funds to recover. Please start the next scan at address index 10. If it is token transaction, please keep sufficient Sui balance in the address for the transaction fee.');
2375
+ sandBox.assert.callCount(basecoin.getBalance, 10);
2376
+ });
2377
+ });
2378
+ describe('Consolidation Transaction Failures:', () => {
2379
+ it('should fail due to insufficient funds in receive address', async function () {
2380
+ const sandBox = sinon_1.default.createSandbox();
2381
+ const receiveAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
2382
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
2383
+ const callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
2384
+ callBack.withArgs(receiveAddress1).resolves('1');
2385
+ await basecoin
2386
+ .recoverConsolidations({
2387
+ userKey: sui_1.keys.userKey,
2388
+ backupKey: sui_1.keys.backupKey,
2389
+ bitgoKey: sui_1.keys.bitgoKey,
2390
+ walletPassphrase,
2391
+ startingScanIndex: '1',
2392
+ endingScanIndex: '2',
2393
+ })
2394
+ .should.rejectedWith('Did not find an address with sufficient funds to recover. Please start the next scan at address index 2.');
2395
+ sandBox.assert.callCount(basecoin.getBalance, 1);
2396
+ });
2397
+ });
2398
+ });
2399
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3N1aS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw4Q0FBMEQ7QUFDMUQsNENBQTBDO0FBQzFDLG1DQUFxRjtBQUNyRiwyREFBNkM7QUFDN0Msb0RBQXVCO0FBQ3ZCLGtEQUEwQjtBQUMxQixnRUFBcUM7QUFDckMsb0RBQTRCO0FBQzVCLCtDQUF5RDtBQUN6RCwyREFBd0Q7QUFDeEQsMENBQXdDO0FBQ3hDLG1DQUFnQztBQUNoQyw4Q0FBc0U7QUFDdEUsZ0RBQXdCO0FBRXhCLFFBQVEsQ0FBQyxNQUFNLEVBQUU7SUFDZixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFRLENBQUM7SUFDYixJQUFJLGFBQWEsQ0FBQztJQUNsQixJQUFJLFdBQVcsQ0FBQztJQUVoQixNQUFNLFVBQVUsR0FBRztRQUNqQixLQUFLLEVBQUUsZUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDL0QsTUFBTSxFQUFFLEVBQUU7S0FDWCxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUc7UUFDZixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7S0FDaEMsQ0FBQztJQUVGLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUs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QUM7WUFFaEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFHLENBQUMsU0FBUyxFQUFFLFlBQXlCLENBQUMsQ0FBQztZQUN4RSxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVqRCxNQUFNLFFBQVE7aUJBQ1gscUJBQXFCLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxVQUFJLENBQUMsT0FBTztnQkFDckIsU0FBUyxFQUFFLFVBQUksQ0FBQyxTQUFTO2dCQUN6QixRQUFRLEVBQUUsVUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLGdCQUFnQjtnQkFDaEIsaUJBQWlCLEVBQUUsR0FBRztnQkFDdEIsZUFBZSxFQUFFLEdBQUc7YUFDckIsQ0FBQztpQkFDRCxNQUFNLENBQUMsWUFBWSxDQUNsQiwwR0FBMEcsQ0FDM0csQ0FBQztZQUVKLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IFN1aSwgVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uLCBUcmFuc2ZlclRyYW5zYWN0aW9uLCBUc3VpIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcy9zdWknO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBTdWlUcmFuc2FjdGlvblR5cGUgfSBmcm9tICcuLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBrZXlzIH0gZnJvbSAnLi4vcmVzb3VyY2VzL3N1aSc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgY29tbW9uLCBUcmFuc2FjdGlvblByZWJ1aWxkLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IG5vY2sgZnJvbSAnbm9jayc7XG5cbmRlc2NyaWJlKCdTVUk6JywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuICBsZXQgbmV3VHhQcmVidWlsZDtcbiAgbGV0IG5ld1R4UGFyYW1zO1xuXG4gIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLlRSQU5TRkVSLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgIHR4SW5mbzoge30sXG4gIH07XG5cbiAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgcmVjaXBpZW50czogdGVzdERhdGEucmVjaXBpZW50cyxcbiAgfTtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3Rlcignc3VpJywgU3VpLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RzdWknLCBUc3VpLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RzdWknKTtcbiAgICBuZXdUeFByZWJ1aWxkID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKHR4UHJlYnVpbGQpO1xuICAgIH07XG4gICAgbmV3VHhQYXJhbXMgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQYXJhbXMpO1xuICAgIH07XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByaWdodCBpbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHN1aSA9IGJpdGdvLmNvaW4oJ3N1aScpO1xuICAgIGNvbnN0IHRzdWkgPSBiaXRnby5jb2luKCd0c3VpJyk7XG5cbiAgICBzdWkuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3N1aScpO1xuICAgIHN1aS5nZXRGYW1pbHkoKS5zaG91bGQuZXF1YWwoJ3N1aScpO1xuICAgIHN1aS5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnU3VpJyk7XG4gICAgc3VpLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWU5KTtcblxuICAgIHRzdWkuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3RzdWknKTtcbiAgICB0c3VpLmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgnc3VpJyk7XG4gICAgdHN1aS5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdG5ldCBTdWknKTtcbiAgICB0c3VpLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWU5KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ZlcmlmeSB0cmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB2ZXJpZmljYXRpb24gfSk7XG4gICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50IGFyZSBudW1iZXJzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cy5yZWNpcGllbnRzID0gdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cy5yZWNpcGllbnRzLm1hcCgoeyBhZGRyZXNzLCBhbW91bnQgfSkgPT4ge1xuICAgICAgICByZXR1cm4geyBhZGRyZXNzLCBhbW91bnQ6IE51bWJlcihhbW91bnQpIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgfSk7XG4gICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcGFyYW0nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge307XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gdW5kZWZpbmVkO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aCgnbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSBzcGxpdCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHN1aScpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IGFtb3VudCA9IDEwMDAwMDAwMDA7XG4gICAgICBjb25zdCByZWNpcGllbnRzID0gbmV3IEFycmF5KDEwMCkuZmlsbCh7IGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLCBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQocmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiBCdWZmZXIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB0eEluZm86IHt9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHZlcmlmeSA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICB9KTtcbiAgICAgIHZlcmlmeS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IGEgc3Bvb2ZlZCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gU2V0IHVwIHdhbGxldCBkYXRhXG4gICAgICBjb25zdCB3YWxsZXREYXRhID0ge1xuICAgICAgICBpZDogJzYyZTE1NmRiZDY0MWMwMDAwNzZiYmFiZTA0MDQxYTkwJyxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NTAwMDAwMDAwJyxcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc2MDAwMDAwMDAnLFxuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzcwMDAwMDAwMCcsXG4gICAgICAgIF0sXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiAnMHg2ZjBmNGUwZWVmMTkxNzY2MjhlZTBlYmM4MGVlZjg5MTk0YWZkOWUxOWU1OTQ0NGU2NGI5OTdmMTI1NGY2Y2Q4JyxcbiAgICAgICAgfSxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNvbnNvbGlkYXRpb25UeCA9IHtcbiAgICAgICAgdHhSZXF1ZXN0SWQ6ICcxMzg1N2MxYS05YjYxLTRiODUtOTZmMS0xMGFmMTI1ZjY4YTAnLFxuICAgICAgICB3YWxsZXRJZDogJzY0NGMzZDZjNTIzMmYwMDAwNzY4MDA0MCcsXG4gICAgICAgIHR4SGV4OlxuICAgICAgICAgICcwMDAwMDIwMDA4ZTZlNjc1M2IwMDAwMDAwMDAwMjA2ZjBmNGUwZWVmMTkxNzY2MjhlZTBlYmM4MGVlZjg5MTk0YWZkOWUxOWU1OTQ0NGU2NGI5OTdmMTI1NGY2Y2Q4MDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwMTY3MDQ3MmM0NGI1OTA1ODAzMjg0MGI5NGE3ZmQ3NDA1YjRiODdjYmY2N2Y0ZWI2MGUxYjc3ODFjZTAzZGRhZDAxMjIyYjgxOGI0NTBkY2QyMTY0YjI1YmE1YTU3YjA1MDdlNTlhNGM4ZWI2ZDdjYWRkMDhlYTYwOWRiMTdjNjExZDRlMTJkMDE0MDAwMDAwMDAyMDIzZmMyNzU3NjYyNjc2MjkwNDMzOWIwYWJlMWZmOTljOTk3OTljOTNiZWE0NmU4YmY0NTJmMjNjNjg5OTJkYjExNjcwNDcyYzQ0YjU5MDU4MDMyODQwYjk0YTdmZDc0MDViNGI4N2NiZjY3ZjRlYjYwZTFiNzc4MWNlMDNkZGFkZTgwMzAwMDAwMDAwMDAwMDFhZTMyNDAwMDAwMDAwMDAwMCcsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBmZWU6IDI0MTc0MzQsXG4gICAgICAgICAgZmVlU3RyaW5nOiAnMjQxNzQzNCcsXG4gICAgICAgIH0sXG4gICAgICAgIHR4SW5mbzoge1xuICAgICAgICAgIG1pbmVyRmVlOiAnMjQxNzQzNCcsXG4gICAgICAgICAgc3BlbmRBbW91bnQ6ICc5OTc1ODI1NjYnLFxuICAgICAgICAgIHNwZW5kQW1vdW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICBhbW91bnRTdHJpbmc6ICc5OTc1ODI1NjYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHBheUdvRmVlOiAnMCcsXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnMHg2ZjBmNGUwZWVmMTkxNzY2MjhlZTBlYmM4MGVlZjg5MTk0YWZkOWUxOWU1OTQ0NGU2NGI5OTdmMTI1NGY2Y2Q4JyxcbiAgICAgICAgICAgICAgdmFsdWU6IDk5NzU4MjU2NixcbiAgICAgICAgICAgICAgd2FsbGV0OiAnNjQ0YzNkNmM1MjMyZjAwMDA3NjgwMDQwJyxcbiAgICAgICAgICAgICAgd2FsbGV0czogWyc2NDRjM2Q2YzUyMzJmMDAwMDc2ODAwNDAnXSxcbiAgICAgICAgICAgICAgZW50ZXJwcmlzZTogJzYyY2M1OWI3Mjc0NDNhMDAwNzA4OTAzMycsXG4gICAgICAgICAgICAgIGVudGVycHJpc2VzOiBbJzYyY2M1OWI3Mjc0NDNhMDAwNzA4OTAzMyddLFxuICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzk5NzU4MjU2NicsXG4gICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aScsXG4gICAgICAgICAgICAgIHdhbGxldFR5cGU6ICdob3QnLFxuICAgICAgICAgICAgICB3YWxsZXRUeXBlczogWydob3QnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFsdWU6IDk5NzU4MjU2NixcbiAgICAgICAgICAgICAgYWRkcmVzczogJzB4MTY3MDQ3MmM0NGI1OTA1ODAzMjg0MGI5NGE3ZmQ3NDA1YjRiODdjYmY2N2Y0ZWI2MGUxYjc3ODFjZTAzZGRhZCcsXG4gICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnOTk3NTgyNTY2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICB9LFxuICAgICAgICBjb25zb2xpZGF0ZUlkOiAnNjhiNjQ4ODkyZWU5MzU1Yzk3ZTRiOTZkMDk0NWIyY2EnLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9O1xuICAgICAgY29uc3QgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzWydtb2NrJ10udXJpO1xuICAgICAgY29uc3Qgd2FsbGV0T2JqID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHdhbGxldERhdGEpO1xuXG4gICAgICBub2NrKGJnVXJsKVxuICAgICAgICAucG9zdCgnL2FwaS92Mi90c3VpL3dhbGxldC82MmUxNTZkYmQ2NDFjMDAwMDc2YmJhYmUwNDA0MWE5MC9jb25zb2xpZGF0ZUFjY291bnQvYnVpbGQnKVxuICAgICAgICAucmVwbHkoMjAwLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY29uc29saWRhdGlvblR4LFxuICAgICAgICAgICAgdHhIZXg6XG4gICAgICAgICAgICAgICcwMDAwMDIwMDA4MDBlMWY1MDUwMDAwMDAwMDAwMjA4NzcxMjczOTY5YWNmMDM1NmVkMGYzM2MxYzUyYjEwOWJiZmUwZGUzMzY5ZTlmYjk4MzdkNTJhNWE0MzhjNjUwMDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwNmYwZjRlMGVlZjE5MTc2NjI4ZWUwZWJjODBlZWY4OTE5NGFmZDllMTllNTk0NDRlNjRiOTk3ZjEyNTRmNmNkODAxMjJkZTk1YjMxMzQ3YTJmMGQ5NzE1YzU2MGRmZGZjOGZkMzUxNzgyY2E1ZTI3NWQ0YmMzYTk4ZWE3ODc2OWJjZTRmMTJkMDE0MDAwMDAwMDAyMGVhNjM5MDgxOTI5NjAzZmUyNTgwODczZjRhYTY0NzAxNzQ2ZDA4OWY5NzNiMDgyN2EyMjJkNzg0ZTk5MmVlMjY2ZjBmNGUwZWVmMTkxNzY2MjhlZTBlYmM4MGVlZjg5MTk0YWZkOWUxOWU1OTQ0NGU2NGI5OTdmMTI1NGY2Y2Q4ZTgwMzAwMDAwMDAwMDAwMGE0ODgyMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgIC5nZXQoJy9hcGkvdjIvdHN1aS9rZXkvNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1MDAwMDAwMDAnKVxuICAgICAgICAucmVwbHkoMjAwLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiAnZmFrZVBydicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgIC8vIENhbGwgdGhlIGZ1bmN0aW9uIHRvIHRlc3RcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgd2FsbGV0T2JqLnNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMoe1xuICAgICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgICAgICBjb25zb2xpZGF0aW9uVG9CYXNlQWRkcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiAnQ29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiBvdXRwdXQgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3YWxsZXQgYmFzZSBhZGRyZXNzJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHZhbGlkIGEgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFNldCB1cCB3YWxsZXQgZGF0YVxuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgICAgaWQ6ICc2MmUxNTZkYmQ2NDFjMDAwMDc2YmJhYmUwNDA0MWE5MCcsXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAga2V5czogW1xuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzUwMDAwMDAwMCcsXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NjAwMDAwMDAwJyxcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc3MDAwMDAwMDAnLFxuICAgICAgICBdLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICByb290QWRkcmVzczogJzB4NmYwZjRlMGVlZjE5MTc2NjI4ZWUwZWJjODBlZWY4OTE5NGFmZDllMTllNTk0NDRlNjRiOTk3ZjEyNTRmNmNkOCcsXG4gICAgICAgIH0sXG4gICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjb25zb2xpZGF0aW9uVHggPSB7XG4gICAgICAgIHR4UmVxdWVzdElkOiAnMTM4NTdjMWEtOWI2MS00Yjg1LTk2ZjEtMTBhZjEyNWY2OGEwJyxcbiAgICAgICAgd2FsbGV0SWQ6ICc2NDRjM2Q2YzUyMzJmMDAwMDc2ODAwNDAnLFxuICAgICAgICB0eEhleDpcbiAgICAgICAgICAnMDAwMDAyMDAwOGU2ZTY3NTNiMDAwMDAwMDAwMDIwNmYwZjRlMGVlZjE5MTc2NjI4ZWUwZWJjODBlZWY4OTE5NGFmZDllMTllNTk0NDRlNjRiOTk3ZjEyNTRmNmNkODAyMDIwMDAxMDEwMDAwMDEwMTAyMDAwMDAxMDEwMDE2NzA0NzJjNDRiNTkwNTgwMzI4NDBiOTRhN2ZkNzQwNWI0Yjg3Y2JmNjdmNGViNjBlMWI3NzgxY2UwM2RkYWQwMTIyMmI4MThiNDUwZGNkMjE2NGIyNWJhNWE1N2IwNTA3ZTU5YTRjOGViNmQ3Y2FkZDA4ZWE2MDlkYjE3YzYxMWQ0ZTEyZDAxNDAwMDAwMDAwMjAyM2ZjMjc1NzY2MjY3NjI5MDQzMzliMGFiZTFmZjk5Yzk5Nzk5YzkzYmVhNDZlOGJmNDUyZjIzYzY4OTkyZGIxMTY3MDQ3MmM0NGI1OTA1ODAzMjg0MGI5NGE3ZmQ3NDA1YjRiODdjYmY2N2Y0ZWI2MGUxYjc3ODFjZTAzZGRhZGU4MDMwMDAwMDAwMDAwMDAxYWUzMjQwMDAwMDAwMDAwMDAnLFxuICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgZmVlOiAyNDE3NDM0LFxuICAgICAgICAgIGZlZVN0cmluZzogJzI0MTc0MzQnLFxuICAgICAgICB9LFxuICAgICAgICB0eEluZm86IHtcbiAgICAgICAgICBtaW5lckZlZTogJzI0MTc0MzQnLFxuICAgICAgICAgIHNwZW5kQW1vdW50OiAnOTk3NTgyNTY2JyxcbiAgICAgICAgICBzcGVuZEFtb3VudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgYW1vdW50U3RyaW5nOiAnOTk3NTgyNTY2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwYXlHb0ZlZTogJzAnLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJzB4NmYwZjRlMGVlZjE5MTc2NjI4ZWUwZWJjODBlZWY4OTE5NGFmZDllMTllNTk0NDRlNjRiOTk3ZjEyNTRmNmNkOCcsXG4gICAgICAgICAgICAgIHZhbHVlOiA5OTc1ODI1NjYsXG4gICAgICAgICAgICAgIHdhbGxldDogJzY0NGMzZDZjNTIzMmYwMDAwNzY4MDA0MCcsXG4gICAgICAgICAgICAgIHdhbGxldHM6IFsnNjQ0YzNkNmM1MjMyZjAwMDA3NjgwMDQwJ10sXG4gICAgICAgICAgICAgIGVudGVycHJpc2U6ICc2MmNjNTliNzI3NDQzYTAwMDcwODkwMzMnLFxuICAgICAgICAgICAgICBlbnRlcnByaXNlczogWyc2MmNjNTliNzI3NDQzYTAwMDcwODkwMzMnXSxcbiAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICc5OTc1ODI1NjYnLFxuICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICB3YWxsZXRUeXBlOiAnaG90JyxcbiAgICAgICAgICAgICAgd2FsbGV0VHlwZXM6IFsnaG90J10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiA5OTc1ODI1NjYsXG4gICAgICAgICAgICAgIGFkZHJlc3M6ICcweDE2NzA0NzJjNDRiNTkwNTgwMzI4NDBiOTRhN2ZkNzQwNWI0Yjg3Y2JmNjdmNGViNjBlMWI3NzgxY2UwM2RkYWQnLFxuICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzk5NzU4MjU2NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29uc29saWRhdGVJZDogJzY4YjY0ODg5MmVlOTM1NWM5N2U0Yjk2ZDA5NDViMmNhJyxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICEoYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgYmxvY2toYXNoOiAnJyxcbiAgICAgICAgICAgIGZlZVBheWVyOiAnJyxcbiAgICAgICAgICAgIHR4UGFyYW1zOiB7fSxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQ6IGNvbnNvbGlkYXRpb25UeCBhcyB1bmtub3duIGFzIFRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gICAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgICAgIHdhbGxldDogbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHdhbGxldERhdGEpLFxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXNzZXJ0LmZhaWwoJ1RyYW5zYWN0aW9uIHNob3VsZCBwYXNzIHZlcmlmaWNhdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGFzc2VydC5mYWlsKCdUcmFuc2FjdGlvbiBzaG91bGQgcGFzcyB2ZXJpZmljYXRpb24nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0V4cGxhaW4gVHJhbnNhY3Rpb246ICcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLlRSQU5TRkVSLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZU91dHB1dHMnLCAnY2hhbmdlQW1vdW50JywgJ2ZlZScsICd0eXBlJ10sXG4gICAgICAgIGlkOiAnQnhvZUdYYkJDdXc2VkZFY2d3SEhVQUtyQ29Bc0dhblBCMzlrZFZWS1paY1InLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiBgJHt0ZXN0RGF0YS5BTU9VTlQgKiAyfWAsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgZmVlOiB7IGZlZTogdGVzdERhdGEuZ2FzRGF0YS5idWRnZXQudG9TdHJpbmcoKSB9LFxuICAgICAgICB0eXBlOiAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBzcGxpdCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6XG4gICAgICAgICAgJzAwMDA2NTAwMDgwMGNhOWEzYjAwMDAwMDAwMDAyMDU3NDg5NWZlODNiNDA5YjAwOWUyZTA0MzNhZDE4MjNlYzBkNTM4YWY3ZmVhNTIzOTBhMTk4YmRmZTc2NzZmMTMwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDBjODAxMDIwMDAxMDEwMDAwMDEwMTAyMDAwMDAxMDEwMDAyMDAwMTAxMDIwMDAxMDEwMjAyMDAwMTAxMDAwMjAwMDEwMTAzMDAwMTAxMDIwNDAwMDEwMTAwMDIwMDAxMDEwNDAwMDEwMTAyMDYwMDAxMDEwMDAyMDAwMTAxMDUwMDAxMDEwMjA4MDAwMTAxMDAwMjAwMDEwMTA2MDAwMTAxMDIwYTAwMDEwMTAwMDIwMDAxMDEwNzAwMDEwMTAyMGMwMDAxMDEwMDAyMDAwMTAxMDgwMDAxMDEwMjBlMDAwMTAxMDAwMjAwMDEwMTA5MDAwMTAxMDIxMDAwMDEwMTAwMDIwMDAxMDEwYTAwMDEwMTAyMTIwMDAxMDEwMDAyMDAwMTAxMGIwMDAxMDEwMjE0MDAwMTAxMDAwMjAwMDEwMTBjMDAwMTAxMDIxNjAwMDEwMTAwMDIwMDAxMDEwZDAwMDEwMTAyMTgwMDAxMDEwMDAyMDAwMTAxMGUwMDAxMDEwMjFhMDAwMTAxMDAwMjAwMDEwMTBmMDAwMTAxMDIxYzAwMDEwMTAwMDIwMDAxMDExMDAwMDEwMTAyMWUwMDAxMDEwMDAyMDAwMTAxMTEwMDAxMDEwMjIwMDAwMTAxMDAwMjAwMDEwMTEyMDAwMTAxMDIyMjAwMDEwMTAwMDIwMDAxMDExMzAwMDEwMTAyMjQwMDAxMDEwMDAyMDAwMTAxMTQwMDAxMDEwMjI2MDAwMTAxMDAwMjAwMDEwMTE1MDAwMTAxMDIyODAwMDEwMTAwMDIwMDAxMDExNjAwMDEwMTAyMmEwMDAxMDEwMDAyMDAwMTAxMTcwMDAxMDEwMjJjMDAwMTAxMDAwMjAwMDEwMTE4MDAwMTAxMDIyZTAwMDEwMTAwMDIwMDAxMDExOTAwMDEwMTAyMzAwMDAxMDEwMDAyMDAwMTAxMWEwMDAxMDEwMjMyMDAwMTAxMDAwMjAwMDEwMTFiMDAwMTAxMDIzNDAwMDEwMTAwMDIwMDAxMDExYzAwMDEwMTAyMzYwMDAxMDEwMDAyMDAwMTAxMWQwMDAxMDEwMjM4MDAwMTAxMDAwMjAwMDEwMTFlMDAwMTAxMDIzYTAwMDEwMTAwMDIwMDAxMDExZjAwMDEwMTAyM2MwMDAxMDEwMDAyMDAwMTAxMjAwMDAxMDEwMjNlMDAwMTAxMDAwMjAwMDEwMTIxMDAwMTAxMDI0MDAwMDEwMTAwMDIwMDAxMDEyMjAwMDEwMTAyNDIwMDAxMDEwMDAyMDAwMTAxMjMwMDAxMDEwMjQ0MDAwMTAxMDAwMjAwMDEwMTI0MDAwMTAxMDI0NjAwMDEwMTAwMDIwMDAxMDEyNTAwMDEwMTAyNDgwMDAxMDEwMDAyMDAwMTAxMjYwMDAxMDEwMjRhMDAwMTAxMDAwMjAwMDEwMTI3MDAwMTAxMDI0YzAwMDEwMTAwMDIwMDAxMDEyODAwMDEwMTAyNGUwMDAxMDEwMDAyMDAwMTAxMjkwMDAxMDEwMjUwMDAwMTAxMDAwMjAwMDEwMTJhMDAwMTAxMDI1MjAwMDEwMTAwMDIwMDAxMDEyYjAwMDEwMTAyNTQwMDAxMDEwMDAyMDAwMTAxMmMwMDAxMDEwMjU2MDAwMTAxMDAwMjAwMDEwMTJkMDAwMTAxMDI1ODAwMDEwMTAwMDIwMDAxMDEyZTAwMDEwMTAyNWEwMDAxMDEwMDAyMDAwMTAxMmYwMDAxMDEwMjVjMDAwMTAxMDAwMjAwMDEwMTMwMDAwMTAxMDI1ZTAwMDEwMTAwMDIwMDAxMDEzMTAwMDEwMTAyNjAwMDAxMDEwMDAyMDAwMTAxMzIwMDAxMDEwMjYyMDAwMTAxMDAwMjAwMDEwMTMzMDAwMTAxMDI2NDAwMDEwMTAwMDIwMDAxMDEzNDAwMDEwMTAyNjYwMDAxMDEwMDAyMDAwMTAxMzUwMDAxMDEwMjY4MDAwMTAxMDAwMjAwMDEwMTM2MDAwMTAxMDI2YTAwMDEwMTAwMDIwMDAxMDEzNzAwMDEwMTAyNmMwMDAxMDEwMDAyMDAwMTAxMzgwMDAxMDEwMjZlMDAwMTAxMDAwMjAwMDEwMTM5MDAwMTAxMDI3MDAwMDEwMTAwMDIwMDAxMDEzYTAwMDEwMTAyNzIwMDAxMDEwMDAyMDAwMTAxM2IwMDAxMDEwMjc0MDAwMTAxMDAwMjAwMDEwMTNjMDAwMTAxMDI3NjAwMDEwMTAwMDIwMDAxMDEzZDAwMDEwMTAyNzgwMDAxMDEwMDAyMDAwMTAxM2UwMDAxMDEwMjdhMDAwMTAxMDAwMjAwMDEwMTNmMDAwMTAxMDI3YzAwMDEwMTAwMDIwMDAxMDE0MDAwMDEwMTAyN2UwMDAxMDEwMDAyMDAwMTAxNDEwMDAxMDEwMjgwMDAwMTAxMDAwMjAwMDEwMTQyMDAwMTAxMDI4MjAwMDEwMTAwMDIwMDAxMDE0MzAwMDEwMTAyODQwMDAxMDEwMDAyMDAwMTAxNDQwMDAxMDEwMjg2MDAwMTAxMDAwMjAwMDEwMTQ1MDAwMTAxMDI4ODAwMDEwMTAwMDIwMDAxMDE0NjAwMDEwMTAyOGEwMDAxMDEwMDAyMDAwMTAxNDcwMDAxMDEwMjhjMDAwMTAxMDAwMjAwMDEwMTQ4MDAwMTAxMDI4ZTAwMDEwMTAwMDIwMDAxMDE0OTAwMDEwMTAyOTAwMDAxMDEwMDAyMDAwMTAxNGEwMDAxMDEwMjkyMDAwMTAxMDAwMjAwMDEwMTRiMDAwMTAxMDI5NDAwMDEwMTAwMDIwMDAxMDE0YzAwMDEwMTAyOTYwMDAxMDEwMDAyMDAwMTAxNGQwMDAxMDEwMjk4MDAwMTAxMDAwMjAwMDEwMTRlMDAwMTAxMDI5YTAwMDEwMTAwMDIwMDAxMDE0ZjAwMDEwMTAyOWMwMDAxMDEwMDAyMDAwMTAxNTAwMDAxMDEwMjllMDAwMTAxMDAwMjAwMDEwMTUxMDAwMTAxMDJhMDAwMDEwMTAwMDIwMDAxMDE1MjAwMDEwMTAyYTIwMDAxMDEwMDAyMDAwMTAxNTMwMDAxMDEwMmE0MDAwMTAxMDAwMjAwMDEwMTU0MDAwMTAxMDJhNjAwMDEwMTAwMDIwMDAxMDE1NTAwMDEwMTAyYTgwMDAxMDEwMDAyMDAwMTAxNTYwMDAxMDEwMmFhMDAwMTAxMDAwMjAwMDEwMTU3MDAwMTAxMDJhYzAwMDEwMTAwMDIwMDAxMDE1ODAwMDEwMTAyYWUwMDAxMDEwMDAyMDAwMTAxNTkwMDAxMDEwMmIwMDAwMTAxMDAwMjAwMDEwMTVhMDAwMTAxMDJiMjAwMDEwMTAwMDIwMDAxMDE1YjAwMDEwMTAyYjQwMDAxMDEwMDAyMDAwMTAxNWMwMDAxMDEwMmI2MDAwMTAxMDAwMjAwMDEwMTVkMDAwMTAxMDJiODAwMDEwMTAwMDIwMDAxMDE1ZTAwMDEwMTAyYmEwMDAxMDEwMDAyMDAwMTAxNWYwMDAxMDEwMmJjMDAwMTAxMDAwMjAwMDEwMTYwMDAwMTAxMDJiZTAwMDEwMTAwMDIwMDAxMDE2MTAwMDEwMTAyYzAwMDAxMDEwMDAyMDAwMTAxNjIwMDAxMDEwMmMyMDAwMTAxMDAwMjAwMDEwMTYzMDAwMTAxMDJjNDAwMDEwMTAwMDIwMDAxMDE2NDAwMDEwMTAyYzYwMDAxMDEwMDU3NDg5NWZlODNiNDA5YjAwOWUyZTA0MzNhZDE4MjNlYzBkNTM4YWY3ZmVhNTIzOTBhMTk4YmRmZTc2NzZmMTMwMzAzNGY0MDNmZjliNzNiNTc5NGI3OWE4OWViYmNkODEwMzMxZmVhNTI4NzhkYjBiNGRjMWExYzg4ZjRjMGRjNTYxNjAwMDAwMDAwMDAwMDAwMjAwM2NhZjdlNjc3YzcyYjI0MWQ2MWQwMGU2MDBiNmRmMjU2MzljNTgyOTg3ZDBhYTc4Y2VlYTBiOTk1M2VhYzUyYTYwYjBlNTFmOWZmYTM5OGY2ZWUxZDMxMDFkNmM5ZWZhMTNkMTgwMGU0MTJkN2UwODMyZTI2MTZmMTc5M2ZkNzljZTkxNzAwMDAwMDAwMDAyMDUwNDM1YTQ5ZjA2MzViYzJmMmMzYmJkY2UwNWExNmIyNGZhZjAzNjhlZGFhMjVjOGZiY2UxNmVmNjI2MDJkYTVjZGE0NGFlNDdmMzgwZjQ1ZDNjZDQ5MTE4ODBmNGU5YTI0YjUyZmU0MjQ2ODNjNjZjZjNjNzc2OWRkM2NhMjJjMTAwMDAwMDAwMDAwMDAwMDIwMGM3OGZhMjAyMzZiYjg2ODcxZWFjZmUyYjRmMjE1OGVhYTY4ZjRmNDU2NWQ4Y2Y5ODY1ZWU5ZjI3OWU0YmQ0MDU3NDg5NWZlODNiNDA5YjAwOWUyZTA0MzNhZDE4MjNlYzBkNTM4YWY3ZmVhNTIzOTBhMTk4YmRmZTc2NzZmMTNlODAzMDAwMDAwMDAwMDAwMDBlMWY1MDUwMDAwMDAwMDAwJyxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24ub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBzdGFraW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogQnVmZmVyLmZyb20odGVzdERhdGEuQUREX1NUQUtFLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnbW9kdWxlJyxcbiAgICAgICAgICAnZnVuY3Rpb24nLFxuICAgICAgICAgICd2YWxpZGF0b3JBZGRyZXNzJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdiUDc4Ym9aNDhzRGRKc2cyVjF0SmFocEd5QndhQzlHU1RMMnJ2eUFEbnNoJyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlcXVlc3RBZGRTdGFrZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2UuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiB0ZXN0RGF0YS5TVEFLSU5HX0FNT1VOVC50b1N0cmluZygpLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIGZlZTogeyBmZWU6IHRlc3REYXRhLmdhc0RhdGEuYnVkZ2V0LnRvU3RyaW5nKCkgfSxcbiAgICAgICAgdHlwZTogMjUsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBleHBsYWluIHRyYW5zYWN0aW9uIHdpdGggbWlzc2luZyBwYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe30pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGVycm9yLm1lc3NhZ2UsICdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6ICdyYW5kb21TdHJpbmcnIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGVycm9yLm1lc3NhZ2UsICdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQYXJzZSBUcmFuc2FjdGlvbnM6ICcsICgpID0+IHtcbiAgICBjb25zdCB0cmFuc2ZlcklucHV0c1Jlc3BvbnNlID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogbmV3IEJpZ051bWJlcih0ZXN0RGF0YS5BTU9VTlQpLnBsdXModGVzdERhdGEuQU1PVU5UKS5wbHVzKHRlc3REYXRhLmdhc0RhdGEuYnVkZ2V0KS50b0ZpeGVkKCksXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCB0cmFuc2Zlck91dHB1dHNSZXNwb25zZSA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5wYXJzZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLlRSQU5TRkVSLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSk7XG5cbiAgICAgIHBhcnNlZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBpbnB1dHM6IHRyYW5zZmVySW5wdXRzUmVzcG9uc2UsXG4gICAgICAgIG91dHB1dHM6IHRyYW5zZmVyT3V0cHV0c1Jlc3BvbnNlLFxuICAgICAgICBmZWU6IG5ldyBCaWdOdW1iZXIoMjAwMDAwMDApLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gcGFyc2UgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aGVuIGV4cGxhaW5UcmFuc2FjdGlvbiByZXNwb25zZSBpcyB1bmRlZmluZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdHViID0gc2lub24uc3R1YihTdWkucHJvdG90eXBlLCAnZXhwbGFpblRyYW5zYWN0aW9uJyk7XG4gICAgICBzdHViLnJlc29sdmVzKHVuZGVmaW5lZCk7XG4gICAgICBhd2FpdCBiYXNlY29pbi5wYXJzZVRyYW5zYWN0aW9uKHsgdHhIZXg6IHRlc3REYXRhLlRSQU5TRkVSIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICAgIHN0dWIucmVzdG9yZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQWRkcmVzcyBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGxldCBrZXljaGFpbnM7XG4gICAgbGV0IGNvbW1vbktleWNoYWluO1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbW1vbktleWNoYWluID1cbiAgICAgICAgJzE5YmRmZTJhNGI0OThhMDU1MTEzODEyMzVhODg5MmQ1NDI2NzgwN2M0YTNmNjU0ZTMxMGI5MzhiOGI0MjRmZjRhZGVkYmU5MmY0YzE0NmRlNjQxYzY3NTA4YTk2MTMyNGM4NTA0Y2RmOGUwYzBhY2JiNjhkNjEwNGNjY2NkNzgxJztcbiAgICAgIGtleWNoYWlucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnNjQyNGMzNTNlYWY3OGQwMDA3NjZlOTU5NDk4Njg0NjgnLFxuICAgICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICAgIHR5cGU6ICd0c3MnLFxuICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgJzE5YmRmZTJhNGI0OThhMDU1MTEzODEyMzVhODg5MmQ1NDI2NzgwN2M0YTNmNjU0ZTMxMGI5MzhiOGI0MjRmZjRhZGVkYmU5MmY0YzE0NmRlNjQxYzY3NTA4YTk2MTMyNGM4NTA0Y2RmOGUwYzBhY2JiNjhkNjEwNGNjY2NkNzgxJyxcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6XG4gICAgICAgICAgICAne1wiaXZcIjpcImNaZDVpN0w0Unh0d3JBTFcycks3VUE9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCI6XCJjY21cIixcImFkYXRhXCI6XCJcIixcImNpcGhlclwiOlwiYWVzXCIsXCJzYWx0XCI6XCI1emdvSDFCZDNGdz1cIixcImN0XCI6XCI5dlZsblhGUnRyTTlGVkVvK2QyY2hiR0hsTTlsRlplbXVlQnVBczNCSWtQbzMzRm83anp3d05LL2tJV2tFeWcrTm1FQmQ1SWFxQVMxNTdudnZ2d3p6c21NV2xRZFV6OXFibVhOdjNwZzk4N2NYRlIwOGV4Uys0dWh3UDFZTk9qSlRSdlJOY085WnFIYjQ2ZDRmbXlKL3lDOS9zdXNDZ2U3ci9Fc2JhTjVDM2FmdjFkenlidXE5MTJGd2FRRWxaTFlZcDVCSUN1ZEZPTVo5azBVRE1mS00vUE1Ea0g3V2V4b0dIcjlHS3EvYmdDSDJCMzlUWlp5SEtVNlV5NDdsWGVwMnM2aDBEck13SE9ybm1pTDNEWmpPajg4WW52cGhsenh1bzRlT2xEMlVIaWEyK252SWFJU1lzMjlQcjBEQXZSRXV0Y2h2Y0JwRXhqMWtXV1B2N2hRWXJ2OEYwTkFkYXRzYldsM3creEt5ZmlNS28xVVNscnd5SnZpeXBHdFF0WE9KeXcwWFBOMHJ2MitMNWxXOEJianB6SGZZWU4xM2ZKVGVkbEdURmhoa3pWdGJiUEFLRTAya3g3ekNKY2pZYWlleGRTVHNyRExTY1lOVDkvSmhkdDI3S3Bzb29laHdWb2hMZlNLejR2YkZmUnUyTVBadzMvK2MvaGZpSk5ndHo2ZXNXYm54R3JjRThVMkl3UFlDYUsrR2hrNERjcVdOSW5pNTlSSTVCNWtBc1FPVG9JSTQwcVBONTEwdVRneEJTUE83cTdNSGdreGRkNENxQnErb2pyOWowUDdvYW84RTVZK0NCREpyb2pEb0NoMW9DQ0RXOXZvMmRYbFZjRDhTSWJ3N1UvOUFmdkViQTR4eUUvNW1kMU03Q0l3TG5XczJZbnYwWXRhS29xaGRTOXg2Rm1IbE1EaE4vREtIaW5yd21vd3RyVFQ4MmZPa3BPNWc5c2FTbWdVN1F5M2dMdDh0K1Z3ZEV5ZUZlUVVLUlN5Y2k4cWdxWFFhWklnNCthWGdhU09ubENGTXRtQjhla1l4RWhUWTV1elJmck5nUzRzMVFlcUZCcE50VUYrWWRpMjk3cGJWWG5Kb1hBTitTVldkODBHQ3greUkyZHBWQzg5azNyT1dLOVdleXFsbnp1TEpXcDJSSU9COWNkVzhHRnYvZk4rUUFKcFllVnhPRTQrblpEc0tuc2o4bktjZzl0NERseDFHNmdMTTEvVnE5WXhOTGJ1enVSQzBhc1VZdmRNbm9NdnN6bXBtKytUeG5kWWlzZ05Zc2NwWlNvejd3dmNhekpORVBmaFBWakVrZDZ0VVV1TjRHTTM1SDBEbUtDVVFOVCthNkI2aG1IbFRadmp4aXlHQWc1Ylk1OWhkanZKKzIyUWR1YXpsRUVDNkxJM0hyQTd1SzBUcHBsV3pTMXRDSUZ2VE1VaGo2NURFWm1OSjIrWlk5YlE0dnNNZitEUlIzT09HNHQrRE1sTmZqT2Qzek52M1FvWTk1QmpmV3ByeUZ3UHpEcTdiQ1A2N0pEc29qN2oyVFk1RlJTclJrRDc3SDBFd2x1eDJjV2ZqUlR3Y01IY2RReHh1VjBPUDBhTmpHRGp5YkZOXCJ9JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnNjQyNGMzNTNlYWY3OGQwMDA3NjZlOTYxMzdkNDQwNGInLFxuICAgICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICAgICAgdHlwZTogJ3RzcycsXG4gICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAnMTliZGZlMmE0YjQ5OGEwNTUxMTM4MTIzNWE4ODkyZDU0MjY3ODA3YzRhM2Y2NTRlMzEwYjkzOGI4YjQyNGZmNGFkZWRiZTkyZjRjMTQ2ZGU2NDFjNjc1MDhhOTYxMzI0Yzg1MDRjZGY4ZTBjMGFjYmI2OGQ2MTA0Y2NjY2Q3ODEnLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjpcbiAgICAgICAgICAgICd7XCJpdlwiOlwidmkwZFBlZi9SeDdrRy9wUnlTUWk2UT09XCIsXCJ2XCI6MSxcIml0ZXJcIjoxMDAwMCxcImtzXCI6MjU2LFwidHNcIjo2NCxcIm1vZGVcIjpcImNjbVwiLFwiYWRhdGFcIjpcIlwiLFwiY2lwaGVyXCI6XCJhZXNcIixcInNhbHRcIjpcIjllZmhRc2lFdlZzPVwiLFwiY3RcIjpcIkd3NmF0dmY2Z3hLenNqdGwzeHNlaXBPM3JBeHAxbUF6N1l1MWloRnNpNS9sZjJ2TVplZ0FwZ1p4K3B5SUxGUzlLS0xIYk5GM1U2V2dTWWRycjJ0NHZ6ZExzWGtIMVdJeGZIUytjZDJDNU41OXlBRFpEblBKQlQ2cHYvSVJ2YVllbFAwQ2szbklZUTJoU01tOG9wK1ZPV0MvU3pIZWg3c2xZRHF3RUhUR2FuMFdpZ2Z2azF5UmQ3Q0NKVGFFQW9tbmMvNGVGaTJOWTNYM2d0LzNvcHk5SUFna25ud1VGb2huOTZFV3BFUTBGNnBiekgvWjhWRjZnRitEVWNyckJ5QXhFeFVQbkhRWmlGazNZSFUvdlZWNEZ4QlUvbVZBRTh4QnNCbjV1bDVlNVNVTVBmYzdUQnVKV3Y0QkJ5VE5nOXhEU2hGLzkxWXgybmJmVW01ZDlRbU04bHBLZ3p6UXZjSzhQT0FQazg3Z1JDdUtuc0doNXZOUzBVcHBrSGMrb2NmelJRbEdBNmp6ZTdReXlRTzByTWo1THk4a1dqd2sydklTdktZSFlTMU5SN1ZVNTQ5VUlYbzdOWGphdHVuS1NjMytJcmVvUlVISXNoaWFMZzZobCtweENDdWMwcVE0M1YwbWRJZkNqVE44Z2tHV0xOazhSN3RBR1B6OWp5YXBRUGNQRUdIZ0V6MEFUSWk2eU1OV0NzaWJTMmVMaUUxdVZFSk9Ob000bGs2RlBsM1EyQ0hiVzJNZUVicWpZOGhiYXcxOG1OYjJ4U0JIL0Z3cGlpYWwrVHZpMmltcWduQ080WnBPOWJsbEtmdFpQY1F5MHN0TitlR0JsYjV1ZnlmbEtrRFNpQ2hIWXJvR2pFcG1pRmljZGRlNDhjSnN6RjUydUtObmYxcTY3ZkE5L1MyRkFIUWFiM0VYb2p4SDJHYmsra2tWMmgvVFlLRkZaU1dDM3ZpNGU4bU8rdmpNVWNSMEFkc2dQRnlFSXowU0NHdWJhM0NuVExOZEV1WndzYXVBZUhreDJ2VVRuUmdKUFZnTmVldVhtc1ZHNzZTeTJnZ0pIdWFsczBIajhVMlhkYTBxTzFSdUZmb0NXZnNzOXduNkhHUndQUGtoU0IvOG9OZ3VBcW1SVkdLa2Q4Wnd0M0l2clRkOWZrMC9yRkZESktHejdXeU5Ia1lnVW1OaUdjSXREMTJ2MGp4N0ZaNTJFSnpsM0F2MVJ5SlVRSzE4KzhFWVBoM1NHaVU5ZHQ3VlgwYUYwdW82Sm91S2hPZWxkVXZNUCtBdWdRejhmVWNsd1RRc2Jib1ZnMjdZeG8wRHlBVFZ3VGhXNWE1NlI2UWY1WmlRSmx1RnV6czV5OThycTBTNXEwNDZsRTZvM3ZWbUpwRWR3amVTQ0pvRVQ1Q0w0blRna1h5V3ZobTRlQjh1L2U2NmwzbzBxYmFTeDhxOVlZbVQ5RXBSY2w1VFA0VGhMQktFVFlkelZ2ZzRleGpRZmVrdE1hdGs1RXlVcEVJaFpQWGg1dlhwSlplc2RmTzlMSjh6VGFIQnNCakRQVTdjZE5nUU1iZWJwYXRhUmk4QTBlbDIvSUpYbCtFK29sZ0F6NXpDNGkyTzFRPT1cIn0nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICc2NDI0YzM1M2VhZjc4ZDAwMDc2NmU5NTEwYjEyNWZiYScsXG4gICAgICAgICAgc291cmNlOiAnYml0Z28nLFxuICAgICAgICAgIHR5cGU6ICd0c3MnLFxuICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgJzE5YmRmZTJhNGI0OThhMDU1MTEzODEyMzVhODg5MmQ1NDI2NzgwN2M0YTNmNjU0ZTMxMGI5MzhiOGI0MjRmZjRhZGVkYmU5MmY0YzE0NmRlNjQxYzY3NTA4YTk2MTMyNGM4NTA0Y2RmOGUwYzBhY2JiNjhkNjEwNGNjY2NkNzgxJyxcbiAgICAgICAgICB2ZXJpZmllZFZzc1Byb29mOiB0cnVlLFxuICAgICAgICAgIGlzQml0R286IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHZhbGlkYXRpbmcgYSB3ZWxsIGZvcm1hdHRlZCBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICdmOTQxYWUzY2JlNTY0NWRjY2MxNWRhODM0NmI1MzNmN2Y5MWYyMDIwODlhNTUyMTY1M2MwNjJiMmZmMTBiMzA0JztcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB2YWxpZGF0aW5nIGEgd2VsbCBmb3JtYXR0ZWQgYWRkcmVzcyBwcmVmaXhlZCB3aXRoIDB4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICcweGY5NDFhZTNjYmU1NjQ1ZGNjYzE1ZGE4MzQ2YjUzM2Y3ZjkxZjIwMjA4OWE1NTIxNjUzYzA2MmIyZmYxMGIzMDQnO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWxpZGF0aW5nIGFuIG9sZCBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICcweDI5NTliZmMzZmRiN2RjMjNmZWQ4ZGViYTJmYWZiNzBmM2U2MDZhNTknO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdmFsaWRhdGluZyBhbiBpbmNvcnJlY3RseSBmb3JtYXR0ZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJ3dyb25nYWRkcmVzcyc7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgaXNXYWxsZXRBZGRyZXNzIHdpdGggdmFsaWQgYWRkcmVzcyBmb3IgaW5kZXggNCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAnMHg4YjNjNzgwNzczMGQ3NTc5MmRkNmM0OTczMmNmOWYwMTRkNjk4NGE5Yzc3ZDM4NmJkYjEwNzJhOWU1MzdkOGQ4JztcbiAgICAgIGNvbnN0IGluZGV4ID0gNDtcblxuICAgICAgY29uc3QgcGFyYW1zID0geyBjb21tb25LZXljaGFpbiwgYWRkcmVzczogbmV3QWRkcmVzcywgaW5kZXgsIGtleWNoYWlucyB9O1xuICAgICAgKGF3YWl0IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyhwYXJhbXMpKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpc1dhbGxldEFkZHJlc3Mgd2hlbiBrZXljaGFpbnMgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnMHgyOTU5YmZjM2ZkYjdkYzIzZmVkOGRlYmEyZmFmYjcwZjNlNjA2YTU5JztcbiAgICAgIGNvbnN0IGluZGV4ID0gMDtcblxuICAgICAgY29uc3QgcGFyYW1zID0geyBjb21tb25LZXljaGFpbiwgYWRkcmVzcywgaW5kZXggfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyhwYXJhbXMpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGlzV2FsbGV0QWRkcmVzcyB3aGVuIG5ldyBhZGRyZXNzIGlzIGludmFsaWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3cm9uZ0FkZHJlc3MgPSAnYmFkQWRkcmVzcyc7XG4gICAgICBjb25zdCBpbmRleCA9IDA7XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgY29tbW9uS2V5Y2hhaW4sIGFkZHJlc3M6IHdyb25nQWRkcmVzcywgaW5kZXggfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyhwYXJhbXMpLCB7XG4gICAgICAgIG1lc3NhZ2U6IGBpbnZhbGlkIGFkZHJlc3M6ICR7d3JvbmdBZGRyZXNzfWAsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXIgVHJhbnNhY3Rpb25zOicsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MwID0gJzB4OTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMyc7XG4gICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9ICcweDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODknO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuICAgIGxldCBnZXRCYWxhbmNlU3R1Yjogc2lub24uU2lub25TdHViO1xuICAgIGxldCBnZXRJbnB1dENvaW5zU3R1Yjogc2lub24uU2lub25TdHViO1xuICAgIGxldCBnZXRGZWVFc3RpbWF0ZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgZ2V0QmFsYW5jZVN0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBnZXRCYWxhbmNlU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzMCkucmVzb2x2ZXMoJzE5MDAwMDAwMDAnKTtcblxuICAgICAgZ2V0SW5wdXRDb2luc1N0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldElucHV0Q29pbnMnIGFzIGtleW9mIFN1aSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzMCkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4YzA1Yzc2NWUyNmU2YWU4NGM3OGZhMjQ1ZjM4YTIzZmIyMDQwNmE1Y2YzZjYxYjU3YmQzMjNhMGRmOWQ5ODAwMycsXG4gICAgICAgICAgdmVyc2lvbjogJzE5NScsXG4gICAgICAgICAgZGlnZXN0OiAnN0JKTGIzMkxLTjd3dDV1djR4Z1hXNEFiRktvTU5jUEU3Nm80MVRRRXZVWmInLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzE5MDAwMDAwMDAnKSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEZlZUVzdGltYXRlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBQ0FBZ0Ewa2xyQUFBQUFBQWdBT1RxcHFLUi9nS1JoRkxtUmJWbFBOSmdwZndQczE5aGs5V0FrV3FwNDRrQ0FnQUJBUUFBQVFFQ0FBQUJBUUNSOGw0amU0T2dDbUp5VDl4S2dlUS9TVTNHdEJvU1FVa29KdE51VFJNZG93SEFYSFplSnVhdWhNZVBva1h6aWlQN0lFQnFYUFAyRzFlOU1qb04rZG1BQThNQUFBQUFBQUFBSUZ2SmlKQmRFQWhpMTRjeGNTci9IVUloQlpNYkxNZDRyY3pVVENNSWIzVW1rZkplSTN1RG9BcGljay9jU29Ia1AwbE54clFhRWtGSktDYlRiazBUSGFQb0F3QUFBQUFBQUFEaDlRVUFBQUFBQUE9PSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcigxOTk3ODgwKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0eG4gZm9yIG5vbi1iaXRnbyByZWNvdmVyeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgndHJhbnNhY3Rpb25zJyk7XG4gICAgICBjb25zdCB0eCA9IHJlcy50cmFuc2FjdGlvbnNbMF07XG4gICAgICB0eC5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgdHgucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxODk3ODAyMzMyJyk7XG4gICAgICB0eC5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBQ0FBaGNLaDV4QUFBQUFBQWdBT1RxcHFLUi9nS1JoRkxtUmJWbFBOSmdwZndQczE5aGs5V0FrV3FwNDRrQ0FnQUJBUUFBQVFFQ0FBQUJBUUNSOGw0amU0T2dDbUp5VDl4S2dlUS9TVTNHdEJvU1FVa29KdE51VFJNZG93SEFYSFplSnVhdWhNZVBva1h6aWlQN0lFQnFYUFAyRzFlOU1qb04rZG1BQThNQUFBQUFBQUFBSUZ2SmlKQmRFQWhpMTRjeGNTci9IVUloQlpNYkxNZDRyY3pVVENNSWIzVW1rZkplSTN1RG9BcGljay9jU29Ia1AwbE54clFhRWtGSktDYlRiazBUSGFQb0F3QUFBQUFBQUtTSUlRQUFBQUFBQUE9PSdcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IE5vbkJpdEdvVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBOb25CaXRHb1R4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbih0eC5zZXJpYWxpemVkVHgpO1xuICAgICAgY29uc3QgTm9uQml0R29UeG5Kc29uID0gTm9uQml0R29UeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKE5vbkJpdEdvVHhuSnNvbi5pZCwgJ0ZEQ0JVTnFMVUFXNHFCVG5GalRDUFphekw4Vm5SQlAyZ1MzR21Fbnd0RWNnJyk7XG4gICAgICBzaG91bGQuZXF1YWwoTm9uQml0R29UeG5Kc29uLnNlbmRlciwgc2VuZGVyQWRkcmVzczApO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHR4biBmb3IgdW5zaWduZWQgc3dlZXAgcmVjb3ZlcnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICB9KTtcblxuICAgICAgcmVzLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0eFJlcXVlc3RzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDIwMDA4NWMyYTFlNzEwMDAwMDAwMDAwMjAwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5MDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwOTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMzAxYzA1Yzc2NWUyNmU2YWU4NGM3OGZhMjQ1ZjM4YTIzZmIyMDQwNmE1Y2YzZjYxYjU3YmQzMjNhMGRmOWQ5ODAwM2MzMDAwMDAwMDAwMDAwMDAyMDViYzk4ODkwNWQxMDA4NjJkNzg3MzE3MTJhZmYxZDQyMjEwNTkzMWIyY2M3NzhhZGNjZDQ0YzIzMDg2Zjc1MjY5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzZTgwMzAwMDAwMDAwMDAwMGE0ODgyMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzg3Mzc0OGEzMWU3NjZmNWY4ZjAwNzdkOGQwMDAzNTQ4ZmFlNGY0YzEzNDQwNjdhN2MzNzk5Y2ZhNzM4MDhmYjcnLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzAnLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4OTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMycsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE4OTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoMTg5NzgwMjMzMiksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxODk3ODAyMzMyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcxODk3ODAyMzMyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7IGZlZTogMjE5NzY2OCwgZmVlU3RyaW5nOiAnMjE5NzY2OCcgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnM2I4OWVlYzlkMmQyZjNiMDQ5ZWNkYTJlN2I1ZjQ3ODI3Zjc5MjdmZTY2MThkNmU4YjEzZjY0ZTdjOTVmNGIwMGI5NTc3YWIwMTM5NWVjZjhlZWI4MDRiNTkwY2VkYWUxNGZmNWZkMzk0N2JmM2I3YTk1YjkzMjdjNDllMjdjNTQnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4SGV4ID0gcmVzLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2VyaWFsaXplZFR4O1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4QmFzZTY0ID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4SGV4LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHhCYXNlNjQpO1xuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkpzb24gPSB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bkpzb24uaWQsICdGRENCVU5xTFVBVzRxQlRuRmpUQ1BaYXpMOFZuUkJQMmdTM0dtRW53dEVjZycpO1xuICAgICAgc2hvdWxkLmVxdWFsKHVuc2lnbmVkU3dlZXBUeG5Kc29uLnNlbmRlciwgc2VuZGVyQWRkcmVzczApO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdHhuIGZvciB1bnNpZ25lZCBzd2VlcCByZWNvdmVyeSB3aXRoIG11bHRpcGxlIGlucHV0IGNvaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9ICcweDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODknO1xuICAgICAgZ2V0QmFsYW5jZVN0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzcykucmVzb2x2ZXMoJzE3OTgwMDIxMjAnKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MpLnJlc29sdmVzKFtcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDYwYWVmYWZmYTM1ZGFhMzJhMWU1NjFmMmJhOWMxODc1MzA1N2QyZmViNTAyZjMyODA0ZTU3M2VhMjg3NWEzOWMnLFxuICAgICAgICAgIHZlcnNpb246ICcxOTUnLFxuICAgICAgICAgIGRpZ2VzdDogJ2pLamR1eThnSERFMjQ0WkpXY1AzSlhmWFBLanFZNjdhdk1xaHpIdzk4Q0wnLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzk4MDAyMTIwJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg5YTM2M2M5MWQyOWI1MDgzMmFiOTgwOTRiNmMxOTMzOTQxMjgwZmMyOThhMmVjMjMyNzM5ZjE0Y2UzMWUyNTgyJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMTk3JyxcbiAgICAgICAgICBkaWdlc3Q6ICdFTG5iZ21XN2NyUFlyM0I5cFdWcWZnOXVMZUp0NDNLUG9ma2ZkUjZMV2Z0dScsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTcwMDAwMDAwMCcpLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFDQUFqSWREVmxBQUFBQUFBZ010amxmdWJaSGxWWTJnWjNGVXd2Q0ZlVk5JNHhmNVdzeWUrdDRiUVJMOHdDQWdBQkFRQUFBUUVDQUFBQkFRQUE1T3Ftb3BIK0FwR0VVdVpGdFdVODBtQ2wvQSt6WDJHVDFZQ1JhcW5qaVFLYU5qeVIwcHRRZ3lxNWdKUzJ3Wk01UVNnUHdwaWk3Q01uT2ZGTTR4NGxnc1VBQUFBQUFBQUFJTVk1aGZVRnp1TVZhWTMrTHdtWlR2eXBSU0FKUkxOWG9jUllSOXlLYWxYeVlLNzYvNk5kcWpLaDVXSHl1cHdZZFRCWDB2NjFBdk1vQk9WejZpaDFvNXpEQUFBQUFBQUFBQ0FLMTVQdE82Z3dTTngwYkhrc1ZKT2NOOTZBWXljKzNZVnBKemFZTU1oSGJRRGs2cWFpa2Y0Q2tZUlM1a1cxWlR6U1lLWDhEN05mWVpQVmdKRnFxZU9KNkFNQUFBQUFBQUFBNGZVRkFBQUFBQUE9J1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKDE5OTc4ODApKTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICBiaXRnb0tleTpcbiAgICAgICAgICAnN2Q5MWY2OWMyODVjMGIzYjBhMGQ2MzcxMDIwZjE5NGQ0NTk1NmVlNTU2Mjg5ZTc4NTRmNmQxMTRlMDc4MDU3MjBlZWM2NzNjNmEyXFxuNzJiN2RhNDEzN2RiN2IxMjg5ZjM4YWY0ZjRiODI0ZWYwZGU2NWM1ZjUzZTNlNjY2MTc2MTcnLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiAnMHgzMmQ4ZTU3ZWU2ZDkxZTU1NThkYTA2NzcxNTRjMmYwODU3OTUzNDhlMzE3Zjk1YWNjOWVmYWRlMWI0MTEyZmNjJyxcbiAgICAgIH0pO1xuXG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHR4UmVxdWVzdHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMjAwMDgyNGNkMDk2YjAwMDAwMDAwMDAyMDMyZDhlNTdlZTZkOTFlNTU1OGRhMDY3NzE1NGMyZjA4NTc5NTM0OGUzMTdmOTVhY2M5ZWZhZGUxYjQxMTJmY2MwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDAwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5MDI5YTM2M2M5MWQyOWI1MDgzMmFiOTgwOTRiNmMxOTMzOTQxMjgwZmMyOThhMmVjMjMyNzM5ZjE0Y2UzMWUyNTgyYzUwMDAwMDAwMDAwMDAwMDIwYzYzOTg1ZjUwNWNlZTMxNTY5OGRmZTJmMDk5OTRlZmNhOTQ1MjAwOTQ0YjM1N2ExYzQ1ODQ3ZGM4YTZhNTVmMjYwYWVmYWZmYTM1ZGFhMzJhMWU1NjFmMmJhOWMxODc1MzA1N2QyZmViNTAyZjMyODA0ZTU3M2VhMjg3NWEzOWNjMzAwMDAwMDAwMDAwMDAwMjAwYWQ3OTNlZDNiYTgzMDQ4ZGM3NDZjNzkyYzU0OTM5YzM3ZGU4MDYzMjczZWRkODU2OTI3MzY5ODMwYzg0NzZkMDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OWU4MDMwMDAwMDAwMDAwMDBhNDg4MjEwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICczZWVjMzk1Y2NhZWU3ZDZhMGI5ZmE1NDg4ZGQwMGJmZWI4OWRjNGJkMzdlMzEzOWViZWJiNjJjMmU2MGJjMDBkJyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8wJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxNzk1ODA0NDUyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKDE3OTU4MDQ0NTIpLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgzMmQ4ZTU3ZWU2ZDkxZTU1NThkYTA2NzcxNTRjMmYwODU3OTUzNDhlMzE3Zjk1YWNjOWVmYWRlMWI0MTEyZmNjJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTc5NTgwNDQ1MicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMTc5NTgwNDQ1MicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzogeyBmZWU6IDIxOTc2NjgsIGZlZVN0cmluZzogJzIxOTc2NjgnIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzdkOTFmNjljMjg1YzBiM2IwYTBkNjM3MTAyMGYxOTRkNDU5NTZlZTU1NjI4OWU3ODU0ZjZkMTE0ZTA3ODA1NzIwZWVjNjczYzZhMjcyYjdkYTQxMzdkYjdiMTI4OWYzOGFmNGY0YjgyNGVmMGRlNjVjNWY1M2UzZTY2NjE3NjE3JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZSA9IG5ldyBUcmFuc2ZlclRyYW5zYWN0aW9uKGJhc2Vjb2luKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEhleCA9IHJlcy50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeDtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEJhc2U2NCA9IEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeEhleCwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS5mcm9tUmF3VHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4QmFzZTY0KTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkU3dlZXBUeG5Kc29uID0gdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHVuc2lnbmVkU3dlZXBUeG5Kc29uLmlkLCAnN0p5eDNLVVZYeHMxUTJpMVJxWHRqNGhGZ1VnQm9uNlBVUUFvdkw4NFkzZVAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1bnNpZ25lZFN3ZWVwVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MpO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUb2tlbiBUcmFuc2FjdGlvbnM6JywgKCkgPT4ge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3QgY29pblR5cGUgPSAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJztcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzMCA9ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0ID0gJzB4MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMSc7XG4gICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9ICcweDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODknO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuICAgIGNvbnN0IHRva2VuQ29udHJhY3RBZGRyZXNzID0gJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhOCc7XG4gICAgbGV0IGdldEJhbGFuY2VTdHViOiBzaW5vbi5TaW5vblN0dWI7XG4gICAgbGV0IGdldElucHV0Q29pbnNTdHViOiBzaW5vbi5TaW5vblN0dWI7XG4gICAgbGV0IGdldEZlZUVzdGltYXRlU3R1Yjogc2lub24uU2lub25TdHViO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBnZXRCYWxhbmNlU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0QmFsYW5jZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRJbnB1dENvaW5zJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRGZWVFc3RpbWF0ZScgYXMga2V5b2YgU3VpKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICBzYW5kQm94LnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHRva2VuIHR4biBmb3Igbm9uLWJpdGdvIHJlY292ZXJ5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0QmFsYW5jZVN0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczAsIGNvaW5UeXBlKS5yZXNvbHZlcygnMTAwMCcpO1xuICAgICAgZ2V0SW5wdXRDb2luc1N0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczAsIGNvaW5UeXBlKS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCcsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDkyNGFiNjllYmJhMzA0ZjI5NzVhNTg4MzcyYjQxZTRlMWY1ZGI3ZmE4MjQ4NjhmODQxOTllZWIxZTBhMTVhMmQnLFxuICAgICAgICAgIHZlcnNpb246ICczNDY5NjgwNycsXG4gICAgICAgICAgZGlnZXN0OiAnN1hSYldRVGl3QVVDakxMc1pWcEpNckFCQ2hlSkJrektWZkNyN2FUWlpWa2QnLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoMTAwMCksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MwKS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg5MTQ2OTI4ZjU1N2NiOGFiMTkxNWE1ODg2YzEzNjI0MzVhMDViNDcwOWI1ODZiYjAxZDRjNzBlODViYjUzMTYxJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMjM5JyxcbiAgICAgICAgICBkaWdlc3Q6ICdHTFN6UjZISjMxOW5QS0FGbTV4M1RXSGNhSFp6Q0ZTQkNxaHZaMXF3VDV3cicsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTIzMDI2MTA3NicpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4OTNmNzAwZGM4MmUyMjlmNjk5ZjQ3YjE2Nzg1OWM1MTA4Mjg4Yjc4ZjU0MDY4ODAwY2MyOTA5MDBkMGRlODQyOScsXG4gICAgICAgICAgdmVyc2lvbjogJzE0OScsXG4gICAgICAgICAgZGlnZXN0OiAnMndYRHh0Mlp4ZWtCeE42b1czQnFWRFhaY1g0OUM4N24xQU4yNk55dTdrUFInLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzE2OTYxMTAyNCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4Yjg2OWI0NTc0NGNhMmM0YTY2M2M2ZTg2NzlkYjVhNjMyYmVhZDAzNjQyNzM4NDJkMzk5MGQ3ZmY2NWQ1N2IxZScsXG4gICAgICAgICAgdmVyc2lvbjogJzIzNycsXG4gICAgICAgICAgZGlnZXN0OiAnRjF4V0tQVkhWNVdMNzJFcmpnUXhyam4zUk5IMkdIanlOOWpUZ3dXN1FwaGsnLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEwMTk3NicpLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFEQVFDU1NyYWV1Nk1FOHBkYVdJTnl0QjVPSDEyMytvSklhUGhCbWU2eDRLRmFMV2R1RVFJQUFBQUFJR0R4V3YwN3VxdjBoRVppT0cwRkMveEc4MzBXQm1SRFpMT0xtTXA2MWdkU0FBam9Bd0FBQUFBQUFBQWdBT1RxcHFLUi9nS1JoRkxtUmJWbFBOSmdwZndQczE5aGs5V0FrV3FwNDRrQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQUpIeVhpTjdnNkFLWW5KUDNFcUI1RDlKVGNhMEdoSkJTU2dtMDI1TkV4MmpBWkZHa285VmZMaXJHUldsaUd3VFlrTmFCYlJ3bTFocnNCMU1jT2hidFRGaDd3QUFBQUFBQUFBZzQ5cTU1ZUpHR001eHRvSnpZMjMzVW5MMmRqMUtiNU45MFl4WjcwUW9wVzJSOGw0amU0T2dDbUp5VDl4S2dlUS9TVTNHdEJvU1FVa29KdE51VFJNZG8rZ0RBQUFBQUFBQUFPSDFCUUFBQUFBQSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcigyMzQ1NTA0KSk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHguc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQURBUUNTU3JhZXU2TUU4cGRhV0lOeXRCNU9IMTIzK29KSWFQaEJtZTZ4NEtGYUxXZHVFUUlBQUFBQUlHRHhXdjA3dXF2MGhFWmlPRzBGQy94RzgzMFdCbVJEWkxPTG1NcDYxZ2RTQUFqb0F3QUFBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdFQUFBRUJBUUFCQVFJQUFBRUNBSkh5WGlON2c2QUtZbkpQM0VxQjVEOUpUY2EwR2hKQlNTZ20wMjVORXgyakFaRkdrbzlWZkxpckdSV2xpR3dUWWtOYUJiUndtMWhyc0IxTWNPaGJ0VEZoN3dBQUFBQUFBQUFnNDlxNTVlSkdHTTV4dG9KelkyMzNVbkwyZGoxS2I1TjkwWXhaNzBRb3BXMlI4bDRqZTRPZ0NtSnlUOXhLZ2VRL1NVM0d0Qm9TUVVrb0p0TnVUUk1kbytnREFBQUFBQUFBVmw0bkFBQUFBQUFBJ1xuICAgICAgKTtcblxuICAgICAgY29uc3QgTm9uQml0R29UeG5EZXNlcmlhbGl6ZSA9IG5ldyBUb2tlblRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgTm9uQml0R29UeG5EZXNlcmlhbGl6ZS5mcm9tUmF3VHJhbnNhY3Rpb24odHguc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IE5vbkJpdEdvVHhuSnNvbiA9IE5vbkJpdEdvVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChOb25CaXRHb1R4bkpzb24uaWQsICdEWVc5bUE4QVpHUW50azdIR1FVRW9FZHk4QmFIOEhoOVRzMjk0RW5xR1RFcicpO1xuICAgICAgc2hvdWxkLmVxdWFsKE5vbkJpdEdvVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MwKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0b2tlbiB0eG4gZm9yIHVuc2lnbmVkIHN3ZWVwIHJlY292ZXJ5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0QmFsYW5jZVN0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQpLnJlc29sdmVzKCcyOTg5ODAyNDAnKTtcbiAgICAgIGdldEJhbGFuY2VTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0LCBjb2luVHlwZSkucmVzb2x2ZXMoJzEwMDAnKTtcblxuICAgICAgZ2V0SW5wdXRDb2luc1N0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQsIGNvaW5UeXBlKS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCcsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDRjMWNjY2M2ZDAzNTEwYmQ3NGE5NWY4MWIyYjdkYTA4MTE5Y2IxOGUyYzU2NTQzNWU3YWQ3MTVlNmFhZGM1YTcnLFxuICAgICAgICAgIHZlcnNpb246ICczNDY5NjgwOScsXG4gICAgICAgICAgZGlnZXN0OiAnQWZ5NExXNDZ0dWN6ajM0MVRiQ0xlZXlueHJ1cGo5THcycUJRVXBuZEhjMWMnLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoMTAwMCksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0KS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg5ODExNGYyZGRlZmUzZjE2ZDlkMmUwMTYxOTRiNTJjNGMzYWY0MzBjMTYwMWJkYjM1MzljYmQyMzdjYmNhMDY4JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4MDknLFxuICAgICAgICAgIGRpZ2VzdDogJ0RCdG9xdld0cmNZSEUxSGpRVW80aWdUa0hZeFk3RDgzaUhTb0tYaTlBODVXJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKDIwMDAwMDAwMCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg5ZWMxMzQ0MDY0N2IwYmVlNzRmNDU0MDk1ODlhZDJmZjVhMThjOTYxNWY5OWQ1ZDkxNGY5ODhiODM0ZGE0OTNlJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMjM5JyxcbiAgICAgICAgICBkaWdlc3Q6ICc5ZDN1VnNRNHAzN1RHbnpUcG5YWHcycEZvZ2diVmZWcDlDZEM0anBacTY2NCcsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcig5ODk4MDI0MCksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YlxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQURBUUJNSE16RzBEVVF2WFNwWDRHeXQ5b0lFWnl4aml4V1ZEWG5yWEZlYXEzRnAybHVFUUlBQUFBQUlJKzBvelM0S2F6ZXkvb3FNb1pDcjZKTmI1VTNRUGRvTUlEdURrczlPcFl2QUFqb0F3QUFBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdFQUFBRUJBUUFCQVFJQUFBRUNBQUZrbGQzYWRJd1JhaUdDUW9OZE5rY0oxc1h1WElvZTFvVEU3ME05TVVRaEFaZ1JUeTNlL2o4VzJkTGdGaGxMVXNURHIwTU1GZ0c5czFPY3ZTTjh2S0JvYVc0UkFnQUFBQUFndFJhaFcxQTB2TlFrSlVRTVZrenpiME9WUXZpR2NlOTVuZDRHWWVlSm9Ba0JaSlhkMm5TTUVXb2hna0tEWFRaSENkYkY3bHlLSHRhRXhPOURQVEZFSWVnREFBQUFBQUFBQU9IMUJRQUFBQUFBJ1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKDIzNDU1MDQpKTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5Q29sZFdhbGxldCxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICB9KTtcblxuICAgICAgcmVzLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0eFJlcXVlc3RzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDMwMTAwNGMxY2NjYzZkMDM1MTBiZDc0YTk1ZjgxYjJiN2RhMDgxMTljYjE4ZTJjNTY1NDM1ZTdhZDcxNWU2YWFkYzVhNzY5NmUxMTAyMDAwMDAwMDAyMDhmYjRhMzM0YjgyOWFjZGVjYmZhMmEzMjg2NDJhZmEyNGQ2Zjk1Mzc0MGY3NjgzMDgwZWUwZTRiM2QzYTk2MmYwMDA4ZTgwMzAwMDAwMDAwMDAwMDAwMjAwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5MDIwMjAxMDAwMDAxMDEwMTAwMDEwMTAyMDAwMDAxMDIwMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMTk4MTE0ZjJkZGVmZTNmMTZkOWQyZTAxNjE5NGI1MmM0YzNhZjQzMGMxNjAxYmRiMzUzOWNiZDIzN2NiY2EwNjg2OTZlMTEwMjAwMDAwMDAwMjBiNTE2YTE1YjUwMzRiY2Q0MjQyNTQ0MGM1NjRjZjM2ZjQzOTU0MmY4ODY3MWVmNzk5ZGRlMDY2MWU3ODlhMDA5MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMWU4MDMwMDAwMDAwMDAwMDA1NjVlMjcwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJ2UzNTQ3YTU4YjljNDg4NDBhMjc3NGFlYjcxYjg2NTJhNzBiNjdlZTU5YzNmYTViMWY3NDM3MzhkOGIyOTUxOTknLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzAnLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzEwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoMTAwMCksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzEwMDAnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDI1ODAwNTQsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzI1ODAwNTQnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnNzlkNGI5YjU5NGRmMDI4ZmVlMzcyNWE2YWY1MWFlM2FiNmEzNTE5ZTlkMmMzMjJmMmM4ZmQ4MTViOTY0OTYzMjNjNWFiYTdlYTg3NGMxMDJmOTY2ZjFhNjFkM2M5YTQyYjVmMzE3N2M2YTg1NzEyY2YzMTM3MTVhZmRkZjgzZDgnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSByZXMudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zZXJpYWxpemVkVHg7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhCYXNlNjQgPSBCdWZmZXIuZnJvbShzZXJpYWxpemVkVHhIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFN3ZWVwVHhuSnNvbiA9IHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1bnNpZ25lZFN3ZWVwVHhuSnNvbi5pZCwgJ0Y4d3JValpZZjZ4dkRXMkx6VzlEb2hBS3lKRmNXZ0dFdmpNb0tMeENham1WJyk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bkpzb24uc2VuZGVyLCBzZW5kZXJBZGRyZXNzQ29sZFdhbGxldCk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0b2tlbiB0eG4gZm9yIHVuc2lnbmVkIHN3ZWVwIHJlY292ZXJ5IHdpdGggbXVsdGlwbGUgaW5wdXQgY29pbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRCYWxhbmNlU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzQ29sZFdhbGxldCkucmVzb2x2ZXMoJzI5ODk4MDI0MCcpO1xuICAgICAgZ2V0QmFsYW5jZVN0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQsIGNvaW5UeXBlKS5yZXNvbHZlcygnMTEwMDAnKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0LCBjb2luVHlwZSkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg0YzFjY2NjNmQwMzUxMGJkNzRhOTVmODFiMmI3ZGEwODExOWNiMThlMmM1NjU0MzVlN2FkNzE1ZTZhYWRjNWE3JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4MDknLFxuICAgICAgICAgIGRpZ2VzdDogJ0FmeTRMVzQ2dHVjemozNDFUYkNMZWV5bnhydXBqOUx3MnFCUVVwbmRIYzFjJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMDAwJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCcsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDcyYWQ5OTEzMGFiZDM3OTBkYjdiYWM4OTA4ZDUwZDM0MTJhODAwYThmY2QxMGMxY2ZiZDY0YjgyMTU1Mzc1NTgnLFxuICAgICAgICAgIHZlcnNpb246ICczNDY5Njg2NScsXG4gICAgICAgICAgZGlnZXN0OiAnWDh1YU5Ea1NmWUthNlBCekpKVWU5U3RQNG5SV1I5UlpvYTJuSkhxdjVtbicsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAwMDAnKSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgZ2V0SW5wdXRDb2luc1N0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQpLnJlc29sdmVzKFtcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDk4MTE0ZjJkZGVmZTNmMTZkOWQyZTAxNjE5NGI1MmM0YzNhZjQzMGMxNjAxYmRiMzUzOWNiZDIzN2NiY2EwNjgnLFxuICAgICAgICAgIHZlcnNpb246ICczNDY5NjgwOScsXG4gICAgICAgICAgZGlnZXN0OiAnREJ0b3F2V3RyY1lIRTFIalFVbzRpZ1RrSFl4WTdEODNpSFNvS1hpOUE4NVcnLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzIwMDAwMDAwMCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4OWVjMTM0NDA2NDdiMGJlZTc0ZjQ1NDA5NTg5YWQyZmY1YTE4Yzk2MTVmOTlkNWQ5MTRmOTg4YjgzNGRhNDkzZScsXG4gICAgICAgICAgdmVyc2lvbjogJzIzOScsXG4gICAgICAgICAgZGlnZXN0OiAnOWQzdVZzUTRwMzdUR256VHBuWFh3MnBGb2dnYlZmVnA5Q2RDNGpwWnE2NjQnLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzk4OTgwMjQwJyksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YlxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQUVBUUJ5clprVENyMDNrTnQ3cklrSTFRMDBFcWdBcVB6UkRCejcxa3VDRlZOMVdLRnVFUUlBQUFBQUlBZTRYVGkyNGJTRjhVVlpNTkp5bGhDQWdjcXMxMlpNU05mVjlJVnk3aXU5QVFCTUhNekcwRFVRdlhTcFg0R3l0OW9JRVp5eGppeFdWRFhuclhGZWFxM0ZwMmx1RVFJQUFBQUFJSSswb3pTNEthemV5L29xTW9aQ3I2Sk5iNVUzUVBkb01JRHVEa3M5T3BZdkFBajRLZ0FBQUFBQUFBQWdBT1RxcHFLUi9nS1JoRkxtUmJWbFBOSmdwZndQczE5aGs5V0FrV3FwNDRrREF3RUFBQUVCQVFBQ0FRQUFBUUVDQUFFQkFnRUFBUU1BQVdTVjNkcDBqQkZxSVlKQ2cxMDJSd25XeGU1Y2loN1doTVR2UXoweFJDRUJtQkZQTGQ3K1B4YlowdUFXR1V0U3hNT3ZRd3dXQWIyelU1eTlJM3k4b0docGJoRUNBQUFBQUNDMUZxRmJVRFM4MUNRbFJBeFdUUE52UTVWQytJWng3M21kM2daaDU0bWdDUUZrbGQzYWRJd1JhaUdDUW9OZE5rY0oxc1h1WElvZTFvVEU3ME05TVVRaDZBTUFBQUFBQUFBQTRmVUZBQUFBQUFBPSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcigxMDM2MzI4KSk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXlDb2xkV2FsbGV0LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIH0pO1xuXG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHR4UmVxdWVzdHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwNDAxMDA3MmFkOTkxMzBhYmQzNzkwZGI3YmFjODkwOGQ1MGQzNDEyYTgwMGE4ZmNkMTBjMWNmYmQ2NGI4MjE1NTM3NTU4YTE2ZTExMDIwMDAwMDAwMDIwMDdiODVkMzhiNmUxYjQ4NWYxNDU1OTMwZDI3Mjk2MTA4MDgxY2FhY2Q3NjY0YzQ4ZDdkNWY0ODU3MmVlMmJiZDAxMDA0YzFjY2NjNmQwMzUxMGJkNzRhOTVmODFiMmI3ZGEwODExOWNiMThlMmM1NjU0MzVlN2FkNzE1ZTZhYWRjNWE3Njk2ZTExMDIwMDAwMDAwMDIwOGZiNGEzMzRiODI5YWNkZWNiZmEyYTMyODY0MmFmYTI0ZDZmOTUzNzQwZjc2ODMwODBlZTBlNGIzZDNhOTYyZjAwMDhmODJhMDAwMDAwMDAwMDAwMDAyMDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODkwMzAzMDEwMDAwMDEwMTAxMDAwMjAxMDAwMDAxMDEwMjAwMDEwMTAyMDEwMDAxMDMwMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMTk4MTE0ZjJkZGVmZTNmMTZkOWQyZTAxNjE5NGI1MmM0YzNhZjQzMGMxNjAxYmRiMzUzOWNiZDIzN2NiY2EwNjg2OTZlMTEwMjAwMDAwMDAwMjBiNTE2YTE1YjUwMzRiY2Q0MjQyNTQ0MGM1NjRjZjM2ZjQzOTU0MmY4ODY3MWVmNzk5ZGRlMDY2MWU3ODlhMDA5MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMWU4MDMwMDAwMDAwMDAwMDBmODY0MTEwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJ2NkMDI4YzQwMWY4MTVkYWI3ZjZjNWU4YTMzOTc2ODc5YzVjNzk5YWU3YzlmZGUwMWNhZmQwYWVlMDA3NWExNzQnLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzAnLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzExMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKCcxMTAwMCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTEwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMTEwMDAnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDExMzk5NjAsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzExMzk5NjAnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnNzlkNGI5YjU5NGRmMDI4ZmVlMzcyNWE2YWY1MWFlM2FiNmEzNTE5ZTlkMmMzMjJmMmM4ZmQ4MTViOTY0OTYzMjNjNWFiYTdlYTg3NGMxMDJmOTY2ZjFhNjFkM2M5YTQyYjVmMzE3N2M2YTg1NzEyY2YzMTM3MTVhZmRkZjgzZDgnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSByZXMudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zZXJpYWxpemVkVHg7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhCYXNlNjQgPSBCdWZmZXIuZnJvbShzZXJpYWxpemVkVHhIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFN3ZWVwVHhuSnNvbiA9IHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1bnNpZ25lZFN3ZWVwVHhuSnNvbi5pZCwgJzRxZVhKUDdwVGE2cG15QUt1SlpHOUFrR3NLTTUzU0RxSFZjUGpSTUZIamM1Jyk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bkpzb24uc2VuZGVyLCBzZW5kZXJBZGRyZXNzQ29sZFdhbGxldCk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIFRyYW5zYWN0aW9ucyBmb3Igd2FsbGV0IHdpdGggbXVsdGlwbGUgYWRkcmVzc2VzOicsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MwID0gJzB4OTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMyc7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzczEgPSAnMHgzMmQ4ZTU3ZWU2ZDkxZTU1NThkYTA2NzcxNTRjMmYwODU3OTUzNDhlMzE3Zjk1YWNjOWVmYWRlMWI0MTEyZmNjJztcbiAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OSc7XG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwJFN3PFJqdkFnZntuWUFZSTJ4TSc7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0QmFsYW5jZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGNhbGxCYWNrLndpdGhBcmdzKHNlbmRlckFkZHJlc3MwKS5yZXNvbHZlcygnMCcpLndpdGhBcmdzKHNlbmRlckFkZHJlc3MxKS5yZXNvbHZlcygnMTgwMDAwMDAwMCcpO1xuXG4gICAgICBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0SW5wdXRDb2lucycgYXMga2V5b2YgU3VpKTtcbiAgICAgIGNhbGxCYWNrLndpdGhBcmdzKHNlbmRlckFkZHJlc3MxKS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHhmZjkzYWRjMmY1MTZmY2FhMGM2MDQwZTAxZjUwMDI3YTIzZjliMTc2N2Y1MDQwZWIyMjgyNzkwYTY5MDBjZTdmJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMTk2JyxcbiAgICAgICAgICBkaWdlc3Q6ICdYcmpSTTlaTTk4eGROV2lnSFlRakNwR29XdDZhWkxwcVhkU0VpeG5oYjRwJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxODAwMDAwMDAwJyksXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEZlZUVzdGltYXRlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFDQUFnQThWTmxBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdBQkFRQUFBUUVDQUFBQkFRQXkyT1YrNXRrZVZWamFCbmNWVEM4SVY1VTBqakYvbGF6Sjc2M2h0QkV2ekFIL2s2M0M5UmI4cWd4Z1FPQWZVQUo2SS9teGRuOVFRT3NpZ25rS2FRRE9mOFFBQUFBQUFBQUFJQWZucDkwZ01zZEJHR3oxdFcvc0ZRbEFyaGtSbVlqZGlYVFh4K0N2eEhqVk10amxmdWJaSGxWWTJnWjNGVXd2Q0ZlVk5JNHhmNVdzeWUrdDRiUVJMOHpvQXdBQUFBQUFBQURoOVFVQUFBQUFBQT09J1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKDE5OTc4ODApKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzYW5kQm94LnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHR4biBmb3Igbm9uLWJpdGdvIHJlY292ZXJpZXMgYXQgYWRkcmVzcyAxIGJ1dCBzZWFyY2ggZnJvbSBhZGRyZXNzIDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTc5NzgwMjMzMicpO1xuICAgICAgdHguc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQUNBQWhjU1NockFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0FCQVFBQUFRRUNBQUFCQVFBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6QUgvazYzQzlSYjhxZ3hnUU9BZlVBSjZJL214ZG45UVFPc2lnbmtLYVFET2Y4UUFBQUFBQUFBQUlBZm5wOTBnTXNkQkdHejF0Vy9zRlFsQXJoa1JtWWpkaVhUWHgrQ3Z4SGpWTXRqbGZ1YlpIbFZZMmdaM0ZVd3ZDRmVWTkk0eGY1V3N5ZSt0NGJRUkw4em9Bd0FBQUFBQUFLU0lJUUFBQUFBQUFBPT0nXG4gICAgICApO1xuXG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHR4LnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuSnNvbiA9IFVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKFVuc2lnbmVkU3dlZXBUeG5Kc29uLmlkLCAnQnFIY0NSNTFtcVV5aTVHSllFRUQzY3c5QWdwSjNTcmFUcnQ1YUU5bkxrTGonKTtcbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0eG4gZm9yIG5vbi1iaXRnbyByZWNvdmVyaWVzIGF0IGFkZHJlc3MgMSBidXQgc2VhcmNoIGZyb20gYWRkcmVzcyAxJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgndHJhbnNhY3Rpb25zJyk7XG4gICAgICBjb25zdCB0eCA9IHJlcy50cmFuc2FjdGlvbnNbMF07XG4gICAgICB0eC5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxNzk3ODAyMzMyJyk7XG4gICAgICB0eC5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBQ0FBaGNTU2hyQUFBQUFBQWdBT1RxcHFLUi9nS1JoRkxtUmJWbFBOSmdwZndQczE5aGs5V0FrV3FwNDRrQ0FnQUJBUUFBQVFFQ0FBQUJBUUF5Mk9WKzV0a2VWVmphQm5jVlRDOElWNVUwampGL2xheko3NjNodEJFdnpBSC9rNjNDOVJiOHFneGdRT0FmVUFKNkkvbXhkbjlRUU9zaWdua0thUURPZjhRQUFBQUFBQUFBSUFmbnA5MGdNc2RCR0d6MXRXL3NGUWxBcmhrUm1ZamRpWFRYeCtDdnhIalZNdGpsZnViWkhsVlkyZ1ozRlV3dkNGZVZOSTR4ZjVXc3llK3Q0YlFSTDh6b0F3QUFBQUFBQUtTSUlRQUFBQUFBQUE9PSdcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IFVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZSA9IG5ldyBUcmFuc2ZlclRyYW5zYWN0aW9uKGJhc2Vjb2luKTtcbiAgICAgIFVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS5mcm9tUmF3VHJhbnNhY3Rpb24odHguc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IFVuc2lnbmVkU3dlZXBUeG5Kc29uID0gVW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLnRvSnNvbigpO1xuXG4gICAgICBzaG91bGQuZXF1YWwoVW5zaWduZWRTd2VlcFR4bkpzb24uaWQsICdCcUhjQ1I1MW1xVXlpNUdKWUVFRDNjdzlBZ3BKM1NyYVRydDVhRTluTGtMaicpO1xuICAgICAgc2hvdWxkLmVxdWFsKFVuc2lnbmVkU3dlZXBUeG5Kc29uLnNlbmRlciwgc2VuZGVyQWRkcmVzczEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXIgVG9rZW4gVHJhbnNhY3Rpb25zIGZvciB3YWxsZXQgd2l0aCBtdWx0aXBsZSBhZGRyZXNzZXM6JywgKCkgPT4ge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzczAgPSAnMHg5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzJztcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzMSA9ICcweDMyZDhlNTdlZTZkOTFlNTU1OGRhMDY3NzE1NGMyZjA4NTc5NTM0OGUzMTdmOTVhY2M5ZWZhZGUxYjQxMTJmY2MnO1xuICAgIGNvbnN0IHJlY292ZXJ5RGVzdGluYXRpb24gPSAnMHgwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5JztcbiAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3AkU3c8Ump2QWdme25ZQVlJMnhNJztcbiAgICBjb25zdCBwYWNrYWdlSWQgPSAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4JztcbiAgICBjb25zdCBjb2luVHlwZSA9IGAke3BhY2thZ2VJZH06OmRlZXA6OkRFRVBgO1xuICAgIGxldCBnZXRCYWxhbmNlU3R1Yjogc2lub24uU2lub25TdHViO1xuICAgIGxldCBnZXRJbnB1dENvaW5zU3R1Yjogc2lub24uU2lub25TdHViO1xuICAgIGxldCBnZXRGZWVFc3RpbWF0ZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0QmFsYW5jZVN0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBnZXRCYWxhbmNlU3R1YlxuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczApXG4gICAgICAgIC5yZXNvbHZlcygnNzA2ODc1NjkyJylcbiAgICAgICAgLndpdGhBcmdzKHNlbmRlckFkZHJlc3MwLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKCcwJylcbiAgICAgICAgLndpdGhBcmdzKHNlbmRlckFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoJzEyMDEwMTk3NicpXG4gICAgICAgIC53aXRoQXJncyhzZW5kZXJBZGRyZXNzMSwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcygnMTAwMCcpO1xuXG4gICAgICBnZXRJbnB1dENvaW5zU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0SW5wdXRDb2lucycgYXMga2V5b2YgU3VpKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MxLCBjb2luVHlwZSkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHhjZGJhNzZiZGMzZjQ2MGVkMGQ2YWY4MzRmYzE3YjA4MmViOWVhYmQwYjg4NmY5YWYxN2NkNDI5MWYyZjg2MmZhJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NjYnLFxuICAgICAgICAgIGRpZ2VzdDogJzd2YlNnYUd5dEFUdG5RMmZMUlFvM1Z0Q3dZcjlLanhzdXhMTE1qMmRmQ3NVJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMDAwJyksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MxKS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHgwZWNhNzg5MDFlMzQyYjI1MTVmYmY5OWJlMjQzYjNmMDBhZGUwYTdhNTA2NzViMzczMDdmNDRjYzE5NWM5MDQ2JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzUnLFxuICAgICAgICAgIGRpZ2VzdDogJ0FQRTNuajR6WW00aFkyWG45QzJuM3lueVBpWXF4Z1RSZWpZVDdQYXJocFU3JyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMjAwMDAwMDAnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDc2MTIyMjM0MGRiODBkZDlkYTE0NGQ1NTA5ODg3MGJjODFhNzg4MjA1ZTBiYmRkMzRjMmY4ZGYxMmNmNDVhZWInLFxuICAgICAgICAgIHZlcnNpb246ICcyMjcnLFxuICAgICAgICAgIGRpZ2VzdDogJzlid3lqYVNIM1g4YW5yakdVcEQxTnFNckxGVXRHU0NLOUxGdUxiaGpYNjlFJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMDE5NzYnKSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEZlZUVzdGltYXRlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBREFRRE51bmE5dy9SZzdRMXErRFQ4RjdDQzY1NnIwTGlHK2E4WHpVS1I4dmhpK3FKdUVRSUFBQUFBSUdiZzJWcGh1RWV6elRWTHlCVHJRR0MrR0pXTVJTVjVZSldrYTdmd21EOUxBQWpvQXdBQUFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FETFk1WDdtMlI1VldOb0dkeFZNTHdoWGxUU09NWCtWck1udnJlRzBFUy9NQVE3S2VKQWVOQ3NsRmZ2NW0rSkRzL0FLM2dwNlVHZGJOekIvUk13WlhKQkdxMjRSQWdBQUFBQWdpMnEyc1VnZDBmcmd4V1pWa2dhakpBYjFWNWYxVnphVHJYRVlJeGtMcURBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6T2dEQUFBQUFBQUFBT0gxQlFBQUFBQUEnXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoMjM0NTUwNCkpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdG9rZW4gdHhuIGZvciBub24tYml0Z28gcmVjb3ZlcmllcyBhdCBhZGRyZXNzIDEgYnV0IHNlYXJjaCBmcm9tIGFkZHJlc3MgMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFja2FnZUlkLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgndHJhbnNhY3Rpb25zJyk7XG4gICAgICBjb25zdCB0eCA9IHJlcy50cmFuc2FjdGlvbnNbMF07XG4gICAgICB0eC5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwJyk7XG4gICAgICB0eC5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBREFRRE51bmE5dy9SZzdRMXErRFQ4RjdDQzY1NnIwTGlHK2E4WHpVS1I4dmhpK3FKdUVRSUFBQUFBSUdiZzJWcGh1RWV6elRWTHlCVHJRR0MrR0pXTVJTVjVZSldrYTdmd21EOUxBQWpvQXdBQUFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FETFk1WDdtMlI1VldOb0dkeFZNTHdoWGxUU09NWCtWck1udnJlRzBFUy9NQVE3S2VKQWVOQ3NsRmZ2NW0rSkRzL0FLM2dwNlVHZGJOekIvUk13WlhKQkdxMjRSQWdBQUFBQWdpMnEyc1VnZDBmcmd4V1pWa2dhakpBYjFWNWYxVnphVHJYRVlJeGtMcURBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6T2dEQUFBQUFBQUFWbDRuQUFBQUFBQUEnXG4gICAgICApO1xuXG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHR4LnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuSnNvbiA9IFVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKFVuc2lnbmVkU3dlZXBUeG5Kc29uLmlkLCAnR0Z1azFWS3kzd3pURmVBVXRybVVlNnN4Umh0ZXp6ckdEZktkcFFUeHY5c28nKTtcbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCA0KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0b2tlbiB0eG4gZm9yIG5vbi1iaXRnbyByZWNvdmVyaWVzIGF0IGFkZHJlc3MgMSBidXQgc2VhcmNoIGZyb20gYWRkcmVzcyAxJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBwYWNrYWdlSWQsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgndHJhbnNhY3Rpb25zJyk7XG4gICAgICBjb25zdCB0eCA9IHJlcy50cmFuc2FjdGlvbnNbMF07XG4gICAgICB0eC5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwJyk7XG4gICAgICB0eC5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBREFRRE51bmE5dy9SZzdRMXErRFQ4RjdDQzY1NnIwTGlHK2E4WHpVS1I4dmhpK3FKdUVRSUFBQUFBSUdiZzJWcGh1RWV6elRWTHlCVHJRR0MrR0pXTVJTVjVZSldrYTdmd21EOUxBQWpvQXdBQUFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FETFk1WDdtMlI1VldOb0dkeFZNTHdoWGxUU09NWCtWck1udnJlRzBFUy9NQVE3S2VKQWVOQ3NsRmZ2NW0rSkRzL0FLM2dwNlVHZGJOekIvUk13WlhKQkdxMjRSQWdBQUFBQWdpMnEyc1VnZDBmcmd4V1pWa2dhakpBYjFWNWYxVnphVHJYRVlJeGtMcURBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6T2dEQUFBQUFBQUFWbDRuQUFBQUFBQUEnXG4gICAgICApO1xuXG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHR4LnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuSnNvbiA9IFVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKFVuc2lnbmVkU3dlZXBUeG5Kc29uLmlkLCAnR0Z1azFWS3kzd3pURmVBVXRybVVlNnN4Umh0ZXp6ckdEZktkcFFUeHY5c28nKTtcbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIENvbnNvbGlkYXRpb24gVHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3QgcmVjZWl2ZUFkZHJlc3MxID0gJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYyc7XG4gICAgY29uc3QgcmVjZWl2ZUFkZHJlc3MyID0gJzB4ZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYyc7XG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwJFN3PFJqdkFnZntuWUFZSTJ4TSc7XG5cbiAgICBjb25zdCBzZWVkUmVjZWl2ZUFkZHJlc3MxID0gJzB4ZDIwMTU2NmU2YTBiYzAyMGZkMmU2ZjcyZTliZGUyMjIzZjU1MGQ2NGRhYTYxMzk4Y2Q5MTdjMmY3NTAxMzI0YSc7XG4gICAgY29uc3Qgc2VlZFJlY2VpdmVBZGRyZXNzMiA9ICcweDJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjknO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3MocmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoJzIwMDEwMTk3NicpXG4gICAgICAgIC53aXRoQXJncyhyZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcygnMjAwMDAwMDAwJylcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcygnNTAwMDAwMDAwJylcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcygnMjAwMDAwMDAwJyk7XG5cbiAgICAgIGNhbGxCYWNrID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRJbnB1dENvaW5zJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHJlY2VpdmVBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDk5NmFhYjM2NWQ0NTUxYjZkMTI3NGY1MjBiYmZhN2IwYTU2NmQ1NDhiMmQ1OTBiNTU2NWM2MjM4MTJlN2U3NmQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzIwMScsXG4gICAgICAgICAgICBkaWdlc3Q6ICdIWHBOVGZ4OVRCZHhGY1hIaTRSemlac1F1REFIYXZSYXNLNlJpMTVyVnd1QScsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcyMDAwMDAwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4YjM5YzVmMzgwMjA4Y2NlN2ZlMWJhMTI1OGM4ZDE5YmVmYjAyYTgwZjE0OTUyNjE3ZWQzNzA5OGRiZDRkMmRmMCcsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMTk5JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ21xazM3aFhMa2lVWWdrWXhrMk15cU55a0NrQ1h3ZTk3dU11czdiRFBoZTInLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAxOTc2JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKHJlY2VpdmVBZGRyZXNzMilcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGZhMDQxMDVlZWRlYmRhYmY3MjlkY2NlY2YwMWQwY2Y1ZjFiNzcwODkyZmFjMmVkOGYxZTY5ZDcxYTMyYTJkMjQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzIwMicsXG4gICAgICAgICAgICBkaWdlc3Q6ICdEZUFwUlZTclRhOXR0WHZOeUxleFQ0UEpjQWt5eXhTcGkzSlFlVWc0dWE4UScsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcyMDAwMDAwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDg2ZTcyOGZkNzI0MmIzYmU2MGU5YzE5NDFhZGQyYzQ3ZmI2NTU3NzkxMDhjMzUwMGEyMTYzMTAyMTg3NDhlMmQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzE0NycsXG4gICAgICAgICAgICBkaWdlc3Q6ICc2UEpleUVYNEw4Umtqc05hRjVHU01Dd1JqbUZHWXJRQjdmYm1KUEZNTVBITCcsXG4gICAgICAgICAgICBiYWxhbmNlOiAnNTAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMilcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGZkNjZkYmZlN2ExNDk3ZjIxMDc0N2IwNTMyZjYyZTY5MjZjYjE0NGM3NWU1MTlmMmRmZmYxN2E0ZjZlNTE1ZmMnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzE0OCcsXG4gICAgICAgICAgICBkaWdlc3Q6ICdQSjNqZlMxRVJTaFNNdEZXWmdtYTRoNmR1V1g4bm01QmVpMXozQnN6eUJrJyxcbiAgICAgICAgICAgIGJhbGFuY2U6ICcyMDAwMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0RmVlRXN0aW1hdGUnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQUNBQWhZYi9jRkFBQUFBQUFna2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhTUNBZ0FCQVFBQUFRRUNBQUFCQVFBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6QUtaYXFzMlhVVlJ0dEVuVDFJTHY2ZXdwV2JWU0xMVmtMVldYR0k0RXVmbmJja0FBQUFBQUFBQUlQV2YrZjFFa2xXMWdnaTNyd281SnczTGZ0dTlXL1VzeXJackkwRllzQlRaczV4Zk9BSUl6T2YrRzZFbGpJMFp2dnNDcUE4VWxTWVg3VGNKamIxTkxmREhBQUFBQUFBQUFDQUxmS3NaNFQ5WTJ5MXJybEJ4UVEyQm91UzlWRmpCZ1ZmdmJiRmY5VStmOHpMWTVYN20yUjVWV05vR2R4Vk1Md2hYbFRTT01YK1ZyTW52cmVHMEVTL002QU1BQUFBQUFBQUE0ZlVGQUFBQUFBQT0nXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzEwMTk3NjAnKSlcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFDQUFnQTRmVUZBQUFBQUFBZ2tmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYU1DQWdBQkFRQUFBUUVDQUFBQkFRRGZRSDQrSmVsQUQ1ZDVySFZ4VTN3allXaEJsUEdxWGJFbXFQVjB0ZTJGSEFINkJCQmU3ZXZhdjNLZHpPendIUXoxOGJkd2lTK3NMdGp4NXAxeG95b3RKTW9BQUFBQUFBQUFJTHZSMVhqbEtLeWxSR2g5cFg0VXBCRkJzQ3Y1QXQ2UkJuK1hYREFibmZSQjMwQitQaVhwUUErWGVheDFjVk44STJGb1FaVHhxbDJ4SnFqMWRMWHRoUnpvQXdBQUFBQUFBQURoOVFVQUFBQUFBQT09J1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKCcxOTk3ODgwJykpXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBQ0FBZ0FoTmNYQUFBQUFBQWdpTW1lRGJpY3VoMjVmTHJkZnpleXBMS2l0QUlsbEtEQVN5dk1nMzVMSkFRQ0FnQUJBUUFBQVFFQ0FBQUJBUURTQVZadWFndkFJUDB1YjNMcHZlSWlQMVVOWk5xbUU1ak5rWHd2ZFFFeVNnR0c1eWo5Y2tLenZtRHB3WlFhM1N4SCsyVlhlUkNNTlFDaUZqRUNHSFNPTFpNQUFBQUFBQUFBSUZBQkxMTGpNSmM1MVIwUDhESHkwUGJYd3NZVUQwYjVndlZtaVpzdXBhZnIwZ0ZXYm1vTHdDRDlMbTl5NmIzaUlqOVZEV1RhcGhPWXpaRjhMM1VCTWtyb0F3QUFBQUFBQUFEaDlRVUFBQUFBQUE9PSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcignMTk5Nzg4MCcpKVxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQUNBQWdBNGZVRkFBQUFBQUFnaU1tZURiaWN1aDI1ZkxyZGZ6ZXlwTEtpdEFJbGxLREFTeXZNZzM1TEpBUUNBZ0FCQVFBQUFRRUNBQUFCQVFBdnBkZzVTOWEreFZKYmxWQy9RNzRIVzROQ0xRRUh3Rnh3Q1VUajZ1d20rUUg5WnR2K2VoU1g4aEIwZXdVeTlpNXBKc3NVVEhYbEdmTGYveGVrOXVVVi9KUUFBQUFBQUFBQUlBVzJEWmRWV0o5RU5udkw0WjJQT09IZksyWjc0RGdTZ0RRY2k2ME1kUXVYTDZYWU9Vdld2c1ZTVzVWUXYwTytCMXVEUWkwQkI4QmNjQWxFNCtyc0p2bm9Bd0FBQUFBQUFBRGg5UVVBQUFBQUFBPT0nXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzE5OTc4ODAnKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHNpZ25lZCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgaG90IHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gcmVzLnRyYW5zYWN0aW9ucztcbiAgICAgIHRyYW5zYWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgY29uc3QgdHhuMSA9IHRyYW5zYWN0aW9uc1swXTtcbiAgICAgIHR4bjEuc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4bjEucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxOTg5ODAyNDAnKTtcbiAgICAgIHR4bjEuc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQUNBQWlRTXR3TEFBQUFBQUFna2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhTUNBZ0FCQVFBQUFRRUNBQUFCQVFBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6QUtaYXFzMlhVVlJ0dEVuVDFJTHY2ZXdwV2JWU0xMVmtMVldYR0k0RXVmbmJja0FBQUFBQUFBQUlQV2YrZjFFa2xXMWdnaTNyd281SnczTGZ0dTlXL1VzeXJackkwRllzQlRaczV4Zk9BSUl6T2YrRzZFbGpJMFp2dnNDcUE4VWxTWVg3VGNKamIxTkxmREhBQUFBQUFBQUFDQUxmS3NaNFQ5WTJ5MXJybEJ4UVEyQm91UzlWRmpCZ1ZmdmJiRmY5VStmOHpMWTVYN20yUjVWV05vR2R4Vk1Md2hYbFRTT01YK1ZyTW52cmVHMEVTL002QU1BQUFBQUFBRElIUkVBQUFBQUFBQT0nXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0eG4yID0gdHJhbnNhY3Rpb25zWzFdO1xuICAgICAgdHhuMi5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdHhuMi5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzE5NzgwMjMzMicpO1xuICAgICAgdHhuMi5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBQ0FBaGNPY29MQUFBQUFBQWdrZkplSTN1RG9BcGljay9jU29Ia1AwbE54clFhRWtGSktDYlRiazBUSGFNQ0FnQUJBUUFBQVFFQ0FBQUJBUURmUUg0K0plbEFENWQ1ckhWeFUzd2pZV2hCbFBHcVhiRW1xUFYwdGUyRkhBSDZCQkJlN2V2YXYzS2R6T3p3SFF6MThiZHdpUytzTHRqeDVwMXhveW90Sk1vQUFBQUFBQUFBSUx2UjFYamxLS3lsUkdoOXBYNFVwQkZCc0N2NUF0NlJCbitYWERBYm5mUkIzMEIrUGlYcFFBK1hlYXgxY1ZOOEkyRm9RWlR4cWwyeEpxajFkTFh0aFJ6b0F3QUFBQUFBQUtTSUlRQUFBQUFBQUE9PSdcbiAgICAgICk7XG5cbiAgICAgIHJlcy5sYXN0U2NhbkluZGV4LnNob3VsZC5lcXVhbCgyKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdW5zaWduZWQgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGNvbGQgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHhSZXF1ZXN0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAyMDAwODkwMzJkYzBiMDAwMDAwMDAwMDIwOTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMzAyMDIwMDAxMDEwMDAwMDEwMTAyMDAwMDAxMDEwMDMyZDhlNTdlZTZkOTFlNTU1OGRhMDY3NzE1NGMyZjA4NTc5NTM0OGUzMTdmOTVhY2M5ZWZhZGUxYjQxMTJmY2MwMjk5NmFhYjM2NWQ0NTUxYjZkMTI3NGY1MjBiYmZhN2IwYTU2NmQ1NDhiMmQ1OTBiNTU2NWM2MjM4MTJlN2U3NmRjOTAwMDAwMDAwMDAwMDAwMjBmNTlmZjlmZDQ0OTI1NWI1ODIwOGI3YWYwYTM5MjcwZGNiN2VkYmJkNWJmNTJjY2FiNjZiMjM0MTU4YjAxNGQ5YjM5YzVmMzgwMjA4Y2NlN2ZlMWJhMTI1OGM4ZDE5YmVmYjAyYTgwZjE0OTUyNjE3ZWQzNzA5OGRiZDRkMmRmMGM3MDAwMDAwMDAwMDAwMDAyMDBiN2NhYjE5ZTEzZjU4ZGIyZDZiYWU1MDcxNDEwZDgxYTJlNGJkNTQ1OGMxODE1N2VmNmRiMTVmZjU0ZjlmZjMzMmQ4ZTU3ZWU2ZDkxZTU1NThkYTA2NzcxNTRjMmYwODU3OTUzNDhlMzE3Zjk1YWNjOWVmYWRlMWI0MTEyZmNjZTgwMzAwMDAwMDAwMDAwMGM4MWQxMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJ2FiODRjOWQwOWM2NzhjMDM4NDM5ZjYzZmNkNDBkMjY1MzVjYzE0ODUxNTEyNTdmNGYxNzViNmU4YTBlOTQzMTYnLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzEnLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYycsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE5ODk4MDI0MCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcignMTk4OTgwMjQwJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxOTg5ODAyNDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzE5ODk4MDI0MCcsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDExMjE3MzYsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzExMjE3MzYnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnM2I4OWVlYzlkMmQyZjNiMDQ5ZWNkYTJlN2I1ZjQ3ODI3Zjc5MjdmZTY2MThkNmU4YjEzZjY0ZTdjOTVmNGIwMGI5NTc3YWIwMTM5NWVjZjhlZWI4MDRiNTkwY2VkYWUxNGZmNWZkMzk0N2JmM2I3YTk1YjkzMjdjNDllMjdjNTQnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWknLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDIwMDA4NWMzOWNhMGIwMDAwMDAwMDAwMjA5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzMDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYzAxZmEwNDEwNWVlZGViZGFiZjcyOWRjY2VjZjAxZDBjZjVmMWI3NzA4OTJmYWMyZWQ4ZjFlNjlkNzFhMzJhMmQyNGNhMDAwMDAwMDAwMDAwMDAyMGJiZDFkNTc4ZTUyOGFjYTU0NDY4N2RhNTdlMTRhNDExNDFiMDJiZjkwMmRlOTEwNjdmOTc1YzMwMWI5ZGY0NDFkZjQwN2UzZTI1ZTk0MDBmOTc3OWFjNzU3MTUzN2MyMzYxNjg0MTk0ZjFhYTVkYjEyNmE4ZjU3NGI1ZWQ4NTFjZTgwMzAwMDAwMDAwMDAwMGE0ODgyMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzY2ZDY1MGI0YzRkZWRmNWFiMzNjOTM4MWVlNDYxNDBiMzBiYjg5NmNmMmM2NmI3YjI0MWNhZTcwZDE0MTRmMTYnLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzInLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYycsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcignMTk3ODAyMzMyJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxOTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzE5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDIxOTc2NjgsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzIxOTc2NjgnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnM2I4OWVlYzlkMmQyZjNiMDQ5ZWNkYTJlN2I1ZjQ3ODI3Zjc5MjdmZTY2MThkNmU4YjEzZjY0ZTdjOTVmNGIwMGI5NTc3YWIwMTM5NWVjZjhlZWI4MDRiNTkwY2VkYWUxNGZmNWZkMzk0N2JmM2I3YTk1YjkzMjdjNDllMjdjNTQnLFxuICAgICAgICAgICAgICAgICAgICBsYXN0U2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdW5zaWduZWQgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGNvbGQgd2FsbGV0IHdpdGggc2VlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5V2l0aFNlZWQsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICAgIHNlZWQ6ICcxMjMnLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHR4UmVxdWVzdHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMjAwMDg1Y2RjYWIxZDAwMDAwMDAwMDAyMDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDBkMjAxNTY2ZTZhMGJjMDIwZmQyZTZmNzJlOWJkZTIyMjNmNTUwZDY0ZGFhNjEzOThjZDkxN2MyZjc1MDEzMjRhMDE4NmU3MjhmZDcyNDJiM2JlNjBlOWMxOTQxYWRkMmM0N2ZiNjU1Nzc5MTA4YzM1MDBhMjE2MzEwMjE4NzQ4ZTJkOTMwMDAwMDAwMDAwMDAwMDIwNTAwMTJjYjJlMzMwOTczOWQ1MWQwZmYwMzFmMmQwZjZkN2MyYzYxNDBmNDZmOTgyZjU2Njg5OWIyZWE1YTdlYmQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGFlODAzMDAwMDAwMDAwMDAwYTQ4ODIxMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMSxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnNmQ3YTRjNDg4Mjc0NTcwN2MyY2Q0MGIwYzU3NTY2NjAxYTJhNGQyNjlmNWNiMGE2OTI4Mjg1NTEyMTJjZjQ1MicsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8xJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweGQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICc0OTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoNDk3ODAyMzMyKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzQ5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnNDk3ODAyMzMyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgIGZlZTogMjE5NzY2OCxcbiAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjE5NzY2OCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICdjYTBhMDE0YmE2ZjExMTA2YTE1NWVmOGUyY2FiMmY3NmQyNzdlNGYwMWNmZmE1OTFhOWI0MDg0ODM0MzgyM2IzZDkxMDc1MmE0OWM5NmJmNTgxMzk4NTIwNmUyM2M5ZjljZDNhNzhmMWNjY2Y1Y2Y4OGRlZjUyYjU3M2NlZGM5MycsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMjAwMDg1YzM5Y2EwYjAwMDAwMDAwMDAyMDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDAyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5MDFmZDY2ZGJmZTdhMTQ5N2YyMTA3NDdiMDUzMmY2MmU2OTI2Y2IxNDRjNzVlNTE5ZjJkZmZmMTdhNGY2ZTUxNWZjOTQwMDAwMDAwMDAwMDAwMDIwMDViNjBkOTc1NTU4OWY0NDM2N2JjYmUxOWQ4ZjM4ZTFkZjJiNjY3YmUwMzgxMjgwMzQxYzhiYWQwYzc1MGI5NzJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjllODAzMDAwMDAwMDAwMDAwYTQ4ODIxMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMixcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnMzJhMDBhNmQ4OTI2MzA0NjdjN2QwNjY2MzkwZDNiMjdjYWFmNGFlZmVlM2RkYTllMGM5N2MzZjhiYzA2YmNlYScsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8yJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxOTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoMTk3ODAyMzMyKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMTk3ODAyMzMyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgIGZlZTogMjE5NzY2OCxcbiAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjE5NzY2OCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICdjYTBhMDE0YmE2ZjExMTA2YTE1NWVmOGUyY2FiMmY3NmQyNzdlNGYwMWNmZmE1OTFhOWI0MDg0ODM0MzgyM2IzZDkxMDc1MmE0OWM5NmJmNTgxMzk4NTIwNmUyM2M5ZjljZDNhNzhmMWNjY2Y1Y2Y4OGRlZjUyYjU3M2NlZGM5MycsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RTY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUb2tlbiBDb25zb2xpZGF0aW9uIFRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgY29uc3Qgc2VlZFJlY2VpdmVBZGRyZXNzMSA9ICcweGQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGEnO1xuICAgIGNvbnN0IHNlZWRSZWNlaXZlQWRkcmVzczIgPSAnMHgyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5JztcblxuICAgIGNvbnN0IHBhY2thZ2VJZCA9ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTgnO1xuICAgIGNvbnN0IGNvaW5UeXBlID0gYCR7cGFja2FnZUlkfTo6ZGVlcDo6REVFUGA7XG4gICAgY29uc3QgaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MxID0gJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYyc7XG4gICAgY29uc3QgaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MyID0gJzB4ZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYyc7XG4gICAgY29uc3QgY29sZFdhbGxldFJlY2VpdmVBZGRyZXNzMSA9ICcweGE5OTI3MDk1OTFkZWI3NDcxZmIzMGRkYTBmMzM5ZGI3YWI1NDhkMzM5MWE4OWQzZjFmYTBjNzJkMjA5MjY3NWYnO1xuICAgIGNvbnN0IGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczIgPSAnMHhjM2FjMmE4NmUzNWI2MmJmYWRhODNmNjM4OGZmMjdjN2RkYTcwOTJjZjBiODI5ZDJkMWY0YzI4MTNlMjhhZTM5JztcblxuICAgIGxldCBnZXRCYWxhbmNlU3R1Yjogc2lub24uU2lub25TdHViO1xuICAgIGxldCBnZXRJbnB1dENvaW5zU3R1Yjogc2lub24uU2lub25TdHViO1xuICAgIGxldCBnZXRGZWVFc3RpbWF0ZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0QmFsYW5jZVN0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0SW5wdXRDb2lucycgYXMga2V5b2YgU3VpKTtcbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0RmVlRXN0aW1hdGUnIGFzIGtleW9mIFN1aSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHNpZ25lZCB0b2tlbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgaG90IHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGdldEJhbGFuY2VTdHViXG4gICAgICAgIC53aXRoQXJncyhob3RXYWxsZXRSZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcygnMTE2NzIwMTQ0JylcbiAgICAgICAgLndpdGhBcmdzKGhvdFdhbGxldFJlY2VpdmVBZGRyZXNzMSwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcygnMTUwMCcpXG4gICAgICAgIC53aXRoQXJncyhob3RXYWxsZXRSZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcygnMTIwMTAxOTc2JylcbiAgICAgICAgLndpdGhBcmdzKGhvdFdhbGxldFJlY2VpdmVBZGRyZXNzMiwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcygnMjAwMCcpO1xuICAgICAgZ2V0SW5wdXRDb2luc1N0dWJcbiAgICAgICAgLndpdGhBcmdzKGhvdFdhbGxldFJlY2VpdmVBZGRyZXNzMSwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDhkMmRhNTc3MjI3ZTliNzE2NmRiYjliM2NjZTQ4MDk2OGNmNTQ5YjQ0OGM2NjI3NzFkMTEyNGQ2NDIwYmY3OTInLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODc4JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ0JuaVdpRzN2NzFvenpSaXJiM2hOS0VQMTZwVHUzQ3BOdDN2b3kxdXpnTWk5JyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzE1MDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3MoaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4MGVjYTc4OTAxZTM0MmIyNTE1ZmJmOTliZTI0M2IzZjAwYWRlMGE3YTUwNjc1YjM3MzA3ZjQ0Y2MxOTVjOTA0NicsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzcnLFxuICAgICAgICAgICAgZGlnZXN0OiAnRDhYcUpYcmtWR29lcjk1Mkd2SEJkQkRYcG9mOEg0RjRwUkpKMXdTbkVTTlcnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTE2NjE4MTY4JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDc2MTIyMjM0MGRiODBkZDlkYTE0NGQ1NTA5ODg3MGJjODFhNzg4MjA1ZTBiYmRkMzRjMmY4ZGYxMmNmNDVhZWInLFxuICAgICAgICAgICAgdmVyc2lvbjogJzIyNycsXG4gICAgICAgICAgICBkaWdlc3Q6ICc5Ynd5amFTSDNYOGFucmpHVXBEMU5xTXJMRlV0R1NDSzlMRnVMYmhqWDY5RScsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMDE5NzYnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3MoaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MyLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCcsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4OGUxOGJkMTRjMzRlMzNmODFjNDk0ZjRkNmMxOGQwN2M2ODZjN2YzNjE5NjgyZDIwNjZiM2Y1NWVjZmU3MDdhMicsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NjgnLFxuICAgICAgICAgICAgZGlnZXN0OiAnNmpaRnU4UFJXTEpZUGV3VzdLM280R0xWUFluUnlObzNrUDY0NTRlTHVIWm0nLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMjAwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhob3RXYWxsZXRSZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHg4MTFhNzUwNjYxMzQ5NDVlM2IwMzNmNGFjNTRlYzg4NWVjMDM4NGY0MmE4MDk5NGQ4OGE0OGQ3ZDE4YzQyNjBhJyxcbiAgICAgICAgICAgIHZlcnNpb246ICcyMzYnLFxuICAgICAgICAgICAgZGlnZXN0OiAnMzJOOVp5ZmVyR0RFVjdQWTN5a2lqVlZLaExqRUZTTDZpdHFjZlJQQ3k0b1cnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAxOTc2JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGY4NWE3MzhhMzA1NjZkNTU4ODAwMjI4ZjJkNWMxOTNhNWNhM2RkYmJkZGNhMmE2NWE0OGE5MzMyMzA2NzE1Y2MnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODc2JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJzdnSmdDTURFUGRRYU1ldVhaNUNGTm9uRktNUFF5dzZrNXNUMVJwYUhFWHBlJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEyMDAwMDAwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBREFRQ05MYVYzSW42YmNXYmJ1YlBNNUlDV2pQVkp0RWpHWW5jZEVTVFdRZ3Yza3E1dUVRSUFBQUFBSUtCSzhaanE0eXovUFRGWkxnNmpmNmdEVHNvZ2lnNjNwZHVYZWlLZ3pNVktBQWpjQlFBQUFBQUFBQUFna2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhTUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FETFk1WDdtMlI1VldOb0dkeFZNTHdoWGxUU09NWCtWck1udnJlRzBFUy9NQVE3S2VKQWVOQ3NsRmZ2NW0rSkRzL0FLM2dwNlVHZGJOekIvUk13WlhKQkdyVzRSQWdBQUFBQWd0RG9yNmI5RUpIT1NXZEpaQ1FkTGtLcFMyY1BvQmM1YjI4S3BYMXJnN2xzeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6T2dEQUFBQUFBQUFBT0gxQlFBQUFBQUEnXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzIzNDU1MDQnKSlcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFEQVFDT0dMMFV3MDR6K0J4SlQwMXNHTkI4YUd4L05obG9MU0Jtcy9WZXorY0hvcVJ1RVFJQUFBQUFJRlV4VFRReVRLTTZiVmplRkhIVDhLVnJWMmZnVE9DWDdVb2V2azJyNUpQY0FBalFCd0FBQUFBQUFBQWdrZkplSTN1RG9BcGljay9jU29Ia1AwbE54clFhRWtGSktDYlRiazBUSGFNQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQU45QWZqNGw2VUFQbDNtc2RYRlRmQ05oYUVHVThhcGRzU2FvOVhTMTdZVWNBZmhhYzRvd1ZtMVZpQUFpankxY0dUcGNvOTI3M2NvcVphU0trekl3WnhYTXJHNFJBZ0FBQUFBZ1l6ZkNXaXlwQ21tZThJSlpocW41blQ4K3pvUDNTN3NmUUtmZXpXOTlZV3ZmUUg0K0plbEFENWQ1ckhWeFUzd2pZV2hCbFBHcVhiRW1xUFYwdGUyRkhPZ0RBQUFBQUFBQUFPSDFCUUFBQUFBQSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcignMjM0NTUwNCcpKTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHBhY2thZ2VJZCxcbiAgICAgICAgc3RhcnRpbmdTY2FuSW5kZXg6IDEsXG4gICAgICAgIGVuZGluZ1NjYW5JbmRleDogMyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSByZXMudHJhbnNhY3Rpb25zO1xuICAgICAgdHJhbnNhY3Rpb25zLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICBjb25zdCB0eG4xID0gdHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHhuMS5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHhuMS5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzE1MDAnKTtcbiAgICAgIHR4bjEuc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQURBUUNOTGFWM0luNmJjV2JidWJQTTVJQ1dqUFZKdEVqR1luY2RFU1RXUWd2M2txNXVFUUlBQUFBQUlLQks4WmpxNHl6L1BURlpMZzZqZjZnRFRzb2dpZzYzcGR1WGVpS2d6TVZLQUFqY0JRQUFBQUFBQUFBZ2tmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYU1DQWdFQUFBRUJBUUFCQVFJQUFBRUNBRExZNVg3bTJSNVZXTm9HZHhWTUx3aFhsVFNPTVgrVnJNbnZyZUcwRVMvTUFRN0tlSkFlTkNzbEZmdjVtK0pEcy9BSzNncDZVR2RiTnpCL1JNd1pYSkJHclc0UkFnQUFBQUFndERvcjZiOUVKSE9TV2RKWkNRZExrS3BTMmNQb0JjNWIyOEtwWDFyZzdsc3kyT1YrNXRrZVZWamFCbmNWVEM4SVY1VTBqakYvbGF6Sjc2M2h0QkV2ek9nREFBQUFBQUFBVmw0bkFBQUFBQUFBJ1xuICAgICAgKTtcblxuICAgICAgY29uc3QgdHhuMiA9IHRyYW5zYWN0aW9uc1sxXTtcbiAgICAgIHR4bjIuc2NhbkluZGV4LnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHR4bjIucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcyMDAwJyk7XG4gICAgICB0eG4yLnNlcmlhbGl6ZWRUeC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdBQUFEQVFDT0dMMFV3MDR6K0J4SlQwMXNHTkI4YUd4L05obG9MU0Jtcy9WZXorY0hvcVJ1RVFJQUFBQUFJRlV4VFRReVRLTTZiVmplRkhIVDhLVnJWMmZnVE9DWDdVb2V2azJyNUpQY0FBalFCd0FBQUFBQUFBQWdrZkplSTN1RG9BcGljay9jU29Ia1AwbE54clFhRWtGSktDYlRiazBUSGFNQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQU45QWZqNGw2VUFQbDNtc2RYRlRmQ05oYUVHVThhcGRzU2FvOVhTMTdZVWNBZmhhYzRvd1ZtMVZpQUFpankxY0dUcGNvOTI3M2NvcVphU0trekl3WnhYTXJHNFJBZ0FBQUFBZ1l6ZkNXaXlwQ21tZThJSlpocW41blQ4K3pvUDNTN3NmUUtmZXpXOTlZV3ZmUUg0K0plbEFENWQ1ckhWeFUzd2pZV2hCbFBHcVhiRW1xUFYwdGUyRkhPZ0RBQUFBQUFBQVZsNG5BQUFBQUFBQSdcbiAgICAgICk7XG5cbiAgICAgIHJlcy5sYXN0U2NhbkluZGV4LnNob3VsZC5lcXVhbCgyKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDQpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDQpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdW5zaWduZWQgdG9rZW4gY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGNvbGQgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0QmFsYW5jZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcygnMTE2NzIwMTQ0JylcbiAgICAgICAgLndpdGhBcmdzKGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczEsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoJzQwMDAnKVxuICAgICAgICAud2l0aEFyZ3MoY29sZFdhbGxldFJlY2VpdmVBZGRyZXNzMilcbiAgICAgICAgLnJlc29sdmVzKCcxMjAxMDE5NzYnKVxuICAgICAgICAud2l0aEFyZ3MoY29sZFdhbGxldFJlY2VpdmVBZGRyZXNzMiwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcygnNjAwMCcpO1xuICAgICAgZ2V0SW5wdXRDb2luc1N0dWJcbiAgICAgICAgLndpdGhBcmdzKGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczEsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHg5ZTI2MTg2ODVmZmYzOGI5OTkzNTVlOTNhNDY5M2M0YmQxOGY2OGRkNmI2NTRmZjY1NTVmMWY0YWQyMjlkY2RiJyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg3NicsXG4gICAgICAgICAgICBkaWdlc3Q6ICdGNWlHanM5NUNuU2NDdFhIRnVUSmhkWmtmTHlhZ1dSMVFtMXpESDZTbmdNRycsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCc0MDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHg4ZjNmN2M4OTYxOTk3MzI3MTY2YjE1NzExMTdmZjY3MjMyY2NkMTI2N2VjNTJhN2U5NzM2NzdiYTA0MzFmZmFkJyxcbiAgICAgICAgICAgIHZlcnNpb246ICcyMjYnLFxuICAgICAgICAgICAgZGlnZXN0OiAnQVdoN3RQbVM5eG1INGEyellMQ0c3M1lEaXNrQ2Y4dWl6YkxqcENTdEhoTlYnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignOTg5ODAyNDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4OTE2ZTM1YTBhYzZiNTI1YjdkMzhhNDRiNjY3Mzk0YWFlZTdjZGU0MWRmZmM4NzY5ODBjZmJjODg0NTU5MGNkZCcsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzgnLFxuICAgICAgICAgICAgZGlnZXN0OiAnMTRQZk53VXZmY1IzbU5BUzFiY05YVG9hb29WTG5YUUhEZEd4UEZSSlF0WScsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMjAwMDAwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3MoY29sZFdhbGxldFJlY2VpdmVBZGRyZXNzMiwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGM1NDhjMjIwNDU0ZDIwZTA3MTJiZDI4NThiMDcyNjBjODI5YTFjODQ3ZjM4MThiNDc4MDU5NjFiNTc0ODEzYWInLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODc3JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJzhtQU5kb3NrRzhlTEx5N3pWVTVybUhSQVhWSFV5SlBBQmZTMW1ZSFNtQVl0JyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzYwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3MoY29sZFdhbGxldFJlY2VpdmVBZGRyZXNzMilcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDM5NmFiMDllZTU4ZmIyYzlmYmNjYTg4N2MwMGVmMDFhMzNkNWJmZTU1YTVkNTA1MTRlMzJhNTlmOTQ4ZTlhMDUnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzIzNCcsXG4gICAgICAgICAgICBkaWdlc3Q6ICdIV0tXNTZkdDhCTnhTVHZYaVc3ZHREVm1NMmd4RWV4RnlOVnpHajhIUFZwNCcsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMDE5NzYnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4ZDRiZmVmYTUzMjgyN2Q3NjE5YTU4Mjc5YTg3ZGI4MTYzMmUyNjdjYzQ4ZTZiOTRhYjgxYTQzNjdmMDJjYmVmYScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzknLFxuICAgICAgICAgICAgZGlnZXN0OiAnR0pucDFvWE5qVlhMY1lZNmhxUlY4Um03RzdvYm1rM3M4TmhqMWJGc2ZrVW8nLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTIwMDAwMDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFEQVFDZUpoaG9YLzg0dVprMVhwT2thVHhMMFk5bzNXdGxUL1pWWHg5SzBpbmMyNnh1RVFJQUFBQUFJTkU0bXhzMWhHTW1vdlRVNWRmbkZvb3VXT1BkVm4wblJEUGJ1WHltQUxQTEFBaWdEd0FBQUFBQUFBQWdBV1NWM2RwMGpCRnFJWUpDZzEwMlJ3bld4ZTVjaWg3V2hNVHZRejB4UkNFQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQUttU2NKV1IzcmRISDdNTjJnOHpuYmVyVkkwemthaWRQeCtneHkwZ2ttZGZBWkZ1TmFDc2ExSmJmVGlrUzJaemxLcnVmTjVCMy95SGFZRFB2SWhGV1F6ZHJtNFJBZ0FBQUFBZ0FBUFZlbGViOHBNdTdvL2NwOU13dEdzVU13S0EyOEN2aU8rNU43OWZvTkdwa25DVmtkNjNSeCt6RGRvUE01MjNxMVNOTTVHb25UOGZvTWN0SUpKblgrZ0RBQUFBQUFBQUFPSDFCUUFBQUFBQSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcignMjM0NTUwNCcpKVxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQURBUURGU01JZ1JVMGc0SEVyMG9XTEJ5WU1ncG9jaEg4NEdMUjRCWlliVjBnVHE2MXVFUUlBQUFBQUlITlI5bEY3YjdOZGhXZ3V0a2x4NXZ3TG1paGlqUk9JNlQyNGN0eng5ZzZ0QUFod0Z3QUFBQUFBQUFBZ0FXU1YzZHAwakJGcUlZSkNnMTAyUnduV3hlNWNpaDdXaE1UdlF6MHhSQ0VDQWdFQUFBRUJBUUFCQVFJQUFBRUNBTU9zS29ialcySy9yYWcvWTRqL0o4ZmRwd2tzOExncDB0SDB3b0UrS0s0NUFkUy83NlV5Z24xMkdhV0NlYWg5dUJZeTRtZk1TT2E1U3JnYVEyZndMTDc2cjI0UkFnQUFBQUFnNDIzNTBMcXFhYW51YjVUcGpKbllsS2l1cGpGMlhjK3FnRElvaVBPa1U2akRyQ3FHNDF0aXY2Mm9QMk9JL3lmSDNhY0pMUEM0S2RMUjlNS0JQaWl1T2VnREFBQUFBQUFBQU9IMUJRQUFBQUFBJ1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKCcyMzQ1NTA0JykpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyQ29uc29saWRhdGlvbnMoe1xuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleUNvbGRXYWxsZXQsXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBwYWNrYWdlSWQsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHhSZXF1ZXN0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAzMDEwMDllMjYxODY4NWZmZjM4Yjk5OTM1NWU5M2E0NjkzYzRiZDE4ZjY4ZGQ2YjY1NGZmNjU1NWYxZjRhZDIyOWRjZGJhYzZlMTEwMjAwMDAwMDAwMjBkMTM4OWIxYjM1ODQ2MzI2YTJmNGQ0ZTVkN2U3MTY4YTJlNThlM2RkNTY3ZDI3NDQzM2RiYjk3Y2E2MDBiM2NiMDAwOGEwMGYwMDAwMDAwMDAwMDAwMDIwMDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMTAyMDIwMTAwMDAwMTAxMDEwMDAxMDEwMjAwMDAwMTAyMDBhOTkyNzA5NTkxZGViNzQ3MWZiMzBkZGEwZjMzOWRiN2FiNTQ4ZDMzOTFhODlkM2YxZmEwYzcyZDIwOTI2NzVmMDE5MTZlMzVhMGFjNmI1MjViN2QzOGE0NGI2NjczOTRhYWVlN2NkZTQxZGZmYzg3Njk4MGNmYmM4ODQ1NTkwY2RkYWU2ZTExMDIwMDAwMDAwMDIwMDAwM2Q1N2E1NzliZjI5MzJlZWU4ZmRjYTdkMzMwYjQ2YjE0MzMwMjgwZGJjMGFmODhlZmI5MzdiZjVmYTBkMWE5OTI3MDk1OTFkZWI3NDcxZmIzMGRkYTBmMzM5ZGI3YWI1NDhkMzM5MWE4OWQzZjFmYTBjNzJkMjA5MjY3NWZlODAzMDAwMDAwMDAwMDAwNTY1ZTI3MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMSxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICdjZWRhZGU2YzFjOTllMzUzMWM5MDUzNmZhMjI4ZjBmYjE0OGYzNTYwNWQxYTRlZGZiZThlYjczOWJkYzk5YTQ4JyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8xJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweGE5OTI3MDk1OTFkZWI3NDcxZmIzMGRkYTBmMzM5ZGI3YWI1NDhkMzM5MWE4OWQzZjFmYTBjNzJkMjA5MjY3NWYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICc0MDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKCc0MDAwJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICc0MDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzQwMDAnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDI1ODAwNTQsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzI1ODAwNTQnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnNzlkNGI5YjU5NGRmMDI4ZmVlMzcyNWE2YWY1MWFlM2FiNmEzNTE5ZTlkMmMzMjJmMmM4ZmQ4MTViOTY0OTYzMjNjNWFiYTdlYTg3NGMxMDJmOTY2ZjFhNjFkM2M5YTQyYjVmMzE3N2M2YTg1NzEyY2YzMTM3MTVhZmRkZjgzZDgnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMzAxMDBjNTQ4YzIyMDQ1NGQyMGUwNzEyYmQyODU4YjA3MjYwYzgyOWExYzg0N2YzODE4YjQ3ODA1OTYxYjU3NDgxM2FiYWQ2ZTExMDIwMDAwMDAwMDIwNzM1MWY2NTE3YjZmYjM1ZDg1NjgyZWI2NDk3MWU2ZmMwYjlhMjg2MjhkMTM4OGU5M2RiODcyZGNmMWY2MGVhZDAwMDg3MDE3MDAwMDAwMDAwMDAwMDAyMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMjAyMDEwMDAwMDEwMTAxMDAwMTAxMDIwMDAwMDEwMjAwYzNhYzJhODZlMzViNjJiZmFkYTgzZjYzODhmZjI3YzdkZGE3MDkyY2YwYjgyOWQyZDFmNGMyODEzZTI4YWUzOTAxZDRiZmVmYTUzMjgyN2Q3NjE5YTU4Mjc5YTg3ZGI4MTYzMmUyNjdjYzQ4ZTZiOTRhYjgxYTQzNjdmMDJjYmVmYWFmNmUxMTAyMDAwMDAwMDAyMGUzNmRmOWQwYmFhYTY5YTllZTZmOTRlOThjOTlkODk0YThhZWE2MzE3NjVkY2ZhYTgwMzIyODg4ZjNhNDUzYThjM2FjMmE4NmUzNWI2MmJmYWRhODNmNjM4OGZmMjdjN2RkYTcwOTJjZjBiODI5ZDJkMWY0YzI4MTNlMjhhZTM5ZTgwMzAwMDAwMDAwMDAwMDU2NWUyNzAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnZDA1NTE0MDlkMjQ4YWNjZGQ4OTQ3MTNhNGMwM2E2ZDhmMjQwMzQ5YTVlODViOTBhZWYwMTliNWY0MjYwNjJjOCcsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMicsXG4gICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHhjM2FjMmE4NmUzNWI2MmJmYWRhODNmNjM4OGZmMjdjN2RkYTcwOTJjZjBiODI5ZDJkMWY0YzI4MTNlMjhhZTM5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnNjAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcignNjAwMCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnNjAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICc2MDAwJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1Rva2VuVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgZmVlOiAyNTgwMDU0LFxuICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcyNTgwMDU0JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNjYW5JbmRleDogMixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDQpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDQpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdW5zaWduZWQgdG9rZW4gY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGNvbGQgd2FsbGV0IHdpdGggc2VlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGdldEJhbGFuY2VTdHViXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoJzEyMDE5OTc4OCcpXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MxLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKCcxNTAwJylcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcygnMTIwMTk5Nzg4JylcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczIsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoJzIwMDAnKTtcblxuICAgICAgZ2V0SW5wdXRDb2luc1N0dWJcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczEsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHhhN2E4YzkxMDI4MDM1YWI0OTk3N2U3MmIwODRlMTQ1ZWIxYzFkZGNmZTJlMDY5MjVmMGY4MzNjZWYyZDFmNjlmJyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg3OCcsXG4gICAgICAgICAgICBkaWdlc3Q6ICdDS2l1WGtGTWFWa24xMmlLaW5aQ3I5YURIZkdwQ1FpUGR5WlVRek5ESjlReCcsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxNTAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHg1ZWVhMDM1M2YwNzgwMTZiNzFhODRjYjQ5NGU2Zjc5MWU5N2NiOGRlNTM0NGRlZjNiYWVkZmZjODljMjdhNGI1JyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg3OScsXG4gICAgICAgICAgICBkaWdlc3Q6ICc2S3Fyd2pLSGhKQ2U0RFhmZEgyeU1MRzhiWEdjU1FvVGVKeTRzaGdoRGJUWicsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMjAwMDAwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4ODZlNzI4ZmQ3MjQyYjNiZTYwZTljMTk0MWFkZDJjNDdmYjY1NTc3OTEwOGMzNTAwYTIxNjMxMDIxODc0OGUyZCcsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMTQ4JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ0I5ekpmRVlraVhuQXVMRTZxM1hGSmVMYlBjM0s3cW1qZ0RySFZ2Sm5UNXdhJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzE5OTc4OCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MyLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCcsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4ZTE5MWYxNjZlNzFiMWVmMjBmZmRhMGM5MWIyNGRhOTVlY2M5M2I2NTdjNDY0ZDhhMDZmNTYxZDQ2OTI3MjJmMCcsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4ODAnLFxuICAgICAgICAgICAgZGlnZXN0OiAnNEt5aHpmUFFjVFVybnA0VUJ2UjNHc1BFM0RMY2NWREVQZ0JqRHhhV1ZSY3InLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMjAwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MyKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4ZDMyZjk0ODg5ZDBiZmMwNWMyNGVkNmMwMjNkNWQzZDM2NTQyOTRhODM3ZDg1MGQzNzM4YjBlMzUyZTFmNDg2NycsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4ODAnLFxuICAgICAgICAgICAgZGlnZXN0OiAnNVBvMTJZaXVMM05rTlRBdnlXdlJ3dFI1NUp2aXlQVmJjRGZUdkN3UXJUa3InLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTIwMDAwMDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGZkNjZkYmZlN2ExNDk3ZjIxMDc0N2IwNTMyZjYyZTY5MjZjYjE0NGM3NWU1MTlmMmRmZmYxN2E0ZjZlNTE1ZmMnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzE0OScsXG4gICAgICAgICAgICBkaWdlc3Q6ICc1ZVZjYmJtM05URjZqcWFkVGI0R2paTXpuNzVLRFpCcWNzcFJ6M3NWcnBiUicsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxOTk3ODgnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBREFRQ25xTWtRS0FOYXRKbDM1eXNJVGhSZXNjSGR6K0xnYVNYdytEUE84dEgybjY1dUVRSUFBQUFBSUtnOFpNZUYyWExMYkJkUFF5UG1mdThiWXFDQjJ6L3VhUjVzRzdGb2JsN1ZBQWpjQlFBQUFBQUFBQUFnaU1tZURiaWN1aDI1ZkxyZGZ6ZXlwTEtpdEFJbGxLREFTeXZNZzM1TEpBUUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FOSUJWbTVxQzhBZy9TNXZjdW05NGlJL1ZRMWsycVlUbU0yUmZDOTFBVEpLQVY3cUExUHdlQUZyY2FoTXRKVG05NUhwZkxqZVUwVGU4N3J0LzhpY0o2UzFyMjRSQWdBQUFBQWdUeDRpK1JnY0xkQTVxK3Z5bU0rV0VUcHZDbnFFcVI0b1k3UnFRZE5qMm96U0FWWnVhZ3ZBSVAwdWIzTHB2ZUlpUDFVTlpOcW1FNWpOa1h3dmRRRXlTdWdEQUFBQUFBQUFBT0gxQlFBQUFBQUEnXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzIzNDU1MDQnKSlcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFEQVFEaGtmRm01eHNlOGcvOW9Na2JKTnFWN01rN1pYeEdUWW9HOVdIVWFTY2k4TEJ1RVFJQUFBQUFJREZ2b2tpbkJ4b1d5ZUw2NGxQTTltSlZPcEIwVU9qWmpEdStKMXNrUGNRUEFBalFCd0FBQUFBQUFBQWdpTW1lRGJpY3VoMjVmTHJkZnpleXBMS2l0QUlsbEtEQVN5dk1nMzVMSkFRQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQUMrbDJEbEwxcjdGVWx1VlVMOUR2Z2RiZzBJdEFRZkFYSEFKUk9QcTdDYjVBZE12bElpZEMvd0Z3azdXd0NQVjA5TmxRcFNvTjloUTAzT0xEalV1SDBobnNHNFJBZ0FBQUFBZ1FVV0owL3RQWnQrK3E3S25MWW1BUFdSUm9ubi9XL1hHWXh6eFk2ODl6Szh2cGRnNVM5YSt4VkpibFZDL1E3NEhXNE5DTFFFSHdGeHdDVVRqNnV3bStlZ0RBQUFBQUFBQUFPSDFCUUFBQUFBQSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcignMjM0NTUwNCcpKTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXlXaXRoU2VlZCxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHBhY2thZ2VJZCxcbiAgICAgICAgc3RhcnRpbmdTY2FuSW5kZXg6IDEsXG4gICAgICAgIGVuZGluZ1NjYW5JbmRleDogMyxcbiAgICAgICAgc2VlZDogJzEyMycsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHhSZXF1ZXN0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAzMDEwMGE3YThjOTEwMjgwMzVhYjQ5OTc3ZTcyYjA4NGUxNDVlYjFjMWRkY2ZlMmUwNjkyNWYwZjgzM2NlZjJkMWY2OWZhZTZlMTEwMjAwMDAwMDAwMjBhODNjNjRjNzg1ZDk3MmNiNmMxNzRmNDMyM2U2N2VlZjFiNjJhMDgxZGIzZmVlNjkxZTZjMWJiMTY4NmU1ZWQ1MDAwOGRjMDUwMDAwMDAwMDAwMDAwMDIwODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNDAyMDIwMTAwMDAwMTAxMDEwMDAxMDEwMjAwMDAwMTAyMDBkMjAxNTY2ZTZhMGJjMDIwZmQyZTZmNzJlOWJkZTIyMjNmNTUwZDY0ZGFhNjEzOThjZDkxN2MyZjc1MDEzMjRhMDE1ZWVhMDM1M2YwNzgwMTZiNzFhODRjYjQ5NGU2Zjc5MWU5N2NiOGRlNTM0NGRlZjNiYWVkZmZjODljMjdhNGI1YWY2ZTExMDIwMDAwMDAwMDIwNGYxZTIyZjkxODFjMmRkMDM5YWJlYmYyOThjZjk2MTEzYTZmMGE3YTg0YTkxZTI4NjNiNDZhNDFkMzYzZGE4Y2QyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGFlODAzMDAwMDAwMDAwMDAwNTY1ZTI3MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMSxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICcyMmRlZmE5MTAxZWEzYTM4MzljM2MwMDI2YjI3YTk4MzcxNjVjMDdmY2VjZmY4ZTk0MzUzYmNmM2Q1YTAxMzI4JyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS85OTk5OTkvOTQ4NjI2MjIvMTU3MzYzNTA5LzEnLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ZDIwMTU2NmU2YTBiYzAyMGZkMmU2ZjcyZTliZGUyMjIzZjU1MGQ2NGRhYTYxMzk4Y2Q5MTdjMmY3NTAxMzI0YScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE1MDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoJzE1MDAnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE1MDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMTUwMCcsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUb2tlblRyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgIGZlZTogMjU4MDA1NCxcbiAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjU4MDA1NCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICdjYTBhMDE0YmE2ZjExMTA2YTE1NWVmOGUyY2FiMmY3NmQyNzdlNGYwMWNmZmE1OTFhOWI0MDg0ODM0MzgyM2IzZDkxMDc1MmE0OWM5NmJmNTgxMzk4NTIwNmUyM2M5ZjljZDNhNzhmMWNjY2Y1Y2Y4OGRlZjUyYjU3M2NlZGM5MycsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAzMDEwMGUxOTFmMTY2ZTcxYjFlZjIwZmZkYTBjOTFiMjRkYTk1ZWNjOTNiNjU3YzQ2NGQ4YTA2ZjU2MWQ0NjkyNzIyZjBiMDZlMTEwMjAwMDAwMDAwMjAzMTZmYTI0OGE3MDcxYTE2YzllMmZhZTI1M2NjZjY2MjU1M2E5MDc0NTBlOGQ5OGMzYmJlMjc1YjI0M2RjNDBmMDAwOGQwMDcwMDAwMDAwMDAwMDAwMDIwODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNDAyMDIwMTAwMDAwMTAxMDEwMDAxMDEwMjAwMDAwMTAyMDAyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5MDFkMzJmOTQ4ODlkMGJmYzA1YzI0ZWQ2YzAyM2Q1ZDNkMzY1NDI5NGE4MzdkODUwZDM3MzhiMGUzNTJlMWY0ODY3YjA2ZTExMDIwMDAwMDAwMDIwNDE0NTg5ZDNmYjRmNjZkZmJlYWJiMmE3MmQ4OTgwM2Q2NDUxYTI3OWZmNWJmNWM2NjMxY2YxNjNhZjNkY2NhZjJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjllODAzMDAwMDAwMDAwMDAwNTY1ZTI3MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMixcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICcyZTZiYjE3MTY2ZWUxOTcxMDI3MjliZGE0N2IwNmI3YzBiNTk2MmJmNDMxYmJiMDU2MmI5MWUyNjdiNzUxMjlkJyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS85OTk5OTkvOTQ4NjI2MjIvMTU3MzYzNTA5LzInLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MmZhNWQ4Mzk0YmQ2YmVjNTUyNWI5NTUwYmY0M2JlMDc1YjgzNDIyZDAxMDdjMDVjNzAwOTQ0ZTNlYWVjMjZmOScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoJzIwMDAnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMjAwMCcsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUb2tlblRyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgIGZlZTogMjU4MDA1NCxcbiAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjU4MDA1NCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICdjYTBhMDE0YmE2ZjExMTA2YTE1NWVmOGUyY2FiMmY3NmQyNzdlNGYwMWNmZmE1OTFhOWI0MDg0ODM0MzgyM2IzZDkxMDc1MmE0OWM5NmJmNTgxMzk4NTIwNmUyM2M5ZjljZDNhNzhmMWNjY2Y1Y2Y4OGRlZjUyYjU3M2NlZGM5MycsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RTY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCA0KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCA0KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDcmVhdGUgQnJvYWRjYXN0YWJsZSBNUEMgVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2NyZWF0ZSBicm9hZGNhc3RhYmxlIE1QQyB0cmFuc2FjdGlvbiBmb3IgT1ZDIHNpZ25lZCBzd2VlcCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAgICcwMDAwMDIwMDA4Yzg4YjkwMmYwMDAwMDAwMDAwMjBkZjQwN2UzZTI1ZTk0MDBmOTc3OWFjNzU3MTUzN2MyMzYxNjg0MTk0ZjFhYTVkYjEyNmE4ZjU3NGI1ZWQ4NTFjMDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwMDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMTAxNDU1M2IwZjZmNzllZDk1OTQyMTQxODM1ZGUzYWIwODZiZjM4ZDFmMWQ5NjI3Mjk4MWUxMzkwYjg0ZmI4NmIzNmM5MDAwMDAwMDAwMDAwMDAyMDBiMWRlOGZkZmJiYjhhNmZhMmM2NWVjNzlhNTU3MDNjOWE5ZjBjMjY4NWE3NjhmMmI4MWEwNDI2YmM5MzJlYzMwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxZTgwMzAwMDAwMDAwMDAwMGE0ODgyMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJ2E0Y2U4ZWIxMTM2MmNkNDVjMDk5MzZlNzQ1MDQ0ZGM3OGIyNjg5ZTVkODE0N2I5ZWE5YTdkZTQzZWU0MzkyM2EnLFxuICAgICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMCcsXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzc5ODAwMjEyMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiA4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFs3OTgwMDIxMjBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnNzk4MDAyMTIwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzc5ODAwMjEyMCcsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICAgIGZlZTogMjE5NzY2OCxcbiAgICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcyMTk3NjY4JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgICAnNzlkNGI5YjU5NGRmMDI4ZmVlMzcyNWE2YWY1MWFlM2FiNmEzNTE5ZTlkMmMzMjJmMmM4ZmQ4MTViOTY0OTYzMjNjNWFiYTdlYTg3NGMxMDJmOTY2ZjFhNjFkM2M5YTQyYjVmMzE3N2M2YTg1NzEyY2YzMTM3MTVhZmRkZjgzZDgnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZToge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiAnYmFja3VwJyxcbiAgICAgICAgICAgICAgICAgICAgdG86ICd1c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmU6XG4gICAgICAgICAgICAgICAgICAgICAgJzZmNDcwOTA2ZGY4OGMzM2IyN2M4ZDExM2VkOTQ0ZWQwYTRmYzQ5OWJhNmNjNzZmMDBiODkyNDk0MjgxMmQ3ODM1NzkyZWU0NTVjYmM4OTQxZmFiYTdiY2M5M2IxNWE5Y2QxOThhMjBkYzNmMGI2MjlmNWZkY2VhYjM0ZTY2MTAwJyxcbiAgICAgICAgICAgICAgICAgICAgcHVibGljU2hhcmU6ICcyODQ0OTZjYTA0Y2M2MDM4MjNmNzk5M2FlZjEzZjcyZjMzMWQ5NzA4NWIyMTg0ZDdhNmE0NjNhOTBhYTkyN2QwJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRzc1ZlcnNpb246ICcwLjAuMScsXG4gICAgICAgICAgICBvdmM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVkZHNhU2lnbmF0dXJlOiB7XG4gICAgICAgICAgICAgICAgICB5OiAnMjg0NDk2Y2EwNGNjNjAzODIzZjc5OTNhZWYxM2Y3MmYzMzFkOTcwODViMjE4NGQ3YTZhNDYzYTkwYWE5MjdkMCcsXG4gICAgICAgICAgICAgICAgICBSOiAnNmY0NzA5MDZkZjg4YzMzYjI3YzhkMTEzZWQ5NDRlZDBhNGZjNDk5YmE2Y2M3NmYwMGI4OTI0OTQyODEyZDc4MycsXG4gICAgICAgICAgICAgICAgICBzaWdtYTogJzVjMjNhOGM3MmNlMTkyNzMxZTcwMmRhNDYwYWVhNzllZDY2MzM0YjRhNzgzZGNmNmRkMjc1ODM0N2Q2YzlmMGQnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5jcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihzaWduYXR1cmVTaGFyZXMpO1xuXG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgJ0FBQUNBQWpJaTVBdkFBQUFBQUFnMzBCK1BpWHBRQStYZWF4MWNWTjhJMkZvUVpUeHFsMnhKcWoxZExYdGhSd0NBZ0FCQVFBQUFRRUNBQUFCQVFBQlpKWGQyblNNRVdvaGdrS0RYVFpIQ2RiRjdseUtIdGFFeE85RFBURkVJUUZGVTdEMjk1N1pXVUlVR0RYZU9yQ0d2empSOGRsaWNwZ2VFNUM0VDdock5za0FBQUFBQUFBQUlBc2Q2UDM3dTRwdm9zWmV4NXBWY0R5YW53d21oYWRvOHJnYUJDYThreTdEQVdTVjNkcDBqQkZxSVlKQ2cxMDJSd25XeGU1Y2loN1doTVR2UXoweFJDSG9Bd0FBQUFBQUFLU0lJUUFBQUFBQUFBPT0nLFxuICAgICAgICAgICAgc2NhbkluZGV4OiAwLFxuICAgICAgICAgICAgc2lnbmF0dXJlOlxuICAgICAgICAgICAgICAnQUc5SENRYmZpTU03SjhqUkUrMlVUdENrL0VtYnBzeDI4QXVKSkpRb0V0ZURYQ09veHl6aGtuTWVjQzJrWUs2bm50WmpOTFNuZzl6MjNTZFlOSDFzbncwb1JKYktCTXhnT0NQM21UcnZFL2N2TXgyWENGc2hoTmVtcEdPcENxa24wQT09JyxcbiAgICAgICAgICAgIHJlY292ZXJ5QW1vdW50OiAnNzk4MDAyMTIwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBsYXN0U2NhbkluZGV4OiAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlIGJyb2FkY2FzdGFibGUgTVBDIHRva2VuIHRyYW5zYWN0aW9uIGZvciBPVkMgc2lnbmVkIHN3ZWVwIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0ge1xuICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICAgJzAwMDAwNDAxMDA3MmFkOTkxMzBhYmQzNzkwZGI3YmFjODkwOGQ1MGQzNDEyYTgwMGE4ZmNkMTBjMWNmYmQ2NGI4MjE1NTM3NTU4YTE2ZTExMDIwMDAwMDAwMDIwMDdiODVkMzhiNmUxYjQ4NWYxNDU1OTMwZDI3Mjk2MTA4MDgxY2FhY2Q3NjY0YzQ4ZDdkNWY0ODU3MmVlMmJiZDAxMDA0YzFjY2NjNmQwMzUxMGJkNzRhOTVmODFiMmI3ZGEwODExOWNiMThlMmM1NjU0MzVlN2FkNzE1ZTZhYWRjNWE3Njk2ZTExMDIwMDAwMDAwMDIwOGZiNGEzMzRiODI5YWNkZWNiZmEyYTMyODY0MmFmYTI0ZDZmOTUzNzQwZjc2ODMwODBlZTBlNGIzZDNhOTYyZjAwMDhmODJhMDAwMDAwMDAwMDAwMDAyMDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMwMzAzMDEwMDAwMDEwMTAxMDAwMjAxMDAwMDAxMDEwMjAwMDEwMTAyMDEwMDAxMDMwMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMTk4MTE0ZjJkZGVmZTNmMTZkOWQyZTAxNjE5NGI1MmM0YzNhZjQzMGMxNjAxYmRiMzUzOWNiZDIzN2NiY2EwNjg2OTZlMTEwMjAwMDAwMDAwMjBiNTE2YTE1YjUwMzRiY2Q0MjQyNTQ0MGM1NjRjZjM2ZjQzOTU0MmY4ODY3MWVmNzk5ZGRlMDY2MWU3ODlhMDA5MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMWU4MDMwMDAwMDAwMDAwMDBmODY0MTEwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzQ0OWFkZTE5NTkwNjg1YjFlYjBjZWZjYjJlYzQxZjRjNjhlMzdkOGVhZjc1Njg3YzQ1OTY1ZTI4OGU3MWNhYTQnLFxuICAgICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMCcsXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzExMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogWzExMDAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzExMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMTEwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUb2tlblRyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICAgIGZlZTogMTEzOTk2MCxcbiAgICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcxMTM5OTYwJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgICAnNzlkNGI5YjU5NGRmMDI4ZmVlMzcyNWE2YWY1MWFlM2FiNmEzNTE5ZTlkMmMzMjJmMmM4ZmQ4MTViOTY0OTYzMjNjNWFiYTdlYTg3NGMxMDJmOTY2ZjFhNjFkM2M5YTQyYjVmMzE3N2M2YTg1NzEyY2YzMTM3MTVhZmRkZjgzZDgnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZToge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiAnYmFja3VwJyxcbiAgICAgICAgICAgICAgICAgICAgdG86ICd1c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmU6XG4gICAgICAgICAgICAgICAgICAgICAgJzIzYzUzZTU0ZjI3MTM4NjU3OGQ5OWE2OTMyZmY3MDg5NjA5MDAxODhhYjNlNWJjZTFhZWMxZjAxOWU1M2E4NWQzMTk3ZjhiNjRhOWZlYWRiZWRiYmQzN2FhNDJlNDQ0NDYwOWYwMDA3NDNhZGMwYTk0ZmZjYzcyMWM3MDU3ZDA0JyxcbiAgICAgICAgICAgICAgICAgICAgcHVibGljU2hhcmU6ICcyODQ0OTZjYTA0Y2M2MDM4MjNmNzk5M2FlZjEzZjcyZjMzMWQ5NzA4NWIyMTg0ZDdhNmE0NjNhOTBhYTkyN2QwJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHNzVmVyc2lvbjogJzAuMC4xJyxcbiAgICAgICAgICAgIG92YzogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZWRkc2FTaWduYXR1cmU6IHtcbiAgICAgICAgICAgICAgICAgIHk6ICcyODQ0OTZjYTA0Y2M2MDM4MjNmNzk5M2FlZjEzZjcyZjMzMWQ5NzA4NWIyMTg0ZDdhNmE0NjNhOTBhYTkyN2QwJyxcbiAgICAgICAgICAgICAgICAgIFI6ICcyM2M1M2U1NGYyNzEzODY1NzhkOTlhNjkzMmZmNzA4OTYwOTAwMTg4YWIzZTViY2UxYWVjMWYwMTllNTNhODVkJyxcbiAgICAgICAgICAgICAgICAgIHNpZ21hOiAnOWI1MmI0NWM0ZDUzOWZhZDkwNjgwNWY5ZmNiYWI2ZmI1ZTQxNTIyNDNjYWVlMjUyODU1YzM2YzM0MDQ4Y2MwOScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLmNyZWF0ZUJyb2FkY2FzdGFibGVTd2VlcFRyYW5zYWN0aW9uKHNpZ25hdHVyZVNoYXJlcyk7XG5cbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAnQUFBRUFRQnlyWmtUQ3IwM2tOdDdySWtJMVEwMEVxZ0FxUHpSREJ6NzFrdUNGVk4xV0tGdUVRSUFBQUFBSUFlNFhUaTI0YlNGOFVWWk1OSnlsaENBZ2NxczEyWk1TTmZWOUlWeTdpdTlBUUJNSE16RzBEVVF2WFNwWDRHeXQ5b0lFWnl4aml4V1ZEWG5yWEZlYXEzRnAybHVFUUlBQUFBQUlJKzBvelM0S2F6ZXkvb3FNb1pDcjZKTmI1VTNRUGRvTUlEdURrczlPcFl2QUFqNEtnQUFBQUFBQUFBZ2tmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYU1EQXdFQUFBRUJBUUFDQVFBQUFRRUNBQUVCQWdFQUFRTUFBV1NWM2RwMGpCRnFJWUpDZzEwMlJ3bld4ZTVjaWg3V2hNVHZRejB4UkNFQm1CRlBMZDcrUHhiWjB1QVdHVXRTeE1PdlF3d1dBYjJ6VTV5OUkzeThvR2hwYmhFQ0FBQUFBQ0MxRnFGYlVEUzgxQ1FsUkF4V1RQTnZRNVZDK0laeDczbWQzZ1poNTRtZ0NRRmtsZDNhZEl3UmFpR0NRb05kTmtjSjFzWHVYSW9lMW9URTcwTTlNVVFoNkFNQUFBQUFBQUQ0WkJFQUFBQUFBQUE9JyxcbiAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgIHNpZ25hdHVyZTpcbiAgICAgICAgICAgICAgJ0FDUEZQbFR5Y1RobGVObWFhVEwvY0lsZ2tBR0lxejViemhyc0h3R2VVNmhkbTFLMFhFMVRuNjJRYUFYNS9McTIrMTVCVWlROHJ1SlNoVncydzBCSXpBa29SSmJLQk14Z09DUDNtVHJ2RS9jdk14MlhDRnNoaE5lbXBHT3BDcWtuMEE9PScsXG4gICAgICAgICAgICByZWNvdmVyeUFtb3VudDogJzExMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBsYXN0U2NhbkluZGV4OiAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlIGJyb2FkY2FzdGFibGUgTVBDIHRyYW5zYWN0aW9uIGZvciBPVkMgc2lnbmVkIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0ge1xuICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICAgJzAwMDAwMjAwMDgyMGMyZDYwNTAwMDAwMDAwMDAyMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDBhOTkyNzA5NTkxZGViNzQ3MWZiMzBkZGEwZjMzOWRiN2FiNTQ4ZDMzOTFhODlkM2YxZmEwYzcyZDIwOTI2NzVmMDE1NjhiZWZmZTc2NTEwMzNhMDgxYTczNzVhM2JiNDNkNGQyYThlMjkwYTM5NmU4MjYyMzZlNzNkMDk3M2I0OWI1ZDAwMDAwMDAwMDAwMDAwMDIwOGJjMDc2NGE0NTRkZTc1MzhiNWVjZWE2ZmQwYmQyMjFjOWM4NTIwN2FmMjk3NjEyOTQ0YTk2N2Q0M2U4ZGQzYmE5OTI3MDk1OTFkZWI3NDcxZmIzMGRkYTBmMzM5ZGI3YWI1NDhkMzM5MWE4OWQzZjFmYTBjNzJkMjA5MjY3NWZlODAzMDAwMDAwMDAwMDAwYTQ4ODIxMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAxLFxuICAgICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnODU3YTJmMjY2ODdjMDExYTYxYTA2MGE0MWQ0YzgwYzEwYjJmZDMxZTk4ZmU2NzA0ZDZiY2RhMjZmNTdiMDNiYicsXG4gICAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8xJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4YTk5MjcwOTU5MWRlYjc0NzFmYjMwZGRhMGYzMzlkYjdhYjU0OGQzMzkxYTg5ZDNmMWZhMGM3MmQyMDkyNjc1ZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnOTc5NjA0ODAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogNyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBbOTc5NjA0ODBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnOTc5NjA0ODAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnOTc5NjA0ODAnLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWU6IDIxOTc2NjgsXG4gICAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjE5NzY2OCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlOlxuICAgICAgICAgICAgICAgICAgICAgICdjZGZlMTVkN2MwZjgwZjhhYWQ4OWQ4Nzg3MDY2NzNjZTI0Mjk0N2IxMjY4NTJjMDBlZTMwOWVmMDVmN2E4MzAxYjJlOTAyYjkwZDM3ZWE3ZGZlODZjZTc5YzdhOTliMmIyN2ExNzVjM2Y3MTRjMzEwZmQ5ZTEwZWE4NzdjYzYwZicsXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnZTQ0NWJkMDkyYTQ2N2RmNTc3MDAxY2ZiZDYwODFiMTQ0NWNhMGY3NTE0NzIzMzU2MWVkMmY1M2Y2YTMwZTQ1YScsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0c3NWZXJzaW9uOiAnMC4wLjEnLFxuICAgICAgICAgICAgb3ZjOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlZGRzYVNpZ25hdHVyZToge1xuICAgICAgICAgICAgICAgICAgeTogJ2U0NDViZDA5MmE0NjdkZjU3NzAwMWNmYmQ2MDgxYjE0NDVjYTBmNzUxNDcyMzM1NjFlZDJmNTNmNmEzMGU0NWEnLFxuICAgICAgICAgICAgICAgICAgUjogJ2NkZmUxNWQ3YzBmODBmOGFhZDg5ZDg3ODcwNjY3M2NlMjQyOTQ3YjEyNjg1MmMwMGVlMzA5ZWYwNWY3YTgzMDEnLFxuICAgICAgICAgICAgICAgICAgc2lnbWE6ICcyYTMxMzI5YjJlNWVmOGMzZjIyMmViOTFjZDlkNzBlNzE2ZjIyOWVlMTlkM2NhOTQxN2M4YWNjMTZiMWRhMTAwJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgICAnMDAwMDAyMDAwODAwYzJlYjBiMDAwMDAwMDAwMDIwMDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMTAyMDIwMDAxMDEwMDAwMDEwMTAyMDAwMDAxMDEwMGMzYWMyYTg2ZTM1YjYyYmZhZGE4M2Y2Mzg4ZmYyN2M3ZGRhNzA5MmNmMGI4MjlkMmQxZjRjMjgxM2UyOGFlMzkwMWQ2OGZlYjQ3ODA4ODZjY2ZhODFhMzcwMzY5NThlYzljOGJmYWJmZTc1YTBiYjdjNGQxYTQ1ODc5OTIzNDNmNWJjZjAwMDAwMDAwMDAwMDAwMjA1YWQ0ZjYzMWEzNzhmOGIwOTU0MmQ0ZGY2Njk0MmI2ZGFiYjJmNjVjYjIwY2Y4ZjYyOGM5MWM2NGY5MzUyZTRlYzNhYzJhODZlMzViNjJiZmFkYTgzZjYzODhmZjI3YzdkZGE3MDkyY2YwYjgyOWQyZDFmNGMyODEzZTI4YWUzOWU4MDMwMDAwMDAwMDAwMDBhNDg4MjEwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICdmMmI1NmE3NGU3ODdiMmE5OGRlY2YxODllNzFiMWUwYzVkNGNjZWU4ODY5N2IzOTkxYTQ4ZGUyOTEwNjc2MDIwJyxcbiAgICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzInLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHhjM2FjMmE4NmUzNWI2MmJmYWRhODNmNjM4OGZmMjdjN2RkYTcwOTJjZjBiODI5ZDJkMWY0YzI4MTNlMjhhZTM5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcyMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogOCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBbMjAwMDAwMDAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcyMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWU6IDIxOTc2NjgsXG4gICAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjE5NzY2OCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0U2NhbkluZGV4OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlOlxuICAgICAgICAgICAgICAgICAgICAgICczNTE4NjEzZWE1Y2VmYTM2Y2QyMmUxYjA5Mjc0MmQ4ZDA1Mjc0NDE4ODUxODA0MDM5N2YxYTY1YTc1NGY5ZTk1MzI0ODg5MzEyZDcwMTQ2ODExZGJkYzJhOTYyNDVjNTE4ZTE2ZmM2MWJkMWE1YTJiNTNiNTNlYmNlYzVkNGEwMycsXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnNGIxNDNhMTI4MzViZGRhMDQ4MzFhOWVkODUxZjllYWRkN2JhNWI0NmU5YzA3ZmQwODdiNzUxZjQ2YTNmMzY0ZCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0c3NWZXJzaW9uOiAnMC4wLjEnLFxuICAgICAgICAgICAgb3ZjOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlZGRzYVNpZ25hdHVyZToge1xuICAgICAgICAgICAgICAgICAgeTogJzRiMTQzYTEyODM1YmRkYTA0ODMxYTllZDg1MWY5ZWFkZDdiYTViNDZlOWMwN2ZkMDg3Yjc1MWY0NmEzZjM2NGQnLFxuICAgICAgICAgICAgICAgICAgUjogJzM1MTg2MTNlYTVjZWZhMzZjZDIyZTFiMDkyNzQyZDhkMDUyNzQ0MTg4NTE4MDQwMzk3ZjFhNjVhNzU0ZjllOTUnLFxuICAgICAgICAgICAgICAgICAgc2lnbWE6ICcyZGY0OGVkNjBmZjYyYjBlODY4OWM1ZWJlNTczMThmM2RhZDc2Mjg4NjQ3NTI0YjQyMGFjZjdiMWE4NGNjMDAwJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4uY3JlYXRlQnJvYWRjYXN0YWJsZVN3ZWVwVHJhbnNhY3Rpb24oc2lnbmF0dXJlU2hhcmVzKTtcblxuICAgICAgcmVzLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICdBQUFDQUFnZ3d0WUZBQUFBQUFBZ0FXU1YzZHAwakJGcUlZSkNnMTAyUnduV3hlNWNpaDdXaE1UdlF6MHhSQ0VDQWdBQkFRQUFBUUVDQUFBQkFRQ3BrbkNWa2Q2M1J4K3pEZG9QTTUyM3ExU05NNUdvblQ4Zm9NY3RJSkpuWHdGV2krLytkbEVET2dnYWMzV2p1MFBVMHFqaWtLT1c2Q1lqYm5QUWx6dEp0ZEFBQUFBQUFBQUFJSXZBZGtwRlRlZFRpMTdPcHYwTDBpSEp5RklIcnlsMkVwUktsbjFENk4wN3FaSndsWkhldDBjZnN3M2FEek9kdDZ0VWpUT1JxSjAvSDZESExTQ1NaMS9vQXdBQUFBQUFBS1NJSVFBQUFBQUFBQT09JyxcbiAgICAgICAgICAgIHNjYW5JbmRleDogMSxcbiAgICAgICAgICAgIHNpZ25hdHVyZTpcbiAgICAgICAgICAgICAgJ0FNMytGZGZBK0ErS3JZblllSEJtYzg0a0tVZXhKb1VzQU80d252QmZlb01CS2pFeW15NWUrTVB5SXV1UnpaMXc1eGJ5S2U0WjA4cVVGOGlzd1dzZG9RRGtSYjBKS2taOTlYY0FIUHZXQ0JzVVJjb1BkUlJ5TTFZZTB2VS9hakRrV2c9PScsXG4gICAgICAgICAgICByZWNvdmVyeUFtb3VudDogJzk3OTYwNDgwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgJ0FBQUNBQWdBd3VzTEFBQUFBQUFnQVdTVjNkcDBqQkZxSVlKQ2cxMDJSd25XeGU1Y2loN1doTVR2UXoweFJDRUNBZ0FCQVFBQUFRRUNBQUFCQVFERHJDcUc0MXRpdjYyb1AyT0kveWZIM2FjSkxQQzRLZExSOU1LQlBpaXVPUUhXait0SGdJaHN6NmdhTndOcFdPeWNpL3EvNTFvTHQ4VFJwRmg1a2pRL1c4OEFBQUFBQUFBQUlGclU5akdqZVBpd2xVTFUzMmFVSzIycnN2WmNzZ3o0OWlqSkhHVDVOUzVPdzZ3cWh1TmJZcit0cUQ5amlQOG54OTJuQ1N6d3VDblMwZlRDZ1Q0b3Jqbm9Bd0FBQUFBQUFLU0lJUUFBQUFBQUFBPT0nLFxuICAgICAgICAgICAgc2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgc2lnbmF0dXJlOlxuICAgICAgICAgICAgICAnQURVWVlUNmx6dm8yelNMaHNKSjBMWTBGSjBRWWhSZ0VBNWZ4cGxwMVQ1NlZMZlNPMWcvMkt3NkdpY1hyNVhNWTg5clhZb2hrZFNTMElLejNzYWhNd0FCTEZEb1NnMXZkb0VneHFlMkZINTZ0MTdwYlJ1bkFmOUNIdDFIMGFqODJUUT09JyxcbiAgICAgICAgICAgIHJlY292ZXJ5QW1vdW50OiAnMjAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBsYXN0U2NhbkluZGV4OiAyMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZSBicm9hZGNhc3RhYmxlIE1QQyB0cmFuc2FjdGlvbiBmb3IgT1ZDIHNpZ25lZCB0b2tlbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAgICcwMDAwMDMwMTAwYTdhOGM5MTAyODAzNWFiNDk5NzdlNzJiMDg0ZTE0NWViMWMxZGRjZmUyZTA2OTI1ZjBmODMzY2VmMmQxZjY5ZmFlNmUxMTAyMDAwMDAwMDAyMGE4M2M2NGM3ODVkOTcyY2I2YzE3NGY0MzIzZTY3ZWVmMWI2MmEwODFkYjNmZWU2OTFlNmMxYmIxNjg2ZTVlZDUwMDA4ZGMwNTAwMDAwMDAwMDAwMDAwMjA4OGM5OWUwZGI4OWNiYTFkYjk3Y2JhZGQ3ZjM3YjJhNGIyYTJiNDAyMjU5NGEwYzA0YjJiY2M4MzdlNGIyNDA0MDIwMjAxMDAwMDAxMDEwMTAwMDEwMTAyMDAwMDAxMDIwMGQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGEwMTVlZWEwMzUzZjA3ODAxNmI3MWE4NGNiNDk0ZTZmNzkxZTk3Y2I4ZGU1MzQ0ZGVmM2JhZWRmZmM4OWMyN2E0YjVhZjZlMTEwMjAwMDAwMDAwMjA0ZjFlMjJmOTE4MWMyZGQwMzlhYmViZjI5OGNmOTYxMTNhNmYwYTdhODRhOTFlMjg2M2I0NmE0MWQzNjNkYThjZDIwMTU2NmU2YTBiYzAyMGZkMmU2ZjcyZTliZGUyMjIzZjU1MGQ2NGRhYTYxMzk4Y2Q5MTdjMmY3NTAxMzI0YWU4MDMwMDAwMDAwMDAwMDA1NjVlMjcwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzIyZGVmYTkxMDFlYTNhMzgzOWMzYzAwMjZiMjdhOTgzNzE2NWMwN2ZjZWNmZjhlOTQzNTNiY2YzZDVhMDEzMjgnLFxuICAgICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8xJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4ZDIwMTU2NmU2YTBiYzAyMGZkMmU2ZjcyZTliZGUyMjIzZjU1MGQ2NGRhYTYxMzk4Y2Q5MTdjMmY3NTAxMzI0YScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTUwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFsxNTAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE1MDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcxNTAwJyxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWU6IDI1ODAwNTQsXG4gICAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjU4MDA1NCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NhMGEwMTRiYTZmMTExMDZhMTU1ZWY4ZTJjYWIyZjc2ZDI3N2U0ZjAxY2ZmYTU5MWE5YjQwODQ4MzQzODIzYjNkOTEwNzUyYTQ5Yzk2YmY1ODEzOTg1MjA2ZTIzYzlmOWNkM2E3OGYxY2NjZjVjZjg4ZGVmNTJiNTczY2VkYzkzJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlOlxuICAgICAgICAgICAgICAgICAgICAgICcxOTg5NDIwY2U4MDBlMzVlMWM1OTA5MDdmMjAxN2I1NTI5OTQ1NDg0YjNmZjg4NGY4ZTg4MzkwZGE4ODkzNmU2YTU4NDRlNDg2MGRmMGY0ODllMmEwOTc1NTE5YzFkNmY1ZjAyNTVkZDA5MWVkYmY4NTljNzQwNjNhN2YxZTIwZScsXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnNDA4YzdhMTE5NjcxNTJlZmVlOTUzZjNlYjE2MTkxMDA0OTQ2Njg1ZmRjNGRkODA4N2I5MWUzYWZjYjc3YzkxNicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRzc1ZlcnNpb246ICcwLjAuMScsXG4gICAgICAgICAgICBvdmM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVkZHNhU2lnbmF0dXJlOiB7XG4gICAgICAgICAgICAgICAgICB5OiAnNDA4YzdhMTE5NjcxNTJlZmVlOTUzZjNlYjE2MTkxMDA0OTQ2Njg1ZmRjNGRkODA4N2I5MWUzYWZjYjc3YzkxNicsXG4gICAgICAgICAgICAgICAgICBSOiAnMTk4OTQyMGNlODAwZTM1ZTFjNTkwOTA3ZjIwMTdiNTUyOTk0NTQ4NGIzZmY4ODRmOGU4ODM5MGRhODg5MzZlNicsXG4gICAgICAgICAgICAgICAgICBzaWdtYTogJ2MyY2U1MjhmMWYzMjNmZTlhZjI1NmFiYjU3NDI4OTczYjJlOTdlNGZhNTRmYTZmNTBjMzk0MzAzNjgxNTg2MGUnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAgICcwMDAwMDMwMTAwZTE5MWYxNjZlNzFiMWVmMjBmZmRhMGM5MWIyNGRhOTVlY2M5M2I2NTdjNDY0ZDhhMDZmNTYxZDQ2OTI3MjJmMGIwNmUxMTAyMDAwMDAwMDAyMDMxNmZhMjQ4YTcwNzFhMTZjOWUyZmFlMjUzY2NmNjYyNTUzYTkwNzQ1MGU4ZDk4YzNiYmUyNzViMjQzZGM0MGYwMDA4ZDAwNzAwMDAwMDAwMDAwMDAwMjA4OGM5OWUwZGI4OWNiYTFkYjk3Y2JhZGQ3ZjM3YjJhNGIyYTJiNDAyMjU5NGEwYzA0YjJiY2M4MzdlNGIyNDA0MDIwMjAxMDAwMDAxMDEwMTAwMDEwMTAyMDAwMDAxMDIwMDJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjkwMWQzMmY5NDg4OWQwYmZjMDVjMjRlZDZjMDIzZDVkM2QzNjU0Mjk0YTgzN2Q4NTBkMzczOGIwZTM1MmUxZjQ4NjdiMDZlMTEwMjAwMDAwMDAwMjA0MTQ1ODlkM2ZiNGY2NmRmYmVhYmIyYTcyZDg5ODAzZDY0NTFhMjc5ZmY1YmY1YzY2MzFjZjE2M2FmM2RjY2FmMmZhNWQ4Mzk0YmQ2YmVjNTUyNWI5NTUwYmY0M2JlMDc1YjgzNDIyZDAxMDdjMDVjNzAwOTQ0ZTNlYWVjMjZmOWU4MDMwMDAwMDAwMDAwMDA1NjVlMjcwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzJlNmJiMTcxNjZlZTE5NzEwMjcyOWJkYTQ3YjA2YjdjMGI1OTYyYmY0MzFiYmIwNTYyYjkxZTI2N2I3NTEyOWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8yJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MmZhNWQ4Mzk0YmQ2YmVjNTUyNWI5NTUwYmY0M2JlMDc1YjgzNDIyZDAxMDdjMDVjNzAwOTQ0ZTNlYWVjMjZmOScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMjAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFsyMDAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcyMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWU6IDI1ODAwNTQsXG4gICAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjU4MDA1NCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NhMGEwMTRiYTZmMTExMDZhMTU1ZWY4ZTJjYWIyZjc2ZDI3N2U0ZjAxY2ZmYTU5MWE5YjQwODQ4MzQzODIzYjNkOTEwNzUyYTQ5Yzk2YmY1ODEzOTg1MjA2ZTIzYzlmOWNkM2E3OGYxY2NjZjVjZjg4ZGVmNTJiNTczY2VkYzkzJyxcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0U2NhbkluZGV4OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlOlxuICAgICAgICAgICAgICAgICAgICAgICc5ZTFkMGZkNjY0MDc4MGNmNGRjMjA5ZmE2ZWQ4OTU3ZDY5NThlMGQwMjcyZDhhMmZkNDg0MzhjMDExZjY3YTIyMDBkZTFhNzhlMjNiYzJhN2QyNjFkMGQwMmE0MjIxNDUzMDFhYTljZTk3ZDNkMzA2YjM1MDFiMWY0NGQ5NTYwNicsXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnMzYyZDcxNmE1YTIzMGQ2ODNiNjBkMjllY2U5NDExOTdlMDk2MjdjMjM0YzcxNDQ5ZmFjYWI1MTRjM2E3YWJhZicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRzc1ZlcnNpb246ICcwLjAuMScsXG4gICAgICAgICAgICBvdmM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVkZHNhU2lnbmF0dXJlOiB7XG4gICAgICAgICAgICAgICAgICB5OiAnMzYyZDcxNmE1YTIzMGQ2ODNiNjBkMjllY2U5NDExOTdlMDk2MjdjMjM0YzcxNDQ5ZmFjYWI1MTRjM2E3YWJhZicsXG4gICAgICAgICAgICAgICAgICBSOiAnOWUxZDBmZDY2NDA3ODBjZjRkYzIwOWZhNmVkODk1N2Q2OTU4ZTBkMDI3MmQ4YTJmZDQ4NDM4YzAxMWY2N2EyMicsXG4gICAgICAgICAgICAgICAgICBzaWdtYTogJzE1YTgyZjdjNGFlZGI5ZWJkNGFiNDgxYjQyODFkNmZjYWRiMmE4NDIyNjM1ZjE2ZTRlMzE5NjcwOTcwMDE4MDYnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5jcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihzaWduYXR1cmVTaGFyZXMpO1xuXG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgJ0FBQURBUUNucU1rUUtBTmF0SmwzNXlzSVRoUmVzY0hkeitMZ2FTWHcrRFBPOHRIMm42NXVFUUlBQUFBQUlLZzhaTWVGMlhMTGJCZFBReVBtZnU4YllxQ0Iyei91YVI1c0c3Rm9ibDdWQUFqY0JRQUFBQUFBQUFBZ2lNbWVEYmljdWgyNWZMcmRmemV5cExLaXRBSWxsS0RBU3l2TWczNUxKQVFDQWdFQUFBRUJBUUFCQVFJQUFBRUNBTklCVm01cUM4QWcvUzV2Y3VtOTRpSS9WUTFrMnFZVG1NMlJmQzkxQVRKS0FWN3FBMVB3ZUFGcmNhaE10SlRtOTVIcGZMamVVMFRlODdydC84aWNKNlMxcjI0UkFnQUFBQUFnVHg0aStSZ2NMZEE1cSt2eW1NK1dFVHB2Q25xRXFSNG9ZN1JxUWROajJvelNBVlp1YWd2QUlQMHViM0xwdmVJaVAxVU5aTnFtRTVqTmtYd3ZkUUV5U3VnREFBQUFBQUFBVmw0bkFBQUFBQUFBJyxcbiAgICAgICAgICAgIHNjYW5JbmRleDogMSxcbiAgICAgICAgICAgIHNpZ25hdHVyZTpcbiAgICAgICAgICAgICAgJ0FCbUpRZ3pvQU9OZUhGa0pCL0lCZTFVcGxGU0VzLytJVDQ2SU9RMm9pVGJtd3M1U2p4OHlQK212SldxN1YwS0pjN0xwZmsrbFQ2YjFERGxEQTJnVmhnNUFqSG9SbG5GUzcrNlZQejZ4WVpFQVNVWm9YOXhOMkFoN2tlT3Z5M2ZKRmc9PScsXG4gICAgICAgICAgICByZWNvdmVyeUFtb3VudDogJzE1MDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAnQUFBREFRRGhrZkZtNXhzZThnLzlvTWtiSk5xVjdNazdaWHhHVFlvRzlXSFVhU2NpOExCdUVRSUFBQUFBSURGdm9raW5CeG9XeWVMNjRsUE05bUpWT3BCMFVPalpqRHUrSjFza1BjUVBBQWpRQndBQUFBQUFBQUFnaU1tZURiaWN1aDI1ZkxyZGZ6ZXlwTEtpdEFJbGxLREFTeXZNZzM1TEpBUUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FDK2wyRGxMMXI3RlVsdVZVTDlEdmdkYmcwSXRBUWZBWEhBSlJPUHE3Q2I1QWRNdmxJaWRDL3dGd2s3V3dDUFYwOU5sUXBTb045aFEwM09MRGpVdUgwaG5zRzRSQWdBQUFBQWdRVVdKMC90UFp0KytxN0tuTFltQVBXUlJvbm4vVy9YR1l4enhZNjg5eks4dnBkZzVTOWEreFZKYmxWQy9RNzRIVzROQ0xRRUh3Rnh3Q1VUajZ1d20rZWdEQUFBQUFBQUFWbDRuQUFBQUFBQUEnLFxuICAgICAgICAgICAgc2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgc2lnbmF0dXJlOlxuICAgICAgICAgICAgICAnQUo0ZEQ5WmtCNERQVGNJSittN1lsWDFwV09EUUp5MktMOVNFT01BUjlub2lGYWd2ZkVydHVldlVxMGdiUW9IVy9LMnlxRUltTmZGdVRqR1djSmNBR0FZMkxYRnFXaU1OYUR0ZzBwN09sQkdYNEpZbndqVEhGRW42eXJVVXc2ZXJydz09JyxcbiAgICAgICAgICAgIHJlY292ZXJ5QW1vdW50OiAnMjAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogMjAsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXIgVHJhbnNhY3Rpb24gRmFpbHVyZXM6JywgKCkgPT4ge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzczAgPSAnMHg5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzJztcbiAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OSc7XG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwJFN3PFJqdkFnZntuWUFZSTJ4TSc7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gcmVjb3ZlciBkdWUgdG8gbm9uLXplcm8gZnVuZCBidXQgaW5zdWZmaWNpZW50IGZ1bmRzIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0QmFsYW5jZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGNhbGxCYWNrLndpdGhBcmdzKHNlbmRlckFkZHJlc3MwKS5yZXNvbHZlcygnOTgwMDIxMicpO1xuXG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3Zlcih7XG4gICAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAnMCcsXG4gICAgICAgICAgc2NhbjogMSxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ0RpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4IDEuIElmIGl0IGlzIHRva2VuIHRyYW5zYWN0aW9uLCBwbGVhc2Uga2VlcCBzdWZmaWNpZW50IFN1aSBiYWxhbmNlIGluIHRoZSBhZGRyZXNzIGZvciB0aGUgdHJhbnNhY3Rpb24gZmVlLidcbiAgICAgICAgKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHJlY292ZXIgZHVlIHRvIG5vdCBmaW5kaW5nIGFuIGFkZHJlc3Mgd2l0aCBmdW5kcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNhbGxCYWNrID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRCYWxhbmNlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgY2FsbEJhY2sucmVzb2x2ZXMoJzAnKTtcblxuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXIoe1xuICAgICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICBzY2FuOiAnMTAnLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggMTAuIElmIGl0IGlzIHRva2VuIHRyYW5zYWN0aW9uLCBwbGVhc2Uga2VlcCBzdWZmaWNpZW50IFN1aSBiYWxhbmNlIGluIHRoZSBhZGRyZXNzIGZvciB0aGUgdHJhbnNhY3Rpb24gZmVlLidcbiAgICAgICAgKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDEwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NvbnNvbGlkYXRpb24gVHJhbnNhY3Rpb24gRmFpbHVyZXM6JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzIGluIHJlY2VpdmUgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgICBjb25zdCByZWNlaXZlQWRkcmVzczEgPSAnMHgzMmQ4ZTU3ZWU2ZDkxZTU1NThkYTA2NzcxNTRjMmYwODU3OTUzNDhlMzE3Zjk1YWNjOWVmYWRlMWI0MTEyZmNjJztcbiAgICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgICBjb25zdCBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0QmFsYW5jZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGNhbGxCYWNrLndpdGhBcmdzKHJlY2VpdmVBZGRyZXNzMSkucmVzb2x2ZXMoJzEnKTtcblxuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogJzEnLFxuICAgICAgICAgIGVuZGluZ1NjYW5JbmRleDogJzInLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggMi4nXG4gICAgICAgICk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAxKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==