PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/avalanche/typings/tests/apis/avm
Просмотр файла: keychain.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 keychain_1 = require("../../../src/apis/avm/keychain");
const index_1 = require("../../../src/index");
const buffer_1 = require("buffer/");
const create_hash_1 = __importDefault(require("create-hash"));
const bintools_1 = __importDefault(require("../../../src/utils/bintools"));
const bintools = bintools_1.default.getInstance();
const alias = "X";
const hrp = "tests";
describe("AVMKeyPair", () => {
const networkID = 1337;
const ip = "127.0.0.1";
const port = 9650;
const protocol = "https";
const avalanche = new index_1.Avalanche(ip, port, protocol, networkID, undefined, undefined, undefined, true);
test("human readable part", () => {
let hrp = avalanche.getHRP();
let networkID = avalanche.getNetworkID();
expect(hrp).toBe("custom");
expect(networkID).toBe(1337);
avalanche.setNetworkID(2);
hrp = avalanche.getHRP();
networkID = avalanche.getNetworkID();
expect(hrp).toBe("cascade");
expect(networkID).toBe(2);
avalanche.setNetworkID(3);
hrp = avalanche.getHRP();
networkID = avalanche.getNetworkID();
expect(hrp).toBe("denali");
expect(networkID).toBe(3);
avalanche.setNetworkID(4);
hrp = avalanche.getHRP();
networkID = avalanche.getNetworkID();
expect(hrp).toBe("everest");
expect(networkID).toBe(4);
avalanche.setNetworkID(0);
hrp = avalanche.getHRP();
networkID = avalanche.getNetworkID();
expect(hrp).toBe("custom");
expect(networkID).toBe(0);
avalanche.setNetworkID(1);
hrp = avalanche.getHRP();
networkID = avalanche.getNetworkID();
expect(hrp).toBe("avax");
expect(networkID).toBe(1);
avalanche.setNetworkID(12345);
hrp = avalanche.getHRP();
networkID = avalanche.getNetworkID();
expect(hrp).toBe("local");
expect(networkID).toBe(12345);
});
test("repeatable 1", () => {
const kp = new keychain_1.KeyPair(hrp, alias);
kp.importKey(buffer_1.Buffer.from("ef9bf2d4436491c153967c9709dd8e82795bdb9b5ad44ee22c2903005d1cf676", "hex"));
expect(kp.getPublicKey().toString("hex")).toBe("033fad3644deb20d7a210d12757092312451c112d04773cee2699fbb59dc8bb2ef");
const msg = buffer_1.Buffer.from((0, create_hash_1.default)("sha256").update(buffer_1.Buffer.from("09090909", "hex")).digest("hex"), "hex");
const sig = kp.sign(msg);
expect(sig.length).toBe(65);
expect(kp.verify(msg, sig)).toBe(true);
expect(kp.recover(msg, sig).toString("hex")).toBe(kp.getPublicKey().toString("hex"));
});
test("bad private key", () => {
const kp = new keychain_1.KeyPair("badnetworkid", alias);
const badPrivateKey = "safasaf";
const result = kp.importKey(buffer_1.Buffer.from(badPrivateKey, "hex"));
expect(result).toBe(false);
});
test("repeatable 2", () => {
const kp = new keychain_1.KeyPair(hrp, alias);
kp.importKey(buffer_1.Buffer.from("17c692d4a99d12f629d9f0ff92ec0dba15c9a83e85487b085c1a3018286995c6", "hex"));
expect(kp.getPublicKey().toString("hex")).toBe("02486553b276cfe7abf0efbcd8d173e55db9c03da020c33d0b219df24124da18ee");
const msg = buffer_1.Buffer.from((0, create_hash_1.default)("sha256").update(buffer_1.Buffer.from("09090909", "hex")).digest("hex"), "hex");
const sig = kp.sign(msg);
expect(sig.length).toBe(65);
expect(kp.verify(msg, sig)).toBe(true);
expect(kp.recover(msg, sig).toString("hex")).toBe(kp.getPublicKey().toString("hex"));
});
test("repeatable 3", () => {
const kp = new keychain_1.KeyPair(hrp, alias);
kp.importKey(buffer_1.Buffer.from("d0e17d4b31380f96a42b3e9ffc4c1b2a93589a1e51d86d7edc107f602fbc7475", "hex"));
expect(kp.getPublicKey().toString("hex")).toBe("031475b91d4fcf52979f1cf107f058088cc2bea6edd51915790f27185a7586e2f2");
const msg = buffer_1.Buffer.from((0, create_hash_1.default)("sha256").update(buffer_1.Buffer.from("09090909", "hex")).digest("hex"), "hex");
const sig = kp.sign(msg);
expect(sig.length).toBe(65);
expect(kp.verify(msg, sig)).toBe(true);
expect(kp.recover(msg, sig).toString("hex")).toBe(kp.getPublicKey().toString("hex"));
});
test("Creation Empty", () => {
const kp = new keychain_1.KeyPair(hrp, alias);
expect(kp.getPrivateKey()).not.toBeUndefined();
expect(kp.getAddress()).not.toBeUndefined();
expect(kp.getPrivateKeyString()).not.toBeUndefined();
expect(kp.getPublicKey()).not.toBeUndefined();
expect(kp.getPublicKeyString()).not.toBeUndefined();
const msg = buffer_1.Buffer.from((0, create_hash_1.default)("sha256").update(buffer_1.Buffer.from("09090909", "hex")).digest("hex"), "hex");
const sig = kp.sign(msg);
expect(sig.length).toBe(65);
expect(kp.verify(msg, sig)).toBe(true);
expect(kp.recover(msg, sig).toString("hex")).toBe(kp.getPublicKey().toString("hex"));
});
});
describe("AVMKeyChain", () => {
test("importKey from Buffer", () => {
const keybuff = buffer_1.Buffer.from("d0e17d4b31380f96a42b3e9ffc4c1b2a93589a1e51d86d7edc107f602fbc7475", "hex");
const kc = new keychain_1.KeyChain(hrp, alias);
const kp2 = new keychain_1.KeyPair(hrp, alias);
const addr1 = kc.importKey(keybuff).getAddress();
const kp1 = kc.getKey(addr1);
kp2.importKey(keybuff);
const addr2 = kp1.getAddress();
expect(addr1.toString("hex")).toBe(addr2.toString("hex"));
expect(kp1.getPrivateKeyString()).toBe(kp2.getPrivateKeyString());
expect(kp1.getPublicKeyString()).toBe(kp2.getPublicKeyString());
expect(kc.hasKey(addr1)).toBe(true);
});
test("importKey from Buffer with leading zeros", () => {
const keybuff = buffer_1.Buffer.from("00007d4b31380f96a42b3e9ffc4c1b2a93589a1e51d86d7edc107f602fbc7475", "hex");
expect(keybuff.length).toBe(32);
const kc = new keychain_1.KeyChain(hrp, alias);
const kp2 = new keychain_1.KeyPair(hrp, alias);
const addr1 = kc.importKey(keybuff).getAddress();
const kp1 = kc.getKey(addr1);
kp2.importKey(keybuff);
const addr2 = kp1.getAddress();
expect(addr1.toString("hex")).toBe(addr2.toString("hex"));
expect(kp1.getPrivateKeyString()).toBe(kp2.getPrivateKeyString());
expect(kp1.getPrivateKey().length).toBe(32);
expect(kp2.getPrivateKey().length).toBe(32);
expect(kp1.getPublicKeyString()).toBe(kp2.getPublicKeyString());
expect(kp1.getPublicKey().length).toBe(33);
expect(kp2.getPublicKey().length).toBe(33);
expect(kc.hasKey(addr1)).toBe(true);
});
test("importKey from serialized string", () => {
const keybuff = buffer_1.Buffer.from("d0e17d4b31380f96a42b3e9ffc4c1b2a93589a1e51d86d7edc107f602fbc7475", "hex");
const kc = new keychain_1.KeyChain(hrp, alias);
const kp2 = new keychain_1.KeyPair(hrp, alias);
const addr1 = kc
.importKey("PrivateKey-" + bintools.cb58Encode(keybuff))
.getAddress();
const kp1 = kc.getKey(addr1);
kp2.importKey(keybuff);
const addr2 = kp1.getAddress();
expect(addr1.toString("hex")).toBe(addr2.toString("hex"));
expect(kp1.getPrivateKeyString()).toBe(kp2.getPrivateKeyString());
expect(kp1.getPublicKeyString()).toBe(kp2.getPublicKeyString());
expect(kc.hasKey(addr1)).toBe(true);
});
test("removeKey via keypair", () => {
const keybuff = buffer_1.Buffer.from("d0e17d4b31380f96a42b3e9ffc4c1b2a93589a1e51d86d7edc107f602fbc7475", "hex");
const kc = new keychain_1.KeyChain(hrp, alias);
const kp1 = new keychain_1.KeyPair(hrp, alias);
const addr1 = kc.importKey(keybuff).getAddress();
kp1.importKey(keybuff);
expect(kc.hasKey(addr1)).toBe(true);
kc.removeKey(kp1);
expect(kc.hasKey(addr1)).toBe(false);
});
test("removeKey via string", () => {
const keybuff = buffer_1.Buffer.from("d0e17d4b31380f96a42b3e9ffc4c1b2a93589a1e51d86d7edc107f602fbc7475", "hex");
const kc = new keychain_1.KeyChain(hrp, alias);
const addr1 = kc.importKey(keybuff).getAddress();
expect(kc.hasKey(addr1)).toBe(true);
kc.removeKey(addr1);
expect(kc.hasKey(addr1)).toBe(false);
});
test("removeKey bad keys", () => {
const keybuff = buffer_1.Buffer.from("d0e17d4b31380f96a42b3e9ffc4c1b2a93589a1e51d86d7edc107f602fbc7475", "hex");
const kc = new keychain_1.KeyChain(hrp, alias);
const addr1 = kc.importKey(keybuff).getAddress();
expect(kc.hasKey(addr1)).toBe(true);
expect(kc.removeKey(bintools.cb58Decode("6Y3kysjF9jnHnYkdS9yGAuoHyae2eNmeV"))).toBe(false);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW4udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3RzL2FwaXMvYXZtL2tleWNoYWluLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2REFBa0U7QUFDbEUsOENBQThDO0FBQzlDLG9DQUFnQztBQUNoQyw4REFBb0M7QUFDcEMsMkVBQWtEO0FBRWxELE1BQU0sUUFBUSxHQUFhLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7QUFDakQsTUFBTSxLQUFLLEdBQVcsR0FBRyxDQUFBO0FBQ3pCLE1BQU0sR0FBRyxHQUFXLE9BQU8sQ0FBQTtBQUUzQixRQUFRLENBQUMsWUFBWSxFQUFFLEdBQVMsRUFBRTtJQUNoQyxNQUFNLFNBQVMsR0FBVyxJQUFJLENBQUE7SUFDOUIsTUFBTSxFQUFFLEdBQVcsV0FBVyxDQUFBO0lBQzlCLE1BQU0sSUFBSSxHQUFXLElBQUksQ0FBQTtJQUN6QixNQUFNLFFBQVEsR0FBVyxPQUFPLENBQUE7SUFDaEMsTUFBTSxTQUFTLEdBQWMsSUFBSSxpQkFBUyxDQUN4QyxFQUFFLEVBQ0YsSUFBSSxFQUNKLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsSUFBSSxDQUNMLENBQUE7SUFFRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBUyxFQUFFO1FBQ3JDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUVwQyxJQUFJLFNBQVMsR0FBVyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDaEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMxQixNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRTVCLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDekIsR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ3BDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDM0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUV6QixTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3pCLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDeEIsU0FBUyxHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFCLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFekIsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN6QixHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ3hCLFNBQVMsR0FBRyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMzQixNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXpCLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDekIsR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ3BDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUV6QixTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3pCLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDeEIsU0FBUyxHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3hCLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFekIsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM3QixHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ3hCLFNBQVMsR0FBRyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN6QixNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQy9CLENBQUMsQ0FBQyxDQUFBO0lBRUYsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFTLEVBQUU7UUFDOUIsTUFBTSxFQUFFLEdBQVksSUFBSSxrQkFBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUMzQyxFQUFFLENBQUMsU0FBUyxDQUNWLGVBQU0sQ0FBQyxJQUFJLENBQ1Qsa0VBQWtFLEVBQ2xFLEtBQUssQ0FDTixDQUNGLENBQUE7UUFDRCxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDNUMsb0VBQW9FLENBQ3JFLENBQUE7UUFFRCxNQUFNLEdBQUcsR0FBVyxlQUFNLENBQUMsSUFBSSxDQUM3QixJQUFBLHFCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUN6RSxLQUFLLENBQ04sQ0FBQTtRQUNELE1BQU0sR0FBRyxHQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDM0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3RDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQy9DLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ2xDLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFTLEVBQUU7UUFDakMsTUFBTSxFQUFFLEdBQVksSUFBSSxrQkFBTyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN0RCxNQUFNLGFBQWEsR0FBVyxTQUFTLENBQUE7UUFDdkMsTUFBTSxNQUFNLEdBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxlQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUIsQ0FBQyxDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsY0FBYyxFQUFFLEdBQVMsRUFBRTtRQUM5QixNQUFNLEVBQUUsR0FBWSxJQUFJLGtCQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzNDLEVBQUUsQ0FBQyxTQUFTLENBQ1YsZUFBTSxDQUFDLElBQUksQ0FDVCxrRUFBa0UsRUFDbEUsS0FBSyxDQUNOLENBQ0YsQ0FBQTtRQUNELE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM1QyxvRUFBb0UsQ0FDckUsQ0FBQTtRQUVELE1BQU0sR0FBRyxHQUFXLGVBQU0sQ0FBQyxJQUFJLENBQzdCLElBQUEscUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQ3pFLEtBQUssQ0FDTixDQUFBO1FBQ0QsTUFBTSxHQUFHLEdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUVoQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdEMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDL0MsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDbEMsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFTLEVBQUU7UUFDOUIsTUFBTSxFQUFFLEdBQVksSUFBSSxrQkFBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUMzQyxFQUFFLENBQUMsU0FBUyxDQUNWLGVBQU0sQ0FBQyxJQUFJLENBQ1Qsa0VBQWtFLEVBQ2xFLEtBQUssQ0FDTixDQUNGLENBQUE7UUFDRCxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDNUMsb0VBQW9FLENBQ3JFLENBQUE7UUFFRCxNQUFNLEdBQUcsR0FBVyxlQUFNLENBQUMsSUFBSSxDQUM3QixJQUFBLHFCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUN6RSxLQUFLLENBQ04sQ0FBQTtRQUNELE1BQU0sR0FBRyxHQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDM0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3RDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQy9DLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ2xDLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFTLEVBQUU7UUFDaEMsTUFBTSxFQUFFLEdBQVksSUFBSSxrQkFBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUMzQyxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQzlDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDM0MsTUFBTSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3BELE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDN0MsTUFBTSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ25ELE1BQU0sR0FBRyxHQUFXLGVBQU0sQ0FBQyxJQUFJLENBQzdCLElBQUEscUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQ3pFLEtBQUssQ0FDTixDQUFBO1FBQ0QsTUFBTSxHQUFHLEdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUVoQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdEMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDL0MsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDbEMsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUE7QUFFRixRQUFRLENBQUMsYUFBYSxFQUFFLEdBQVMsRUFBRTtJQUNqQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsR0FBUyxFQUFFO1FBQ3ZDLE1BQU0sT0FBTyxHQUFXLGVBQU0sQ0FBQyxJQUFJLENBQ2pDLGtFQUFrRSxFQUNsRSxLQUFLLENBQ04sQ0FBQTtRQUNELE1BQU0sRUFBRSxHQUFhLElBQUksbUJBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDN0MsTUFBTSxHQUFHLEdBQVksSUFBSSxrQkFBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM1QyxNQUFNLEtBQUssR0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3hELE1BQU0sR0FBRyxHQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDckMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN0QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3pELE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFBO1FBQ2pFLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFBO1FBQy9ELE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxDQUFBO0lBRUYsSUFBSSxDQUFDLDBDQUEwQyxFQUFFLEdBQVMsRUFBRTtRQUMxRCxNQUFNLE9BQU8sR0FBVyxlQUFNLENBQUMsSUFBSSxDQUNqQyxrRUFBa0UsRUFDbEUsS0FBSyxDQUNOLENBQUE7UUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMvQixNQUFNLEVBQUUsR0FBYSxJQUFJLG1CQUFRLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzdDLE1BQU0sR0FBRyxHQUFZLElBQUksa0JBQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDNUMsTUFBTSxLQUFLLEdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUN4RCxNQUFNLEdBQUcsR0FBWSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdEIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUN6RCxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQTtRQUNqRSxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMzQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMzQyxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQTtRQUMvRCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMxQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNyQyxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxHQUFTLEVBQUU7UUFDbEQsTUFBTSxPQUFPLEdBQVcsZUFBTSxDQUFDLElBQUksQ0FDakMsa0VBQWtFLEVBQ2xFLEtBQUssQ0FDTixDQUFBO1FBQ0QsTUFBTSxFQUFFLEdBQWEsSUFBSSxtQkFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM3QyxNQUFNLEdBQUcsR0FBWSxJQUFJLGtCQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzVDLE1BQU0sS0FBSyxHQUFXLEVBQUU7YUFDckIsU0FBUyxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3ZELFVBQVUsRUFBRSxDQUFBO1FBQ2YsTUFBTSxHQUFHLEdBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDekQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUE7UUFDakUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUE7UUFDL0QsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsdUJBQXVCLEVBQUUsR0FBUyxFQUFFO1FBQ3ZDLE1BQU0sT0FBTyxHQUFXLGVBQU0sQ0FBQyxJQUFJLENBQ2pDLGtFQUFrRSxFQUNsRSxLQUFLLENBQ04sQ0FBQTtRQUNELE1BQU0sRUFBRSxHQUFhLElBQUksbUJBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDN0MsTUFBTSxHQUFHLEdBQVksSUFBSSxrQkFBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM1QyxNQUFNLEtBQUssR0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3hELEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbkMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNqQixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN0QyxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxHQUFTLEVBQUU7UUFDdEMsTUFBTSxPQUFPLEdBQVcsZUFBTSxDQUFDLElBQUksQ0FDakMsa0VBQWtFLEVBQ2xFLEtBQUssQ0FDTixDQUFBO1FBQ0QsTUFBTSxFQUFFLEdBQWEsSUFBSSxtQkFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM3QyxNQUFNLEtBQUssR0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3hELE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ25DLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdEMsQ0FBQyxDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsR0FBUyxFQUFFO1FBQ3BDLE1BQU0sT0FBTyxHQUFXLGVBQU0sQ0FBQyxJQUFJLENBQ2pDLGtFQUFrRSxFQUNsRSxLQUFLLENBQ04sQ0FBQTtRQUNELE1BQU0sRUFBRSxHQUFhLElBQUksbUJBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDN0MsTUFBTSxLQUFLLEdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUN4RCxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuQyxNQUFNLENBQ0osRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FDdkUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDZixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5Q2hhaW4sIEtleVBhaXIgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvYXZtL2tleWNoYWluXCJcbmltcG9ydCB7IEF2YWxhbmNoZSB9IGZyb20gXCIuLi8uLi8uLi9zcmMvaW5kZXhcIlxuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlci9cIlxuaW1wb3J0IGNyZWF0ZUhhc2ggZnJvbSBcImNyZWF0ZS1oYXNoXCJcbmltcG9ydCBCaW5Ub29scyBmcm9tIFwiLi4vLi4vLi4vc3JjL3V0aWxzL2JpbnRvb2xzXCJcblxuY29uc3QgYmludG9vbHM6IEJpblRvb2xzID0gQmluVG9vbHMuZ2V0SW5zdGFuY2UoKVxuY29uc3QgYWxpYXM6IHN0cmluZyA9IFwiWFwiXG5jb25zdCBocnA6IHN0cmluZyA9IFwidGVzdHNcIlxuXG5kZXNjcmliZShcIkFWTUtleVBhaXJcIiwgKCk6IHZvaWQgPT4ge1xuICBjb25zdCBuZXR3b3JrSUQ6IG51bWJlciA9IDEzMzdcbiAgY29uc3QgaXA6IHN0cmluZyA9IFwiMTI3LjAuMC4xXCJcbiAgY29uc3QgcG9ydDogbnVtYmVyID0gOTY1MFxuICBjb25zdCBwcm90b2NvbDogc3RyaW5nID0gXCJodHRwc1wiXG4gIGNvbnN0IGF2YWxhbmNoZTogQXZhbGFuY2hlID0gbmV3IEF2YWxhbmNoZShcbiAgICBpcCxcbiAgICBwb3J0LFxuICAgIHByb3RvY29sLFxuICAgIG5ldHdvcmtJRCxcbiAgICB1bmRlZmluZWQsXG4gICAgdW5kZWZpbmVkLFxuICAgIHVuZGVmaW5lZCxcbiAgICB0cnVlXG4gIClcblxuICB0ZXN0KFwiaHVtYW4gcmVhZGFibGUgcGFydFwiLCAoKTogdm9pZCA9PiB7XG4gICAgbGV0IGhycDogc3RyaW5nID0gYXZhbGFuY2hlLmdldEhSUCgpXG5cbiAgICBsZXQgbmV0d29ya0lEOiBudW1iZXIgPSBhdmFsYW5jaGUuZ2V0TmV0d29ya0lEKClcbiAgICBleHBlY3QoaHJwKS50b0JlKFwiY3VzdG9tXCIpXG4gICAgZXhwZWN0KG5ldHdvcmtJRCkudG9CZSgxMzM3KVxuXG4gICAgYXZhbGFuY2hlLnNldE5ldHdvcmtJRCgyKVxuICAgIGhycCA9IGF2YWxhbmNoZS5nZXRIUlAoKVxuICAgIG5ldHdvcmtJRCA9IGF2YWxhbmNoZS5nZXROZXR3b3JrSUQoKVxuICAgIGV4cGVjdChocnApLnRvQmUoXCJjYXNjYWRlXCIpXG4gICAgZXhwZWN0KG5ldHdvcmtJRCkudG9CZSgyKVxuXG4gICAgYXZhbGFuY2hlLnNldE5ldHdvcmtJRCgzKVxuICAgIGhycCA9IGF2YWxhbmNoZS5nZXRIUlAoKVxuICAgIG5ldHdvcmtJRCA9IGF2YWxhbmNoZS5nZXROZXR3b3JrSUQoKVxuICAgIGV4cGVjdChocnApLnRvQmUoXCJkZW5hbGlcIilcbiAgICBleHBlY3QobmV0d29ya0lEKS50b0JlKDMpXG5cbiAgICBhdmFsYW5jaGUuc2V0TmV0d29ya0lEKDQpXG4gICAgaHJwID0gYXZhbGFuY2hlLmdldEhSUCgpXG4gICAgbmV0d29ya0lEID0gYXZhbGFuY2hlLmdldE5ldHdvcmtJRCgpXG4gICAgZXhwZWN0KGhycCkudG9CZShcImV2ZXJlc3RcIilcbiAgICBleHBlY3QobmV0d29ya0lEKS50b0JlKDQpXG5cbiAgICBhdmFsYW5jaGUuc2V0TmV0d29ya0lEKDApXG4gICAgaHJwID0gYXZhbGFuY2hlLmdldEhSUCgpXG4gICAgbmV0d29ya0lEID0gYXZhbGFuY2hlLmdldE5ldHdvcmtJRCgpXG4gICAgZXhwZWN0KGhycCkudG9CZShcImN1c3RvbVwiKVxuICAgIGV4cGVjdChuZXR3b3JrSUQpLnRvQmUoMClcblxuICAgIGF2YWxhbmNoZS5zZXROZXR3b3JrSUQoMSlcbiAgICBocnAgPSBhdmFsYW5jaGUuZ2V0SFJQKClcbiAgICBuZXR3b3JrSUQgPSBhdmFsYW5jaGUuZ2V0TmV0d29ya0lEKClcbiAgICBleHBlY3QoaHJwKS50b0JlKFwiYXZheFwiKVxuICAgIGV4cGVjdChuZXR3b3JrSUQpLnRvQmUoMSlcblxuICAgIGF2YWxhbmNoZS5zZXROZXR3b3JrSUQoMTIzNDUpXG4gICAgaHJwID0gYXZhbGFuY2hlLmdldEhSUCgpXG4gICAgbmV0d29ya0lEID0gYXZhbGFuY2hlLmdldE5ldHdvcmtJRCgpXG4gICAgZXhwZWN0KGhycCkudG9CZShcImxvY2FsXCIpXG4gICAgZXhwZWN0KG5ldHdvcmtJRCkudG9CZSgxMjM0NSlcbiAgfSlcblxuICB0ZXN0KFwicmVwZWF0YWJsZSAxXCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBrcDogS2V5UGFpciA9IG5ldyBLZXlQYWlyKGhycCwgYWxpYXMpXG4gICAga3AuaW1wb3J0S2V5KFxuICAgICAgQnVmZmVyLmZyb20oXG4gICAgICAgIFwiZWY5YmYyZDQ0MzY0OTFjMTUzOTY3Yzk3MDlkZDhlODI3OTViZGI5YjVhZDQ0ZWUyMmMyOTAzMDA1ZDFjZjY3NlwiLFxuICAgICAgICBcImhleFwiXG4gICAgICApXG4gICAgKVxuICAgIGV4cGVjdChrcC5nZXRQdWJsaWNLZXkoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShcbiAgICAgIFwiMDMzZmFkMzY0NGRlYjIwZDdhMjEwZDEyNzU3MDkyMzEyNDUxYzExMmQwNDc3M2NlZTI2OTlmYmI1OWRjOGJiMmVmXCJcbiAgICApXG5cbiAgICBjb25zdCBtc2c6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFxuICAgICAgY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoQnVmZmVyLmZyb20oXCIwOTA5MDkwOVwiLCBcImhleFwiKSkuZGlnZXN0KFwiaGV4XCIpLFxuICAgICAgXCJoZXhcIlxuICAgIClcbiAgICBjb25zdCBzaWc6IEJ1ZmZlciA9IGtwLnNpZ24obXNnKVxuXG4gICAgZXhwZWN0KHNpZy5sZW5ndGgpLnRvQmUoNjUpXG4gICAgZXhwZWN0KGtwLnZlcmlmeShtc2csIHNpZykpLnRvQmUodHJ1ZSlcbiAgICBleHBlY3Qoa3AucmVjb3Zlcihtc2csIHNpZykudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoXG4gICAgICBrcC5nZXRQdWJsaWNLZXkoKS50b1N0cmluZyhcImhleFwiKVxuICAgIClcbiAgfSlcblxuICB0ZXN0KFwiYmFkIHByaXZhdGUga2V5XCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBrcDogS2V5UGFpciA9IG5ldyBLZXlQYWlyKFwiYmFkbmV0d29ya2lkXCIsIGFsaWFzKVxuICAgIGNvbnN0IGJhZFByaXZhdGVLZXk6IHN0cmluZyA9IFwic2FmYXNhZlwiXG4gICAgY29uc3QgcmVzdWx0OiBib29sZWFuID0ga3AuaW1wb3J0S2V5KEJ1ZmZlci5mcm9tKGJhZFByaXZhdGVLZXksIFwiaGV4XCIpKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpXG4gIH0pXG5cbiAgdGVzdChcInJlcGVhdGFibGUgMlwiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga3A6IEtleVBhaXIgPSBuZXcgS2V5UGFpcihocnAsIGFsaWFzKVxuICAgIGtwLmltcG9ydEtleShcbiAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICBcIjE3YzY5MmQ0YTk5ZDEyZjYyOWQ5ZjBmZjkyZWMwZGJhMTVjOWE4M2U4NTQ4N2IwODVjMWEzMDE4Mjg2OTk1YzZcIixcbiAgICAgICAgXCJoZXhcIlxuICAgICAgKVxuICAgIClcbiAgICBleHBlY3Qoa3AuZ2V0UHVibGljS2V5KCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoXG4gICAgICBcIjAyNDg2NTUzYjI3NmNmZTdhYmYwZWZiY2Q4ZDE3M2U1NWRiOWMwM2RhMDIwYzMzZDBiMjE5ZGYyNDEyNGRhMThlZVwiXG4gICAgKVxuXG4gICAgY29uc3QgbXNnOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKEJ1ZmZlci5mcm9tKFwiMDkwOTA5MDlcIiwgXCJoZXhcIikpLmRpZ2VzdChcImhleFwiKSxcbiAgICAgIFwiaGV4XCJcbiAgICApXG4gICAgY29uc3Qgc2lnOiBCdWZmZXIgPSBrcC5zaWduKG1zZylcblxuICAgIGV4cGVjdChzaWcubGVuZ3RoKS50b0JlKDY1KVxuICAgIGV4cGVjdChrcC52ZXJpZnkobXNnLCBzaWcpKS50b0JlKHRydWUpXG4gICAgZXhwZWN0KGtwLnJlY292ZXIobXNnLCBzaWcpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKFxuICAgICAga3AuZ2V0UHVibGljS2V5KCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICApXG4gIH0pXG5cbiAgdGVzdChcInJlcGVhdGFibGUgM1wiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga3A6IEtleVBhaXIgPSBuZXcgS2V5UGFpcihocnAsIGFsaWFzKVxuICAgIGtwLmltcG9ydEtleShcbiAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICBcImQwZTE3ZDRiMzEzODBmOTZhNDJiM2U5ZmZjNGMxYjJhOTM1ODlhMWU1MWQ4NmQ3ZWRjMTA3ZjYwMmZiYzc0NzVcIixcbiAgICAgICAgXCJoZXhcIlxuICAgICAgKVxuICAgIClcbiAgICBleHBlY3Qoa3AuZ2V0UHVibGljS2V5KCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoXG4gICAgICBcIjAzMTQ3NWI5MWQ0ZmNmNTI5NzlmMWNmMTA3ZjA1ODA4OGNjMmJlYTZlZGQ1MTkxNTc5MGYyNzE4NWE3NTg2ZTJmMlwiXG4gICAgKVxuXG4gICAgY29uc3QgbXNnOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKEJ1ZmZlci5mcm9tKFwiMDkwOTA5MDlcIiwgXCJoZXhcIikpLmRpZ2VzdChcImhleFwiKSxcbiAgICAgIFwiaGV4XCJcbiAgICApXG4gICAgY29uc3Qgc2lnOiBCdWZmZXIgPSBrcC5zaWduKG1zZylcblxuICAgIGV4cGVjdChzaWcubGVuZ3RoKS50b0JlKDY1KVxuICAgIGV4cGVjdChrcC52ZXJpZnkobXNnLCBzaWcpKS50b0JlKHRydWUpXG4gICAgZXhwZWN0KGtwLnJlY292ZXIobXNnLCBzaWcpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKFxuICAgICAga3AuZ2V0UHVibGljS2V5KCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICApXG4gIH0pXG5cbiAgdGVzdChcIkNyZWF0aW9uIEVtcHR5XCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBrcDogS2V5UGFpciA9IG5ldyBLZXlQYWlyKGhycCwgYWxpYXMpXG4gICAgZXhwZWN0KGtwLmdldFByaXZhdGVLZXkoKSkubm90LnRvQmVVbmRlZmluZWQoKVxuICAgIGV4cGVjdChrcC5nZXRBZGRyZXNzKCkpLm5vdC50b0JlVW5kZWZpbmVkKClcbiAgICBleHBlY3Qoa3AuZ2V0UHJpdmF0ZUtleVN0cmluZygpKS5ub3QudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KGtwLmdldFB1YmxpY0tleSgpKS5ub3QudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KGtwLmdldFB1YmxpY0tleVN0cmluZygpKS5ub3QudG9CZVVuZGVmaW5lZCgpXG4gICAgY29uc3QgbXNnOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKEJ1ZmZlci5mcm9tKFwiMDkwOTA5MDlcIiwgXCJoZXhcIikpLmRpZ2VzdChcImhleFwiKSxcbiAgICAgIFwiaGV4XCJcbiAgICApXG4gICAgY29uc3Qgc2lnOiBCdWZmZXIgPSBrcC5zaWduKG1zZylcblxuICAgIGV4cGVjdChzaWcubGVuZ3RoKS50b0JlKDY1KVxuICAgIGV4cGVjdChrcC52ZXJpZnkobXNnLCBzaWcpKS50b0JlKHRydWUpXG4gICAgZXhwZWN0KGtwLnJlY292ZXIobXNnLCBzaWcpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKFxuICAgICAga3AuZ2V0UHVibGljS2V5KCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICApXG4gIH0pXG59KVxuXG5kZXNjcmliZShcIkFWTUtleUNoYWluXCIsICgpOiB2b2lkID0+IHtcbiAgdGVzdChcImltcG9ydEtleSBmcm9tIEJ1ZmZlclwiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga2V5YnVmZjogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBcImQwZTE3ZDRiMzEzODBmOTZhNDJiM2U5ZmZjNGMxYjJhOTM1ODlhMWU1MWQ4NmQ3ZWRjMTA3ZjYwMmZiYzc0NzVcIixcbiAgICAgIFwiaGV4XCJcbiAgICApXG4gICAgY29uc3Qga2M6IEtleUNoYWluID0gbmV3IEtleUNoYWluKGhycCwgYWxpYXMpXG4gICAgY29uc3Qga3AyOiBLZXlQYWlyID0gbmV3IEtleVBhaXIoaHJwLCBhbGlhcylcbiAgICBjb25zdCBhZGRyMTogQnVmZmVyID0ga2MuaW1wb3J0S2V5KGtleWJ1ZmYpLmdldEFkZHJlc3MoKVxuICAgIGNvbnN0IGtwMTogS2V5UGFpciA9IGtjLmdldEtleShhZGRyMSlcbiAgICBrcDIuaW1wb3J0S2V5KGtleWJ1ZmYpXG4gICAgY29uc3QgYWRkcjIgPSBrcDEuZ2V0QWRkcmVzcygpXG4gICAgZXhwZWN0KGFkZHIxLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKGFkZHIyLnRvU3RyaW5nKFwiaGV4XCIpKVxuICAgIGV4cGVjdChrcDEuZ2V0UHJpdmF0ZUtleVN0cmluZygpKS50b0JlKGtwMi5nZXRQcml2YXRlS2V5U3RyaW5nKCkpXG4gICAgZXhwZWN0KGtwMS5nZXRQdWJsaWNLZXlTdHJpbmcoKSkudG9CZShrcDIuZ2V0UHVibGljS2V5U3RyaW5nKCkpXG4gICAgZXhwZWN0KGtjLmhhc0tleShhZGRyMSkpLnRvQmUodHJ1ZSlcbiAgfSlcblxuICB0ZXN0KFwiaW1wb3J0S2V5IGZyb20gQnVmZmVyIHdpdGggbGVhZGluZyB6ZXJvc1wiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga2V5YnVmZjogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBcIjAwMDA3ZDRiMzEzODBmOTZhNDJiM2U5ZmZjNGMxYjJhOTM1ODlhMWU1MWQ4NmQ3ZWRjMTA3ZjYwMmZiYzc0NzVcIixcbiAgICAgIFwiaGV4XCJcbiAgICApXG4gICAgZXhwZWN0KGtleWJ1ZmYubGVuZ3RoKS50b0JlKDMyKVxuICAgIGNvbnN0IGtjOiBLZXlDaGFpbiA9IG5ldyBLZXlDaGFpbihocnAsIGFsaWFzKVxuICAgIGNvbnN0IGtwMjogS2V5UGFpciA9IG5ldyBLZXlQYWlyKGhycCwgYWxpYXMpXG4gICAgY29uc3QgYWRkcjE6IEJ1ZmZlciA9IGtjLmltcG9ydEtleShrZXlidWZmKS5nZXRBZGRyZXNzKClcbiAgICBjb25zdCBrcDE6IEtleVBhaXIgPSBrYy5nZXRLZXkoYWRkcjEpXG4gICAga3AyLmltcG9ydEtleShrZXlidWZmKVxuICAgIGNvbnN0IGFkZHIyID0ga3AxLmdldEFkZHJlc3MoKVxuICAgIGV4cGVjdChhZGRyMS50b1N0cmluZyhcImhleFwiKSkudG9CZShhZGRyMi50b1N0cmluZyhcImhleFwiKSlcbiAgICBleHBlY3Qoa3AxLmdldFByaXZhdGVLZXlTdHJpbmcoKSkudG9CZShrcDIuZ2V0UHJpdmF0ZUtleVN0cmluZygpKVxuICAgIGV4cGVjdChrcDEuZ2V0UHJpdmF0ZUtleSgpLmxlbmd0aCkudG9CZSgzMilcbiAgICBleHBlY3Qoa3AyLmdldFByaXZhdGVLZXkoKS5sZW5ndGgpLnRvQmUoMzIpXG4gICAgZXhwZWN0KGtwMS5nZXRQdWJsaWNLZXlTdHJpbmcoKSkudG9CZShrcDIuZ2V0UHVibGljS2V5U3RyaW5nKCkpXG4gICAgZXhwZWN0KGtwMS5nZXRQdWJsaWNLZXkoKS5sZW5ndGgpLnRvQmUoMzMpXG4gICAgZXhwZWN0KGtwMi5nZXRQdWJsaWNLZXkoKS5sZW5ndGgpLnRvQmUoMzMpXG4gICAgZXhwZWN0KGtjLmhhc0tleShhZGRyMSkpLnRvQmUodHJ1ZSlcbiAgfSlcblxuICB0ZXN0KFwiaW1wb3J0S2V5IGZyb20gc2VyaWFsaXplZCBzdHJpbmdcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGtleWJ1ZmY6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFxuICAgICAgXCJkMGUxN2Q0YjMxMzgwZjk2YTQyYjNlOWZmYzRjMWIyYTkzNTg5YTFlNTFkODZkN2VkYzEwN2Y2MDJmYmM3NDc1XCIsXG4gICAgICBcImhleFwiXG4gICAgKVxuICAgIGNvbnN0IGtjOiBLZXlDaGFpbiA9IG5ldyBLZXlDaGFpbihocnAsIGFsaWFzKVxuICAgIGNvbnN0IGtwMjogS2V5UGFpciA9IG5ldyBLZXlQYWlyKGhycCwgYWxpYXMpXG4gICAgY29uc3QgYWRkcjE6IEJ1ZmZlciA9IGtjXG4gICAgICAuaW1wb3J0S2V5KFwiUHJpdmF0ZUtleS1cIiArIGJpbnRvb2xzLmNiNThFbmNvZGUoa2V5YnVmZikpXG4gICAgICAuZ2V0QWRkcmVzcygpXG4gICAgY29uc3Qga3AxOiBLZXlQYWlyID0ga2MuZ2V0S2V5KGFkZHIxKVxuICAgIGtwMi5pbXBvcnRLZXkoa2V5YnVmZilcbiAgICBjb25zdCBhZGRyMiA9IGtwMS5nZXRBZGRyZXNzKClcbiAgICBleHBlY3QoYWRkcjEudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoYWRkcjIudG9TdHJpbmcoXCJoZXhcIikpXG4gICAgZXhwZWN0KGtwMS5nZXRQcml2YXRlS2V5U3RyaW5nKCkpLnRvQmUoa3AyLmdldFByaXZhdGVLZXlTdHJpbmcoKSlcbiAgICBleHBlY3Qoa3AxLmdldFB1YmxpY0tleVN0cmluZygpKS50b0JlKGtwMi5nZXRQdWJsaWNLZXlTdHJpbmcoKSlcbiAgICBleHBlY3Qoa2MuaGFzS2V5KGFkZHIxKSkudG9CZSh0cnVlKVxuICB9KVxuXG4gIHRlc3QoXCJyZW1vdmVLZXkgdmlhIGtleXBhaXJcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGtleWJ1ZmY6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFxuICAgICAgXCJkMGUxN2Q0YjMxMzgwZjk2YTQyYjNlOWZmYzRjMWIyYTkzNTg5YTFlNTFkODZkN2VkYzEwN2Y2MDJmYmM3NDc1XCIsXG4gICAgICBcImhleFwiXG4gICAgKVxuICAgIGNvbnN0IGtjOiBLZXlDaGFpbiA9IG5ldyBLZXlDaGFpbihocnAsIGFsaWFzKVxuICAgIGNvbnN0IGtwMTogS2V5UGFpciA9IG5ldyBLZXlQYWlyKGhycCwgYWxpYXMpXG4gICAgY29uc3QgYWRkcjE6IEJ1ZmZlciA9IGtjLmltcG9ydEtleShrZXlidWZmKS5nZXRBZGRyZXNzKClcbiAgICBrcDEuaW1wb3J0S2V5KGtleWJ1ZmYpXG4gICAgZXhwZWN0KGtjLmhhc0tleShhZGRyMSkpLnRvQmUodHJ1ZSlcbiAgICBrYy5yZW1vdmVLZXkoa3AxKVxuICAgIGV4cGVjdChrYy5oYXNLZXkoYWRkcjEpKS50b0JlKGZhbHNlKVxuICB9KVxuXG4gIHRlc3QoXCJyZW1vdmVLZXkgdmlhIHN0cmluZ1wiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga2V5YnVmZjogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBcImQwZTE3ZDRiMzEzODBmOTZhNDJiM2U5ZmZjNGMxYjJhOTM1ODlhMWU1MWQ4NmQ3ZWRjMTA3ZjYwMmZiYzc0NzVcIixcbiAgICAgIFwiaGV4XCJcbiAgICApXG4gICAgY29uc3Qga2M6IEtleUNoYWluID0gbmV3IEtleUNoYWluKGhycCwgYWxpYXMpXG4gICAgY29uc3QgYWRkcjE6IEJ1ZmZlciA9IGtjLmltcG9ydEtleShrZXlidWZmKS5nZXRBZGRyZXNzKClcbiAgICBleHBlY3Qoa2MuaGFzS2V5KGFkZHIxKSkudG9CZSh0cnVlKVxuICAgIGtjLnJlbW92ZUtleShhZGRyMSlcbiAgICBleHBlY3Qoa2MuaGFzS2V5KGFkZHIxKSkudG9CZShmYWxzZSlcbiAgfSlcblxuICB0ZXN0KFwicmVtb3ZlS2V5IGJhZCBrZXlzXCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBrZXlidWZmOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgIFwiZDBlMTdkNGIzMTM4MGY5NmE0MmIzZTlmZmM0YzFiMmE5MzU4OWExZTUxZDg2ZDdlZGMxMDdmNjAyZmJjNzQ3NVwiLFxuICAgICAgXCJoZXhcIlxuICAgIClcbiAgICBjb25zdCBrYzogS2V5Q2hhaW4gPSBuZXcgS2V5Q2hhaW4oaHJwLCBhbGlhcylcbiAgICBjb25zdCBhZGRyMTogQnVmZmVyID0ga2MuaW1wb3J0S2V5KGtleWJ1ZmYpLmdldEFkZHJlc3MoKVxuICAgIGV4cGVjdChrYy5oYXNLZXkoYWRkcjEpKS50b0JlKHRydWUpXG4gICAgZXhwZWN0KFxuICAgICAga2MucmVtb3ZlS2V5KGJpbnRvb2xzLmNiNThEZWNvZGUoXCI2WTNreXNqRjlqbkhuWWtkUzl5R0F1b0h5YWUyZU5tZVZcIikpXG4gICAgKS50b0JlKGZhbHNlKVxuICB9KVxufSlcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!