PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-core/dist/src/bitgo/walletUtil

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

"use strict";
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.MidnightMessageProvider = exports.MIDNIGHT_TNC_HASH = void 0;
exports.bulkSignBip322MidnightMessages = bulkSignBip322MidnightMessages;
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const environments_1 = require("../environments");
const NUM_MESSAGES_PER_QUERY = 1000;
exports.MIDNIGHT_TNC_HASH = '31a6bab50a84b8439adcfb786bb2020f6807e6e8fda629b424110fc7bb1c6b8b';
/**
 * The Midnight drop service can return up to 1000 messages per request. However, UTXO coins
 * can only have a maximum of 200 messages per transaction. We make this wrapper function that
 * handles the pagination and batching of messages, keeping a local cache of the unprocessed messages.
 */
class MidnightMessageProvider {
    constructor(wallet, destinationAddress) {
        this.wallet = wallet;
        this.destinationAddress = destinationAddress;
        this.ranOnce = false;
        this.unprocessedMessagesCache = [];
        this.network = utxolib.networks[wallet.coin()];
        this.midnightClaimUrl = `${environments_1.Environments[wallet.bitgo.env].uri}/api/airdrop-claim/v1/midnight/claims/${wallet.coin()}/${wallet.id()}`;
        this.numMessagesPerTransaction = wallet.bitgo.env === 'prod' ? 200 : 4;
    }
    async getMessagesAndAddressesToSign() {
        if (this.unprocessedMessagesCache.length > 0) {
            return this.unprocessedMessagesCache.splice(0, this.numMessagesPerTransaction);
        }
        else if (this.unprocessedMessagesCache.length === 0 && this.ranOnce && this.prevId === undefined) {
            return [];
        }
        this.ranOnce = true;
        const query = {
            status: 'UNINITIATED',
            limit: NUM_MESSAGES_PER_QUERY,
        };
        if (this.prevId !== undefined) {
            query.prevId = this.prevId;
        }
        const response = await this.wallet.bitgo.get(this.midnightClaimUrl).query(query).result();
        if (response.status !== 'success') {
            throw new Error(`Unexpected status code ${response.status} from ${this.midnightClaimUrl}`);
        }
        if (response?.pagination?.hasNext) {
            this.prevId = response?.pagination?.nextPrevId;
        }
        else {
            this.prevId = undefined;
        }
        this.unprocessedMessagesCache = response.claims.map((claim) => {
            if (!claim.originAddress) {
                throw new Error(`Claim ${JSON.stringify(claim)} is missing originAddress`);
            }
            return {
                // Midnight claim message format
                message: `STAR ${claim.allocationAmount} to ${this.destinationAddress} ${exports.MIDNIGHT_TNC_HASH}`,
                address: claim.originAddress,
            };
        });
        const toReturn = this.unprocessedMessagesCache.splice(0, this.numMessagesPerTransaction);
        return toReturn;
    }
}
exports.MidnightMessageProvider = MidnightMessageProvider;
/**
 * Bulk signs BIP322 messages for the Midnight airdrop.
 * @param wallet The wallet to sign the messages with.
 * @param destinationAddress The ADA address the rewards will get sent to
 * @param walletPassphrase (Optional) The wallet passphrase of the wallet
 */
