PHP WebShell

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

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

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const src_1 = require("../../src");
const statics_1 = require("@bitgo/statics");
const resources_1 = require("../resources");
const should_1 = __importDefault(require("should"));
const sdk_core_1 = require("@bitgo/sdk-core");
describe('ADA Staking Pledge Transaction Builder', async () => {
    const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tada'));
    it('should build a pledge transaction that registers a new staking pool', async () => {
        const prebuiltTx = new src_1.Transaction(statics_1.coins.get('tada'));
        prebuiltTx.fromRawTransaction(resources_1.rawTx.unsignedNewPledgeTx);
        const txBuilder = factory.getStakingPledgeBuilder();
        txBuilder.initBuilder(prebuiltTx);
        const tx = (await txBuilder.build());
        should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingPledge);
        const txData = tx.toJson();
        txData.inputs.length.should.equal(2);
        txData.outputs.length.should.equal(1);
        txData.certs.length.should.equal(2);
        txData.certs[0].type.should.equal(3);
        txData.certs[1].type.should.equal(1);
        should_1.default.exist(txData.certs[1].poolKeyHash);
        txData.certs[0].poolKeyHash.should.equal('10324dc34187735de46f6260d94620cdcc819f7ed1f93e3fc58d06a0');
        txData.withdrawals.length.should.equal(0);
        txData.witnesses.length.should.equal(0);
        should_1.default.exist(txData.pledgeDetails);
        should_1.default.not.exist(txData.pledgeDetails.stakeKeyRegistration);
        should_1.default.exist(txData.pledgeDetails.stakeKeyDelegation);
        should_1.default.exist(txData.pledgeDetails.stakePoolRegistration);
        should_1.default.equal(txData.pledgeDetails.stakeKeyDelegation.poolKeyHash, txData.pledgeDetails.stakePoolRegistration.poolKeyHash);
        txData.pledgeDetails.stakePoolRegistration.pledge.should.equal('100000000');
        txData.pledgeDetails.stakePoolRegistration.cost.should.equal('500000000');
        txData.pledgeDetails.stakePoolRegistration.marginNumerator.should.equal('3');
        txData.pledgeDetails.stakePoolRegistration.marginDenominator.should.equal('20');
        txData.pledgeDetails.stakePoolRegistration.rewardAccount.should.equal(txData.pledgeDetails.stakePoolRegistration.poolOwners[0]);
        const fee = tx.getFee;
        fee.should.equal('1000000');
        tx.toBroadcastFormat().should.equal(resources_1.rawTx.unsignedNewPledgeTx);
        should_1.default.equal(tx.id, resources_1.rawTx.unsignedNewPledgeTxHash);
        const explainedTx = tx.explainTransaction();
        should_1.default.equal(explainedTx.type, 'StakingPledge');
    });
    it('should build a pledge transaction that updates existing staking pool', async () => {
        const prebuiltTx = new src_1.Transaction(statics_1.coins.get('tada'));
        prebuiltTx.fromRawTransaction(resources_1.rawTx.unsignedUpdatePledgeTx);
        const txBuilder = factory.getStakingPledgeBuilder();
        txBuilder.initBuilder(prebuiltTx);
        const tx = (await txBuilder.build());
        should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingPledge);
        const txData = tx.toJson();
        txData.inputs.length.should.equal(2);
        txData.outputs.length.should.equal(1);
        txData.certs.length.should.equal(1);
        txData.certs[0].type.should.equal(3);
        should_1.default.exist(txData.certs[0].poolKeyHash);
        txData.certs[0].poolKeyHash.should.equal('10324dc34187735de46f6260d94620cdcc819f7ed1f93e3fc58d06a0');
        txData.withdrawals.length.should.equal(0);
        txData.witnesses.length.should.equal(0);
        should_1.default.exist(txData.pledgeDetails);
        should_1.default.not.exist(txData.pledgeDetails.stakeKeyRegistration);
        should_1.default.not.exist(txData.pledgeDetails.stakeKeyDelegation);
        should_1.default.exist(txData.pledgeDetails.stakePoolRegistration);
        txData.pledgeDetails.stakePoolRegistration.pledge.should.equal('100000000');
        txData.pledgeDetails.stakePoolRegistration.cost.should.equal('500000000');
        txData.pledgeDetails.stakePoolRegistration.marginNumerator.should.equal('3');
        txData.pledgeDetails.stakePoolRegistration.marginDenominator.should.equal('20');
        txData.pledgeDetails.stakePoolRegistration.rewardAccount.should.equal(txData.pledgeDetails.stakePoolRegistration.poolOwners[0]);
        const fee = tx.getFee;
        fee.should.equal('1000000');
        tx.toBroadcastFormat().should.equal(resources_1.rawTx.unsignedUpdatePledgeTx);
        should_1.default.equal(tx.id, resources_1.rawTx.unsignedUpdatePledgeTxHash);
        const explainedTx = tx.explainTransaction();
        should_1.default.equal(explainedTx.type, 'StakingPledge');
    });
    it('should add node key witness to unsigned pledge transaction', async () => {
        const prebuiltTx = new src_1.Transaction(statics_1.coins.get('tada'));
        prebuiltTx.fromRawTransaction(resources_1.rawTx.unsignedUpdatePledgeTx);
        const txBuilder = factory.getStakingPledgeBuilder();
        txBuilder.initBuilder(prebuiltTx);
        txBuilder.addNodeKeyWitness(resources_1.rawTx.pledgeNodeKeyPubkey, resources_1.rawTx.pledgeNodeWitnessSignature);
        const tx = (await txBuilder.build());
        tx.signature.length.should.equal(1);
        const txData = tx.toJson();
        txData.witnesses.length.should.equal(1);
        should_1.default.exist(txData.pledgeDetails);
        should_1.default.not.exist(txData.pledgeDetails.stakeKeyRegistration);
        should_1.default.not.exist(txData.pledgeDetails.stakeKeyDelegation);
        should_1.default.exist(txData.pledgeDetails.stakePoolRegistration);
        txData.pledgeDetails.stakePoolRegistration.pledge.should.equal('100000000');
        txData.pledgeDetails.stakePoolRegistration.cost.should.equal('500000000');
        txData.pledgeDetails.stakePoolRegistration.marginNumerator.should.equal('3');
        txData.pledgeDetails.stakePoolRegistration.marginDenominator.should.equal('20');
        txData.pledgeDetails.stakePoolRegistration.rewardAccount.should.equal(txData.pledgeDetails.stakePoolRegistration.poolOwners[0]);
        const rebuiltTx = new src_1.Transaction(statics_1.coins.get('tada'));
        rebuiltTx.fromRawTransaction(tx.toBroadcastFormat());
        rebuiltTx.signature.length.should.equal(1);
        rebuiltTx.toBroadcastFormat().should.equal(tx.toBroadcastFormat());
        rebuiltTx.toBroadcastFormat().should.not.equal(resources_1.rawTx.unsignedUpdatePledgeTx);
    });
    it('should init from partially signed txn hex and preserve the signature', async () => {
        const txnBuilderFactory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tada'));
        const txnBuilder = txnBuilderFactory.from(resources_1.rawTx.partiallySignedPledgeTx);
        let tx = (await txnBuilder.build());
        tx.type.should.equal(sdk_core_1.TransactionType.StakingPledge);
        tx.signature.length.should.equal(1);
        let txData = tx.toJson();
        txData.witnesses.length.should.equal(1);
        txData.witnesses[0].publicKey.should.equal(resources_1.rawTx.pledgeNodeKeyPubkey);
        txData.witnesses[0].signature.should.equal(resources_1.rawTx.pledgeNodeWitnessSignature);
        txnBuilder.addSignature({ pub: resources_1.rawTx.pledgeWalletKeyPubkey }, Buffer.from(resources_1.rawTx.pledgeWalletWitnessSignature, 'hex'));
        tx = (await txnBuilder.build());
        tx.type.should.equal(sdk_core_1.TransactionType.StakingPledge);
        txData = tx.toJson();
        txData.witnesses.length.should.equal(2);
        txData.witnesses[0].publicKey.should.equal(resources_1.rawTx.pledgeNodeKeyPubkey);
        txData.witnesses[0].signature.should.equal(resources_1.rawTx.pledgeNodeWitnessSignature);
        txData.witnesses[1].publicKey.should.equal(resources_1.rawTx.pledgeWalletKeyPubkey);
        txData.witnesses[1].signature.should.equal(resources_1.rawTx.pledgeWalletWitnessSignature);
    });
    it('should init from partially signed txn object and preserve the signature', async () => {
        const prebuiltTx = new src_1.Transaction(statics_1.coins.get('tada'));
        prebuiltTx.fromRawTransaction(resources_1.rawTx.partiallySignedPledgeTx);
        prebuiltTx.toBroadcastFormat().should.equal(resources_1.rawTx.partiallySignedPledgeTx);
        prebuiltTx.signature.length.should.equal(1);
        const txBuilder = factory.getStakingPledgeBuilder();
        txBuilder.initBuilder(prebuiltTx);
        const tx = (await txBuilder.build());
        tx.type.should.equal(sdk_core_1.TransactionType.StakingPledge);
        tx.toBroadcastFormat().should.equal(resources_1.rawTx.partiallySignedPledgeTx);
        tx.signature.length.should.equal(1);
        const txData = tx.toJson();
        txData.witnesses.length.should.equal(1);
        txData.witnesses[0].publicKey.should.equal(resources_1.rawTx.pledgeNodeKeyPubkey);
        txData.witnesses[0].signature.should.equal(resources_1.rawTx.pledgeNodeWitnessSignature);
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1BsZWRnZUJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvc3Rha2luZ1BsZWRnZUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBbUU7QUFDbkUsNENBQXVDO0FBQ3ZDLDRDQUFxQztBQUNyQyxvREFBNEI7QUFDNUIsOENBQWtEO0FBRWxELFFBQVEsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLElBQUksRUFBRTtJQUM1RCxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVqRSxFQUFFLENBQUMscUVBQXFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkYsTUFBTSxVQUFVLEdBQUcsSUFBSSxpQkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN0RCxVQUFVLENBQUMsa0JBQWtCLENBQUMsaUJBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3BELFNBQVMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztRQUNwRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUss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TUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDL0UsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgcmF3VHggfSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuZGVzY3JpYmUoJ0FEQSBTdGFraW5nIFBsZWRnZSBUcmFuc2FjdGlvbiBCdWlsZGVyJywgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YWRhJykpO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSBwbGVkZ2UgdHJhbnNhY3Rpb24gdGhhdCByZWdpc3RlcnMgYSBuZXcgc3Rha2luZyBwb29sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByZWJ1aWx0VHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YWRhJykpO1xuICAgIHByZWJ1aWx0VHguZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1R4LnVuc2lnbmVkTmV3UGxlZGdlVHgpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ1BsZWRnZUJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIocHJlYnVpbHRUeCk7XG4gICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1BsZWRnZSk7XG4gICAgY29uc3QgdHhEYXRhID0gdHgudG9Kc29uKCk7XG4gICAgdHhEYXRhLmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgIHR4RGF0YS5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgdHhEYXRhLmNlcnRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgdHhEYXRhLmNlcnRzWzBdLnR5cGUuc2hvdWxkLmVxdWFsKDMpO1xuICAgIHR4RGF0YS5jZXJ0c1sxXS50eXBlLnNob3VsZC5lcXVhbCgxKTtcbiAgICBzaG91bGQuZXhpc3QodHhEYXRhLmNlcnRzWzFdLnBvb2xLZXlIYXNoKTtcbiAgICB0eERhdGEuY2VydHNbMF0ucG9vbEtleUhhc2ghLnNob3VsZC5lcXVhbCgnMTAzMjRkYzM0MTg3NzM1ZGU0NmY2MjYwZDk0NjIwY2RjYzgxOWY3ZWQxZjkzZTNmYzU4ZDA2YTAnKTtcbiAgICB0eERhdGEud2l0aGRyYXdhbHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICB0eERhdGEud2l0bmVzc2VzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgc2hvdWxkLmV4aXN0KHR4RGF0YS5wbGVkZ2VEZXRhaWxzKTtcbiAgICBzaG91bGQubm90LmV4aXN0KHR4RGF0YS5wbGVkZ2VEZXRhaWxzIS5zdGFrZUtleVJlZ2lzdHJhdGlvbik7XG4gICAgc2hvdWxkLmV4aXN0KHR4RGF0YS5wbGVkZ2VEZXRhaWxzIS5zdGFrZUtleURlbGVnYXRpb24pO1xuICAgIHNob3VsZC5leGlzdCh0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VQb29sUmVnaXN0cmF0aW9uKTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICB0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VLZXlEZWxlZ2F0aW9uIS5wb29sS2V5SGFzaCxcbiAgICAgIHR4RGF0YS5wbGVkZ2VEZXRhaWxzIS5zdGFrZVBvb2xSZWdpc3RyYXRpb24hLnBvb2xLZXlIYXNoXG4gICAgKTtcbiAgICB0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VQb29sUmVnaXN0cmF0aW9uIS5wbGVkZ2Uuc2hvdWxkLmVxdWFsKCcxMDAwMDAwMDAnKTtcbiAgICB0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VQb29sUmVnaXN0cmF0aW9uIS5jb3N0LnNob3VsZC5lcXVhbCgnNTAwMDAwMDAwJyk7XG4gICAgdHhEYXRhLnBsZWRnZURldGFpbHMhLnN0YWtlUG9vbFJlZ2lzdHJhdGlvbiEubWFyZ2luTnVtZXJhdG9yLnNob3VsZC5lcXVhbCgnMycpO1xuICAgIHR4RGF0YS5wbGVkZ2VEZXRhaWxzIS5zdGFrZVBvb2xSZWdpc3RyYXRpb24hLm1hcmdpbkRlbm9taW5hdG9yLnNob3VsZC5lcXVhbCgnMjAnKTtcbiAgICB0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VQb29sUmVnaXN0cmF0aW9uIS5yZXdhcmRBY2NvdW50LnNob3VsZC5lcXVhbChcbiAgICAgIHR4RGF0YS5wbGVkZ2VEZXRhaWxzIS5zdGFrZVBvb2xSZWdpc3RyYXRpb24hLnBvb2xPd25lcnNbMF1cbiAgICApO1xuXG4gICAgY29uc3QgZmVlID0gdHguZ2V0RmVlO1xuICAgIGZlZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeC51bnNpZ25lZE5ld1BsZWRnZVR4KTtcbiAgICBzaG91bGQuZXF1YWwodHguaWQsIHJhd1R4LnVuc2lnbmVkTmV3UGxlZGdlVHhIYXNoKTtcblxuICAgIGNvbnN0IGV4cGxhaW5lZFR4ID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgc2hvdWxkLmVxdWFsKGV4cGxhaW5lZFR4LnR5cGUsICdTdGFraW5nUGxlZGdlJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSBwbGVkZ2UgdHJhbnNhY3Rpb24gdGhhdCB1cGRhdGVzIGV4aXN0aW5nIHN0YWtpbmcgcG9vbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwcmVidWlsdFR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFkYScpKTtcbiAgICBwcmVidWlsdFR4LmZyb21SYXdUcmFuc2FjdGlvbihyYXdUeC51bnNpZ25lZFVwZGF0ZVBsZWRnZVR4KTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdQbGVkZ2VCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHByZWJ1aWx0VHgpO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdQbGVkZ2UpO1xuICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuICAgIHR4RGF0YS5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICB0eERhdGEub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4RGF0YS5jZXJ0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4RGF0YS5jZXJ0c1swXS50eXBlLnNob3VsZC5lcXVhbCgzKTtcbiAgICBzaG91bGQuZXhpc3QodHhEYXRhLmNlcnRzWzBdLnBvb2xLZXlIYXNoKTtcbiAgICB0eERhdGEuY2VydHNbMF0ucG9vbEtleUhhc2ghLnNob3VsZC5lcXVhbCgnMTAzMjRkYzM0MTg3NzM1ZGU0NmY2MjYwZDk0NjIwY2RjYzgxOWY3ZWQxZjkzZTNmYzU4ZDA2YTAnKTtcbiAgICB0eERhdGEud2l0aGRyYXdhbHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICB0eERhdGEud2l0bmVzc2VzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgc2hvdWxkLmV4aXN0KHR4RGF0YS5wbGVkZ2VEZXRhaWxzKTtcbiAgICBzaG91bGQubm90LmV4aXN0KHR4RGF0YS5wbGVkZ2VEZXRhaWxzIS5zdGFrZUtleVJlZ2lzdHJhdGlvbik7XG4gICAgc2hvdWxkLm5vdC5leGlzdCh0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VLZXlEZWxlZ2F0aW9uKTtcbiAgICBzaG91bGQuZXhpc3QodHhEYXRhLnBsZWRnZURldGFpbHMhLnN0YWtlUG9vbFJlZ2lzdHJhdGlvbik7XG4gICAgdHhEYXRhLnBsZWRnZURldGFpbHMhLnN0YWtlUG9vbFJlZ2lzdHJhdGlvbiEucGxlZGdlLnNob3VsZC5lcXVhbCgnMTAwMDAwMDAwJyk7XG4gICAgdHhEYXRhLnBsZWRnZURldGFpbHMhLnN0YWtlUG9vbFJlZ2lzdHJhdGlvbiEuY29zdC5zaG91bGQuZXF1YWwoJzUwMDAwMDAwMCcpO1xuICAgIHR4RGF0YS5wbGVkZ2VEZXRhaWxzIS5zdGFrZVBvb2xSZWdpc3RyYXRpb24hLm1hcmdpbk51bWVyYXRvci5zaG91bGQuZXF1YWwoJzMnKTtcbiAgICB0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VQb29sUmVnaXN0cmF0aW9uIS5tYXJnaW5EZW5vbWluYXRvci5zaG91bGQuZXF1YWwoJzIwJyk7XG4gICAgdHhEYXRhLnBsZWRnZURldGFpbHMhLnN0YWtlUG9vbFJlZ2lzdHJhdGlvbiEucmV3YXJkQWNjb3VudC5zaG91bGQuZXF1YWwoXG4gICAgICB0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VQb29sUmVnaXN0cmF0aW9uIS5wb29sT3duZXJzWzBdXG4gICAgKTtcblxuICAgIGNvbnN0IGZlZSA9IHR4LmdldEZlZTtcbiAgICBmZWUuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgudW5zaWduZWRVcGRhdGVQbGVkZ2VUeCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LmlkLCByYXdUeC51bnNpZ25lZFVwZGF0ZVBsZWRnZVR4SGFzaCk7XG5cbiAgICBjb25zdCBleHBsYWluZWRUeCA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgIHNob3VsZC5lcXVhbChleHBsYWluZWRUeC50eXBlLCAnU3Rha2luZ1BsZWRnZScpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFkZCBub2RlIGtleSB3aXRuZXNzIHRvIHVuc2lnbmVkIHBsZWRnZSB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwcmVidWlsdFR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFkYScpKTtcbiAgICBwcmVidWlsdFR4LmZyb21SYXdUcmFuc2FjdGlvbihyYXdUeC51bnNpZ25lZFVwZGF0ZVBsZWRnZVR4KTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdQbGVkZ2VCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHByZWJ1aWx0VHgpO1xuICAgIHR4QnVpbGRlci5hZGROb2RlS2V5V2l0bmVzcyhyYXdUeC5wbGVkZ2VOb2RlS2V5UHVia2V5LCByYXdUeC5wbGVkZ2VOb2RlV2l0bmVzc1NpZ25hdHVyZSk7XG4gICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuICAgIHR4RGF0YS53aXRuZXNzZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBzaG91bGQuZXhpc3QodHhEYXRhLnBsZWRnZURldGFpbHMpO1xuICAgIHNob3VsZC5ub3QuZXhpc3QodHhEYXRhLnBsZWRnZURldGFpbHMhLnN0YWtlS2V5UmVnaXN0cmF0aW9uKTtcbiAgICBzaG91bGQubm90LmV4aXN0KHR4RGF0YS5wbGVkZ2VEZXRhaWxzIS5zdGFrZUtleURlbGVnYXRpb24pO1xuICAgIHNob3VsZC5leGlzdCh0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VQb29sUmVnaXN0cmF0aW9uKTtcbiAgICB0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VQb29sUmVnaXN0cmF0aW9uIS5wbGVkZ2Uuc2hvdWxkLmVxdWFsKCcxMDAwMDAwMDAnKTtcbiAgICB0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VQb29sUmVnaXN0cmF0aW9uIS5jb3N0LnNob3VsZC5lcXVhbCgnNTAwMDAwMDAwJyk7XG4gICAgdHhEYXRhLnBsZWRnZURldGFpbHMhLnN0YWtlUG9vbFJlZ2lzdHJhdGlvbiEubWFyZ2luTnVtZXJhdG9yLnNob3VsZC5lcXVhbCgnMycpO1xuICAgIHR4RGF0YS5wbGVkZ2VEZXRhaWxzIS5zdGFrZVBvb2xSZWdpc3RyYXRpb24hLm1hcmdpbkRlbm9taW5hdG9yLnNob3VsZC5lcXVhbCgnMjAnKTtcbiAgICB0eERhdGEucGxlZGdlRGV0YWlscyEuc3Rha2VQb29sUmVnaXN0cmF0aW9uIS5yZXdhcmRBY2NvdW50LnNob3VsZC5lcXVhbChcbiAgICAgIHR4RGF0YS5wbGVkZ2VEZXRhaWxzIS5zdGFrZVBvb2xSZWdpc3RyYXRpb24hLnBvb2xPd25lcnNbMF1cbiAgICApO1xuXG4gICAgY29uc3QgcmVidWlsdFR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFkYScpKTtcbiAgICByZWJ1aWx0VHguZnJvbVJhd1RyYW5zYWN0aW9uKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIHJlYnVpbHRUeC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLm5vdC5lcXVhbChyYXdUeC51bnNpZ25lZFVwZGF0ZVBsZWRnZVR4KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBpbml0IGZyb20gcGFydGlhbGx5IHNpZ25lZCB0eG4gaGV4IGFuZCBwcmVzZXJ2ZSB0aGUgc2lnbmF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4bkJ1aWxkZXJGYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YWRhJykpO1xuICAgIGNvbnN0IHR4bkJ1aWxkZXIgPSB0eG5CdWlsZGVyRmFjdG9yeS5mcm9tKHJhd1R4LnBhcnRpYWxseVNpZ25lZFBsZWRnZVR4KTtcbiAgICBsZXQgdHggPSAoYXdhaXQgdHhuQnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1BsZWRnZSk7XG4gICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgbGV0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuICAgIHR4RGF0YS53aXRuZXNzZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB0eERhdGEud2l0bmVzc2VzWzBdLnB1YmxpY0tleS5zaG91bGQuZXF1YWwocmF3VHgucGxlZGdlTm9kZUtleVB1YmtleSk7XG4gICAgdHhEYXRhLndpdG5lc3Nlc1swXS5zaWduYXR1cmUuc2hvdWxkLmVxdWFsKHJhd1R4LnBsZWRnZU5vZGVXaXRuZXNzU2lnbmF0dXJlKTtcblxuICAgIHR4bkJ1aWxkZXIuYWRkU2lnbmF0dXJlKFxuICAgICAgeyBwdWI6IHJhd1R4LnBsZWRnZVdhbGxldEtleVB1YmtleSB9LFxuICAgICAgQnVmZmVyLmZyb20ocmF3VHgucGxlZGdlV2FsbGV0V2l0bmVzc1NpZ25hdHVyZSwgJ2hleCcpXG4gICAgKTtcbiAgICB0eCA9IChhd2FpdCB0eG5CdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nUGxlZGdlKTtcbiAgICB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICB0eERhdGEud2l0bmVzc2VzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgdHhEYXRhLndpdG5lc3Nlc1swXS5wdWJsaWNLZXkuc2hvdWxkLmVxdWFsKHJhd1R4LnBsZWRnZU5vZGVLZXlQdWJrZXkpO1xuICAgIHR4RGF0YS53aXRuZXNzZXNbMF0uc2lnbmF0dXJlLnNob3VsZC5lcXVhbChyYXdUeC5wbGVkZ2VOb2RlV2l0bmVzc1NpZ25hdHVyZSk7XG4gICAgdHhEYXRhLndpdG5lc3Nlc1sxXS5wdWJsaWNLZXkuc2hvdWxkLmVxdWFsKHJhd1R4LnBsZWRnZVdhbGxldEtleVB1YmtleSk7XG4gICAgdHhEYXRhLndpdG5lc3Nlc1sxXS5zaWduYXR1cmUuc2hvdWxkLmVxdWFsKHJhd1R4LnBsZWRnZVdhbGxldFdpdG5lc3NTaWduYXR1cmUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGluaXQgZnJvbSBwYXJ0aWFsbHkgc2lnbmVkIHR4biBvYmplY3QgYW5kIHByZXNlcnZlIHRoZSBzaWduYXR1cmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcHJlYnVpbHRUeCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhZGEnKSk7XG4gICAgcHJlYnVpbHRUeC5mcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHgucGFydGlhbGx5U2lnbmVkUGxlZGdlVHgpO1xuICAgIHByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgucGFydGlhbGx5U2lnbmVkUGxlZGdlVHgpO1xuICAgIHByZWJ1aWx0VHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nUGxlZGdlQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcihwcmVidWlsdFR4KTtcbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdQbGVkZ2UpO1xuICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4LnBhcnRpYWxseVNpZ25lZFBsZWRnZVR4KTtcbiAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICB0eERhdGEud2l0bmVzc2VzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgdHhEYXRhLndpdG5lc3Nlc1swXS5wdWJsaWNLZXkuc2hvdWxkLmVxdWFsKHJhd1R4LnBsZWRnZU5vZGVLZXlQdWJrZXkpO1xuICAgIHR4RGF0YS53aXRuZXNzZXNbMF0uc2lnbmF0dXJlLnNob3VsZC5lcXVhbChyYXdUeC5wbGVkZ2VOb2RlV2l0bmVzc1NpZ25hdHVyZSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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