PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/integration
Просмотр файла: blockchain.js
"use strict";
//
// Tests for Wallet
//
// Copyright 2014, BitGo, Inc. All Rights Reserved.
//
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable @typescript-eslint/no-empty-function */
const assert_1 = require("assert");
require("should");
const BitGoJS = require('../../src/index');
const TestBitGo = require('../lib/test_bitgo');
const TEST_ADDRESS1 = '2N4Xz4itCdKKUREiySS7oBzoXUKnuxP4nRD';
const TEST_MANYTRANSACTIONSADDRESS = 'moCVzXCQgrHdZEhwRmkLHYM9N4wq77n5eL';
const TEST_TRANSACTION = 'c82775ab4f266573820f085c7a466591dfb96af689f9ccce9eba7f87020dc6a6';
const TEST_BLOCK = '00000000000000066fff8a67fbb6fac31e9c4ce5b1eabc279ce53218106aa26a';
describe('Address', function () {
let bitgo;
let blockchain;
before(function (done) {
BitGoJS.setNetwork('testnet');
bitgo = new TestBitGo();
bitgo.initializeTestVars();
blockchain = bitgo.blockchain();
done();
});
describe('Get Address', function () {
it('arguments', function (done) {
assert_1.strict.throws(function () {
blockchain.getAddress('invalid', function () { });
});
assert_1.strict.throws(function () {
blockchain.getAddress({});
});
done();
});
it('get', function (done) {
blockchain.getAddress({ address: TEST_ADDRESS1 }, function (err, address) {
assert_1.strict.equal(err, null);
address.should.have.property('address');
address.should.have.property('balance');
address.should.have.property('confirmedBalance');
done();
});
});
});
describe('Get Address Transactions', function () {
it('arguments', function (done) {
assert_1.strict.throws(function () {
blockchain.getAddressTransactions('invalid', function () { });
});
assert_1.strict.throws(function () {
blockchain.getAddressTransactions({});
});
done();
});
it('list', function (done) {
const options = { address: TEST_ADDRESS1 };
blockchain.getAddressTransactions(options, function (err, result) {
assert_1.strict.equal(err, null);
assert_1.strict.equal(Array.isArray(result.transactions), true);
assert_1.strict.equal(result.start, 0);
result.should.have.property('total');
result.should.have.property('count');
done();
});
});
it('list_many_transactions', function (done) {
const options = { address: TEST_MANYTRANSACTIONSADDRESS };
blockchain.getAddressTransactions(options, function (err, result) {
assert_1.strict.equal(err, null);
assert_1.strict.equal(Array.isArray(result.transactions), true);
assert_1.strict.equal(result.start, 0);
result.should.have.property('total');
result.should.have.property('count');
(0, assert_1.strict)(result.transactions.length > 20);
assert_1.strict.equal(result.transactions.length, result.count);
(0, assert_1.strict)(result.total > 75);
done();
});
});
});
describe('Get Address Unspents', function () {
it('arguments', function (done) {
assert_1.strict.throws(function () {
blockchain.getAddressUnspents('invalid', function () { });
});
assert_1.strict.throws(function () {
blockchain.getAddressUnspents({ limit: 'a string!' }, function () { });
});
assert_1.strict.throws(function () {
blockchain.getAddressUnspents({});
});
done();
});
it('list', function (done) {
const options = { address: TEST_ADDRESS1, limit: 0.5 * 1e8 };
blockchain.getAddressUnspents(options, function (err, unspents) {
assert_1.strict.equal(err, null);
assert_1.strict.equal(Array.isArray(unspents), true);
done();
});
});
});
describe('Get Transaction', function () {
it('arguments', function (done) {
assert_1.strict.throws(function () {
blockchain.getTransaction('invalid', function () { });
});
assert_1.strict.throws(function () {
blockchain.getTransaction({});
});
assert_1.strict.throws(function () {
blockchain.getTransaction({}, function () { });
});
done();
});
it('get', function (done) {
blockchain.getTransaction({ id: TEST_TRANSACTION }, function (err, transaction) {
assert_1.strict.equal(err, null);
transaction.should.have.property('id');
transaction.should.have.property('date');
transaction.should.have.property('entries');
assert_1.strict.equal(Array.isArray(transaction.entries), true);
assert_1.strict.equal(transaction.entries.length, 3);
const transactionEntry = transaction.entries[0];
transactionEntry.should.have.property('account');
transactionEntry.should.have.property('value');
done();
});
});
});
describe('Get Transaction By Input', function () {
it('arguments', function (done) {
assert_1.strict.throws(function () {
blockchain.getTransactionByInput('invalid', function () { });
});
assert_1.strict.throws(function () {
blockchain.getTransactionByInput({ txid: '90411397fd43aa1e285a0c2b3ac8cb341f26805e14e69264dacf91801d9fd6e2' }, function () { });
});
assert_1.strict.throws(function () {
blockchain.getTransactionByInput({ vout: 999 }, function () { });
});
assert_1.strict.throws(function () {
blockchain.getTransactionByInput({ txid: '90411397fd43aa1e285a0c2b3ac8cb341f26805e14e69264dacf91801d9fd6e2', vout: 'asdf' }, function () { });
});
assert_1.strict.throws(function () {
blockchain.getTransactionByInput({});
});
assert_1.strict.throws(function () {
blockchain.getTransactionByInput({}, function () { });
});
done();
});
it('get', function (done) {
blockchain.getTransactionByInput({ txid: TEST_TRANSACTION, vout: 0 }, function (err, result) {
assert_1.strict.equal(err, null);
result.should.have.property('transactions');
result.transactions.length.should.eql(1);
const transaction = result.transactions[0];
transaction.should.have.property('id');
transaction.should.have.property('date');
transaction.should.have.property('entries');
assert_1.strict.equal(Array.isArray(transaction.entries), true);
assert_1.strict.equal(transaction.entries.length, 3);
const transactionEntry = transaction.entries[0];
transactionEntry.should.have.property('account');
transactionEntry.should.have.property('value');
done();
});
});
});
describe('Get Block', function () {
it('arguments', function (done) {
assert_1.strict.throws(function () {
blockchain.getBlock('invalid', function () { });
});
assert_1.strict.throws(function () {
blockchain.getBlock({});
});
assert_1.strict.throws(function () {
blockchain.getBlock({}, function () { });
});
done();
});
it('get', function (done) {
blockchain.getBlock({ id: TEST_BLOCK }, function (err, block) {
assert_1.strict.equal(err, null);
block.should.have.property('height');
block.should.have.property('date');
block.should.have.property('previous');
block.should.have.property('transactions');
block.height.should.eql(326945);
block.previous.should.eql('00000000eecd159babde9b094c6dbf1f4f63028ba100f6f092cacb65f04afc46');
block.transactions.should.containEql('e393422e5a0b4c011f511cf3c5911e9c09defdcadbcf16ceb12a47a80e257aaa');
done();
});
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tjaGFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvaW50ZWdyYXRpb24vYmxvY2tjaGFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsRUFBRTtBQUNGLG1CQUFtQjtBQUNuQixFQUFFO0FBQ0Ysb0RBQW9EO0FBQ3BELEVBQUU7O0FBRUYseURBQXlEO0FBRXpELG1DQUEwQztBQUMxQyxrQkFBZ0I7QUFFaEIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDM0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFL0MsTUFBTSxhQUFhLEdBQUcscUNBQXFDLENBQUM7QUFDNUQsTUFBTSw0QkFBNEIsR0FBRyxvQ0FBb0MsQ0FBQztBQUUxRSxNQUFNLGdCQUFnQixHQUFHLGtFQUFrRSxDQUFDO0FBRTVGLE1BQU0sVUFBVSxHQUFHLGtFQUFrRSxDQUFDO0FBRXRGLFFBQVEsQ0FBQyxTQUFTLEVBQUU7SUFDbEIsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFVBQVUsQ0FBQztJQUVmLE1BQU0sQ0FBQyxVQUFVLElBQUk7UUFDbkIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5QixLQUFLLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsYUFBYSxFQUFFO1FBQ3RCLEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxJQUFJO1lBQzVCLGVBQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ1osVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsY0FBYSxDQUFDLENBQUMsQ0FBQztZQUNuRCxDQUFDLENBQUMs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Q1QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsSUFBSTtZQUN0QixVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLFVBQVUsR0FBRyxFQUFFLEtBQUs7Z0JBQzFELGVBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN4QixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2QyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzNDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDaEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7Z0JBQzlGLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO2dCQUN6RyxJQUFJLEVBQUUsQ0FBQztZQUNULENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy9cbi8vIFRlc3RzIGZvciBXYWxsZXRcbi8vXG4vLyBDb3B5cmlnaHQgMjAxNCwgQml0R28sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb24gKi9cblxuaW1wb3J0IHsgc3RyaWN0IGFzIGFzc2VydCB9IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5cbmNvbnN0IEJpdEdvSlMgPSByZXF1aXJlKCcuLi8uLi9zcmMvaW5kZXgnKTtcbmNvbnN0IFRlc3RCaXRHbyA9IHJlcXVpcmUoJy4uL2xpYi90ZXN0X2JpdGdvJyk7XG5cbmNvbnN0IFRFU1RfQUREUkVTUzEgPSAnMk40WHo0aXRDZEtLVVJFaXlTUzdvQnpvWFVLbnV4UDRuUkQnO1xuY29uc3QgVEVTVF9NQU5ZVFJBTlNBQ1RJT05TQUREUkVTUyA9ICdtb0NWelhDUWdySGRaRWh3Um1rTEhZTTlONHdxNzduNWVMJztcblxuY29uc3QgVEVTVF9UUkFOU0FDVElPTiA9ICdjODI3NzVhYjRmMjY2NTczODIwZjA4NWM3YTQ2NjU5MWRmYjk2YWY2ODlmOWNjY2U5ZWJhN2Y4NzAyMGRjNmE2JztcblxuY29uc3QgVEVTVF9CTE9DSyA9ICcwMDAwMDAwMDAwMDAwMDA2NmZmZjhhNjdmYmI2ZmFjMzFlOWM0Y2U1YjFlYWJjMjc5Y2U1MzIxODEwNmFhMjZhJztcblxuZGVzY3JpYmUoJ0FkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbztcbiAgbGV0IGJsb2NrY2hhaW47XG5cbiAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgQml0R29KUy5zZXROZXR3b3JrKCd0ZXN0bmV0Jyk7XG5cbiAgICBiaXRnbyA9IG5ldyBUZXN0Qml0R28oKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBibG9ja2NoYWluID0gYml0Z28uYmxvY2tjaGFpbigpO1xuICAgIGRvbmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0dldCBBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdhcmd1bWVudHMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0QWRkcmVzcygnaW52YWxpZCcsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0QWRkcmVzcyh7fSk7XG4gICAgICB9KTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdnZXQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYmxvY2tjaGFpbi5nZXRBZGRyZXNzKHsgYWRkcmVzczogVEVTVF9BRERSRVNTMSB9LCBmdW5jdGlvbiAoZXJyLCBhZGRyZXNzKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChlcnIsIG51bGwpO1xuICAgICAgICBhZGRyZXNzLnNob3VsZC5oYXZlLnByb3BlcnR5KCdhZGRyZXNzJyk7XG4gICAgICAgIGFkZHJlc3Muc2hvdWxkLmhhdmUucHJvcGVydHkoJ2JhbGFuY2UnKTtcbiAgICAgICAgYWRkcmVzcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY29uZmlybWVkQmFsYW5jZScpO1xuXG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnR2V0IEFkZHJlc3MgVHJhbnNhY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdhcmd1bWVudHMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0QWRkcmVzc1RyYW5zYWN0aW9ucygnaW52YWxpZCcsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0QWRkcmVzc1RyYW5zYWN0aW9ucyh7fSk7XG4gICAgICB9KTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdsaXN0JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGFkZHJlc3M6IFRFU1RfQUREUkVTUzEgfTtcbiAgICAgIGJsb2NrY2hhaW4uZ2V0QWRkcmVzc1RyYW5zYWN0aW9ucyhvcHRpb25zLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGVyciwgbnVsbCk7XG4gICAgICAgIGFzc2VydC5lcXVhbChBcnJheS5pc0FycmF5KHJlc3VsdC50cmFuc2FjdGlvbnMpLCB0cnVlKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdGFydCwgMCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndG90YWwnKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb3VudCcpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdsaXN0X21hbnlfdHJhbnNhY3Rpb25zJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGFkZHJlc3M6IFRFU1RfTUFOWVRSQU5TQUNUSU9OU0FERFJFU1MgfTtcbiAgICAgIGJsb2NrY2hhaW4uZ2V0QWRkcmVzc1RyYW5zYWN0aW9ucyhvcHRpb25zLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGVyciwgbnVsbCk7XG4gICAgICAgIGFzc2VydC5lcXVhbChBcnJheS5pc0FycmF5KHJlc3VsdC50cmFuc2FjdGlvbnMpLCB0cnVlKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdGFydCwgMCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndG90YWwnKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb3VudCcpO1xuICAgICAgICBhc3NlcnQocmVzdWx0LnRyYW5zYWN0aW9ucy5sZW5ndGggPiAyMCk7XG4gICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQudHJhbnNhY3Rpb25zLmxlbmd0aCwgcmVzdWx0LmNvdW50KTtcbiAgICAgICAgYXNzZXJ0KHJlc3VsdC50b3RhbCA+IDc1KTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdHZXQgQWRkcmVzcyBVbnNwZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnYXJndW1lbnRzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldEFkZHJlc3NVbnNwZW50cygnaW52YWxpZCcsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0QWRkcmVzc1Vuc3BlbnRzKHsgbGltaXQ6ICdhIHN0cmluZyEnIH0sIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0QWRkcmVzc1Vuc3BlbnRzKHt9KTtcbiAgICAgIH0pO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2xpc3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgYWRkcmVzczogVEVTVF9BRERSRVNTMSwgbGltaXQ6IDAuNSAqIDFlOCB9O1xuICAgICAgYmxvY2tjaGFpbi5nZXRBZGRyZXNzVW5zcGVudHMob3B0aW9ucywgZnVuY3Rpb24gKGVyciwgdW5zcGVudHMpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGVyciwgbnVsbCk7XG4gICAgICAgIGFzc2VydC5lcXVhbChBcnJheS5pc0FycmF5KHVuc3BlbnRzKSwgdHJ1ZSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnR2V0IFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdhcmd1bWVudHMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0VHJhbnNhY3Rpb24oJ2ludmFsaWQnLCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldFRyYW5zYWN0aW9uKHt9KTtcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0VHJhbnNhY3Rpb24oe30sIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgIH0pO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dldCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICBibG9ja2NoYWluLmdldFRyYW5zYWN0aW9uKHsgaWQ6IFRFU1RfVFJBTlNBQ1RJT04gfSwgZnVuY3Rpb24gKGVyciwgdHJhbnNhY3Rpb24pIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGVyciwgbnVsbCk7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdpZCcpO1xuICAgICAgICB0cmFuc2FjdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZGF0ZScpO1xuICAgICAgICB0cmFuc2FjdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZW50cmllcycpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoQXJyYXkuaXNBcnJheSh0cmFuc2FjdGlvbi5lbnRyaWVzKSwgdHJ1ZSk7XG4gICAgICAgIGFzc2VydC5lcXVhbCh0cmFuc2FjdGlvbi5lbnRyaWVzLmxlbmd0aCwgMyk7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uRW50cnkgPSB0cmFuc2FjdGlvbi5lbnRyaWVzWzBdO1xuICAgICAgICB0cmFuc2FjdGlvbkVudHJ5LnNob3VsZC5oYXZlLnByb3BlcnR5KCdhY2NvdW50Jyk7XG4gICAgICAgIHRyYW5zYWN0aW9uRW50cnkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3ZhbHVlJyk7XG5cbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdHZXQgVHJhbnNhY3Rpb24gQnkgSW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2FyZ3VtZW50cycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmxvY2tjaGFpbi5nZXRUcmFuc2FjdGlvbkJ5SW5wdXQoJ2ludmFsaWQnLCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldFRyYW5zYWN0aW9uQnlJbnB1dChcbiAgICAgICAgICB7IHR4aWQ6ICc5MDQxMTM5N2ZkNDNhYTFlMjg1YTBjMmIzYWM4Y2IzNDFmMjY4MDVlMTRlNjkyNjRkYWNmOTE4MDFkOWZkNmUyJyB9LFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHt9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldFRyYW5zYWN0aW9uQnlJbnB1dCh7IHZvdXQ6IDk5OSB9LCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldFRyYW5zYWN0aW9uQnlJbnB1dChcbiAgICAgICAgICB7IHR4aWQ6ICc5MDQxMTM5N2ZkNDNhYTFlMjg1YTBjMmIzYWM4Y2IzNDFmMjY4MDVlMTRlNjkyNjRkYWNmOTE4MDFkOWZkNmUyJywgdm91dDogJ2FzZGYnIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKCkge31cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0VHJhbnNhY3Rpb25CeUlucHV0KHt9KTtcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0VHJhbnNhY3Rpb25CeUlucHV0KHt9LCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdnZXQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYmxvY2tjaGFpbi5nZXRUcmFuc2FjdGlvbkJ5SW5wdXQoeyB0eGlkOiBURVNUX1RSQU5TQUNUSU9OLCB2b3V0OiAwIH0sIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLCBudWxsKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCd0cmFuc2FjdGlvbnMnKTtcbiAgICAgICAgcmVzdWx0LnRyYW5zYWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxbCgxKTtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSByZXN1bHQudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgICB0cmFuc2FjdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaWQnKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2RhdGUnKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2VudHJpZXMnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKEFycmF5LmlzQXJyYXkodHJhbnNhY3Rpb24uZW50cmllcyksIHRydWUpO1xuICAgICAgICBhc3NlcnQuZXF1YWwodHJhbnNhY3Rpb24uZW50cmllcy5sZW5ndGgsIDMpO1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbkVudHJ5ID0gdHJhbnNhY3Rpb24uZW50cmllc1swXTtcbiAgICAgICAgdHJhbnNhY3Rpb25FbnRyeS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYWNjb3VudCcpO1xuICAgICAgICB0cmFuc2FjdGlvbkVudHJ5LnNob3VsZC5oYXZlLnByb3BlcnR5KCd2YWx1ZScpO1xuXG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnR2V0IEJsb2NrJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdhcmd1bWVudHMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0QmxvY2soJ2ludmFsaWQnLCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldEJsb2NrKHt9KTtcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0QmxvY2soe30sIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgIH0pO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dldCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICBibG9ja2NoYWluLmdldEJsb2NrKHsgaWQ6IFRFU1RfQkxPQ0sgfSwgZnVuY3Rpb24gKGVyciwgYmxvY2spIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGVyciwgbnVsbCk7XG4gICAgICAgIGJsb2NrLnNob3VsZC5oYXZlLnByb3BlcnR5KCdoZWlnaHQnKTtcbiAgICAgICAgYmxvY2suc2hvdWxkLmhhdmUucHJvcGVydHkoJ2RhdGUnKTtcbiAgICAgICAgYmxvY2suc2hvdWxkLmhhdmUucHJvcGVydHkoJ3ByZXZpb3VzJyk7XG4gICAgICAgIGJsb2NrLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0cmFuc2FjdGlvbnMnKTtcbiAgICAgICAgYmxvY2suaGVpZ2h0LnNob3VsZC5lcWwoMzI2OTQ1KTtcbiAgICAgICAgYmxvY2sucHJldmlvdXMuc2hvdWxkLmVxbCgnMDAwMDAwMDBlZWNkMTU5YmFiZGU5YjA5NGM2ZGJmMWY0ZjYzMDI4YmExMDBmNmYwOTJjYWNiNjVmMDRhZmM0NicpO1xuICAgICAgICBibG9jay50cmFuc2FjdGlvbnMuc2hvdWxkLmNvbnRhaW5FcWwoJ2UzOTM0MjJlNWEwYjRjMDExZjUxMWNmM2M1OTExZTljMDlkZWZkY2FkYmNmMTZjZWIxMmE0N2E4MGUyNTdhYWEnKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!