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

Выполнить команду


Для локальной разработки. Не используйте в интернете!