PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-apt/dist/test/unit/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 statics_1 = require("@bitgo/statics");
const src_1 = require("../../../src");
const testData = __importStar(require("../../resources/apt"));
const sdk_core_1 = require("@bitgo/sdk-core");
const should_1 = __importDefault(require("should"));
describe('Apt Transfer Transaction', () => {
    const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tapt'));
    describe('Aptos Coin Transfer Transaction', () => {
        describe('Succeed', () => {
            it('should build a transfer tx', async function () {
                const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
                const txBuilder = factory.getTransferBuilder(transaction);
                txBuilder.sender(testData.sender2.address);
                txBuilder.recipients(testData.recipients);
                txBuilder.gasData({
                    maxGasAmount: 200000,
                    gasUnitPrice: 100,
                });
                txBuilder.sequenceNumber(14);
                txBuilder.expirationTime(1736246155);
                txBuilder.addFeePayerAddress(testData.feePayer.address);
                txBuilder.setIsSimulateTxn(true);
                const tx = (await txBuilder.build());
                should_1.default.equal(tx.sender, testData.sender2.address);
                should_1.default.equal(tx.recipients[0].address, testData.recipients[0].address);
                should_1.default.equal(tx.recipients[0].amount, testData.recipients[0].amount);
                should_1.default.equal(tx.recipient.address, testData.recipients[0].address);
                should_1.default.equal(tx.recipients[0].amount, testData.recipients[0].amount);
                should_1.default.equal(tx.recipient.amount, testData.recipients[0].amount);
                should_1.default.equal(tx.maxGasAmount, 200000);
                should_1.default.equal(tx.gasUnitPrice, 100);
                should_1.default.equal(tx.sequenceNumber, 14);
                should_1.default.equal(tx.expirationTime, 1736246155);
                should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
                tx.inputs.length.should.equal(1);
                tx.inputs[0].should.deepEqual({
                    address: testData.sender2.address,
                    value: testData.recipients[0].amount,
                    coin: 'tapt',
                });
                tx.outputs.length.should.equal(1);
                tx.outputs[0].should.deepEqual({
                    address: testData.recipients[0].address,
                    value: testData.recipients[0].amount,
                    coin: 'tapt',
                });
                const rawTx = tx.toBroadcastFormat();
                should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
                rawTx.should.equal('0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e73010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d67000000000203040000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f204');
            });
            it('should build and send a signed tx', async function () {
                const txBuilder = factory.from(testData.TRANSACTION_USING_TRANSFER_COINS);
                txBuilder.getSequenceNumber().should.equal(146);
                const tx = (await txBuilder.build());
                should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
                tx.inputs.length.should.equal(1);
                tx.inputs[0].should.deepEqual({
                    address: testData.sender2.address,
                    value: testData.recipients[0].amount,
                    coin: 'tapt',
                });
                tx.outputs.length.should.equal(1);
                tx.outputs[0].should.deepEqual({
                    address: testData.recipients[0].address,
                    value: testData.recipients[0].amount,
                    coin: 'tapt',
                });
                should_1.default.equal(tx.id, '0x249289a8178e4b9cdb89fad6e8e436ccc435753e4ea3c9d50e0c8b525582e90d');
                should_1.default.equal(tx.maxGasAmount, 200000);
                should_1.default.equal(tx.gasUnitPrice, 100);
                should_1.default.equal(tx.sequenceNumber, 146);
                should_1.default.equal(tx.expirationTime, 1737528215);
                should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
                const rawTx = tx.toBroadcastFormat();
                should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
                should_1.default.equal(rawTx, testData.TRANSACTION_USING_TRANSFER_COINS);
            });
            it('should succeed to validate a valid signablePayload', async function () {
                const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
                const txBuilder = factory.getTransferBuilder(transaction);
                txBuilder.sender(testData.sender2.address);
                txBuilder.recipients(testData.recipients);
                txBuilder.gasData({
                    maxGasAmount: 200000,
                    gasUnitPrice: 100,
                });
                txBuilder.sequenceNumber(14);
                txBuilder.expirationTime(1736246155);
                txBuilder.addFeePayerAddress(testData.feePayer.address);
                const tx = (await txBuilder.build());
                const signablePayload = tx.signablePayload;
                should_1.default.equal(signablePayload.toString('hex'), '5efa3c4f02f83a0f4b2d69fc95c607cc02825cc4e7be536ef0992df050d9e67c011aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e73010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d67000000000200dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
            });
            it('should build a unsigned tx and validate its toJson', async function () {
                const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
                const txBuilder = factory.getTransferBuilder(transaction);
                txBuilder.sender(testData.sender2.address);
                txBuilder.recipients(testData.recipients);
                txBuilder.gasData({
                    maxGasAmount: 200000,
                    gasUnitPrice: 100,
                });
                txBuilder.sequenceNumber(14);
                txBuilder.expirationTime(1736246155);
                txBuilder.addFeePayerAddress(testData.feePayer.address);
                const tx = (await txBuilder.build());
                const toJson = tx.toJson();
                should_1.default.equal(toJson.sender, testData.sender2.address);
                should_1.default.deepEqual(toJson.recipients, [
                    {
                        address: testData.recipients[0].address,
                        amount: testData.recipients[0].amount,
                    },
                ]);
                should_1.default.deepEqual(toJson.recipient, {
                    address: testData.recipients[0].address,
                    amount: testData.recipients[0].amount,
                });
                should_1.default.equal(toJson.sequenceNumber, 14);
                should_1.default.equal(toJson.maxGasAmount, 200000);
                should_1.default.equal(toJson.gasUnitPrice, 100);
                should_1.default.equal(toJson.expirationTime, 1736246155);
                should_1.default.equal(toJson.feePayer, testData.feePayer.address);
            });
            it('should build a signed tx and validate its toJson', async function () {
                const txBuilder = factory.from(testData.TRANSACTION_USING_TRANSFER_COINS);
                const tx = (await txBuilder.build());
                const toJson = tx.toJson();
                should_1.default.equal(toJson.id, '0x249289a8178e4b9cdb89fad6e8e436ccc435753e4ea3c9d50e0c8b525582e90d');
                should_1.default.equal(toJson.sender, '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449');
                should_1.default.deepEqual(toJson.recipients, [
                    {
                        address: '0xf7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9',
                        amount: '1000',
                    },
                ]);
                should_1.default.deepEqual(toJson.recipient, {
                    address: '0xf7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9',
                    amount: '1000',
                });
                should_1.default.equal(toJson.sequenceNumber, 146);
                should_1.default.equal(toJson.maxGasAmount, 200000);
                should_1.default.equal(toJson.gasUnitPrice, 100);
                should_1.default.equal(toJson.expirationTime, 1737528215);
            });
        });
        describe('Fail', () => {
            it('should fail for invalid sender', async function () {
                const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
                const builder = factory.getTransferBuilder(transaction);
                (0, should_1.default)(() => builder.sender('randomString')).throwError('Invalid address randomString');
            });
            it('should fail for invalid recipient', async function () {
                const builder = factory.getTransferBuilder();
                (0, should_1.default)(() => builder.recipients([testData.invalidRecipients[0]])).throwError('Invalid address randomString');
                (0, should_1.default)(() => builder.recipients([testData.invalidRecipients[1]])).throwError('Value cannot be less than zero');
                (0, should_1.default)(() => builder.recipients([testData.invalidRecipients[2]])).throwError('Invalid amount format');
            });
            it('should fail for invalid gas amount', async function () {
                const builder = factory.getTransferBuilder();
                (0, should_1.default)(() => builder.gasData({ maxGasAmount: -1, gasUnitPrice: 100 })).throwError('Value cannot be less than zero');
                (0, should_1.default)(() => builder.gasData({ maxGasAmount: 200000, gasUnitPrice: -1 })).throwError('Value cannot be less than zero');
            });
        });
    });
    describe('Legacy Coin Transfer Transaction', () => {
        it('should build a coinz (legacy coin) transfer tx', async function () {
            const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
            const txBuilder = factory.getTransferBuilder(transaction);
            txBuilder.sender(testData.sender2.address);
            txBuilder.recipients(testData.recipients);
            txBuilder.gasData({
                maxGasAmount: 200000,
                gasUnitPrice: 100,
            });
            txBuilder.sequenceNumber(14);
            txBuilder.expirationTime(1736246155);
            txBuilder.assetId(testData.LEGACY_COIN);
            txBuilder.addFeePayerAddress(testData.feePayer.address);
            txBuilder.setIsSimulateTxn(true);
            const tx = (await txBuilder.build());
            should_1.default.equal(tx.sender, testData.sender2.address);
            should_1.default.equal(tx.recipients[0].address, testData.recipients[0].address);
            should_1.default.equal(tx.recipients[0].amount, testData.recipients[0].amount);
            should_1.default.equal(tx.maxGasAmount, 200000);
            should_1.default.equal(tx.gasUnitPrice, 100);
            should_1.default.equal(tx.sequenceNumber, 14);
            should_1.default.equal(tx.expirationTime, 1736246155);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
            tx.inputs.length.should.equal(1);
            tx.inputs[0].should.deepEqual({
                address: testData.sender2.address,
                value: testData.recipients[0].amount,
                coin: 'tapt',
            });
            tx.outputs.length.should.equal(1);
            tx.outputs[0].should.deepEqual({
                address: testData.recipients[0].address,
                value: testData.recipients[0].amount,
                coin: 'tapt',
            });
            const rawTx = tx.toBroadcastFormat();
            should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
            rawTx.should.equal('0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e7301074fb379c10c763a13e724064ecfb7d946690bea519ba982c81b518d1c11dd23fe0766615f7465737405436f696e7a000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d67000000000203040000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f204');
        });
        it('should succeed to validate a valid signablePayload for coinz (legacy coin)', async function () {
            const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
            const txBuilder = factory.getTransferBuilder(transaction);
            txBuilder.sender(testData.sender2.address);
            txBuilder.recipients(testData.recipients);
            txBuilder.gasData({
                maxGasAmount: 200000,
                gasUnitPrice: 100,
            });
            txBuilder.sequenceNumber(14);
            txBuilder.expirationTime(1736246155);
            txBuilder.assetId(testData.LEGACY_COIN);
            txBuilder.addFeePayerAddress(testData.feePayer.address);
            const tx = (await txBuilder.build());
            const signablePayload = tx.signablePayload;
            should_1.default.equal(signablePayload.toString('hex'), '5efa3c4f02f83a0f4b2d69fc95c607cc02825cc4e7be536ef0992df050d9e67c011aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e7301074fb379c10c763a13e724064ecfb7d946690bea519ba982c81b518d1c11dd23fe0766615f7465737405436f696e7a000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d67000000000200dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
        });
        it('should build a coinz (legacy coin) unsigned tx and validate its toJson', async function () {
            const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
            const txBuilder = factory.getTransferBuilder(transaction);
            txBuilder.sender(testData.sender2.address);
            txBuilder.recipients(testData.recipients);
            txBuilder.gasData({
                maxGasAmount: 200000,
                gasUnitPrice: 100,
            });
            txBuilder.sequenceNumber(14);
            txBuilder.expirationTime(1736246155);
            txBuilder.assetId(testData.LEGACY_COIN);
            txBuilder.addFeePayerAddress(testData.feePayer.address);
            const tx = (await txBuilder.build());
            const toJson = tx.toJson();
            should_1.default.equal(toJson.sender, testData.sender2.address);
            should_1.default.deepEqual(toJson.recipients, [
                {
                    address: testData.recipients[0].address,
                    amount: testData.recipients[0].amount,
                },
            ]);
            should_1.default.equal(toJson.sequenceNumber, 14);
            should_1.default.equal(toJson.maxGasAmount, 200000);
            should_1.default.equal(toJson.gasUnitPrice, 100);
            should_1.default.equal(toJson.expirationTime, 1736246155);
            should_1.default.equal(toJson.feePayer, testData.feePayer.address);
        });
    });
    describe('should test for deprecated field recipient in building transaction, without usage of recipients', () => {
        it('should build a transfer tx', async function () {
            const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
            const txBuilder = factory.getTransferBuilder(transaction);
            txBuilder.sender(testData.sender2.address);
            txBuilder.recipient(testData.recipients[0]);
            txBuilder.gasData({
                maxGasAmount: 200000,
                gasUnitPrice: 100,
            });
            txBuilder.sequenceNumber(14);
            txBuilder.expirationTime(1736246155);
            txBuilder.addFeePayerAddress(testData.feePayer.address);
            txBuilder.setIsSimulateTxn(true);
            const tx = (await txBuilder.build());
            should_1.default.equal(tx.sender, testData.sender2.address);
            should_1.default.equal(tx.recipient.address, testData.recipients[0].address);
            should_1.default.equal(tx.recipient.amount, testData.recipients[0].amount);
            should_1.default.equal(tx.maxGasAmount, 200000);
            should_1.default.equal(tx.gasUnitPrice, 100);
            should_1.default.equal(tx.sequenceNumber, 14);
            should_1.default.equal(tx.expirationTime, 1736246155);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
            tx.inputs.length.should.equal(1);
            tx.inputs[0].should.deepEqual({
                address: testData.sender2.address,
                value: testData.recipients[0].amount,
                coin: 'tapt',
            });
            tx.outputs.length.should.equal(1);
            tx.outputs[0].should.deepEqual({
                address: testData.recipients[0].address,
                value: testData.recipients[0].amount,
                coin: 'tapt',
            });
            const rawTx = tx.toBroadcastFormat();
            should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
            rawTx.should.equal('0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e73010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d67000000000203040000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f204');
            const toJson = tx.toJson();
            should_1.default.equal(toJson.sender, testData.sender2.address);
            should_1.default.deepEqual(toJson.recipient, {
                address: testData.recipients[0].address,
                amount: testData.recipients[0].amount,
            });
            should_1.default.equal(toJson.sequenceNumber, 14);
            should_1.default.equal(toJson.maxGasAmount, 200000);
            should_1.default.equal(toJson.gasUnitPrice, 100);
            should_1.default.equal(toJson.expirationTime, 1736246155);
            should_1.default.equal(toJson.feePayer, testData.feePayer.address);
        });
        it('should build and send a signed tx', async function () {
            const txBuilder = factory.from(testData.TRANSACTION_USING_TRANSFER_COINS);
            txBuilder.getSequenceNumber().should.equal(146);
            const tx = (await txBuilder.build());
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
            tx.inputs.length.should.equal(1);
            tx.inputs[0].should.deepEqual({
                address: testData.sender2.address,
                value: testData.recipients[0].amount,
                coin: 'tapt',
            });
            tx.outputs.length.should.equal(1);
            tx.outputs[0].should.deepEqual({
                address: testData.recipients[0].address,
                value: testData.recipients[0].amount,
                coin: 'tapt',
            });
            should_1.default.equal(tx.id, '0x249289a8178e4b9cdb89fad6e8e436ccc435753e4ea3c9d50e0c8b525582e90d');
            should_1.default.equal(tx.maxGasAmount, 200000);
            should_1.default.equal(tx.gasUnitPrice, 100);
            should_1.default.equal(tx.sequenceNumber, 146);
            should_1.default.equal(tx.expirationTime, 1737528215);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
            const rawTx = tx.toBroadcastFormat();
            should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
            should_1.default.equal(rawTx, testData.TRANSACTION_USING_TRANSFER_COINS);
            const toJson = tx.toJson();
            should_1.default.equal(toJson.id, '0x249289a8178e4b9cdb89fad6e8e436ccc435753e4ea3c9d50e0c8b525582e90d');
            should_1.default.equal(toJson.sender, '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449');
            should_1.default.deepEqual(toJson.recipient, {
                address: '0xf7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9',
                amount: '1000',
            });
            should_1.default.equal(toJson.sequenceNumber, 146);
            should_1.default.equal(toJson.maxGasAmount, 200000);
            should_1.default.equal(toJson.gasUnitPrice, 100);
            should_1.default.equal(toJson.expirationTime, 1737528215);
        });
    });
    describe('Batch Transfer', () => {
        it('should build a batch transfer tx', async function () {
            const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
            const txBuilder = factory.getTransferBuilder(transaction);
            txBuilder.sender(testData.sender2.address);
            txBuilder.recipients(testData.batchRecipients);
            txBuilder.gasData({
                maxGasAmount: 200000,
                gasUnitPrice: 100,
            });
            txBuilder.sequenceNumber(14);
            txBuilder.expirationTime(1736246155);
            txBuilder.addFeePayerAddress(testData.feePayer.address);
            txBuilder.setIsSimulateTxn(true);
            const tx = (await txBuilder.build());
            should_1.default.equal(tx.sender, '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449');
            should_1.default.equal(tx.recipients[0].address, '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849');
            should_1.default.equal(tx.recipients[0].amount, '1000');
            should_1.default.equal(tx.recipients[1].address, '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932');
            should_1.default.equal(tx.recipients[1].amount, '1000');
            should_1.default.equal(tx.maxGasAmount, 200000);
            should_1.default.equal(tx.gasUnitPrice, 100);
            should_1.default.equal(tx.sequenceNumber, 14);
            should_1.default.equal(tx.expirationTime, 1736246155);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
            tx.inputs.length.should.equal(1);
            tx.inputs[0].should.deepEqual({
                address: '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449',
                value: '2000',
                coin: 'tapt',
            });
            tx.outputs.length.should.equal(2);
            tx.outputs[0].should.deepEqual({
                address: '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849',
                value: '1000',
                coin: 'tapt',
            });
            tx.outputs[1].should.deepEqual({
                address: '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932',
                value: '1000',
                coin: 'tapt',
            });
            const rawTx = tx.toBroadcastFormat();
            should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
            should_1.default.equal(rawTx, '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e741462617463685f7472616e736665725f636f696e73010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e00024102dd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b8492a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf69321102e803000000000000e803000000000000400d03000000000064000000000000008b037d67000000000203040000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f204');
        });
        it('should succeed to validate a valid signablePayload', async function () {
            const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
            const txBuilder = factory.getTransferBuilder(transaction);
            txBuilder.sender(testData.sender2.address);
            txBuilder.recipients(testData.batchRecipients);
            txBuilder.gasData({
                maxGasAmount: 200000,
                gasUnitPrice: 100,
            });
            txBuilder.sequenceNumber(14);
            txBuilder.expirationTime(1736246155);
            txBuilder.addFeePayerAddress(testData.feePayer.address);
            const tx = (await txBuilder.build());
            const signablePayload = tx.signablePayload;
            should_1.default.equal(signablePayload.toString('hex'), '5efa3c4f02f83a0f4b2d69fc95c607cc02825cc4e7be536ef0992df050d9e67c011aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e741462617463685f7472616e736665725f636f696e73010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e00024102dd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b8492a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf69321102e803000000000000e803000000000000400d03000000000064000000000000008b037d67000000000200dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
        });
        it('should build a unsigned tx and validate its toJson', async function () {
            const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
            const txBuilder = factory.getTransferBuilder(transaction);
            txBuilder.sender(testData.sender2.address);
            txBuilder.recipients(testData.batchRecipients);
            txBuilder.gasData({
                maxGasAmount: 200000,
                gasUnitPrice: 100,
            });
            txBuilder.sequenceNumber(14);
            txBuilder.expirationTime(1736246155);
            txBuilder.addFeePayerAddress(testData.feePayer.address);
            const tx = (await txBuilder.build());
            const toJson = tx.toJson();
            should_1.default.equal(toJson.sender, '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449');
            should_1.default.deepEqual(toJson.recipients, [
                {
                    address: '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849',
                    amount: '1000',
                },
                {
                    address: '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932',
                    amount: '1000',
                },
            ]);
            should_1.default.equal(toJson.sequenceNumber, 14);
            should_1.default.equal(toJson.maxGasAmount, 200000);
            should_1.default.equal(toJson.gasUnitPrice, 100);
            should_1.default.equal(toJson.gasUsed, 0);
            should_1.default.equal(toJson.expirationTime, 1736246155);
            should_1.default.equal(toJson.feePayer, '0xdbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
            should_1.default.equal(toJson.assetId, '0x1::aptos_coin::AptosCoin');
        });
        it('should build and send a signed tx', async function () {
            const txBuilder = factory.from(testData.COIN_BATCH_TRANSFER);
            const tx = (await txBuilder.build());
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
            tx.inputs.length.should.equal(1);
            tx.inputs[0].should.deepEqual({
                address: '0xc8f02d25aa698b3e9fbd8a08e8da4c8ee261832a25a4cde8731b5ec356537d09',
                value: '2000',
                coin: 'tapt',
            });
            tx.outputs.length.should.equal(2);
            tx.outputs[0].should.deepEqual({
                address: '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849',
                value: '1000',
                coin: 'tapt',
            });
            tx.outputs[1].should.deepEqual({
                address: '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932',
                value: '1000',
                coin: 'tapt',
            });
            should_1.default.equal(tx.id, '0xf885489e4737a7ed2773bc11ba95994f2b2edc7d6b67d58e39bad76dd5d71c0c');
            should_1.default.equal(tx.maxGasAmount, 200000);
            should_1.default.equal(tx.gasUnitPrice, 100);
            should_1.default.equal(tx.sequenceNumber, 81);
            should_1.default.equal(tx.expirationTime, 1743442953);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
            const rawTx = tx.toBroadcastFormat();
            should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
            const toJson = tx.toJson();
            should_1.default.equal(toJson.id, '0xf885489e4737a7ed2773bc11ba95994f2b2edc7d6b67d58e39bad76dd5d71c0c');
            should_1.default.equal(toJson.sender, '0xc8f02d25aa698b3e9fbd8a08e8da4c8ee261832a25a4cde8731b5ec356537d09');
            should_1.default.deepEqual(toJson.recipient, {
                address: '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849',
                amount: '1000',
            });
            should_1.default.deepEqual(toJson.recipients, [
                {
                    address: '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849',
                    amount: '1000',
                },
                {
                    address: '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932',
                    amount: '1000',
                },
            ]);
            should_1.default.equal(toJson.sequenceNumber, 81);
            should_1.default.equal(toJson.maxGasAmount, 200000);
            should_1.default.equal(toJson.gasUnitPrice, 100);
            should_1.default.equal(toJson.expirationTime, 1743442953);
            should_1.default.equal(toJson.feePayer, '0xdbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
            should_1.default.equal(toJson.assetId, '0x1::aptos_coin::AptosCoin');
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsc0NBQThFO0FBQzlFLDhEQUFnRDtBQUNoRCw4Q0FBa0Q7QUFDbEQsb0RBQTRCO0FBRTVCLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFakUsUUFBUSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtRQUMvQyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUN2QixFQUFFLENBQUMsNEJBQTRCLEVBQUUsS0FBSztnQkFDcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSx5QkFBbUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDMUQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDMUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztvQkFDaEIsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLFlBQVksRUFBRSxHQUFHO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDckMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztnQkFDNUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN2RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNqRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM1QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztvQkFDNUIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTztvQkFDakMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtvQkFDcEMsSUFBSSxFQUFFLE1BQU07aUJBQ2IsQ0FBQyxDQUFDO2dCQUNILEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztvQkFDN0IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztvQkFDdkMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtvQkFDcEMsSUFBSSxFQUFFLE1BQU07aUJBQ2IsQ0FBQyxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNELEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNoQixraEJBQWtoQixDQUNuaEIsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUs7Z0JBQzNDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7Z0JBQzFFLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRWhELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7Z0JBQzVELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO29CQUM1QixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPO29CQUNqQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO29CQUNwQyxJQUFJLEVBQUUsTUFBTTtpQkFDYixDQUFDLENBQUM7Z0JBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO29CQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO29CQUN2QyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO29CQUNwQyxJQUFJLEVBQUUsTUFBTTtpQkFDYixDQUFDLENBQUM7Z0JBQ0gsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxvRUFBb0UsQ0FBQyxDQUFDO2dCQUMxRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM1QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNELGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUNqRSxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxLQUFLO2dCQUM1RCxNQUFNLFdBQVcsR0FBRyxJQUFJLHlCQUFtQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMxRCxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMxQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDeEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztnQkFDNUQsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDM0MsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDL0IsMGtCQUEwa0IsQ0FDM2tCLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxLQUFLO2dCQUM1RCxNQUFNLFdBQVcsR0FBRyxJQUFJLHlCQUFtQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMxRCxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMxQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNoQixZQUFZLEVBQUUsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEdBQUc7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDeEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztnQkFDNUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMzQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3RELGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7b0JBQ2xDO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87d0JBQ3ZDLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07cUJBQ3RDO2lCQUNGLENBQUMsQ0FBQztnQkFDSCxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO29CQUNqQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO29CQUN2QyxNQUFNLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2lCQUN0QyxDQUFDLENBQUM7Z0JBQ0gsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDeEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDMUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNELENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEtBQUs7Z0JBQzFELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7Z0JBQzFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7Z0JBQzVELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxvRUFBb0UsQ0FBQyxDQUFDO2dCQUM5RixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLG9FQUFvRSxDQUFDLENBQUM7Z0JBQ2xHLGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7b0JBQ2xDO3dCQUNFLE9BQU8sRUFBRSxvRUFBb0U7d0JBQzdFLE1BQU0sRUFBRSxNQUFNO3FCQUNmO2lCQUNGLENBQUMsQ0FBQztnQkFDSCxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO29CQUNqQyxPQUFPLEVBQUUsb0VBQW9FO29CQUM3RSxNQUFNLEVBQUUsTUFBTTtpQkFDZixDQUFDLENBQUM7Z0JBQ0gsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDMUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDcEIsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEtBQUs7Z0JBQ3hDLE1BQU0sV0FBVyxHQUFHLElBQUkseUJBQW1CLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3hELElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDMUYsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSztnQkFDM0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzdDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO2dCQUM3RyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztnQkFDL0csSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDeEcsQ0FBQyxDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSztnQkFDNUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzdDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUMvRSxnQ0FBZ0MsQ0FDakMsQ0FBQztnQkFDRixJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDbEYsZ0NBQWdDLENBQ2pDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO1FBQ2hELEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxLQUFLO1lBQ3hELE1BQU0sV0FBVyxHQUFHLElBQUkseUJBQW1CLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRCxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDaEIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLFlBQVksRUFBRSxHQUFHO2FBQ2xCLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4QyxTQUFTLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUM1RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2dCQUNqQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2dCQUNwQyxJQUFJLEVBQUUsTUFBTTthQUNiLENBQUMsQ0FBQztZQUNILEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUN2QyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2dCQUNwQyxJQUFJLEVBQUUsTUFBTTthQUNiLENBQUMsQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3JDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDaEIsb2dCQUFvZ0IsQ0FDcmdCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0RUFBNEUsRUFBRSxLQUFLO1lBQ3BGLE1BQU0sV0FBVyxHQUFHLElBQUkseUJBQW1CLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRCxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDaEIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLFlBQVksRUFBRSxHQUFHO2FBQ2xCLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4QyxTQUFTLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBQzVELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFDM0MsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDL0IsNGpCQUE0akIsQ0FDN2pCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3RUFBd0UsRUFBRSxLQUFLO1lBQ2hGLE1BQU0sV0FBVyxHQUFHLElBQUkseUJBQW1CLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRCxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDaEIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLFlBQVksRUFBRSxHQUFHO2FBQ2xCLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4QyxTQUFTLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBQzVELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEQsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtnQkFDbEM7b0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztvQkFDdkMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtpQkFDdEM7YUFDRixDQUFDLENBQUM7WUFDSCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDMUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN2QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2hELGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlHQUFpRyxFQUFFLEdBQUcsRUFBRTtRQUMvRyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsS0FBSztZQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLHlCQUFtQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLFNBQVMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2hCLFlBQVksRUFBRSxNQUFNO2dCQUNwQixZQUFZLEVBQUUsR0FBRzthQUNsQixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEQsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDNUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDNUIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTztnQkFDakMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtnQkFDcEMsSUFBSSxFQUFFLE1BQU07YUFDYixDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztnQkFDdkMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtnQkFDcEMsSUFBSSxFQUFFLE1BQU07YUFDYixDQUFDLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2hCLGtoQkFBa2hCLENBQ25oQixDQUFDO1lBQ0YsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0RCxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUNqQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUN2QyxNQUFNLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2FBQ3RDLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUs7WUFDM0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUMxRSxTQUFTLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWhELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDNUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2dCQUNqQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2dCQUNwQyxJQUFJLEVBQUUsTUFBTTthQUNiLENBQUMsQ0FBQztZQUNILEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUN2QyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2dCQUNwQyxJQUFJLEVBQUUsTUFBTTthQUNiLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsb0VBQW9FLENBQUMsQ0FBQztZQUMxRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0QsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLG9FQUFvRSxDQUFDLENBQUM7WUFDOUYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxvRUFBb0UsQ0FBQyxDQUFDO1lBQ2xHLGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQ2pDLE9BQU8sRUFBRSxvRUFBb0U7Z0JBQzdFLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtRQUM5QixFQUFFLENBQUMsa0NBQWtDLEVBQUUsS0FBSztZQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLHlCQUFtQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2hCLFlBQVksRUFBRSxNQUFNO2dCQUNwQixZQUFZLEVBQUUsR0FBRzthQUNsQixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEQsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDNUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxvRUFBb0UsQ0FBQyxDQUFDO1lBQzlGLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLG9FQUFvRSxDQUFDLENBQUM7WUFDN0csZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsb0VBQW9FLENBQUMsQ0FBQztZQUM3RyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDNUIsT0FBTyxFQUFFLG9FQUFvRTtnQkFDN0UsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsSUFBSSxFQUFFLE1BQU07YUFDYixDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLG9FQUFvRTtnQkFDN0UsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsSUFBSSxFQUFFLE1BQU07YUFDYixDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxvRUFBb0U7Z0JBQzdFLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNELGdCQUFNLENBQUMsS0FBSyxDQUNWLEtBQUssRUFDTCxrbkJBQWtuQixDQUNubkIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEtBQUs7WUFDNUQsTUFBTSxXQUFXLEdBQUcsSUFBSSx5QkFBbUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFELFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMvQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNoQixZQUFZLEVBQUUsTUFBTTtnQkFDcEIsWUFBWSxFQUFFLEdBQUc7YUFDbEIsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDNUQsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FDVixlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUMvQiwwcUJBQTBxQixDQUMzcUIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEtBQUs7WUFDNUQsTUFBTSxXQUFXLEdBQUcsSUFBSSx5QkFBbUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFELFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMvQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNoQixZQUFZLEVBQUUsTUFBTTtnQkFDcEIsWUFBWSxFQUFFLEdBQUc7YUFDbEIsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QixTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDNUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsb0VBQW9FLENBQUMsQ0FBQztZQUNsRyxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUNsQztvQkFDRSxPQUFPLEVBQUUsb0VBQW9FO29CQUM3RSxNQUFNLEVBQUUsTUFBTTtpQkFDZjtnQkFDRDtvQkFDRSxPQUFPLEVBQUUsb0VBQW9FO29CQUM3RSxNQUFNLEVBQUUsTUFBTTtpQkFDZjthQUNGLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNoRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLG9FQUFvRSxDQUFDLENBQUM7WUFDcEcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUs7WUFDM0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUM3RCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBQzVELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDNUIsT0FBTyxFQUFFLG9FQUFvRTtnQkFDN0UsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsSUFBSSxFQUFFLE1BQU07YUFDYixDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLG9FQUFvRTtnQkFDN0UsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsSUFBSSxFQUFFLE1BQU07YUFDYixDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxvRUFBb0U7Z0JBQzdFLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxvRUFBb0UsQ0FBQyxDQUFDO1lBQzFGLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3JDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxvRUFBb0UsQ0FBQyxDQUFDO1lBQzlGLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsb0VBQW9FLENBQUMsQ0FBQztZQUNsRyxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUNqQyxPQUFPLEVBQUUsb0VBQW9FO2dCQUM3RSxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xDO29CQUNFLE9BQU8sRUFBRSxvRUFBb0U7b0JBQzdFLE1BQU0sRUFBRSxNQUFNO2lCQUNmO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxvRUFBb0U7b0JBQzdFLE1BQU0sRUFBRSxNQUFNO2lCQUNmO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNoRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLG9FQUFvRSxDQUFDLENBQUM7WUFDcEcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvYXB0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmRlc2NyaWJlKCdBcHQgVHJhbnNmZXIgVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhcHQnKSk7XG5cbiAgZGVzY3JpYmUoJ0FwdG9zIENvaW4gVHJhbnNmZXIgVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ1N1Y2NlZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hZGRyZXNzLCB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hbW91bnQsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudC5hZGRyZXNzLCB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hbW91bnQsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudC5hbW91bnQsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4Lm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5leHBpcmF0aW9uVGltZSwgMTczNjI0NjE1NSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndGFwdCcsXG4gICAgICAgIH0pO1xuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndGFwdCcsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICAgIHJhd1R4LnNob3VsZC5lcXVhbChcbiAgICAgICAgICAnMHgxYWVkODA4OTE2YWI5YjFiMzBiMDdhYmI1MzU2MWFmZDQ2ODQ3Mjg1Y2UyODY1MTIyMWQ0MDYxNzNhMzcyNDQ5MGUwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBkNjE3MDc0NmY3MzVmNjE2MzYzNmY3NTZlNzQwZTc0NzI2MTZlNzM2NjY1NzI1ZjYzNmY2OTZlNzMwMTA3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBhNjE3MDc0NmY3MzVmNjM2ZjY5NmUwOTQxNzA3NDZmNzM0MzZmNjk2ZTAwMDIyMGY3NDA1YzI4YTAyY2Y1YmFiNGVhNDQ5ODI0MGJiMzU3OWRiNDU5NTE3OTRlYjFjODQzYmVmMDUzNGMwOTNhZDkwOGU4MDMwMDAwMDAwMDAwMDA0MDBkMDMwMDAwMDAwMDAwNjQwMDAwMDAwMDAwMDAwMDhiMDM3ZDY3MDAwMDAwMDAwMjAzMDQwMDAwZGJjODdhMWM4MTZkOWJjZDA2YjY4M2MzN2U4MGM3MTYyZTRkNDhkYTc4MTIxOThiODMwZTRkNWQ4ZTA2MjlmMjA0J1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNlbmQgYSBzaWduZWQgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5UUkFOU0FDVElPTl9VU0lOR19UUkFOU0ZFUl9DT0lOUyk7XG4gICAgICAgIHR4QnVpbGRlci5nZXRTZXF1ZW5jZU51bWJlcigpLnNob3VsZC5lcXVhbCgxNDYpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3RhcHQnLFxuICAgICAgICB9KTtcbiAgICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3RhcHQnLFxuICAgICAgICB9KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LmlkLCAnMHgyNDkyODlhODE3OGU0YjljZGI4OWZhZDZlOGU0MzZjY2M0MzU3NTNlNGVhM2M5ZDUwZTBjOGI1MjU1ODJlOTBkJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zZXF1ZW5jZU51bWJlciwgMTQ2KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LmV4cGlyYXRpb25UaW1lLCAxNzM3NTI4MjE1KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlRSQU5TQUNUSU9OX1VTSU5HX1RSQU5TRkVSX0NPSU5TKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmFsaWRhdGUgYSB2YWxpZCBzaWduYWJsZVBheWxvYWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZCA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgIHNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgJzVlZmEzYzRmMDJmODNhMGY0YjJkNjlmYzk1YzYwN2NjMDI4MjVjYzRlN2JlNTM2ZWYwOTkyZGYwNTBkOWU2N2MwMTFhZWQ4MDg5MTZhYjliMWIzMGIwN2FiYjUzNTYxYWZkNDY4NDcyODVjZTI4NjUxMjIxZDQwNjE3M2EzNzI0NDkwZTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMGQ2MTcwNzQ2ZjczNWY2MTYzNjM2Zjc1NmU3NDBlNzQ3MjYxNmU3MzY2NjU3MjVmNjM2ZjY5NmU3MzAxMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMGE2MTcwNzQ2ZjczNWY2MzZmNjk2ZTA5NDE3MDc0NmY3MzQzNmY2OTZlMDAwMjIwZjc0MDVjMjhhMDJjZjViYWI0ZWE0NDk4MjQwYmIzNTc5ZGI0NTk1MTc5NGViMWM4NDNiZWYwNTM0YzA5M2FkOTA4ZTgwMzAwMDAwMDAwMDAwMDQwMGQwMzAwMDAwMDAwMDA2NDAwMDAwMDAwMDAwMDAwOGIwMzdkNjcwMDAwMDAwMDAyMDBkYmM4N2ExYzgxNmQ5YmNkMDZiNjgzYzM3ZTgwYzcxNjJlNGQ0OGRhNzgxMjE5OGI4MzBlNGQ1ZDhlMDYyOWYyJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSB1bnNpZ25lZCB0eCBhbmQgdmFsaWRhdGUgaXRzIHRvSnNvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnRzLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0b0pzb24ucmVjaXBpZW50LCB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIH0pO1xuICAgICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24ubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5leHBpcmF0aW9uVGltZSwgMTczNjI0NjE1NSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZmVlUGF5ZXIsIHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzaWduZWQgdHggYW5kIHZhbGlkYXRlIGl0cyB0b0pzb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5UUkFOU0FDVElPTl9VU0lOR19UUkFOU0ZFUl9DT0lOUyk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0b0pzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5pZCwgJzB4MjQ5Mjg5YTgxNzhlNGI5Y2RiODlmYWQ2ZThlNDM2Y2NjNDM1NzUzZTRlYTNjOWQ1MGUwYzhiNTI1NTgyZTkwZCcpO1xuICAgICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlbmRlciwgJzB4MWFlZDgwODkxNmFiOWIxYjMwYjA3YWJiNTM1NjFhZmQ0Njg0NzI4NWNlMjg2NTEyMjFkNDA2MTczYTM3MjQ0OScpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnRzLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJzB4Zjc0MDVjMjhhMDJjZjViYWI0ZWE0NDk4MjQwYmIzNTc5ZGI0NTk1MTc5NGViMWM4NDNiZWYwNTM0YzA5M2FkOScsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0b0pzb24ucmVjaXBpZW50LCB7XG4gICAgICAgICAgYWRkcmVzczogJzB4Zjc0MDVjMjhhMDJjZjViYWI0ZWE0NDk4MjQwYmIzNTc5ZGI0NTk1MTc5NGViMWM4NDNiZWYwNTM0YzA5M2FkOScsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMCcsXG4gICAgICAgIH0pO1xuICAgICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlcXVlbmNlTnVtYmVyLCAxNDYpO1xuICAgICAgICBzaG91bGQuZXF1YWwodG9Kc29uLm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZXhwaXJhdGlvblRpbWUsIDE3Mzc1MjgyMTUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnRmFpbCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBzZW5kZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5zZW5kZXIoJ3JhbmRvbVN0cmluZycpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGFkZHJlc3MgcmFuZG9tU3RyaW5nJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHJlY2lwaWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnJlY2lwaWVudHMoW3Rlc3REYXRhLmludmFsaWRSZWNpcGllbnRzWzBdXSkpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyByYW5kb21TdHJpbmcnKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIucmVjaXBpZW50cyhbdGVzdERhdGEuaW52YWxpZFJlY2lwaWVudHNbMV1dKSkudGhyb3dFcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnJlY2lwaWVudHMoW3Rlc3REYXRhLmludmFsaWRSZWNpcGllbnRzWzJdXSkpLnRocm93RXJyb3IoJ0ludmFsaWQgYW1vdW50IGZvcm1hdCcpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgZ2FzIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLmdhc0RhdGEoeyBtYXhHYXNBbW91bnQ6IC0xLCBnYXNVbml0UHJpY2U6IDEwMCB9KSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJ1xuICAgICAgICApO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKHsgbWF4R2FzQW1vdW50OiAyMDAwMDAsIGdhc1VuaXRQcmljZTogLTEgfSkpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybydcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTGVnYWN5IENvaW4gVHJhbnNmZXIgVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIGNvaW56IChsZWdhY3kgY29pbikgdHJhbnNmZXIgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2ZlclRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICB0eEJ1aWxkZXIuYXNzZXRJZCh0ZXN0RGF0YS5MRUdBQ1lfQ09JTik7XG4gICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hZGRyZXNzLCB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHNbMF0uYW1vdW50LCB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZXF1ZW5jZU51bWJlciwgMTQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmV4cGlyYXRpb25UaW1lLCAxNzM2MjQ2MTU1KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXB0JyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXB0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4QnVpbGRlci5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJzB4MWFlZDgwODkxNmFiOWIxYjMwYjA3YWJiNTM1NjFhZmQ0Njg0NzI4NWNlMjg2NTEyMjFkNDA2MTczYTM3MjQ0OTBlMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwZDYxNzA3NDZmNzM1ZjYxNjM2MzZmNzU2ZTc0MGU3NDcyNjE2ZTczNjY2NTcyNWY2MzZmNjk2ZTczMDEwNzRmYjM3OWMxMGM3NjNhMTNlNzI0MDY0ZWNmYjdkOTQ2NjkwYmVhNTE5YmE5ODJjODFiNTE4ZDFjMTFkZDIzZmUwNzY2NjE1Zjc0NjU3Mzc0MDU0MzZmNjk2ZTdhMDAwMjIwZjc0MDVjMjhhMDJjZjViYWI0ZWE0NDk4MjQwYmIzNTc5ZGI0NTk1MTc5NGViMWM4NDNiZWYwNTM0YzA5M2FkOTA4ZTgwMzAwMDAwMDAwMDAwMDQwMGQwMzAwMDAwMDAwMDA2NDAwMDAwMDAwMDAwMDAwOGIwMzdkNjcwMDAwMDAwMDAyMDMwNDAwMDBkYmM4N2ExYzgxNmQ5YmNkMDZiNjgzYzM3ZTgwYzcxNjJlNGQ0OGRhNzgxMjE5OGI4MzBlNGQ1ZDhlMDYyOWYyMDQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIGEgdmFsaWQgc2lnbmFibGVQYXlsb2FkIGZvciBjb2lueiAobGVnYWN5IGNvaW4pJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgdHhCdWlsZGVyLmFzc2V0SWQodGVzdERhdGEuTEVHQUNZX0NPSU4pO1xuICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gdHguc2lnbmFibGVQYXlsb2FkO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICBzaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAnNWVmYTNjNGYwMmY4M2EwZjRiMmQ2OWZjOTVjNjA3Y2MwMjgyNWNjNGU3YmU1MzZlZjA5OTJkZjA1MGQ5ZTY3YzAxMWFlZDgwODkxNmFiOWIxYjMwYjA3YWJiNTM1NjFhZmQ0Njg0NzI4NWNlMjg2NTEyMjFkNDA2MTczYTM3MjQ0OTBlMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwZDYxNzA3NDZmNzM1ZjYxNjM2MzZmNzU2ZTc0MGU3NDcyNjE2ZTczNjY2NTcyNWY2MzZmNjk2ZTczMDEwNzRmYjM3OWMxMGM3NjNhMTNlNzI0MDY0ZWNmYjdkOTQ2NjkwYmVhNTE5YmE5ODJjODFiNTE4ZDFjMTFkZDIzZmUwNzY2NjE1Zjc0NjU3Mzc0MDU0MzZmNjk2ZTdhMDAwMjIwZjc0MDVjMjhhMDJjZjViYWI0ZWE0NDk4MjQwYmIzNTc5ZGI0NTk1MTc5NGViMWM4NDNiZWYwNTM0YzA5M2FkOTA4ZTgwMzAwMDAwMDAwMDAwMDQwMGQwMzAwMDAwMDAwMDA2NDAwMDAwMDAwMDAwMDAwOGIwMzdkNjcwMDAwMDAwMDAyMDBkYmM4N2ExYzgxNmQ5YmNkMDZiNjgzYzM3ZTgwYzcxNjJlNGQ0OGRhNzgxMjE5OGI4MzBlNGQ1ZDhlMDYyOWYyJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBjb2lueiAobGVnYWN5IGNvaW4pIHVuc2lnbmVkIHR4IGFuZCB2YWxpZGF0ZSBpdHMgdG9Kc29uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgdHhCdWlsZGVyLmFzc2V0SWQodGVzdERhdGEuTEVHQUNZX0NPSU4pO1xuICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlbmRlciwgdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodG9Kc29uLnJlY2lwaWVudHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5leHBpcmF0aW9uVGltZSwgMTczNjI0NjE1NSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmZlZVBheWVyLCB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCB0ZXN0IGZvciBkZXByZWNhdGVkIGZpZWxkIHJlY2lwaWVudCBpbiBidWlsZGluZyB0cmFuc2FjdGlvbiwgd2l0aG91dCB1c2FnZSBvZiByZWNpcGllbnRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2ZlciB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudCh0ZXN0RGF0YS5yZWNpcGllbnRzWzBdKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZXRJc1NpbXVsYXRlVHhuKHRydWUpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudC5hZGRyZXNzLCB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudC5hbW91bnQsIHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvblRpbWUsIDE3MzYyNDYxNTUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMHgxYWVkODA4OTE2YWI5YjFiMzBiMDdhYmI1MzU2MWFmZDQ2ODQ3Mjg1Y2UyODY1MTIyMWQ0MDYxNzNhMzcyNDQ5MGUwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBkNjE3MDc0NmY3MzVmNjE2MzYzNmY3NTZlNzQwZTc0NzI2MTZlNzM2NjY1NzI1ZjYzNmY2OTZlNzMwMTA3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBhNjE3MDc0NmY3MzVmNjM2ZjY5NmUwOTQxNzA3NDZmNzM0MzZmNjk2ZTAwMDIyMGY3NDA1YzI4YTAyY2Y1YmFiNGVhNDQ5ODI0MGJiMzU3OWRiNDU5NTE3OTRlYjFjODQzYmVmMDUzNGMwOTNhZDkwOGU4MDMwMDAwMDAwMDAwMDA0MDBkMDMwMDAwMDAwMDAwNjQwMDAwMDAwMDAwMDAwMDhiMDM3ZDY3MDAwMDAwMDAwMjAzMDQwMDAwZGJjODdhMWM4MTZkOWJjZDA2YjY4M2MzN2U4MGM3MTYyZTRkNDhkYTc4MTIxOThiODMwZTRkNWQ4ZTA2MjlmMjA0J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHRvSnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnQsIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5leHBpcmF0aW9uVGltZSwgMTczNjI0NjE1NSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmZlZVBheWVyLCB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNlbmQgYSBzaWduZWQgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuVFJBTlNBQ1RJT05fVVNJTkdfVFJBTlNGRVJfQ09JTlMpO1xuICAgICAgdHhCdWlsZGVyLmdldFNlcXVlbmNlTnVtYmVyKCkuc2hvdWxkLmVxdWFsKDE0Nik7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQnLFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaWQsICcweDI0OTI4OWE4MTc4ZTRiOWNkYjg5ZmFkNmU4ZTQzNmNjYzQzNTc1M2U0ZWEzYzlkNTBlMGM4YjUyNTU4MmU5MGQnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcXVlbmNlTnVtYmVyLCAxNDYpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmV4cGlyYXRpb25UaW1lLCAxNzM3NTI4MjE1KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5UUkFOU0FDVElPTl9VU0lOR19UUkFOU0ZFUl9DT0lOUyk7XG4gICAgICBjb25zdCB0b0pzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uaWQsICcweDI0OTI4OWE4MTc4ZTRiOWNkYjg5ZmFkNmU4ZTQzNmNjYzQzNTc1M2U0ZWEzYzlkNTBlMGM4YjUyNTU4MmU5MGQnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uc2VuZGVyLCAnMHgxYWVkODA4OTE2YWI5YjFiMzBiMDdhYmI1MzU2MWFmZDQ2ODQ3Mjg1Y2UyODY1MTIyMWQ0MDYxNzNhMzcyNDQ5Jyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnQsIHtcbiAgICAgICAgYWRkcmVzczogJzB4Zjc0MDVjMjhhMDJjZjViYWI0ZWE0NDk4MjQwYmIzNTc5ZGI0NTk1MTc5NGViMWM4NDNiZWYwNTM0YzA5M2FkOScsXG4gICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlcXVlbmNlTnVtYmVyLCAxNDYpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZXhwaXJhdGlvblRpbWUsIDE3Mzc1MjgyMTUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQmF0Y2ggVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIGJhdGNoIHRyYW5zZmVyIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5iYXRjaFJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNldElzU2ltdWxhdGVUeG4odHJ1ZSk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsICcweDFhZWQ4MDg5MTZhYjliMWIzMGIwN2FiYjUzNTYxYWZkNDY4NDcyODVjZTI4NjUxMjIxZDQwNjE3M2EzNzI0NDknKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzBdLmFkZHJlc3MsICcweGRkNTJjMGI3MmE3MzY5NmI4NjdkNjU3MWEzMDhjNDEzZTQzYmZmOGY0NDk1NmE1OTkxYWJjNGQ1MGRiMGI4NDknKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzBdLmFtb3VudCwgJzEwMDAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzFdLmFkZHJlc3MsICcweDJhODE3NjBkNTJkYjlhOTZkZjI2MDk4NjAyMTgyMTRiNmQxMDEyZTc3ZTg0YTNmZWQ1MTQ1YTlhNjViZjY5MzInKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzFdLmFtb3VudCwgJzEwMDAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvblRpbWUsIDE3MzYyNDYxNTUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiAnMHgxYWVkODA4OTE2YWI5YjFiMzBiMDdhYmI1MzU2MWFmZDQ2ODQ3Mjg1Y2UyODY1MTIyMWQ0MDYxNzNhMzcyNDQ5JyxcbiAgICAgICAgdmFsdWU6ICcyMDAwJyxcbiAgICAgICAgY29pbjogJ3RhcHQnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiAnMHhkZDUyYzBiNzJhNzM2OTZiODY3ZDY1NzFhMzA4YzQxM2U0M2JmZjhmNDQ5NTZhNTk5MWFiYzRkNTBkYjBiODQ5JyxcbiAgICAgICAgdmFsdWU6ICcxMDAwJyxcbiAgICAgICAgY29pbjogJ3RhcHQnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzFdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiAnMHgyYTgxNzYwZDUyZGI5YTk2ZGYyNjA5ODYwMjE4MjE0YjZkMTAxMmU3N2U4NGEzZmVkNTE0NWE5YTY1YmY2OTMyJyxcbiAgICAgICAgdmFsdWU6ICcxMDAwJyxcbiAgICAgICAgY29pbjogJ3RhcHQnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICByYXdUeCxcbiAgICAgICAgJzB4MWFlZDgwODkxNmFiOWIxYjMwYjA3YWJiNTM1NjFhZmQ0Njg0NzI4NWNlMjg2NTEyMjFkNDA2MTczYTM3MjQ0OTBlMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwZDYxNzA3NDZmNzM1ZjYxNjM2MzZmNzU2ZTc0MTQ2MjYxNzQ2MzY4NWY3NDcyNjE2ZTczNjY2NTcyNWY2MzZmNjk2ZTczMDEwNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwYTYxNzA3NDZmNzM1ZjYzNmY2OTZlMDk0MTcwNzQ2ZjczNDM2ZjY5NmUwMDAyNDEwMmRkNTJjMGI3MmE3MzY5NmI4NjdkNjU3MWEzMDhjNDEzZTQzYmZmOGY0NDk1NmE1OTkxYWJjNGQ1MGRiMGI4NDkyYTgxNzYwZDUyZGI5YTk2ZGYyNjA5ODYwMjE4MjE0YjZkMTAxMmU3N2U4NGEzZmVkNTE0NWE5YTY1YmY2OTMyMTEwMmU4MDMwMDAwMDAwMDAwMDBlODAzMDAwMDAwMDAwMDAwNDAwZDAzMDAwMDAwMDAwMDY0MDAwMDAwMDAwMDAwMDA4YjAzN2Q2NzAwMDAwMDAwMDIwMzA0MDAwMGRiYzg3YTFjODE2ZDliY2QwNmI2ODNjMzdlODBjNzE2MmU0ZDQ4ZGE3ODEyMTk4YjgzMGU0ZDVkOGUwNjI5ZjIwNCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmFsaWRhdGUgYSB2YWxpZCBzaWduYWJsZVBheWxvYWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2ZlclRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLmJhdGNoUmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZCA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgJzVlZmEzYzRmMDJmODNhMGY0YjJkNjlmYzk1YzYwN2NjMDI4MjVjYzRlN2JlNTM2ZWYwOTkyZGYwNTBkOWU2N2MwMTFhZWQ4MDg5MTZhYjliMWIzMGIwN2FiYjUzNTYxYWZkNDY4NDcyODVjZTI4NjUxMjIxZDQwNjE3M2EzNzI0NDkwZTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMGQ2MTcwNzQ2ZjczNWY2MTYzNjM2Zjc1NmU3NDE0NjI2MTc0NjM2ODVmNzQ3MjYxNmU3MzY2NjU3MjVmNjM2ZjY5NmU3MzAxMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMGE2MTcwNzQ2ZjczNWY2MzZmNjk2ZTA5NDE3MDc0NmY3MzQzNmY2OTZlMDAwMjQxMDJkZDUyYzBiNzJhNzM2OTZiODY3ZDY1NzFhMzA4YzQxM2U0M2JmZjhmNDQ5NTZhNTk5MWFiYzRkNTBkYjBiODQ5MmE4MTc2MGQ1MmRiOWE5NmRmMjYwOTg2MDIxODIxNGI2ZDEwMTJlNzdlODRhM2ZlZDUxNDVhOWE2NWJmNjkzMjExMDJlODAzMDAwMDAwMDAwMDAwZTgwMzAwMDAwMDAwMDAwMDQwMGQwMzAwMDAwMDAwMDA2NDAwMDAwMDAwMDAwMDAwOGIwMzdkNjcwMDAwMDAwMDAyMDBkYmM4N2ExYzgxNmQ5YmNkMDZiNjgzYzM3ZTgwYzcxNjJlNGQ0OGRhNzgxMjE5OGI4MzBlNGQ1ZDhlMDYyOWYyJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB1bnNpZ25lZCB0eCBhbmQgdmFsaWRhdGUgaXRzIHRvSnNvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEuYmF0Y2hSZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlbmRlciwgJzB4MWFlZDgwODkxNmFiOWIxYjMwYjA3YWJiNTM1NjFhZmQ0Njg0NzI4NWNlMjg2NTEyMjFkNDA2MTczYTM3MjQ0OScpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0b0pzb24ucmVjaXBpZW50cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJzB4ZGQ1MmMwYjcyYTczNjk2Yjg2N2Q2NTcxYTMwOGM0MTNlNDNiZmY4ZjQ0OTU2YTU5OTFhYmM0ZDUwZGIwYjg0OScsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiAnMHgyYTgxNzYwZDUyZGI5YTk2ZGYyNjA5ODYwMjE4MjE0YjZkMTAxMmU3N2U4NGEzZmVkNTE0NWE5YTY1YmY2OTMyJyxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAwJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZXF1ZW5jZU51bWJlciwgMTQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZ2FzVXNlZCwgMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmV4cGlyYXRpb25UaW1lLCAxNzM2MjQ2MTU1KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZmVlUGF5ZXIsICcweGRiYzg3YTFjODE2ZDliY2QwNmI2ODNjMzdlODBjNzE2MmU0ZDQ4ZGE3ODEyMTk4YjgzMGU0ZDVkOGUwNjI5ZjInKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uYXNzZXRJZCwgJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzZW5kIGEgc2lnbmVkIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLkNPSU5fQkFUQ0hfVFJBTlNGRVIpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6ICcweGM4ZjAyZDI1YWE2OThiM2U5ZmJkOGEwOGU4ZGE0YzhlZTI2MTgzMmEyNWE0Y2RlODczMWI1ZWMzNTY1MzdkMDknLFxuICAgICAgICB2YWx1ZTogJzIwMDAnLFxuICAgICAgICBjb2luOiAndGFwdCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6ICcweGRkNTJjMGI3MmE3MzY5NmI4NjdkNjU3MWEzMDhjNDEzZTQzYmZmOGY0NDk1NmE1OTkxYWJjNGQ1MGRiMGI4NDknLFxuICAgICAgICB2YWx1ZTogJzEwMDAnLFxuICAgICAgICBjb2luOiAndGFwdCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6ICcweDJhODE3NjBkNTJkYjlhOTZkZjI2MDk4NjAyMTgyMTRiNmQxMDEyZTc3ZTg0YTNmZWQ1MTQ1YTlhNjViZjY5MzInLFxuICAgICAgICB2YWx1ZTogJzEwMDAnLFxuICAgICAgICBjb2luOiAndGFwdCcsXG4gICAgICB9KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pZCwgJzB4Zjg4NTQ4OWU0NzM3YTdlZDI3NzNiYzExYmE5NTk5NGYyYjJlZGM3ZDZiNjdkNThlMzliYWQ3NmRkNWQ3MWMwYycpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VxdWVuY2VOdW1iZXIsIDgxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5leHBpcmF0aW9uVGltZSwgMTc0MzQ0Mjk1Myk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4QnVpbGRlci5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIGNvbnN0IHRvSnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5pZCwgJzB4Zjg4NTQ4OWU0NzM3YTdlZDI3NzNiYzExYmE5NTk5NGYyYjJlZGM3ZDZiNjdkNThlMzliYWQ3NmRkNWQ3MWMwYycpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZW5kZXIsICcweGM4ZjAyZDI1YWE2OThiM2U5ZmJkOGEwOGU4ZGE0YzhlZTI2MTgzMmEyNWE0Y2RlODczMWI1ZWMzNTY1MzdkMDknKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodG9Kc29uLnJlY2lwaWVudCwge1xuICAgICAgICBhZGRyZXNzOiAnMHhkZDUyYzBiNzJhNzM2OTZiODY3ZDY1NzFhMzA4YzQxM2U0M2JmZjhmNDQ5NTZhNTk5MWFiYzRkNTBkYjBiODQ5JyxcbiAgICAgICAgYW1vdW50OiAnMTAwMCcsXG4gICAgICB9KTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodG9Kc29uLnJlY2lwaWVudHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6ICcweGRkNTJjMGI3MmE3MzY5NmI4NjdkNjU3MWEzMDhjNDEzZTQzYmZmOGY0NDk1NmE1OTkxYWJjNGQ1MGRiMGI4NDknLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJzB4MmE4MTc2MGQ1MmRiOWE5NmRmMjYwOTg2MDIxODIxNGI2ZDEwMTJlNzdlODRhM2ZlZDUxNDVhOWE2NWJmNjkzMicsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMCcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uc2VxdWVuY2VOdW1iZXIsIDgxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24ubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmV4cGlyYXRpb25UaW1lLCAxNzQzNDQyOTUzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZmVlUGF5ZXIsICcweGRiYzg3YTFjODE2ZDliY2QwNmI2ODNjMzdlODBjNzE2MmU0ZDQ4ZGE3ODEyMTk4YjgzMGU0ZDVkOGUwNjI5ZjInKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uYXNzZXRJZCwgJzB4MTo6YXB0b3NfY29pbjo6QXB0b3NDb2luJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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