PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-core/dist/src/bitgo/utils
Просмотр файла: util.js
"use strict";
/**
* @prettier
* @hidden
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Util = exports.RequestTracer = void 0;
/**
*/
const utxo_lib_1 = require("@bitgo/utxo-lib");
const Big = __importStar(require("big.js"));
const _ = __importStar(require("lodash"));
const crypto_1 = require("crypto");
const errors_1 = require("../errors");
const debug = require('debug')('bitgo:v2:util');
let ethUtil;
let isEthAvailable = false;
const ethImport = 'ethereumjs-util';
Promise.resolve().then(() => __importStar(require('ethereumjs-util'))).then((eth) => {
ethUtil = eth;
isEthAvailable = true;
})
.catch((e) => {
// ethereum currently not supported
debug('unable to load ethereumjs-util:');
debug(e.stack);
});
/**
* Create a request tracer for tracing workflows which involve multiple round trips to the server
*/
class RequestTracer {
constructor() {
this._seq = 0;
this._seed = (0, crypto_1.randomBytes)(10);
}
inc() {
this._seq++;
}
toString() {
return `${this._seed.toString('hex')}-${_.padStart(this._seq.toString(16), 4, '0')}`;
}
}
exports.RequestTracer = RequestTracer;
class Util {
// eslint-disable-next-line @typescript-eslint/no-empty-function
constructor() { }
/**
* @deprecated
*/
static isEthAvailable() {
return isEthAvailable;
}
/**
* Convert a big.js big number to an array of unsigned bytes
* @param bn
* @deprecated
*/
static bnToByteArrayUnsigned(bn) {
let ba = bn.abs().toByteArray();
if (ba.length) {
if (ba[0] === 0) {
ba = ba.slice(1);
}
return ba.map(function (v) {
return v < 0 ? v + 256 : v;
});
}
else {
// Empty array, nothing to do
return ba;
}
}
/**
* Utility method for handling arguments of pageable queries
* @param params
* @deprecated
*/
static preparePageableQuery(params = {}) {
const query = {};
if (params.limit) {
if (!_.isNumber(params.limit)) {
throw new Error('invalid limit argument, expecting number');
}
query.limit = params.limit;
}
if (params.skip) {
if (!_.isNumber(params.skip)) {
throw new Error('invalid skip argument, expecting number');
}
query.skip = params.skip;
}
return query;
}
/**
* Create a request identifier for tracing multi-request workflows
*/
static createRequestId() {
return new RequestTracer();
}
/**
* Convert a BTC xpub to an Ethereum address (with 0x prefix)
* @param xpub
* @deprecated
*/
static xpubToEthAddress(xpub) {
if (!isEthAvailable) {
throw new errors_1.EthereumLibraryUnavailableError(ethImport);
}
return ethUtil.bufferToHex(ethUtil.publicToAddress(utxo_lib_1.bip32.fromBase58(xpub).publicKey, true /* sanitize */));
}
/**
* Convert a BTC xpriv to an Ethereum private key (without 0x prefix)
* @param xprv
* @deprecated
*/
static xprvToEthPrivateKey(xprv) {
const node = utxo_lib_1.bip32.fromBase58(xprv);
if (!node.privateKey) {
throw new Error(`no privateKey`);
}
return node.privateKey.toString('hex');
}
/**
* Sign a message using Ethereum's ECsign method and return the signature string
* @param msgHash
* @param privKey
* @deprecated
*/
static ethSignMsgHash(msgHash, privKey) {
if (!isEthAvailable) {
throw new errors_1.EthereumLibraryUnavailableError(ethImport);
}
const signatureInParts = ethUtil.ecsign(Buffer.from(ethUtil.stripHexPrefix(msgHash), 'hex'), Buffer.from(privKey, 'hex'));
// Assemble strings from r, s and v
const r = ethUtil.setLengthLeft(signatureInParts.r, 32).toString('hex');
const s = ethUtil.setLengthLeft(signatureInParts.s, 32).toString('hex');
const v = ethUtil.stripHexPrefix(ethUtil.intToHex(signatureInParts.v));
// Concatenate the r, s and v parts to make the signature string
return ethUtil.addHexPrefix(r.concat(s, v));
}
/**
* Convert from wei string (or BN) to Ether (multiply by 1e18)
* @param wei
* @deprecated
*/
static weiToEtherString(wei) {
if (!isEthAvailable) {
throw new errors_1.EthereumLibraryUnavailableError(ethImport);
}
let bn = wei;
if (!(wei instanceof ethUtil.BN)) {
bn = new ethUtil.BN(wei);
}
Big.E_POS = 256;
Big.E_NEG = -18;
const weiString = bn.toString(10);
const big = new Big(weiString);
// 10^18
const ether = big.div('1000000000000000000');
return ether.toPrecision();
}
/**
* Recover an ethereum address from a signature and message hash
* @param msgHash
* @param signature
* @deprecated
*/
static ecRecoverEthAddress(msgHash, signature) {
msgHash = ethUtil.stripHexPrefix(msgHash);
signature = ethUtil.stripHexPrefix(signature);
const v = parseInt(signature.slice(128, 130), 16);
const r = Buffer.from(signature.slice(0, 64), 'hex');
const s = Buffer.from(signature.slice(64, 128), 'hex');
const pubKey = ethUtil.ecrecover(Buffer.from(msgHash, 'hex'), v, r, s);
return ethUtil.bufferToHex(ethUtil.pubToAddress(pubKey));
}
}
exports.Util = Util;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVIO0dBQ0c7QUFDSCw4Q0FBd0M7QUFDeEMsNENBQThCO0FBQzlCLDBDQUE0QjtBQUM1QixtQ0FBcUM7QUFFckMsc0NBQTREO0FBRTVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUVoRCxJQUFJLE9BQU8sQ0FBQztBQUNaLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztBQUUzQixNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQztBQUNwQyxrREFBTyxpQkFBaUIsSUFDckIsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7SUFDWixPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ2QsY0FBYyxHQUFHLElBQUksQ0FBQztBQUN4QixDQUFDLENBQUM7S0FDRCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNYLG1DQUFtQztJQUNuQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUN6QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pCLENBQUMsQ0FBQyxDQUFDO0FBRUw7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFHeEI7UUFGUSxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBR2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFBLG9CQUFXLEVBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELEdBQUc7UUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENB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LE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkUsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0NBQ0Y7QUFwSkQsb0JBb0pDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqIEBoaWRkZW5cbiAqL1xuXG4vKipcbiAqL1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgQmlnIGZyb20gJ2JpZy5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBJUmVxdWVzdFRyYWNlciB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBFdGhlcmV1bUxpYnJhcnlVbmF2YWlsYWJsZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdiaXRnbzp2Mjp1dGlsJyk7XG5cbmxldCBldGhVdGlsO1xubGV0IGlzRXRoQXZhaWxhYmxlID0gZmFsc2U7XG5cbmNvbnN0IGV0aEltcG9ydCA9ICdldGhlcmV1bWpzLXV0aWwnO1xuaW1wb3J0KCdldGhlcmV1bWpzLXV0aWwnKVxuICAudGhlbigoZXRoKSA9PiB7XG4gICAgZXRoVXRpbCA9IGV0aDtcbiAgICBpc0V0aEF2YWlsYWJsZSA9IHRydWU7XG4gIH0pXG4gIC5jYXRjaCgoZSkgPT4ge1xuICAgIC8vIGV0aGVyZXVtIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkXG4gICAgZGVidWcoJ3VuYWJsZSB0byBsb2FkIGV0aGVyZXVtanMtdXRpbDonKTtcbiAgICBkZWJ1ZyhlLnN0YWNrKTtcbiAgfSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVxdWVzdCB0cmFjZXIgZm9yIHRyYWNpbmcgd29ya2Zsb3dzIHdoaWNoIGludm9sdmUgbXVsdGlwbGUgcm91bmQgdHJpcHMgdG8gdGhlIHNlcnZlclxuICovXG5leHBvcnQgY2xhc3MgUmVxdWVzdFRyYWNlciBpbXBsZW1lbnRzIElSZXF1ZXN0VHJhY2VyIHtcbiAgcHJpdmF0ZSBfc2VxID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VlZDogQnVmZmVyO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9zZWVkID0gcmFuZG9tQnl0ZXMoMTApO1xuICB9XG5cbiAgaW5jKCkge1xuICAgIHRoaXMuX3NlcSsrO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuX3NlZWQudG9TdHJpbmcoJ2hleCcpfS0ke18ucGFkU3RhcnQodGhpcy5fc2VxLnRvU3RyaW5nKDE2KSwgNCwgJzAnKX1gO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVdGlsIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHN0YXRpYyBpc0V0aEF2YWlsYWJsZSgpIHtcbiAgICByZXR1cm4gaXNFdGhBdmFpbGFibGU7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIGJpZy5qcyBiaWcgbnVtYmVyIHRvIGFuIGFycmF5IG9mIHVuc2lnbmVkIGJ5dGVzXG4gICAqIEBwYXJhbSBiblxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc3RhdGljIGJuVG9CeXRlQXJyYXlVbnNpZ25lZChibjogYW55KTogYW55IHtcbiAgICBsZXQgYmEgPSBibi5hYnMoKS50b0J5dGVBcnJheSgpO1xuICAgIGlmIChiYS5sZW5ndGgpIHtcbiAgICAgIGlmIChiYVswXSA9PT0gMCkge1xuICAgICAgICBiYSA9IGJhLnNsaWNlKDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdiA8IDAgPyB2ICsgMjU2IDogdjtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbXB0eSBhcnJheSwgbm90aGluZyB0byBkb1xuICAgICAgcmV0dXJuIGJhO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgaGFuZGxpbmcgYXJndW1lbnRzIG9mIHBhZ2VhYmxlIHF1ZXJpZXNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc3RhdGljIHByZXBhcmVQYWdlYWJsZVF1ZXJ5KHBhcmFtczogeyBsaW1pdD86IG51bWJlcjsgc2tpcD86IG51bWJlciB9ID0ge30pOiB7IGxpbWl0PzogbnVtYmVyOyBza2lwPzogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHF1ZXJ5OiBhbnkgPSB7fTtcbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnNraXApIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuc2tpcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNraXAgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnNraXAgPSBwYXJhbXMuc2tpcDtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJlcXVlc3QgaWRlbnRpZmllciBmb3IgdHJhY2luZyBtdWx0aS1yZXF1ZXN0IHdvcmtmbG93c1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVJlcXVlc3RJZCgpOiBSZXF1ZXN0VHJhY2VyIHtcbiAgICByZXR1cm4gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQlRDIHhwdWIgdG8gYW4gRXRoZXJldW0gYWRkcmVzcyAod2l0aCAweCBwcmVmaXgpXG4gICAqIEBwYXJhbSB4cHViXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzdGF0aWMgeHB1YlRvRXRoQWRkcmVzcyh4cHViOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaXNFdGhBdmFpbGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFdGhlcmV1bUxpYnJhcnlVbmF2YWlsYWJsZUVycm9yKGV0aEltcG9ydCk7XG4gICAgfVxuICAgIHJldHVybiBldGhVdGlsLmJ1ZmZlclRvSGV4KGV0aFV0aWwucHVibGljVG9BZGRyZXNzKGJpcDMyLmZyb21CYXNlNTgoeHB1YikucHVibGljS2V5LCB0cnVlIC8qIHNhbml0aXplICovKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIEJUQyB4cHJpdiB0byBhbiBFdGhlcmV1bSBwcml2YXRlIGtleSAod2l0aG91dCAweCBwcmVmaXgpXG4gICAqIEBwYXJhbSB4cHJ2XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzdGF0aWMgeHBydlRvRXRoUHJpdmF0ZUtleSh4cHJ2OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KHhwcnYpO1xuICAgIGlmICghbm9kZS5wcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIHByaXZhdGVLZXlgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIG1lc3NhZ2UgdXNpbmcgRXRoZXJldW0ncyBFQ3NpZ24gbWV0aG9kIGFuZCByZXR1cm4gdGhlIHNpZ25hdHVyZSBzdHJpbmdcbiAgICogQHBhcmFtIG1zZ0hhc2hcbiAgICogQHBhcmFtIHByaXZLZXlcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHN0YXRpYyBldGhTaWduTXNnSGFzaChtc2dIYXNoOiBzdHJpbmcsIHByaXZLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFpc0V0aEF2YWlsYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEV0aGVyZXVtTGlicmFyeVVuYXZhaWxhYmxlRXJyb3IoZXRoSW1wb3J0KTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmF0dXJlSW5QYXJ0cyA9IGV0aFV0aWwuZWNzaWduKFxuICAgICAgQnVmZmVyLmZyb20oZXRoVXRpbC5zdHJpcEhleFByZWZpeChtc2dIYXNoKSwgJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20ocHJpdktleSwgJ2hleCcpXG4gICAgKTtcblxuICAgIC8vIEFzc2VtYmxlIHN0cmluZ3MgZnJvbSByLCBzIGFuZCB2XG4gICAgY29uc3QgciA9IGV0aFV0aWwuc2V0TGVuZ3RoTGVmdChzaWduYXR1cmVJblBhcnRzLnIsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgcyA9IGV0aFV0aWwuc2V0TGVuZ3RoTGVmdChzaWduYXR1cmVJblBhcnRzLnMsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgdiA9IGV0aFV0aWwuc3RyaXBIZXhQcmVmaXgoZXRoVXRpbC5pbnRUb0hleChzaWduYXR1cmVJblBhcnRzLnYpKTtcblxuICAgIC8vIENvbmNhdGVuYXRlIHRoZSByLCBzIGFuZCB2IHBhcnRzIHRvIG1ha2UgdGhlIHNpZ25hdHVyZSBzdHJpbmdcbiAgICByZXR1cm4gZXRoVXRpbC5hZGRIZXhQcmVmaXgoci5jb25jYXQocywgdikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgZnJvbSB3ZWkgc3RyaW5nIChvciBCTikgdG8gRXRoZXIgKG11bHRpcGx5IGJ5IDFlMTgpXG4gICAqIEBwYXJhbSB3ZWlcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHN0YXRpYyB3ZWlUb0V0aGVyU3RyaW5nKHdlaTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIWlzRXRoQXZhaWxhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXRoZXJldW1MaWJyYXJ5VW5hdmFpbGFibGVFcnJvcihldGhJbXBvcnQpO1xuICAgIH1cbiAgICBsZXQgYm4gPSB3ZWk7XG4gICAgaWYgKCEod2VpIGluc3RhbmNlb2YgZXRoVXRpbC5CTikpIHtcbiAgICAgIGJuID0gbmV3IGV0aFV0aWwuQk4od2VpKTtcbiAgICB9XG4gICAgQmlnLkVfUE9TID0gMjU2O1xuICAgIEJpZy5FX05FRyA9IC0xODtcbiAgICBjb25zdCB3ZWlTdHJpbmcgPSBibi50b1N0cmluZygxMCk7XG4gICAgY29uc3QgYmlnID0gbmV3IEJpZyh3ZWlTdHJpbmcpO1xuICAgIC8vIDEwXjE4XG4gICAgY29uc3QgZXRoZXIgPSBiaWcuZGl2KCcxMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgcmV0dXJuIGV0aGVyLnRvUHJlY2lzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBhbiBldGhlcmV1bSBhZGRyZXNzIGZyb20gYSBzaWduYXR1cmUgYW5kIG1lc3NhZ2UgaGFzaFxuICAgKiBAcGFyYW0gbXNnSGFzaFxuICAgKiBAcGFyYW0gc2lnbmF0dXJlXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzdGF0aWMgZWNSZWNvdmVyRXRoQWRkcmVzcyhtc2dIYXNoOiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBtc2dIYXNoID0gZXRoVXRpbC5zdHJpcEhleFByZWZpeChtc2dIYXNoKTtcbiAgICBzaWduYXR1cmUgPSBldGhVdGlsLnN0cmlwSGV4UHJlZml4KHNpZ25hdHVyZSk7XG5cbiAgICBjb25zdCB2ID0gcGFyc2VJbnQoc2lnbmF0dXJlLnNsaWNlKDEyOCwgMTMwKSwgMTYpO1xuICAgIGNvbnN0IHIgPSBCdWZmZXIuZnJvbShzaWduYXR1cmUuc2xpY2UoMCwgNjQpLCAnaGV4Jyk7XG4gICAgY29uc3QgcyA9IEJ1ZmZlci5mcm9tKHNpZ25hdHVyZS5zbGljZSg2NCwgMTI4KSwgJ2hleCcpO1xuXG4gICAgY29uc3QgcHViS2V5ID0gZXRoVXRpbC5lY3JlY292ZXIoQnVmZmVyLmZyb20obXNnSGFzaCwgJ2hleCcpLCB2LCByLCBzKTtcbiAgICByZXR1cm4gZXRoVXRpbC5idWZmZXJUb0hleChldGhVdGlsLnB1YlRvQWRkcmVzcyhwdWJLZXkpKTtcbiAgfVxufVxuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!