PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit
Просмотр файла: enterprise.js
"use strict";
//
// Tests for enterprises
//
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 bitgo_1 = require("../../../src/bitgo");
const ecdsaNtilde_1 = require("./internal/tssUtils/mocks/ecdsaNtilde");
const utxo_lib_1 = require("@bitgo/utxo-lib");
describe('Enterprise:', function () {
let bitgo;
let enterprise;
let baseCoin;
let bgUrl;
before(function () {
bitgo = sdk_test_1.TestBitGo.decorate(bitgo_1.BitGo, { env: 'test' });
bitgo.initializeTestVars();
baseCoin = bitgo.coin('tbtc');
enterprise = new sdk_core_1.Enterprise(bitgo, baseCoin, { id: '593f1ece99d37c23080a557283edcc89', name: 'Test Enterprise' });
bgUrl = sdk_core_1.common.Environments[bitgo.getEnv()].uri;
});
describe('Transaction data', function () {
it('should search for pending transaction correctly', async function () {
const params = { enterpriseId: enterprise.id };
const scope = nock(bgUrl).get('/api/v2/tbtc/tx/pending/first').query(params).reply(200);
await enterprise.getFirstPendingTransaction().should.be.resolved();
scope.isDone().should.be.True();
});
});
it('should fetch the tss config correctly', async function () {
const scope = nock(bgUrl)
.get(`/api/v2/enterprise/${enterprise.id}/tssconfig`)
.reply(200, {
ecdsa: {
challenge: {
enterprise: {
...ecdsaNtilde_1.mockChallengeA,
verifiers: {
adminSignature: 'hex sig',
},
},
},
},
});
await enterprise.getExistingTssEcdsaChallenge().should.be.resolved();
scope.isDone().should.be.True();
});
describe('Resign enterprise challenge', function () {
const bitgo = sdk_test_1.TestBitGo.decorate(bitgo_1.BitGo, { env: 'mock' });
const enterprise = new sdk_core_1.Enterprise(bitgo, bitgo.coin('tbtc'), { id: '123', name: 'Test Enterprise' });
const oldAdminEcdhKey = bitgo.keychains().create();
const oldAdminDerivationPath = 'm/0/0';
const newAdminEcdhKey = bitgo.keychains().create();
const newAdminDerivationPath = 'm/0/1';
const entChallenge = {
ntilde: 'ent ntilde',
h1: 'ent h1',
h2: 'ent h2',
};
const bitgoChallenge = {
ntilde: 'bitgo ntilde',
h1: 'bitgo h1',
h2: 'bitgo h2',
};
const signedEntChallenge = sdk_core_1.ECDSAUtils.EcdsaUtils.signChallenge(entChallenge, oldAdminEcdhKey.xprv, oldAdminDerivationPath);
const signedBitgoChallenge = sdk_core_1.ECDSAUtils.EcdsaUtils.signChallenge(bitgoChallenge, oldAdminEcdhKey.xprv, oldAdminDerivationPath);
const newSignedEntChallenge = sdk_core_1.ECDSAUtils.EcdsaUtils.signChallenge(entChallenge, newAdminEcdhKey.xprv, newAdminDerivationPath);
const newSignedBitgoChallenge = sdk_core_1.ECDSAUtils.EcdsaUtils.signChallenge(bitgoChallenge, newAdminEcdhKey.xprv, newAdminDerivationPath);
const entChallengeWithVerifiers = {
...entChallenge,
verifiers: {
adminSignature: signedEntChallenge.toString('hex'),
},
};
const bitgoChallengeWithVerifier = {
...bitgoChallenge,
verifiers: {
adminSignature: signedBitgoChallenge.toString('hex'),
},
};
it('should verify and resign enterprise challenge', async function () {
const stubuUploadChallenges = sinon.stub(sdk_core_1.ECDSAUtils.EcdsaUtils, 'uploadChallengesToEnterprise');
await enterprise
.resignEnterpriseChallenges({
xprv: oldAdminEcdhKey.xprv,
derivationPath: oldAdminDerivationPath,
derivedPubKey: utxo_lib_1.bip32
.fromBase58(oldAdminEcdhKey.xpub)
.derivePath(oldAdminDerivationPath)
.publicKey.toString('hex'),
}, {
xprv: newAdminEcdhKey.xprv,
derivationPath: newAdminDerivationPath,
derivedPubKey: utxo_lib_1.bip32
.fromBase58(newAdminEcdhKey.xpub)
.derivePath(newAdminDerivationPath)
.publicKey.toString('hex'),
}, entChallengeWithVerifiers, bitgoChallengeWithVerifier, bitgoChallengeWithVerifier)
.should.not.be.rejected();
stubuUploadChallenges.should.be.calledWith(bitgo, '123', entChallengeWithVerifiers, newSignedEntChallenge.toString('hex'), newSignedBitgoChallenge.toString('hex'), newSignedBitgoChallenge.toString('hex'));
});
it('should fail when the old ecdh keychain is incorrect', async function () {
await enterprise
.resignEnterpriseChallenges({
xprv: newAdminEcdhKey.xprv,
derivationPath: newAdminDerivationPath,
derivedPubKey: utxo_lib_1.bip32
.fromBase58(newAdminEcdhKey.xpub)
.derivePath(newAdminDerivationPath)
.publicKey.toString('hex'),
}, {
xprv: newAdminEcdhKey.xprv,
derivationPath: newAdminDerivationPath,
derivedPubKey: utxo_lib_1.bip32
.fromBase58(newAdminEcdhKey.xpub)
.derivePath(newAdminDerivationPath)
.publicKey.toString('hex'),
}, entChallengeWithVerifiers, bitgoChallengeWithVerifier, bitgoChallengeWithVerifier)
.should.be.rejectedWith('Cannot re-sign. The Enterprise TSS config was signed by another user.');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50ZXJwcmlzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9lbnRlcnByaXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxFQUFFO0FBQ0Ysd0JBQXdCO0FBQ3hCLEVBQUU7O0FBRUYsNkJBQTZCO0FBQzdCLCtCQUErQjtBQUMvQiw4Q0FBaUU7QUFFakUsOENBQTRDO0FBQzVDLDhDQUEyQztBQUMzQyx1RUFBdUU7QUFDdkUsOENBQXdDO0FBRXhDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFVBQVUsQ0FBQztJQUNmLElBQUksUUFBUSxDQUFDO0lBQ2IsSUFBSSxLQUFLLENBQUM7SUFFVixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsYUFBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsVUFBVSxHQUFHLElBQUkscUJBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLGtDQUFrQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDbEgsS0FBSyxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSztZQUN6RCxNQUFNLE1BQU0sR0FBRyxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFD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QkFBcUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQ3JDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDdkMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUN4QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSztZQUM3RCxNQUFNLFVBQVU7aUJBQ2IsMEJBQTBCLENBQ3pCO2dCQUNFLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSTtnQkFDMUIsY0FBYyxFQUFFLHNCQUFzQjtnQkFDdEMsYUFBYSxFQUFFLGdCQUFLO3FCQUNqQixVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztxQkFDaEMsVUFBVSxDQUFDLHNCQUFzQixDQUFDO3FCQUNsQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzthQUM3QixFQUNEO2dCQUNFLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSTtnQkFDMUIsY0FBYyxFQUFFLHNCQUFzQjtnQkFDdEMsYUFBYSxFQUFFLGdCQUFLO3FCQUNqQixVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztxQkFDaEMsVUFBVSxDQUFDLHNCQUFzQixDQUFDO3FCQUNsQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzthQUM3QixFQUNELHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsMEJBQTBCLENBQzNCO2lCQUNBLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHVFQUF1RSxDQUFDLENBQUM7UUFDckcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy9cbi8vIFRlc3RzIGZvciBlbnRlcnByaXNlc1xuLy9cblxuaW1wb3J0ICogYXMgbm9jayBmcm9tICdub2NrJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IGNvbW1vbiwgRUNEU0FVdGlscywgRW50ZXJwcmlzZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7IFRlc3RCaXRHbyB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHbyB9IGZyb20gJy4uLy4uLy4uL3NyYy9iaXRnbyc7XG5pbXBvcnQgeyBtb2NrQ2hhbGxlbmdlQSB9IGZyb20gJy4vaW50ZXJuYWwvdHNzVXRpbHMvbW9ja3MvZWNkc2FOdGlsZGUnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG5kZXNjcmliZSgnRW50ZXJwcmlzZTonLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbztcbiAgbGV0IGVudGVycHJpc2U7XG4gIGxldCBiYXNlQ29pbjtcbiAgbGV0IGJnVXJsO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAndGVzdCcgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYmFzZUNvaW4gPSBiaXRnby5jb2luKCd0YnRjJyk7XG4gICAgZW50ZXJwcmlzZSA9IG5ldyBFbnRlcnByaXNlKGJpdGdvLCBiYXNlQ29pbiwgeyBpZDogJzU5M2YxZWNlOTlkMzdjMjMwODBhNTU3MjgzZWRjYzg5JywgbmFtZTogJ1Rlc3QgRW50ZXJwcmlzZScgfSk7XG4gICAgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS51cmk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2VhcmNoIGZvciBwZW5kaW5nIHRyYW5zYWN0aW9uIGNvcnJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgZW50ZXJwcmlzZUlkOiBlbnRlcnByaXNlLmlkIH07XG4gICAgICBjb25zdCBzY29wZSA9IG5vY2soYmdVcmwpLmdldCgnL2FwaS92Mi90YnRjL3R4L3BlbmRpbmcvZmlyc3QnKS5xdWVyeShwYXJhbXMpLnJlcGx5KDIwMCk7XG4gICAgICBhd2FpdCBlbnRlcnByaXNlLmdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKCkuc2hvdWxkLmJlLnJlc29sdmVkKCk7XG4gICAgICBzY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZldGNoIHRoZSB0c3MgY29uZmlnIGNvcnJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAuZ2V0KGAvYXBpL3YyL2VudGVycHJpc2UvJHtlbnRlcnByaXNlLmlkfS90c3Njb25maWdgKVxuICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICBlY2RzYToge1xuICAgICAgICAgIGNoYWxsZW5nZToge1xuICAgICAgICAgICAgZW50ZXJwcmlzZToge1xuICAgICAgICAgICAgICAuLi5tb2NrQ2hhbGxlbmdlQSxcbiAgICAgICAgICAgICAgdmVyaWZpZXJzOiB7XG4gICAgICAgICAgICAgICAgYWRtaW5TaWduYXR1cmU6ICdoZXggc2lnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIGF3YWl0IGVudGVycHJpc2UuZ2V0RXhpc3RpbmdUc3NFY2RzYUNoYWxsZW5nZSgpLnNob3VsZC5iZS5yZXNvbHZlZCgpO1xuICAgIHNjb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZXNpZ24gZW50ZXJwcmlzZSBjaGFsbGVuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycgfSk7XG4gICAgY29uc3QgZW50ZXJwcmlzZSA9IG5ldyBFbnRlcnByaXNlKGJpdGdvLCBiaXRnby5jb2luKCd0YnRjJyksIHsgaWQ6ICcxMjMnLCBuYW1lOiAnVGVzdCBFbnRlcnByaXNlJyB9KTtcblxuICAgIGNvbnN0IG9sZEFkbWluRWNkaEtleSA9IGJpdGdvLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgIGNvbnN0IG9sZEFkbWluRGVyaXZhdGlvblBhdGggPSAnbS8wLzAnO1xuXG4gICAgY29uc3QgbmV3QWRtaW5FY2RoS2V5ID0gYml0Z28ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgY29uc3QgbmV3QWRtaW5EZXJpdmF0aW9uUGF0aCA9ICdtLzAvMSc7XG5cbiAgICBjb25zdCBlbnRDaGFsbGVuZ2UgPSB7XG4gICAgICBudGlsZGU6ICdlbnQgbnRpbGRlJyxcbiAgICAgIGgxOiAnZW50IGgxJyxcbiAgICAgIGgyOiAnZW50IGgyJyxcbiAgICB9O1xuICAgIGNvbnN0IGJpdGdvQ2hhbGxlbmdlID0ge1xuICAgICAgbnRpbGRlOiAnYml0Z28gbnRpbGRlJyxcbiAgICAgIGgxOiAnYml0Z28gaDEnLFxuICAgICAgaDI6ICdiaXRnbyBoMicsXG4gICAgfTtcblxuICAgIGNvbnN0IHNpZ25lZEVudENoYWxsZW5nZSA9IEVDRFNBVXRpbHMuRWNkc2FVdGlscy5zaWduQ2hhbGxlbmdlKFxuICAgICAgZW50Q2hhbGxlbmdlLFxuICAgICAgb2xkQWRtaW5FY2RoS2V5LnhwcnYsXG4gICAgICBvbGRBZG1pbkRlcml2YXRpb25QYXRoXG4gICAgKTtcblxuICAgIGNvbnN0IHNpZ25lZEJpdGdvQ2hhbGxlbmdlID0gRUNEU0FVdGlscy5FY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBiaXRnb0NoYWxsZW5nZSxcbiAgICAgIG9sZEFkbWluRWNkaEtleS54cHJ2LFxuICAgICAgb2xkQWRtaW5EZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBuZXdTaWduZWRFbnRDaGFsbGVuZ2UgPSBFQ0RTQVV0aWxzLkVjZHNhVXRpbHMuc2lnbkNoYWxsZW5nZShcbiAgICAgIGVudENoYWxsZW5nZSxcbiAgICAgIG5ld0FkbWluRWNkaEtleS54cHJ2LFxuICAgICAgbmV3QWRtaW5EZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBuZXdTaWduZWRCaXRnb0NoYWxsZW5nZSA9IEVDRFNBVXRpbHMuRWNkc2FVdGlscy5zaWduQ2hhbGxlbmdlKFxuICAgICAgYml0Z29DaGFsbGVuZ2UsXG4gICAgICBuZXdBZG1pbkVjZGhLZXkueHBydixcbiAgICAgIG5ld0FkbWluRGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgY29uc3QgZW50Q2hhbGxlbmdlV2l0aFZlcmlmaWVyczogRUNEU0FVdGlscy5TZXJpYWxpemVkTnRpbGRlV2l0aFZlcmlmaWVycyA9IHtcbiAgICAgIC4uLmVudENoYWxsZW5nZSxcbiAgICAgIHZlcmlmaWVyczoge1xuICAgICAgICBhZG1pblNpZ25hdHVyZTogc2lnbmVkRW50Q2hhbGxlbmdlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBiaXRnb0NoYWxsZW5nZVdpdGhWZXJpZmllcjogRUNEU0FVdGlscy5TZXJpYWxpemVkTnRpbGRlV2l0aFZlcmlmaWVycyA9IHtcbiAgICAgIC4uLmJpdGdvQ2hhbGxlbmdlLFxuICAgICAgdmVyaWZpZXJzOiB7XG4gICAgICAgIGFkbWluU2lnbmF0dXJlOiBzaWduZWRCaXRnb0NoYWxsZW5nZS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhbmQgcmVzaWduIGVudGVycHJpc2UgY2hhbGxlbmdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3R1YnVVcGxvYWRDaGFsbGVuZ2VzID0gc2lub24uc3R1YihFQ0RTQVV0aWxzLkVjZHNhVXRpbHMsICd1cGxvYWRDaGFsbGVuZ2VzVG9FbnRlcnByaXNlJyk7XG4gICAgICBhd2FpdCBlbnRlcnByaXNlXG4gICAgICAgIC5yZXNpZ25FbnRlcnByaXNlQ2hhbGxlbmdlcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICB4cHJ2OiBvbGRBZG1pbkVjZGhLZXkueHBydixcbiAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiBvbGRBZG1pbkRlcml2YXRpb25QYXRoLFxuICAgICAgICAgICAgZGVyaXZlZFB1YktleTogYmlwMzJcbiAgICAgICAgICAgICAgLmZyb21CYXNlNTgob2xkQWRtaW5FY2RoS2V5LnhwdWIpXG4gICAgICAgICAgICAgIC5kZXJpdmVQYXRoKG9sZEFkbWluRGVyaXZhdGlvblBhdGgpXG4gICAgICAgICAgICAgIC5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgeHBydjogbmV3QWRtaW5FY2RoS2V5LnhwcnYsXG4gICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogbmV3QWRtaW5EZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgICAgIGRlcml2ZWRQdWJLZXk6IGJpcDMyXG4gICAgICAgICAgICAgIC5mcm9tQmFzZTU4KG5ld0FkbWluRWNkaEtleS54cHViKVxuICAgICAgICAgICAgICAuZGVyaXZlUGF0aChuZXdBZG1pbkRlcml2YXRpb25QYXRoKVxuICAgICAgICAgICAgICAucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudENoYWxsZW5nZVdpdGhWZXJpZmllcnMsXG4gICAgICAgICAgYml0Z29DaGFsbGVuZ2VXaXRoVmVyaWZpZXIsXG4gICAgICAgICAgYml0Z29DaGFsbGVuZ2VXaXRoVmVyaWZpZXJcbiAgICAgICAgKVxuICAgICAgICAuc2hvdWxkLm5vdC5iZS5yZWplY3RlZCgpO1xuICAgICAgc3R1YnVVcGxvYWRDaGFsbGVuZ2VzLnNob3VsZC5iZS5jYWxsZWRXaXRoKFxuICAgICAgICBiaXRnbyxcbiAgICAgICAgJzEyMycsXG4gICAgICAgIGVudENoYWxsZW5nZVdpdGhWZXJpZmllcnMsXG4gICAgICAgIG5ld1NpZ25lZEVudENoYWxsZW5nZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIG5ld1NpZ25lZEJpdGdvQ2hhbGxlbmdlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgbmV3U2lnbmVkQml0Z29DaGFsbGVuZ2UudG9TdHJpbmcoJ2hleCcpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gdGhlIG9sZCBlY2RoIGtleWNoYWluIGlzIGluY29ycmVjdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGVudGVycHJpc2VcbiAgICAgICAgLnJlc2lnbkVudGVycHJpc2VDaGFsbGVuZ2VzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHhwcnY6IG5ld0FkbWluRWNkaEtleS54cHJ2LFxuICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6IG5ld0FkbWluRGVyaXZhdGlvblBhdGgsXG4gICAgICAgICAgICBkZXJpdmVkUHViS2V5OiBiaXAzMlxuICAgICAgICAgICAgICAuZnJvbUJhc2U1OChuZXdBZG1pbkVjZGhLZXkueHB1YilcbiAgICAgICAgICAgICAgLmRlcml2ZVBhdGgobmV3QWRtaW5EZXJpdmF0aW9uUGF0aClcbiAgICAgICAgICAgICAgLnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB4cHJ2OiBuZXdBZG1pbkVjZGhLZXkueHBydixcbiAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiBuZXdBZG1pbkRlcml2YXRpb25QYXRoLFxuICAgICAgICAgICAgZGVyaXZlZFB1YktleTogYmlwMzJcbiAgICAgICAgICAgICAgLmZyb21CYXNlNTgobmV3QWRtaW5FY2RoS2V5LnhwdWIpXG4gICAgICAgICAgICAgIC5kZXJpdmVQYXRoKG5ld0FkbWluRGVyaXZhdGlvblBhdGgpXG4gICAgICAgICAgICAgIC5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW50Q2hhbGxlbmdlV2l0aFZlcmlmaWVycyxcbiAgICAgICAgICBiaXRnb0NoYWxsZW5nZVdpdGhWZXJpZmllcixcbiAgICAgICAgICBiaXRnb0NoYWxsZW5nZVdpdGhWZXJpZmllclxuICAgICAgICApXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdDYW5ub3QgcmUtc2lnbi4gVGhlIEVudGVycHJpc2UgVFNTIGNvbmZpZyB3YXMgc2lnbmVkIGJ5IGFub3RoZXIgdXNlci4nKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!