@bitgo-beta/sdk-coin-vet 1.0.1-beta.396 → 1.0.1-beta.398

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.
@@ -1,50 +1,7 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
39
3
  exports.VetToken = void 0;
40
- const assert_1 = __importDefault(require("assert"));
41
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
42
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
43
4
  const statics_1 = require("@bitgo-beta/statics");
44
- const mpc = __importStar(require("@bitgo-beta/sdk-lib-mpc"));
45
- const abstract_eth_1 = require("@bitgo-beta/abstract-eth");
46
- const lib_1 = require("./lib");
47
- const constants_1 = require("./lib/constants");
48
5
  const vet_1 = require("./vet");
49
6
  class VetToken extends vet_1.Vet {
50
7
  constructor(bitgo, tokenConfig) {
@@ -90,129 +47,6 @@ class VetToken extends vet_1.Vet {
90
47
  getBaseFactor() {
91
48
  return Math.pow(10, this.tokenConfig.decimalPlaces);
92
49
  }
93
- async recover(params) {
94
- try {
95
- if (!params.recoveryDestination || !this.isValidAddress(params.recoveryDestination)) {
96
- throw new Error('invalid recoveryDestination');
97
- }
98
- if (!params.tokenContractAddress || !this.isValidAddress(params.tokenContractAddress)) {
99
- throw new Error('invalid tokenContractAddress');
100
- }
101
- const isUnsignedSweep = !params.userKey && !params.backupKey && !params.walletPassphrase;
102
- let publicKey;
103
- let userKeyShare, backupKeyShare, commonKeyChain;
104
- const MPC = new sdk_core_1.Ecdsa();
105
- if (isUnsignedSweep) {
106
- const bitgoKey = params.bitgoKey;
107
- if (!bitgoKey) {
108
- throw new Error('missing bitgoKey');
109
- }
110
- const hdTree = new mpc.Secp256k1Bip32HdTree();
111
- const derivationPath = 'm/0';
112
- const derivedPub = hdTree.publicDerive({
113
- pk: mpc.bigIntFromBufferBE(Buffer.from(bitgoKey.slice(0, 66), 'hex')),
114
- chaincode: mpc.bigIntFromBufferBE(Buffer.from(bitgoKey.slice(66), 'hex')),
115
- }, derivationPath);
116
- publicKey = mpc.bigIntToBufferBE(derivedPub.pk).toString('hex');
117
- }
118
- else {
119
- if (!params.userKey) {
120
- throw new Error('missing userKey');
121
- }
122
- if (!params.backupKey) {
123
- throw new Error('missing backupKey');
124
- }
125
- if (!params.walletPassphrase) {
126
- throw new Error('missing wallet passphrase');
127
- }
128
- const userKey = params.userKey.replace(/\s/g, '');
129
- const backupKey = params.backupKey.replace(/\s/g, '');
130
- ({ userKeyShare, backupKeyShare, commonKeyChain } = await sdk_core_1.ECDSAUtils.getMpcV2RecoveryKeyShares(userKey, backupKey, params.walletPassphrase));
131
- publicKey = MPC.deriveUnhardened(commonKeyChain, 'm/0').slice(0, 66);
132
- }
133
- if (!publicKey) {
134
- throw new Error('failed to derive public key');
135
- }
136
- const backupKeyPair = new abstract_eth_1.KeyPair({ pub: publicKey });
137
- const baseAddress = backupKeyPair.getAddress();
138
- const tx = await this.buildRecoveryTransaction({
139
- baseAddress,
140
- params,
141
- });
142
- const signableHex = await tx.signablePayload;
143
- const serializedTxHex = await tx.toBroadcastFormat();
144
- if (isUnsignedSweep) {
145
- return {
146
- txHex: serializedTxHex,
147
- coin: this.getChain(),
148
- };
149
- }
150
- const signableMessage = this.getHashFunction().update(signableHex).digest();
151
- const signatureObj = await sdk_core_1.ECDSAUtils.signRecoveryMpcV2(signableMessage, userKeyShare, backupKeyShare, commonKeyChain);
152
- const signature = Buffer.from(signatureObj.r + signatureObj.s + (signatureObj.recid === 0 ? '00' : '01'), 'hex');
153
- const tokenTransaction = new lib_1.TokenTransaction(statics_1.coins.get(this.getChain()));
154
- const txBuilder = this.getTxBuilderFactory().getTokenTransactionBuilder(tokenTransaction);
155
- await txBuilder.from(serializedTxHex);
156
- txBuilder.isRecovery(true);
157
- await txBuilder.addSenderSignature(signature);
158
- const signedTx = await txBuilder.build();
159
- return {
160
- id: signedTx.id,
161
- tx: signedTx.toBroadcastFormat(),
162
- };
163
- }
164
- catch (error) {
165
- throw new Error(`Error during Vechain token recovery: ${error.message || error}`);
166
- }
167
- }
168
- async buildRecoveryTransaction(buildParams) {
169
- const { baseAddress, params } = buildParams;
170
- const tokenContractAddress = params.tokenContractAddress;
171
- (0, assert_1.default)(tokenContractAddress, 'tokenContractAddress is required for token recovery');
172
- const balance = await this.getBalance(baseAddress, tokenContractAddress);
173
- //replace with get balance function
174
- if (balance.isLessThanOrEqualTo(0)) {
175
- throw new Error(`no token balance to recover for address ${baseAddress} contract address ${tokenContractAddress}`);
176
- }
177
- // create the recipients here so that we can build the clauses for gas estimation
178
- const roughFeeEstimate = this.calculateFee(constants_1.feeEstimateData, new bignumber_js_1.default(51390));
179
- let recipients = [
180
- {
181
- address: params.recoveryDestination,
182
- amount: balance.minus(roughFeeEstimate).toString(),
183
- },
184
- ];
185
- const blockRef = await this.getBlockRef();
186
- const tokenTransaction = new lib_1.TokenTransaction(statics_1.coins.get(this.getChain()));
187
- const txBuilder = this.getTxBuilderFactory().getTokenTransactionBuilder(tokenTransaction);
188
- txBuilder.tokenAddress(tokenContractAddress);
189
- txBuilder.chainTag(this.bitgo.getEnv() === 'prod' ? 0x4a : 0x27);
190
- txBuilder.recipients(recipients);
191
- txBuilder.sender(baseAddress);
192
- txBuilder.addFeePayerAddress(baseAddress);
193
- txBuilder.gas(Number(constants_1.AVG_GAS_UNITS));
194
- txBuilder.blockRef(blockRef);
195
- txBuilder.expiration(constants_1.EXPIRATION);
196
- txBuilder.gasPriceCoef(Number(constants_1.GAS_PRICE_COEF));
197
- txBuilder.nonce(this.getRandomNonce());
198
- txBuilder.isRecovery(true);
199
- let tx = (await txBuilder.build());
200
- const clauses = tx.clauses;
201
- const actualGasUnits = await this.estimateGas(clauses, baseAddress);
202
- await this.ensureVthoBalanceForFee(baseAddress, actualGasUnits);
203
- const requiredFee = this.calculateFee(constants_1.feeEstimateData, actualGasUnits);
204
- // create the final recipients with the fee deducted
205
- recipients = [
206
- {
207
- address: params.recoveryDestination,
208
- amount: balance.minus(requiredFee).toString(),
209
- },
210
- ];
211
- txBuilder.recipients(recipients);
212
- txBuilder.gas(actualGasUnits.toNumber());
213
- tx = (await txBuilder.build());
214
- return tx;
215
- }
216
50
  }
217
51
  exports.VetToken = VetToken;
218
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmV0VG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmV0VG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLGdFQUFxQztBQUNyQyxtREFBMkc7QUFDM0csaURBQW9FO0FBQ3BFLDZEQUErQztBQUMvQywyREFBaUU7QUFFakUsK0JBQXNEO0FBQ3RELCtDQUE2RjtBQUM3RiwrQkFBNEI7QUFFNUIsTUFBYSxRQUFTLFNBQVEsU0FBRztJQUcvQixZQUFZLEtBQWdCLEVBQUUsV0FBMkI7UUFDdkQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0YsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQXNCO1FBQ2xELE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUI7UUFDNUIsTUFBTSxXQUFXLEdBQTJCLEVBQUUsQ0FBQztRQUMvQyxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDakYsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMs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QUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUN2QyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNCLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7UUFFbEQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztRQUUzQixNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXBFLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUVoRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLDJCQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFdkUsb0RBQW9EO1FBQ3BELFVBQVUsR0FBRztZQUNYO2dCQUNFLE9BQU8sRUFBRSxNQUFNLENBQUMsbUJBQW1CO2dCQUNuQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUU7YUFDOUM7U0FDRixDQUFDO1FBRUYsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1FBRTlDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztDQUNGO0FBdE9ELDRCQXNPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IEJpdEdvQmFzZSwgQ29pbkNvbnN0cnVjdG9yLCBFY2RzYSwgRUNEU0FVdGlscywgTmFtZWRDb2luQ29uc3RydWN0b3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBWZXRUb2tlbkNvbmZpZywgY29pbnMsIHRva2VucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0ICogYXMgbXBjIGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7IEtleVBhaXIgYXMgRXRoS2V5UGFpciB9IGZyb20gJ0BiaXRnby1iZXRhL2Fic3RyYWN0LWV0aCc7XG5pbXBvcnQgeyBSZWNvdmVyT3B0aW9ucywgUmVjb3ZlcnlUcmFuc2FjdGlvbiwgVW5zaWduZWRTd2VlcFJlY292ZXJ5VHJhbnNhY3Rpb24gfSBmcm9tICcuL2xpYi90eXBlcyc7XG5pbXBvcnQgeyBUb2tlblRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4vbGliJztcbmltcG9ydCB7IEFWR19HQVNfVU5JVFMsIEVYUElSQVRJT04sIGZlZUVzdGltYXRlRGF0YSwgR0FTX1BSSUNFX0NPRUYgfSBmcm9tICcuL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVmV0IH0gZnJvbSAnLi92ZXQnO1xuXG5leHBvcnQgY2xhc3MgVmV0VG9rZW4gZXh0ZW5kcyBWZXQge1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5Db25maWc6IFZldFRva2VuQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHRva2VuQ29uZmlnOiBWZXRUb2tlbkNvbmZpZykge1xuICAgIGNvbnN0IHN0YXRpY3NDb2luID0gdG9rZW5Db25maWcubmV0d29yayA9PT0gJ01haW5uZXQnID8gY29pbnMuZ2V0KCd2ZXQnKSA6IGNvaW5zLmdldCgndHZldCcpO1xuICAgIHN1cGVyKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gICAgdGhpcy50b2tlbkNvbmZpZyA9IHRva2VuQ29uZmlnO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRva2VuQ29uc3RydWN0b3IoY29uZmlnOiBWZXRUb2tlbkNvbmZpZyk6IENvaW5Db25zdHJ1Y3RvciB7XG4gICAgcmV0dXJuIChiaXRnbzogQml0R29CYXNlKSA9PiBuZXcgVmV0VG9rZW4oYml0Z28sIGNvbmZpZyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoKTogTmFtZWRDb2luQ29uc3RydWN0b3JbXSB7XG4gICAgY29uc3QgdG9rZW5zQ3RvcnM6IE5hbWVkQ29pbkNvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIFsuLi50b2tlbnMuYml0Y29pbi52ZXQudG9rZW5zLCAuLi50b2tlbnMudGVzdG5ldC52ZXQudG9rZW5zXSkge1xuICAgICAgY29uc3QgdG9rZW5Db25zdHJ1Y3RvciA9IFZldFRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3IodG9rZW4pO1xuICAgICAgdG9rZW5zQ3RvcnMucHVzaCh7IG5hbWU6IHRva2VuLnR5cGUsIGNvaW5Db25zdHJ1Y3RvcjogdG9rZW5Db25zdHJ1Y3RvciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc0N0b3JzO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uYW1lO1xuICB9XG5cbiAgZ2V0IGNvaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5jb2luO1xuICB9XG5cbiAgZ2V0IG5ldHdvcmsoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uZXR3b3JrO1xuICB9XG5cbiAgZ2V0IGNvbnRyYWN0QWRkcmVzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmNvbnRyYWN0QWRkcmVzcztcbiAgfVxuXG4gIGdldCBkZWNpbWFsUGxhY2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuZGVjaW1hbFBsYWNlcztcbiAgfVxuXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudHlwZTtcbiAgfVxuXG4gIGdldEJhc2VDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvaW47XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnVmV0IFRva2VuJztcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMudG9rZW5Db25maWcuZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICBhc3luYyByZWNvdmVyKHBhcmFtczogUmVjb3Zlck9wdGlvbnMpOiBQcm9taXNlPFJlY292ZXJ5VHJhbnNhY3Rpb24gfCBVbnNpZ25lZFN3ZWVwUmVjb3ZlcnlUcmFuc2FjdGlvbj4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MgfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdG9rZW5Db250cmFjdEFkZHJlc3MnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gIXBhcmFtcy51c2VyS2V5ICYmICFwYXJhbXMuYmFja3VwS2V5ICYmICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcblxuICAgICAgbGV0IHB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IHVzZXJLZXlTaGFyZSwgYmFja3VwS2V5U2hhcmUsIGNvbW1vbktleUNoYWluO1xuICAgICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG5cbiAgICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgY29uc3QgYml0Z29LZXkgPSBwYXJhbXMuYml0Z29LZXk7XG4gICAgICAgIGlmICghYml0Z29LZXkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYml0Z29LZXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhkVHJlZSA9IG5ldyBtcGMuU2VjcDI1NmsxQmlwMzJIZFRyZWUoKTtcbiAgICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSAnbS8wJztcbiAgICAgICAgY29uc3QgZGVyaXZlZFB1YiA9IGhkVHJlZS5wdWJsaWNEZXJpdmUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGs6IG1wYy5iaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oYml0Z29LZXkuc2xpY2UoMCwgNjYpLCAnaGV4JykpLFxuICAgICAgICAgICAgY2hhaW5jb2RlOiBtcGMuYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKGJpdGdvS2V5LnNsaWNlKDY2KSwgJ2hleCcpKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlcml2YXRpb25QYXRoXG4gICAgICAgICk7XG5cbiAgICAgICAgcHVibGljS2V5ID0gbXBjLmJpZ0ludFRvQnVmZmVyQkUoZGVyaXZlZFB1Yi5waykudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFwYXJhbXMudXNlcktleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1c2VyS2V5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhcmFtcy5iYWNrdXBLZXkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1c2VyS2V5ID0gcGFyYW1zLnVzZXJLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICAgICAgY29uc3QgYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuXG4gICAgICAgICh7IHVzZXJLZXlTaGFyZSwgYmFja3VwS2V5U2hhcmUsIGNvbW1vbktleUNoYWluIH0gPSBhd2FpdCBFQ0RTQVV0aWxzLmdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXMoXG4gICAgICAgICAgdXNlcktleSxcbiAgICAgICAgICBiYWNrdXBLZXksXG4gICAgICAgICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2VcbiAgICAgICAgKSk7XG4gICAgICAgIHB1YmxpY0tleSA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleUNoYWluLCAnbS8wJykuc2xpY2UoMCwgNjYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXB1YmxpY0tleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBkZXJpdmUgcHVibGljIGtleScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYWNrdXBLZXlQYWlyID0gbmV3IEV0aEtleVBhaXIoeyBwdWI6IHB1YmxpY0tleSB9KTtcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gYmFja3VwS2V5UGFpci5nZXRBZGRyZXNzKCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy5idWlsZFJlY292ZXJ5VHJhbnNhY3Rpb24oe1xuICAgICAgICBiYXNlQWRkcmVzcyxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpZ25hYmxlSGV4ID0gYXdhaXQgdHguc2lnbmFibGVQYXlsb2FkO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4SGV4ID0gYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR4SGV4OiBzZXJpYWxpemVkVHhIZXgsXG4gICAgICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduYWJsZU1lc3NhZ2UgPSB0aGlzLmdldEhhc2hGdW5jdGlvbigpLnVwZGF0ZShzaWduYWJsZUhleCkuZGlnZXN0KCk7XG5cbiAgICAgIGNvbnN0IHNpZ25hdHVyZU9iaiA9IGF3YWl0IEVDRFNBVXRpbHMuc2lnblJlY292ZXJ5TXBjVjIoXG4gICAgICAgIHNpZ25hYmxlTWVzc2FnZSxcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgICAgY29tbW9uS2V5Q2hhaW5cbiAgICAgICk7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBCdWZmZXIuZnJvbShzaWduYXR1cmVPYmouciArIHNpZ25hdHVyZU9iai5zICsgKHNpZ25hdHVyZU9iai5yZWNpZCA9PT0gMCA/ICcwMCcgOiAnMDEnKSwgJ2hleCcpO1xuICAgICAgY29uc3QgdG9rZW5UcmFuc2FjdGlvbiA9IG5ldyBUb2tlblRyYW5zYWN0aW9uKGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpLmdldFRva2VuVHJhbnNhY3Rpb25CdWlsZGVyKHRva2VuVHJhbnNhY3Rpb24pO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmZyb20oc2VyaWFsaXplZFR4SGV4KTtcbiAgICAgIHR4QnVpbGRlci5pc1JlY292ZXJ5KHRydWUpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmFkZFNlbmRlclNpZ25hdHVyZShzaWduYXR1cmUpO1xuXG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogc2lnbmVkVHguaWQsXG4gICAgICAgIHR4OiBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkdXJpbmcgVmVjaGFpbiB0b2tlbiByZWNvdmVyeTogJHtlcnJvci5tZXNzYWdlIHx8IGVycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZFJlY292ZXJ5VHJhbnNhY3Rpb24oYnVpbGRQYXJhbXM6IHtcbiAgICBiYXNlQWRkcmVzczogc3RyaW5nO1xuICAgIHBhcmFtczogUmVjb3Zlck9wdGlvbnM7XG4gIH0pOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyBiYXNlQWRkcmVzcywgcGFyYW1zIH0gPSBidWlsZFBhcmFtcztcbiAgICBjb25zdCB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9IHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcztcbiAgICBhc3NlcnQodG9rZW5Db250cmFjdEFkZHJlc3MsICd0b2tlbkNvbnRyYWN0QWRkcmVzcyBpcyByZXF1aXJlZCBmb3IgdG9rZW4gcmVjb3ZlcnknKTtcblxuICAgIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCB0aGlzLmdldEJhbGFuY2UoYmFzZUFkZHJlc3MsIHRva2VuQ29udHJhY3RBZGRyZXNzKTtcbiAgICAvL3JlcGxhY2Ugd2l0aCBnZXQgYmFsYW5jZSBmdW5jdGlvblxuXG4gICAgaWYgKGJhbGFuY2UuaXNMZXNzVGhhbk9yRXF1YWxUbygwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbm8gdG9rZW4gYmFsYW5jZSB0byByZWNvdmVyIGZvciBhZGRyZXNzICR7YmFzZUFkZHJlc3N9IGNvbnRyYWN0IGFkZHJlc3MgJHt0b2tlbkNvbnRyYWN0QWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSB0aGUgcmVjaXBpZW50cyBoZXJlIHNvIHRoYXQgd2UgY2FuIGJ1aWxkIHRoZSBjbGF1c2VzIGZvciBnYXMgZXN0aW1hdGlvblxuICAgIGNvbnN0IHJvdWdoRmVlRXN0aW1hdGUgPSB0aGlzLmNhbGN1bGF0ZUZlZShmZWVFc3RpbWF0ZURhdGEsIG5ldyBCaWdOdW1iZXIoNTEzOTApKTtcbiAgICBsZXQgcmVjaXBpZW50cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIGFtb3VudDogYmFsYW5jZS5taW51cyhyb3VnaEZlZUVzdGltYXRlKS50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgYmxvY2tSZWYgPSBhd2FpdCB0aGlzLmdldEJsb2NrUmVmKCk7XG5cbiAgICBjb25zdCB0b2tlblRyYW5zYWN0aW9uID0gbmV3IFRva2VuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpLmdldFRva2VuVHJhbnNhY3Rpb25CdWlsZGVyKHRva2VuVHJhbnNhY3Rpb24pO1xuXG4gICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLmNoYWluVGFnKHRoaXMuYml0Z28uZ2V0RW52KCkgPT09ICdwcm9kJyA/IDB4NGEgOiAweDI3KTtcbiAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyhyZWNpcGllbnRzKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGJhc2VBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKGJhc2VBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIuZ2FzKE51bWJlcihBVkdfR0FTX1VOSVRTKSk7XG4gICAgdHhCdWlsZGVyLmJsb2NrUmVmKGJsb2NrUmVmKTtcbiAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihFWFBJUkFUSU9OKTtcbiAgICB0eEJ1aWxkZXIuZ2FzUHJpY2VDb2VmKE51bWJlcihHQVNfUFJJQ0VfQ09FRikpO1xuICAgIHR4QnVpbGRlci5ub25jZSh0aGlzLmdldFJhbmRvbU5vbmNlKCkpO1xuICAgIHR4QnVpbGRlci5pc1JlY292ZXJ5KHRydWUpO1xuXG4gICAgbGV0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcblxuICAgIGNvbnN0IGNsYXVzZXMgPSB0eC5jbGF1c2VzO1xuXG4gICAgY29uc3QgYWN0dWFsR2FzVW5pdHMgPSBhd2FpdCB0aGlzLmVzdGltYXRlR2FzKGNsYXVzZXMsIGJhc2VBZGRyZXNzKTtcblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlVnRob0JhbGFuY2VGb3JGZWUoYmFzZUFkZHJlc3MsIGFjdHVhbEdhc1VuaXRzKTtcblxuICAgIGNvbnN0IHJlcXVpcmVkRmVlID0gdGhpcy5jYWxjdWxhdGVGZWUoZmVlRXN0aW1hdGVEYXRhLCBhY3R1YWxHYXNVbml0cyk7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGZpbmFsIHJlY2lwaWVudHMgd2l0aCB0aGUgZmVlIGRlZHVjdGVkXG4gICAgcmVjaXBpZW50cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIGFtb3VudDogYmFsYW5jZS5taW51cyhyZXF1aXJlZEZlZSkudG9TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHJlY2lwaWVudHMpO1xuICAgIHR4QnVpbGRlci5nYXMoYWN0dWFsR2FzVW5pdHMudG9OdW1iZXIoKSk7XG5cbiAgICB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cbn1cbiJdfQ==
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmV0VG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmV0VG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQW9FO0FBQ3BFLCtCQUE0QjtBQUU1QixNQUFhLFFBQVMsU0FBUSxTQUFHO0lBRy9CLFlBQVksS0FBZ0IsRUFBRSxXQUEyQjtRQUN2RCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RixLQUFLLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLENBQUMsc0JBQXNCLENBQUMsTUFBc0I7UUFDbEQsT0FBTyxDQUFDLEtBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxDQUFDLHVCQUF1QjtRQUM1QixNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqRixNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRSxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQXpERCw0QkF5REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaXRHb0Jhc2UsIENvaW5Db25zdHJ1Y3RvciwgTmFtZWRDb2luQ29uc3RydWN0b3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBWZXRUb2tlbkNvbmZpZywgY29pbnMsIHRva2VucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVmV0IH0gZnJvbSAnLi92ZXQnO1xuXG5leHBvcnQgY2xhc3MgVmV0VG9rZW4gZXh0ZW5kcyBWZXQge1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5Db25maWc6IFZldFRva2VuQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHRva2VuQ29uZmlnOiBWZXRUb2tlbkNvbmZpZykge1xuICAgIGNvbnN0IHN0YXRpY3NDb2luID0gdG9rZW5Db25maWcubmV0d29yayA9PT0gJ01haW5uZXQnID8gY29pbnMuZ2V0KCd2ZXQnKSA6IGNvaW5zLmdldCgndHZldCcpO1xuICAgIHN1cGVyKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gICAgdGhpcy50b2tlbkNvbmZpZyA9IHRva2VuQ29uZmlnO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRva2VuQ29uc3RydWN0b3IoY29uZmlnOiBWZXRUb2tlbkNvbmZpZyk6IENvaW5Db25zdHJ1Y3RvciB7XG4gICAgcmV0dXJuIChiaXRnbzogQml0R29CYXNlKSA9PiBuZXcgVmV0VG9rZW4oYml0Z28sIGNvbmZpZyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoKTogTmFtZWRDb2luQ29uc3RydWN0b3JbXSB7XG4gICAgY29uc3QgdG9rZW5zQ3RvcnM6IE5hbWVkQ29pbkNvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIFsuLi50b2tlbnMuYml0Y29pbi52ZXQudG9rZW5zLCAuLi50b2tlbnMudGVzdG5ldC52ZXQudG9rZW5zXSkge1xuICAgICAgY29uc3QgdG9rZW5Db25zdHJ1Y3RvciA9IFZldFRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3IodG9rZW4pO1xuICAgICAgdG9rZW5zQ3RvcnMucHVzaCh7IG5hbWU6IHRva2VuLnR5cGUsIGNvaW5Db25zdHJ1Y3RvcjogdG9rZW5Db25zdHJ1Y3RvciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc0N0b3JzO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uYW1lO1xuICB9XG5cbiAgZ2V0IGNvaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5jb2luO1xuICB9XG5cbiAgZ2V0IG5ldHdvcmsoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uZXR3b3JrO1xuICB9XG5cbiAgZ2V0IGNvbnRyYWN0QWRkcmVzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmNvbnRyYWN0QWRkcmVzcztcbiAgfVxuXG4gIGdldCBkZWNpbWFsUGxhY2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuZGVjaW1hbFBsYWNlcztcbiAgfVxuXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudHlwZTtcbiAgfVxuXG4gIGdldEJhc2VDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvaW47XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnVmV0IFRva2VuJztcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMudG9rZW5Db25maWcuZGVjaW1hbFBsYWNlcyk7XG4gIH1cbn1cbiJdfQ==