PHP WebShell

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

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BlockchairApi = 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;
class ErrorKeyNotInResponse extends Error {
    constructor(key) {
        super(`key ${key} not in response`);
    }
}
function unwrapRecord(body, key) {
    if (!(key in body.data)) {
        throw new ErrorKeyNotInResponse(key);
    }
    return body.data[key];
}
class BlockchairApi {
    static forCoin(coinName, params = {}) {
        // https://blockchair.com/api/docs#link_M0
        let blockchain;
        switch (coinName) {
            case 'btc':
                blockchain = 'bitcoin';
                break;
            case 'tbtc':
                blockchain = 'bitcoin/testnet';
                break;
            case 'bsv':
                blockchain = 'bitcoin-sv';
                break;
            case 'bch':
                blockchain = 'bitcoin-cash';
                break;
            case 'bcha':
                blockchain = 'ecash';
                break;
            case 'ltc':
                blockchain = 'litecoin';
                break;
            case 'dash':
                blockchain = 'dash';
                break;
            case 'doge':
                blockchain = 'dogecoin';
                break;
            case 'zec':
                blockchain = 'zcash';
                break;
            default:
                throw new ApiBuilder_1.ApiNotImplementedError(coinName);
        }
        const { httpClient = new BaseHttpClient_1.BaseHttpClient() } = params;
        return new BlockchairApi(httpClient.withBaseUrl(`https://api.blockchair.com/${blockchain}`), params.apiToken);
    }
    constructor(client, apiToken) {
        this.client = client;
        this.apiToken = apiToken ?? process.env.BLOCKCHAIR_TOKEN;
    }
    get(path) {
        return this.client.get(path + (this.apiToken ? `?key=${this.apiToken}` : ''));
    }
    async getAddressInfo(address) {
        if (!address || address.length === 0) {
            throw new Error('invalid address');
        }
        // https://blockchair.com/api/docs#link_300
        return (await this.get(`/dashboards/address/${address}`)).map((body) => {
            return {
                txCount: body.data[address].address.transaction_count,
                balance: body.data[address].address.balance,
            };
        });
    }
    async getUnspentsForAddresses(addr) {
        if (addr.length > 100) {
            throw new Error(`invalid size`);
        }
        const response = await this.get(`/dashboards/addresses/${addr.join(',')}`);
        return response.map((body) => {
            return body.data.utxo
                .flatMap((unspent) => {
                if (addr.includes(unspent.address)) {
                    return {
                        id: formatOutputId({ txid: unspent.transaction_hash, vout: unspent.index }),
                        address: unspent.address,
                        value: unspent.value,
                    };
                }
                return undefined;
            })
                .filter((unspent) => unspent !== undefined);
        });
    }
    async getTransaction(txid) {
        return (await this.get(`/dashboards/transaction/${txid}`)).map((body) => {
            return unwrapRecord(body, txid);
        });
    }
    async getTransactionStatus(txid) {
        let transaction;
        try {
            transaction = (await this.getTransaction(txid)).transaction;
        }
        catch (e) {
            if (e instanceof ErrorKeyNotInResponse) {
                return { found: false };
            }
            throw e;
        }
        const { block_id, time } = transaction;
        const date = new Date(Date.parse(time.replace(' ', 'T') + '.000Z' /* force UTC parsing */));
        return block_id === -1
            ? { found: true, confirmed: false }
            : {
                found: true,
                confirmed: true,
                blockHeight: block_id,
                date,
            };
    }
    async getTransactionInputs(txid) {
        return (await this.getTransaction(txid)).inputs.map((i) => {
            return {
                id: formatOutputId({ txid: i.transaction_hash, vout: i.index }),
                address: i.recipient,
                value: i.value,
            };
        });
    }
    async getTransactionIO(txid) {
        const tx = await this.getTransaction(txid);
        const inputs = tx.inputs.map((input) => {
            return {
                address: input.recipient,
            };
        });
        const outputs = tx.outputs.map((output) => {
            return {
                address: output.recipient,
            };
        });
        return {
            inputs,
            outputs,
        };
    }
    async getTransactionSpends(txid) {
        return (await this.getTransaction(txid)).outputs.map((o) => o.spending_transaction_hash
            ? {
                txid: o.spending_transaction_hash,
                vin: o.spending_index,
            }
            : { txid: undefined, vin: undefined });
    }
    async getTransactionHex(txid) {
        return (await this.get(`/raw/transaction/${txid}`)).map((body) => {
            return unwrapRecord(body, txid).raw_transaction;
        });
    }
}
exports.BlockchairApi = BlockchairApi;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tjaGFpckFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbXBsL0Jsb2NrY2hhaXJBcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOENBQXdDO0FBQ3hDLHNEQUF5RTtBQUN6RSw4Q0FBdUQ7QUFNdkQsTUFBTSxjQUFjLEdBQUcsZ0JBQUssQ0FBQyxjQUFjLENBQUM7QUFRNUMsTUFBTSxxQkFBc0IsU0FBUSxLQUFLO0lBQ3ZDLFlBQVksR0FBVztRQUNyQixLQUFLLENBQUMsT0FBTyxHQUFHLGtCQUFrQixDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBRUQsU0FBUyxZQUFZLENBQUksSUFBaUMsRUFBRSxHQUFXO0lBQ3JFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUkscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBb0RELE1BQWEsYUFBYTtJQUd4QixNQUFNLENBQUMsT0FBTyxDQUFDLFFBQWdCLEVBQUUsU0FBeUQsRUFBRTtRQUMxRiwwQ0FBMEM7UUFDMUMsSUFBSSxVQUFVLENBQUM7UUFDZixRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLEtBQUssS0FBSztnQkFDUixVQUFVLEdBQUcsU0FBUyxDQUFDO2dCQUN2QixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULFVBQVUsR0FBRyxpQkFBaUIsQ0FBQztnQkFDL0IsTUFBTTtZQUNSLEtBQUssS0FBSztnQkFDUixVQUFVLEdBQUcsWUFBWSxDQUFDO2dCQUMxQixNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLFVBQVUsR0FBRyxjQUFjLENBQUM7Z0JBQzVCLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsVUFBVSxHQUFHLE9BQU8sQ0FBQztn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WUFDTixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBWTtRQUNyQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3pELENBQUMsQ0FBQyx5QkFBeUI7WUFDekIsQ0FBQyxDQUFDO2dCQUNFLElBQUksRUFBRSxDQUFDLENBQUMseUJBQXlCO2dCQUNqQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGNBQWM7YUFDdEI7WUFDSCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FDeEMsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBWTtRQUNsQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFxRCxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FDekcsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNQLE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDbEQsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFyS0Qsc0NBcUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYml0Z28gfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgQmFzZUh0dHBDbGllbnQsIEh0dHBDbGllbnQsIFJlc3BvbnNlIH0gZnJvbSAnLi4vQmFzZUh0dHBDbGllbnQnO1xuaW1wb3J0IHsgQXBpTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL0FwaUJ1aWxkZXInO1xuaW1wb3J0IHsgQWRkcmVzc0FwaSwgQWRkcmVzc0luZm8gfSBmcm9tICcuLi9BZGRyZXNzQXBpJztcbmltcG9ydCB7IE91dHB1dFNwZW5kLCBUcmFuc2FjdGlvbklPLCBVdHhvQXBpIH0gZnJvbSAnLi4vVXR4b0FwaSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0YXR1cyB9IGZyb20gJy4uL1RyYW5zYWN0aW9uQXBpJztcblxudHlwZSBVbnNwZW50ID0gYml0Z28uVW5zcGVudDtcbmNvbnN0IGZvcm1hdE91dHB1dElkID0gYml0Z28uZm9ybWF0T3V0cHV0SWQ7XG5cbnR5cGUgQmxvY2tjaGFpclJlc3BvbnNlPFQ+ID0ge1xuICBkYXRhOiBUO1xufTtcblxudHlwZSBCbG9ja2NoYWlyUmVjb3JkUmVzcG9uc2U8VD4gPSBCbG9ja2NoYWlyUmVzcG9uc2U8UmVjb3JkPHN0cmluZywgVD4+O1xuXG5jbGFzcyBFcnJvcktleU5vdEluUmVzcG9uc2UgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGtleTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYGtleSAke2tleX0gbm90IGluIHJlc3BvbnNlYCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW53cmFwUmVjb3JkPFQ+KGJvZHk6IEJsb2NrY2hhaXJSZWNvcmRSZXNwb25zZTxUPiwga2V5OiBzdHJpbmcpOiBUIHtcbiAgaWYgKCEoa2V5IGluIGJvZHkuZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JLZXlOb3RJblJlc3BvbnNlKGtleSk7XG4gIH1cbiAgcmV0dXJuIGJvZHkuZGF0YVtrZXldO1xufVxuXG4vLyBodHRwczovL2Jsb2NrY2hhaXIuY29tL2FwaS9kb2NzI2xpbmtfMzAwXG50eXBlIEJsb2NrY2hhaXJVbnNwZW50ID0ge1xuICB0cmFuc2FjdGlvbl9oYXNoOiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHJlY2lwaWVudDogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICBibG9ja19pZDogbnVtYmVyO1xuICBzY3JpcHRfaGV4OiBzdHJpbmc7XG4gIHNwZW5kaW5nX3RyYW5zYWN0aW9uX2hhc2g6IHN0cmluZztcbiAgc3BlbmRpbmdfaW5kZXg6IG51bWJlcjtcbiAgYWRkcmVzczogc3RyaW5nO1xufTtcblxuLy8gaHR0cHM6Ly9ibG9ja2NoYWlyLmNvbS9hcGkvZG9jcyNsaW5rXzMwMFxudHlwZSBCbG9ja2NoYWlyQWRkcmVzcyA9IHtcbiAgYWRkcmVzczoge1xuICAgIHRyYW5zYWN0aW9uX2hhc2g6IHN0cmluZztcbiAgICAvLyB2b3V0XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIGJsb2NrX2lkOiBudW1iZXI7XG4gICAgdHJhbnNhY3Rpb25fY291bnQ6IG51bWJlcjtcbiAgICBiYWxhbmNlOiBudW1iZXI7XG4gIH07XG4gIHV0eG86IEJsb2NrY2hhaXJVbnNwZW50W107XG59O1xuXG4vLyBodHRwczovL2Jsb2NrY2hhaXIuY29tL2FwaS9kb2NzI2xpbmtfMjAwXG50eXBlIEJsb2NrY2hhaXJUcmFuc2FjdGlvbiA9IHtcbiAgdHJhbnNhY3Rpb246IHtcbiAgICAvKipcbiAgICAgIFRoZSBibG9jayBudW1iZXIgaXQncyBpbmNsdWRlZCBpbi5cbiAgICAgIElmIHRoZSB0cmFuc2FjdGlvbiBpcyBpbiB0aGUgbWVtcG9vbCwgZGF0YS57Omhhc2h94bWiLnRyYW5zYWN0aW9uLmJsb2NrX2lkIHlpZWxkcyAtMVxuICAgICovXG4gICAgYmxvY2tfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBMaWtlIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZGF0ZS10aW1lLXN0cmluZy1mb3JtYXQgYnV0IHdpdGggYSBzcGFjZSBpbnN0ZWFkIG9mICdUJ1xuICAgICAqIFlZWVktTU0tREQgSEg6bW06c3NcbiAgICAgKi9cbiAgICB0aW1lOiBzdHJpbmc7XG4gIH07XG4gIGlucHV0czogQmxvY2tjaGFpclVuc3BlbnRbXTtcbiAgb3V0cHV0czogQmxvY2tjaGFpclVuc3BlbnRbXTtcbn07XG5cbi8vIGh0dHBzOi8vYmxvY2tjaGFpci5jb20vYXBpL2RvY3MjbGlua18yMDFcbnR5cGUgQmxvY2tjaGFpclJhd1RyYW5zYWN0aW9uID0ge1xuICByYXdfdHJhbnNhY3Rpb246IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBCbG9ja2NoYWlyQXBpIGltcGxlbWVudHMgQWRkcmVzc0FwaSwgVXR4b0FwaSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBhcGlUb2tlbj86IHN0cmluZztcblxuICBzdGF0aWMgZm9yQ29pbihjb2luTmFtZTogc3RyaW5nLCBwYXJhbXM6IHsgYXBpVG9rZW4/OiBzdHJpbmc7IGh0dHBDbGllbnQ/OiBIdHRwQ2xpZW50IH0gPSB7fSk6IEJsb2NrY2hhaXJBcGkge1xuICAgIC8vIGh0dHBzOi8vYmxvY2tjaGFpci5jb20vYXBpL2RvY3MjbGlua19NMFxuICAgIGxldCBibG9ja2NoYWluO1xuICAgIHN3aXRjaCAoY29pbk5hbWUpIHtcbiAgICAgIGNhc2UgJ2J0Yyc6XG4gICAgICAgIGJsb2NrY2hhaW4gPSAnYml0Y29pbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGJ0Yyc6XG4gICAgICAgIGJsb2NrY2hhaW4gPSAnYml0Y29pbi90ZXN0bmV0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdic3YnOlxuICAgICAgICBibG9ja2NoYWluID0gJ2JpdGNvaW4tc3YnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JjaCc6XG4gICAgICAgIGJsb2NrY2hhaW4gPSAnYml0Y29pbi1jYXNoJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdiY2hhJzpcbiAgICAgICAgYmxvY2tjaGFpbiA9ICdlY2FzaCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbHRjJzpcbiAgICAgICAgYmxvY2tjaGFpbiA9ICdsaXRlY29pbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGFzaCc6XG4gICAgICAgIGJsb2NrY2hhaW4gPSAnZGFzaCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZG9nZSc6XG4gICAgICAgIGJsb2NrY2hhaW4gPSAnZG9nZWNvaW4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3plYyc6XG4gICAgICAgIGJsb2NrY2hhaW4gPSAnemNhc2gnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBBcGlOb3RJbXBsZW1lbnRlZEVycm9yKGNvaW5OYW1lKTtcbiAgICB9XG4gICAgY29uc3QgeyBodHRwQ2xpZW50ID0gbmV3IEJhc2VIdHRwQ2xpZW50KCkgfSA9IHBhcmFtcztcbiAgICByZXR1cm4gbmV3IEJsb2NrY2hhaXJBcGkoaHR0cENsaWVudC53aXRoQmFzZVVybChgaHR0cHM6Ly9hcGkuYmxvY2tjaGFpci5jb20vJHtibG9ja2NoYWlufWApLCBwYXJhbXMuYXBpVG9rZW4pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIGNsaWVudDogSHR0cENsaWVudCwgYXBpVG9rZW4/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFwaVRva2VuID0gYXBpVG9rZW4gPz8gcHJvY2Vzcy5lbnYuQkxPQ0tDSEFJUl9UT0tFTjtcbiAgfVxuXG4gIGdldDxUPihwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoICsgKHRoaXMuYXBpVG9rZW4gPyBgP2tleT0ke3RoaXMuYXBpVG9rZW59YCA6ICcnKSk7XG4gIH1cblxuICBhc3luYyBnZXRBZGRyZXNzSW5mbyhhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPEFkZHJlc3NJbmZvPiB7XG4gICAgaWYgKCFhZGRyZXNzIHx8IGFkZHJlc3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWRkcmVzcycpO1xuICAgIH1cbiAgICAvLyBodHRwczovL2Jsb2NrY2hhaXIuY29tL2FwaS9kb2NzI2xpbmtfMzAwXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldDxCbG9ja2NoYWlyUmVjb3JkUmVzcG9uc2U8QmxvY2tjaGFpckFkZHJlc3M+PihgL2Rhc2hib2FyZHMvYWRkcmVzcy8ke2FkZHJlc3N9YCkpLm1hcChcbiAgICAgIChib2R5KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHhDb3VudDogYm9keS5kYXRhW2FkZHJlc3NdLmFkZHJlc3MudHJhbnNhY3Rpb25fY291bnQsXG4gICAgICAgICAgYmFsYW5jZTogYm9keS5kYXRhW2FkZHJlc3NdLmFkZHJlc3MuYmFsYW5jZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXMoYWRkcjogc3RyaW5nW10pOiBQcm9taXNlPFVuc3BlbnRbXT4ge1xuICAgIGlmIChhZGRyLmxlbmd0aCA+IDEwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHNpemVgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0PEJsb2NrY2hhaXJSZXNwb25zZTx7IHV0eG86IEJsb2NrY2hhaXJVbnNwZW50W10gfT4+KFxuICAgICAgYC9kYXNoYm9hcmRzL2FkZHJlc3Nlcy8ke2FkZHIuam9pbignLCcpfWBcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlLm1hcCgoYm9keSkgPT4ge1xuICAgICAgcmV0dXJuIGJvZHkuZGF0YS51dHhvXG4gICAgICAgIC5mbGF0TWFwKCh1bnNwZW50KTogVW5zcGVudCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgaWYgKGFkZHIuaW5jbHVkZXModW5zcGVudC5hZGRyZXNzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWQ6IGZvcm1hdE91dHB1dElkKHsgdHhpZDogdW5zcGVudC50cmFuc2FjdGlvbl9oYXNoLCB2b3V0OiB1bnNwZW50LmluZGV4IH0pLFxuICAgICAgICAgICAgICBhZGRyZXNzOiB1bnNwZW50LmFkZHJlc3MsXG4gICAgICAgICAgICAgIHZhbHVlOiB1bnNwZW50LnZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigodW5zcGVudCk6IHVuc3BlbnQgaXMgVW5zcGVudCA9PiB1bnNwZW50ICE9PSB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24odHhpZDogc3RyaW5nKTogUHJvbWlzZTxCbG9ja2NoYWlyVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0PEJsb2NrY2hhaXJSZWNvcmRSZXNwb25zZTxCbG9ja2NoYWlyVHJhbnNhY3Rpb24+PihgL2Rhc2hib2FyZHMvdHJhbnNhY3Rpb24vJHt0eGlkfWApKS5tYXAoXG4gICAgICAoYm9keSkgPT4ge1xuICAgICAgICByZXR1cm4gdW53cmFwUmVjb3JkKGJvZHksIHR4aWQpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRUcmFuc2FjdGlvblN0YXR1cyh0eGlkOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uU3RhdHVzPiB7XG4gICAgbGV0IHRyYW5zYWN0aW9uO1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvbiA9IChhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uKHR4aWQpKS50cmFuc2FjdGlvbjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yS2V5Tm90SW5SZXNwb25zZSkge1xuICAgICAgICByZXR1cm4geyBmb3VuZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnN0IHsgYmxvY2tfaWQsIHRpbWUgfSA9IHRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKHRpbWUucmVwbGFjZSgnICcsICdUJykgKyAnLjAwMFonIC8qIGZvcmNlIFVUQyBwYXJzaW5nICovKSk7XG4gICAgcmV0dXJuIGJsb2NrX2lkID09PSAtMVxuICAgICAgPyB7IGZvdW5kOiB0cnVlLCBjb25maXJtZWQ6IGZhbHNlIH1cbiAgICAgIDoge1xuICAgICAgICAgIGZvdW5kOiB0cnVlLFxuICAgICAgICAgIGNvbmZpcm1lZDogdHJ1ZSxcbiAgICAgICAgICBibG9ja0hlaWdodDogYmxvY2tfaWQsXG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uSW5wdXRzKHR4aWQ6IHN0cmluZyk6IFByb21pc2U8VW5zcGVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uKHR4aWQpKS5pbnB1dHMubWFwKChpKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogZm9ybWF0T3V0cHV0SWQoeyB0eGlkOiBpLnRyYW5zYWN0aW9uX2hhc2gsIHZvdXQ6IGkuaW5kZXggfSksXG4gICAgICAgIGFkZHJlc3M6IGkucmVjaXBpZW50LFxuICAgICAgICB2YWx1ZTogaS52YWx1ZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRUcmFuc2FjdGlvbklPKHR4aWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25JTz4ge1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbih0eGlkKTtcbiAgICBjb25zdCBpbnB1dHMgPSB0eC5pbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkcmVzczogaW5wdXQucmVjaXBpZW50LFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBvdXRwdXRzID0gdHgub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkcmVzczogb3V0cHV0LnJlY2lwaWVudCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uU3BlbmRzKHR4aWQ6IHN0cmluZyk6IFByb21pc2U8T3V0cHV0U3BlbmRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbih0eGlkKSkub3V0cHV0cy5tYXAoKG8pID0+XG4gICAgICBvLnNwZW5kaW5nX3RyYW5zYWN0aW9uX2hhc2hcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eGlkOiBvLnNwZW5kaW5nX3RyYW5zYWN0aW9uX2hhc2gsXG4gICAgICAgICAgICB2aW46IG8uc3BlbmRpbmdfaW5kZXgsXG4gICAgICAgICAgfVxuICAgICAgICA6IHsgdHhpZDogdW5kZWZpbmVkLCB2aW46IHVuZGVmaW5lZCB9XG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uSGV4KHR4aWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldDxCbG9ja2NoYWlyUmVjb3JkUmVzcG9uc2U8QmxvY2tjaGFpclJhd1RyYW5zYWN0aW9uPj4oYC9yYXcvdHJhbnNhY3Rpb24vJHt0eGlkfWApKS5tYXAoXG4gICAgICAoYm9keSkgPT4ge1xuICAgICAgICByZXR1cm4gdW53cmFwUmVjb3JkKGJvZHksIHR4aWQpLnJhd190cmFuc2FjdGlvbjtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iXX0=

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


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