PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-sol/dist/test/unit/transactionBuilder
Просмотр файла: stakingRawMsgAuthorizeBuilder.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 should_1 = __importDefault(require("should"));
const testData = __importStar(require("../../resources/sol"));
const getBuilderFactory_1 = require("../getBuilderFactory");
const src_1 = require("../../../src");
describe('Sol Staking Raw Message Authorize Builder', () => {
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
it('should build a create staking authorization unsigned tx', async () => {
const txBuilder = factory.getStakingRawMsgAuthorizeBuilder();
txBuilder.transactionMessage(testData.STAKING_AUTHORIZE_RAW_MSG);
const tx = await txBuilder.build();
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
should_1.default.equal(rawTx, testData.STAKING_AUTHORIZE_RAW_MSG_TXN);
const explain = tx.explainTransaction();
should_1.default.equal(explain.type, 'StakingAuthorizeRaw');
should_1.default.equal(explain.blockhash, '35zHbmNtFNB9ADux97UbdY1bQSobfYR2SUmuCnqVfpUB');
should_1.default.deepEqual(explain.durableNonce, {
walletNonceAddress: 'J8cECxcT6Q6H4fcQCvd4LbhmmSjsHL63kpJtrUcrF74Q',
authWalletAddress: '5uUQw7ZtTRYduT6MrsPQeGKAavRek2VzxAqgUxQE2szv',
});
should_1.default.deepEqual(explain.stakingAuthorize, {
stakingAddress: 'J8cECxcT6Q6H4fcQCvd4LbhmmSjsHL63kpJtrUcrF74Q',
oldWithdrawAddress: '6xgesG4vajCYfAQpknodrarD49ZCnXGvYA4H1DLuGV7Y',
newWithdrawAddress: '4p1VdN6BngTAbWR7Q5JPpbB6dc4k4y8wn1knmmWEjc9i',
custodianAddress: 'DHCVjKy7kN6D6vM69nHcEeEeS685qtonFbiFNBW5bGiq',
});
});
it('should build a create staking authorization unsigned tx to change staking authority', async () => {
const txBuilder = factory.getStakingRawMsgAuthorizeBuilder();
txBuilder.transactionMessage(testData.STAKING_AUTHORIZE_RAW_MSG2);
const tx = await txBuilder.build();
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
should_1.default.equal(rawTx, testData.STAKING_AUTHORIZE_RAW_MSG_TXN2);
const explain = tx.explainTransaction();
should_1.default.equal(explain.type, 'StakingAuthorizeRaw');
should_1.default.equal(explain.blockhash, '8RfZkx3guikmKR8Wi1ikx5m7SkmLyn12D3SkimK1f1SE');
should_1.default.deepEqual(explain.durableNonce, {
walletNonceAddress: 'Fb3xp4p3b3mu7gQNDDphMUuW9NHjUk7wAgtmFgZx4Ysf',
authWalletAddress: 'CGAEgUMaCW4T94RKKEQ4PnMDayWNYxB8vuLNA7TEC1th',
});
should_1.default.deepEqual(explain.stakingAuthorize, {
stakingAddress: '3Huxg6259FBzwaoBxAdGaEwjgSYgrrg5qd9kX6chsf4K',
oldWithdrawAddress: '',
newWithdrawAddress: '',
oldStakingAuthorityAddress: 'G62LeCBehaarj5iVh58s7QTC61upEJiJhuK3BCQ2GqW6',
newStakingAuthorityAddress: 'EEjayTmZjNyFmA44fbPxFxsW18Ku5SVj1g5VVCpefbVn',
});
});
it('should build the same signable from serialized', async () => {
const txBuilder = factory.getStakingRawMsgAuthorizeBuilder();
const txMessage = testData.STAKING_AUTHORIZE_RAW_MSG;
txBuilder.transactionMessage(txMessage);
const tx = await txBuilder.build();
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const rawTx = tx.toBroadcastFormat();
const signable = tx.signablePayload;
const signableHex = signable.toString('base64');
should_1.default.equal(signableHex, txMessage);
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
const unsignedTxHex = Buffer.from(rawTx, 'base64').toString('hex');
const txBuilder2 = factory.from(Buffer.from(unsignedTxHex, 'hex').toString('base64'));
const tx2 = await txBuilder2.build();
const signable2 = tx2.signablePayload;
should_1.default.equal(signable2.toString('base64'), txMessage);
});
it('should build the same signable from serialized for change staking authority', async () => {
const txBuilder = factory.getStakingRawMsgAuthorizeBuilder();
const txMessage = testData.STAKING_AUTHORIZE_RAW_MSG2;
txBuilder.transactionMessage(txMessage);
const tx = await txBuilder.build();
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const rawTx = tx.toBroadcastFormat();
const signable = tx.signablePayload;
const signableHex = signable.toString('base64');
should_1.default.equal(signableHex, txMessage);
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
const unsignedTxHex = Buffer.from(rawTx, 'base64').toString('hex');
const txBuilder2 = factory.from(Buffer.from(unsignedTxHex, 'hex').toString('base64'));
const tx2 = await txBuilder2.build();
const signable2 = tx2.signablePayload;
should_1.default.equal(signable2.toString('base64'), txMessage);
});
it('should build the same signable from serialized for change staking authority with only old staking authority', async () => {
const txBuilder = factory.getStakingRawMsgAuthorizeBuilder();
const txMessage = 'AwIECbZUs4LtRe9+UioPSy2m6K6F7iQd8/mBQo4UkcsRoWu7xKyh5llTYqoyu1i2FxsS0OLrLADlMByubjb3WCU27a3j0nRBRADfmtBBJQtQo/SchIvD5HD+7+z6yOE5VfQ2r8bppEBr0RwuVORQTtBPznEMy+u9+wstd8sIxiCk71VMyGLRKRwyNmh40eeGFTuqIhRwuGxh38mmSeTpsSEn+FsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAah2BeRN1QqmDQ3vf4qerJVf1NcinhyK2ikncAAAAAABqfVFxjHdMkoVmOYaR1etoteuKObS21cc1VbIQAAAAAGp9UXGSxWjuCKhF9z0peIzwNcMUWyGrNE2AYuqUAAAPjn5uoR7/6SxOU7WPigQNKFTZcdrQNRCAmkevrN7G+3AgUDAwgABAQAAAAGBAQHAQIICgAAAAAAAAA=';
txBuilder.transactionMessage(txMessage);
const tx = await txBuilder.build();
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const rawTx = tx.toBroadcastFormat();
const signable = tx.signablePayload;
const signableHex = signable.toString('base64');
should_1.default.equal(signableHex, txMessage);
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
const unsignedTxHex = Buffer.from(rawTx, 'base64').toString('hex');
const txBuilder2 = factory.from(Buffer.from(unsignedTxHex, 'hex').toString('base64'));
const tx2 = await txBuilder2.build();
const signable2 = tx2.signablePayload;
should_1.default.equal(signable2.toString('base64'), txMessage);
});
it('should build the same signable from serialized for change staking and withdraw authority with custodial authority', async () => {
const txBuilder = factory.getStakingRawMsgAuthorizeBuilder();
const txMessage = 'BAMECrZUs4LtRe9+UioPSy2m6K6F7iQd8/mBQo4UkcsRoWu7BUdHZ+Tx/Eaem+0Vb6TThw9npPPveW2WCR3KCfOulqPErKHmWVNiqjK7WLYXGxLQ4ussAOUwHK5uNvdYJTbtrePSdEFEAN+a0EElC1Cj9JyEi8PkcP7v7PrI4TlV9DavxumkQGvRHC5U5FBO0E/OcQzL6737Cy13ywjGIKTvVUzIYtEpHDI2aHjR54YVO6oiFHC4bGHfyaZJ5OmxISf4WwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqHYF5E3VCqYNDe9/ip6slV/U1yKeHIraKSdwAAAAAAGp9UXGMd0yShWY5hpHV62i164o5tLbVxzVVshAAAAAAan1RcZLFaO4IqEX3PSl4jPA1wxRbIas0TYBi6pQAAA+Ofm6hHv/pLE5TtY+KBA0oVNlx2tA1EICaR6+s3sb7cDBgMECQAEBAAAAAcFBQgCAwEICgAAAAAAAAAHBQUIAgMBCAoAAAABAAAA';
txBuilder.transactionMessage(txMessage);
const tx = await txBuilder.build();
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const rawTx = tx.toBroadcastFormat();
const signable = tx.signablePayload;
const signableHex = signable.toString('base64');
should_1.default.equal(signableHex, txMessage);
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
const unsignedTxHex = Buffer.from(rawTx, 'base64').toString('hex');
const txBuilder2 = factory.from(Buffer.from(unsignedTxHex, 'hex').toString('base64'));
const tx2 = await txBuilder2.build();
const signable2 = tx2.signablePayload;
should_1.default.equal(signable2.toString('base64'), txMessage);
});
it('should build the same signable from serialized for change staking and withdraw authority without custodial authority', async () => {
const txBuilder = factory.getStakingRawMsgAuthorizeBuilder();
const txMessage = 'AwIECbZUs4LtRe9+UioPSy2m6K6F7iQd8/mBQo4UkcsRoWu7xKyh5llTYqoyu1i2FxsS0OLrLADlMByubjb3WCU27a3j0nRBRADfmtBBJQtQo/SchIvD5HD+7+z6yOE5VfQ2r8bppEBr0RwuVORQTtBPznEMy+u9+wstd8sIxiCk71VMyGLRKRwyNmh40eeGFTuqIhRwuGxh38mmSeTpsSEn+FsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAah2BeRN1QqmDQ3vf4qerJVf1NcinhyK2ikncAAAAAABqfVFxjHdMkoVmOYaR1etoteuKObS21cc1VbIQAAAAAGp9UXGSxWjuCKhF9z0peIzwNcMUWyGrNE2AYuqUAAAPjn5uoR7/6SxOU7WPigQNKFTZcdrQNRCAmkevrN7G+3AwUDAwgABAQAAAAGBAQHAQIICgAAAAAAAAAGBAQHAQIICgAAAAEAAAA=';
txBuilder.transactionMessage(txMessage);
const tx = await txBuilder.build();
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const rawTx = tx.toBroadcastFormat();
const signable = tx.signablePayload;
const signableHex = signable.toString('base64');
should_1.default.equal(signableHex, txMessage);
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
const unsignedTxHex = Buffer.from(rawTx, 'base64').toString('hex');
const txBuilder2 = factory.from(Buffer.from(unsignedTxHex, 'hex').toString('base64'));
const tx2 = await txBuilder2.build();
const signable2 = tx2.signablePayload;
should_1.default.equal(signable2.toString('base64'), txMessage);
});
it('should build from an unsigned transaction', async () => {
const txBuilder = factory.from(testData.STAKING_AUTHORIZE_RAW_MSG_TXN);
const tx = await txBuilder.build();
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const rawTx = tx.toBroadcastFormat();
const signable = tx.signablePayload.toString('base64');
should_1.default.equal(signable, testData.STAKING_AUTHORIZE_RAW_MSG);
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
should_1.default.equal(rawTx, testData.STAKING_AUTHORIZE_RAW_MSG_TXN);
});
it('should build from an unsigned transaction for nwe staking authority', async () => {
const txBuilder = factory.from(testData.STAKING_AUTHORIZE_RAW_MSG_TXN2);
const tx = await txBuilder.build();
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const rawTx = tx.toBroadcastFormat();
const signable = tx.signablePayload.toString('base64');
should_1.default.equal(signable, testData.STAKING_AUTHORIZE_RAW_MSG2);
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
should_1.default.equal(rawTx, testData.STAKING_AUTHORIZE_RAW_MSG_TXN2);
});
it('should explain a transaction', async () => {
const txBuilder = factory.from(testData.STAKING_AUTHORIZE_RAW_MSG_TXN);
const tx = await txBuilder.build();
const explain = tx.explainTransaction();
should_1.default.equal(explain.type, 'StakingAuthorizeRaw');
should_1.default.equal(explain.blockhash, '35zHbmNtFNB9ADux97UbdY1bQSobfYR2SUmuCnqVfpUB');
should_1.default.deepEqual(explain.durableNonce, {
walletNonceAddress: 'J8cECxcT6Q6H4fcQCvd4LbhmmSjsHL63kpJtrUcrF74Q',
authWalletAddress: '5uUQw7ZtTRYduT6MrsPQeGKAavRek2VzxAqgUxQE2szv',
});
should_1.default.deepEqual(explain.stakingAuthorize, {
stakingAddress: 'J8cECxcT6Q6H4fcQCvd4LbhmmSjsHL63kpJtrUcrF74Q',
oldWithdrawAddress: '6xgesG4vajCYfAQpknodrarD49ZCnXGvYA4H1DLuGV7Y',
newWithdrawAddress: '4p1VdN6BngTAbWR7Q5JPpbB6dc4k4y8wn1knmmWEjc9i',
custodianAddress: 'DHCVjKy7kN6D6vM69nHcEeEeS685qtonFbiFNBW5bGiq',
});
});
it('should generate json from transaction', async () => {
const txBuilder = factory.from(testData.STAKING_AUTHORIZE_RAW_MSG_TXN);
const tx = await txBuilder.build();
const txJson = tx.toJson();
should_1.default.deepEqual(txJson.durableNonce, {
walletNonceAddress: 'J8cECxcT6Q6H4fcQCvd4LbhmmSjsHL63kpJtrUcrF74Q',
authWalletAddress: '5uUQw7ZtTRYduT6MrsPQeGKAavRek2VzxAqgUxQE2szv',
});
should_1.default.equal(txJson.instructionsData.length, 2);
should_1.default.deepEqual(txJson.instructionsData[1].params, {
stakingAddress: 'J8cECxcT6Q6H4fcQCvd4LbhmmSjsHL63kpJtrUcrF74Q',
oldAuthorizeAddress: '6xgesG4vajCYfAQpknodrarD49ZCnXGvYA4H1DLuGV7Y',
newAuthorizeAddress: '4p1VdN6BngTAbWR7Q5JPpbB6dc4k4y8wn1knmmWEjc9i',
custodianAddress: 'DHCVjKy7kN6D6vM69nHcEeEeS685qtonFbiFNBW5bGiq',
});
});
it('should validate raw transaction', async () => {
const txBuilder = factory.getStakingRawMsgAuthorizeBuilder();
txBuilder.validateRawTransaction(testData.STAKING_AUTHORIZE_RAW_MSG_TXN);
(0, should_1.default)(() => txBuilder.validateRawTransaction(testData.STAKING_AUTHORIZE_UNSIGNED_TX)).throwError('Invalid staking instruction data: 0100000064c9ead9aa6b65445acf4fa526080bcf53baaad5e0bdb99578c9fc233f9c1df500000000');
should_1.default.throws(() => txBuilder.validateRawTransaction(testData.ATA_INIT_SIGNED_DIFF_OWNER_TX));
should_1.default.throws(() => txBuilder.validateRawTransaction(testData.TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE));
should_1.default.throws(() => txBuilder.validateRawTransaction(testData.TRANSFER_UNSIGNED_TX_WITHOUT_MEMO));
});
it('should fail wrong transaction message data', async () => {
const txBuilder = factory.getStakingRawMsgAuthorizeBuilder();
should_1.default.throws(() => txBuilder.transactionMessage('wrong data'));
const txBuilder2 = factory.from(testData.TRANSFER_UNSIGNED_TX_WITH_MEMO);
const msg = (await txBuilder2.build()).signablePayload.toString('base64');
should_1.default.throws(() => txBuilder.transactionMessage(msg));
});
it('should fail from transaction data', async () => {
const txBuilder = factory.getStakingRawMsgAuthorizeBuilder();
should_1.default.throws(() => txBuilder.from(testData.ATA_INIT_SIGNED_DIFF_OWNER_TX));
should_1.default.throws(() => txBuilder.from(testData.TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE));
should_1.default.throws(() => txBuilder.from(testData.TRANSFER_UNSIGNED_TX_WITHOUT_MEMO));
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1Jhd01zZ0F1dGhvcml6ZUJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3N0YWtpbmdSYXdNc2dBdXRob3JpemVCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDhEQUFnRDtBQUNoRCw0REFBeUQ7QUFDekQsc0NBQWtEO0FBRWxELFFBQVEsQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7SUFDekQsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUUxQyxFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdkUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdDQUFnQyxFQUFFLENBQUM7UUFDN0QsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFLLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQzVELE1B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Q0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDekUsTUFBTSxHQUFHLEdBQUksQ0FBQyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBaUIsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNGLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1FBQzdELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQztRQUM1RSxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLENBQUM7UUFDN0YsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgVXRpbHMsIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ1NvbCBTdGFraW5nIFJhdyBNZXNzYWdlIEF1dGhvcml6ZSBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3Rzb2wnKTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgY3JlYXRlIHN0YWtpbmcgYXV0aG9yaXphdGlvbiB1bnNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdSYXdNc2dBdXRob3JpemVCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnRyYW5zYWN0aW9uTWVzc2FnZSh0ZXN0RGF0YS5TVEFLSU5HX0FVVEhPUklaRV9SQVdfTVNHKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuU1RBS0lOR19BVVRIT1JJWkVfUkFXX01TR19UWE4pO1xuICAgIGNvbnN0IGV4cGxhaW4gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICBzaG91bGQuZXF1YWwoZXhwbGFpbi50eXBlLCAnU3Rha2luZ0F1dGhvcml6ZVJhdycpO1xuICAgIHNob3VsZC5lcXVhbChleHBsYWluLmJsb2NraGFzaCwgJzM1ekhibU50Rk5COUFEdXg5N1ViZFkxYlFTb2JmWVIyU1VtdUNucVZmcFVCJyk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChleHBsYWluLmR1cmFibGVOb25jZSwge1xuICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiAnSjhjRUN4Y1Q2UTZINGZjUUN2ZDRMYmhtbVNqc0hMNjNrcEp0clVjckY3NFEnLFxuICAgICAgYXV0aFdhbGxldEFkZHJlc3M6ICc1dVVRdzdadFRSWWR1VDZNcnNQUWVHS0FhdlJlazJWenhBcWdVeFFFMnN6dicsXG4gICAgfSk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChleHBsYWluLnN0YWtpbmdBdXRob3JpemUsIHtcbiAgICAgIHN0YWtpbmdBZGRyZXNzOiAnSjhjRUN4Y1Q2UTZINGZjUUN2ZDRMYmhtbVNqc0hMNjNrcEp0clVjckY3NFEnLFxuICAgICAgb2xkV2l0aGRyYXdBZGRyZXNzOiAnNnhnZXNHNHZhakNZZkFRcGtub2RyYXJENDlaQ25YR3ZZQTRIMURMdUdWN1knLFxuICAgICAgbmV3V2l0aGRyYXdBZGRyZXNzOiAnNHAxVmRONkJuZ1RBYldSN1E1SlBwYkI2ZGM0azR5OHduMWtubW1XRWpjOWknLFxuICAgICAgY3VzdG9kaWFuQWRkcmVzczogJ0RIQ1ZqS3k3a042RDZ2TTY5bkhjRWVFZVM2ODVxdG9uRmJpRk5CVzViR2lxJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIGNyZWF0ZSBzdGFraW5nIGF1dGhvcml6YXRpb24gdW5zaWduZWQgdHggdG8gY2hhbmdlIHN0YWtpbmcgYXV0aG9yaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ1Jhd01zZ0F1dGhvcml6ZUJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIudHJhbnNhY3Rpb25NZXNzYWdlKHRlc3REYXRhLlNUQUtJTkdfQVVUSE9SSVpFX1JBV19NU0cyKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuU1RBS0lOR19BVVRIT1JJWkVfUkFXX01TR19UWE4yKTtcbiAgICBjb25zdCBleHBsYWluID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgc2hvdWxkLmVxdWFsKGV4cGxhaW4udHlwZSwgJ1N0YWtpbmdBdXRob3JpemVSYXcnKTtcbiAgICBzaG91bGQuZXF1YWwoZXhwbGFpbi5ibG9ja2hhc2gsICc4UmZaa3gzZ3Vpa21LUjhXaTFpa3g1bTdTa21MeW4xMkQzU2tpbUsxZjFTRScpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoZXhwbGFpbi5kdXJhYmxlTm9uY2UsIHtcbiAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJ0ZiM3hwNHAzYjNtdTdnUU5ERHBoTVV1VzlOSGpVazd3QWd0bUZnWng0WXNmJyxcbiAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnQ0dBRWdVTWFDVzRUOTRSS0tFUTRQbk1EYXlXTll4Qjh2dUxOQTdURUMxdGgnLFxuICAgIH0pO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoZXhwbGFpbi5zdGFraW5nQXV0aG9yaXplLCB7XG4gICAgICBzdGFraW5nQWRkcmVzczogJzNIdXhnNjI1OUZCendhb0J4QWRHYUV3amdTWWdycmc1cWQ5a1g2Y2hzZjRLJyxcbiAgICAgIG9sZFdpdGhkcmF3QWRkcmVzczogJycsXG4gICAgICBuZXdXaXRoZHJhd0FkZHJlc3M6ICcnLFxuICAgICAgb2xkU3Rha2luZ0F1dGhvcml0eUFkZHJlc3M6ICdHNjJMZUNCZWhhYXJqNWlWaDU4czdRVEM2MXVwRUppSmh1SzNCQ1EyR3FXNicsXG4gICAgICBuZXdTdGFraW5nQXV0aG9yaXR5QWRkcmVzczogJ0VFamF5VG1aak55Rm1BNDRmYlB4RnhzVzE4S3U1U1ZqMWc1VlZDcGVmYlZuJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCB0aGUgc2FtZSBzaWduYWJsZSBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nUmF3TXNnQXV0aG9yaXplQnVpbGRlcigpO1xuICAgIGNvbnN0IHR4TWVzc2FnZSA9IHRlc3REYXRhLlNUQUtJTkdfQVVUSE9SSVpFX1JBV19NU0c7XG4gICAgdHhCdWlsZGVyLnRyYW5zYWN0aW9uTWVzc2FnZSh0eE1lc3NhZ2UpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBzaWduYWJsZSA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICBjb25zdCBzaWduYWJsZUhleCA9IHNpZ25hYmxlLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBzaG91bGQuZXF1YWwoc2lnbmFibGVIZXgsIHR4TWVzc2FnZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIGNvbnN0IHVuc2lnbmVkVHhIZXggPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmZyb20oQnVmZmVyLmZyb20odW5zaWduZWRUeEhleCwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgY29uc3QgdHgyID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuXG4gICAgY29uc3Qgc2lnbmFibGUyID0gdHgyLnNpZ25hYmxlUGF5bG9hZDtcbiAgICBzaG91bGQuZXF1YWwoc2lnbmFibGUyLnRvU3RyaW5nKCdiYXNlNjQnKSwgdHhNZXNzYWdlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCB0aGUgc2FtZSBzaWduYWJsZSBmcm9tIHNlcmlhbGl6ZWQgZm9yIGNoYW5nZSBzdGFraW5nIGF1dGhvcml0eScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdSYXdNc2dBdXRob3JpemVCdWlsZGVyKCk7XG4gICAgY29uc3QgdHhNZXNzYWdlID0gdGVzdERhdGEuU1RBS0lOR19BVVRIT1JJWkVfUkFXX01TRzI7XG4gICAgdHhCdWlsZGVyLnRyYW5zYWN0aW9uTWVzc2FnZSh0eE1lc3NhZ2UpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBzaWduYWJsZSA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICBjb25zdCBzaWduYWJsZUhleCA9IHNpZ25hYmxlLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBzaG91bGQuZXF1YWwoc2lnbmFibGVIZXgsIHR4TWVzc2FnZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIGNvbnN0IHVuc2lnbmVkVHhIZXggPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmZyb20oQnVmZmVyLmZyb20odW5zaWduZWRUeEhleCwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgY29uc3QgdHgyID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuXG4gICAgY29uc3Qgc2lnbmFibGUyID0gdHgyLnNpZ25hYmxlUGF5bG9hZDtcbiAgICBzaG91bGQuZXF1YWwoc2lnbmFibGUyLnRvU3RyaW5nKCdiYXNlNjQnKSwgdHhNZXNzYWdlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCB0aGUgc2FtZSBzaWduYWJsZSBmcm9tIHNlcmlhbGl6ZWQgZm9yIGNoYW5nZSBzdGFraW5nIGF1dGhvcml0eSB3aXRoIG9ubHkgb2xkIHN0YWtpbmcgYXV0aG9yaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ1Jhd01zZ0F1dGhvcml6ZUJ1aWxkZXIoKTtcbiAgICBjb25zdCB0eE1lc3NhZ2UgPVxuICAgICAgJ0F3SUVDYlpVczRMdFJlOStVaW9QU3kybTZLNkY3aVFkOC9tQlFvNFVrY3NSb1d1N3hLeWg1bGxUWXFveXUxaTJGeHNTME9MckxBRGxNQnl1YmpiM1dDVTI3YTNqMG5SQlJBRGZtdEJCSlF0UW8vU2NoSXZENUhEKzcrejZ5T0U1VmZRMnI4YnBwRUJyMFJ3dVZPUlFUdEJQem5FTXkrdTkrd3N0ZDhzSXhpQ2s3MVZNeUdMUktSd3lObWg0MGVlR0ZUdXFJaFJ3dUd4aDM4bW1TZVRwc1NFbitGc0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFhaDJCZVJOMVFxbURRM3ZmNHFlckpWZjFOY2luaHlLMmlrbmNBQUFBQUFCcWZWRnhqSGRNa29WbU9ZYVIxZXRvdGV1S09iUzIxY2MxVmJJUUFBQUFBR3A5VVhHU3hXanVDS2hGOXowcGVJendOY01VV3lHck5FMkFZdXFVQUFBUGpuNXVvUjcvNlN4T1U3V1BpZ1FOS0ZUWmNkclFOUkNBbWtldnJON0crM0FnVURBd2dBQkFRQUFBQUdCQVFIQVFJSUNnQUFBQUFBQUFBPSc7XG4gICAgdHhCdWlsZGVyLnRyYW5zYWN0aW9uTWVzc2FnZSh0eE1lc3NhZ2UpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBzaWduYWJsZSA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICBjb25zdCBzaWduYWJsZUhleCA9IHNpZ25hYmxlLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBzaG91bGQuZXF1YWwoc2lnbmFibGVIZXgsIHR4TWVzc2FnZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIGNvbnN0IHVuc2lnbmVkVHhIZXggPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmZyb20oQnVmZmVyLmZyb20odW5zaWduZWRUeEhleCwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgY29uc3QgdHgyID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuXG4gICAgY29uc3Qgc2lnbmFibGUyID0gdHgyLnNpZ25hYmxlUGF5bG9hZDtcbiAgICBzaG91bGQuZXF1YWwoc2lnbmFibGUyLnRvU3RyaW5nKCdiYXNlNjQnKSwgdHhNZXNzYWdlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCB0aGUgc2FtZSBzaWduYWJsZSBmcm9tIHNlcmlhbGl6ZWQgZm9yIGNoYW5nZSBzdGFraW5nIGFuZCB3aXRoZHJhdyBhdXRob3JpdHkgd2l0aCBjdXN0b2RpYWwgYXV0aG9yaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ1Jhd01zZ0F1dGhvcml6ZUJ1aWxkZXIoKTtcbiAgICBjb25zdCB0eE1lc3NhZ2UgPVxuICAgICAgJ0JBTUVDclpVczRMdFJlOStVaW9QU3kybTZLNkY3aVFkOC9tQlFvNFVrY3NSb1d1N0JVZEhaK1R4L0VhZW0rMFZiNlRUaHc5bnBQUHZlVzJXQ1IzS0NmT3VscVBFcktIbVdWTmlxaks3V0xZWEd4TFE0dXNzQU9Vd0hLNXVOdmRZSlRidHJlUFNkRUZFQU4rYTBFRWxDMUNqOUp5RWk4UGtjUDd2N1BySTRUbFY5RGF2eHVta1FHdlJIQzVVNUZCTzBFL09jUXpMNjczN0N5MTN5d2pHSUtUdlZVeklZdEVwSERJMmFIalI1NFlWTzZvaUZIQzRiR0hmeWFaSjVPbXhJU2Y0V3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCcUhZRjVFM1ZDcVlORGU5L2lwNnNsVi9VMXlLZUhJcmFLU2R3QUFBQUFBR3A5VVhHTWQweVNoV1k1aHBIVjYyaTE2NG81dExiVnh6VlZzaEFBQUFBQWFuMVJjWkxGYU80SXFFWDNQU2w0alBBMXd4UmJJYXMwVFlCaTZwUUFBQStPZm02aEh2L3BMRTVUdFkrS0JBMG9WTmx4MnRBMUVJQ2FSNitzM3NiN2NEQmdNRUNRQUVCQUFBQUFjRkJRZ0NBd0VJQ2dBQUFBQUFBQUFIQlFVSUFnTUJDQW9BQUFBQkFBQUEnO1xuICAgIHR4QnVpbGRlci50cmFuc2FjdGlvbk1lc3NhZ2UodHhNZXNzYWdlKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgY29uc3Qgc2lnbmFibGUgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgY29uc3Qgc2lnbmFibGVIZXggPSBzaWduYWJsZS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgc2hvdWxkLmVxdWFsKHNpZ25hYmxlSGV4LCB0eE1lc3NhZ2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICBjb25zdCB1bnNpZ25lZFR4SGV4ID0gQnVmZmVyLmZyb20ocmF3VHgsICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5mcm9tKEJ1ZmZlci5mcm9tKHVuc2lnbmVkVHhIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgIGNvbnN0IHR4MiA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcblxuICAgIGNvbnN0IHNpZ25hYmxlMiA9IHR4Mi5zaWduYWJsZVBheWxvYWQ7XG4gICAgc2hvdWxkLmVxdWFsKHNpZ25hYmxlMi50b1N0cmluZygnYmFzZTY0JyksIHR4TWVzc2FnZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgdGhlIHNhbWUgc2lnbmFibGUgZnJvbSBzZXJpYWxpemVkIGZvciBjaGFuZ2Ugc3Rha2luZyBhbmQgd2l0aGRyYXcgYXV0aG9yaXR5IHdpdGhvdXQgY3VzdG9kaWFsIGF1dGhvcml0eScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdSYXdNc2dBdXRob3JpemVCdWlsZGVyKCk7XG4gICAgY29uc3QgdHhNZXNzYWdlID1cbiAgICAgICdBd0lFQ2JaVXM0THRSZTkrVWlvUFN5Mm02SzZGN2lRZDgvbUJRbzRVa2NzUm9XdTd4S3loNWxsVFlxb3l1MWkyRnhzUzBPTHJMQURsTUJ5dWJqYjNXQ1UyN2EzajBuUkJSQURmbXRCQkpRdFFvL1NjaEl2RDVIRCs3K3o2eU9FNVZmUTJyOGJwcEVCcjBSd3VWT1JRVHRCUHpuRU15K3U5K3dzdGQ4c0l4aUNrNzFWTXlHTFJLUnd5Tm1oNDBlZUdGVHVxSWhSd3VHeGgzOG1tU2VUcHNTRW4rRnNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBYWgyQmVSTjFRcW1EUTN2ZjRxZXJKVmYxTmNpbmh5SzJpa25jQUFBQUFBQnFmVkZ4akhkTWtvVm1PWWFSMWV0b3RldUtPYlMyMWNjMVZiSVFBQUFBQUdwOVVYR1N4V2p1Q0toRjl6MHBlSXp3TmNNVVd5R3JORTJBWXVxVUFBQVBqbjV1b1I3LzZTeE9VN1dQaWdRTktGVFpjZHJRTlJDQW1rZXZyTjdHKzNBd1VEQXdnQUJBUUFBQUFHQkFRSEFRSUlDZ0FBQUFBQUFBQUdCQVFIQVFJSUNnQUFBQUVBQUFBPSc7XG4gICAgdHhCdWlsZGVyLnRyYW5zYWN0aW9uTWVzc2FnZSh0eE1lc3NhZ2UpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBzaWduYWJsZSA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICBjb25zdCBzaWduYWJsZUhleCA9IHNpZ25hYmxlLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBzaG91bGQuZXF1YWwoc2lnbmFibGVIZXgsIHR4TWVzc2FnZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIGNvbnN0IHVuc2lnbmVkVHhIZXggPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmZyb20oQnVmZmVyLmZyb20odW5zaWduZWRUeEhleCwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgY29uc3QgdHgyID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuXG4gICAgY29uc3Qgc2lnbmFibGUyID0gdHgyLnNpZ25hYmxlUGF5bG9hZDtcbiAgICBzaG91bGQuZXF1YWwoc2lnbmFibGUyLnRvU3RyaW5nKCdiYXNlNjQnKSwgdHhNZXNzYWdlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBmcm9tIGFuIHVuc2lnbmVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5TVEFLSU5HX0FVVEhPUklaRV9SQVdfTVNHX1RYTik7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHNpZ25hYmxlID0gdHguc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBzaG91bGQuZXF1YWwoc2lnbmFibGUsIHRlc3REYXRhLlNUQUtJTkdfQVVUSE9SSVpFX1JBV19NU0cpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlNUQUtJTkdfQVVUSE9SSVpFX1JBV19NU0dfVFhOKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBmcm9tIGFuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIGZvciBud2Ugc3Rha2luZyBhdXRob3JpdHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNUQUtJTkdfQVVUSE9SSVpFX1JBV19NU0dfVFhOMik7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHNpZ25hYmxlID0gdHguc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBzaG91bGQuZXF1YWwoc2lnbmFibGUsIHRlc3REYXRhLlNUQUtJTkdfQVVUSE9SSVpFX1JBV19NU0cyKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5TVEFLSU5HX0FVVEhPUklaRV9SQVdfTVNHX1RYTjIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGV4cGxhaW4gYSB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuU1RBS0lOR19BVVRIT1JJWkVfUkFXX01TR19UWE4pO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgZXhwbGFpbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgIHNob3VsZC5lcXVhbChleHBsYWluLnR5cGUsICdTdGFraW5nQXV0aG9yaXplUmF3Jyk7XG4gICAgc2hvdWxkLmVxdWFsKGV4cGxhaW4uYmxvY2toYXNoLCAnMzV6SGJtTnRGTkI5QUR1eDk3VWJkWTFiUVNvYmZZUjJTVW11Q25xVmZwVUInKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGV4cGxhaW4uZHVyYWJsZU5vbmNlLCB7XG4gICAgICB3YWxsZXROb25jZUFkZHJlc3M6ICdKOGNFQ3hjVDZRNkg0ZmNRQ3ZkNExiaG1tU2pzSEw2M2twSnRyVWNyRjc0UScsXG4gICAgICBhdXRoV2FsbGV0QWRkcmVzczogJzV1VVF3N1p0VFJZZHVUNk1yc1BRZUdLQWF2UmVrMlZ6eEFxZ1V4UUUyc3p2JyxcbiAgICB9KTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGV4cGxhaW4uc3Rha2luZ0F1dGhvcml6ZSwge1xuICAgICAgc3Rha2luZ0FkZHJlc3M6ICdKOGNFQ3hjVDZRNkg0ZmNRQ3ZkNExiaG1tU2pzSEw2M2twSnRyVWNyRjc0UScsXG4gICAgICBvbGRXaXRoZHJhd0FkZHJlc3M6ICc2eGdlc0c0dmFqQ1lmQVFwa25vZHJhckQ0OVpDblhHdllBNEgxREx1R1Y3WScsXG4gICAgICBuZXdXaXRoZHJhd0FkZHJlc3M6ICc0cDFWZE42Qm5nVEFiV1I3UTVKUHBiQjZkYzRrNHk4d24xa25tbVdFamM5aScsXG4gICAgICBjdXN0b2RpYW5BZGRyZXNzOiAnREhDVmpLeTdrTjZENnZNNjluSGNFZUVlUzY4NXF0b25GYmlGTkJXNWJHaXEnLFxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGpzb24gZnJvbSB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuU1RBS0lOR19BVVRIT1JJWkVfUkFXX01TR19UWE4pO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZHVyYWJsZU5vbmNlLCB7XG4gICAgICB3YWxsZXROb25jZUFkZHJlc3M6ICdKOGNFQ3hjVDZRNkg0ZmNRQ3ZkNExiaG1tU2pzSEw2M2twSnRyVWNyRjc0UScsXG4gICAgICBhdXRoV2FsbGV0QWRkcmVzczogJzV1VVF3N1p0VFJZZHVUNk1yc1BRZUdLQWF2UmVrMlZ6eEFxZ1V4UUUyc3p2JyxcbiAgICB9KTtcbiAgICBzaG91bGQuZXF1YWwodHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLCAyKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzFdLnBhcmFtcywge1xuICAgICAgc3Rha2luZ0FkZHJlc3M6ICdKOGNFQ3hjVDZRNkg0ZmNRQ3ZkNExiaG1tU2pzSEw2M2twSnRyVWNyRjc0UScsXG4gICAgICBvbGRBdXRob3JpemVBZGRyZXNzOiAnNnhnZXNHNHZhakNZZkFRcGtub2RyYXJENDlaQ25YR3ZZQTRIMURMdUdWN1knLFxuICAgICAgbmV3QXV0aG9yaXplQWRkcmVzczogJzRwMVZkTjZCbmdUQWJXUjdRNUpQcGJCNmRjNGs0eTh3bjFrbm1tV0VqYzlpJyxcbiAgICAgIGN1c3RvZGlhbkFkZHJlc3M6ICdESENWakt5N2tONkQ2dk02OW5IY0VlRWVTNjg1cXRvbkZiaUZOQlc1YkdpcScsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgcmF3IHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ1Jhd01zZ0F1dGhvcml6ZUJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5TVEFLSU5HX0FVVEhPUklaRV9SQVdfTVNHX1RYTik7XG4gICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlNUQUtJTkdfQVVUSE9SSVpFX1VOU0lHTkVEX1RYKSkudGhyb3dFcnJvcihcbiAgICAgICdJbnZhbGlkIHN0YWtpbmcgaW5zdHJ1Y3Rpb24gZGF0YTogMDEwMDAwMDA2NGM5ZWFkOWFhNmI2NTQ0NWFjZjRmYTUyNjA4MGJjZjUzYmFhYWQ1ZTBiZGI5OTU3OGM5ZmMyMzNmOWMxZGY1MDAwMDAwMDAnXG4gICAgKTtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9ESUZGX09XTkVSX1RYKSk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5UUkFOU0ZFUl9TSUdORURfVFhfV0lUSF9NRU1PX0FORF9EVVJBQkxFX05PTkNFKSk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5UUkFOU0ZFUl9VTlNJR05FRF9UWF9XSVRIT1VUX01FTU8pKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHdyb25nIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdSYXdNc2dBdXRob3JpemVCdWlsZGVyKCk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiB0eEJ1aWxkZXIudHJhbnNhY3Rpb25NZXNzYWdlKCd3cm9uZyBkYXRhJykpO1xuICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuVFJBTlNGRVJfVU5TSUdORURfVFhfV0lUSF9NRU1PKTtcbiAgICBjb25zdCBtc2cgPSAoKGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb24pLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiB0eEJ1aWxkZXIudHJhbnNhY3Rpb25NZXNzYWdlKG1zZykpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgZnJvbSB0cmFuc2FjdGlvbiBkYXRhJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ1Jhd01zZ0F1dGhvcml6ZUJ1aWxkZXIoKTtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5mcm9tKHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9ESUZGX09XTkVSX1RYKSk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiB0eEJ1aWxkZXIuZnJvbSh0ZXN0RGF0YS5UUkFOU0ZFUl9TSUdORURfVFhfV0lUSF9NRU1PX0FORF9EVVJBQkxFX05PTkNFKSk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiB0eEJ1aWxkZXIuZnJvbSh0ZXN0RGF0YS5UUkFOU0ZFUl9VTlNJR05FRF9UWF9XSVRIT1VUX01FTU8pKTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!