PHP WebShell

Текущая директория: /opt/BitGoJS/modules/blockapis/dist/src/impl

Просмотр файла: BlockstreamApi.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BlockstreamApi = void 0;
const utxo_lib_1 = require("@bitgo/utxo-lib");
const BaseHttpClient_1 = require("../BaseHttpClient");
const ApiBuilder_1 = require("../ApiBuilder");
const formatOutputId = utxo_lib_1.bitgo.formatOutputId;
function toBitGoUnspent(u, address, value) {
    return {
        id: formatOutputId(u),
        address,
        value,
    };
}
class BlockstreamApi {
    static forCoin(coinName, params = {}) {
        const { httpClient = new BaseHttpClient_1.BaseHttpClient() } = params;
        switch (coinName) {
            case 'btc':
                return new BlockstreamApi(httpClient.withBaseUrl('https://blockstream.info/api'));
            case 'tbtc':
                return new BlockstreamApi(httpClient.withBaseUrl('https://blockstream.info/testnet/api'));
        }
        throw new ApiBuilder_1.ApiNotImplementedError(coinName);
    }
    constructor(client) {
        this.client = client;
    }
    async getBlockIdAtHeight(height) {
        // https://github.com/Blockstream/esplora/blob/master/API.md#get-block-heightheight
        return (await this.client.get(`/block-height/${height}`)).map((body) => body);
    }
    async getTransactionIds(hash) {
        // https://github.com/Blockstream/esplora/blob/master/API.md#get-blockhashtxids
        return (await this.client.get(`/block/${hash}/txids`)).map((body) => body);
    }
    async getAddressInfo(address) {
        const response = await this.client.get(`/address/${address}`);
        return response.map((body) => {
            return {
                txCount: body.chain_stats.tx_count,
                balance: body.chain_stats.funded_txo_sum - body.chain_stats.spent_txo_sum,
            };
        });
    }
    async getUnspentsForAddresses(addrs) {
        if (addrs.length !== 1) {
            return (await (0, BaseHttpClient_1.mapSeries)(addrs, (a) => this.getUnspentsForAddresses([a]))).flat();
        }
        const [address] = addrs;
        return (await this.client.get(`/address/${address}/utxo`)).map((unspents) => unspents.map((u) => toBitGoUnspent(u, address, u.value)));
    }
    async getTransactionHex(txid) {
        return (await this.client.get(`/tx/${txid}/hex`)).map((v) => v);
    }
    async getTransactionStatus(txid) {
        try {
            return (await this.client.get(`/tx/${txid}`)).map(({ status }) => status.confirmed
                ? { found: true, confirmed: true, blockHeight: status.block_height, blockHash: status.block_hash }
                : { found: true, confirmed: false });
        }
        catch (e) {
            if (e instanceof BaseHttpClient_1.ApiRequestError) {
                const reason = e.reason;
                if (reason.response.status === 404 && reason.response.text === 'Transaction not found') {
                    return { found: false };
                }
            }
            throw e;
        }
    }
    async getTransactionInputs(txid) {
        return (await this.client.get(`/tx/${txid}`)).map((body) => body.vin.map((u) => toBitGoUnspent(u, u.prevout.scriptpubkey_address, u.prevout.value)));
    }
    async getTransactionIO(txid) {
        const tx = await this.client.get(`/tx/${txid}`);
        const inputs = tx.map((body) => body.vin.map((u) => {
            return {
                address: u.prevout.scriptpubkey_address,
            };
        }));
        const outputs = tx.map((body) => body.vout.map((u) => {
            return {
                address: u.scriptpubkey_address,
            };
        }));
        return {
            inputs,
            outputs,
        };
    }
    async getTransactionSpends(txid) {
        return (await this.client.get(`/tx/${txid}/outspends`)).map((arr) => arr.map((v) => (v.txid ? { txid: v.txid, vin: v.vin } : { txid: undefined, vin: undefined })));
    }
}
exports.BlockstreamApi = BlockstreamApi;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tzdHJlYW1BcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW1wbC9CbG9ja3N0cmVhbUFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4Q0FBd0M7QUFHeEMsc0RBQTJGO0FBQzNGLDhDQUF1RDtBQUl2RCxNQUFNLGNBQWMsR0FBRyxnQkFBSyxDQUFDLGNBQWMsQ0FBQztBQXNDNUMsU0FBUyxjQUFjLENBQUMsQ0FBYSxFQUFFLE9BQWUsRUFBRSxLQUFhO0lBQ25FLE9BQU87UUFDTCxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNyQixPQUFPO1FBQ1AsS0FBSztLQUNOLENBQUM7QUFDSixDQUFDO0FBcUJELE1BQWEsY0FBYztJQUN6QixNQUFNLENBQUMsT0FBTyxDQUFDLFFBQWdCLEVBQUUsU0FBc0MsRUFBRTtRQUN2RSxNQUFNLEVBQUUsVUFBVSxHQUFHLElBQUksK0JBQWMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3JELFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSxjQUFjLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7WUFDcEYsS0FBSyxNQUFNO2dCQUNULE9BQU8sSUFBSSxjQUFjLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQUVELE1BQU0sSUFBSSxtQ0FBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsWUFBbUIsTUFBa0I7UUFBbEIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtJQUFHLENBQUM7SUFFekMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQWM7UUFDckMsbUZBQW1GO1FBQ25GLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFTLGlCQUFpQixNQUFNLEVBQUUsQ0FB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QUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNsQixPQUFPO2dCQUNMLE9BQU8sRUFBRSxDQUFDLENBQUMsb0JBQW9CO2FBQ2hDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTztZQUNMLE1BQU07WUFDTixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBWTtRQUNyQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBb0IsT0FBTyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDckYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUM5RixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdEdELHdDQXNHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJpdGdvIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IEFkZHJlc3NBcGksIEFkZHJlc3NJbmZvIH0gZnJvbSAnLi4vQWRkcmVzc0FwaSc7XG5pbXBvcnQgeyBPdXRwdXRTcGVuZCwgVHJhbnNhY3Rpb25JTywgVXR4b0FwaSB9IGZyb20gJy4uL1V0eG9BcGknO1xuaW1wb3J0IHsgQXBpUmVxdWVzdEVycm9yLCBCYXNlSHR0cENsaWVudCwgSHR0cENsaWVudCwgbWFwU2VyaWVzIH0gZnJvbSAnLi4vQmFzZUh0dHBDbGllbnQnO1xuaW1wb3J0IHsgQXBpTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL0FwaUJ1aWxkZXInO1xuaW1wb3J0IHsgQmxvY2tBcGksIFRyYW5zYWN0aW9uU3RhdHVzIH0gZnJvbSAnLi4vVHJhbnNhY3Rpb25BcGknO1xuXG50eXBlIFVuc3BlbnQgPSBiaXRnby5VbnNwZW50O1xuY29uc3QgZm9ybWF0T3V0cHV0SWQgPSBiaXRnby5mb3JtYXRPdXRwdXRJZDtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0Jsb2Nrc3RyZWFtL2VzcGxvcmEvYmxvYi9tYXN0ZXIvQVBJLm1kI2dldC1hZGRyZXNzYWRkcmVzc1xudHlwZSBFc3Bsb3JhQWRkcmVzc1N0YXRzID0ge1xuICB0eF9jb3VudDogbnVtYmVyO1xuICBmdW5kZWRfdHhvX3N1bTogbnVtYmVyO1xuICBzcGVudF90eG9fc3VtOiBudW1iZXI7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vQmxvY2tzdHJlYW0vZXNwbG9yYS9ibG9iL21hc3Rlci9BUEkubWQjZ2V0LWFkZHJlc3NhZGRyZXNzXG50eXBlIEVzcGxvcmFBZGRyZXNzID0ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNoYWluX3N0YXRzOiBFc3Bsb3JhQWRkcmVzc1N0YXRzO1xuICBtZW1wb29sX3N0YWF0czogRXNwbG9yYUFkZHJlc3NTdGF0cztcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9CbG9ja3N0cmVhbS9lc3Bsb3JhL2Jsb2IvbWFzdGVyL0FQSS5tZCNnZXQtYWRkcmVzc2FkZHJlc3N1dHhvXG50eXBlIEVzcGxvcmFWaW4gPSB7XG4gIHR4aWQ6IHN0cmluZztcbiAgdm91dDogbnVtYmVyO1xuICBzdGF0dXM6IHVua25vd247XG4gIHZhbHVlOiBudW1iZXI7XG4gIHByZXZvdXQ6IEVzcGxvcmFWb3V0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0Jsb2Nrc3RyZWFtL2VzcGxvcmEvYmxvYi9tYXN0ZXIvQVBJLm1kI2dldC1hZGRyZXNzYWRkcmVzc3V0eG9cbnR5cGUgRXNwbG9yYVZvdXQgPSB7XG4gIHNjcmlwdHB1YmtleTogc3RyaW5nO1xuICBzY3JpcHRwdWJrZXlfYWRkcmVzczogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0Jsb2Nrc3RyZWFtL2VzcGxvcmEvYmxvYi9tYXN0ZXIvQVBJLm1kI2dldC10eHR4aWRvdXRzcGVuZHZvdXRcbnR5cGUgRXNwbG9yYU91dHNwZW5kID0ge1xuICB0eGlkOiBzdHJpbmc7XG4gIHZpbjogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gdG9CaXRHb1Vuc3BlbnQodTogRXNwbG9yYVZpbiwgYWRkcmVzczogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogVW5zcGVudCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IGZvcm1hdE91dHB1dElkKHUpLFxuICAgIGFkZHJlc3MsXG4gICAgdmFsdWUsXG4gIH07XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9CbG9ja3N0cmVhbS9lc3Bsb3JhL2Jsb2IvbWFzdGVyL0FQSS5tZCNnZXQtdHh0eGlkc3RhdHVzXG50eXBlIEVzcGxvcmFTdGF0dXMgPVxuICB8IHtcbiAgICAgIGNvbmZpcm1lZDogZmFsc2U7XG4gICAgfVxuICB8IHtcbiAgICAgIGNvbmZpcm1lZDogdHJ1ZTtcbiAgICAgIGJsb2NrX2hlaWdodDogbnVtYmVyO1xuICAgICAgYmxvY2tfaGFzaDogc3RyaW5nO1xuICAgIH07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9CbG9ja3N0cmVhbS9lc3Bsb3JhL2Jsb2IvbWFzdGVyL0FQSS5tZCNnZXQtdHh0eGlkXG50eXBlIEVzcGxvcmFUcmFuc2FjdGlvbiA9IHtcbiAgdHhpZDogc3RyaW5nO1xuICB2aW46IEVzcGxvcmFWaW5bXTtcbiAgdm91dDogRXNwbG9yYVZvdXRbXTtcbiAgc3RhdHVzOiBFc3Bsb3JhU3RhdHVzO1xufTtcblxuZXhwb3J0IGNsYXNzIEJsb2Nrc3RyZWFtQXBpIGltcGxlbWVudHMgQWRkcmVzc0FwaSwgQmxvY2tBcGksIFV0eG9BcGkge1xuICBzdGF0aWMgZm9yQ29pbihjb2luTmFtZTogc3RyaW5nLCBwYXJhbXM6IHsgaHR0cENsaWVudD86IEh0dHBDbGllbnQgfSA9IHt9KTogQmxvY2tzdHJlYW1BcGkge1xuICAgIGNvbnN0IHsgaHR0cENsaWVudCA9IG5ldyBCYXNlSHR0cENsaWVudCgpIH0gPSBwYXJhbXM7XG4gICAgc3dpdGNoIChjb2luTmFtZSkge1xuICAgICAgY2FzZSAnYnRjJzpcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja3N0cmVhbUFwaShodHRwQ2xpZW50LndpdGhCYXNlVXJsKCdodHRwczovL2Jsb2Nrc3RyZWFtLmluZm8vYXBpJykpO1xuICAgICAgY2FzZSAndGJ0Yyc6XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tzdHJlYW1BcGkoaHR0cENsaWVudC53aXRoQmFzZVVybCgnaHR0cHM6Ly9ibG9ja3N0cmVhbS5pbmZvL3Rlc3RuZXQvYXBpJykpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBBcGlOb3RJbXBsZW1lbnRlZEVycm9yKGNvaW5OYW1lKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGllbnQ6IEh0dHBDbGllbnQpIHt9XG5cbiAgYXN5bmMgZ2V0QmxvY2tJZEF0SGVpZ2h0KGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vQmxvY2tzdHJlYW0vZXNwbG9yYS9ibG9iL21hc3Rlci9BUEkubWQjZ2V0LWJsb2NrLWhlaWdodGhlaWdodFxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5jbGllbnQuZ2V0PHN0cmluZz4oYC9ibG9jay1oZWlnaHQvJHtoZWlnaHR9YCkpLm1hcCgoYm9keSkgPT4gYm9keSk7XG4gIH1cblxuICBhc3luYyBnZXRUcmFuc2FjdGlvbklkcyhoYXNoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0Jsb2Nrc3RyZWFtL2VzcGxvcmEvYmxvYi9tYXN0ZXIvQVBJLm1kI2dldC1ibG9ja2hhc2h0eGlkc1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5jbGllbnQuZ2V0PHN0cmluZ1tdPihgL2Jsb2NrLyR7aGFzaH0vdHhpZHNgKSkubWFwKChib2R5KSA9PiBib2R5KTtcbiAgfVxuXG4gIGFzeW5jIGdldEFkZHJlc3NJbmZvKGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8QWRkcmVzc0luZm8+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldDxFc3Bsb3JhQWRkcmVzcz4oYC9hZGRyZXNzLyR7YWRkcmVzc31gKTtcbiAgICByZXR1cm4gcmVzcG9uc2UubWFwKChib2R5KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eENvdW50OiBib2R5LmNoYWluX3N0YXRzLnR4X2NvdW50LFxuICAgICAgICBiYWxhbmNlOiBib2R5LmNoYWluX3N0YXRzLmZ1bmRlZF90eG9fc3VtIC0gYm9keS5jaGFpbl9zdGF0cy5zcGVudF90eG9fc3VtLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKGFkZHJzOiBzdHJpbmdbXSk6IFByb21pc2U8VW5zcGVudFtdPiB7XG4gICAgaWYgKGFkZHJzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgcmV0dXJuIChhd2FpdCBtYXBTZXJpZXMoYWRkcnMsIChhKSA9PiB0aGlzLmdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKFthXSkpKS5mbGF0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgW2FkZHJlc3NdID0gYWRkcnM7XG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuY2xpZW50LmdldDxFc3Bsb3JhVmluW10+KGAvYWRkcmVzcy8ke2FkZHJlc3N9L3V0eG9gKSkubWFwKCh1bnNwZW50cykgPT5cbiAgICAgIHVuc3BlbnRzLm1hcCgodSkgPT4gdG9CaXRHb1Vuc3BlbnQodSwgYWRkcmVzcywgdS52YWx1ZSkpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uSGV4KHR4aWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmNsaWVudC5nZXQ8c3RyaW5nPihgL3R4LyR7dHhpZH0vaGV4YCkpLm1hcCgodikgPT4gdik7XG4gIH1cblxuICBhc3luYyBnZXRUcmFuc2FjdGlvblN0YXR1cyh0eGlkOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uU3RhdHVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5jbGllbnQuZ2V0PEVzcGxvcmFUcmFuc2FjdGlvbj4oYC90eC8ke3R4aWR9YCkpLm1hcCgoeyBzdGF0dXMgfSkgPT5cbiAgICAgICAgc3RhdHVzLmNvbmZpcm1lZFxuICAgICAgICAgID8geyBmb3VuZDogdHJ1ZSwgY29uZmlybWVkOiB0cnVlLCBibG9ja0hlaWdodDogc3RhdHVzLmJsb2NrX2hlaWdodCwgYmxvY2tIYXNoOiBzdGF0dXMuYmxvY2tfaGFzaCB9XG4gICAgICAgICAgOiB7IGZvdW5kOiB0cnVlLCBjb25maXJtZWQ6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBcGlSZXF1ZXN0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gZS5yZWFzb24gYXMgYW55O1xuICAgICAgICBpZiAocmVhc29uLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0ICYmIHJlYXNvbi5yZXNwb25zZS50ZXh0ID09PSAnVHJhbnNhY3Rpb24gbm90IGZvdW5kJykge1xuICAgICAgICAgIHJldHVybiB7IGZvdW5kOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uSW5wdXRzKHR4aWQ6IHN0cmluZyk6IFByb21pc2U8VW5zcGVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmNsaWVudC5nZXQ8RXNwbG9yYVRyYW5zYWN0aW9uPihgL3R4LyR7dHhpZH1gKSkubWFwKChib2R5KSA9PlxuICAgICAgYm9keS52aW4ubWFwKCh1KSA9PiB0b0JpdEdvVW5zcGVudCh1LCB1LnByZXZvdXQuc2NyaXB0cHVia2V5X2FkZHJlc3MsIHUucHJldm91dC52YWx1ZSkpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uSU8odHhpZDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbklPPiB7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0aGlzLmNsaWVudC5nZXQ8RXNwbG9yYVRyYW5zYWN0aW9uPihgL3R4LyR7dHhpZH1gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB0eC5tYXAoKGJvZHkpID0+XG4gICAgICBib2R5LnZpbi5tYXAoKHUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhZGRyZXNzOiB1LnByZXZvdXQuc2NyaXB0cHVia2V5X2FkZHJlc3MsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgb3V0cHV0cyA9IHR4Lm1hcCgoYm9keSkgPT5cbiAgICAgIGJvZHkudm91dC5tYXAoKHUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhZGRyZXNzOiB1LnNjcmlwdHB1YmtleV9hZGRyZXNzLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHMsXG4gICAgICBvdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRUcmFuc2FjdGlvblNwZW5kcyh0eGlkOiBzdHJpbmcpOiBQcm9taXNlPE91dHB1dFNwZW5kW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuY2xpZW50LmdldDxFc3Bsb3JhT3V0c3BlbmRbXT4oYC90eC8ke3R4aWR9L291dHNwZW5kc2ApKS5tYXAoKGFycikgPT5cbiAgICAgIGFyci5tYXAoKHYpID0+ICh2LnR4aWQgPyB7IHR4aWQ6IHYudHhpZCwgdmluOiB2LnZpbiB9IDogeyB0eGlkOiB1bmRlZmluZWQsIHZpbjogdW5kZWZpbmVkIH0pKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==

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


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