PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-sol/dist/src/lib

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

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.StakingRawMsgAuthorizeBuilder = void 0;
const sdk_core_1 = require("@bitgo/sdk-core");
const transaction_1 = require("./transaction");
const web3_js_1 = require("@solana/web3.js");
const assert_1 = __importDefault(require("assert"));
const constants_1 = require("./constants");
class StakingRawMsgAuthorizeBuilder extends sdk_core_1.BaseTransactionBuilder {
    constructor(_coinConfig) {
        super(_coinConfig);
        this._transaction = new transaction_1.Transaction(_coinConfig);
    }
    get transactionType() {
        return sdk_core_1.TransactionType.StakingAuthorizeRaw;
    }
    /** @inheritdoc */
    initBuilder(tx) {
        if (this.validateTransaction(tx)) {
            this.transactionMessage(tx.solTransaction.serializeMessage().toString('base64'));
        }
    }
    /**
     * The raw message generated by Solana CLI.
     *
     * @param {string} msg msg generated by 'solana stake-authorize-check.
     * @returns {StakeBuilder} This staking builder.
     *
     */
    transactionMessage(msg) {
        this.validateMessage(msg);
        this._transactionMessage = msg;
        return this;
    }
    /** @inheritdoc */
    async buildImplementation() {
        (0, assert_1.default)(this._transactionMessage, 'missing transaction message');
        this.validateMessage(this._transactionMessage);
        const solTransaction = web3_js_1.Transaction.populate(web3_js_1.Message.from(Buffer.from(this._transactionMessage, 'base64')), []);
        // this is workaround for solana web3.js generate wrong signing message
        const serialized = solTransaction.serialize({ requireAllSignatures: false }).toString('base64');
        this.transaction.fromRawTransaction(serialized);
        this.transaction.setTransactionType(this.transactionType);
        (0, assert_1.default)(this._transactionMessage === this.transaction.signablePayload.toString('base64'), 'wrong signing message');
        return this.transaction;
    }
    validateTransaction(tx) {
        return this.validateMessage(tx.solTransaction.serializeMessage().toString('base64'));
    }
    async build() {
        return this.buildImplementation();
    }
    validateMessage(msg) {
        const tx = web3_js_1.Transaction.populate(web3_js_1.Message.from(Buffer.from(msg, 'base64')), []);
        const instructions = tx.instructions;
        if (instructions.length !== 2 && instructions.length !== 3) {
            throw new Error(`Invalid transaction, expected 2 instruction, got ${instructions.length}`);
        }
        for (const instruction of instructions) {
            switch (instruction.programId.toString()) {
                case web3_js_1.SystemProgram.programId.toString():
                    const instructionName = web3_js_1.SystemInstruction.decodeInstructionType(instruction);
                    if (instructionName !== constants_1.nonceAdvanceInstruction) {
                        throw new Error(`Invalid system instruction : ${instructionName}`);
                    }
                    break;
                case web3_js_1.StakeProgram.programId.toString():
                    const data = instruction.data.toString('hex');
                    if (data !== constants_1.validInstructionData && data !== constants_1.validInstructionData2) {
                        throw new Error(`Invalid staking instruction data: ${data}`);
                    }
                    break;
                default:
                    throw new Error(`Invalid transaction, instruction program id not supported: ${instruction.programId.toString()}`);
            }
        }
        return true;
    }
    fromImplementation(rawTransaction) {
        const tx = new transaction_1.Transaction(this._coinConfig);
        tx.fromRawTransaction(rawTransaction);
        this.initBuilder(tx);
        return this.transaction;
    }
    signImplementation(key) {
        throw new sdk_core_1.NotSupported('Method not supported on this builder');
    }
    get transaction() {
        return this._transaction;
    }
    validateAddress(address, addressFormat) {
        throw new sdk_core_1.NotSupported('Method not supported on this builder');
    }
    validateKey(key) {
        throw new sdk_core_1.NotSupported('Method not supported on this builder');
    }
    validateRawTransaction(rawTransaction) {
        const tx = new transaction_1.Transaction(this._coinConfig);
        tx.fromRawTransaction(rawTransaction);
        this.validateTransaction(tx);
    }
    validateValue(value) {
        throw new sdk_core_1.NotSupported('Method not supported on this builder');
    }
}
exports.StakingRawMsgAuthorizeBuilder = StakingRawMsgAuthorizeBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1Jhd01zZ0F1dGhvcml6ZUJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3N0YWtpbmdSYXdNc2dBdXRob3JpemVCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLDhDQU95QjtBQUN6QiwrQ0FBNEM7QUFDNUMsNkNBTXlCO0FBRXpCLG9EQUE0QjtBQUU1QiwyQ0FBbUc7QUFFbkcsTUFBYSw2QkFBOEIsU0FBUSxpQ0FBc0I7SUFHdkUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHlCQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsbUJBQW1CLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixXQUFXLENBQUMsRUFBZTtRQUN6QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxrQkFBa0IsQ0FBQyxHQUFXO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxrQkFBa0I7SUFDUixLQUFLLENBQUMsbUJBQW1CO1FBQ2pDLElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUVoRSxJQUFJLENBQUMsZUFBZSxD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QUFrQixDQUFDLGNBQXNCO1FBQ2pELE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsRUFBRSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxHQUFZO1FBQ3ZDLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELElBQWMsV0FBVztRQUN2QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFvQixFQUFFLGFBQXNCO1FBQzFELE1BQU0sSUFBSSx1QkFBWSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFZO1FBQ3RCLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELHNCQUFzQixDQUFDLGNBQXNCO1FBQzNDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsRUFBRSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWdCO1FBQzVCLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNGO0FBdEhELHNFQXNIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQge1xuICBCYXNlQWRkcmVzcyxcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyLFxuICBOb3RTdXBwb3J0ZWQsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBUcmFuc2FjdGlvbiBhcyBTT0xUcmFuc2FjdGlvbixcbiAgTWVzc2FnZSBhcyBTT0xNZXNzYWdlLFxuICBTeXN0ZW1Qcm9ncmFtLFxuICBTeXN0ZW1JbnN0cnVjdGlvbixcbiAgU3Rha2VQcm9ncmFtLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBub25jZUFkdmFuY2VJbnN0cnVjdGlvbiwgdmFsaWRJbnN0cnVjdGlvbkRhdGEsIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMiB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIFN0YWtpbmdSYXdNc2dBdXRob3JpemVCdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBwcm90ZWN0ZWQgX3RyYW5zYWN0aW9uTWVzc2FnZTogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXc7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvbih0eCkpIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25NZXNzYWdlKHR4LnNvbFRyYW5zYWN0aW9uLnNlcmlhbGl6ZU1lc3NhZ2UoKS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmF3IG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IFNvbGFuYSBDTEkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgbXNnIGdlbmVyYXRlZCBieSAnc29sYW5hIHN0YWtlLWF1dGhvcml6ZS1jaGVjay5cbiAgICogQHJldHVybnMge1N0YWtlQnVpbGRlcn0gVGhpcyBzdGFraW5nIGJ1aWxkZXIuXG4gICAqXG4gICAqL1xuICB0cmFuc2FjdGlvbk1lc3NhZ2UobXNnOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlTWVzc2FnZShtc2cpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uTWVzc2FnZSA9IG1zZztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgYXNzZXJ0KHRoaXMuX3RyYW5zYWN0aW9uTWVzc2FnZSwgJ21pc3NpbmcgdHJhbnNhY3Rpb24gbWVzc2FnZScpO1xuXG4gICAgdGhpcy52YWxpZGF0ZU1lc3NhZ2UodGhpcy5fdHJhbnNhY3Rpb25NZXNzYWdlKTtcbiAgICBjb25zdCBzb2xUcmFuc2FjdGlvbiA9IFNPTFRyYW5zYWN0aW9uLnBvcHVsYXRlKFxuICAgICAgU09MTWVzc2FnZS5mcm9tKEJ1ZmZlci5mcm9tKHRoaXMuX3RyYW5zYWN0aW9uTWVzc2FnZSwgJ2Jhc2U2NCcpKSxcbiAgICAgIFtdXG4gICAgKTtcbiAgICAvLyB0aGlzIGlzIHdvcmthcm91bmQgZm9yIHNvbGFuYSB3ZWIzLmpzIGdlbmVyYXRlIHdyb25nIHNpZ25pbmcgbWVzc2FnZVxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzb2xUcmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uZnJvbVJhd1RyYW5zYWN0aW9uKHNlcmlhbGl6ZWQpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcbiAgICBhc3NlcnQodGhpcy5fdHJhbnNhY3Rpb25NZXNzYWdlID09PSB0aGlzLnRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnYmFzZTY0JyksICd3cm9uZyBzaWduaW5nIG1lc3NhZ2UnKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHg6IFRyYW5zYWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVNZXNzYWdlKHR4LnNvbFRyYW5zYWN0aW9uLnNlcmlhbGl6ZU1lc3NhZ2UoKS50b1N0cmluZygnYmFzZTY0JykpO1xuICB9XG5cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZU1lc3NhZ2UobXNnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB0eCA9IFNPTFRyYW5zYWN0aW9uLnBvcHVsYXRlKFNPTE1lc3NhZ2UuZnJvbShCdWZmZXIuZnJvbShtc2csICdiYXNlNjQnKSksIFtdKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC5pbnN0cnVjdGlvbnM7XG4gICAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggIT09IDIgJiYgaW5zdHJ1Y3Rpb25zLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRyYW5zYWN0aW9uLCBleHBlY3RlZCAyIGluc3RydWN0aW9uLCBnb3QgJHtpbnN0cnVjdGlvbnMubGVuZ3RofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgICAgc3dpdGNoIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgICAgICBjYXNlIFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk6XG4gICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25OYW1lICE9PSBub25jZUFkdmFuY2VJbnN0cnVjdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN5c3RlbSBpbnN0cnVjdGlvbiA6ICR7aW5zdHJ1Y3Rpb25OYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk6XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgIGlmIChkYXRhICE9PSB2YWxpZEluc3RydWN0aW9uRGF0YSAmJiBkYXRhICE9PSB2YWxpZEluc3RydWN0aW9uRGF0YTIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdGFraW5nIGluc3RydWN0aW9uIGRhdGE6ICR7ZGF0YX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHByb2dyYW0gaWQgbm90IHN1cHBvcnRlZDogJHtpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZyk7XG4gICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0aGlzLmluaXRCdWlsZGVyKHR4KTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaWduSW1wbGVtZW50YXRpb24oa2V5OiBCYXNlS2V5KTogQmFzZVRyYW5zYWN0aW9uIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdNZXRob2Qgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGJ1aWxkZXInKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBCYXNlQWRkcmVzcywgYWRkcmVzc0Zvcm1hdD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ01ldGhvZCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYnVpbGRlcicpO1xuICB9XG5cbiAgdmFsaWRhdGVLZXkoa2V5OiBCYXNlS2V5KTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnTWV0aG9kIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBidWlsZGVyJyk7XG4gIH1cblxuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnKTtcbiAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvbih0eCk7XG4gIH1cblxuICB2YWxpZGF0ZVZhbHVlKHZhbHVlOiBCaWdOdW1iZXIpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdNZXRob2Qgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGJ1aWxkZXInKTtcbiAgfVxufVxuIl19

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


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