PHP WebShell
Текущая директория: /opt/BitGoJS/node_modules/avalanche/typings/e2e_tests
Просмотр файла: pchain_nomock.test.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const e2etestlib_1 = require("./e2etestlib");
const api_1 = require("src/apis/keystore/api");
const bn_js_1 = __importDefault(require("bn.js"));
describe("PChain", () => {
let tx = { value: "" };
let addrB = { value: "" };
let addrC = { value: "" };
let createdSubnetID = { value: "" };
const avalanche = (0, e2etestlib_1.getAvalanche)();
const pchain = avalanche.PChain();
const keystore = new api_1.KeystoreAPI(avalanche);
const now = new Date().getTime();
const startTime = new Date(now + 800);
const endTime = new Date(now + 50000);
const stakeAmount = new bn_js_1.default(200000000000);
const user = "avalancheJspChainUser";
const passwd = "avalancheJsP@ssw4rd";
const badUser = "asdfasdfsa";
const badPass = "pass";
const memo = "hello world";
const whaleAddr = "P-custom18jma8ppw3nhx5r4ap8clazz0dps7rv5u9xde7p";
const key = "PrivateKey-ewoqjP7PxY4yr3iLTpLisriqt94hdyDFNgchSxGGztUrTXtNN";
const nodeID = "NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg";
const subnetID = "2bGsYJorY6X7RhjPBFs3kYjiNEHo4zGrD2eeyZbb43T2KKi7fM";
const xChainAddr = "X-custom18jma8ppw3nhx5r4ap8clazz0dps7rv5u9xde7p";
const avalancheBlockChainID = "2VvmkRw4yrz8tPrVnCCbvEK1JxNyujpqhmU6SGonxMpkWBx9UD";
const rewardUTXOTxID = "2nmH8LithVbdjaXsxVQCQfXtzN9hBbmebrsaEYnLM9T32Uy2Y4";
// test_name response_promise resp_fn matcher expected_value/obtained_value
const tests_spec = [
[
"createUser",
() => keystore.createUser(user, passwd),
(x) => x,
e2etestlib_1.Matcher.toEqual,
() => { return {}; }
],
[
"createaddrB",
() => pchain.createAddress(user, passwd),
(x) => x,
e2etestlib_1.Matcher.Get,
() => addrB
],
[
"createaddrC",
() => pchain.createAddress(user, passwd),
(x) => x,
e2etestlib_1.Matcher.Get,
() => addrC
],
[
"incorrectUser",
() => pchain.listAddresses(badUser, passwd),
(x) => x,
e2etestlib_1.Matcher.toThrow,
() => `problem retrieving user "${badUser}": incorrect password for user "${badUser}"`
],
[
"incorrectPass",
() => pchain.listAddresses(user, badPass),
(x) => x,
e2etestlib_1.Matcher.toThrow,
() => `problem retrieving user "${user}": incorrect password for user "${user}"`
],
[
"getBalance",
() => pchain.getBalance(whaleAddr),
(x) => x.balance,
e2etestlib_1.Matcher.toBe,
() => "30000000000000000"
],
[
"getBalance2",
() => pchain.getBalance(whaleAddr),
(x) => x.utxoIDs[0].txID,
e2etestlib_1.Matcher.toBe,
() => "11111111111111111111111111111111LpoYY"
],
[
"getBlockchainsC",
() => pchain.getBlockchains(),
(x) => x[0].id,
e2etestlib_1.Matcher.toBe,
() => "BR28ypgLATNS6PbtHMiJ7NQ61vfpT27Hj8tAcZ1AHsfU5cz88"
],
[
"getBlockchainsX",
() => pchain.getBlockchains(),
(x) => x[1].id,
e2etestlib_1.Matcher.toBe,
() => "qzfF3A11KzpcHkkqznEyQgupQrCNS6WV6fTUTwZpEKqhj1QE7"
],
[
"getBlockchainStatus",
() => pchain.getBlockchainStatus(avalancheBlockChainID),
(x) => x,
e2etestlib_1.Matcher.toBe,
() => "Unknown"
],
[
"getCurrentSupply",
() => pchain.getCurrentSupply(),
(x) => {
return x.toString();
},
e2etestlib_1.Matcher.toBe,
() => "361196333750752149"
],
[
"getHeight",
() => pchain.getHeight(),
(x) => x.toString(),
e2etestlib_1.Matcher.toEqual,
() => "0"
],
[
"getMinStake",
() => pchain.getMinStake(),
(x) => {
return x.minDelegatorStake.toString();
},
e2etestlib_1.Matcher.toBe,
() => "25000000000"
],
[
"importKey",
() => pchain.importKey(user, passwd, key),
(x) => x,
e2etestlib_1.Matcher.toBe,
() => whaleAddr
],
[
"listAddrs",
() => pchain.listAddresses(user, passwd),
(x) => x.sort(),
e2etestlib_1.Matcher.toEqual,
() => [whaleAddr, addrB.value, addrC.value].sort()
],
[
"createSubnet",
() => pchain.createSubnet(user, passwd, [whaleAddr], 1),
(x) => {
return x;
},
e2etestlib_1.Matcher.Get,
() => createdSubnetID
],
[
"getCurrentValidators",
() => pchain.getCurrentValidators(),
(x) => x.validators.length,
e2etestlib_1.Matcher.toBe,
() => 5
],
[
"getRewardUTXOs",
() => pchain.getRewardUTXOs(rewardUTXOTxID),
(x) => x.utxos.length,
e2etestlib_1.Matcher.toBe,
() => 0
],
[
"getStakeOutputs",
() => pchain.getStake([whaleAddr]),
(x) => x.stakedOutputs.length,
e2etestlib_1.Matcher.toBe,
() => 0
],
[
"getStake",
() => pchain.getStake([whaleAddr]),
(x) => x.staked.toString(),
e2etestlib_1.Matcher.toBe,
() => "0"
],
[
"addDelegator",
() => pchain.addDelegator(user, passwd, nodeID, startTime, endTime, stakeAmount, whaleAddr),
(x) => {
return x;
},
e2etestlib_1.Matcher.toThrow,
() => "couldn't unmarshal an argument. Ensure arguments are valid and properly formatted. See documentation for example calls"
],
[
"addValidator",
() => pchain.addValidator(user, passwd, nodeID, startTime, endTime, stakeAmount, whaleAddr, new bn_js_1.default(10)),
(x) => {
return x;
},
e2etestlib_1.Matcher.toThrow,
() => "couldn't unmarshal an argument. Ensure arguments are valid and properly formatted. See documentation for example calls"
],
[
"exportKey",
() => pchain.exportKey(user, passwd, addrB.value),
(x) => x,
e2etestlib_1.Matcher.toMatch,
() => /PrivateKey-\w*/
],
// [
// "exportAVAX",
// () => pchain.exportAVAX(user, passwd, new BN(10), xChainAddr),
// (x) => x,
// Matcher.toThrow,
// () =>
// "failed semanticVerifySpend: failed to read consumed UTXO 11111111111111111111111111111111LpoYY:0 due to: not found"
// ],
[
"getTx",
() => pchain.getTx(tx.value),
(x) => x,
e2etestlib_1.Matcher.toThrow,
() => "couldn't unmarshal an argument. Ensure arguments are valid and properly formatted. See documentation for example calls"
],
[
"getTxStatus",
() => pchain.getTxStatus("2JxmsgSJxMrddRUsKCxAagdvax3s6kY9xiivyzHRMqFfuRjFi2"),
(x) => x,
e2etestlib_1.Matcher.toEqual,
() => ({ status: "Unknown" })
],
[
"importAVAX",
() => pchain.importAVAX(user, passwd, addrB.value, "X"),
(x) => x,
e2etestlib_1.Matcher.toThrow,
() => "no spendable funds were found"
]
];
(0, e2etestlib_1.createTests)(tests_spec);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGNoYWluX25vbW9jay50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZTJlX3Rlc3RzL3BjaGFpbl9ub21vY2sudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFpRTtBQUNqRSwrQ0FBbUQ7QUFDbkQsa0RBQXNCO0FBRXRCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBUyxFQUFFO0lBQzVCLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFBO0lBQ3RCLElBQUksS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFBO0lBQ3pCLElBQUksS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFBO0lBQ3pCLElBQUksZUFBZSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFBO0lBRW5DLE1BQU0sU0FBUyxHQUFHLElBQUEseUJBQVksR0FBRSxDQUFBO0lBQ2hDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLGlCQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7SUFFM0MsTUFBTSxHQUFHLEdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUN4QyxNQUFNLFNBQVMsR0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUE7SUFDM0MsTUFBTSxPQUFPLEdBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFBO0lBQzNDLE1BQU0sV0FBVyxHQUFPLElBQUksZUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRTVDLE1BQU0sSUFBSSxHQUFXLHVCQUF1QixDQUFBO0lBQzVDLE1BQU0sTUFBTSxHQUFXLHFCQUFxQixDQUFBO0lBQzVDLE1BQU0sT0FBTyxHQUFXLFlBQVksQ0FBQTtJQUNwQyxNQUFNLE9BQU8s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IH0gZnJvbSBcIi4vZTJldGVzdGxpYlwiXG5pbXBvcnQgeyBLZXlzdG9yZUFQSSB9IGZyb20gXCJzcmMvYXBpcy9rZXlzdG9yZS9hcGlcIlxuaW1wb3J0IEJOIGZyb20gXCJibi5qc1wiXG5cbmRlc2NyaWJlKFwiUENoYWluXCIsICgpOiB2b2lkID0+IHtcbiAgbGV0IHR4ID0geyB2YWx1ZTogXCJcIiB9XG4gIGxldCBhZGRyQiA9IHsgdmFsdWU6IFwiXCIgfVxuICBsZXQgYWRkckMgPSB7IHZhbHVlOiBcIlwiIH1cbiAgbGV0IGNyZWF0ZWRTdWJuZXRJRCA9IHsgdmFsdWU6IFwiXCIgfVxuXG4gIGNvbnN0IGF2YWxhbmNoZSA9IGdldEF2YWxhbmNoZSgpXG4gIGNvbnN0IHBjaGFpbiA9IGF2YWxhbmNoZS5QQ2hhaW4oKVxuICBjb25zdCBrZXlzdG9yZSA9IG5ldyBLZXlzdG9yZUFQSShhdmFsYW5jaGUpXG5cbiAgY29uc3Qgbm93OiBudW1iZXIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICBjb25zdCBzdGFydFRpbWU6IERhdGUgPSBuZXcgRGF0ZShub3cgKyA4MDApXG4gIGNvbnN0IGVuZFRpbWU6IERhdGUgPSBuZXcgRGF0ZShub3cgKyA1MDAwMClcbiAgY29uc3Qgc3Rha2VBbW91bnQ6IEJOID0gbmV3IEJOKDIwMDAwMDAwMDAwMClcblxuICBjb25zdCB1c2VyOiBzdHJpbmcgPSBcImF2YWxhbmNoZUpzcENoYWluVXNlclwiXG4gIGNvbnN0IHBhc3N3ZDogc3RyaW5nID0gXCJhdmFsYW5jaGVKc1BAc3N3NHJkXCJcbiAgY29uc3QgYmFkVXNlcjogc3RyaW5nID0gXCJhc2RmYXNkZnNhXCJcbiAgY29uc3QgYmFkUGFzczogc3RyaW5nID0gXCJwYXNzXCJcbiAgY29uc3QgbWVtbzogc3RyaW5nID0gXCJoZWxsbyB3b3JsZFwiXG4gIGNvbnN0IHdoYWxlQWRkcjogc3RyaW5nID0gXCJQLWN1c3RvbTE4am1hOHBwdzNuaHg1cjRhcDhjbGF6ejBkcHM3cnY1dTl4ZGU3cFwiXG4gIGNvbnN0IGtleTogc3RyaW5nID1cbiAgICBcIlByaXZhdGVLZXktZXdvcWpQN1B4WTR5cjNpTFRwTGlzcmlxdDk0aGR5REZOZ2NoU3hHR3p0VXJUWHROTlwiXG4gIGNvbnN0IG5vZGVJRDogc3RyaW5nID0gXCJOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnXCJcbiAgY29uc3Qgc3VibmV0SUQ6IHN0cmluZyA9IFwiMmJHc1lKb3JZNlg3UmhqUEJGczNrWWppTkVIbzR6R3JEMmVleVpiYjQzVDJLS2k3Zk1cIlxuICBjb25zdCB4Q2hhaW5BZGRyOiBzdHJpbmcgPSBcIlgtY3VzdG9tMThqbWE4cHB3M25oeDVyNGFwOGNsYXp6MGRwczdydjV1OXhkZTdwXCJcbiAgY29uc3QgYXZhbGFuY2hlQmxvY2tDaGFpbklEOiBzdHJpbmcgPVxuICAgIFwiMlZ2bWtSdzR5cno4dFByVm5DQ2J2RUsxSnhOeXVqcHFobVU2U0dvbnhNcGtXQng5VURcIlxuXG4gIGNvbnN0IHJld2FyZFVUWE9UeElEOiBzdHJpbmcgPVxuICAgIFwiMm5tSDhMaXRoVmJkamFYc3hWUUNRZlh0ek45aEJibWVicnNhRVluTE05VDMyVXkyWTRcIlxuICAvLyB0ZXN0X25hbWUgICAgICAgIHJlc3BvbnNlX3Byb21pc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcF9mbiAgICAgICAgICBtYXRjaGVyICAgICAgICAgICBleHBlY3RlZF92YWx1ZS9vYnRhaW5lZF92YWx1ZVxuICBjb25zdCB0ZXN0c19zcGVjOiBhbnkgPSBbXG4gICAgW1xuICAgICAgXCJjcmVhdGVVc2VyXCIsXG4gICAgICAoKSA9PiBrZXlzdG9yZS5jcmVhdGVVc2VyKHVzZXIsIHBhc3N3ZCksXG4gICAgICAoeCkgPT4geCxcbiAgICAgIE1hdGNoZXIudG9FcXVhbCxcbiAgICAgICgpID0+IHsgcmV0dXJuIHt9IH1cbiAgICBdLFxuICAgIFtcbiAgICAgIFwiY3JlYXRlYWRkckJcIixcbiAgICAgICgpID0+IHBjaGFpbi5jcmVhdGVBZGRyZXNzKHVzZXIsIHBhc3N3ZCksXG4gICAgICAoeCkgPT4geCxcbiAgICAgIE1hdGNoZXIuR2V0LFxuICAgICAgKCkgPT4gYWRkckJcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiY3JlYXRlYWRkckNcIixcbiAgICAgICgpID0+IHBjaGFpbi5jcmVhdGVBZGRyZXNzKHVzZXIsIHBhc3N3ZCksXG4gICAgICAoeCkgPT4geCxcbiAgICAgIE1hdGNoZXIuR2V0LFxuICAgICAgKCkgPT4gYWRkckNcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiaW5jb3JyZWN0VXNlclwiLFxuICAgICAgKCkgPT4gcGNoYWluLmxpc3RBZGRyZXNzZXMoYmFkVXNlciwgcGFzc3dkKSxcbiAgICAgICh4KSA9PiB4LFxuICAgICAgTWF0Y2hlci50b1Rocm93LFxuICAgICAgKCkgPT5cbiAgICAgICAgYHByb2JsZW0gcmV0cmlldmluZyB1c2VyIFwiJHtiYWRVc2VyfVwiOiBpbmNvcnJlY3QgcGFzc3dvcmQgZm9yIHVzZXIgXCIke2JhZFVzZXJ9XCJgXG4gICAgXSxcbiAgICBbXG4gICAgICBcImluY29ycmVjdFBhc3NcIixcbiAgICAgICgpID0+IHBjaGFpbi5saXN0QWRkcmVzc2VzKHVzZXIsIGJhZFBhc3MpLFxuICAgICAgKHgpID0+IHgsXG4gICAgICBNYXRjaGVyLnRvVGhyb3csXG4gICAgICAoKSA9PlxuICAgICAgICBgcHJvYmxlbSByZXRyaWV2aW5nIHVzZXIgXCIke3VzZXJ9XCI6IGluY29ycmVjdCBwYXNzd29yZCBmb3IgdXNlciBcIiR7dXNlcn1cImBcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiZ2V0QmFsYW5jZVwiLFxuICAgICAgKCkgPT4gcGNoYWluLmdldEJhbGFuY2Uod2hhbGVBZGRyKSxcbiAgICAgICh4KSA9PiB4LmJhbGFuY2UsXG4gICAgICBNYXRjaGVyLnRvQmUsXG4gICAgICAoKSA9PiBcIjMwMDAwMDAwMDAwMDAwMDAwXCJcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiZ2V0QmFsYW5jZTJcIixcbiAgICAgICgpID0+IHBjaGFpbi5nZXRCYWxhbmNlKHdoYWxlQWRkciksXG4gICAgICAoeCkgPT4geC51dHhvSURzWzBdLnR4SUQsXG4gICAgICBNYXRjaGVyLnRvQmUsXG4gICAgICAoKSA9PiBcIjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExTHBvWVlcIlxuICAgIF0sXG4gICAgW1xuICAgICAgXCJnZXRCbG9ja2NoYWluc0NcIixcbiAgICAgICgpID0+IHBjaGFpbi5nZXRCbG9ja2NoYWlucygpLFxuICAgICAgKHgpID0+IHhbMF0uaWQsXG4gICAgICBNYXRjaGVyLnRvQmUsXG4gICAgICAoKSA9PiBcIkJSMjh5cGdMQVROUzZQYnRITWlKN05RNjF2ZnBUMjdIajh0QWNaMUFIc2ZVNWN6ODhcIlxuICAgIF0sXG4gICAgW1xuICAgICAgXCJnZXRCbG9ja2NoYWluc1hcIixcbiAgICAgICgpID0+IHBjaGFpbi5nZXRCbG9ja2NoYWlucygpLFxuICAgICAgKHgpID0+IHhbMV0uaWQsXG4gICAgICBNYXRjaGVyLnRvQmUsXG4gICAgICAoKSA9PiBcInF6ZkYzQTExS3pwY0hra3F6bkV5UWd1cFFyQ05TNldWNmZUVVR3WnBFS3FoajFRRTdcIlxuICAgIF0sXG4gICAgW1xuICAgICAgXCJnZXRCbG9ja2NoYWluU3RhdHVzXCIsXG4gICAgICAoKSA9PiBwY2hhaW4uZ2V0QmxvY2tjaGFpblN0YXR1cyhhdmFsYW5jaGVCbG9ja0NoYWluSUQpLFxuICAgICAgKHgpID0+IHgsXG4gICAgICBNYXRjaGVyLnRvQmUsXG4gICAgICAoKSA9PiBcIlVua25vd25cIlxuICAgIF0sXG4gICAgW1xuICAgICAgXCJnZXRDdXJyZW50U3VwcGx5XCIsXG4gICAgICAoKSA9PiBwY2hhaW4uZ2V0Q3VycmVudFN1cHBseSgpLFxuICAgICAgKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHgudG9TdHJpbmcoKVxuICAgICAgfSxcbiAgICAgIE1hdGNoZXIudG9CZSxcbiAgICAgICgpID0+IFwiMzYxMTk2MzMzNzUwNzUyMTQ5XCJcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiZ2V0SGVpZ2h0XCIsXG4gICAgICAoKSA9PiBwY2hhaW4uZ2V0SGVpZ2h0KCksXG4gICAgICAoeCkgPT4geC50b1N0cmluZygpLFxuICAgICAgTWF0Y2hlci50b0VxdWFsLFxuICAgICAgKCkgPT4gXCIwXCJcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiZ2V0TWluU3Rha2VcIixcbiAgICAgICgpID0+IHBjaGFpbi5nZXRNaW5TdGFrZSgpLFxuICAgICAgKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHgubWluRGVsZWdhdG9yU3Rha2UudG9TdHJpbmcoKVxuICAgICAgfSxcbiAgICAgIE1hdGNoZXIudG9CZSxcbiAgICAgICgpID0+IFwiMjUwMDAwMDAwMDBcIlxuICAgIF0sXG4gICAgW1xuICAgICAgXCJpbXBvcnRLZXlcIixcbiAgICAgICgpID0+IHBjaGFpbi5pbXBvcnRLZXkodXNlciwgcGFzc3dkLCBrZXkpLFxuICAgICAgKHgpID0+IHgsXG4gICAgICBNYXRjaGVyLnRvQmUsXG4gICAgICAoKSA9PiB3aGFsZUFkZHJcbiAgICBdLFxuXG4gICAgW1xuICAgICAgXCJsaXN0QWRkcnNcIixcbiAgICAgICgpID0+IHBjaGFpbi5saXN0QWRkcmVzc2VzKHVzZXIsIHBhc3N3ZCksXG4gICAgICAoeCkgPT4geC5zb3J0KCksXG4gICAgICBNYXRjaGVyLnRvRXF1YWwsXG4gICAgICAoKSA9PiBbd2hhbGVBZGRyLCBhZGRyQi52YWx1ZSwgYWRkckMudmFsdWVdLnNvcnQoKVxuICAgIF0sXG5cbiAgICBbXG4gICAgICBcImNyZWF0ZVN1Ym5ldFwiLFxuICAgICAgKCkgPT4gcGNoYWluLmNyZWF0ZVN1Ym5ldCh1c2VyLCBwYXNzd2QsIFt3aGFsZUFkZHJdLCAxKSxcbiAgICAgICh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4XG4gICAgICB9LFxuICAgICAgTWF0Y2hlci5HZXQsXG4gICAgICAoKSA9PiBjcmVhdGVkU3VibmV0SURcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiZ2V0Q3VycmVudFZhbGlkYXRvcnNcIixcbiAgICAgICgpID0+IHBjaGFpbi5nZXRDdXJyZW50VmFsaWRhdG9ycygpLFxuICAgICAgKHgpID0+IHgudmFsaWRhdG9ycy5sZW5ndGgsXG4gICAgICBNYXRjaGVyLnRvQmUsXG4gICAgICAoKSA9PiA1XG4gICAgXSxcbiAgICBbXG4gICAgICBcImdldFJld2FyZFVUWE9zXCIsXG4gICAgICAoKSA9PiBwY2hhaW4uZ2V0UmV3YXJkVVRYT3MocmV3YXJkVVRYT1R4SUQpLFxuICAgICAgKHgpID0+IHgudXR4b3MubGVuZ3RoLFxuICAgICAgTWF0Y2hlci50b0JlLFxuICAgICAgKCkgPT4gMFxuICAgIF0sXG4gICAgW1xuICAgICAgXCJnZXRTdGFrZU91dHB1dHNcIixcbiAgICAgICgpID0+IHBjaGFpbi5nZXRTdGFrZShbd2hhbGVBZGRyXSksXG4gICAgICAoeCkgPT4geC5zdGFrZWRPdXRwdXRzLmxlbmd0aCxcbiAgICAgIE1hdGNoZXIudG9CZSxcbiAgICAgICgpID0+IDBcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiZ2V0U3Rha2VcIixcbiAgICAgICgpID0+IHBjaGFpbi5nZXRTdGFrZShbd2hhbGVBZGRyXSksXG4gICAgICAoeCkgPT4geC5zdGFrZWQudG9TdHJpbmcoKSxcbiAgICAgIE1hdGNoZXIudG9CZSxcbiAgICAgICgpID0+IFwiMFwiXG4gICAgXSxcblxuICAgIFtcbiAgICAgIFwiYWRkRGVsZWdhdG9yXCIsXG4gICAgICAoKSA9PlxuICAgICAgICBwY2hhaW4uYWRkRGVsZWdhdG9yKFxuICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgcGFzc3dkLFxuICAgICAgICAgIG5vZGVJRCxcbiAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICBzdGFrZUFtb3VudCxcbiAgICAgICAgICB3aGFsZUFkZHJcbiAgICAgICAgKSxcbiAgICAgICh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4XG4gICAgICB9LFxuICAgICAgTWF0Y2hlci50b1Rocm93LFxuICAgICAgKCkgPT5cbiAgICAgICAgXCJjb3VsZG4ndCB1bm1hcnNoYWwgYW4gYXJndW1lbnQuIEVuc3VyZSBhcmd1bWVudHMgYXJlIHZhbGlkIGFuZCBwcm9wZXJseSBmb3JtYXR0ZWQuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlIGNhbGxzXCJcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiYWRkVmFsaWRhdG9yXCIsXG4gICAgICAoKSA9PlxuICAgICAgICBwY2hhaW4uYWRkVmFsaWRhdG9yKFxuICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgcGFzc3dkLFxuICAgICAgICAgIG5vZGVJRCxcbiAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICBzdGFrZUFtb3VudCxcbiAgICAgICAgICB3aGFsZUFkZHIsXG4gICAgICAgICAgbmV3IEJOKDEwKVxuICAgICAgICApLFxuICAgICAgKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHhcbiAgICAgIH0sXG4gICAgICBNYXRjaGVyLnRvVGhyb3csXG4gICAgICAoKSA9PlxuICAgICAgICBcImNvdWxkbid0IHVubWFyc2hhbCBhbiBhcmd1bWVudC4gRW5zdXJlIGFyZ3VtZW50cyBhcmUgdmFsaWQgYW5kIHByb3Blcmx5IGZvcm1hdHRlZC4gU2VlIGRvY3VtZW50YXRpb24gZm9yIGV4YW1wbGUgY2FsbHNcIlxuICAgIF0sXG4gICAgW1xuICAgICAgXCJleHBvcnRLZXlcIixcbiAgICAgICgpID0+IHBjaGFpbi5leHBvcnRLZXkodXNlciwgcGFzc3dkLCBhZGRyQi52YWx1ZSksXG4gICAgICAoeCkgPT4geCxcbiAgICAgIE1hdGNoZXIudG9NYXRjaCxcbiAgICAgICgpID0+IC9Qcml2YXRlS2V5LVxcdyovXG4gICAgXSxcbiAgICAvLyBbXG4gICAgLy8gICBcImV4cG9ydEFWQVhcIixcbiAgICAvLyAgICgpID0+IHBjaGFpbi5leHBvcnRBVkFYKHVzZXIsIHBhc3N3ZCwgbmV3IEJOKDEwKSwgeENoYWluQWRkciksXG4gICAgLy8gICAoeCkgPT4geCxcbiAgICAvLyAgIE1hdGNoZXIudG9UaHJvdyxcbiAgICAvLyAgICgpID0+XG4gICAgLy8gICAgIFwiZmFpbGVkIHNlbWFudGljVmVyaWZ5U3BlbmQ6IGZhaWxlZCB0byByZWFkIGNvbnN1bWVkIFVUWE8gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFMcG9ZWTowIGR1ZSB0bzogbm90IGZvdW5kXCJcbiAgICAvLyBdLFxuICAgIFtcbiAgICAgIFwiZ2V0VHhcIixcbiAgICAgICgpID0+IHBjaGFpbi5nZXRUeCh0eC52YWx1ZSksXG4gICAgICAoeCkgPT4geCxcbiAgICAgIE1hdGNoZXIudG9UaHJvdyxcbiAgICAgICgpID0+XG4gICAgICAgIFwiY291bGRuJ3QgdW5tYXJzaGFsIGFuIGFyZ3VtZW50LiBFbnN1cmUgYXJndW1lbnRzIGFyZSB2YWxpZCBhbmQgcHJvcGVybHkgZm9ybWF0dGVkLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZSBjYWxsc1wiXG4gICAgXSxcbiAgICBbXG4gICAgICBcImdldFR4U3RhdHVzXCIsXG4gICAgICAoKSA9PlxuICAgICAgICBwY2hhaW4uZ2V0VHhTdGF0dXMoXG4gICAgICAgICAgXCIySnhtc2dTSnhNcmRkUlVzS0N4QWFnZHZheDNzNmtZOXhpaXZ5ekhSTXFGZnVSakZpMlwiXG4gICAgICAgICksXG4gICAgICAoeCkgPT4geCxcbiAgICAgIE1hdGNoZXIudG9FcXVhbCxcbiAgICAgICgpID0+ICh7IHN0YXR1czogXCJVbmtub3duXCIgfSlcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiaW1wb3J0QVZBWFwiLFxuICAgICAgKCkgPT4gcGNoYWluLmltcG9ydEFWQVgodXNlciwgcGFzc3dkLCBhZGRyQi52YWx1ZSwgXCJYXCIpLFxuICAgICAgKHgpID0+IHgsXG4gICAgICBNYXRjaGVyLnRvVGhyb3csXG4gICAgICAoKSA9PiBcIm5vIHNwZW5kYWJsZSBmdW5kcyB3ZXJlIGZvdW5kXCJcbiAgICBdXG4gIF1cblxuICBjcmVhdGVUZXN0cyh0ZXN0c19zcGVjKVxufSkiXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!