async function bulkSignBip322MidnightMessages(wallet, destinationAddress, walletPassphrase) {
    const provider = new MidnightMessageProvider(wallet, destinationAddress);
    return bulkSignBip322MessagesWithProvider(provider, wallet, walletPassphrase);
}
async function bulkSignBip322MessagesWithProvider(provider, wallet, walletPassphrase) {
    let numMessages = 0;
    let messages = await provider.getMessagesAndAddressesToSign();
    const sendingFunction = wallet.type() === 'cold' ? wallet.prebuildTransaction : wallet.sendMany;
    const transactions = [];
    while (messages.length > 0) {
        // Sign the messages with the wallet
        const result = await sendingFunction.call(wallet, {
            messages,
            // Recipients must be empty
            recipients: [],
            // txFormat must be psbt
            txFormat: 'psbt',
            // Pass in the optional wallet passphrase
            walletPassphrase,
            offlineVerification: wallet.type() === 'cold',
        });
        transactions.push(result);
        numMessages += messages.length;
        messages = await provider.getMessagesAndAddressesToSign();
    }
    return { success: true, numMessages, transactions };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXR4b01lc3NhZ2VQcm9vZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXRVdGlsL3V0eG9NZXNzYWdlUHJvb2YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0dBLHdFQU9DO0FBN0dELHlEQUEyQztBQUczQyxrREFBK0M7QUFFL0MsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFDdkIsUUFBQSxpQkFBaUIsR0FBRyxrRUFBa0UsQ0FBQztBQTRCcEc7Ozs7R0FJRztBQUNILE1BQWEsdUJBQXVCO0lBUWxDLFlBQW9CLE1BQWUsRUFBVSxrQkFBMEI7UUFBbkQsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUFVLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBUTtRQUg3RCxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBSXhCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUN0QiwyQkFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDakMseUNBQXlDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4RSxJQUFJLENBQUMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsS0FBSyxDQUFDLDZCQUE2QjtRQUNqQyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0Ms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LENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2hHLE1BQU0sWUFBWSxHQUE4QixFQUFFLENBQUM7SUFDbkQsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNCLG9DQUFvQztRQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hELFFBQVE7WUFDUiwyQkFBMkI7WUFDM0IsVUFBVSxFQUFFLEVBQUU7WUFDZCx3QkFBd0I7WUFDeEIsUUFBUSxFQUFFLE1BQU07WUFDaEIseUNBQXlDO1lBQ3pDLGdCQUFnQjtZQUNoQixtQkFBbUIsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssTUFBTTtTQUM5QyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLFdBQVcsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLFFBQVEsR0FBRyxNQUFNLFFBQVEsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcblxuaW1wb3J0IHsgSVdhbGxldCB9IGZyb20gJy4uL3dhbGxldC9pV2FsbGV0JztcbmltcG9ydCB7IEVudmlyb25tZW50cyB9IGZyb20gJy4uL2Vudmlyb25tZW50cyc7XG5cbmNvbnN0IE5VTV9NRVNTQUdFU19QRVJfUVVFUlkgPSAxMDAwO1xuZXhwb3J0IGNvbnN0IE1JRE5JR0hUX1ROQ19IQVNIID0gJzMxYTZiYWI1MGE4NGI4NDM5YWRjZmI3ODZiYjIwMjBmNjgwN2U2ZThmZGE2MjliNDI0MTEwZmM3YmIxYzZiOGInO1xuXG50eXBlIE1lc3NhZ2VJbmZvID0ge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGFkZHJlc3M6IHN0cmluZztcbn07XG5cbnR5cGUgQ2xhaW0gPSB7XG4gIG9yaWdpbldhbGxldElkOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBvcmlnaW5BZGRyZXNzPzogc3RyaW5nO1xuICBhbGxvY2F0aW9uQW1vdW50OiBzdHJpbmc7XG59O1xuXG50eXBlIEJ1bGtNZXNzYWdlUmVzcG9uc2UgPSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG51bU1lc3NhZ2VzOiBudW1iZXI7XG4gIHRyYW5zYWN0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm92aWRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlcyBhbmQgYWRkcmVzc2VzIHRoYXQgd2Ugd2FudCB0byBzaWduLiBXZSBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmVcbiAgICogbWVzc2FnZXMuIElmIHRoZXJlIGFyZSBubyBtb3JlIG1lc3NhZ2VzLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4gTm90ZSB0aGF0IHdlIG9ubHkgcmV0dXJuIG1lc3NhZ2VzIGluIHNldHMgb2YgMjAwLlxuICAgKi9cbiAgZ2V0TWVzc2FnZXNBbmRBZGRyZXNzZXNUb1NpZ24oKTogUHJvbWlzZTxNZXNzYWdlSW5mb1tdPjtcbn1cblxuLyoqXG4gKiBUaGUgTWlkbmlnaHQgZHJvcCBzZXJ2aWNlIGNhbiByZXR1cm4gdXAgdG8gMTAwMCBtZXNzYWdlcyBwZXIgcmVxdWVzdC4gSG93ZXZlciwgVVRYTyBjb2luc1xuICogY2FuIG9ubHkgaGF2ZSBhIG1heGltdW0gb2YgMjAwIG1lc3NhZ2VzIHBlciB0cmFuc2FjdGlvbi4gV2UgbWFrZSB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gdGhhdFxuICogaGFuZGxlcyB0aGUgcGFnaW5hdGlvbiBhbmQgYmF0Y2hpbmcgb2YgbWVzc2FnZXMsIGtlZXBpbmcgYSBsb2NhbCBjYWNoZSBvZiB0aGUgdW5wcm9jZXNzZWQgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNaWRuaWdodE1lc3NhZ2VQcm92aWRlciBpbXBsZW1lbnRzIElNZXNzYWdlUHJvdmlkZXIge1xuICBwcm90ZWN0ZWQgdW5wcm9jZXNzZWRNZXNzYWdlc0NhY2hlOiBNZXNzYWdlSW5mb1tdO1xuICBwcm90ZWN0ZWQgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrO1xuICBwcm90ZWN0ZWQgbWlkbmlnaHRDbGFpbVVybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcHJldklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByYW5PbmNlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgbnVtTWVzc2FnZXNQZXJUcmFuc2FjdGlvbjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgd2FsbGV0OiBJV2FsbGV0LCBwcml2YXRlIGRlc3RpbmF0aW9uQWRkcmVzczogc3RyaW5nKSB7XG4gICAgdGhpcy51bnByb2Nlc3NlZE1lc3NhZ2VzQ2FjaGUgPSBbXTtcbiAgICB0aGlzLm5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzW3dhbGxldC5jb2luKCldO1xuICAgIHRoaXMubWlkbmlnaHRDbGFpbVVybCA9IGAke1xuICAgICAgRW52aXJvbm1lbnRzW3dhbGxldC5iaXRnby5lbnZdLnVyaVxuICAgIH0vYXBpL2FpcmRyb3AtY2xhaW0vdjEvbWlkbmlnaHQvY2xhaW1zLyR7d2FsbGV0LmNvaW4oKX0vJHt3YWxsZXQuaWQoKX1gO1xuICAgIHRoaXMubnVtTWVzc2FnZXNQZXJUcmFuc2FjdGlvbiA9IHdhbGxldC5iaXRnby5lbnYgPT09ICdwcm9kJyA/IDIwMCA6IDQ7XG4gIH1cblxuICBhc3luYyBnZXRNZXNzYWdlc0FuZEFkZHJlc3Nlc1RvU2lnbigpOiBQcm9taXNlPE1lc3NhZ2VJbmZvW10+IHtcbiAgICBpZiAodGhpcy51bnByb2Nlc3NlZE1lc3NhZ2VzQ2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMudW5wcm9jZXNzZWRNZXNzYWdlc0NhY2hlLnNwbGljZSgwLCB0aGlzLm51bU1lc3NhZ2VzUGVyVHJhbnNhY3Rpb24pO1xuICAgIH0gZWxzZSBpZiAodGhpcy51bnByb2Nlc3NlZE1lc3NhZ2VzQ2FjaGUubGVuZ3RoID09PSAwICYmIHRoaXMucmFuT25jZSAmJiB0aGlzLnByZXZJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdGhpcy5yYW5PbmNlID0gdHJ1ZTtcbiAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBzdGF0dXM6ICdVTklOSVRJQVRFRCcsXG4gICAgICBsaW1pdDogTlVNX01FU1NBR0VTX1BFUl9RVUVSWSxcbiAgICB9O1xuICAgIGlmICh0aGlzLnByZXZJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBxdWVyeS5wcmV2SWQgPSB0aGlzLnByZXZJZDtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLndhbGxldC5iaXRnby5nZXQodGhpcy5taWRuaWdodENsYWltVXJsKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc3RhdHVzIGNvZGUgJHtyZXNwb25zZS5zdGF0dXN9IGZyb20gJHt0aGlzLm1pZG5pZ2h0Q2xhaW1Vcmx9YCk7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZT8ucGFnaW5hdGlvbj8uaGFzTmV4dCkge1xuICAgICAgdGhpcy5wcmV2SWQgPSByZXNwb25zZT8ucGFnaW5hdGlvbj8ubmV4dFByZXZJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmV2SWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy51bnByb2Nlc3NlZE1lc3NhZ2VzQ2FjaGUgPSByZXNwb25zZS5jbGFpbXMubWFwKChjbGFpbTogQ2xhaW0pID0+IHtcbiAgICAgIGlmICghY2xhaW0ub3JpZ2luQWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENsYWltICR7SlNPTi5zdHJpbmdpZnkoY2xhaW0pfSBpcyBtaXNzaW5nIG9yaWdpbkFkZHJlc3NgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIE1pZG5pZ2h0IGNsYWltIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IGBTVEFSICR7Y2xhaW0uYWxsb2NhdGlvbkFtb3VudH0gdG8gJHt0aGlzLmRlc3RpbmF0aW9uQWRkcmVzc30gJHtNSUROSUdIVF9UTkNfSEFTSH1gLFxuICAgICAgICBhZGRyZXNzOiBjbGFpbS5vcmlnaW5BZGRyZXNzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCB0b1JldHVybiA9IHRoaXMudW5wcm9jZXNzZWRNZXNzYWdlc0NhY2hlLnNwbGljZSgwLCB0aGlzLm51bU1lc3NhZ2VzUGVyVHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiB0b1JldHVybjtcbiAgfVxufVxuXG4vKipcbiAqIEJ1bGsgc2lnbnMgQklQMzIyIG1lc3NhZ2VzIGZvciB0aGUgTWlkbmlnaHQgYWlyZHJvcC5cbiAqIEBwYXJhbSB3YWxsZXQgVGhlIHdhbGxldCB0byBzaWduIHRoZSBtZXNzYWdlcyB3aXRoLlxuICogQHBhcmFtIGRlc3RpbmF0aW9uQWRkcmVzcyBUaGUgQURBIGFkZHJlc3MgdGhlIHJld2FyZHMgd2lsbCBnZXQgc2VudCB0b1xuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgKE9wdGlvbmFsKSBUaGUgd2FsbGV0IHBhc3NwaHJhc2Ugb2YgdGhlIHdhbGxldFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVsa1NpZ25CaXAzMjJNaWRuaWdodE1lc3NhZ2VzKFxuICB3YWxsZXQ6IElXYWxsZXQsXG4gIGRlc3RpbmF0aW9uQWRkcmVzczogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nXG4pOiBQcm9taXNlPEJ1bGtNZXNzYWdlUmVzcG9uc2U+IHtcbiAgY29uc3QgcHJvdmlkZXIgPSBuZXcgTWlkbmlnaHRNZXNzYWdlUHJvdmlkZXIod2FsbGV0LCBkZXN0aW5hdGlvbkFkZHJlc3MpO1xuICByZXR1cm4gYnVsa1NpZ25CaXAzMjJNZXNzYWdlc1dpdGhQcm92aWRlcihwcm92aWRlciwgd2FsbGV0LCB3YWxsZXRQYXNzcGhyYXNlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVsa1NpZ25CaXAzMjJNZXNzYWdlc1dpdGhQcm92aWRlcihcbiAgcHJvdmlkZXI6IElNZXNzYWdlUHJvdmlkZXIsXG4gIHdhbGxldDogSVdhbGxldCxcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZ1xuKTogUHJvbWlzZTxCdWxrTWVzc2FnZVJlc3BvbnNlPiB7XG4gIGxldCBudW1NZXNzYWdlcyA9IDA7XG4gIGxldCBtZXNzYWdlczogTWVzc2FnZUluZm9bXSA9IGF3YWl0IHByb3ZpZGVyLmdldE1lc3NhZ2VzQW5kQWRkcmVzc2VzVG9TaWduKCk7XG4gIGNvbnN0IHNlbmRpbmdGdW5jdGlvbiA9IHdhbGxldC50eXBlKCkgPT09ICdjb2xkJyA/IHdhbGxldC5wcmVidWlsZFRyYW5zYWN0aW9uIDogd2FsbGV0LnNlbmRNYW55O1xuICBjb25zdCB0cmFuc2FjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcbiAgd2hpbGUgKG1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAvLyBTaWduIHRoZSBtZXNzYWdlcyB3aXRoIHRoZSB3YWxsZXRcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZW5kaW5nRnVuY3Rpb24uY2FsbCh3YWxsZXQsIHtcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgLy8gUmVjaXBpZW50cyBtdXN0IGJlIGVtcHR5XG4gICAgICByZWNpcGllbnRzOiBbXSxcbiAgICAgIC8vIHR4Rm9ybWF0IG11c3QgYmUgcHNidFxuICAgICAgdHhGb3JtYXQ6ICdwc2J0JyxcbiAgICAgIC8vIFBhc3MgaW4gdGhlIG9wdGlvbmFsIHdhbGxldCBwYXNzcGhyYXNlXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgb2ZmbGluZVZlcmlmaWNhdGlvbjogd2FsbGV0LnR5cGUoKSA9PT0gJ2NvbGQnLFxuICAgIH0pO1xuICAgIHRyYW5zYWN0aW9ucy5wdXNoKHJlc3VsdCk7XG4gICAgbnVtTWVzc2FnZXMgKz0gbWVzc2FnZXMubGVuZ3RoO1xuICAgIG1lc3NhZ2VzID0gYXdhaXQgcHJvdmlkZXIuZ2V0TWVzc2FnZXNBbmRBZGRyZXNzZXNUb1NpZ24oKTtcbiAgfVxuICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBudW1NZXNzYWdlcywgdHJhbnNhY3Rpb25zIH07XG59XG4iXX0=

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


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