PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/avalanche/typings/tests

Просмотр файла: avalanche.test.js

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const jest_mock_axios_1 = __importDefault(require("jest-mock-axios"));
const src_1 = require("../src");
const api_1 = require("../src/apis/avm/api");
const api_2 = require("../src/apis/admin/api");
const api_3 = require("../src/apis/health/api");
const api_4 = require("../src/apis/info/api");
const api_5 = require("../src/apis/keystore/api");
const api_6 = require("../src/apis/metrics/api");
const api_7 = require("../src/apis/platformvm/api");
const testlib_1 = require("./testlib");
describe("Avalanche", () => {
    const blockchainID = "6h2s5de1VC65meajE1L2PjvZ1MXvHc3F6eqPCGKuDt4MxiweF";
    let host = "127.0.0.1";
    const port = 9650;
    const networkID = 1337;
    let protocol = "https";
    let avalanche;
    let avalancheCore;
    const api = "api.avax.network";
    const url = "https://api.avax.network:9650";
    const encrypted = "https";
    const skipinit = true;
    beforeAll(() => {
        avalanche = new src_1.Avalanche(host, port, protocol, networkID, undefined, undefined, undefined, skipinit);
        avalanche.addAPI("admin", api_2.AdminAPI);
        avalanche.addAPI("xchain", api_1.AVMAPI, "/ext/subnet/avm", blockchainID);
        avalanche.addAPI("health", api_3.HealthAPI);
        avalanche.addAPI("info", api_4.InfoAPI);
        avalanche.addAPI("keystore", api_5.KeystoreAPI);
        avalanche.addAPI("metrics", api_6.MetricsAPI);
        avalanche.addAPI("pchain", api_7.PlatformVMAPI);
    });
    test("Remove special characters", () => {
        host = "a&&&&p#i,.@a+v(a)x$.~n%e't:w*o?r<k>";
        protocol = "h@t&@&@t#p+s()$";
        avalanche = new src_1.Avalanche(host, port, protocol, networkID);
        expect(avalanche.getHost()).toBe(api);
        expect(avalanche.getProtocol()).toBe(encrypted);
        expect(avalanche.getURL()).toBe(url);
        avalancheCore = new src_1.AvalancheCore(host, port, protocol);
        expect(avalancheCore.getHost()).toBe(api);
        expect(avalancheCore.getProtocol()).toBe(encrypted);
        expect(avalancheCore.getURL()).toBe(url);
    });
    test("Can specify base endpoint", () => {
        avalanche = new src_1.Avalanche();
        avalanche.setAddress(api, port, encrypted, "rpc");
        avalanche.setNetworkID(networkID);
        expect(avalanche.getHost()).toBe(api);
        expect(avalanche.getProtocol()).toBe(encrypted);
        expect(avalanche.getPort()).toBe(port);
        expect(avalanche.getBaseEndpoint()).toBe("rpc");
        expect(avalanche.getURL()).toBe(`${url}/rpc`);
        expect(avalanche.getNetworkID()).toBe(networkID);
    });
    test("Can initialize without port", () => {
        protocol = encrypted;
        host = api;
        avalanche = new src_1.Avalanche(host, undefined, protocol, networkID);
        expect(avalanche.getPort()).toBe(undefined);
        expect(avalanche.getURL()).toBe(`${protocol}://${api}`);
        avalancheCore = new src_1.AvalancheCore(host, undefined, protocol);
        expect(avalancheCore.getPort()).toBe(undefined);
        expect(avalancheCore.getURL()).toBe(`${protocol}://${api}`);
    });
    test("Can initialize with port", () => {
        protocol = encrypted;
        avalanche = new src_1.Avalanche(host, port, protocol, networkID);
        expect(avalanche.getIP()).toBe(host);
        expect(avalanche.getHost()).toBe(host);
        expect(avalanche.getPort()).toBe(port);
        expect(avalanche.getProtocol()).toBe(protocol);
        expect(avalanche.getURL()).toBe(`${protocol}://${host}:${port}`);
        expect(avalanche.getNetworkID()).toBe(1337);
        expect(avalanche.getHeaders()).toStrictEqual({});
        avalanche.setNetworkID(50);
        expect(avalanche.getNetworkID()).toBe(50);
        avalanche.setNetworkID(12345);
        expect(avalanche.getNetworkID()).toBe(12345);
    });
    test("Endpoints correct", () => {
        expect(avalanche.Admin()).not.toBeInstanceOf(api_1.AVMAPI);
        expect(avalanche.Admin()).toBeInstanceOf(api_2.AdminAPI);
        expect(avalanche.XChain()).not.toBeInstanceOf(api_2.AdminAPI);
        expect(avalanche.XChain()).toBeInstanceOf(api_1.AVMAPI);
        expect(avalanche.Health()).not.toBeInstanceOf(api_5.KeystoreAPI);
        expect(avalanche.Health()).toBeInstanceOf(api_3.HealthAPI);
        expect(avalanche.Info()).not.toBeInstanceOf(api_5.KeystoreAPI);
        expect(avalanche.Info()).toBeInstanceOf(api_4.InfoAPI);
        expect(avalanche.PChain()).not.toBeInstanceOf(api_5.KeystoreAPI);
        expect(avalanche.PChain()).toBeInstanceOf(api_7.PlatformVMAPI);
        expect(avalanche.NodeKeys()).not.toBeInstanceOf(api_7.PlatformVMAPI);
        expect(avalanche.NodeKeys()).toBeInstanceOf(api_5.KeystoreAPI);
        expect(avalanche.Metrics()).not.toBeInstanceOf(api_5.KeystoreAPI);
        expect(avalanche.Metrics()).toBeInstanceOf(api_6.MetricsAPI);
        expect(avalanche.Admin().getRPCID()).toBe(1);
        expect(avalanche.XChain().getRPCID()).toBe(1);
        expect(avalanche.PChain().getRPCID()).toBe(1);
        expect(avalanche.NodeKeys().getRPCID()).toBe(1);
    });
    test("Create new API", () => {
        avalanche.addAPI("avm2", api_1.AVMAPI);
        expect(avalanche.api("avm2")).toBeInstanceOf(api_1.AVMAPI);
        avalanche.addAPI("keystore2", api_5.KeystoreAPI, "/ext/keystore2");
        expect(avalanche.api("keystore2")).toBeInstanceOf(api_5.KeystoreAPI);
        avalanche.api("keystore2").setBaseURL("/ext/keystore3");
        expect(avalanche.api("keystore2").getBaseURL()).toBe("/ext/keystore3");
        expect(avalanche.api("keystore2").getDB()).toHaveProperty("namespace");
    });
    test("Customize headers", () => {
        avalanche.setHeader("X-Custom-Header", "example");
        avalanche.setHeader("X-Foo", "Foo");
        avalanche.setHeader("X-Bar", "Bar");
        expect(avalanche.getHeaders()).toStrictEqual({
            "X-Custom-Header": "example",
            "X-Foo": "Foo",
            "X-Bar": "Bar"
        });
        avalanche.removeHeader("X-Foo");
        expect(avalanche.getHeaders()).toStrictEqual({
            "X-Custom-Header": "example",
            "X-Bar": "Bar"
        });
        avalanche.removeAllHeaders();
        expect(avalanche.getHeaders()).toStrictEqual({});
    });
    test("Customize request config", () => {
        expect(avalanche.getRequestConfig()).toStrictEqual({});
        avalanche.setRequestConfig("withCredentials", true);
        avalanche.setRequestConfig("withFoo", "Foo");
        avalanche.setRequestConfig("withBar", "Bar");
        expect(avalanche.getRequestConfig()).toStrictEqual({
            withCredentials: true,
            withFoo: "Foo",
            withBar: "Bar"
        });
        avalanche.removeRequestConfig("withFoo");
        expect(avalanche.getRequestConfig()).toStrictEqual({
            withCredentials: true,
            withBar: "Bar"
        });
        avalanche.removeAllRequestConfigs();
        expect(avalanche.getRequestConfig()).toStrictEqual({});
    });
});
describe("HTTP Operations", () => {
    const host = "127.0.0.1";
    const port = 8080;
    const protocol = "http";
    const path = "/ext/testingrequests";
    let avalanche;
    beforeAll(() => {
        avalanche = new src_1.Avalanche(host, port, protocol, 12345, undefined, undefined, undefined, true);
        avalanche.addAPI("testingrequests", testlib_1.TestAPI, path);
    });
    afterEach(() => {
        jest_mock_axios_1.default.reset();
    });
    test("GET works", () => __awaiter(void 0, void 0, void 0, function* () {
        const input = "TestGET";
        const api = avalanche.api("testingrequests");
        const result = api.TestGET(input, `/${input}`);
        const payload = {
            result: {
                output: input
            }
        };
        const responseObj = {
            data: payload
        };
        jest_mock_axios_1.default.mockResponse(responseObj);
        const response = yield result;
        expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
        expect(response.output).toBe(input);
    }));
    test("DELETE works", () => __awaiter(void 0, void 0, void 0, function* () {
        const input = "TestDELETE";
        const api = avalanche.api("testingrequests");
        const axiosConfig = {
            baseURL: `${protocol}://${host}:${port}`,
            responseType: "text"
        };
        const result = api.TestDELETE(input, `/${input}`, axiosConfig);
        const payload = {
            result: {
                output: input
            }
        };
        const responseObj = {
            data: payload
        };
        jest_mock_axios_1.default.mockResponse(responseObj);
        const response = yield result;
        expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
        expect(response.output).toBe(input);
    }));
    test("POST works", () => __awaiter(void 0, void 0, void 0, function* () {
        const input = "TestPOST";
        const api = avalanche.api("testingrequests");
        const result = api.TestPOST(input, `/${input}`);
        const payload = {
            result: {
                output: input
            }
        };
        const responseObj = {
            data: payload
        };
        jest_mock_axios_1.default.mockResponse(responseObj);
        const response = yield result;
        expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
        expect(response.output).toBe(input);
    }));
    test("PUT works", () => __awaiter(void 0, void 0, void 0, function* () {
        const input = "TestPUT";
        const api = avalanche.api("testingrequests");
        const result = api.TestPUT(input, `/${input}`);
        const payload = {
            result: {
                output: input
            }
        };
        const responseObj = {
            data: payload
        };
        jest_mock_axios_1.default.mockResponse(responseObj);
        const response = yield result;
        expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
        expect(response.output).toBe(input);
    }));
    test("PATCH works", () => __awaiter(void 0, void 0, void 0, function* () {
        const input = "TestPATCH";
        const api = avalanche.api("testingrequests");
        const result = api.TestPATCH(input, `/${input}`);
        const payload = {
            result: {
                output: input
            }
        };
        const responseObj = {
            data: payload
        };
        jest_mock_axios_1.default.mockResponse(responseObj);
        const response = yield result;
        expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
        expect(response.output).toBe(input);
    }));
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhbGFuY2hlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0cy9hdmFsYW5jaGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLHNFQUF1QztBQUN2QyxnQ0FBaUQ7QUFDakQsNkNBQTRDO0FBQzVDLCtDQUFnRDtBQUNoRCxnREFBa0Q7QUFDbEQsOENBQThDO0FBQzlDLGtEQUFzRDtBQUN0RCxpREFBb0Q7QUFDcEQsb0RBQTBEO0FBQzFELHVDQUFtQztBQUluQyxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQVMsRUFBRTtJQUMvQixNQUFNLFlBQVksR0FDaEIsbURBQW1ELENBQUE7SUFDckQsSUFBSSxJQUFJLEdBQVcsV0FBVyxDQUFBO0lBQzlCLE1BQU0sSUFBSSxHQUFXLElBQUksQ0FBQTtJQUN6QixNQUFNLFNBQVMsR0FBVyxJQUFJLENBQUE7SUFDOUIsSUFBSSxRQUFRLEdBQVcsT0FBTyxDQUFBO0lBQzlCLElBQUksU0FBb0IsQ0FBQTtJQUN4QixJQUFJLGFBQTRCLENBQUE7SUFDaEMsTUFBTSxHQUFHLEdBQVcsa0JBQWtCLENBQUE7SUFDdEMsTUFBTSxHQUFHLEdBQVcsK0JBQStCLENBQUE7SUFDbkQsTUFBTSxTQUFTLEdBQVcsT0FBTyxDQUFBO0lBQ2pDLE1BQU0sUUFBUSxHQUFZLElBQUksQ0FBQTtJQUM5QixTQUFTLENBQUMsR0FBUyxFQUFFO1FBQ25CLFNBQVMsR0FBRyxJQUFJLGVBQVMsQ0FDdkIsSUFBSSxFQUNKLElBQUksRUFDSixRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFFBQVEsQ0FDVCxDQUFBO1FBQ0QsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsY0FBUSxDQUFDLENBQUE7UUFDbkMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsWUFBTSxFQUFFLGlCQUFpQixFQUFFLFlBQVksQ0FBQyxDQUFBO1FB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Q0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vY2tBeGlvcyBmcm9tIFwiamVzdC1tb2NrLWF4aW9zXCJcbmltcG9ydCB7IEF2YWxhbmNoZSwgQXZhbGFuY2hlQ29yZSB9IGZyb20gXCIuLi9zcmNcIlxuaW1wb3J0IHsgQVZNQVBJIH0gZnJvbSBcIi4uL3NyYy9hcGlzL2F2bS9hcGlcIlxuaW1wb3J0IHsgQWRtaW5BUEkgfSBmcm9tIFwiLi4vc3JjL2FwaXMvYWRtaW4vYXBpXCJcbmltcG9ydCB7IEhlYWx0aEFQSSB9IGZyb20gXCIuLi9zcmMvYXBpcy9oZWFsdGgvYXBpXCJcbmltcG9ydCB7IEluZm9BUEkgfSBmcm9tIFwiLi4vc3JjL2FwaXMvaW5mby9hcGlcIlxuaW1wb3J0IHsgS2V5c3RvcmVBUEkgfSBmcm9tIFwiLi4vc3JjL2FwaXMva2V5c3RvcmUvYXBpXCJcbmltcG9ydCB7IE1ldHJpY3NBUEkgfSBmcm9tIFwiLi4vc3JjL2FwaXMvbWV0cmljcy9hcGlcIlxuaW1wb3J0IHsgUGxhdGZvcm1WTUFQSSB9IGZyb20gXCIuLi9zcmMvYXBpcy9wbGF0Zm9ybXZtL2FwaVwiXG5pbXBvcnQgeyBUZXN0QVBJIH0gZnJvbSBcIi4vdGVzdGxpYlwiXG5pbXBvcnQgeyBBeGlvc1JlcXVlc3RDb25maWcgfSBmcm9tIFwiYXhpb3NcIlxuaW1wb3J0IHsgSHR0cFJlc3BvbnNlIH0gZnJvbSBcImplc3QtbW9jay1heGlvcy9kaXN0L2xpYi9tb2NrLWF4aW9zLXR5cGVzXCJcblxuZGVzY3JpYmUoXCJBdmFsYW5jaGVcIiwgKCk6IHZvaWQgPT4ge1xuICBjb25zdCBibG9ja2NoYWluSUQ6IHN0cmluZyA9XG4gICAgXCI2aDJzNWRlMVZDNjVtZWFqRTFMMlBqdloxTVh2SGMzRjZlcVBDR0t1RHQ0TXhpd2VGXCJcbiAgbGV0IGhvc3Q6IHN0cmluZyA9IFwiMTI3LjAuMC4xXCJcbiAgY29uc3QgcG9ydDogbnVtYmVyID0gOTY1MFxuICBjb25zdCBuZXR3b3JrSUQ6IG51bWJlciA9IDEzMzdcbiAgbGV0IHByb3RvY29sOiBzdHJpbmcgPSBcImh0dHBzXCJcbiAgbGV0IGF2YWxhbmNoZTogQXZhbGFuY2hlXG4gIGxldCBhdmFsYW5jaGVDb3JlOiBBdmFsYW5jaGVDb3JlXG4gIGNvbnN0IGFwaTogc3RyaW5nID0gXCJhcGkuYXZheC5uZXR3b3JrXCJcbiAgY29uc3QgdXJsOiBzdHJpbmcgPSBcImh0dHBzOi8vYXBpLmF2YXgubmV0d29yazo5NjUwXCJcbiAgY29uc3QgZW5jcnlwdGVkOiBzdHJpbmcgPSBcImh0dHBzXCJcbiAgY29uc3Qgc2tpcGluaXQ6IGJvb2xlYW4gPSB0cnVlXG4gIGJlZm9yZUFsbCgoKTogdm9pZCA9PiB7XG4gICAgYXZhbGFuY2hlID0gbmV3IEF2YWxhbmNoZShcbiAgICAgIGhvc3QsXG4gICAgICBwb3J0LFxuICAgICAgcHJvdG9jb2wsXG4gICAgICBuZXR3b3JrSUQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBza2lwaW5pdFxuICAgIClcbiAgICBhdmFsYW5jaGUuYWRkQVBJKFwiYWRtaW5cIiwgQWRtaW5BUEkpXG4gICAgYXZhbGFuY2hlLmFkZEFQSShcInhjaGFpblwiLCBBVk1BUEksIFwiL2V4dC9zdWJuZXQvYXZtXCIsIGJsb2NrY2hhaW5JRClcbiAgICBhdmFsYW5jaGUuYWRkQVBJKFwiaGVhbHRoXCIsIEhlYWx0aEFQSSlcbiAgICBhdmFsYW5jaGUuYWRkQVBJKFwiaW5mb1wiLCBJbmZvQVBJKVxuICAgIGF2YWxhbmNoZS5hZGRBUEkoXCJrZXlzdG9yZVwiLCBLZXlzdG9yZUFQSSlcbiAgICBhdmFsYW5jaGUuYWRkQVBJKFwibWV0cmljc1wiLCBNZXRyaWNzQVBJKVxuICAgIGF2YWxhbmNoZS5hZGRBUEkoXCJwY2hhaW5cIiwgUGxhdGZvcm1WTUFQSSlcbiAgfSlcbiAgdGVzdChcIlJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnNcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGhvc3QgPSBcImEmJiYmcCNpLC5AYSt2KGEpeCQufm4lZSd0Oncqbz9yPGs+XCJcbiAgICBwcm90b2NvbCA9IFwiaEB0JkAmQHQjcCtzKCkkXCJcbiAgICBhdmFsYW5jaGUgPSBuZXcgQXZhbGFuY2hlKGhvc3QsIHBvcnQsIHByb3RvY29sLCBuZXR3b3JrSUQpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXRIb3N0KCkpLnRvQmUoYXBpKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuZ2V0UHJvdG9jb2woKSkudG9CZShlbmNyeXB0ZWQpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXRVUkwoKSkudG9CZSh1cmwpXG4gICAgYXZhbGFuY2hlQ29yZSA9IG5ldyBBdmFsYW5jaGVDb3JlKGhvc3QsIHBvcnQsIHByb3RvY29sKVxuICAgIGV4cGVjdChhdmFsYW5jaGVDb3JlLmdldEhvc3QoKSkudG9CZShhcGkpXG4gICAgZXhwZWN0KGF2YWxhbmNoZUNvcmUuZ2V0UHJvdG9jb2woKSkudG9CZShlbmNyeXB0ZWQpXG4gICAgZXhwZWN0KGF2YWxhbmNoZUNvcmUuZ2V0VVJMKCkpLnRvQmUodXJsKVxuICB9KVxuICB0ZXN0KFwiQ2FuIHNwZWNpZnkgYmFzZSBlbmRwb2ludFwiLCAoKTogdm9pZCA9PiB7XG4gICAgYXZhbGFuY2hlID0gbmV3IEF2YWxhbmNoZSgpXG4gICAgYXZhbGFuY2hlLnNldEFkZHJlc3MoYXBpLCBwb3J0LCBlbmNyeXB0ZWQsIFwicnBjXCIpXG4gICAgYXZhbGFuY2hlLnNldE5ldHdvcmtJRChuZXR3b3JrSUQpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXRIb3N0KCkpLnRvQmUoYXBpKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuZ2V0UHJvdG9jb2woKSkudG9CZShlbmNyeXB0ZWQpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXRQb3J0KCkpLnRvQmUocG9ydClcbiAgICBleHBlY3QoYXZhbGFuY2hlLmdldEJhc2VFbmRwb2ludCgpKS50b0JlKFwicnBjXCIpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXRVUkwoKSkudG9CZShgJHt1cmx9L3JwY2ApXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXROZXR3b3JrSUQoKSkudG9CZShuZXR3b3JrSUQpXG4gIH0pXG4gIHRlc3QoXCJDYW4gaW5pdGlhbGl6ZSB3aXRob3V0IHBvcnRcIiwgKCk6IHZvaWQgPT4ge1xuICAgIHByb3RvY29sID0gZW5jcnlwdGVkXG4gICAgaG9zdCA9IGFwaVxuICAgIGF2YWxhbmNoZSA9IG5ldyBBdmFsYW5jaGUoaG9zdCwgdW5kZWZpbmVkLCBwcm90b2NvbCwgbmV0d29ya0lEKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuZ2V0UG9ydCgpKS50b0JlKHVuZGVmaW5lZClcbiAgICBleHBlY3QoYXZhbGFuY2hlLmdldFVSTCgpKS50b0JlKGAke3Byb3RvY29sfTovLyR7YXBpfWApXG4gICAgYXZhbGFuY2hlQ29yZSA9IG5ldyBBdmFsYW5jaGVDb3JlKGhvc3QsIHVuZGVmaW5lZCwgcHJvdG9jb2wpXG4gICAgZXhwZWN0KGF2YWxhbmNoZUNvcmUuZ2V0UG9ydCgpKS50b0JlKHVuZGVmaW5lZClcbiAgICBleHBlY3QoYXZhbGFuY2hlQ29yZS5nZXRVUkwoKSkudG9CZShgJHtwcm90b2NvbH06Ly8ke2FwaX1gKVxuICB9KVxuICB0ZXN0KFwiQ2FuIGluaXRpYWxpemUgd2l0aCBwb3J0XCIsICgpOiB2b2lkID0+IHtcbiAgICBwcm90b2NvbCA9IGVuY3J5cHRlZFxuICAgIGF2YWxhbmNoZSA9IG5ldyBBdmFsYW5jaGUoaG9zdCwgcG9ydCwgcHJvdG9jb2wsIG5ldHdvcmtJRClcbiAgICBleHBlY3QoYXZhbGFuY2hlLmdldElQKCkpLnRvQmUoaG9zdClcbiAgICBleHBlY3QoYXZhbGFuY2hlLmdldEhvc3QoKSkudG9CZShob3N0KVxuICAgIGV4cGVjdChhdmFsYW5jaGUuZ2V0UG9ydCgpKS50b0JlKHBvcnQpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXRQcm90b2NvbCgpKS50b0JlKHByb3RvY29sKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuZ2V0VVJMKCkpLnRvQmUoYCR7cHJvdG9jb2x9Oi8vJHtob3N0fToke3BvcnR9YClcbiAgICBleHBlY3QoYXZhbGFuY2hlLmdldE5ldHdvcmtJRCgpKS50b0JlKDEzMzcpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXRIZWFkZXJzKCkpLnRvU3RyaWN0RXF1YWwoe30pXG4gICAgYXZhbGFuY2hlLnNldE5ldHdvcmtJRCg1MClcbiAgICBleHBlY3QoYXZhbGFuY2hlLmdldE5ldHdvcmtJRCgpKS50b0JlKDUwKVxuICAgIGF2YWxhbmNoZS5zZXROZXR3b3JrSUQoMTIzNDUpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXROZXR3b3JrSUQoKSkudG9CZSgxMjM0NSlcbiAgfSlcblxuICB0ZXN0KFwiRW5kcG9pbnRzIGNvcnJlY3RcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGV4cGVjdChhdmFsYW5jaGUuQWRtaW4oKSkubm90LnRvQmVJbnN0YW5jZU9mKEFWTUFQSSlcbiAgICBleHBlY3QoYXZhbGFuY2hlLkFkbWluKCkpLnRvQmVJbnN0YW5jZU9mKEFkbWluQVBJKVxuXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5YQ2hhaW4oKSkubm90LnRvQmVJbnN0YW5jZU9mKEFkbWluQVBJKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuWENoYWluKCkpLnRvQmVJbnN0YW5jZU9mKEFWTUFQSSlcblxuICAgIGV4cGVjdChhdmFsYW5jaGUuSGVhbHRoKCkpLm5vdC50b0JlSW5zdGFuY2VPZihLZXlzdG9yZUFQSSlcbiAgICBleHBlY3QoYXZhbGFuY2hlLkhlYWx0aCgpKS50b0JlSW5zdGFuY2VPZihIZWFsdGhBUEkpXG5cbiAgICBleHBlY3QoYXZhbGFuY2hlLkluZm8oKSkubm90LnRvQmVJbnN0YW5jZU9mKEtleXN0b3JlQVBJKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuSW5mbygpKS50b0JlSW5zdGFuY2VPZihJbmZvQVBJKVxuXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5QQ2hhaW4oKSkubm90LnRvQmVJbnN0YW5jZU9mKEtleXN0b3JlQVBJKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuUENoYWluKCkpLnRvQmVJbnN0YW5jZU9mKFBsYXRmb3JtVk1BUEkpXG5cbiAgICBleHBlY3QoYXZhbGFuY2hlLk5vZGVLZXlzKCkpLm5vdC50b0JlSW5zdGFuY2VPZihQbGF0Zm9ybVZNQVBJKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuTm9kZUtleXMoKSkudG9CZUluc3RhbmNlT2YoS2V5c3RvcmVBUEkpXG5cbiAgICBleHBlY3QoYXZhbGFuY2hlLk1ldHJpY3MoKSkubm90LnRvQmVJbnN0YW5jZU9mKEtleXN0b3JlQVBJKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuTWV0cmljcygpKS50b0JlSW5zdGFuY2VPZihNZXRyaWNzQVBJKVxuXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5BZG1pbigpLmdldFJQQ0lEKCkpLnRvQmUoMSlcbiAgICBleHBlY3QoYXZhbGFuY2hlLlhDaGFpbigpLmdldFJQQ0lEKCkpLnRvQmUoMSlcbiAgICBleHBlY3QoYXZhbGFuY2hlLlBDaGFpbigpLmdldFJQQ0lEKCkpLnRvQmUoMSlcbiAgICBleHBlY3QoYXZhbGFuY2hlLk5vZGVLZXlzKCkuZ2V0UlBDSUQoKSkudG9CZSgxKVxuICB9KVxuXG4gIHRlc3QoXCJDcmVhdGUgbmV3IEFQSVwiLCAoKTogdm9pZCA9PiB7XG4gICAgYXZhbGFuY2hlLmFkZEFQSShcImF2bTJcIiwgQVZNQVBJKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuYXBpKFwiYXZtMlwiKSkudG9CZUluc3RhbmNlT2YoQVZNQVBJKVxuXG4gICAgYXZhbGFuY2hlLmFkZEFQSShcImtleXN0b3JlMlwiLCBLZXlzdG9yZUFQSSwgXCIvZXh0L2tleXN0b3JlMlwiKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuYXBpKFwia2V5c3RvcmUyXCIpKS50b0JlSW5zdGFuY2VPZihLZXlzdG9yZUFQSSlcblxuICAgIGF2YWxhbmNoZS5hcGkoXCJrZXlzdG9yZTJcIikuc2V0QmFzZVVSTChcIi9leHQva2V5c3RvcmUzXCIpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5hcGkoXCJrZXlzdG9yZTJcIikuZ2V0QmFzZVVSTCgpKS50b0JlKFwiL2V4dC9rZXlzdG9yZTNcIilcblxuICAgIGV4cGVjdChhdmFsYW5jaGUuYXBpKFwia2V5c3RvcmUyXCIpLmdldERCKCkpLnRvSGF2ZVByb3BlcnR5KFwibmFtZXNwYWNlXCIpXG4gIH0pXG5cbiAgdGVzdChcIkN1c3RvbWl6ZSBoZWFkZXJzXCIsICgpOiB2b2lkID0+IHtcbiAgICBhdmFsYW5jaGUuc2V0SGVhZGVyKFwiWC1DdXN0b20tSGVhZGVyXCIsIFwiZXhhbXBsZVwiKVxuICAgIGF2YWxhbmNoZS5zZXRIZWFkZXIoXCJYLUZvb1wiLCBcIkZvb1wiKVxuICAgIGF2YWxhbmNoZS5zZXRIZWFkZXIoXCJYLUJhclwiLCBcIkJhclwiKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuZ2V0SGVhZGVycygpKS50b1N0cmljdEVxdWFsKHtcbiAgICAgIFwiWC1DdXN0b20tSGVhZGVyXCI6IFwiZXhhbXBsZVwiLFxuICAgICAgXCJYLUZvb1wiOiBcIkZvb1wiLFxuICAgICAgXCJYLUJhclwiOiBcIkJhclwiXG4gICAgfSlcbiAgICBhdmFsYW5jaGUucmVtb3ZlSGVhZGVyKFwiWC1Gb29cIilcbiAgICBleHBlY3QoYXZhbGFuY2hlLmdldEhlYWRlcnMoKSkudG9TdHJpY3RFcXVhbCh7XG4gICAgICBcIlgtQ3VzdG9tLUhlYWRlclwiOiBcImV4YW1wbGVcIixcbiAgICAgIFwiWC1CYXJcIjogXCJCYXJcIlxuICAgIH0pXG4gICAgYXZhbGFuY2hlLnJlbW92ZUFsbEhlYWRlcnMoKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuZ2V0SGVhZGVycygpKS50b1N0cmljdEVxdWFsKHt9KVxuICB9KVxuXG4gIHRlc3QoXCJDdXN0b21pemUgcmVxdWVzdCBjb25maWdcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGV4cGVjdChhdmFsYW5jaGUuZ2V0UmVxdWVzdENvbmZpZygpKS50b1N0cmljdEVxdWFsKHt9KVxuICAgIGF2YWxhbmNoZS5zZXRSZXF1ZXN0Q29uZmlnKFwid2l0aENyZWRlbnRpYWxzXCIsIHRydWUpXG4gICAgYXZhbGFuY2hlLnNldFJlcXVlc3RDb25maWcoXCJ3aXRoRm9vXCIsIFwiRm9vXCIpXG4gICAgYXZhbGFuY2hlLnNldFJlcXVlc3RDb25maWcoXCJ3aXRoQmFyXCIsIFwiQmFyXCIpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXRSZXF1ZXN0Q29uZmlnKCkpLnRvU3RyaWN0RXF1YWwoe1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgd2l0aEZvbzogXCJGb29cIixcbiAgICAgIHdpdGhCYXI6IFwiQmFyXCJcbiAgICB9KVxuICAgIGF2YWxhbmNoZS5yZW1vdmVSZXF1ZXN0Q29uZmlnKFwid2l0aEZvb1wiKVxuICAgIGV4cGVjdChhdmFsYW5jaGUuZ2V0UmVxdWVzdENvbmZpZygpKS50b1N0cmljdEVxdWFsKHtcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIHdpdGhCYXI6IFwiQmFyXCJcbiAgICB9KVxuICAgIGF2YWxhbmNoZS5yZW1vdmVBbGxSZXF1ZXN0Q29uZmlncygpXG4gICAgZXhwZWN0KGF2YWxhbmNoZS5nZXRSZXF1ZXN0Q29uZmlnKCkpLnRvU3RyaWN0RXF1YWwoe30pXG4gIH0pXG59KVxuXG5kZXNjcmliZShcIkhUVFAgT3BlcmF0aW9uc1wiLCAoKTogdm9pZCA9PiB7XG4gIGNvbnN0IGhvc3Q6IHN0cmluZyA9IFwiMTI3LjAuMC4xXCJcbiAgY29uc3QgcG9ydDogbnVtYmVyID0gODA4MFxuICBjb25zdCBwcm90b2NvbDogc3RyaW5nID0gXCJodHRwXCJcbiAgY29uc3QgcGF0aDogc3RyaW5nID0gXCIvZXh0L3Rlc3RpbmdyZXF1ZXN0c1wiXG4gIGxldCBhdmFsYW5jaGU6IEF2YWxhbmNoZVxuICBiZWZvcmVBbGwoKCk6IHZvaWQgPT4ge1xuICAgIGF2YWxhbmNoZSA9IG5ldyBBdmFsYW5jaGUoXG4gICAgICBob3N0LFxuICAgICAgcG9ydCxcbiAgICAgIHByb3RvY29sLFxuICAgICAgMTIzNDUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0cnVlXG4gICAgKVxuICAgIGF2YWxhbmNoZS5hZGRBUEkoXCJ0ZXN0aW5ncmVxdWVzdHNcIiwgVGVzdEFQSSwgcGF0aClcbiAgfSlcblxuICBhZnRlckVhY2goKCk6IHZvaWQgPT4ge1xuICAgIG1vY2tBeGlvcy5yZXNldCgpXG4gIH0pXG5cbiAgdGVzdChcIkdFVCB3b3Jrc1wiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgaW5wdXQ6IHN0cmluZyA9IFwiVGVzdEdFVFwiXG4gICAgY29uc3QgYXBpOiBUZXN0QVBJID0gYXZhbGFuY2hlLmFwaShcInRlc3RpbmdyZXF1ZXN0c1wiKVxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxvYmplY3Q+ID0gYXBpLlRlc3RHRVQoaW5wdXQsIGAvJHtpbnB1dH1gKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBvdXRwdXQ6IGlucHV0XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuICAgIG1vY2tBeGlvcy5tb2NrUmVzcG9uc2UocmVzcG9uc2VPYmopXG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHJlc3VsdFxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlLm91dHB1dCkudG9CZShpbnB1dClcbiAgfSlcblxuICB0ZXN0KFwiREVMRVRFIHdvcmtzXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBpbnB1dDogc3RyaW5nID0gXCJUZXN0REVMRVRFXCJcbiAgICBjb25zdCBhcGk6IFRlc3RBUEkgPSBhdmFsYW5jaGUuYXBpKFwidGVzdGluZ3JlcXVlc3RzXCIpXG4gICAgY29uc3QgYXhpb3NDb25maWc6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJhc2VVUkw6IGAke3Byb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fWAsXG4gICAgICByZXNwb25zZVR5cGU6IFwidGV4dFwiXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxvYmplY3Q+ID0gYXBpLlRlc3RERUxFVEUoXG4gICAgICBpbnB1dCxcbiAgICAgIGAvJHtpbnB1dH1gLFxuICAgICAgYXhpb3NDb25maWdcbiAgICApXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIG91dHB1dDogaW5wdXRcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgcmVzdWx0XG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2Uub3V0cHV0KS50b0JlKGlucHV0KVxuICB9KVxuXG4gIHRlc3QoXCJQT1NUIHdvcmtzXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBpbnB1dDogc3RyaW5nID0gXCJUZXN0UE9TVFwiXG4gICAgY29uc3QgYXBpOiBUZXN0QVBJID0gYXZhbGFuY2hlLmFwaShcInRlc3RpbmdyZXF1ZXN0c1wiKVxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxvYmplY3Q+ID0gYXBpLlRlc3RQT1NUKGlucHV0LCBgLyR7aW5wdXR9YClcbiAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgb3V0cHV0OiBpbnB1dFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgZGF0YTogcGF5bG9hZFxuICAgIH1cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSBhd2FpdCByZXN1bHRcbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZS5vdXRwdXQpLnRvQmUoaW5wdXQpXG4gIH0pXG5cbiAgdGVzdChcIlBVVCB3b3Jrc1wiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgaW5wdXQ6IHN0cmluZyA9IFwiVGVzdFBVVFwiXG4gICAgY29uc3QgYXBpOiBUZXN0QVBJID0gYXZhbGFuY2hlLmFwaShcInRlc3RpbmdyZXF1ZXN0c1wiKVxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxvYmplY3Q+ID0gYXBpLlRlc3RQVVQoaW5wdXQsIGAvJHtpbnB1dH1gKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBvdXRwdXQ6IGlucHV0XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuICAgIG1vY2tBeGlvcy5tb2NrUmVzcG9uc2UocmVzcG9uc2VPYmopXG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHJlc3VsdFxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlLm91dHB1dCkudG9CZShpbnB1dClcbiAgfSlcblxuICB0ZXN0KFwiUEFUQ0ggd29ya3NcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGlucHV0OiBzdHJpbmcgPSBcIlRlc3RQQVRDSFwiXG4gICAgY29uc3QgYXBpOiBUZXN0QVBJID0gYXZhbGFuY2hlLmFwaShcInRlc3RpbmdyZXF1ZXN0c1wiKVxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxvYmplY3Q+ID0gYXBpLlRlc3RQQVRDSChpbnB1dCwgYC8ke2lucHV0fWApXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIG91dHB1dDogaW5wdXRcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgcmVzdWx0XG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2Uub3V0cHV0KS50b0JlKGlucHV0KVxuICB9KVxufSlcbiJdfQ==

Выполнить команду


Для локальной разработки. Не используйте в интернете!