@bitgo-beta/sdk-coin-xtz 1.4.3-alpha.40 → 1.4.3-alpha.401

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 (42) hide show
  1. package/.mocharc.yml +1 -1
  2. package/CHANGELOG.md +678 -0
  3. package/package.json +12 -11
  4. package/dist/src/index.d.ts +0 -5
  5. package/dist/src/index.d.ts.map +0 -1
  6. package/dist/src/index.js +0 -30
  7. package/dist/src/lib/address.d.ts +0 -8
  8. package/dist/src/lib/address.d.ts.map +0 -1
  9. package/dist/src/lib/address.js +0 -10
  10. package/dist/src/lib/iface.d.ts +0 -115
  11. package/dist/src/lib/iface.d.ts.map +0 -1
  12. package/dist/src/lib/iface.js +0 -3
  13. package/dist/src/lib/index.d.ts +0 -10
  14. package/dist/src/lib/index.d.ts.map +0 -1
  15. package/dist/src/lib/index.js +0 -37
  16. package/dist/src/lib/keyPair.d.ts +0 -40
  17. package/dist/src/lib/keyPair.d.ts.map +0 -1
  18. package/dist/src/lib/keyPair.js +0 -135
  19. package/dist/src/lib/multisigUtils.d.ts +0 -134
  20. package/dist/src/lib/multisigUtils.d.ts.map +0 -1
  21. package/dist/src/lib/multisigUtils.js +0 -1180
  22. package/dist/src/lib/transaction.d.ts +0 -119
  23. package/dist/src/lib/transaction.d.ts.map +0 -1
  24. package/dist/src/lib/transaction.js +0 -315
  25. package/dist/src/lib/transactionBuilder.d.ts +0 -171
  26. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  27. package/dist/src/lib/transactionBuilder.js +0 -453
  28. package/dist/src/lib/transferBuilder.d.ts +0 -24
  29. package/dist/src/lib/transferBuilder.d.ts.map +0 -1
  30. package/dist/src/lib/transferBuilder.js +0 -64
  31. package/dist/src/lib/utils.d.ts +0 -265
  32. package/dist/src/lib/utils.d.ts.map +0 -1
  33. package/dist/src/lib/utils.js +0 -460
  34. package/dist/src/register.d.ts +0 -3
  35. package/dist/src/register.d.ts.map +0 -1
  36. package/dist/src/register.js +0 -11
  37. package/dist/src/txtz.d.ts +0 -13
  38. package/dist/src/txtz.d.ts.map +0 -1
  39. package/dist/src/txtz.js +0 -14
  40. package/dist/src/xtz.d.ts +0 -80
  41. package/dist/src/xtz.d.ts.map +0 -1
  42. package/dist/src/xtz.js +0 -189
