PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-algo/dist/test/unit/lib/transactionBuilder

Просмотр файла: transferBuilder.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;
    };
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const crypto_1 = __importDefault(require("crypto"));
const algosdk_1 = __importDefault(require("algosdk"));
const statics_1 = require("@bitgo/statics");
const assert_1 = __importDefault(require("assert"));
const should_1 = __importDefault(require("should"));
const sinon_1 = __importStar(require("sinon"));
const lib_1 = require("../../../../src/lib");
const AlgoResources = __importStar(require("../../../fixtures/resources"));
describe('Algo Transfer Builder', () => {
    let builder;
    const sender = AlgoResources.accounts.account1;
    const receiver = AlgoResources.accounts.account2;
    const { networks: { testnet }, } = AlgoResources;
    const { genesisHash, genesisID } = testnet;
    beforeEach(() => {
        const config = statics_1.coins.get('algo');
        builder = new lib_1.TransferBuilder(config);
    });
    describe('setter validation', () => {
        it('should validate receiver address is a valid algo address', () => {
            const spy = sinon_1.default.spy(builder, 'validateAddress');
            assert_1.default.throws(() => builder.to({ address: 'wrong-addr' }), (e) => e.name === lib_1.AddressValidationError.name);
            should_1.default.doesNotThrow(() => builder.to({ address: sender.address }));
            sinon_1.assert.calledTwice(spy);
        });
        it('should validate transfer amount', () => {
            const spy = sinon_1.default.spy(builder, 'validateValue');
            assert_1.default.throws(() => builder.amount(-1), (e) => e.message === 'Value cannot be less than zero');
            should_1.default.doesNotThrow(() => builder.amount(1000));
            sinon_1.assert.calledTwice(spy);
        });
    });
    describe('build transfer transaction', () => {
        it('should build a transfer transaction', async () => {
            builder
                .sender({ address: sender.address })
                .to({ address: receiver.address })
                .amount(10000)
                .isFlatFee(true)
                .fee({ fee: '22000' })
                .firstRound(1)
                .lastRound(100)
                .testnet()
                .numberOfSigners(1)
                .sign({ key: sender.prvKey });
            const tx = await builder.build();
            const txJson = tx.toJson();
            should_1.default.deepEqual(txJson.from, sender.address);
            should_1.default.deepEqual(txJson.to, receiver.address);
            should_1.default.deepEqual(txJson.fee, 22000);
            should_1.default.deepEqual(txJson.amount, '10000');
            should_1.default.deepEqual(txJson.firstRound, 1);
            should_1.default.deepEqual(txJson.lastRound, 100);
            should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
            should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
        });
        it('should build an unsigned transfer transaction', async () => {
            const lease = new Uint8Array(crypto_1.default.randomBytes(32));
            const note = new Uint8Array(Buffer.from('note', 'utf-8'));
            builder
                .sender({ address: sender.address })
                .to({ address: receiver.address })
                .closeRemainderTo({ address: AlgoResources.accounts.account3.address })
                .amount(10000)
                .isFlatFee(true)
                .fee({ fee: '22000' })
                .firstRound(1)
                .lastRound(100)
                .lease(lease)
                .note(note)
                .testnet();
            const tx = await builder.build();
            const txJson = tx.toJson();
            should_1.default.deepEqual(txJson.from, sender.address);
            should_1.default.deepEqual(txJson.to, receiver.address);
            should_1.default.deepEqual(txJson.amount, '10000');
            should_1.default.deepEqual(txJson.firstRound, 1);
            should_1.default.deepEqual(txJson.lastRound, 100);
            should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
            should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
        });
        it('should build from raw unsigned tx', async () => {
            builder.from(AlgoResources.rawTx.transfer.unsigned);
            const tx = await builder.build();
            const txJson = tx.toJson();
            should_1.default.deepEqual(Buffer.from(tx.toBroadcastFormat()).toString('hex'), AlgoResources.rawTx.transfer.unsigned);
            should_1.default.deepEqual(txJson.from, sender.address);
            should_1.default.deepEqual(txJson.to, receiver.address);
            should_1.default.deepEqual(txJson.amount, '10000');
            should_1.default.deepEqual(txJson.firstRound, 1);
            should_1.default.deepEqual(txJson.lastRound, 100);
        });
        it('should build from raw signed tx', async () => {
            builder.from(AlgoResources.rawTx.transfer.signed);
            builder.numberOfSigners(1);
            builder.sign({ key: sender.prvKey });
            const tx = await builder.build();
            const txJson = tx.toJson();
            should_1.default.deepEqual(Buffer.from(tx.toBroadcastFormat()).toString('hex'), AlgoResources.rawTx.transfer.signed);
            should_1.default.deepEqual(txJson.from, sender.address);
            should_1.default.deepEqual(txJson.to, receiver.address);
            should_1.default.deepEqual(txJson.amount, '10000');
            should_1.default.deepEqual(txJson.firstRound, 1);
            should_1.default.deepEqual(txJson.lastRound, 100);
        });
        it('should sign from raw unsigned tx', async () => {
            builder.from(AlgoResources.rawTx.transfer.unsigned);
            builder.numberOfSigners(1);
            builder.sign({ key: sender.prvKey });
            const tx = await builder.build();
            should_1.default.deepEqual(Buffer.from(tx.toBroadcastFormat()).toString('hex'), AlgoResources.rawTx.transfer.signed);
            const txJson = tx.toJson();
            should_1.default.deepEqual(txJson.from, sender.address);
            should_1.default.deepEqual(txJson.to, receiver.address);
            should_1.default.deepEqual(txJson.amount, '10000');
            should_1.default.deepEqual(txJson.firstRound, 1);
            should_1.default.deepEqual(txJson.lastRound, 100);
        });
    });
    describe('build multi-sig transfer transaction', () => {
        it('should build a msig transfer transaction', async () => {
            const msigAddress = algosdk_1.default.multisigAddress({
                version: 1,
                threshold: 2,
                addrs: [AlgoResources.accounts.account1.address, AlgoResources.accounts.account3.address],
            });
            builder
                .sender({ address: sender.address })
                .to({ address: receiver.address })
                .amount(10000)
                .isFlatFee(true)
                .fee({ fee: '22000' })
                .firstRound(1)
                .lastRound(100)
                .testnet()
                .numberOfSigners(2)
                .setSigners([AlgoResources.accounts.account1.address, AlgoResources.accounts.account3.address])
                .sign({ key: AlgoResources.accounts.account1.prvKey });
            builder.sign({ key: AlgoResources.accounts.account3.prvKey });
            const tx = await builder.build();
            const txJson = tx.toJson();
            should_1.default.deepEqual(txJson.from, msigAddress);
            should_1.default.deepEqual(txJson.to, receiver.address);
            should_1.default.deepEqual(txJson.fee, 22000);
            should_1.default.deepEqual(txJson.amount, '10000');
            should_1.default.deepEqual(txJson.firstRound, 1);
            should_1.default.deepEqual(txJson.lastRound, 100);
            should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
            should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
        });
        it('should build a half signed transfer transaction', async () => {
            const msigAddress = algosdk_1.default.multisigAddress({
                version: 1,
                threshold: 2,
                addrs: [AlgoResources.accounts.account1.address, AlgoResources.accounts.account3.address],
            });
            builder
                .sender({ address: sender.address })
                .to({ address: receiver.address })
                .amount(10000)
                .isFlatFee(true)
                .fee({ fee: '22000' })
                .firstRound(1)
                .lastRound(100)
                .testnet()
                .numberOfSigners(2)
                .setSigners([AlgoResources.accounts.account1.address, AlgoResources.accounts.account3.address])
                .sign({ key: AlgoResources.accounts.account1.prvKey });
            const tx = await builder.build();
            const txJson = tx.toJson();
            should_1.default.deepEqual(txJson.from, msigAddress);
            should_1.default.deepEqual(txJson.to, receiver.address);
            should_1.default.deepEqual(txJson.fee, 22000);
            should_1.default.deepEqual(txJson.amount, '10000');
            should_1.default.deepEqual(txJson.firstRound, 1);
            should_1.default.deepEqual(txJson.lastRound, 100);
            should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
            should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
        });
        it('should sign a half signed transfer tx', async () => {
            const msigAddress = algosdk_1.default.multisigAddress({
                version: 1,
                threshold: 2,
                addrs: [AlgoResources.accounts.account1.address, AlgoResources.accounts.account3.address],
            });
            builder.from(AlgoResources.rawTx.transfer.halfSigned);
            builder
                .numberOfSigners(2)
                .setSigners([AlgoResources.accounts.account1.address, AlgoResources.accounts.account3.address])
                .sign({ key: AlgoResources.accounts.account3.prvKey });
            const tx = await builder.build();
            should_1.default.deepEqual(Buffer.from(tx.toBroadcastFormat()).toString('hex'), AlgoResources.rawTx.transfer.multisig);
            const txJson = tx.toJson();
            should_1.default.deepEqual(txJson.from, msigAddress);
            should_1.default.deepEqual(txJson.to, receiver.address);
            should_1.default.deepEqual(txJson.fee, 22000);
            should_1.default.deepEqual(txJson.amount, '10000');
            should_1.default.deepEqual(txJson.firstRound, 1);
            should_1.default.deepEqual(txJson.lastRound, 100);
        });
        it('should build a half signed transfer transaction with 3 signers', async () => {
            const addresses = [
                AlgoResources.accounts.account1.address,
                AlgoResources.accounts.account3.address,
                AlgoResources.accounts.account4.address,
            ];
            const numberOfSigners = 3;
            const msigAddress = algosdk_1.default.multisigAddress({
                version: 1,
                threshold: numberOfSigners,
                addrs: addresses,
            });
            builder
                .sender({ address: sender.address })
                .to({ address: receiver.address })
                .amount(10000)
                .isFlatFee(true)
                .fee({ fee: '22000' })
                .firstRound(1)
                .lastRound(100)
                .testnet()
                .numberOfSigners(numberOfSigners)
                .setSigners(addresses)
                .sign({ key: AlgoResources.accounts.account1.prvKey });
            const tx1 = await builder.build();
            const builder2 = new lib_1.TransferBuilder(statics_1.coins.get('algo'));
            builder2.from(tx1.toBroadcastFormat());
            builder2
                .numberOfSigners(numberOfSigners)
                .setSigners(addresses)
                .sign({ key: AlgoResources.accounts.account3.prvKey });
            const tx2 = await builder2.build();
            const builder3 = new lib_1.TransferBuilder(statics_1.coins.get('algo'));
            builder3.from(tx2.toBroadcastFormat());
            builder3
                .numberOfSigners(numberOfSigners)
                .setSigners(addresses)
                .sign({ key: AlgoResources.accounts.account4.prvKey });
            const tx3 = await builder3.build();
            const txJson = tx3.toJson();
            should_1.default.deepEqual(txJson.from, msigAddress);
            should_1.default.deepEqual(txJson.to, receiver.address);
            should_1.default.deepEqual(txJson.fee, 22000);
            should_1.default.deepEqual(txJson.amount, '10000');
            should_1.default.deepEqual(txJson.firstRound, 1);
            should_1.default.deepEqual(txJson.lastRound, 100);
            should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
            should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIvdHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLHNEQUE4QjtBQUM5Qiw0Q0FBdUM7QUFDdkMsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QiwrQ0FBcUQ7QUFDckQsNkNBQThFO0FBQzlFLDJFQUE2RDtBQUU3RCxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLElBQUksT0FBd0IsQ0FBQztJQUU3QixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUNqRCxNQUFNLEVBQ0osUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQ3RCLEdBQUcsYUFBYSxDQUFDO0lBQ2xCLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzNDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxNQUFNLE1BQU0sR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxJQUFJLHFCQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLEVBQUUsQ0FBQywwREFBMEQsRUFBRSxHQUFHLEVBQUU7WUFDbEUsTUFBTSxHQUFHLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNsRCxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFH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QUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IGFsZ29zZGsgZnJvbSAnYWxnb3Nkayc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCBzaW5vbiwgeyBhc3NlcnQgYXMgU2lub25Bc3NlcnQgfSBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBBZGRyZXNzVmFsaWRhdGlvbkVycm9yLCBUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCAqIGFzIEFsZ29SZXNvdXJjZXMgZnJvbSAnLi4vLi4vLi4vZml4dHVyZXMvcmVzb3VyY2VzJztcblxuZGVzY3JpYmUoJ0FsZ28gVHJhbnNmZXIgQnVpbGRlcicsICgpID0+IHtcbiAgbGV0IGJ1aWxkZXI6IFRyYW5zZmVyQnVpbGRlcjtcblxuICBjb25zdCBzZW5kZXIgPSBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxO1xuICBjb25zdCByZWNlaXZlciA9IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDI7XG4gIGNvbnN0IHtcbiAgICBuZXR3b3JrczogeyB0ZXN0bmV0IH0sXG4gIH0gPSBBbGdvUmVzb3VyY2VzO1xuICBjb25zdCB7IGdlbmVzaXNIYXNoLCBnZW5lc2lzSUQgfSA9IHRlc3RuZXQ7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvaW5zLmdldCgnYWxnbycpO1xuICAgIGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKGNvbmZpZyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzZXR0ZXIgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHJlY2VpdmVyIGFkZHJlc3MgaXMgYSB2YWxpZCBhbGdvIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoYnVpbGRlciwgJ3ZhbGlkYXRlQWRkcmVzcycpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci50byh7IGFkZHJlc3M6ICd3cm9uZy1hZGRyJyB9KSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm5hbWUgPT09IEFkZHJlc3NWYWxpZGF0aW9uRXJyb3IubmFtZVxuICAgICAgKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci50byh7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pKTtcbiAgICAgIFNpbm9uQXNzZXJ0LmNhbGxlZFR3aWNlKHNweSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zZmVyIGFtb3VudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweShidWlsZGVyLCAndmFsaWRhdGVWYWx1ZScpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hbW91bnQoLTEpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZSA9PT0gJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybydcbiAgICAgICk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuYW1vdW50KDEwMDApKTtcbiAgICAgIFNpbm9uQXNzZXJ0LmNhbGxlZFR3aWNlKHNweSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAudG8oeyBhZGRyZXNzOiByZWNlaXZlci5hZGRyZXNzIH0pXG4gICAgICAgIC5hbW91bnQoMTAwMDApXG4gICAgICAgIC5pc0ZsYXRGZWUodHJ1ZSlcbiAgICAgICAgLmZlZSh7IGZlZTogJzIyMDAwJyB9KVxuICAgICAgICAuZmlyc3RSb3VuZCgxKVxuICAgICAgICAubGFzdFJvdW5kKDEwMClcbiAgICAgICAgLnRlc3RuZXQoKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDEpXG4gICAgICAgIC5zaWduKHsga2V5OiBzZW5kZXIucHJ2S2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZyb20sIHNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnRvLCByZWNlaXZlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZSwgMjIwMDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uYW1vdW50LCAnMTAwMDAnKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZpcnN0Um91bmQsIDEpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubGFzdFJvdW5kLCAxMDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZ2VuZXNpc0lELCBnZW5lc2lzSUQudG9TdHJpbmcoKSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nZW5lc2lzSGFzaC50b1N0cmluZygnYmFzZTY0JyksIGdlbmVzaXNIYXNoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gdW5zaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBsZWFzZSA9IG5ldyBVaW50OEFycmF5KGNyeXB0by5yYW5kb21CeXRlcygzMikpO1xuICAgICAgY29uc3Qgbm90ZSA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKCdub3RlJywgJ3V0Zi04JykpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnRvKHsgYWRkcmVzczogcmVjZWl2ZXIuYWRkcmVzcyB9KVxuICAgICAgICAuY2xvc2VSZW1haW5kZXJUbyh7IGFkZHJlc3M6IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDMuYWRkcmVzcyB9KVxuICAgICAgICAuYW1vdW50KDEwMDAwKVxuICAgICAgICAuaXNGbGF0RmVlKHRydWUpXG4gICAgICAgIC5mZWUoeyBmZWU6ICcyMjAwMCcgfSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLmxhc3RSb3VuZCgxMDApXG4gICAgICAgIC5sZWFzZShsZWFzZSlcbiAgICAgICAgLm5vdGUobm90ZSlcbiAgICAgICAgLnRlc3RuZXQoKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCBzZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi50bywgcmVjZWl2ZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5hbW91bnQsICcxMDAwMCcpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmlyc3RSb3VuZCwgMSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5sYXN0Um91bmQsIDEwMCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nZW5lc2lzSUQsIGdlbmVzaXNJRC50b1N0cmluZygpKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmdlbmVzaXNIYXNoLnRvU3RyaW5nKCdiYXNlNjQnKSwgZ2VuZXNpc0hhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBmcm9tIHJhdyB1bnNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXIuZnJvbShBbGdvUmVzb3VyY2VzLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKEJ1ZmZlci5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpLnRvU3RyaW5nKCdoZXgnKSwgQWxnb1Jlc291cmNlcy5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCBzZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi50bywgcmVjZWl2ZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5hbW91bnQsICcxMDAwMCcpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmlyc3RSb3VuZCwgMSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5sYXN0Um91bmQsIDEwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGZyb20gcmF3IHNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXIuZnJvbShBbGdvUmVzb3VyY2VzLnJhd1R4LnRyYW5zZmVyLnNpZ25lZCk7XG4gICAgICBidWlsZGVyLm51bWJlck9mU2lnbmVycygxKTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogc2VuZGVyLnBydktleSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKEJ1ZmZlci5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpLnRvU3RyaW5nKCdoZXgnKSwgQWxnb1Jlc291cmNlcy5yYXdUeC50cmFuc2Zlci5zaWduZWQpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udG8sIHJlY2VpdmVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uYW1vdW50LCAnMTAwMDAnKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZpcnN0Um91bmQsIDEpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubGFzdFJvdW5kLCAxMDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGZyb20gcmF3IHVuc2lnbmVkIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgYnVpbGRlci5mcm9tKEFsZ29SZXNvdXJjZXMucmF3VHgudHJhbnNmZXIudW5zaWduZWQpO1xuICAgICAgYnVpbGRlci5udW1iZXJPZlNpZ25lcnMoMSk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHNlbmRlci5wcnZLZXkgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoQnVmZmVyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSkudG9TdHJpbmcoJ2hleCcpLCBBbGdvUmVzb3VyY2VzLnJhd1R4LnRyYW5zZmVyLnNpZ25lZCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZyb20sIHNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnRvLCByZWNlaXZlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmFtb3VudCwgJzEwMDAwJyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5maXJzdFJvdW5kLCAxKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmxhc3RSb3VuZCwgMTAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1aWxkIG11bHRpLXNpZyB0cmFuc2ZlciB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgbXNpZyB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1zaWdBZGRyZXNzID0gYWxnb3Nkay5tdWx0aXNpZ0FkZHJlc3Moe1xuICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgIGFkZHJzOiBbQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLCBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQzLmFkZHJlc3NdLFxuICAgICAgfSk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAudG8oeyBhZGRyZXNzOiByZWNlaXZlci5hZGRyZXNzIH0pXG4gICAgICAgIC5hbW91bnQoMTAwMDApXG4gICAgICAgIC5pc0ZsYXRGZWUodHJ1ZSlcbiAgICAgICAgLmZlZSh7IGZlZTogJzIyMDAwJyB9KVxuICAgICAgICAuZmlyc3RSb3VuZCgxKVxuICAgICAgICAubGFzdFJvdW5kKDEwMClcbiAgICAgICAgLnRlc3RuZXQoKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDIpXG4gICAgICAgIC5zZXRTaWduZXJzKFtBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsIEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDMuYWRkcmVzc10pXG4gICAgICAgIC5zaWduKHsga2V5OiBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxLnBydktleSB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50My5wcnZLZXkgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgbXNpZ0FkZHJlc3MpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udG8sIHJlY2VpdmVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLCAyMjAwMCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5hbW91bnQsICcxMDAwMCcpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmlyc3RSb3VuZCwgMSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5sYXN0Um91bmQsIDEwMCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nZW5lc2lzSUQsIGdlbmVzaXNJRC50b1N0cmluZygpKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmdlbmVzaXNIYXNoLnRvU3RyaW5nKCdiYXNlNjQnKSwgZ2VuZXNpc0hhc2gpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBoYWxmIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1zaWdBZGRyZXNzID0gYWxnb3Nkay5tdWx0aXNpZ0FkZHJlc3Moe1xuICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgIGFkZHJzOiBbQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLCBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQzLmFkZHJlc3NdLFxuICAgICAgfSk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAudG8oeyBhZGRyZXNzOiByZWNlaXZlci5hZGRyZXNzIH0pXG4gICAgICAgIC5hbW91bnQoMTAwMDApXG4gICAgICAgIC5pc0ZsYXRGZWUodHJ1ZSlcbiAgICAgICAgLmZlZSh7IGZlZTogJzIyMDAwJyB9KVxuICAgICAgICAuZmlyc3RSb3VuZCgxKVxuICAgICAgICAubGFzdFJvdW5kKDEwMClcbiAgICAgICAgLnRlc3RuZXQoKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDIpXG4gICAgICAgIC5zZXRTaWduZXJzKFtBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsIEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDMuYWRkcmVzc10pXG4gICAgICAgIC5zaWduKHsga2V5OiBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxLnBydktleSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCBtc2lnQWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi50bywgcmVjZWl2ZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIDIyMDAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmFtb3VudCwgJzEwMDAwJyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5maXJzdFJvdW5kLCAxKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmxhc3RSb3VuZCwgMTAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmdlbmVzaXNJRCwgZ2VuZXNpc0lELnRvU3RyaW5nKCkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZ2VuZXNpc0hhc2gudG9TdHJpbmcoJ2Jhc2U2NCcpLCBnZW5lc2lzSGFzaCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzaWduIGEgaGFsZiBzaWduZWQgdHJhbnNmZXIgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtc2lnQWRkcmVzcyA9IGFsZ29zZGsubXVsdGlzaWdBZGRyZXNzKHtcbiAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICBhZGRyczogW0FsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcywgQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzXSxcbiAgICAgIH0pO1xuICAgICAgYnVpbGRlci5mcm9tKEFsZ29SZXNvdXJjZXMucmF3VHgudHJhbnNmZXIuaGFsZlNpZ25lZCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5udW1iZXJPZlNpZ25lcnMoMilcbiAgICAgICAgLnNldFNpZ25lcnMoW0FsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcywgQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzXSlcbiAgICAgICAgLnNpZ24oeyBrZXk6IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDMucHJ2S2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKEJ1ZmZlci5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpLnRvU3RyaW5nKCdoZXgnKSwgQWxnb1Jlc291cmNlcy5yYXdUeC50cmFuc2Zlci5tdWx0aXNpZyk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZyb20sIG1zaWdBZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnRvLCByZWNlaXZlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZSwgMjIwMDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uYW1vdW50LCAnMTAwMDAnKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZpcnN0Um91bmQsIDEpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubGFzdFJvdW5kLCAxMDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIGhhbGYgc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggMyBzaWduZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1xuICAgICAgICBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsXG4gICAgICAgIEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDMuYWRkcmVzcyxcbiAgICAgICAgQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50NC5hZGRyZXNzLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IG51bWJlck9mU2lnbmVycyA9IDM7XG4gICAgICBjb25zdCBtc2lnQWRkcmVzcyA9IGFsZ29zZGsubXVsdGlzaWdBZGRyZXNzKHtcbiAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgdGhyZXNob2xkOiBudW1iZXJPZlNpZ25lcnMsXG4gICAgICAgIGFkZHJzOiBhZGRyZXNzZXMsXG4gICAgICB9KTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC50byh7IGFkZHJlc3M6IHJlY2VpdmVyLmFkZHJlc3MgfSlcbiAgICAgICAgLmFtb3VudCgxMDAwMClcbiAgICAgICAgLmlzRmxhdEZlZSh0cnVlKVxuICAgICAgICAuZmVlKHsgZmVlOiAnMjIwMDAnIH0pXG4gICAgICAgIC5maXJzdFJvdW5kKDEpXG4gICAgICAgIC5sYXN0Um91bmQoMTAwKVxuICAgICAgICAudGVzdG5ldCgpXG4gICAgICAgIC5udW1iZXJPZlNpZ25lcnMobnVtYmVyT2ZTaWduZXJzKVxuICAgICAgICAuc2V0U2lnbmVycyhhZGRyZXNzZXMpXG4gICAgICAgIC5zaWduKHsga2V5OiBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxLnBydktleSB9KTtcbiAgICAgIGNvbnN0IHR4MSA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gbmV3IFRyYW5zZmVyQnVpbGRlcihjb2lucy5nZXQoJ2FsZ28nKSk7XG4gICAgICBidWlsZGVyMi5mcm9tKHR4MS50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGJ1aWxkZXIyXG4gICAgICAgIC5udW1iZXJPZlNpZ25lcnMobnVtYmVyT2ZTaWduZXJzKVxuICAgICAgICAuc2V0U2lnbmVycyhhZGRyZXNzZXMpXG4gICAgICAgIC5zaWduKHsga2V5OiBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQzLnBydktleSB9KTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBidWlsZGVyMyA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoY29pbnMuZ2V0KCdhbGdvJykpO1xuICAgICAgYnVpbGRlcjMuZnJvbSh0eDIudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG5cbiAgICAgIGJ1aWxkZXIzXG4gICAgICAgIC5udW1iZXJPZlNpZ25lcnMobnVtYmVyT2ZTaWduZXJzKVxuICAgICAgICAuc2V0U2lnbmVycyhhZGRyZXNzZXMpXG4gICAgICAgIC5zaWduKHsga2V5OiBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQ0LnBydktleSB9KTtcbiAgICAgIGNvbnN0IHR4MyA9IGF3YWl0IGJ1aWxkZXIzLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eDMudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCBtc2lnQWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi50bywgcmVjZWl2ZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIDIyMDAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmFtb3VudCwgJzEwMDAwJyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5maXJzdFJvdW5kLCAxKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmxhc3RSb3VuZCwgMTAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmdlbmVzaXNJRCwgZ2VuZXNpc0lELnRvU3RyaW5nKCkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZ2VuZXNpc0hhc2gudG9TdHJpbmcoJ2Jhc2U2NCcpLCBnZW5lc2lzSGFzaCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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