PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-hbar/dist/test/unit/transactionBuilder
Просмотр файла: tokenAssociateBuilder.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 assert_1 = __importDefault(require("assert"));
const should = __importStar(require("should"));
const getBuilderFactory_1 = require("../getBuilderFactory");
const testData = __importStar(require("../../resources/hbar"));
const sdk_core_1 = require("@bitgo/sdk-core");
describe('HBAR Token Associate Builder', () => {
const factory = (0, getBuilderFactory_1.getBuilderFactory)('thbar');
const TOKEN_NAME = 'thbar:usdc';
const initTxBuilder = () => {
const txBuilder = factory.getTokenAssociateBuilder();
txBuilder.fee({ fee: testData.FEE });
txBuilder.source({ address: testData.ACCOUNT_1.accountId });
txBuilder.account(testData.ACCOUNT_1.accountId);
txBuilder.tokens(TOKEN_NAME);
return txBuilder;
};
describe('should build ', () => {
describe('non serialized transactions', () => {
it('a signed token associate transaction', async () => {
const builder = initTxBuilder();
builder.validDuration(1000000);
builder.node({ nodeId: '0.0.2345' });
builder.startTime('1596110493.372646570');
builder.sign({ key: testData.ACCOUNT_1.prvKeyWithPrefix });
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(tx.signature.length, 1);
txJson.instructionsData.params.tokenNames.length.should.equal(1);
txJson.instructionsData.params.tokenNames[0].should.deepEqual(TOKEN_NAME);
txJson.instructionsData.params.accountId.should.deepEqual(testData.ACCOUNT_1.accountId);
should.deepEqual(txJson.from, testData.ACCOUNT_1.accountId);
should.deepEqual(txJson.fee.toString(), testData.FEE);
should.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TOKEN_ASSOCIATE_TRANSACTION);
tx.type.should.equal(sdk_core_1.TransactionType.AssociatedTokenAccountInitialization);
tx.outputs.length.should.equal(1);
tx.outputs[0].should.deepEqual({
address: testData.ACCOUNT_1.accountId,
value: '0',
coin: TOKEN_NAME,
});
tx.inputs.length.should.equal(1);
tx.inputs[0].should.deepEqual({
address: testData.ACCOUNT_1.accountId,
value: '0',
coin: TOKEN_NAME,
});
});
it('a token associate transaction with memo', async () => {
const builder = initTxBuilder();
builder.memo('This is an example');
const tx = await builder.build();
const txJson = tx.toJson();
txJson.instructionsData.params.tokenNames.length.should.equal(1);
txJson.instructionsData.params.tokenNames[0].should.deepEqual(TOKEN_NAME);
txJson.instructionsData.params.accountId.should.deepEqual(testData.ACCOUNT_1.accountId);
should.deepEqual(txJson.memo, 'This is an example');
should.deepEqual(txJson.from, testData.ACCOUNT_1.accountId);
should.deepEqual(txJson.fee.toString(), testData.FEE);
});
it('a non signed token associate transaction', async () => {
const builder = initTxBuilder();
builder.startTime('1596110493.372646570');
builder.validDuration(1000000);
builder.node({ nodeId: '0.0.2345' });
const tx = await builder.build();
const txJson = tx.toJson();
txJson.instructionsData.params.tokenNames.length.should.equal(1);
txJson.instructionsData.params.tokenNames[0].should.deepEqual(TOKEN_NAME);
txJson.instructionsData.params.accountId.should.deepEqual(testData.ACCOUNT_1.accountId);
should.deepEqual(txJson.from, testData.ACCOUNT_1.accountId);
should.deepEqual(txJson.fee.toString(), testData.FEE);
should.deepEqual(tx.toBroadcastFormat(), testData.NON_SIGNED_TOKEN_ASSOCIATE_TRANSACTION);
});
it('a token associate transaction between accounts with realm and shard non zero', async () => {
const builder = factory.getTokenAssociateBuilder();
builder.fee({ fee: testData.FEE });
builder.source({ address: '2.3.456' });
builder.account('3.4.567');
builder.tokens(TOKEN_NAME);
builder.node({ nodeId: '5.2.2345' });
const tx = await builder.build();
const txJson = tx.toJson();
txJson.instructionsData.params.tokenNames.length.should.equal(1);
txJson.instructionsData.params.tokenNames[0].should.deepEqual(TOKEN_NAME);
txJson.instructionsData.params.accountId.should.deepEqual('3.4.567');
should.deepEqual(txJson.node, '5.2.2345');
should.deepEqual(txJson.from, '2.3.456');
});
it('a token associate transaction between accounts without realm and shard', async () => {
const builder = factory.getTokenAssociateBuilder();
builder.fee({ fee: testData.FEE });
builder.source({ address: '456' });
builder.account('567');
builder.tokens(TOKEN_NAME);
builder.node({ nodeId: '2345' });
const tx = await builder.build();
const txJson = tx.toJson();
txJson.instructionsData.params.tokenNames.length.should.equal(1);
txJson.instructionsData.params.tokenNames[0].should.deepEqual(TOKEN_NAME);
txJson.instructionsData.params.accountId.should.deepEqual('0.0.567');
should.deepEqual(txJson.node, '0.0.2345');
should.deepEqual(txJson.from, '0.0.456');
});
describe('serialized token transactions', () => {
it('a non signed token transfer transaction from serialized', async () => {
const builder = factory.from(testData.NON_SIGNED_TOKEN_ASSOCIATE_TRANSACTION);
builder.sign({ key: testData.ACCOUNT_1.prvKeyWithPrefix });
const tx2 = await builder.build();
should.deepEqual(tx2.toBroadcastFormat(), testData.SIGNED_TOKEN_ASSOCIATE_TRANSACTION);
tx2.type.should.equal(sdk_core_1.TransactionType.AssociatedTokenAccountInitialization);
});
it('an offline multisig token transfer transaction', async () => {
const builder = initTxBuilder();
builder.startTime('1596110493.372646570');
builder.sign({ key: testData.ACCOUNT_1.prvKeyWithPrefix });
const tx = await builder.build();
should.deepEqual(tx.signature.length, 1);
const builder2 = factory.from(tx.toBroadcastFormat());
builder2.sign({ key: testData.ACCOUNT_2.privateKey });
const tx2 = await builder2.build();
should.deepEqual(tx2.signature.length, 2);
const builder3 = factory.from(tx2.toBroadcastFormat());
builder3.sign({ key: testData.ACCOUNT_3.privateKey });
const tx3 = await builder3.build();
should.deepEqual(tx3.signature.length, 3);
should.deepEqual(tx3.toBroadcastFormat(), testData.THREE_TIMES_SIGNED_TOKEN_ASSOCIATE_TRANSACTION);
});
});
});
describe('should fail', () => {
it('a token associate transaction with an invalid key', () => {
const builder = initTxBuilder();
assert_1.default.throws(() => builder.sign({ key: '5bb72603f237c0993f7973d37fdade32c71aa94aee686aa79d260acba1882d90AA' }), (e) => e.message === 'Invalid private key');
});
it('a token associate transaction with more signatures than allowed', () => {
const builder = initTxBuilder();
builder.sign({ key: testData.ACCOUNT_2.privateKey });
builder.sign({ key: testData.ACCOUNT_1.prvKeyWithPrefix });
builder.sign({ key: testData.ACCOUNT_3.privateKey });
assert_1.default.throws(() => builder.sign({ key: '5bb72603f237c0993f7973d37fdade32c71aa94aee686aa79d260acba1882d90' }), (e) => e.message === 'A maximum of 3 can sign the transaction.');
});
it('a token associate transaction with repeated sign', () => {
const builder = initTxBuilder();
builder.sign({ key: testData.ACCOUNT_1.prvKeyWithPrefix });
assert_1.default.throws(() => builder.sign({ key: testData.ACCOUNT_1.prvKeyWithPrefix }), (e) => e.message ===
'Repeated sign: 302e020100300506032b65700422042062b0b669de0ab5e91b4328e1431859a5ca47e7426e701019272f5c2d52825b01');
});
it('a token associate transaction with an invalid account id', () => {
const txBuilder = factory.getTokenAssociateBuilder();
assert_1.default.throws(() => txBuilder.account('invalidaccountId'), (e) => e.message === 'Unsupported account address: invalidaccountId');
});
it('a token transfer transaction with an invalid destination memo', () => {
const txBuilder = factory.getTokenAssociateBuilder();
assert_1.default.throws(() => txBuilder.memo('This sentence has more than 100 bytes allowed for the memo, this should throw error -----------------'), (e) => e.message === 'Memo must not be longer than 100 bytes');
});
it('a token transfer transaction with an invalid token name', () => {
const txBuilder = factory.getTokenAssociateBuilder();
assert_1.default.throws(() => txBuilder.tokens('invalidtokenname'), (e) => e.message === 'Unsupported token: invalidtokenname');
});
it('a token transfer transaction with an repeated token name', () => {
const txBuilder = factory.getTokenAssociateBuilder();
txBuilder.tokens('thbar:usdc');
assert_1.default.throws(() => txBuilder.tokens('thbar:usdc'), (e) => e.message === 'Repeated token ID: 0.0.13078');
});
it('a token associate transaction with invalid start time', () => {
const txBuilder = factory.getTokenAssociateBuilder();
assert_1.default.throws(() => txBuilder.startTime('invalid start time'), (e) => e.message === 'Invalid value for time parameter');
assert_1.default.throws(() => txBuilder.startTime('-5'), (e) => e.message === 'Invalid value for time parameter');
});
it('a token associate transaction with invalid node', () => {
const txBuilder = factory.getTokenAssociateBuilder();
assert_1.default.throws(() => txBuilder.node({ nodeId: 'invalid node' }), (e) => e.message === 'Invalid Hedera node address');
});
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5Bc3NvY2lhdGVCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90b2tlbkFzc29jaWF0ZUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsK0NBQWlDO0FBQ2pDLDREQUF5RDtBQUN6RCwrREFBaUQ7QUFDakQsOENBQWtEO0FBRWxELFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7SUFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7SUFDaEMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3JELFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDckMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDNUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0IsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUYsUUFBUSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7UUFDN0IsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtZQUMzQyxFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BELE1BQU0sT0FBTyxHQUFHLGFB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RUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxrQ0FBa0MsQ0FDN0QsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtnQkFDekQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUM7Z0JBQ3JELGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFDaEQsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssNkJBQTZCLENBQ3hELENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaGJhcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5kZXNjcmliZSgnSEJBUiBUb2tlbiBBc3NvY2lhdGUgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0aGJhcicpO1xuICBjb25zdCBUT0tFTl9OQU1FID0gJ3RoYmFyOnVzZGMnO1xuICBjb25zdCBpbml0VHhCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VG9rZW5Bc3NvY2lhdGVCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZlZSh7IGZlZTogdGVzdERhdGEuRkVFIH0pO1xuICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiB0ZXN0RGF0YS5BQ0NPVU5UXzEuYWNjb3VudElkIH0pO1xuICAgIHR4QnVpbGRlci5hY2NvdW50KHRlc3REYXRhLkFDQ09VTlRfMS5hY2NvdW50SWQpO1xuICAgIHR4QnVpbGRlci50b2tlbnMoVE9LRU5fTkFNRSk7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGJ1aWxkICcsICgpID0+IHtcbiAgICBkZXNjcmliZSgnbm9uIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgICAgaXQoJ2Egc2lnbmVkIHRva2VuIGFzc29jaWF0ZSB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci52YWxpZER1cmF0aW9uKDEwMDAwMDApO1xuICAgICAgICBidWlsZGVyLm5vZGUoeyBub2RlSWQ6ICcwLjAuMjM0NScgfSk7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRUaW1lKCcxNTk2MTEwNDkzLjM3MjY0NjU3MCcpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS5wcnZLZXlXaXRoUHJlZml4IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMSk7XG4gICAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy50b2tlbk5hbWVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy50b2tlbk5hbWVzWzBdLnNob3VsZC5kZWVwRXF1YWwoVE9LRU5fTkFNRSk7XG4gICAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy5hY2NvdW50SWQuc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5BQ0NPVU5UXzEuYWNjb3VudElkKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgdGVzdERhdGEuQUNDT1VOVF8xLmFjY291bnRJZCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCB0ZXN0RGF0YS5GRUUpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9UT0tFTl9BU1NPQ0lBVEVfVFJBTlNBQ1RJT04pO1xuICAgICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uKTtcblxuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuQUNDT1VOVF8xLmFjY291bnRJZCxcbiAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgIGNvaW46IFRPS0VOX05BTUUsXG4gICAgICAgIH0pO1xuICAgICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLkFDQ09VTlRfMS5hY2NvdW50SWQsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICBjb2luOiBUT0tFTl9OQU1FLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSB0b2tlbiBhc3NvY2lhdGUgdHJhbnNhY3Rpb24gd2l0aCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLm1lbW8oJ1RoaXMgaXMgYW4gZXhhbXBsZScpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy50b2tlbk5hbWVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy50b2tlbk5hbWVzWzBdLnNob3VsZC5kZWVwRXF1YWwoVE9LRU5fTkFNRSk7XG4gICAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy5hY2NvdW50SWQuc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5BQ0NPVU5UXzEuYWNjb3VudElkKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubWVtbywgJ1RoaXMgaXMgYW4gZXhhbXBsZScpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCB0ZXN0RGF0YS5BQ0NPVU5UXzEuYWNjb3VudElkKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLnRvU3RyaW5nKCksIHRlc3REYXRhLkZFRSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2Egbm9uIHNpZ25lZCB0b2tlbiBhc3NvY2lhdGUgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRUaW1lKCcxNTk2MTEwNDkzLjM3MjY0NjU3MCcpO1xuICAgICAgICBidWlsZGVyLnZhbGlkRHVyYXRpb24oMTAwMDAwMCk7XG4gICAgICAgIGJ1aWxkZXIubm9kZSh7IG5vZGVJZDogJzAuMC4yMzQ1JyB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMudG9rZW5OYW1lcy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMudG9rZW5OYW1lc1swXS5zaG91bGQuZGVlcEVxdWFsKFRPS0VOX05BTUUpO1xuICAgICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMuYWNjb3VudElkLnNob3VsZC5kZWVwRXF1YWwodGVzdERhdGEuQUNDT1VOVF8xLmFjY291bnRJZCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZyb20sIHRlc3REYXRhLkFDQ09VTlRfMS5hY2NvdW50SWQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUudG9TdHJpbmcoKSwgdGVzdERhdGEuRkVFKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5OT05fU0lHTkVEX1RPS0VOX0FTU09DSUFURV9UUkFOU0FDVElPTik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdG9rZW4gYXNzb2NpYXRlIHRyYW5zYWN0aW9uIGJldHdlZW4gYWNjb3VudHMgd2l0aCByZWFsbSBhbmQgc2hhcmQgbm9uIHplcm8nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRva2VuQXNzb2NpYXRlQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLmZlZSh7IGZlZTogdGVzdERhdGEuRkVFIH0pO1xuICAgICAgICBidWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6ICcyLjMuNDU2JyB9KTtcbiAgICAgICAgYnVpbGRlci5hY2NvdW50KCczLjQuNTY3Jyk7XG4gICAgICAgIGJ1aWxkZXIudG9rZW5zKFRPS0VOX05BTUUpO1xuICAgICAgICBidWlsZGVyLm5vZGUoeyBub2RlSWQ6ICc1LjIuMjM0NScgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEucGFyYW1zLnRva2VuTmFtZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEucGFyYW1zLnRva2VuTmFtZXNbMF0uc2hvdWxkLmRlZXBFcXVhbChUT0tFTl9OQU1FKTtcbiAgICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEucGFyYW1zLmFjY291bnRJZC5zaG91bGQuZGVlcEVxdWFsKCczLjQuNTY3Jyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLm5vZGUsICc1LjIuMjM0NScpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCAnMi4zLjQ1NicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRva2VuIGFzc29jaWF0ZSB0cmFuc2FjdGlvbiBiZXR3ZWVuIGFjY291bnRzIHdpdGhvdXQgcmVhbG0gYW5kIHNoYXJkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlbkFzc29jaWF0ZUJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5mZWUoeyBmZWU6IHRlc3REYXRhLkZFRSB9KTtcbiAgICAgICAgYnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiAnNDU2JyB9KTtcbiAgICAgICAgYnVpbGRlci5hY2NvdW50KCc1NjcnKTtcbiAgICAgICAgYnVpbGRlci50b2tlbnMoVE9LRU5fTkFNRSk7XG4gICAgICAgIGJ1aWxkZXIubm9kZSh7IG5vZGVJZDogJzIzNDUnIH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy50b2tlbk5hbWVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy50b2tlbk5hbWVzWzBdLnNob3VsZC5kZWVwRXF1YWwoVE9LRU5fTkFNRSk7XG4gICAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy5hY2NvdW50SWQuc2hvdWxkLmRlZXBFcXVhbCgnMC4wLjU2NycpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5ub2RlLCAnMC4wLjIzNDUnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgJzAuMC40NTYnKTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnc2VyaWFsaXplZCB0b2tlbiB0cmFuc2FjdGlvbnMnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdhIG5vbiBzaWduZWQgdG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuTk9OX1NJR05FRF9UT0tFTl9BU1NPQ0lBVEVfVFJBTlNBQ1RJT04pO1xuICAgICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnBydktleVdpdGhQcmVmaXggfSk7XG4gICAgICAgICAgY29uc3QgdHgyID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgyLnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9UT0tFTl9BU1NPQ0lBVEVfVFJBTlNBQ1RJT04pO1xuICAgICAgICAgIHR4Mi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FuIG9mZmxpbmUgbXVsdGlzaWcgdG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgICBidWlsZGVyLnN0YXJ0VGltZSgnMTU5NjExMDQ5My4zNzI2NDY1NzAnKTtcbiAgICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS5wcnZLZXlXaXRoUHJlZml4IH0pO1xuICAgICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMSk7XG5cbiAgICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgICBidWlsZGVyMi5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgICBjb25zdCB0eDIgPSBhd2FpdCBidWlsZGVyMi5idWlsZCgpO1xuICAgICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgyLnNpZ25hdHVyZS5sZW5ndGgsIDIpO1xuXG4gICAgICAgICAgY29uc3QgYnVpbGRlcjMgPSBmYWN0b3J5LmZyb20odHgyLnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICAgIGJ1aWxkZXIzLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMy5wcml2YXRlS2V5IH0pO1xuICAgICAgICAgIGNvbnN0IHR4MyA9IGF3YWl0IGJ1aWxkZXIzLmJ1aWxkKCk7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eDMuc2lnbmF0dXJlLmxlbmd0aCwgMyk7XG5cbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4My50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5USFJFRV9USU1FU19TSUdORURfVE9LRU5fQVNTT0NJQVRFX1RSQU5TQUNUSU9OKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzaG91bGQgZmFpbCcsICgpID0+IHtcbiAgICAgIGl0KCdhIHRva2VuIGFzc29jaWF0ZSB0cmFuc2FjdGlvbiB3aXRoIGFuIGludmFsaWQga2V5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAgICgpID0+IGJ1aWxkZXIuc2lnbih7IGtleTogJzViYjcyNjAzZjIzN2MwOTkzZjc5NzNkMzdmZGFkZTMyYzcxYWE5NGFlZTY4NmFhNzlkMjYwYWNiYTE4ODJkOTBBQScgfSksXG4gICAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnSW52YWxpZCBwcml2YXRlIGtleSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSB0b2tlbiBhc3NvY2lhdGUgdHJhbnNhY3Rpb24gd2l0aCBtb3JlIHNpZ25hdHVyZXMgdGhhbiBhbGxvd2VkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMi5wcml2YXRlS2V5IH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS5wcnZLZXlXaXRoUHJlZml4IH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMy5wcml2YXRlS2V5IH0pO1xuICAgICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAgICgpID0+IGJ1aWxkZXIuc2lnbih7IGtleTogJzViYjcyNjAzZjIzN2MwOTkzZjc5NzNkMzdmZGFkZTMyYzcxYWE5NGFlZTY4NmFhNzlkMjYwYWNiYTE4ODJkOTAnIH0pLFxuICAgICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0EgbWF4aW11bSBvZiAzIGNhbiBzaWduIHRoZSB0cmFuc2FjdGlvbi4nXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdG9rZW4gYXNzb2NpYXRlIHRyYW5zYWN0aW9uIHdpdGggcmVwZWF0ZWQgc2lnbicsICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJ2S2V5V2l0aFByZWZpeCB9KTtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS5wcnZLZXlXaXRoUHJlZml4IH0pLFxuICAgICAgICAgIChlOiBhbnkpID0+XG4gICAgICAgICAgICBlLm1lc3NhZ2UgPT09XG4gICAgICAgICAgICAnUmVwZWF0ZWQgc2lnbjogMzAyZTAyMDEwMDMwMDUwNjAzMmI2NTcwMDQyMjA0MjA2MmIwYjY2OWRlMGFiNWU5MWI0MzI4ZTE0MzE4NTlhNWNhNDdlNzQyNmU3MDEwMTkyNzJmNWMyZDUyODI1YjAxJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRva2VuIGFzc29jaWF0ZSB0cmFuc2FjdGlvbiB3aXRoIGFuIGludmFsaWQgYWNjb3VudCBpZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlbkFzc29jaWF0ZUJ1aWxkZXIoKTtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB0eEJ1aWxkZXIuYWNjb3VudCgnaW52YWxpZGFjY291bnRJZCcpLFxuICAgICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1Vuc3VwcG9ydGVkIGFjY291bnQgYWRkcmVzczogaW52YWxpZGFjY291bnRJZCdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSB0b2tlbiB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGFuIGludmFsaWQgZGVzdGluYXRpb24gbWVtbycsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlbkFzc29jaWF0ZUJ1aWxkZXIoKTtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgdHhCdWlsZGVyLm1lbW8oXG4gICAgICAgICAgICAgICdUaGlzIHNlbnRlbmNlIGhhcyBtb3JlIHRoYW4gMTAwIGJ5dGVzIGFsbG93ZWQgZm9yIHRoZSBtZW1vLCB0aGlzIHNob3VsZCB0aHJvdyBlcnJvciAtLS0tLS0tLS0tLS0tLS0tLSdcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnTWVtbyBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAxMDAgYnl0ZXMnXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIHRva2VuIG5hbWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VG9rZW5Bc3NvY2lhdGVCdWlsZGVyKCk7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4gdHhCdWlsZGVyLnRva2VucygnaW52YWxpZHRva2VubmFtZScpLFxuICAgICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1Vuc3VwcG9ydGVkIHRva2VuOiBpbnZhbGlkdG9rZW5uYW1lJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRva2VuIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggYW4gcmVwZWF0ZWQgdG9rZW4gbmFtZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlbkFzc29jaWF0ZUJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VucygndGhiYXI6dXNkYycpO1xuICAgICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAgICgpID0+IHR4QnVpbGRlci50b2tlbnMoJ3RoYmFyOnVzZGMnKSxcbiAgICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdSZXBlYXRlZCB0b2tlbiBJRDogMC4wLjEzMDc4J1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRva2VuIGFzc29jaWF0ZSB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgc3RhcnQgdGltZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlbkFzc29jaWF0ZUJ1aWxkZXIoKTtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB0eEJ1aWxkZXIuc3RhcnRUaW1lKCdpbnZhbGlkIHN0YXJ0IHRpbWUnKSxcbiAgICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdJbnZhbGlkIHZhbHVlIGZvciB0aW1lIHBhcmFtZXRlcidcbiAgICAgICAgKTtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB0eEJ1aWxkZXIuc3RhcnRUaW1lKCctNScpLFxuICAgICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0ludmFsaWQgdmFsdWUgZm9yIHRpbWUgcGFyYW1ldGVyJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRva2VuIGFzc29jaWF0ZSB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgbm9kZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUb2tlbkFzc29jaWF0ZUJ1aWxkZXIoKTtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB0eEJ1aWxkZXIubm9kZSh7IG5vZGVJZDogJ2ludmFsaWQgbm9kZScgfSksXG4gICAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnSW52YWxpZCBIZWRlcmEgbm9kZSBhZGRyZXNzJ1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!