@@ -1,1180 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.forwarderOriginationOperation = exports.getOwnersPublicKeys = exports.genericMultisigOriginationOperation = exports.revealOperation = exports.genericMultisigDataToSign = exports.getMultisigTransferSignatures = exports.updateMultisigTransferSignatures = exports.multisigTransactionOperation = exports.singlesigTransactionOperation = exports.getOriginationDataFromOperation = exports.getMultisigTransferDataFromOperation = void 0;
23
- const _ = __importStar(require("lodash"));
24
- const utils_1 = require("./utils");
25
- // Default n of m for multisig wallets
26
- const DEFAULT_N = 2;
27
- const DEFAULT_M = 3;
28
- /**
29
- * Helper method to get the transfer details from a generic multisig transaction operation.
30
- *
31
- * @param {TransactionOp} operation A transaction operation JSON
32
- * @returns {TransferData} Information about the destination, token and transfer amount
33
- */
34
- function getMultisigTransferDataFromOperation(operation) {
35
- const fee = {
36
- fee: operation.fee,
37
- gasLimit: operation.gas_limit,
38
- storageLimit: operation.storage_limit,
39
- };
40
- if (!operation.parameters) {
41
- // Singlesig transaction
42
- return {
43
- coin: 'mutez',
44
- from: operation.source,
45
- to: operation.destination,
46
- amount: operation.amount,
47
- fee,
48
- };
49
- }
50
- // These follow the structure from the response of genericMultisigTransferParams()
51
- const transferArgs = operation.parameters.value.args[0].args[1].args[0];
52
- const accountType = transferArgs[3].prim;
53
- const counter = operation.parameters.value.args[0].args[0].int;
54
- // In multisig transactions, the wallet contract is the destination
55
- const from = operation.destination;
56
- let accountTypeIndex;
57
- switch (accountType) {
58
- case 'IMPLICIT_ACCOUNT':
59
- accountTypeIndex = 4;
60
- break;
61
- case 'CONTRACT':
62
- accountTypeIndex = 5;
63
- break;
64
- default:
65
- throw new Error('Invalid contract parameters');
66
- }
67
- return {
68
- coin: transferArgs[accountTypeIndex].args[0].prim,
69
- from,
70
- to: transferArgs[2].args[1].string,
71
- amount: transferArgs[accountTypeIndex].args[1].int,
72
- fee,
73
- counter,
74
- };
75
- }
76
- exports.getMultisigTransferDataFromOperation = getMultisigTransferDataFromOperation;
77
- /**
78
- * Helper method to get the wallet or address initialization tx from an origination operation
79
- *
80
- * @param {OriginationOp} operation
81
- * @returns {OriginationData} Information about the wallet contract creating a forwarder contract
82
- */
83
- function getOriginationDataFromOperation(operation) {
84
- const fee = {
85
- fee: operation.fee,
86
- gasLimit: operation.gas_limit,
87
- storageLimit: operation.storage_limit,
88
- };
89
- const { source: from, counter, balance } = operation;
90
- // Transactions initializing a forwarder contract contain the address of the wallet contract
91
- const forwarderDestination = _.get(operation, 'script.code[2].args[0][3].args[0][0].args[1].string');
92
- return {
93
- fee,
94
- counter,
95
- balance,
96
- from,
97
- forwarderDestination,
98
- };
99
- }
100
- exports.getOriginationDataFromOperation = getOriginationDataFromOperation;
101
- /**
102
- * Helper method to build a singlesig transaction operation.
103
- *
104
- * @param {string} counter Source account next counter
105
- * @param {string} source The account that will pay for fees, and in singlesig transactions, where
106
- * the funds are taken from
107
- * @param {string} amount The amount in mutez to be transferred
108
- * @param {string} destination The account address to send the funds to
109
- * @param {string} fee Fees in mutez to pay by the source account
110
- * @param {string} gasLimit Maximum amount in mutez to spend in gas fees
111
- * @param {string} storageLimit Maximum amount in mutez to spend in storage fees
112
- * @returns {TransactionOp}A Tezos transaction operation
113
- */
114
- function singlesigTransactionOperation(counter, source, amount, destination, fee = utils_1.DEFAULT_FEE.TRANSFER.toString(), gasLimit = utils_1.DEFAULT_GAS_LIMIT.TRANSFER.toString(), storageLimit = utils_1.DEFAULT_STORAGE_LIMIT.TRANSFER.toString()) {
115
- return {
116
- kind: 'transaction',
117
- source,
118
- fee,
119
- counter,
120
- gas_limit: gasLimit,
121
- storage_limit: storageLimit,
122
- amount,
123
- destination,
124
- };
125
- }
126
- exports.singlesigTransactionOperation = singlesigTransactionOperation;
127
- /**
128
- * Create a multisig wallet transaction operation.
129
- *
130
- * @see {@link transactionOperation}
131
- * @param {string} counter Source account next counter
132
- * @param {string} source The account that will pay for fees, and in singlesig transactions, where
133
- * the funds are taken from
134
- * @param {string} amount The amount in mutez to be transferred
135
- * @param {string} contractAddress If it is a multisig transfer, the smart contract address with the
136
- * funds to be transferred from
137
- * @param {string} contractCounter If it is a multisig transfer, the smart contract counter to use
138
- * in the next transaction
139
- * @param {string} destinationAddress An implicit or originated address to transfer fudns to
140
- * @param {string[]} signatures signatures List of signatures authorizing the funds transfer form
141
- * the multisig wallet
142
- * @param {string} fee Fees in mutez to pay by the source account
143
- * @param {string} gasLimit Maximum amount in mutez to spend in gas fees
144
- * @param {string} storageLimit Maximum amount in mutez to spend in storage fees
145
- * @param {number} m The number of signers (owners) for the multisig wallet being used. Default is 3
146
- * @returns {TransactionOp} A Tezos operation with a generic multisig transfer
147
- */
148
- function multisigTransactionOperation(counter, source, amount, contractAddress, contractCounter, destinationAddress, signatures, fee = utils_1.DEFAULT_FEE.TRANSFER.toString(), gasLimit = utils_1.DEFAULT_GAS_LIMIT.TRANSFER.toString(), storageLimit = utils_1.DEFAULT_STORAGE_LIMIT.TRANSFER.toString(), m = DEFAULT_M) {
149
- return {
150
- kind: 'transaction',
151
- source,
152
- fee,
153
- counter,
154
- gas_limit: gasLimit,
155
- storage_limit: storageLimit,
156
- amount: '0',
157
- destination: contractAddress,
158
- parameters: genericMultisigTransferParams(destinationAddress, amount, contractCounter, signatures, m),
159
- };
160
- }
161
- exports.multisigTransactionOperation = multisigTransactionOperation;
162
- /**
163
- * Helper function to build the parameters to call the generic multisig smart contract with.
164
- *
165
- * @param {string} destinationAddress An implicit or originated address
166
- * @param {number} amount Number of Mutez to be transferred
167
- * @param {string} contractCounter Multisig contract counter number
168
- * @param {IndexedSignature[]} signatures List of transactions and their order
169
- * @param {number} m The multisig wallet total number of signers (owners)
170
- * @returns The parameters object
171
- */
172
- function genericMultisigTransferParams(destinationAddress, amount, contractCounter, signatures, m) {
173
- const transactionSignatures = buildSignatures(signatures);
174
- return {
175
- entrypoint: 'main',
176
- value: {
177
- prim: 'Pair',
178
- args: [
179
- {
180
- prim: 'Pair',
181
- args: [{ int: contractCounter }, { prim: 'Left', args: [transferToAccount(destinationAddress, amount)] }],
182
- },
183
- transactionSignatures,
184
- ],
185
- },
186
- };
187
- }
188
- /**
189
- * Replace the signatures in a multisig transaction operation with new ones.
190
- *
191
- * @param {TransactionOp} transaction Transaction to mutate
192
- * @param {IndexedSignature[]} signatures List of transactions and their order
193
- */
194
- function updateMultisigTransferSignatures(transaction, signatures) {
195
- transaction.parameters.value.args[1] = buildSignatures(signatures, transaction.parameters.value.args[1]);
196
- }
197
- exports.updateMultisigTransferSignatures = updateMultisigTransferSignatures;
198
- /**
199
- * Ge the list if multisig signatures if any in a convenient format.
200
- *
201
- * @param {TransactionOp} transaction The transaction to search the signatures in
202
- * @returns {IndexedSignature[]} A list of signatures and their order in teh transfer script
203
- */
204
- function getMultisigTransferSignatures(transaction) {
205
- const signatures = [];
206
- if (!transaction.parameters && !transaction.parameters.value && !transaction.parameters.value) {
207
- return [];
208
- }
209
- const rawSignatures = transaction.parameters.value.args[1];
210
- for (let i = 0; i < rawSignatures.length; i++) {
211
- if (rawSignatures[i].prim === 'Some') {
212
- signatures.push({
213
- signature: rawSignatures[i].args[0].string,
214
- index: i,
215
- });
216
- }
217
- }
218
- return signatures;
219
- }
220
- exports.getMultisigTransferSignatures = getMultisigTransferSignatures;
221
- /**
222
- * Build a list of ordered signatures, putting a None primitive for the missing indexes.
223
- *
224
- * @param {IndexedSignature[]} signatures List of transactions and their order
225
- * @param {number} m Size of the signature list
226
- * @param {any[]} existingSignatures List of existing signatures to merge with the generated ones
227
- * @returns {any[]} List of signatures in the right order
228
- */
229
- function buildSignatures(signatures, existingSignatures = [], m = DEFAULT_M) {
230
- // Initialize the array with the existing signatures and/or empty objects
231
- const transactionSignatures = existingSignatures;
232
- const size = existingSignatures.length;
233
- if (size > m) {
234
- throw new Error('Too many signatures. Expected less than ' + m + ' got ' + size);
235
- }
236
- for (let i = size; i < m; i++) {
237
- transactionSignatures.push({ prim: 'None' });
238
- }
239
- // Replace the empty signatures for the real ones based on the right index
240
- signatures.forEach((s) => {
241
- if (s.index) {
242
- transactionSignatures[s.index] = { prim: 'Some', args: [{ string: s.signature }] };
243
- }
244
- else {
245
- for (let i = 0; i < transactionSignatures.length; i++) {
246
- // Search for the first "null" signature
247
- if (transactionSignatures[i].prim === 'None') {
248
- transactionSignatures[i] = { prim: 'Some', args: [{ string: s.signature }] };
249
- break;
250
- }
251
- }
252
- }
253
- });
254
- return transactionSignatures;
255
- }
256
- /**
257
- * Helper function to build the Michelson script to be signed to transfer funds from a multisig
258
- * wallet.
259
- *
260
- * @param contractAddress The multisig smart contract address
261
- * @param {string} destinationAddress The destination account address (implicit or originated)
262
- * @param {number} amount Number of mutez to transfer
263
- * @param {string} contractCounter Wallet counter to use in the transaction
264
- * @returns A JSON representation of the Michelson script to sign and approve a transfer
265
- */
266
- function genericMultisigDataToSign(contractAddress, destinationAddress, amount, contractCounter) {
267
- const data = {
268
- prim: 'Pair',
269
- args: [
270
- { int: contractCounter },
271
- {
272
- prim: 'Left',
273
- args: [transferToAccount(destinationAddress, amount)],
274
- },
275
- ],
276
- };
277
- const type = {
278
- prim: 'pair',
279
- args: [
280
- {
281
- prim: 'nat',
282
- annots: ['%counter'],
283
- },
284
- {
285
- prim: 'or',
286
- args: [
287
- {
288
- prim: 'lambda',
289
- args: [
290
- { prim: 'unit' },
291
- {
292
- prim: 'list',
293
- args: [{ prim: 'operation' }],
294
- },
295
- ],
296
- annots: ['%operation'],
297
- },
298
- {
299
- prim: 'pair',
300
- args: [
301
- {
302
- prim: 'nat',
303
- annots: ['%threshold'],
304
- },
305
- {
306
- prim: 'list',
307
- args: [{ prim: 'key' }],
308
- annots: ['%keys'],
309
- },
310
- ],
311
- annots: ['%change_keys'],
312
- },
313
- ],
314
- annots: [':action'],
315
- },
316
- ],
317
- annots: [':payload'],
318
- };
319
- return buildPair(data, type, contractAddress);
320
- }
321
- exports.genericMultisigDataToSign = genericMultisigDataToSign;
322
- /**
323
- * Util function to build a Michelson Pair object.
324
- *
325
- * @param data
326
- * @param type
327
- * @param contractAddress
328
- */
329
- function buildPair(data, type, contractAddress) {
330
- return {
331
- data: {
332
- prim: 'Pair',
333
- args: [{ string: contractAddress }, data],
334
- },
335
- type: {
336
- prim: 'pair',
337
- args: [{ prim: 'address' }, type],
338
- },
339
- };
340
- }
341
- /**
342
- * Build the lambda for the multisig transaction transfer to an implicit or originated account.
343
- *
344
- * @param {string} address Account address to send the funds to
345
- * @param {string} amount The amount in mutez to transfer
346
- * @see {@link https://tezostaquito.io/docs/making_transfers#transfer-000005-50-mutez-tokens-from-a-kt1-address-to-a-tz1-address}
347
- */
348
- function transferToAccount(address, amount) {
349
- if (utils_1.isValidKey(address, utils_1.hashTypes.KT)) {
350
- return transferToOriginatedAccount(address, amount);
351
- }
352
- // Lambda to transfer to an implicit account
353
- return [
354
- { prim: 'DROP' },
355
- { prim: 'NIL', args: [{ prim: 'operation' }] },
356
- {
357
- prim: 'PUSH',
358
- args: [{ prim: 'key_hash' }, { string: address }],
359
- },
360
- { prim: 'IMPLICIT_ACCOUNT' },
361
- {
362
- prim: 'PUSH',
363
- args: [{ prim: 'mutez' }, { int: amount }],
364
- },
365
- { prim: 'UNIT' },
366
- { prim: 'TRANSFER_TOKENS' },
367
- { prim: 'CONS' },
368
- ];
369
- }
370
- /**
371
- * Build the lambda for the multisig transaction transfer to an originated account.
372
- *
373
- * @param {string} address Originated account address to send the funds to
374
- * @param {string} amount The amount in mutez to transfer
375
- * @see {@link https://tezostaquito.io/docs/making_transfers#transfer-0000001-1-mutez-tokens-from-a-kt1-address-to-a-kt1-address}
376
- */
377
- function transferToOriginatedAccount(address, amount) {
378
- return [
379
- { prim: 'DROP' },
380
- { prim: 'NIL', args: [{ prim: 'operation' }] },
381
- {
382
- prim: 'PUSH',
383
- args: [{ prim: 'address' }, { string: address }],
384
- },
385
- { prim: 'CONTRACT', args: [{ prim: 'unit' }] },
386
- [
387
- {
388
- prim: 'IF_NONE',
389
- args: [[[{ prim: 'UNIT' }, { prim: 'FAILWITH' }]], []],
390
- },
391
- ],
392
- {
393
- prim: 'PUSH',
394
- args: [{ prim: 'mutez' }, { int: amount }],
395
- },
396
- { prim: 'UNIT' },
397
- { prim: 'TRANSFER_TOKENS' },
398
- { prim: 'CONS' },
399
- ];
400
- }
401
- /**
402
- * Create a reveal operation for a public key.
403
- *
404
- * @param {string} counter Source account next counter
405
- * @param {string} source Source account address
406
- * @param {string} pubKey The public key to reveal
407
- * @param {string} fee Fees in mutez to pay by the source account
408
- * @param {string} gasLimit Maximum amount in mutez to spend in gas fees
409
- * @param {string} storageLimit Maximum amount in mutez to spend in storage fees
410
- * @returns An origination operation
411
- */
412
- function revealOperation(counter, source, pubKey, fee = utils_1.DEFAULT_FEE.REVEAL.toString(), gasLimit = utils_1.DEFAULT_GAS_LIMIT.REVEAL.toString(), storageLimit = utils_1.DEFAULT_STORAGE_LIMIT.REVEAL.toString()) {
413
- return {
414
- kind: 'reveal',
415
- counter,
416
- source,
417
- fee,
418
- gas_limit: gasLimit,
419
- storage_limit: storageLimit,
420
- public_key: pubKey,
421
- };
422
- }
423
- exports.revealOperation = revealOperation;
424
- /**
425
- * Create an origination operation for the generic multisg contract. It does not create a reveal
426
- * operation for the source account.
427
- *
428
- * @param {string} counter Valid source account counter to use
429
- * @param {string} source Source account address
430
- * @param {string} fee Fees in mutez to pay by the source account
431
- * @param {string} gasLimit Maximum amount in mutez to spend in gas fees
432
- * @param {string} storageLimit Maximum amount in mutez to spend in storage fees
433
- * @param {string} balance New multisig account initial balance taken from the source account
434
- * @param {string[]} pubKeys List of public keys of the multisig owner
435
- * @param {string} delegate Optional implicit address to delegate the wallet funds to
436
- * @param {number} threshold Minimum number of signatures required to authorize a multisig operation
437
- * @returns An origination operation
438
- */
439
- function genericMultisigOriginationOperation(counter, source, fee, gasLimit, storageLimit, balance, pubKeys, delegate, threshold = DEFAULT_N) {
440
- const walletPublicKeys = [];
441
- pubKeys.forEach((pk) => walletPublicKeys.push({ string: pk }));
442
- const originationOp = {
443
- kind: 'origination',
444
- counter,
445
- source,
446
- fee,
447
- gas_limit: gasLimit,
448
- storage_limit: storageLimit,
449
- balance,
450
- script: {
451
- code: genericMultisig,
452
- storage: {
453
- prim: 'Pair',
454
- args: [
455
- {
456
- int: '0',
457
- },
458
- {
459
- prim: 'Pair',
460
- args: [
461
- {
462
- int: threshold.toString(),
463
- },
464
- walletPublicKeys,
465
- ],
466
- },
467
- ],
468
- },
469
- },
470
- };
471
- if (delegate) {
472
- originationOp.delegate = delegate;
473
- }
474
- return originationOp;
475
- }
476
- exports.genericMultisigOriginationOperation = genericMultisigOriginationOperation;
477
- /**
478
- * Get the public key of each owner of an multisig wallet origination contract.
479
- *
480
- * @param {OriginationOp} operation An operation with the generic multisig wallet origination
481
- * @returns {string[]} List of all the owners set in the origination transaction
482
- */
483
- function getOwnersPublicKeys(operation) {
484
- const ownersArgs = _.get(operation, 'script.storage.args[1].args[1]');
485
- if (!ownersArgs) {
486
- return [];
487
- }
488
- return ownersArgs.map((o) => o.string);
489
- }
490
- exports.getOwnersPublicKeys = getOwnersPublicKeys;
491
- /**
492
- * Generic Multisig contract from https://github.com/murbard/smart-contracts/blob/master/multisig/michelson/generic.tz
493
- */
494
- const genericMultisig = [
495
- {
496
- prim: 'parameter',
497
- args: [
498
- {
499
- prim: 'or',
500
- args: [
501
- { prim: 'unit', annots: ['%default'] },
502
- {
503
- prim: 'pair',
504
- args: [
505
- {
506
- prim: 'pair',
507
- args: [
508
- {
509
- prim: 'nat',
510
- annots: ['%counter'],
511
- },
512
- {
513
- prim: 'or',
514
- args: [
515
- {
516
- prim: 'lambda',
517
- args: [
518
- { prim: 'unit' },
519
- {
520
- prim: 'list',
521
- args: [
522
- {
523
- prim: 'operation',
524
- },
525
- ],
526
- },
527
- ],
528
- annots: ['%operation'],
529
- },
530
- {
531
- prim: 'pair',
532
- args: [
533
- {
534
- prim: 'nat',
535
- annots: ['%threshold'],
536
- },
537
- {
538
- prim: 'list',
539
- args: [{ prim: 'key' }],
540
- annots: ['%keys'],
541
- },
542
- ],
543
- annots: ['%change_keys'],
544
- },
545
- ],
546
- annots: [':action'],
547
- },
548
- ],
549
- annots: [':payload'],
550
- },
551
- {
552
- prim: 'list',
553
- args: [
554
- {
555
- prim: 'option',
556
- args: [{ prim: 'signature' }],
557
- },
558
- ],
559
- annots: ['%sigs'],
560
- },
561
- ],
562
- annots: ['%main'],
563
- },
564
- ],
565
- },
566
- ],
567
- },
568
- {
569
- prim: 'storage',
570
- args: [
571
- {
572
- prim: 'pair',
573
- args: [
574
- {
575
- prim: 'nat',
576
- annots: ['%stored_counter'],
577
- },
578
- {
579
- prim: 'pair',
580
- args: [
581
- {
582
- prim: 'nat',
583
- annots: ['%threshold'],
584
- },
585
- {
586
- prim: 'list',
587
- args: [{ prim: 'key' }],
588
- annots: ['%keys'],
589
- },
590
- ],
591
- },
592
- ],
593
- },
594
- ],
595
- },
596
- {
597
- prim: 'code',
598
- args: [
599
- [
600
- [
601
- [
602
- { prim: 'DUP' },
603
- { prim: 'CAR' },
604
- {
605
- prim: 'DIP',
606
- args: [[{ prim: 'CDR' }]],
607
- },
608
- ],
609
- ],
610
- {
611
- prim: 'IF_LEFT',
612
- args: [
613
- [
614
- { prim: 'DROP' },
615
- {
616
- prim: 'NIL',
617
- args: [{ prim: 'operation' }],
618
- },
619
- { prim: 'PAIR' },
620
- ],
621
- [
622
- {
623
- prim: 'PUSH',
624
- args: [{ prim: 'mutez' }, { int: '0' }],
625
- },
626
- { prim: 'AMOUNT' },
627
- [
628
- [{ prim: 'COMPARE' }, { prim: 'EQ' }],
629
- {
630
- prim: 'IF',
631
- args: [[], [[{ prim: 'UNIT' }, { prim: 'FAILWITH' }]]],
632
- },
633
- ],
634
- { prim: 'SWAP' },
635
- { prim: 'DUP' },
636
- {
637
- prim: 'DIP',
638
- args: [[{ prim: 'SWAP' }]],
639
- },
640
- {
641
- prim: 'DIP',
642
- args: [
643
- [
644
- [
645
- [
646
- { prim: 'DUP' },
647
- { prim: 'CAR' },
648
- {
649
- prim: 'DIP',
650
- args: [[{ prim: 'CDR' }]],
651
- },
652
- ],
653
- ],
654
- { prim: 'DUP' },
655
- { prim: 'SELF' },
656
- { prim: 'ADDRESS' },
657
- { prim: 'PAIR' },
658
- { prim: 'PACK' },
659
- {
660
- prim: 'DIP',
661
- args: [
662
- [
663
- [
664
- [
665
- { prim: 'DUP' },
666
- {
667
- prim: 'CAR',
668
- annots: ['@counter'],
669
- },
670
- {
671
- prim: 'DIP',
672
- args: [
673
- [
674
- {
675
- prim: 'CDR',
676
- },
677
- ],
678
- ],
679
- },
680
- ],
681
- ],
682
- {
683
- prim: 'DIP',
684
- args: [[{ prim: 'SWAP' }]],
685
- },
686
- ],
687
- ],
688
- },
689
- { prim: 'SWAP' },
690
- ],
691
- ],
692
- },
693
- [
694
- [
695
- { prim: 'DUP' },
696
- {
697
- prim: 'CAR',
698
- annots: ['@stored_counter'],
699
- },
700
- {
701
- prim: 'DIP',
702
- args: [[{ prim: 'CDR' }]],
703
- },
704
- ],
705
- ],
706
- {
707
- prim: 'DIP',
708
- args: [[{ prim: 'SWAP' }]],
709
- },
710
- [
711
- [{ prim: 'COMPARE' }, { prim: 'EQ' }],
712
- {
713
- prim: 'IF',
714
- args: [[], [[{ prim: 'UNIT' }, { prim: 'FAILWITH' }]]],
715
- },
716
- ],
717
- {
718
- prim: 'DIP',
719
- args: [[{ prim: 'SWAP' }]],
720
- },
721
- [
722
- [
723
- { prim: 'DUP' },
724
- {
725
- prim: 'CAR',
726
- annots: ['@threshold'],
727
- },
728
- {
729
- prim: 'DIP',
730
- args: [
731
- [
732
- {
733
- prim: 'CDR',
734
- annots: ['@keys'],
735
- },
736
- ],
737
- ],
738
- },
739
- ],
740
- ],
741
- {
742
- prim: 'DIP',
743
- args: [
744
- [
745
- {
746
- prim: 'PUSH',
747
- args: [{ prim: 'nat' }, { int: '0' }],
748
- annots: ['@valid'],
749
- },
750
- { prim: 'SWAP' },
751
- {
752
- prim: 'ITER',
753
- args: [
754
- [
755
- {
756
- prim: 'DIP',
757
- args: [[{ prim: 'SWAP' }]],
758
- },
759
- { prim: 'SWAP' },
760
- {
761
- prim: 'IF_CONS',
762
- args: [
763
- [
764
- [
765
- {
766
- prim: 'IF_NONE',
767
- args: [
768
- [
769
- {
770
- prim: 'SWAP',
771
- },
772
- {
773
- prim: 'DROP',
774
- },
775
- ],
776
- [
777
- {
778
- prim: 'SWAP',
779
- },
780
- {
781
- prim: 'DIP',
782
- args: [
783
- [
784
- {
785
- prim: 'SWAP',
786
- },
787
- {
788
- prim: 'DIP',
789
- args: [
790
- {
791
- int: '2',
792
- },
793
- [
794
- [
795
- {
796
- prim: 'DIP',
797
- args: [
798
- [
799
- {
800
- prim: 'DUP',
801
- },
802
- ],
803
- ],
804
- },
805
- {
806
- prim: 'SWAP',
807
- },
808
- ],
809
- ],
810
- ],
811
- },
812
- [
813
- [
814
- {
815
- prim: 'DIP',
816
- args: [
817
- {
818
- int: '2',
819
- },
820
- [
821
- {
822
- prim: 'DUP',
823
- },
824
- ],
825
- ],
826
- },
827
- {
828
- prim: 'DIG',
829
- args: [
830
- {
831
- int: '3',
832
- },
833
- ],
834
- },
835
- ],
836
- {
837
- prim: 'DIP',
838
- args: [
839
- [
840
- {
841
- prim: 'CHECK_SIGNATURE',
842
- },
843
- ],
844
- ],
845
- },
846
- {
847
- prim: 'SWAP',
848
- },
849
- {
850
- prim: 'IF',
851
- args: [
852
- [
853
- {
854
- prim: 'DROP',
855
- },
856
- ],
857
- [
858
- {
859
- prim: 'FAILWITH',
860
- },
861
- ],
862
- ],
863
- },
864
- ],
865
- {
866
- prim: 'PUSH',
867
- args: [
868
- {
869
- prim: 'nat',
870
- },
871
- {
872
- int: '1',
873
- },
874
- ],
875
- },
876
- {
877
- prim: 'ADD',
878
- annots: ['@valid'],
879
- },
880
- ],
881
- ],
882
- },
883
- ],
884
- ],
885
- },
886
- ],
887
- ],
888
- [
889
- [
890
- {
891
- prim: 'UNIT',
892
- },
893
- {
894
- prim: 'FAILWITH',
895
- },
896
- ],
897
- ],
898
- ],
899
- },
900
- { prim: 'SWAP' },
901
- ],
902
- ],
903
- },
904
- ],
905
- ],
906
- },
907
- [
908
- [{ prim: 'COMPARE' }, { prim: 'LE' }],
909
- {
910
- prim: 'IF',
911
- args: [[], [[{ prim: 'UNIT' }, { prim: 'FAILWITH' }]]],
912
- },
913
- ],
914
- {
915
- prim: 'IF_CONS',
916
- args: [[[{ prim: 'UNIT' }, { prim: 'FAILWITH' }]], []],
917
- },
918
- { prim: 'DROP' },
919
- {
920
- prim: 'DIP',
921
- args: [
922
- [
923
- [
924
- [
925
- { prim: 'DUP' },
926
- { prim: 'CAR' },
927
- {
928
- prim: 'DIP',
929
- args: [[{ prim: 'CDR' }]],
930
- },
931
- ],
932
- ],
933
- {
934
- prim: 'PUSH',
935
- args: [{ prim: 'nat' }, { int: '1' }],
936
- },
937
- {
938
- prim: 'ADD',
939
- annots: ['@new_counter'],
940
- },
941
- { prim: 'PAIR' },
942
- ],
943
- ],
944
- },
945
- {
946
- prim: 'IF_LEFT',
947
- args: [
948
- [{ prim: 'UNIT' }, { prim: 'EXEC' }],
949
- [
950
- {
951
- prim: 'DIP',
952
- args: [[{ prim: 'CAR' }]],
953
- },
954
- { prim: 'SWAP' },
955
- { prim: 'PAIR' },
956
- {
957
- prim: 'NIL',
958
- args: [{ prim: 'operation' }],
959
- },
960
- ],
961
- ],
962
- },
963
- { prim: 'PAIR' },
964
- ],
965
- ],
966
- },
967
- ],
968
- ],
969
- },
970
- ];
971
- /**
972
- * Add contract address to forwarder contract template and return contract Michelson code as JSON
973
- *
974
- * @param {string} contractAddress - multisig contractAddress that will receive forwarded funds
975
- * @returns {object[]} Michelson code for the origination operation
976
- */
977
- function createForwarder(contractAddress) {
978
- return [
979
- {
980
- prim: 'parameter',
981
- args: [
982
- {
983
- prim: 'or',
984
- args: [
985
- { prim: 'unit', annots: ['%default'] },
986
- {
987
- prim: 'pair',
988
- args: [
989
- { prim: 'nat' },
990
- {
991
- prim: 'contract',
992
- args: [
993
- {
994
- prim: 'pair',
995
- args: [
996
- { prim: 'address', annots: [':from'] },
997
- {
998
- prim: 'pair',
999
- args: [
1000
- { prim: 'address', annots: [':to'] },
1001
- { prim: 'nat', annots: [':value'] },
1002
- ],
1003
- },
1004
- ],
1005
- },
1006
- ],
1007
- },
1008
- ],
1009
- annots: ['%flush'],
1010
- },
1011
- ],
1012
- },
1013
- ],
1014
- },
1015
- { prim: 'storage', args: [{ prim: 'unit' }] },
1016
- {
1017
- prim: 'code',
1018
- args: [
1019
- [
1020
- {
1021
- prim: 'CAST',
1022
- args: [
1023
- {
1024
- prim: 'pair',
1025
- args: [
1026
- {
1027
- prim: 'or',
1028
- args: [
1029
- { prim: 'unit' },
1030
- {
1031
- prim: 'pair',
1032
- args: [
1033
- { prim: 'nat' },
1034
- {
1035
- prim: 'contract',
1036
- args: [
1037
- {
1038
- prim: 'pair',
1039
- args: [
1040
- { prim: 'address' },
1041
- { prim: 'pair', args: [{ prim: 'address' }, { prim: 'nat' }] },
1042
- ],
1043
- },
1044
- ],
1045
- },
1046
- ],
1047
- },
1048
- ],
1049
- },
1050
- { prim: 'unit' },
1051
- ],
1052
- },
1053
- ],
1054
- },
1055
- { prim: 'CAR' },
1056
- {
1057
- prim: 'IF_LEFT',
1058
- args: [
1059
- [
1060
- { prim: 'DROP' },
1061
- {
1062
- prim: 'NONE',
1063
- args: [
1064
- {
1065
- prim: 'pair',
1066
- args: [
1067
- { prim: 'nat' },
1068
- {
1069
- prim: 'contract',
1070
- args: [
1071
- {
1072
- prim: 'pair',
1073
- args: [
1074
- { prim: 'address' },
1075
- { prim: 'pair', args: [{ prim: 'address' }, { prim: 'nat' }] },
1076
- ],
1077
- },
1078
- ],
1079
- },
1080
- ],
1081
- },
1082
- ],
1083
- },
1084
- ],
1085
- [{ prim: 'SOME' }],
1086
- ],
1087
- },
1088
- { prim: 'DIP', args: [[{ prim: 'PUSH', args: [{ prim: 'address' }, { string: contractAddress }] }]] },
1089
- {
1090
- prim: 'IF_NONE',
1091
- args: [
1092
- [{ prim: 'NIL', args: [{ prim: 'operation' }] }],
1093
- [
1094
- { prim: 'DIP', args: [[{ prim: 'DUP' }]] },
1095
- { prim: 'DUP' },
1096
- { prim: 'CAR' },
1097
- { prim: 'DIP', args: [[{ prim: 'CDR' }]] },
1098
- { prim: 'DIG', args: [{ int: '2' }] },
1099
- { prim: 'PAIR' },
1100
- { prim: 'SELF' },
1101
- { prim: 'ADDRESS' },
1102
- { prim: 'PAIR' },
1103
- { prim: 'DIP', args: [[{ prim: 'PUSH', args: [{ prim: 'mutez' }, { int: '0' }] }]] },
1104
- { prim: 'TRANSFER_TOKENS' },
1105
- { prim: 'DIP', args: [[{ prim: 'NIL', args: [{ prim: 'operation' }] }]] },
1106
- { prim: 'CONS' },
1107
- ],
1108
- ],
1109
- },
1110
- { prim: 'BALANCE' },
1111
- { prim: 'PUSH', args: [{ prim: 'mutez' }, { int: '0' }] },
1112
- { prim: 'COMPARE' },
1113
- { prim: 'EQ' },
1114
- {
1115
- prim: 'IF',
1116
- args: [
1117
- [{ prim: 'DIP', args: [[{ prim: 'DROP' }]] }],
1118
- [
1119
- {
1120
- prim: 'DIP',
1121
- args: [
1122
- [
1123
- { prim: 'CONTRACT', args: [{ prim: 'unit' }] },
1124
- {
1125
- prim: 'IF_NONE',
1126
- args: [
1127
- [
1128
- { prim: 'PUSH', args: [{ prim: 'string' }, { string: 'not a wallet' }] },
1129
- { prim: 'FAILWITH' },
1130
- ],
1131
- [],
1132
- ],
1133
- },
1134
- { prim: 'BALANCE' },
1135
- { prim: 'UNIT' },
1136
- { prim: 'TRANSFER_TOKENS' },
1137
- ],
1138
- ],
1139
- },
1140
- { prim: 'SWAP' },
1141
- { prim: 'CONS' },
1142
- ],
1143
- ],
1144
- },
1145
- { prim: 'DIP', args: [[{ prim: 'UNIT' }]] },
1146
- { prim: 'PAIR' },
1147
- ],
1148
- ],
1149
- },
1150
- ];
1151
- }
1152
- /**
1153
- * Create an origination operation for a forwarder contract
1154
- *
1155
- * @param {string} contractAddress originated multisig address to forward funds
1156
- * @param {string} counter Valid source account counter to use
1157
- * @param {string} source Source account address
1158
- * @param {string} fee Fees in mutez to pay by the source account
1159
- * @param {string} gasLimit Maximum amount in mutez to spend in gas fees
1160
- * @param {string} storageLimit Maximum amount in mutez to spend in storage fees
1161
- * @param {string} balance New multisig account initial balance taken from the source account
1162
- * @returns {OriginationOp} the operation
1163
- */
1164
- function forwarderOriginationOperation(contractAddress, counter, source, fee, gasLimit, storageLimit, balance) {
1165
- return {
1166
- kind: 'origination',
1167
- counter,
1168
- source,
1169
- fee,
1170
- gas_limit: gasLimit,
1171
- storage_limit: storageLimit,
1172
- balance,
1173
- script: {
1174
- code: createForwarder(contractAddress),
1175
- storage: { prim: 'Unit' },
1176
- },
1177
- };
1178
- }
1179
- exports.forwarderOriginationOperation = forwarderOriginationOperation;
1180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzaWdVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbXVsdGlzaWdVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMENBQTRCO0FBRTVCLG1DQUF1RztBQUV2RyxzQ0FBc0M7QUFDdEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQztBQUVwQjs7Ozs7R0FLRztBQUNILFNBQWdCLG9DQUFvQyxDQUFDLFNBQXdCO0lBQzNFLE1BQU0sR0FBRyxHQUFHO1FBQ1YsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHO1FBQ2xCLFFBQVEsRUFBRSxTQUFTLENBQUMsU0FBUztRQUM3QixZQUFZLEVBQUUsU0FBUyxDQUFDLGFBQWE7S0FDdEMsQ0FBQztJQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFO1FBQ3pCLHdCQUF3QjtRQUN4QixPQUFPO1lBQ0wsSUFBSSxFQUFFLE9BQU87WUFDYixJQUFJLEVBQUUsU0FBUyxDQUFDLE1BQU07WUFDdEIsRUFBRSxFQUFFLFNBQVMsQ0FBQyxXQUFXO1lBQ3pCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN4QixHQUFHO1NBQ0osQ0FBQztLQUNIO0lBQ0Qsa0ZBQWtGO0lBQ2xGLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENB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SUFBSSxFQUFFLE1BQU0sRUFBRTs2QkFDakI7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFO29CQUMzQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7aUJBQ2pCO2FBQ0Y7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQiw2QkFBNkIsQ0FDM0MsZUFBdUIsRUFDdkIsT0FBZSxFQUNmLE1BQWMsRUFDZCxHQUFXLEVBQ1gsUUFBZ0IsRUFDaEIsWUFBb0IsRUFDcEIsT0FBZTtJQUVmLE9BQU87UUFDTCxJQUFJLEVBQUUsYUFBYTtRQUNuQixPQUFPO1FBQ1AsTUFBTTtRQUNOLEdBQUc7UUFDSCxTQUFTLEVBQUUsUUFBUTtRQUNuQixhQUFhLEVBQUUsWUFBWTtRQUMzQixPQUFPO1FBQ1AsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLGVBQWUsQ0FBQyxlQUFlLENBQUM7WUFDdEMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtTQUMxQjtLQUNGLENBQUM7QUFDSixDQUFDO0FBdEJELHNFQXNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEluZGV4ZWRTaWduYXR1cmUsIE9yaWdpbmF0aW9uRGF0YSwgT3JpZ2luYXRpb25PcCwgUmV2ZWFsT3AsIFRyYW5zYWN0aW9uT3AsIFRyYW5zZmVyRGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgREVGQVVMVF9GRUUsIERFRkFVTFRfR0FTX0xJTUlULCBERUZBVUxUX1NUT1JBR0VfTElNSVQsIGhhc2hUeXBlcywgaXNWYWxpZEtleSB9IGZyb20gJy4vdXRpbHMnO1xuXG4vLyBEZWZhdWx0IG4gb2YgbSBmb3IgbXVsdGlzaWcgd2FsbGV0c1xuY29uc3QgREVGQVVMVF9OID0gMjtcbmNvbnN0IERFRkFVTFRfTSA9IDM7XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIHRyYW5zZmVyIGRldGFpbHMgZnJvbSBhIGdlbmVyaWMgbXVsdGlzaWcgdHJhbnNhY3Rpb24gb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25PcH0gb3BlcmF0aW9uIEEgdHJhbnNhY3Rpb24gb3BlcmF0aW9uIEpTT05cbiAqIEByZXR1cm5zIHtUcmFuc2ZlckRhdGF9IEluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXN0aW5hdGlvbiwgdG9rZW4gYW5kIHRyYW5zZmVyIGFtb3VudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TXVsdGlzaWdUcmFuc2ZlckRhdGFGcm9tT3BlcmF0aW9uKG9wZXJhdGlvbjogVHJhbnNhY3Rpb25PcCk6IFRyYW5zZmVyRGF0YSB7XG4gIGNvbnN0IGZlZSA9IHtcbiAgICBmZWU6IG9wZXJhdGlvbi5mZWUsXG4gICAgZ2FzTGltaXQ6IG9wZXJhdGlvbi5nYXNfbGltaXQsXG4gICAgc3RvcmFnZUxpbWl0OiBvcGVyYXRpb24uc3RvcmFnZV9saW1pdCxcbiAgfTtcblxuICBpZiAoIW9wZXJhdGlvbi5wYXJhbWV0ZXJzKSB7XG4gICAgLy8gU2luZ2xlc2lnIHRyYW5zYWN0aW9uXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvaW46ICdtdXRleicsXG4gICAgICBmcm9tOiBvcGVyYXRpb24uc291cmNlLFxuICAgICAgdG86IG9wZXJhdGlvbi5kZXN0aW5hdGlvbixcbiAgICAgIGFtb3VudDogb3BlcmF0aW9uLmFtb3VudCxcbiAgICAgIGZlZSxcbiAgICB9O1xuICB9XG4gIC8vIFRoZXNlIGZvbGxvdyB0aGUgc3RydWN0dXJlIGZyb20gdGhlIHJlc3BvbnNlIG9mIGdlbmVyaWNNdWx0aXNpZ1RyYW5zZmVyUGFyYW1zKClcbiAgY29uc3QgdHJhbnNmZXJBcmdzID0gb3BlcmF0aW9uLnBhcmFtZXRlcnMudmFsdWUuYXJnc1swXS5hcmdzWzFdLmFyZ3NbMF07XG4gIGNvbnN0IGFjY291bnRUeXBlID0gdHJhbnNmZXJBcmdzWzNdLnByaW07XG4gIGNvbnN0IGNvdW50ZXIgPSBvcGVyYXRpb24ucGFyYW1ldGVycy52YWx1ZS5hcmdzWzBdLmFyZ3NbMF0uaW50O1xuICAvLyBJbiBtdWx0aXNpZyB0cmFuc2FjdGlvbnMsIHRoZSB3YWxsZXQgY29udHJhY3QgaXMgdGhlIGRlc3RpbmF0aW9uXG4gIGNvbnN0IGZyb20gPSBvcGVyYXRpb24uZGVzdGluYXRpb247XG5cbiAgbGV0IGFjY291bnRUeXBlSW5kZXg7XG4gIHN3aXRjaCAoYWNjb3VudFR5cGUpIHtcbiAgICBjYXNlICdJTVBMSUNJVF9BQ0NPVU5UJzpcbiAgICAgIGFjY291bnRUeXBlSW5kZXggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQ09OVFJBQ1QnOlxuICAgICAgYWNjb3VudFR5cGVJbmRleCA9IDU7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRyYWN0IHBhcmFtZXRlcnMnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29pbjogdHJhbnNmZXJBcmdzW2FjY291bnRUeXBlSW5kZXhdLmFyZ3NbMF0ucHJpbSxcbiAgICBmcm9tLFxuICAgIHRvOiB0cmFuc2ZlckFyZ3NbMl0uYXJnc1sxXS5zdHJpbmcsXG4gICAgYW1vdW50OiB0cmFuc2ZlckFyZ3NbYWNjb3VudFR5cGVJbmRleF0uYXJnc1sxXS5pbnQsXG4gICAgZmVlLFxuICAgIGNvdW50ZXIsXG4gIH07XG59XG5cbi8qKlxuICogIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSB3YWxsZXQgb3IgYWRkcmVzcyBpbml0aWFsaXphdGlvbiB0eCBmcm9tIGFuIG9yaWdpbmF0aW9uIG9wZXJhdGlvblxuICpcbiAqIEBwYXJhbSB7T3JpZ2luYXRpb25PcH0gb3BlcmF0aW9uXG4gKiBAcmV0dXJucyB7T3JpZ2luYXRpb25EYXRhfSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgd2FsbGV0IGNvbnRyYWN0IGNyZWF0aW5nIGEgZm9yd2FyZGVyIGNvbnRyYWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcmlnaW5hdGlvbkRhdGFGcm9tT3BlcmF0aW9uKG9wZXJhdGlvbjogT3JpZ2luYXRpb25PcCk6IE9yaWdpbmF0aW9uRGF0YSB7XG4gIGNvbnN0IGZlZSA9IHtcbiAgICBmZWU6IG9wZXJhdGlvbi5mZWUsXG4gICAgZ2FzTGltaXQ6IG9wZXJhdGlvbi5nYXNfbGltaXQsXG4gICAgc3RvcmFnZUxpbWl0OiBvcGVyYXRpb24uc3RvcmFnZV9saW1pdCxcbiAgfTtcblxuICBjb25zdCB7IHNvdXJjZTogZnJvbSwgY291bnRlciwgYmFsYW5jZSB9ID0gb3BlcmF0aW9uO1xuXG4gIC8vIFRyYW5zYWN0aW9ucyBpbml0aWFsaXppbmcgYSBmb3J3YXJkZXIgY29udHJhY3QgY29udGFpbiB0aGUgYWRkcmVzcyBvZiB0aGUgd2FsbGV0IGNvbnRyYWN0XG4gIGNvbnN0IGZvcndhcmRlckRlc3RpbmF0aW9uOiBzdHJpbmcgPSBfLmdldChvcGVyYXRpb24sICdzY3JpcHQuY29kZVsyXS5hcmdzWzBdWzNdLmFyZ3NbMF1bMF0uYXJnc1sxXS5zdHJpbmcnKTtcblxuICByZXR1cm4ge1xuICAgIGZlZSxcbiAgICBjb3VudGVyLFxuICAgIGJhbGFuY2UsXG4gICAgZnJvbSxcbiAgICBmb3J3YXJkZXJEZXN0aW5hdGlvbixcbiAgfTtcbn1cbi8qKlxuICogSGVscGVyIG1ldGhvZCB0byBidWlsZCBhIHNpbmdsZXNpZyB0cmFuc2FjdGlvbiBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50ZXIgU291cmNlIGFjY291bnQgbmV4dCBjb3VudGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBhY2NvdW50IHRoYXQgd2lsbCBwYXkgZm9yIGZlZXMsIGFuZCBpbiBzaW5nbGVzaWcgdHJhbnNhY3Rpb25zLCB3aGVyZVxuICogICAgICAgIHRoZSBmdW5kcyBhcmUgdGFrZW4gZnJvbVxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCBUaGUgYW1vdW50IGluIG11dGV6IHRvIGJlIHRyYW5zZmVycmVkXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb24gVGhlIGFjY291bnQgYWRkcmVzcyB0byBzZW5kIHRoZSBmdW5kcyB0b1xuICogQHBhcmFtIHtzdHJpbmd9IGZlZSBGZWVzIGluIG11dGV6IHRvIHBheSBieSB0aGUgc291cmNlIGFjY291bnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBnYXNMaW1pdCBNYXhpbXVtIGFtb3VudCBpbiBtdXRleiB0byBzcGVuZCBpbiBnYXMgZmVlc1xuICogQHBhcmFtIHtzdHJpbmd9IHN0b3JhZ2VMaW1pdCBNYXhpbXVtIGFtb3VudCBpbiBtdXRleiB0byBzcGVuZCBpbiBzdG9yYWdlIGZlZXNcbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbk9wfUEgVGV6b3MgdHJhbnNhY3Rpb24gb3BlcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW5nbGVzaWdUcmFuc2FjdGlvbk9wZXJhdGlvbihcbiAgY291bnRlcjogc3RyaW5nLFxuICBzb3VyY2U6IHN0cmluZyxcbiAgYW1vdW50OiBzdHJpbmcsXG4gIGRlc3RpbmF0aW9uOiBzdHJpbmcsXG4gIGZlZTogc3RyaW5nID0gREVGQVVMVF9GRUUuVFJBTlNGRVIudG9TdHJpbmcoKSxcbiAgZ2FzTGltaXQ6IHN0cmluZyA9IERFRkFVTFRfR0FTX0xJTUlULlRSQU5TRkVSLnRvU3RyaW5nKCksXG4gIHN0b3JhZ2VMaW1pdDogc3RyaW5nID0gREVGQVVMVF9TVE9SQUdFX0xJTUlULlRSQU5TRkVSLnRvU3RyaW5nKClcbik6IFRyYW5zYWN0aW9uT3Age1xuICByZXR1cm4ge1xuICAgIGtpbmQ6ICd0cmFuc2FjdGlvbicsXG4gICAgc291cmNlLFxuICAgIGZlZSxcbiAgICBjb3VudGVyLFxuICAgIGdhc19saW1pdDogZ2FzTGltaXQsXG4gICAgc3RvcmFnZV9saW1pdDogc3RvcmFnZUxpbWl0LFxuICAgIGFtb3VudCxcbiAgICBkZXN0aW5hdGlvbixcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtdWx0aXNpZyB3YWxsZXQgdHJhbnNhY3Rpb24gb3BlcmF0aW9uLlxuICpcbiAqIEBzZWUge0BsaW5rIHRyYW5zYWN0aW9uT3BlcmF0aW9ufVxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50ZXIgU291cmNlIGFjY291bnQgbmV4dCBjb3VudGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBhY2NvdW50IHRoYXQgd2lsbCBwYXkgZm9yIGZlZXMsIGFuZCBpbiBzaW5nbGVzaWcgdHJhbnNhY3Rpb25zLCB3aGVyZVxuICogICAgICAgIHRoZSBmdW5kcyBhcmUgdGFrZW4gZnJvbVxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCBUaGUgYW1vdW50IGluIG11dGV6IHRvIGJlIHRyYW5zZmVycmVkXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udHJhY3RBZGRyZXNzIElmIGl0IGlzIGEgbXVsdGlzaWcgdHJhbnNmZXIsIHRoZSBzbWFydCBjb250cmFjdCBhZGRyZXNzIHdpdGggdGhlXG4gKiAgICAgICAgZnVuZHMgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyYWN0Q291bnRlciBJZiBpdCBpcyBhIG11bHRpc2lnIHRyYW5zZmVyLCB0aGUgc21hcnQgY29udHJhY3QgY291bnRlciB0byB1c2VcbiAqICAgICAgICBpbiB0aGUgbmV4dCB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uQWRkcmVzcyBBbiBpbXBsaWNpdCBvciBvcmlnaW5hdGVkIGFkZHJlc3MgdG8gdHJhbnNmZXIgZnVkbnMgdG9cbiAqIEBwYXJhbSB7c3RyaW5nW119IHNpZ25hdHVyZXMgc2lnbmF0dXJlcyBMaXN0IG9mIHNpZ25hdHVyZXMgYXV0aG9yaXppbmcgdGhlIGZ1bmRzIHRyYW5zZmVyIGZvcm1cbiAqICAgICAgICB0aGUgbXVsdGlzaWcgd2FsbGV0XG4gKiBAcGFyYW0ge3N0cmluZ30gZmVlIEZlZXMgaW4gbXV0ZXogdG8gcGF5IGJ5IHRoZSBzb3VyY2UgYWNjb3VudFxuICogQHBhcmFtIHtzdHJpbmd9IGdhc0xpbWl0IE1heGltdW0gYW1vdW50IGluIG11dGV6IHRvIHNwZW5kIGluIGdhcyBmZWVzXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RvcmFnZUxpbWl0IE1heGltdW0gYW1vdW50IGluIG11dGV6IHRvIHNwZW5kIGluIHN0b3JhZ2UgZmVlc1xuICogQHBhcmFtIHtudW1iZXJ9IG0gVGhlIG51bWJlciBvZiBzaWduZXJzIChvd25lcnMpIGZvciB0aGUgbXVsdGlzaWcgd2FsbGV0IGJlaW5nIHVzZWQuIERlZmF1bHQgaXMgM1xuICogQHJldHVybnMge1RyYW5zYWN0aW9uT3B9IEEgVGV6b3Mgb3BlcmF0aW9uIHdpdGggYSBnZW5lcmljIG11bHRpc2lnIHRyYW5zZmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXNpZ1RyYW5zYWN0aW9uT3BlcmF0aW9uKFxuICBjb3VudGVyOiBzdHJpbmcsXG4gIHNvdXJjZTogc3RyaW5nLFxuICBhbW91bnQ6IHN0cmluZyxcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGNvbnRyYWN0Q291bnRlcjogc3RyaW5nLFxuICBkZXN0aW5hdGlvbkFkZHJlc3M6IHN0cmluZyxcbiAgc2lnbmF0dXJlczogSW5kZXhlZFNpZ25hdHVyZVtdLFxuICBmZWU6IHN0cmluZyA9IERFRkFVTFRfRkVFLlRSQU5TRkVSLnRvU3RyaW5nKCksXG4gIGdhc0xpbWl0OiBzdHJpbmcgPSBERUZBVUxUX0dBU19MSU1JVC5UUkFOU0ZFUi50b1N0cmluZygpLFxuICBzdG9yYWdlTGltaXQ6IHN0cmluZyA9IERFRkFVTFRfU1RPUkFHRV9MSU1JVC5UUkFOU0ZFUi50b1N0cmluZygpLFxuICBtOiBudW1iZXIgPSBERUZBVUxUX01cbik6IFRyYW5zYWN0aW9uT3Age1xuICByZXR1cm4ge1xuICAgIGtpbmQ6ICd0cmFuc2FjdGlvbicsXG4gICAgc291cmNlLFxuICAgIGZlZSxcbiAgICBjb3VudGVyLFxuICAgIGdhc19saW1pdDogZ2FzTGltaXQsXG4gICAgc3RvcmFnZV9saW1pdDogc3RvcmFnZUxpbWl0LFxuICAgIGFtb3VudDogJzAnLCAvLyBEb24ndCB0cmFuc2ZlciBhbnkgZnVuZHMgZnJvbSBoZSBzb3VyY2UgYWNjb3VudCB0byB0aGUgY29udHJhY3QgaW4gbXVsdGlzaWcgdHhzXG4gICAgZGVzdGluYXRpb246IGNvbnRyYWN0QWRkcmVzcyxcbiAgICBwYXJhbWV0ZXJzOiBnZW5lcmljTXVsdGlzaWdUcmFuc2ZlclBhcmFtcyhkZXN0aW5hdGlvbkFkZHJlc3MsIGFtb3VudCwgY29udHJhY3RDb3VudGVyLCBzaWduYXR1cmVzLCBtKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gYnVpbGQgdGhlIHBhcmFtZXRlcnMgdG8gY2FsbCB0aGUgZ2VuZXJpYyBtdWx0aXNpZyBzbWFydCBjb250cmFjdCB3aXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvbkFkZHJlc3MgQW4gaW1wbGljaXQgb3Igb3JpZ2luYXRlZCBhZGRyZXNzXG4gKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IE51bWJlciBvZiBNdXRleiB0byBiZSB0cmFuc2ZlcnJlZFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyYWN0Q291bnRlciBNdWx0aXNpZyBjb250cmFjdCBjb3VudGVyIG51bWJlclxuICogQHBhcmFtIHtJbmRleGVkU2lnbmF0dXJlW119IHNpZ25hdHVyZXMgTGlzdCBvZiB0cmFuc2FjdGlvbnMgYW5kIHRoZWlyIG9yZGVyXG4gKiBAcGFyYW0ge251bWJlcn0gbSBUaGUgbXVsdGlzaWcgd2FsbGV0IHRvdGFsIG51bWJlciBvZiBzaWduZXJzIChvd25lcnMpXG4gKiBAcmV0dXJucyBUaGUgcGFyYW1ldGVycyBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZ2VuZXJpY011bHRpc2lnVHJhbnNmZXJQYXJhbXMoXG4gIGRlc3RpbmF0aW9uQWRkcmVzczogc3RyaW5nLFxuICBhbW91bnQ6IHN0cmluZyxcbiAgY29udHJhY3RDb3VudGVyOiBzdHJpbmcsXG4gIHNpZ25hdHVyZXM6IEluZGV4ZWRTaWduYXR1cmVbXSxcbiAgbTogbnVtYmVyXG4pIHtcbiAgY29uc3QgdHJhbnNhY3Rpb25TaWduYXR1cmVzOiBhbnlbXSA9IGJ1aWxkU2lnbmF0dXJlcyhzaWduYXR1cmVzKTtcbiAgcmV0dXJuIHtcbiAgICBlbnRyeXBvaW50OiAnbWFpbicsXG4gICAgdmFsdWU6IHtcbiAgICAgIHByaW06ICdQYWlyJyxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByaW06ICdQYWlyJyxcbiAgICAgICAgICBhcmdzOiBbeyBpbnQ6IGNvbnRyYWN0Q291bnRlciB9LCB7IHByaW06ICdMZWZ0JywgYXJnczogW3RyYW5zZmVyVG9BY2NvdW50KGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50KV0gfV0sXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zYWN0aW9uU2lnbmF0dXJlcyxcbiAgICAgIF0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIHRoZSBzaWduYXR1cmVzIGluIGEgbXVsdGlzaWcgdHJhbnNhY3Rpb24gb3BlcmF0aW9uIHdpdGggbmV3IG9uZXMuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbk9wfSB0cmFuc2FjdGlvbiBUcmFuc2FjdGlvbiB0byBtdXRhdGVcbiAqIEBwYXJhbSB7SW5kZXhlZFNpZ25hdHVyZVtdfSBzaWduYXR1cmVzIExpc3Qgb2YgdHJhbnNhY3Rpb25zIGFuZCB0aGVpciBvcmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTXVsdGlzaWdUcmFuc2ZlclNpZ25hdHVyZXModHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uT3AsIHNpZ25hdHVyZXM6IEluZGV4ZWRTaWduYXR1cmVbXSkge1xuICB0cmFuc2FjdGlvbi5wYXJhbWV0ZXJzLnZhbHVlLmFyZ3NbMV0gPSBidWlsZFNpZ25hdHVyZXMoc2lnbmF0dXJlcywgdHJhbnNhY3Rpb24ucGFyYW1ldGVycy52YWx1ZS5hcmdzWzFdKTtcbn1cblxuLyoqXG4gKiBHZSB0aGUgbGlzdCBpZiBtdWx0aXNpZyBzaWduYXR1cmVzIGlmIGFueSBpbiBhIGNvbnZlbmllbnQgZm9ybWF0LlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25PcH0gdHJhbnNhY3Rpb24gVGhlIHRyYW5zYWN0aW9uIHRvIHNlYXJjaCB0aGUgc2lnbmF0dXJlcyBpblxuICogQHJldHVybnMge0luZGV4ZWRTaWduYXR1cmVbXX0gQSBsaXN0IG9mIHNpZ25hdHVyZXMgYW5kIHRoZWlyIG9yZGVyIGluIHRlaCB0cmFuc2ZlciBzY3JpcHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE11bHRpc2lnVHJhbnNmZXJTaWduYXR1cmVzKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbk9wKTogSW5kZXhlZFNpZ25hdHVyZVtdIHtcbiAgY29uc3Qgc2lnbmF0dXJlczogSW5kZXhlZFNpZ25hdHVyZVtdID0gW107XG4gIGlmICghdHJhbnNhY3Rpb24ucGFyYW1ldGVycyAmJiAhdHJhbnNhY3Rpb24ucGFyYW1ldGVycy52YWx1ZSAmJiAhdHJhbnNhY3Rpb24ucGFyYW1ldGVycy52YWx1ZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCByYXdTaWduYXR1cmVzID0gdHJhbnNhY3Rpb24ucGFyYW1ldGVycy52YWx1ZS5hcmdzWzFdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd1NpZ25hdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmF3U2lnbmF0dXJlc1tpXS5wcmltID09PSAnU29tZScpIHtcbiAgICAgIHNpZ25hdHVyZXMucHVzaCh7XG4gICAgICAgIHNpZ25hdHVyZTogcmF3U2lnbmF0dXJlc1tpXS5hcmdzWzBdLnN0cmluZyxcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZ25hdHVyZXM7XG59XG5cbi8qKlxuICogQnVpbGQgYSBsaXN0IG9mIG9yZGVyZWQgc2lnbmF0dXJlcywgcHV0dGluZyBhIE5vbmUgcHJpbWl0aXZlIGZvciB0aGUgbWlzc2luZyBpbmRleGVzLlxuICpcbiAqIEBwYXJhbSB7SW5kZXhlZFNpZ25hdHVyZVtdfSBzaWduYXR1cmVzIExpc3Qgb2YgdHJhbnNhY3Rpb25zIGFuZCB0aGVpciBvcmRlclxuICogQHBhcmFtIHtudW1iZXJ9IG0gU2l6ZSBvZiB0aGUgc2lnbmF0dXJlIGxpc3RcbiAqIEBwYXJhbSB7YW55W119IGV4aXN0aW5nU2lnbmF0dXJlcyBMaXN0IG9mIGV4aXN0aW5nIHNpZ25hdHVyZXMgdG8gbWVyZ2Ugd2l0aCB0aGUgZ2VuZXJhdGVkIG9uZXNcbiAqIEByZXR1cm5zIHthbnlbXX0gTGlzdCBvZiBzaWduYXR1cmVzIGluIHRoZSByaWdodCBvcmRlclxuICovXG5mdW5jdGlvbiBidWlsZFNpZ25hdHVyZXMoc2lnbmF0dXJlczogSW5kZXhlZFNpZ25hdHVyZVtdLCBleGlzdGluZ1NpZ25hdHVyZXMgPSBbXSwgbTogbnVtYmVyID0gREVGQVVMVF9NKSB7XG4gIC8vIEluaXRpYWxpemUgdGhlIGFycmF5IHdpdGggdGhlIGV4aXN0aW5nIHNpZ25hdHVyZXMgYW5kL29yIGVtcHR5IG9iamVjdHNcbiAgY29uc3QgdHJhbnNhY3Rpb25TaWduYXR1cmVzOiBhbnlbXSA9IGV4aXN0aW5nU2lnbmF0dXJlcztcbiAgY29uc3Qgc2l6ZSA9IGV4aXN0aW5nU2lnbmF0dXJlcy5sZW5ndGg7XG4gIGlmIChzaXplID4gbSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVG9vIG1hbnkgc2lnbmF0dXJlcy4gRXhwZWN0ZWQgbGVzcyB0aGFuICcgKyBtICsgJyBnb3QgJyArIHNpemUpO1xuICB9XG4gIGZvciAobGV0IGkgPSBzaXplOyBpIDwgbTsgaSsrKSB7XG4gICAgdHJhbnNhY3Rpb25TaWduYXR1cmVzLnB1c2goeyBwcmltOiAnTm9uZScgfSk7XG4gIH1cbiAgLy8gUmVwbGFjZSB0aGUgZW1wdHkgc2lnbmF0dXJlcyBmb3IgdGhlIHJlYWwgb25lcyBiYXNlZCBvbiB0aGUgcmlnaHQgaW5kZXhcbiAgc2lnbmF0dXJlcy5mb3JFYWNoKChzKSA9PiB7XG4gICAgaWYgKHMuaW5kZXgpIHtcbiAgICAgIHRyYW5zYWN0aW9uU2lnbmF0dXJlc1tzLmluZGV4XSA9IHsgcHJpbTogJ1NvbWUnLCBhcmdzOiBbeyBzdHJpbmc6IHMuc2lnbmF0dXJlIH1dIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhbnNhY3Rpb25TaWduYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IFwibnVsbFwiIHNpZ25hdHVyZVxuICAgICAgICBpZiAodHJhbnNhY3Rpb25TaWduYXR1cmVzW2ldLnByaW0gPT09ICdOb25lJykge1xuICAgICAgICAgIHRyYW5zYWN0aW9uU2lnbmF0dXJlc1tpXSA9IHsgcHJpbTogJ1NvbWUnLCBhcmdzOiBbeyBzdHJpbmc6IHMuc2lnbmF0dXJlIH1dIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdHJhbnNhY3Rpb25TaWduYXR1cmVzO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBidWlsZCB0aGUgTWljaGVsc29uIHNjcmlwdCB0byBiZSBzaWduZWQgdG8gdHJhbnNmZXIgZnVuZHMgZnJvbSBhIG11bHRpc2lnXG4gKiB3YWxsZXQuXG4gKlxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyBUaGUgbXVsdGlzaWcgc21hcnQgY29udHJhY3QgYWRkcmVzc1xuICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uQWRkcmVzcyBUaGUgZGVzdGluYXRpb24gYWNjb3VudCBhZGRyZXNzIChpbXBsaWNpdCBvciBvcmlnaW5hdGVkKVxuICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudCBOdW1iZXIgb2YgbXV0ZXogdG8gdHJhbnNmZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250cmFjdENvdW50ZXIgV2FsbGV0IGNvdW50ZXIgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvblxuICogQHJldHVybnMgQSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBNaWNoZWxzb24gc2NyaXB0IHRvIHNpZ24gYW5kIGFwcHJvdmUgYSB0cmFuc2ZlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJpY011bHRpc2lnRGF0YVRvU2lnbihcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGRlc3RpbmF0aW9uQWRkcmVzczogc3RyaW5nLFxuICBhbW91bnQ6IHN0cmluZyxcbiAgY29udHJhY3RDb3VudGVyOiBzdHJpbmdcbikge1xuICBjb25zdCBkYXRhID0ge1xuICAgIHByaW06ICdQYWlyJyxcbiAgICBhcmdzOiBbXG4gICAgICB7IGludDogY29udHJhY3RDb3VudGVyIH0sXG4gICAgICB7XG4gICAgICAgIHByaW06ICdMZWZ0JyxcbiAgICAgICAgYXJnczogW3RyYW5zZmVyVG9BY2NvdW50KGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50KV0sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG4gIGNvbnN0IHR5cGUgPSB7XG4gICAgcHJpbTogJ3BhaXInLFxuICAgIGFyZ3M6IFtcbiAgICAgIHtcbiAgICAgICAgcHJpbTogJ25hdCcsXG4gICAgICAgIGFubm90czogWyclY291bnRlciddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcHJpbTogJ29yJyxcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW06ICdsYW1iZGEnLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICB7IHByaW06ICd1bml0JyB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ2xpc3QnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFt7IHByaW06ICdvcGVyYXRpb24nIH1dLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFubm90czogWyclb3BlcmF0aW9uJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmltOiAncGFpcicsXG4gICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAnbmF0JyxcbiAgICAgICAgICAgICAgICBhbm5vdHM6IFsnJXRocmVzaG9sZCddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ2xpc3QnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFt7IHByaW06ICdrZXknIH1dLFxuICAgICAgICAgICAgICAgIGFubm90czogWycla2V5cyddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFubm90czogWyclY2hhbmdlX2tleXMnXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBhbm5vdHM6IFsnOmFjdGlvbiddLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGFubm90czogWyc6cGF5bG9hZCddLFxuICB9O1xuICByZXR1cm4gYnVpbGRQYWlyKGRhdGEsIHR5cGUsIGNvbnRyYWN0QWRkcmVzcyk7XG59XG5cbi8qKlxuICogVXRpbCBmdW5jdGlvbiB0byBidWlsZCBhIE1pY2hlbHNvbiBQYWlyIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHBhcmFtIHR5cGVcbiAqIEBwYXJhbSBjb250cmFjdEFkZHJlc3NcbiAqL1xuZnVuY3Rpb24gYnVpbGRQYWlyKGRhdGE6IGFueSwgdHlwZTogYW55LCBjb250cmFjdEFkZHJlc3M6IGFueSkge1xuICByZXR1cm4ge1xuICAgIGRhdGE6IHtcbiAgICAgIHByaW06ICdQYWlyJyxcbiAgICAgIGFyZ3M6IFt7IHN0cmluZzogY29udHJhY3RBZGRyZXNzIH0sIGRhdGFdLFxuICAgIH0sXG4gICAgdHlwZToge1xuICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgYXJnczogW3sgcHJpbTogJ2FkZHJlc3MnIH0sIHR5cGVdLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGxhbWJkYSBmb3IgdGhlIG11bHRpc2lnIHRyYW5zYWN0aW9uIHRyYW5zZmVyIHRvIGFuIGltcGxpY2l0IG9yIG9yaWdpbmF0ZWQgYWNjb3VudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyBBY2NvdW50IGFkZHJlc3MgdG8gc2VuZCB0aGUgZnVuZHMgdG9cbiAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgVGhlIGFtb3VudCBpbiBtdXRleiB0byB0cmFuc2ZlclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly90ZXpvc3RhcXVpdG8uaW8vZG9jcy9tYWtpbmdfdHJhbnNmZXJzI3RyYW5zZmVyLTAwMDAwNS01MC1tdXRlei10b2tlbnMtZnJvbS1hLWt0MS1hZGRyZXNzLXRvLWEtdHoxLWFkZHJlc3N9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zZmVyVG9BY2NvdW50KGFkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmcpIHtcbiAgaWYgKGlzVmFsaWRLZXkoYWRkcmVzcywgaGFzaFR5cGVzLktUKSkge1xuICAgIHJldHVybiB0cmFuc2ZlclRvT3JpZ2luYXRlZEFjY291bnQoYWRkcmVzcywgYW1vdW50KTtcbiAgfVxuICAvLyBMYW1iZGEgdG8gdHJhbnNmZXIgdG8gYW4gaW1wbGljaXQgYWNjb3VudFxuICByZXR1cm4gW1xuICAgIHsgcHJpbTogJ0RST1AnIH0sXG4gICAgeyBwcmltOiAnTklMJywgYXJnczogW3sgcHJpbTogJ29wZXJhdGlvbicgfV0gfSxcbiAgICB7XG4gICAgICBwcmltOiAnUFVTSCcsXG4gICAgICBhcmdzOiBbeyBwcmltOiAna2V5X2hhc2gnIH0sIHsgc3RyaW5nOiBhZGRyZXNzIH1dLFxuICAgIH0sXG4gICAgeyBwcmltOiAnSU1QTElDSVRfQUNDT1VOVCcgfSxcbiAgICB7XG4gICAgICBwcmltOiAnUFVTSCcsXG4gICAgICBhcmdzOiBbeyBwcmltOiAnbXV0ZXonIH0sIHsgaW50OiBhbW91bnQgfV0sXG4gICAgfSxcbiAgICB7IHByaW06ICdVTklUJyB9LFxuICAgIHsgcHJpbTogJ1RSQU5TRkVSX1RPS0VOUycgfSxcbiAgICB7IHByaW06ICdDT05TJyB9LFxuICBdO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBsYW1iZGEgZm9yIHRoZSBtdWx0aXNpZyB0cmFuc2FjdGlvbiB0cmFuc2ZlciB0byBhbiBvcmlnaW5hdGVkIGFjY291bnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgT3JpZ2luYXRlZCBhY2NvdW50IGFkZHJlc3MgdG8gc2VuZCB0aGUgZnVuZHMgdG9cbiAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgVGhlIGFtb3VudCBpbiBtdXRleiB0byB0cmFuc2ZlclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly90ZXpvc3RhcXVpdG8uaW8vZG9jcy9tYWtpbmdfdHJhbnNmZXJzI3RyYW5zZmVyLTAwMDAwMDEtMS1tdXRlei10b2tlbnMtZnJvbS1hLWt0MS1hZGRyZXNzLXRvLWEta3QxLWFkZHJlc3N9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zZmVyVG9PcmlnaW5hdGVkQWNjb3VudChhZGRyZXNzOiBzdHJpbmcsIGFtb3VudDogc3RyaW5nKSB7XG4gIHJldHVybiBbXG4gICAgeyBwcmltOiAnRFJPUCcgfSxcbiAgICB7IHByaW06ICdOSUwnLCBhcmdzOiBbeyBwcmltOiAnb3BlcmF0aW9uJyB9XSB9LFxuICAgIHtcbiAgICAgIHByaW06ICdQVVNIJyxcbiAgICAgIGFyZ3M6IFt7IHByaW06ICdhZGRyZXNzJyB9LCB7IHN0cmluZzogYWRkcmVzcyB9XSxcbiAgICB9LFxuICAgIHsgcHJpbTogJ0NPTlRSQUNUJywgYXJnczogW3sgcHJpbTogJ3VuaXQnIH1dIH0sXG4gICAgW1xuICAgICAge1xuICAgICAgICBwcmltOiAnSUZfTk9ORScsXG4gICAgICAgIGFyZ3M6IFtbW3sgcHJpbTogJ1VOSVQnIH0sIHsgcHJpbTogJ0ZBSUxXSVRIJyB9XV0sIFtdXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICB7XG4gICAgICBwcmltOiAnUFVTSCcsXG4gICAgICBhcmdzOiBbeyBwcmltOiAnbXV0ZXonIH0sIHsgaW50OiBhbW91bnQgfV0sXG4gICAgfSxcbiAgICB7IHByaW06ICdVTklUJyB9LFxuICAgIHsgcHJpbTogJ1RSQU5TRkVSX1RPS0VOUycgfSxcbiAgICB7IHByaW06ICdDT05TJyB9LFxuICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHJldmVhbCBvcGVyYXRpb24gZm9yIGEgcHVibGljIGtleS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRlciBTb3VyY2UgYWNjb3VudCBuZXh0IGNvdW50ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgU291cmNlIGFjY291bnQgYWRkcmVzc1xuICogQHBhcmFtIHtzdHJpbmd9IHB1YktleSBUaGUgcHVibGljIGtleSB0byByZXZlYWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBmZWUgRmVlcyBpbiBtdXRleiB0byBwYXkgYnkgdGhlIHNvdXJjZSBhY2NvdW50XG4gKiBAcGFyYW0ge3N0cmluZ30gZ2FzTGltaXQgTWF4aW11bSBhbW91bnQgaW4gbXV0ZXogdG8gc3BlbmQgaW4gZ2FzIGZlZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdG9yYWdlTGltaXQgTWF4aW11bSBhbW91bnQgaW4gbXV0ZXogdG8gc3BlbmQgaW4gc3RvcmFnZSBmZWVzXG4gKiBAcmV0dXJucyBBbiBvcmlnaW5hdGlvbiBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldmVhbE9wZXJhdGlvbihcbiAgY291bnRlcjogc3RyaW5nLFxuICBzb3VyY2U6IHN0cmluZyxcbiAgcHViS2V5OiBzdHJpbmcsXG4gIGZlZTogc3RyaW5nID0gREVGQVVMVF9GRUUuUkVWRUFMLnRvU3RyaW5nKCksXG4gIGdhc0xpbWl0OiBzdHJpbmcgPSBERUZBVUxUX0dBU19MSU1JVC5SRVZFQUwudG9TdHJpbmcoKSxcbiAgc3RvcmFnZUxpbWl0OiBzdHJpbmcgPSBERUZBVUxUX1NUT1JBR0VfTElNSVQuUkVWRUFMLnRvU3RyaW5nKClcbik6IFJldmVhbE9wIHtcbiAgcmV0dXJuIHtcbiAgICBraW5kOiAncmV2ZWFsJyxcbiAgICBjb3VudGVyLFxuICAgIHNvdXJjZSxcbiAgICBmZWUsXG4gICAgZ2FzX2xpbWl0OiBnYXNMaW1pdCxcbiAgICBzdG9yYWdlX2xpbWl0OiBzdG9yYWdlTGltaXQsXG4gICAgcHVibGljX2tleTogcHViS2V5LFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBvcmlnaW5hdGlvbiBvcGVyYXRpb24gZm9yIHRoZSBnZW5lcmljIG11bHRpc2cgY29udHJhY3QuIEl0IGRvZXMgbm90IGNyZWF0ZSBhIHJldmVhbFxuICogb3BlcmF0aW9uIGZvciB0aGUgc291cmNlIGFjY291bnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50ZXIgVmFsaWQgc291cmNlIGFjY291bnQgY291bnRlciB0byB1c2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgU291cmNlIGFjY291bnQgYWRkcmVzc1xuICogQHBhcmFtIHtzdHJpbmd9IGZlZSBGZWVzIGluIG11dGV6IHRvIHBheSBieSB0aGUgc291cmNlIGFjY291bnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBnYXNMaW1pdCBNYXhpbXVtIGFtb3VudCBpbiBtdXRleiB0byBzcGVuZCBpbiBnYXMgZmVlc1xuICogQHBhcmFtIHtzdHJpbmd9IHN0b3JhZ2VMaW1pdCBNYXhpbXVtIGFtb3VudCBpbiBtdXRleiB0byBzcGVuZCBpbiBzdG9yYWdlIGZlZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYWxhbmNlIE5ldyBtdWx0aXNpZyBhY2NvdW50IGluaXRpYWwgYmFsYW5jZSB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgYWNjb3VudFxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHViS2V5cyBMaXN0IG9mIHB1YmxpYyBrZXlzIG9mIHRoZSBtdWx0aXNpZyBvd25lclxuICogQHBhcmFtIHtzdHJpbmd9IGRlbGVnYXRlIE9wdGlvbmFsIGltcGxpY2l0IGFkZHJlc3MgdG8gZGVsZWdhdGUgdGhlIHdhbGxldCBmdW5kcyB0b1xuICogQHBhcmFtIHtudW1iZXJ9IHRocmVzaG9sZCBNaW5pbXVtIG51bWJlciBvZiBzaWduYXR1cmVzIHJlcXVpcmVkIHRvIGF1dGhvcml6ZSBhIG11bHRpc2lnIG9wZXJhdGlvblxuICogQHJldHVybnMgQW4gb3JpZ2luYXRpb24gb3BlcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmljTXVsdGlzaWdPcmlnaW5hdGlvbk9wZXJhdGlvbihcbiAgY291bnRlcjogc3RyaW5nLFxuICBzb3VyY2U6IHN0cmluZyxcbiAgZmVlOiBzdHJpbmcsXG4gIGdhc0xpbWl0OiBzdHJpbmcsXG4gIHN0b3JhZ2VMaW1pdDogc3RyaW5nLFxuICBiYWxhbmNlOiBzdHJpbmcsXG4gIHB1YktleXM6IHN0cmluZ1tdLFxuICBkZWxlZ2F0ZT86IHN0cmluZyxcbiAgdGhyZXNob2xkOiBudW1iZXIgPSBERUZBVUxUX05cbik6IE9yaWdpbmF0aW9uT3Age1xuICBjb25zdCB3YWxsZXRQdWJsaWNLZXlzOiBhbnlbXSA9IFtdO1xuICBwdWJLZXlzLmZvckVhY2goKHBrKSA9PiB3YWxsZXRQdWJsaWNLZXlzLnB1c2goeyBzdHJpbmc6IHBrIH0pKTtcbiAgY29uc3Qgb3JpZ2luYXRpb25PcDogT3JpZ2luYXRpb25PcCA9IHtcbiAgICBraW5kOiAnb3JpZ2luYXRpb24nLFxuICAgIGNvdW50ZXIsXG4gICAgc291cmNlLFxuICAgIGZlZSxcbiAgICBnYXNfbGltaXQ6IGdhc0xpbWl0LFxuICAgIHN0b3JhZ2VfbGltaXQ6IHN0b3JhZ2VMaW1pdCxcbiAgICBiYWxhbmNlLFxuICAgIHNjcmlwdDoge1xuICAgICAgY29kZTogZ2VuZXJpY011bHRpc2lnLFxuICAgICAgc3RvcmFnZToge1xuICAgICAgICBwcmltOiAnUGFpcicsXG4gICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpbnQ6ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW06ICdQYWlyJyxcbiAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGludDogdGhyZXNob2xkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdhbGxldFB1YmxpY0tleXMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGlmIChkZWxlZ2F0ZSkge1xuICAgIG9yaWdpbmF0aW9uT3AuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgfVxuICByZXR1cm4gb3JpZ2luYXRpb25PcDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHB1YmxpYyBrZXkgb2YgZWFjaCBvd25lciBvZiBhbiBtdWx0aXNpZyB3YWxsZXQgb3JpZ2luYXRpb24gY29udHJhY3QuXG4gKlxuICogQHBhcmFtIHtPcmlnaW5hdGlvbk9wfSBvcGVyYXRpb24gQW4gb3BlcmF0aW9uIHdpdGggdGhlIGdlbmVyaWMgbXVsdGlzaWcgd2FsbGV0IG9yaWdpbmF0aW9uXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IExpc3Qgb2YgYWxsIHRoZSBvd25lcnMgc2V0IGluIHRoZSBvcmlnaW5hdGlvbiB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3duZXJzUHVibGljS2V5cyhvcGVyYXRpb246IE9yaWdpbmF0aW9uT3ApOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG93bmVyc0FyZ3MgPSBfLmdldChvcGVyYXRpb24sICdzY3JpcHQuc3RvcmFnZS5hcmdzWzFdLmFyZ3NbMV0nKTtcbiAgaWYgKCFvd25lcnNBcmdzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBvd25lcnNBcmdzLm1hcCgobykgPT4gby5zdHJpbmcpO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgTXVsdGlzaWcgY29udHJhY3QgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbXVyYmFyZC9zbWFydC1jb250cmFjdHMvYmxvYi9tYXN0ZXIvbXVsdGlzaWcvbWljaGVsc29uL2dlbmVyaWMudHpcbiAqL1xuY29uc3QgZ2VuZXJpY011bHRpc2lnID0gW1xuICB7XG4gICAgcHJpbTogJ3BhcmFtZXRlcicsXG4gICAgYXJnczogW1xuICAgICAge1xuICAgICAgICBwcmltOiAnb3InLFxuICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgeyBwcmltOiAndW5pdCcsIGFubm90czogWyclZGVmYXVsdCddIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbTogJ25hdCcsXG4gICAgICAgICAgICAgICAgICAgIGFubm90czogWyclY291bnRlciddLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbTogJ29yJyxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdsYW1iZGEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICd1bml0JyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ2xpc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ29wZXJhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RzOiBbJyVvcGVyYXRpb24nXSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdwYWlyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICduYXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90czogWycldGhyZXNob2xkJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnbGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW3sgcHJpbTogJ2tleScgfV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RzOiBbJyVrZXlzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RzOiBbJyVjaGFuZ2Vfa2V5cyddLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGFubm90czogWyc6YWN0aW9uJ10sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgYW5ub3RzOiBbJzpwYXlsb2FkJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAnbGlzdCcsXG4gICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcmltOiAnb3B0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW3sgcHJpbTogJ3NpZ25hdHVyZScgfV0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgYW5ub3RzOiBbJyVzaWdzJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgYW5ub3RzOiBbJyVtYWluJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIHByaW06ICdzdG9yYWdlJyxcbiAgICBhcmdzOiBbXG4gICAgICB7XG4gICAgICAgIHByaW06ICdwYWlyJyxcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW06ICduYXQnLFxuICAgICAgICAgICAgYW5ub3RzOiBbJyVzdG9yZWRfY291bnRlciddLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ25hdCcsXG4gICAgICAgICAgICAgICAgYW5ub3RzOiBbJyV0aHJlc2hvbGQnXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdsaXN0JyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbeyBwcmltOiAna2V5JyB9XSxcbiAgICAgICAgICAgICAgICBhbm5vdHM6IFsnJWtleXMnXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIHByaW06ICdjb2RlJyxcbiAgICBhcmdzOiBbXG4gICAgICBbXG4gICAgICAgIFtcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IHByaW06ICdEVVAnIH0sXG4gICAgICAgICAgICB7IHByaW06ICdDQVInIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICBhcmdzOiBbW3sgcHJpbTogJ0NEUicgfV1dLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICBdLFxuICAgICAgICB7XG4gICAgICAgICAgcHJpbTogJ0lGX0xFRlQnLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgeyBwcmltOiAnRFJPUCcgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdOSUwnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFt7IHByaW06ICdvcGVyYXRpb24nIH1dLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IHByaW06ICdQQUlSJyB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdQVVNIJyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbeyBwcmltOiAnbXV0ZXonIH0sIHsgaW50OiAnMCcgfV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcHJpbTogJ0FNT1VOVCcgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFt7IHByaW06ICdDT01QQVJFJyB9LCB7IHByaW06ICdFUScgfV0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcHJpbTogJ0lGJyxcbiAgICAgICAgICAgICAgICAgIGFyZ3M6IFtbXSwgW1t7IHByaW06ICdVTklUJyB9LCB7IHByaW06ICdGQUlMV0lUSCcgfV1dXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB7IHByaW06ICdTV0FQJyB9LFxuICAgICAgICAgICAgICB7IHByaW06ICdEVVAnIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbW3sgcHJpbTogJ1NXQVAnIH1dXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ0RVUCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ0NBUicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtbeyBwcmltOiAnQ0RSJyB9XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ0RVUCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnU0VMRicgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnQUREUkVTUycgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnUEFJUicgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnUEFDSycgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ0RVUCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0NBUicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90czogWydAY291bnRlciddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdDRFInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1t7IHByaW06ICdTV0FQJyB9XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ1NXQVAnIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICB7IHByaW06ICdEVVAnIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHByaW06ICdDQVInLFxuICAgICAgICAgICAgICAgICAgICBhbm5vdHM6IFsnQHN0b3JlZF9jb3VudGVyJ10sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW1t7IHByaW06ICdDRFInIH1dXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFtbeyBwcmltOiAnU1dBUCcgfV1dLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW3sgcHJpbTogJ0NPTVBBUkUnIH0sIHsgcHJpbTogJ0VRJyB9XSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBwcmltOiAnSUYnLFxuICAgICAgICAgICAgICAgICAgYXJnczogW1tdLCBbW3sgcHJpbTogJ1VOSVQnIH0sIHsgcHJpbTogJ0ZBSUxXSVRIJyB9XV1dLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbW3sgcHJpbTogJ1NXQVAnIH1dXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ0RVUCcgfSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0NBUicsXG4gICAgICAgICAgICAgICAgICAgIGFubm90czogWydAdGhyZXNob2xkJ10sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0NEUicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90czogWydAa2V5cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ1BVU0gnLFxuICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFt7IHByaW06ICduYXQnIH0sIHsgaW50OiAnMCcgfV0sXG4gICAgICAgICAgICAgICAgICAgICAgYW5ub3RzOiBbJ0B2YWxpZCddLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdTV0FQJyB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0lURVInLFxuICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtbeyBwcmltOiAnU1dBUCcgfV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdTV0FQJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0lGX0NPTlMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdJRl9OT05FJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdTV0FQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdEUk9QJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ1NXQVAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnU1dBUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RVUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnU1dBUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRFVQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdESUcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OiAnMycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0NIRUNLX1NJR05BVFVSRScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnU1dBUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnSUYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRFJPUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRkFJTFdJVEgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdQVVNIJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICduYXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OiAnMScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0FERCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdHM6IFsnQHZhbGlkJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnVU5JVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRkFJTFdJVEgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ1NXQVAnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbeyBwcmltOiAnQ09NUEFSRScgfSwgeyBwcmltOiAnTEUnIH1dLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHByaW06ICdJRicsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbW10sIFtbeyBwcmltOiAnVU5JVCcgfSwgeyBwcmltOiAnRkFJTFdJVEgnIH1dXV0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdJRl9DT05TJyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbW1t7IHByaW06ICdVTklUJyB9LCB7IHByaW06ICdGQUlMV0lUSCcgfV1dLCBbXV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcHJpbTogJ0RST1AnIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdEVVAnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdDQVInIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbW3sgcHJpbTogJ0NEUicgfV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ1BVU0gnLFxuICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFt7IHByaW06ICduYXQnIH0sIHsgaW50OiAnMScgfV0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnQUREJyxcbiAgICAgICAgICAgICAgICAgICAgICBhbm5vdHM6IFsnQG5ld19jb3VudGVyJ10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ1BBSVInIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAnSUZfTEVGVCcsXG4gICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgW3sgcHJpbTogJ1VOSVQnIH0sIHsgcHJpbTogJ0VYRUMnIH1dLFxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgICAgICAgYXJnczogW1t7IHByaW06ICdDQVInIH1dXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnU1dBUCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnUEFJUicgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdOSUwnLFxuICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFt7IHByaW06ICdvcGVyYXRpb24nIH1dLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IHByaW06ICdQQUlSJyB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdLFxuICB9LFxuXTtcblxuLyoqXG4gKiBBZGQgY29udHJhY3QgYWRkcmVzcyB0byBmb3J3YXJkZXIgY29udHJhY3QgdGVtcGxhdGUgYW5kIHJldHVybiBjb250cmFjdCBNaWNoZWxzb24gY29kZSBhcyBKU09OXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyYWN0QWRkcmVzcyAtIG11bHRpc2lnIGNvbnRyYWN0QWRkcmVzcyB0aGF0IHdpbGwgcmVjZWl2ZSBmb3J3YXJkZWQgZnVuZHNcbiAqIEByZXR1cm5zIHtvYmplY3RbXX0gTWljaGVsc29uIGNvZGUgZm9yIHRoZSBvcmlnaW5hdGlvbiBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRm9yd2FyZGVyKGNvbnRyYWN0QWRkcmVzczogc3RyaW5nKSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgcHJpbTogJ3BhcmFtZXRlcicsXG4gICAgICBhcmdzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcmltOiAnb3InLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIHsgcHJpbTogJ3VuaXQnLCBhbm5vdHM6IFsnJWRlZmF1bHQnXSB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwcmltOiAncGFpcicsXG4gICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICB7IHByaW06ICduYXQnIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcHJpbTogJ2NvbnRyYWN0JyxcbiAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdwYWlyJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdhZGRyZXNzJywgYW5ub3RzOiBbJzpmcm9tJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnYWRkcmVzcycsIGFubm90czogWyc6dG8nXSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ25hdCcsIGFubm90czogWyc6dmFsdWUnXSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBhbm5vdHM6IFsnJWZsdXNoJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgeyBwcmltOiAnc3RvcmFnZScsIGFyZ3M6IFt7IHByaW06ICd1bml0JyB9XSB9LFxuICAgIHtcbiAgICAgIHByaW06ICdjb2RlJyxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW06ICdDQVNUJyxcbiAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdwYWlyJyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHByaW06ICdvcicsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICd1bml0JyB9LFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdwYWlyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnbmF0JyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ2NvbnRyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdwYWlyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ2FkZHJlc3MnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAncGFpcicsIGFyZ3M6IFt7IHByaW06ICdhZGRyZXNzJyB9LCB7IHByaW06ICduYXQnIH1dIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgeyBwcmltOiAndW5pdCcgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgcHJpbTogJ0NBUicgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmltOiAnSUZfTEVGVCcsXG4gICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7IHByaW06ICdEUk9QJyB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHByaW06ICdOT05FJyxcbiAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdwYWlyJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICduYXQnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdjb250cmFjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAncGFpcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ2FkZHJlc3MnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ3BhaXInLCBhcmdzOiBbeyBwcmltOiAnYWRkcmVzcycgfSwgeyBwcmltOiAnbmF0JyB9XSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBbeyBwcmltOiAnU09NRScgfV0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBwcmltOiAnRElQJywgYXJnczogW1t7IHByaW06ICdQVVNIJywgYXJnczogW3sgcHJpbTogJ2FkZHJlc3MnIH0sIHsgc3RyaW5nOiBjb250cmFjdEFkZHJlc3MgfV0gfV1dIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpbTogJ0lGX05PTkUnLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICBbeyBwcmltOiAnTklMJywgYXJnczogW3sgcHJpbTogJ29wZXJhdGlvbicgfV0gfV0sXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7IHByaW06ICdESVAnLCBhcmdzOiBbW3sgcHJpbTogJ0RVUCcgfV1dIH0sXG4gICAgICAgICAgICAgICAgeyBwcmltOiAnRFVQJyB9LFxuICAgICAgICAgICAgICAgIHsgcHJpbTogJ0NBUicgfSxcbiAgICAgICAgICAgICAgICB7IHByaW06ICdESVAnLCBhcmdzOiBbW3sgcHJpbTogJ0NEUicgfV1dIH0sXG4gICAgICAgICAgICAgICAgeyBwcmltOiAnRElHJywgYXJnczogW3sgaW50OiAnMicgfV0gfSxcbiAgICAgICAgICAgICAgICB7IHByaW06ICdQQUlSJyB9LFxuICAgICAgICAgICAgICAgIHsgcHJpbTogJ1NFTEYnIH0sXG4gICAgICAgICAgICAgICAgeyBwcmltOiAnQUREUkVTUycgfSxcbiAgICAgICAgICAgICAgICB7IHByaW06ICdQQUlSJyB9LFxuICAgICAgICAgICAgICAgIHsgcHJpbTogJ0RJUCcsIGFyZ3M6IFtbeyBwcmltOiAnUFVTSCcsIGFyZ3M6IFt7IHByaW06ICdtdXRleicgfSwgeyBpbnQ6ICcwJyB9XSB9XV0gfSxcbiAgICAgICAgICAgICAgICB7IHByaW06ICdUUkFOU0ZFUl9UT0tFTlMnIH0sXG4gICAgICAgICAgICAgICAgeyBwcmltOiAnRElQJywgYXJnczogW1t7IHByaW06ICdOSUwnLCBhcmdzOiBbeyBwcmltOiAnb3BlcmF0aW9uJyB9XSB9XV0gfSxcbiAgICAgICAgICAgICAgICB7IHByaW06ICdDT05TJyB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgcHJpbTogJ0JBTEFOQ0UnIH0sXG4gICAgICAgICAgeyBwcmltOiAnUFVTSCcsIGFyZ3M6IFt7IHByaW06ICdtdXRleicgfSwgeyBpbnQ6ICcwJyB9XSB9LFxuICAgICAgICAgIHsgcHJpbTogJ0NPTVBBUkUnIH0sXG4gICAgICAgICAgeyBwcmltOiAnRVEnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpbTogJ0lGJyxcbiAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgW3sgcHJpbTogJ0RJUCcsIGFyZ3M6IFtbeyBwcmltOiAnRFJPUCcgfV1dIH1dLFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdDT05UUkFDVCcsIGFyZ3M6IFt7IHByaW06ICd1bml0JyB9XSB9LFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdJRl9OT05FJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ1BVU0gnLCBhcmdzOiBbeyBwcmltOiAnc3RyaW5nJyB9LCB7IHN0cmluZzogJ25vdCBhIHdhbGxldCcgfV0gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdGQUlMV0lUSCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnQkFMQU5DRScgfSxcbiAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdVTklUJyB9LFxuICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ1RSQU5TRkVSX1RPS0VOUycgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IHByaW06ICdTV0FQJyB9LFxuICAgICAgICAgICAgICAgIHsgcHJpbTogJ0NPTlMnIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBwcmltOiAnRElQJywgYXJnczogW1t7IHByaW06ICdVTklUJyB9XV0gfSxcbiAgICAgICAgICB7IHByaW06ICdQQUlSJyB9LFxuICAgICAgICBdLFxuICAgICAgXSxcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBvcmlnaW5hdGlvbiBvcGVyYXRpb24gZm9yIGEgZm9yd2FyZGVyIGNvbnRyYWN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyYWN0QWRkcmVzcyBvcmlnaW5hdGVkIG11bHRpc2lnIGFkZHJlc3MgdG8gZm9yd2FyZCBmdW5kc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50ZXIgVmFsaWQgc291cmNlIGFjY291bnQgY291bnRlciB0byB1c2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgU291cmNlIGFjY291bnQgYWRkcmVzc1xuICogQHBhcmFtIHtzdHJpbmd9IGZlZSBGZWVzIGluIG11dGV6IHRvIHBheSBieSB0aGUgc291cmNlIGFjY291bnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBnYXNMaW1pdCBNYXhpbXVtIGFtb3VudCBpbiBtdXRleiB0byBzcGVuZCBpbiBnYXMgZmVlc1xuICogQHBhcmFtIHtzdHJpbmd9IHN0b3JhZ2VMaW1pdCBNYXhpbXVtIGFtb3VudCBpbiBtdXRleiB0byBzcGVuZCBpbiBzdG9yYWdlIGZlZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYWxhbmNlIE5ldyBtdWx0aXNpZyBhY2NvdW50IGluaXRpYWwgYmFsYW5jZSB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgYWNjb3VudFxuICogQHJldHVybnMge09yaWdpbmF0aW9uT3B9IHRoZSBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmRlck9yaWdpbmF0aW9uT3BlcmF0aW9uKFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgY291bnRlcjogc3RyaW5nLFxuICBzb3VyY2U6IHN0cmluZyxcbiAgZmVlOiBzdHJpbmcsXG4gIGdhc0xpbWl0OiBzdHJpbmcsXG4gIHN0b3JhZ2VMaW1pdDogc3RyaW5nLFxuICBiYWxhbmNlOiBzdHJpbmdcbik6IE9yaWdpbmF0aW9uT3Age1xuICByZXR1cm4ge1xuICAgIGtpbmQ6ICdvcmlnaW5hdGlvbicsXG4gICAgY291bnRlcixcbiAgICBzb3VyY2UsXG4gICAgZmVlLFxuICAgIGdhc19saW1pdDogZ2FzTGltaXQsXG4gICAgc3RvcmFnZV9saW1pdDogc3RvcmFnZUxpbWl0LFxuICAgIGJhbGFuY2UsXG4gICAgc2NyaXB0OiB7XG4gICAgICBjb2RlOiBjcmVhdGVGb3J3YXJkZXIoY29udHJhY3RBZGRyZXNzKSxcbiAgICAgIHN0b3JhZ2U6IHsgcHJpbTogJ1VuaXQnIH0sXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==