UNPKG

bitgo

Version:
201 lines • 29.6 kB
"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'); assert_1.strict.ok(result.transactions.length > 20); assert_1.strict.equal(result.transactions.length, result.count); assert_1.strict.ok(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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QUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLEtBQUssRUFBRSxVQUFVLElBQUk7WUFDdEIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxVQUFVLEdBQUcsRUFBRSxLQUFLO2dCQUMxRCxlQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDeEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25DLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdkMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMzQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2hDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO2dCQUM5RixLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsa0VBQWtFLENBQUMsQ0FBQztnQkFDekcsSUFBSSxFQUFFLENBQUM7WUFDVCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vXG4vLyBUZXN0cyBmb3IgV2FsbGV0XG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uICovXG5cbmltcG9ydCB7IHN0cmljdCBhcyBhc3NlcnQgfSBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuXG5jb25zdCBCaXRHb0pTID0gcmVxdWlyZSgnLi4vLi4vc3JjL2luZGV4Jyk7XG5jb25zdCBUZXN0Qml0R28gPSByZXF1aXJlKCcuLi9saWIvdGVzdF9iaXRnbycpO1xuXG5jb25zdCBURVNUX0FERFJFU1MxID0gJzJONFh6NGl0Q2RLS1VSRWl5U1M3b0J6b1hVS251eFA0blJEJztcbmNvbnN0IFRFU1RfTUFOWVRSQU5TQUNUSU9OU0FERFJFU1MgPSAnbW9DVnpYQ1FnckhkWkVod1Jta0xIWU05TjR3cTc3bjVlTCc7XG5cbmNvbnN0IFRFU1RfVFJBTlNBQ1RJT04gPSAnYzgyNzc1YWI0ZjI2NjU3MzgyMGYwODVjN2E0NjY1OTFkZmI5NmFmNjg5ZjljY2NlOWViYTdmODcwMjBkYzZhNic7XG5cbmNvbnN0IFRFU1RfQkxPQ0sgPSAnMDAwMDAwMDAwMDAwMDAwNjZmZmY4YTY3ZmJiNmZhYzMxZTljNGNlNWIxZWFiYzI3OWNlNTMyMTgxMDZhYTI2YSc7XG5cbmRlc2NyaWJlKCdBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z287XG4gIGxldCBibG9ja2NoYWluO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgIEJpdEdvSlMuc2V0TmV0d29yaygndGVzdG5ldCcpO1xuXG4gICAgYml0Z28gPSBuZXcgVGVzdEJpdEdvKCk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYmxvY2tjaGFpbiA9IGJpdGdvLmJsb2NrY2hhaW4oKTtcbiAgICBkb25lKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdHZXQgQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnYXJndW1lbnRzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldEFkZHJlc3MoJ2ludmFsaWQnLCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldEFkZHJlc3Moe30pO1xuICAgICAgfSk7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2V0JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGJsb2NrY2hhaW4uZ2V0QWRkcmVzcyh7IGFkZHJlc3M6IFRFU1RfQUREUkVTUzEgfSwgZnVuY3Rpb24gKGVyciwgYWRkcmVzcykge1xuICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLCBudWxsKTtcbiAgICAgICAgYWRkcmVzcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYWRkcmVzcycpO1xuICAgICAgICBhZGRyZXNzLnNob3VsZC5oYXZlLnByb3BlcnR5KCdiYWxhbmNlJyk7XG4gICAgICAgIGFkZHJlc3Muc2hvdWxkLmhhdmUucHJvcGVydHkoJ2NvbmZpcm1lZEJhbGFuY2UnKTtcblxuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0dldCBBZGRyZXNzIFRyYW5zYWN0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnYXJndW1lbnRzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldEFkZHJlc3NUcmFuc2FjdGlvbnMoJ2ludmFsaWQnLCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldEFkZHJlc3NUcmFuc2FjdGlvbnMoe30pO1xuICAgICAgfSk7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGlzdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0geyBhZGRyZXNzOiBURVNUX0FERFJFU1MxIH07XG4gICAgICBibG9ja2NoYWluLmdldEFkZHJlc3NUcmFuc2FjdGlvbnMob3B0aW9ucywgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChlcnIsIG51bGwpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoQXJyYXkuaXNBcnJheShyZXN1bHQudHJhbnNhY3Rpb25zKSwgdHJ1ZSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RhcnQsIDApO1xuICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3RvdGFsJyk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY291bnQnKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGlzdF9tYW55X3RyYW5zYWN0aW9ucycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0geyBhZGRyZXNzOiBURVNUX01BTllUUkFOU0FDVElPTlNBRERSRVNTIH07XG4gICAgICBibG9ja2NoYWluLmdldEFkZHJlc3NUcmFuc2FjdGlvbnMob3B0aW9ucywgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChlcnIsIG51bGwpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoQXJyYXkuaXNBcnJheShyZXN1bHQudHJhbnNhY3Rpb25zKSwgdHJ1ZSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RhcnQsIDApO1xuICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3RvdGFsJyk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY291bnQnKTtcbiAgICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC50cmFuc2FjdGlvbnMubGVuZ3RoID4gMjApO1xuICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnRyYW5zYWN0aW9ucy5sZW5ndGgsIHJlc3VsdC5jb3VudCk7XG4gICAgICAgIGFzc2VydC5vayhyZXN1bHQudG90YWwgPiA3NSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnR2V0IEFkZHJlc3MgVW5zcGVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2FyZ3VtZW50cycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmxvY2tjaGFpbi5nZXRBZGRyZXNzVW5zcGVudHMoJ2ludmFsaWQnLCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldEFkZHJlc3NVbnNwZW50cyh7IGxpbWl0OiAnYSBzdHJpbmchJyB9LCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldEFkZHJlc3NVbnNwZW50cyh7fSk7XG4gICAgICB9KTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdsaXN0JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGFkZHJlc3M6IFRFU1RfQUREUkVTUzEsIGxpbWl0OiAwLjUgKiAxZTggfTtcbiAgICAgIGJsb2NrY2hhaW4uZ2V0QWRkcmVzc1Vuc3BlbnRzKG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIsIHVuc3BlbnRzKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChlcnIsIG51bGwpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoQXJyYXkuaXNBcnJheSh1bnNwZW50cyksIHRydWUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0dldCBUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnYXJndW1lbnRzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldFRyYW5zYWN0aW9uKCdpbnZhbGlkJywgZnVuY3Rpb24gKCkge30pO1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmxvY2tjaGFpbi5nZXRUcmFuc2FjdGlvbih7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldFRyYW5zYWN0aW9uKHt9LCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdnZXQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYmxvY2tjaGFpbi5nZXRUcmFuc2FjdGlvbih7IGlkOiBURVNUX1RSQU5TQUNUSU9OIH0sIGZ1bmN0aW9uIChlcnIsIHRyYW5zYWN0aW9uKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChlcnIsIG51bGwpO1xuICAgICAgICB0cmFuc2FjdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaWQnKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2RhdGUnKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2VudHJpZXMnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKEFycmF5LmlzQXJyYXkodHJhbnNhY3Rpb24uZW50cmllcyksIHRydWUpO1xuICAgICAgICBhc3NlcnQuZXF1YWwodHJhbnNhY3Rpb24uZW50cmllcy5sZW5ndGgsIDMpO1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbkVudHJ5ID0gdHJhbnNhY3Rpb24uZW50cmllc1swXTtcbiAgICAgICAgdHJhbnNhY3Rpb25FbnRyeS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYWNjb3VudCcpO1xuICAgICAgICB0cmFuc2FjdGlvbkVudHJ5LnNob3VsZC5oYXZlLnByb3BlcnR5KCd2YWx1ZScpO1xuXG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnR2V0IFRyYW5zYWN0aW9uIEJ5IElucHV0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdhcmd1bWVudHMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJsb2NrY2hhaW4uZ2V0VHJhbnNhY3Rpb25CeUlucHV0KCdpbnZhbGlkJywgZnVuY3Rpb24gKCkge30pO1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmxvY2tjaGFpbi5nZXRUcmFuc2FjdGlvbkJ5SW5wdXQoXG4gICAgICAgICAgeyB0eGlkOiAnOTA0MTEzOTdmZDQzYWExZTI4NWEwYzJiM2FjOGNiMzQxZjI2ODA1ZTE0ZTY5MjY0ZGFjZjkxODAxZDlmZDZlMicgfSxcbiAgICAgICAgICBmdW5jdGlvbiAoKSB7fVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmxvY2tjaGFpbi5nZXRUcmFuc2FjdGlvbkJ5SW5wdXQoeyB2b3V0OiA5OTkgfSwgZnVuY3Rpb24gKCkge30pO1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmxvY2tjaGFpbi5nZXRUcmFuc2FjdGlvbkJ5SW5wdXQoXG4gICAgICAgICAgeyB0eGlkOiAnOTA0MTEzOTdmZDQzYWExZTI4NWEwYzJiM2FjOGNiMzQxZjI2ODA1ZTE0ZTY5MjY0ZGFjZjkxODAxZDlmZDZlMicsIHZvdXQ6ICdhc2RmJyB9LFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHt9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldFRyYW5zYWN0aW9uQnlJbnB1dCh7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldFRyYW5zYWN0aW9uQnlJbnB1dCh7fSwgZnVuY3Rpb24gKCkge30pO1xuICAgICAgfSk7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2V0JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGJsb2NrY2hhaW4uZ2V0VHJhbnNhY3Rpb25CeUlucHV0KHsgdHhpZDogVEVTVF9UUkFOU0FDVElPTiwgdm91dDogMCB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGVyciwgbnVsbCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHJhbnNhY3Rpb25zJyk7XG4gICAgICAgIHJlc3VsdC50cmFuc2FjdGlvbnMubGVuZ3RoLnNob3VsZC5lcWwoMSk7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcmVzdWx0LnRyYW5zYWN0aW9uc1swXTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2lkJyk7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdkYXRlJyk7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdlbnRyaWVzJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChBcnJheS5pc0FycmF5KHRyYW5zYWN0aW9uLmVudHJpZXMpLCB0cnVlKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHRyYW5zYWN0aW9uLmVudHJpZXMubGVuZ3RoLCAzKTtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb25FbnRyeSA9IHRyYW5zYWN0aW9uLmVudHJpZXNbMF07XG4gICAgICAgIHRyYW5zYWN0aW9uRW50cnkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FjY291bnQnKTtcbiAgICAgICAgdHJhbnNhY3Rpb25FbnRyeS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndmFsdWUnKTtcblxuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0dldCBCbG9jaycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnYXJndW1lbnRzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldEJsb2NrKCdpbnZhbGlkJywgZnVuY3Rpb24gKCkge30pO1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmxvY2tjaGFpbi5nZXRCbG9jayh7fSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBibG9ja2NoYWluLmdldEJsb2NrKHt9LCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9KTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdnZXQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgYmxvY2tjaGFpbi5nZXRCbG9jayh7IGlkOiBURVNUX0JMT0NLIH0sIGZ1bmN0aW9uIChlcnIsIGJsb2NrKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChlcnIsIG51bGwpO1xuICAgICAgICBibG9jay5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaGVpZ2h0Jyk7XG4gICAgICAgIGJsb2NrLnNob3VsZC5oYXZlLnByb3BlcnR5KCdkYXRlJyk7XG4gICAgICAgIGJsb2NrLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwcmV2aW91cycpO1xuICAgICAgICBibG9jay5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHJhbnNhY3Rpb25zJyk7XG4gICAgICAgIGJsb2NrLmhlaWdodC5zaG91bGQuZXFsKDMyNjk0NSk7XG4gICAgICAgIGJsb2NrLnByZXZpb3VzLnNob3VsZC5lcWwoJzAwMDAwMDAwZWVjZDE1OWJhYmRlOWIwOTRjNmRiZjFmNGY2MzAyOGJhMTAwZjZmMDkyY2FjYjY1ZjA0YWZjNDYnKTtcbiAgICAgICAgYmxvY2sudHJhbnNhY3Rpb25zLnNob3VsZC5jb250YWluRXFsKCdlMzkzNDIyZTVhMGI0YzAxMWY1MTFjZjNjNTkxMWU5YzA5ZGVmZGNhZGJjZjE2Y2ViMTJhNDdhODBlMjU3YWFhJyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19