bitgo
Version:
BitGo JavaScript SDK
163 lines • 26.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const nock = require("nock");
const sinon = require("sinon");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const src_1 = require("../../../src");
describe('Verify string type is used for value of unspent', function () {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'test' });
bitgo.initializeTestVars();
const basecoin = bitgo.coin('tdoge');
const walletData = {
id: '5b34252f1bf349930e34020a00000000',
coin: 'tdoge',
keys: ['5b3424f91bf349930e34017500000000', '5b3424f91bf349930e34017600000000', '5b3424f91bf349930e34017700000000'],
coinSpecific: {},
};
const wallet = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
const bgUrl = sdk_core_1.common.Environments[bitgo.getEnv()].uri;
const highPrecisionBigInt = BigInt(1e16) + BigInt(1);
function matchMinMaxValue(minValue, maxValue) {
return minValue === '1' && maxValue === highPrecisionBigInt.toString();
}
function assertIsString(val) {
if (typeof val !== 'string') {
throw new Error('Expected string');
}
}
describe('unspents APIs with string type minValue and maxValue', function () {
after(function () {
nock.cleanAll();
});
['consolidate', 'fanout'].forEach((manageUnspentType) => {
it(manageUnspentType + ' should handle string type minValue and maxValue', async function () {
const params = { minValue: '1', maxValue: highPrecisionBigInt.toString() };
const consolidateUnspentsScope = nock(bgUrl)
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/${manageUnspentType}Unspents`, (body) => {
return matchMinMaxValue(body.minValue, body.maxValue);
})
.reply(200, {
txInfo: {
unspents: [
{
id: 123,
address: 'sfajlkjad',
value: 1242123,
valueString: '1242123',
},
],
},
});
wallet
.keyIds()
.forEach((keyId) => nock(bgUrl).get(`/api/v2/${wallet.coin()}/key/${keyId}`).reply(200, { id: keyId, pub: 'pub' }));
sinon.stub(wallet, 'signTransaction').resolves({});
sinon.stub(wallet.baseCoin, 'verifyTransaction').resolves();
const sendScope = nock(bgUrl)
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/send`, { type: manageUnspentType })
.reply(200, {});
await wallet[manageUnspentType + 'Unspents'](params);
consolidateUnspentsScope.done();
sendScope.done();
sinon.restore();
});
});
it('maximumSpendable should handle string type minValue and maxValue', async function () {
const params = {
minValue: '1',
maxValue: highPrecisionBigInt.toString(),
target: highPrecisionBigInt.toString(),
};
const maximumSpendableScope = nock(bgUrl)
.get(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/maximumSpendable`)
.query((queryParams) => {
assertIsString(queryParams.minValue);
assertIsString(queryParams.maxValue);
return matchMinMaxValue(queryParams.minValue, queryParams.maxValue);
})
.reply(200, {});
await wallet.maximumSpendable(params);
maximumSpendableScope.done();
});
it('get unspents should handle string type minValue and maxValue', async function () {
const params = {
minValue: '1',
maxValue: highPrecisionBigInt.toString(),
target: highPrecisionBigInt.toString(),
};
const unspentsScope = nock(bgUrl)
.get(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/unspents`)
.query((queryParams) => {
assertIsString(queryParams.minValue);
assertIsString(queryParams.maxValue);
return matchMinMaxValue(queryParams.minValue, queryParams.maxValue);
})
.reply(200, {});
await wallet.unspents(params);
unspentsScope.done();
});
});
describe('build and send transaction APIs with string type minValue and maxValue', function () {
after(function () {
nock.cleanAll();
});
it('sendmany should handle string type minValue and maxValue', async function () {
const params = { minValue: '1', maxValue: highPrecisionBigInt.toString() };
const sendScope = nock(bgUrl)
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/send`, (body) => {
return matchMinMaxValue(body.minValue, body.maxValue);
})
.reply(200, {});
const prebuildAndSignTransactionStub = sinon.stub(wallet, 'prebuildAndSignTransaction').resolves({});
await wallet.sendMany(params);
prebuildAndSignTransactionStub.should.calledOnce();
sendScope.done();
});
it('prebuildTransaction should handle string type minValue and maxValue', async function () {
const params = { minValue: '1', maxValue: highPrecisionBigInt.toString() };
const buildScope = nock(bgUrl)
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/build`, (body) => {
return matchMinMaxValue(body.minValue, body.maxValue);
})
.reply(200, {
txHex: '010000000197c9d011880ce52e1730d7e18d4877db343b61c7369e3274b9c0f176349137840000000000ffffffff0132000000000000001976a9146ba5752fb24f37d99db121975d8d68f0c6204d9188ac00000000',
});
nock(bgUrl).get(`/api/v2/${wallet.coin()}/public/block/latest`).twice().reply(200, {});
await wallet.prebuildTransaction(params);
buildScope.done();
});
});
describe('Unspent Reservations', function () {
after(nock.cleanAll);
it('should only pass through the whitelisted properties', async function () {
const unspentIds = ['test-test'];
const expireTime = 'boogie';
// Create
const createScope = nock(bgUrl)
.post(`/api/v2/wallet/${wallet.id()}/reservedunspents`, { unspentIds, expireTime })
.reply(200, {});
await wallet.manageUnspentReservations({
create: { unspentIds, expireTime, dontIncludeThis: 'this' },
});
// Modify
const modifyScope = nock(bgUrl)
.put(`/api/v2/wallet/${wallet.id()}/reservedunspents`, { unspentIds, changes: { expireTime } })
.reply(200, {});
await wallet.manageUnspentReservations({
modify: { unspentIds, changes: { expireTime }, dontIncludeThis: 'this' },
});
// Delete
const deleteScope = nock(bgUrl)
.delete(`/api/v2/wallet/${wallet.id()}/reservedunspents?id=test-test`)
.reply(200, {});
await wallet.manageUnspentReservations({
delete: { id: unspentIds[0], dontIncludeThis: 'this' },
});
createScope.done();
modifyScope.done();
deleteScope.done();
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zcGVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3YyL3VuaXQvdW5zcGVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBOEI7QUFDOUIsK0JBQStCO0FBQy9CLDhDQUFpRDtBQUNqRCw4Q0FBNEM7QUFDNUMsc0NBQXFDO0FBRXJDLFFBQVEsQ0FBQyxpREFBaUQsRUFBRTtJQUMxRCxNQUFNLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMzQixNQUFNLFFBQVEsR0FBUSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEVBQUUsRUFBRSxrQ0FBa0M7UUFDdEMsSUFBSSxFQUFFLE9BQU87UUFDYixJQUFJLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxrQ0FBa0MsRUFBRSxrQ0FBa0MsQ0FBQztRQUNsSCxZQUFZLEVBQUUsRUFBRTtLQUNqQixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQUcsaUJBQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ3RELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyRCxTQUFTLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDMUQsT0FBTyxRQUFRLEtBQUssR0FBRyxJQUFJLFFBQVEsS0FBSyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsU0FB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RSxDQUFDO1lBQ25CLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IGNvbW1vbiwgV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbyB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHbyB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdWZXJpZnkgc3RyaW5nIHR5cGUgaXMgdXNlZCBmb3IgdmFsdWUgb2YgdW5zcGVudCcsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAndGVzdCcgfSk7XG4gIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICBjb25zdCBiYXNlY29pbjogYW55ID0gYml0Z28uY29pbigndGRvZ2UnKTtcbiAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICBpZDogJzViMzQyNTJmMWJmMzQ5OTMwZTM0MDIwYTAwMDAwMDAwJyxcbiAgICBjb2luOiAndGRvZ2UnLFxuICAgIGtleXM6IFsnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1MDAwMDAwMDAnLCAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc2MDAwMDAwMDAnLCAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc3MDAwMDAwMDAnXSxcbiAgICBjb2luU3BlY2lmaWM6IHt9LFxuICB9O1xuICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG4gIGNvbnN0IGJnVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tiaXRnby5nZXRFbnYoKV0udXJpO1xuICBjb25zdCBoaWdoUHJlY2lzaW9uQmlnSW50ID0gQmlnSW50KDFlMTYpICsgQmlnSW50KDEpO1xuXG4gIGZ1bmN0aW9uIG1hdGNoTWluTWF4VmFsdWUobWluVmFsdWU6IHN0cmluZywgbWF4VmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtaW5WYWx1ZSA9PT0gJzEnICYmIG1heFZhbHVlID09PSBoaWdoUHJlY2lzaW9uQmlnSW50LnRvU3RyaW5nKCk7XG4gIH1cbiAgZnVuY3Rpb24gYXNzZXJ0SXNTdHJpbmcodmFsOiB1bmtub3duKTogYXNzZXJ0cyB2YWwgaXMgc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgZGVzY3JpYmUoJ3Vuc3BlbnRzIEFQSXMgd2l0aCBzdHJpbmcgdHlwZSBtaW5WYWx1ZSBhbmQgbWF4VmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgWydjb25zb2xpZGF0ZScsICdmYW5vdXQnXS5mb3JFYWNoKChtYW5hZ2VVbnNwZW50VHlwZSkgPT4ge1xuICAgICAgaXQobWFuYWdlVW5zcGVudFR5cGUgKyAnIHNob3VsZCBoYW5kbGUgc3RyaW5nIHR5cGUgbWluVmFsdWUgYW5kIG1heFZhbHVlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IG1pblZhbHVlOiAnMScsIG1heFZhbHVlOiBoaWdoUHJlY2lzaW9uQmlnSW50LnRvU3RyaW5nKCkgfTtcblxuICAgICAgICBjb25zdCBjb25zb2xpZGF0ZVVuc3BlbnRzU2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgICAgIC5wb3N0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0vd2FsbGV0LyR7d2FsbGV0LmlkKCl9LyR7bWFuYWdlVW5zcGVudFR5cGV9VW5zcGVudHNgLCAoYm9keSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoTWluTWF4VmFsdWUoYm9keS5taW5WYWx1ZSwgYm9keS5tYXhWYWx1ZSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAgICB0eEluZm86IHtcbiAgICAgICAgICAgICAgdW5zcGVudHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZDogMTIzLFxuICAgICAgICAgICAgICAgICAgYWRkcmVzczogJ3NmYWpsa2phZCcsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogMTI0MjEyMyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTI0MjEyMycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgd2FsbGV0XG4gICAgICAgICAgLmtleUlkcygpXG4gICAgICAgICAgLmZvckVhY2goKGtleUlkKSA9PlxuICAgICAgICAgICAgbm9jayhiZ1VybCkuZ2V0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0va2V5LyR7a2V5SWR9YCkucmVwbHkoMjAwLCB7IGlkOiBrZXlJZCwgcHViOiAncHViJyB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgc2lub24uc3R1Yih3YWxsZXQsICdzaWduVHJhbnNhY3Rpb24nKS5yZXNvbHZlcyh7fSk7XG4gICAgICAgIHNpbm9uLnN0dWIod2FsbGV0LmJhc2VDb2luLCAndmVyaWZ5VHJhbnNhY3Rpb24nKS5yZXNvbHZlcygpO1xuXG4gICAgICAgIGNvbnN0IHNlbmRTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgICAgLnBvc3QoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vdHgvc2VuZGAsIHsgdHlwZTogbWFuYWdlVW5zcGVudFR5cGUgfSlcbiAgICAgICAgICAucmVwbHkoMjAwLCB7fSk7XG5cbiAgICAgICAgYXdhaXQgd2FsbGV0W21hbmFnZVVuc3BlbnRUeXBlICsgJ1Vuc3BlbnRzJ10ocGFyYW1zKTtcblxuICAgICAgICBjb25zb2xpZGF0ZVVuc3BlbnRzU2NvcGUuZG9uZSgpO1xuICAgICAgICBzZW5kU2NvcGUuZG9uZSgpO1xuICAgICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdtYXhpbXVtU3BlbmRhYmxlIHNob3VsZCBoYW5kbGUgc3RyaW5nIHR5cGUgbWluVmFsdWUgYW5kIG1heFZhbHVlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICBtaW5WYWx1ZTogJzEnLFxuICAgICAgICBtYXhWYWx1ZTogaGlnaFByZWNpc2lvbkJpZ0ludC50b1N0cmluZygpLFxuICAgICAgICB0YXJnZXQ6IGhpZ2hQcmVjaXNpb25CaWdJbnQudG9TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1heGltdW1TcGVuZGFibGVTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5nZXQoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vbWF4aW11bVNwZW5kYWJsZWApXG4gICAgICAgIC5xdWVyeSgocXVlcnlQYXJhbXMpID0+IHtcbiAgICAgICAgICBhc3NlcnRJc1N0cmluZyhxdWVyeVBhcmFtcy5taW5WYWx1ZSk7XG4gICAgICAgICAgYXNzZXJ0SXNTdHJpbmcocXVlcnlQYXJhbXMubWF4VmFsdWUpO1xuICAgICAgICAgIHJldHVybiBtYXRjaE1pbk1heFZhbHVlKHF1ZXJ5UGFyYW1zLm1pblZhbHVlLCBxdWVyeVBhcmFtcy5tYXhWYWx1ZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHt9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0Lm1heGltdW1TcGVuZGFibGUocGFyYW1zKTtcblxuICAgICAgbWF4aW11bVNwZW5kYWJsZVNjb3BlLmRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdnZXQgdW5zcGVudHMgc2hvdWxkIGhhbmRsZSBzdHJpbmcgdHlwZSBtaW5WYWx1ZSBhbmQgbWF4VmFsdWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIG1pblZhbHVlOiAnMScsXG4gICAgICAgIG1heFZhbHVlOiBoaWdoUHJlY2lzaW9uQmlnSW50LnRvU3RyaW5nKCksXG4gICAgICAgIHRhcmdldDogaGlnaFByZWNpc2lvbkJpZ0ludC50b1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdW5zcGVudHNTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5nZXQoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vdW5zcGVudHNgKVxuICAgICAgICAucXVlcnkoKHF1ZXJ5UGFyYW1zKSA9PiB7XG4gICAgICAgICAgYXNzZXJ0SXNTdHJpbmcocXVlcnlQYXJhbXMubWluVmFsdWUpO1xuICAgICAgICAgIGFzc2VydElzU3RyaW5nKHF1ZXJ5UGFyYW1zLm1heFZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hNaW5NYXhWYWx1ZShxdWVyeVBhcmFtcy5taW5WYWx1ZSBhcyBzdHJpbmcsIHF1ZXJ5UGFyYW1zLm1heFZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQudW5zcGVudHMocGFyYW1zKTtcblxuICAgICAgdW5zcGVudHNTY29wZS5kb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCBhbmQgc2VuZCB0cmFuc2FjdGlvbiBBUElzIHdpdGggc3RyaW5nIHR5cGUgbWluVmFsdWUgYW5kIG1heFZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZW5kbWFueSBzaG91bGQgaGFuZGxlIHN0cmluZyB0eXBlIG1pblZhbHVlIGFuZCBtYXhWYWx1ZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgbWluVmFsdWU6ICcxJywgbWF4VmFsdWU6IGhpZ2hQcmVjaXNpb25CaWdJbnQudG9TdHJpbmcoKSB9O1xuXG4gICAgICBjb25zdCBzZW5kU2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS90eC9zZW5kYCwgKGJvZHkpID0+IHtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hNaW5NYXhWYWx1ZShib2R5Lm1pblZhbHVlLCBib2R5Lm1heFZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICBjb25zdCBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvblN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoe30pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuc2VuZE1hbnkocGFyYW1zKTtcblxuICAgICAgcHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25TdHViLnNob3VsZC5jYWxsZWRPbmNlKCk7XG4gICAgICBzZW5kU2NvcGUuZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZWJ1aWxkVHJhbnNhY3Rpb24gc2hvdWxkIGhhbmRsZSBzdHJpbmcgdHlwZSBtaW5WYWx1ZSBhbmQgbWF4VmFsdWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7IG1pblZhbHVlOiAnMScsIG1heFZhbHVlOiBoaWdoUHJlY2lzaW9uQmlnSW50LnRvU3RyaW5nKCkgfTtcblxuICAgICAgY29uc3QgYnVpbGRTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5wb3N0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0vd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3R4L2J1aWxkYCwgKGJvZHkpID0+IHtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hNaW5NYXhWYWx1ZShib2R5Lm1pblZhbHVlLCBib2R5Lm1heFZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgIHR4SGV4OlxuICAgICAgICAgICAgJzAxMDAwMDAwMDE5N2M5ZDAxMTg4MGNlNTJlMTczMGQ3ZTE4ZDQ4NzdkYjM0M2I2MWM3MzY5ZTMyNzRiOWMwZjE3NjM0OTEzNzg0MDAwMDAwMDAwMGZmZmZmZmZmMDEzMjAwMDAwMDAwMDAwMDAwMTk3NmE5MTQ2YmE1NzUyZmIyNGYzN2Q5OWRiMTIxOTc1ZDhkNjhmMGM2MjA0ZDkxODhhYzAwMDAwMDAwJyxcbiAgICAgICAgfSk7XG5cbiAgICAgIG5vY2soYmdVcmwpLmdldChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3B1YmxpYy9ibG9jay9sYXRlc3RgKS50d2ljZSgpLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQucHJlYnVpbGRUcmFuc2FjdGlvbihwYXJhbXMpO1xuXG4gICAgICBidWlsZFNjb3BlLmRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Vuc3BlbnQgUmVzZXJ2YXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyKG5vY2suY2xlYW5BbGwpO1xuXG4gICAgaXQoJ3Nob3VsZCBvbmx5IHBhc3MgdGhyb3VnaCB0aGUgd2hpdGVsaXN0ZWQgcHJvcGVydGllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHVuc3BlbnRJZHMgPSBbJ3Rlc3QtdGVzdCddO1xuICAgICAgY29uc3QgZXhwaXJlVGltZSA9ICdib29naWUnO1xuXG4gICAgICAvLyBDcmVhdGVcbiAgICAgIGNvbnN0IGNyZWF0ZVNjb3BlID0gbm9jayhiZ1VybClcbiAgICAgICAgLnBvc3QoYC9hcGkvdjIvd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3Jlc2VydmVkdW5zcGVudHNgLCB7IHVuc3BlbnRJZHMsIGV4cGlyZVRpbWUgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuICAgICAgYXdhaXQgd2FsbGV0Lm1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbnMoe1xuICAgICAgICBjcmVhdGU6IHsgdW5zcGVudElkcywgZXhwaXJlVGltZSwgZG9udEluY2x1ZGVUaGlzOiAndGhpcycgfSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICB1bnNwZW50SWRzOiBzdHJpbmdbXTtcbiAgICAgICAgICBleHBpcmVUaW1lOiBzdHJpbmc7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gTW9kaWZ5XG4gICAgICBjb25zdCBtb2RpZnlTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5wdXQoYC9hcGkvdjIvd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3Jlc2VydmVkdW5zcGVudHNgLCB7IHVuc3BlbnRJZHMsIGNoYW5nZXM6IHsgZXhwaXJlVGltZSB9IH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHt9KTtcbiAgICAgIGF3YWl0IHdhbGxldC5tYW5hZ2VVbnNwZW50UmVzZXJ2YXRpb25zKHtcbiAgICAgICAgbW9kaWZ5OiB7IHVuc3BlbnRJZHMsIGNoYW5nZXM6IHsgZXhwaXJlVGltZSB9LCBkb250SW5jbHVkZVRoaXM6ICd0aGlzJyB9IGFzIHVua25vd24gYXMge1xuICAgICAgICAgIHVuc3BlbnRJZHM6IHN0cmluZ1tdO1xuICAgICAgICAgIGNoYW5nZXM6IHsgZXhwaXJlVGltZTogc3RyaW5nIH07XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gRGVsZXRlXG4gICAgICBjb25zdCBkZWxldGVTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5kZWxldGUoYC9hcGkvdjIvd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3Jlc2VydmVkdW5zcGVudHM/aWQ9dGVzdC10ZXN0YClcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuICAgICAgYXdhaXQgd2FsbGV0Lm1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbnMoe1xuICAgICAgICBkZWxldGU6IHsgaWQ6IHVuc3BlbnRJZHNbMF0sIGRvbnRJbmNsdWRlVGhpczogJ3RoaXMnIH0gYXMgdW5rbm93biBhcyB7IGlkOiBzdHJpbmcgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjcmVhdGVTY29wZS5kb25lKCk7XG4gICAgICBtb2RpZnlTY29wZS5kb25lKCk7XG4gICAgICBkZWxldGVTY29wZS5kb25lKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=