PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-lib-mpc/dist/src/tss/ecdsa-dkls
Просмотр файла: dkg.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;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Dkg = void 0;
const cbor_x_1 = require("cbor-x");
const curves_1 = require("../../curves");
const util_1 = require("../../util");
const types_1 = require("./types");
class Dkg {
constructor(n, t, partyIdx, seed, retrofitData, dklsWasm) {
this.dkgState = types_1.DkgState.Uninitialized;
this.n = n;
this.t = t;
this.partyIdx = partyIdx;
this.chainCodeCommitment = undefined;
this.retrofitData = retrofitData;
this.seed = seed;
this.dklsWasm = dklsWasm ?? null;
}
async loadDklsWasm() {
if (!this.dklsWasm) {
this.dklsWasm = await Promise.resolve().then(() => __importStar(require('@silencelaboratories/dkls-wasm-ll-node')));
}
}
getDklsWasm() {
if (!this.dklsWasm) {
throw Error('DKLS wasm not loaded');
}
return this.dklsWasm;
}
_restoreSession() {
if (!this.dkgSession) {
this.dkgSession = this.getDklsWasm().KeygenSession.fromBytes(this.dkgSessionBytes);
}
}
_createDKLsRetrofitKeyShare() {
if (this.retrofitData) {
if (!this.retrofitData.xShare.y || !this.retrofitData.xShare.chaincode || !this.retrofitData.xShare.x) {
throw Error('xShare must have a public key, private share value, and a chaincode.');
}
const xiList = [];
for (let i = 0; i < this.n; i++) {
xiList.push(Array.from((0, util_1.bigIntToBufferBE)(BigInt(i + 1), 32)));
}
const secp256k1 = new curves_1.Secp256k1Curve();
const dklsKeyShare = {
total_parties: this.n,
threshold: this.t,
rank_list: new Array(this.n).fill(0),
party_id: this.partyIdx,
public_key: Array.from(Buffer.from(this.retrofitData.xShare.y, 'hex')),
root_chain_code: Array.from(Buffer.from(this.retrofitData.xShare.chaincode, 'hex')),
final_session_id: Array(32).fill(0),
seed_ot_receivers: new Array(this.n - 1).fill(Array(32832).fill(0)),
seed_ot_senders: new Array(this.n - 1).fill(Array(32768).fill(0)),
sent_seed_list: [Array(32).fill(0)],
rec_seed_list: [Array(32).fill(0)],
s_i: Array.from(Buffer.from(this.retrofitData.xShare.x, 'hex')),
// big_s_list is now created internally during the protocol so isn't needed here, however a valid KeyShare object needs to have it.
// a dummy public key is used to fill big_s_list.
big_s_list: new Array(this.n).fill(Array.from((0, util_1.bigIntToBufferBE)(secp256k1.basePointMult(BigInt('0x' + this.retrofitData.xShare.x))))),
x_i_list: this.retrofitData.xiList ? this.retrofitData.xiList : xiList,
};
this.dklsKeyShareRetrofitObject = this.getDklsWasm().Keyshare.fromBytes((0, cbor_x_1.encode)(dklsKeyShare));
}
}
_deserializeState() {
if (!this.dkgSession) {
throw Error('Session not intialized');
}
const round = (0, cbor_x_1.decode)(this.dkgSession.toBytes()).round;
switch (round) {
case 'WaitMsg1':
this.dkgState = types_1.DkgState.Round1;
break;
case 'WaitMsg2':
this.dkgState = types_1.DkgState.Round2;
break;
case 'WaitMsg3':
this.dkgState = types_1.DkgState.Round3;
break;
case 'WaitMsg4':
this.dkgState = types_1.DkgState.Round4;
break;
case 'Ended':
this.dkgState = types_1.DkgState.Complete;
break;
default:
this.dkgState = types_1.DkgState.InvalidState;
throw Error(`Invalid State: ${round}`);
}
}
async initDkg() {
if (!this.dklsWasm) {
await this.loadDklsWasm();
}
if (this.t > this.n || this.partyIdx >= this.n) {
throw Error('Invalid parameters for DKG');
}
if (this.dkgState != types_1.DkgState.Uninitialized) {
throw Error('DKG session already initialized');
}
if (typeof window !== 'undefined' &&
/* checks for electron processes */
!window.process &&
!window.process?.['type']) {
/* This is only needed for browsers/web because it uses fetch to resolve the wasm asset for the web */
const initDkls = await Promise.resolve().then(() => __importStar(require('@silencelaboratories/dkls-wasm-ll-web')));
await initDkls.default();
}
this._createDKLsRetrofitKeyShare();
if (this.seed && this.seed.length !== 32) {
throw Error(`Seed should be 32 bytes, got ${this.seed.length}.`);
}
const { KeygenSession } = this.getDklsWasm();
if (this.dklsKeyShareRetrofitObject) {
this.dkgSession = this.seed
? KeygenSession.initKeyRotation(this.dklsKeyShareRetrofitObject, new Uint8Array(this.seed))
: KeygenSession.initKeyRotation(this.dklsKeyShareRetrofitObject);
}
else {
this.dkgSession = this.seed
? new KeygenSession(this.n, this.t, this.partyIdx, new Uint8Array(this.seed))
: new KeygenSession(this.n, this.t, this.partyIdx);
}
try {
const payload = this.dkgSession.createFirstMessage().payload;
this._deserializeState();
return {
payload: payload,
from: this.partyIdx,
};
}
catch (e) {
throw Error(`Error while creating the first message from party ${this.partyIdx}: ${e}`);
}
}
getKeyShare() {
if (!this.keyShareBuff) {
throw Error('Can not get key share, DKG is not complete yet.');
}
return this.keyShareBuff;
}
getReducedKeyShare() {
if (!this.keyShareBuff) {
throw Error('Can not get key share, DKG is not complete yet.');
}
const decodedKeyshare = (0, cbor_x_1.decode)(this.keyShareBuff);
const reducedKeyShare = {
bigSList: decodedKeyshare.big_s_list,
xList: decodedKeyshare.x_i_list,
rootChainCode: decodedKeyshare.root_chain_code,
prv: decodedKeyshare.s_i,
pub: decodedKeyshare.public_key,
};
const encodedKeyShare = (0, cbor_x_1.encode)(reducedKeyShare);
return encodedKeyShare;
}
handleIncomingMessages(messagesForIthRound) {
let nextRoundMessages = [];
let nextRoundDeserializedMessages = { broadcastMessages: [], p2pMessages: [] };
this._restoreSession();
if (!this.dkgSession) {
throw Error('Session not initialized');
}
const { Message } = this.getDklsWasm();
try {
if (this.dkgState === types_1.DkgState.Round3) {
const commitmentsUnsorted = messagesForIthRound.p2pMessages
.map((m) => {
return { from: m.from, commitment: m.commitment };
})
.concat([{ from: this.partyIdx, commitment: this.chainCodeCommitment }]);
const commitmentsSorted = commitmentsUnsorted
.sort((a, b) => {
return a.from - b.from;
})
.map((c) => c.commitment);
nextRoundMessages = this.dkgSession.handleMessages(messagesForIthRound.broadcastMessages
.map((m) => new Message(m.payload, m.from, undefined))
.concat(messagesForIthRound.p2pMessages.map((m) => new Message(m.payload, m.from, m.to))), commitmentsSorted);
}
else {
nextRoundMessages = this.dkgSession.handleMessages(messagesForIthRound.broadcastMessages
.map((m) => new Message(m.payload, m.from, undefined))
.concat(messagesForIthRound.p2pMessages.map((m) => new Message(m.payload, m.from, m.to))), undefined);
}
if (this.dkgState === types_1.DkgState.Round4) {
this.dkgKeyShare = this.dkgSession.keyshare();
this.keyShareBuff = Buffer.from(this.dkgKeyShare.toBytes());
this.dkgKeyShare.free();
if (this.dklsKeyShareRetrofitObject) {
this.dklsKeyShareRetrofitObject.free();
}
this.dkgState = types_1.DkgState.Complete;
return { broadcastMessages: [], p2pMessages: [] };
}
else {
// Update round data.
this._deserializeState();
}
if (this.dkgState === types_1.DkgState.Round2) {
this.chainCodeCommitment = this.dkgSession.calculateChainCodeCommitment();
}
nextRoundDeserializedMessages = {
p2pMessages: nextRoundMessages
.filter((m) => m.to_id !== undefined)
.map((m) => {
const p2pReturn = {
payload: m.payload,
from: m.from_id,
to: m.to_id,
commitment: this.chainCodeCommitment,
};
return p2pReturn;
}),
broadcastMessages: nextRoundMessages
.filter((m) => m.to_id === undefined)
.map((m) => {
const broadcastReturn = {
payload: m.payload,
from: m.from_id,
};
return broadcastReturn;
}),
};
}
catch (e) {
throw Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dkgState}: ${e}`);
}
finally {
nextRoundMessages.forEach((m) => m.free());
// Session is freed when keyshare is called.
if (this.dkgState !== types_1.DkgState.Complete) {
this.dkgSessionBytes = this.dkgSession.toBytes();
this.dkgSession = undefined;
}
}
return nextRoundDeserializedMessages;
}
}
exports.Dkg = Dkg;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lY2RzYS1ka2xzL2RrZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxtQ0FBd0M7QUFDeEMseUNBQThDO0FBQzlDLHFDQUE4QztBQUM5QyxtQ0FBc0g7QUFRdEgsTUFBYSxHQUFHO0lBZWQsWUFDRSxDQUFTLEVBQ1QsQ0FBUyxFQUNULFFBQWdCLEVBQ2hCLElBQWEsRUFDYixZQUEyQixFQUMzQixRQUF3QjtRQVhoQixhQUFRLEdBQWEsZ0JBQVEsQ0FBQyxhQUFhLENBQUM7UUFhcEQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsd0RBQWEsd0NBQXdDLEdBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixNQUFNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFD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Q0FBQyxRQUFRLFdBQVcsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7Z0JBQVMsQ0FBQztZQUNULGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0MsNENBQTRDO1lBQzVDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyw2QkFBNkIsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUExUUQsa0JBMFFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBLZXlnZW5TZXNzaW9uLCBLZXlzaGFyZSwgTWVzc2FnZSB9IGZyb20gJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC1ub2RlJztcbmltcG9ydCB7IGRlY29kZSwgZW5jb2RlIH0gZnJvbSAnY2Jvci14JztcbmltcG9ydCB7IFNlY3AyNTZrMUN1cnZlIH0gZnJvbSAnLi4vLi4vY3VydmVzJztcbmltcG9ydCB7IGJpZ0ludFRvQnVmZmVyQkUgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IERlc2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2UsIERlc2VyaWFsaXplZE1lc3NhZ2VzLCBEa2dTdGF0ZSwgUmVkdWNlZEtleVNoYXJlLCBSZXRyb2ZpdERhdGEgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOb2RlV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLW5vZGUnKTtcbnR5cGUgV2ViV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLXdlYicpO1xudHlwZSBCdW5kbGVyV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLWJ1bmRsZXInKTtcblxudHlwZSBEa2xzV2FzbSA9IE5vZGVXYXNtZXIgfCBXZWJXYXNtZXIgfCBCdW5kbGVyV2FzbWVyO1xuXG5leHBvcnQgY2xhc3MgRGtnIHtcbiAgcHJvdGVjdGVkIGRrZ1Nlc3Npb246IEtleWdlblNlc3Npb24gfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBka2dTZXNzaW9uQnl0ZXM6IFVpbnQ4QXJyYXk7XG4gIHByb3RlY3RlZCBka2dLZXlTaGFyZTogS2V5c2hhcmU7XG4gIHByb3RlY3RlZCBrZXlTaGFyZUJ1ZmY6IEJ1ZmZlcjtcbiAgcHJvdGVjdGVkIG46IG51bWJlcjtcbiAgcHJvdGVjdGVkIHQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHNlZWQ6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGNoYWluQ29kZUNvbW1pdG1lbnQ6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGtnU3RhdGU6IERrZ1N0YXRlID0gRGtnU3RhdGUuVW5pbml0aWFsaXplZDtcbiAgcHJvdGVjdGVkIGRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0OiBLZXlzaGFyZSB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJldHJvZml0RGF0YTogUmV0cm9maXREYXRhIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgZGtsc1dhc206IERrbHNXYXNtIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBuOiBudW1iZXIsXG4gICAgdDogbnVtYmVyLFxuICAgIHBhcnR5SWR4OiBudW1iZXIsXG4gICAgc2VlZD86IEJ1ZmZlcixcbiAgICByZXRyb2ZpdERhdGE/OiBSZXRyb2ZpdERhdGEsXG4gICAgZGtsc1dhc20/OiBCdW5kbGVyV2FzbWVyXG4gICkge1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy50ID0gdDtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gICAgdGhpcy5jaGFpbkNvZGVDb21taXRtZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmV0cm9maXREYXRhID0gcmV0cm9maXREYXRhO1xuICAgIHRoaXMuc2VlZCA9IHNlZWQ7XG4gICAgdGhpcy5ka2xzV2FzbSA9IGRrbHNXYXNtID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWREa2xzV2FzbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuZGtsc1dhc20pIHtcbiAgICAgIHRoaXMuZGtsc1dhc20gPSBhd2FpdCBpbXBvcnQoJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC1ub2RlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREa2xzV2FzbSgpIHtcbiAgICBpZiAoIXRoaXMuZGtsc1dhc20pIHtcbiAgICAgIHRocm93IEVycm9yKCdES0xTIHdhc20gbm90IGxvYWRlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRrbHNXYXNtO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdG9yZVNlc3Npb24oKSB7XG4gICAgaWYgKCF0aGlzLmRrZ1Nlc3Npb24pIHtcbiAgICAgIHRoaXMuZGtnU2Vzc2lvbiA9IHRoaXMuZ2V0RGtsc1dhc20oKS5LZXlnZW5TZXNzaW9uLmZyb21CeXRlcyh0aGlzLmRrZ1Nlc3Npb25CeXRlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlREtMc1JldHJvZml0S2V5U2hhcmUoKSB7XG4gICAgaWYgKHRoaXMucmV0cm9maXREYXRhKSB7XG4gICAgICBpZiAoIXRoaXMucmV0cm9maXREYXRhLnhTaGFyZS55IHx8ICF0aGlzLnJldHJvZml0RGF0YS54U2hhcmUuY2hhaW5jb2RlIHx8ICF0aGlzLnJldHJvZml0RGF0YS54U2hhcmUueCkge1xuICAgICAgICB0aHJvdyBFcnJvcigneFNoYXJlIG11c3QgaGF2ZSBhIHB1YmxpYyBrZXksIHByaXZhdGUgc2hhcmUgdmFsdWUsIGFuZCBhIGNoYWluY29kZS4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHhpTGlzdDogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uOyBpKyspIHtcbiAgICAgICAgeGlMaXN0LnB1c2goQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludChpICsgMSksIDMyKSkpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VjcDI1NmsxID0gbmV3IFNlY3AyNTZrMUN1cnZlKCk7XG4gICAgICBjb25zdCBka2xzS2V5U2hhcmUgPSB7XG4gICAgICAgIHRvdGFsX3BhcnRpZXM6IHRoaXMubixcbiAgICAgICAgdGhyZXNob2xkOiB0aGlzLnQsXG4gICAgICAgIHJhbmtfbGlzdDogbmV3IEFycmF5KHRoaXMubikuZmlsbCgwKSxcbiAgICAgICAgcGFydHlfaWQ6IHRoaXMucGFydHlJZHgsXG4gICAgICAgIHB1YmxpY19rZXk6IEFycmF5LmZyb20oQnVmZmVyLmZyb20odGhpcy5yZXRyb2ZpdERhdGEueFNoYXJlLnksICdoZXgnKSksXG4gICAgICAgIHJvb3RfY2hhaW5fY29kZTogQXJyYXkuZnJvbShCdWZmZXIuZnJvbSh0aGlzLnJldHJvZml0RGF0YS54U2hhcmUuY2hhaW5jb2RlLCAnaGV4JykpLFxuICAgICAgICBmaW5hbF9zZXNzaW9uX2lkOiBBcnJheSgzMikuZmlsbCgwKSxcbiAgICAgICAgc2VlZF9vdF9yZWNlaXZlcnM6IG5ldyBBcnJheSh0aGlzLm4gLSAxKS5maWxsKEFycmF5KDMyODMyKS5maWxsKDApKSxcbiAgICAgICAgc2VlZF9vdF9zZW5kZXJzOiBuZXcgQXJyYXkodGhpcy5uIC0gMSkuZmlsbChBcnJheSgzMjc2OCkuZmlsbCgwKSksXG4gICAgICAgIHNlbnRfc2VlZF9saXN0OiBbQXJyYXkoMzIpLmZpbGwoMCldLFxuICAgICAgICByZWNfc2VlZF9saXN0OiBbQXJyYXkoMzIpLmZpbGwoMCldLFxuICAgICAgICBzX2k6IEFycmF5LmZyb20oQnVmZmVyLmZyb20odGhpcy5yZXRyb2ZpdERhdGEueFNoYXJlLngsICdoZXgnKSksXG4gICAgICAgIC8vIGJpZ19zX2xpc3QgaXMgbm93IGNyZWF0ZWQgaW50ZXJuYWxseSBkdXJpbmcgdGhlIHByb3RvY29sIHNvIGlzbid0IG5lZWRlZCBoZXJlLCBob3dldmVyIGEgdmFsaWQgS2V5U2hhcmUgb2JqZWN0IG5lZWRzIHRvIGhhdmUgaXQuXG4gICAgICAgIC8vIGEgZHVtbXkgcHVibGljIGtleSBpcyB1c2VkIHRvIGZpbGwgYmlnX3NfbGlzdC5cbiAgICAgICAgYmlnX3NfbGlzdDogbmV3IEFycmF5KHRoaXMubikuZmlsbChcbiAgICAgICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoc2VjcDI1NmsxLmJhc2VQb2ludE11bHQoQmlnSW50KCcweCcgKyB0aGlzLnJldHJvZml0RGF0YS54U2hhcmUueCkpKSlcbiAgICAgICAgKSxcbiAgICAgICAgeF9pX2xpc3Q6IHRoaXMucmV0cm9maXREYXRhLnhpTGlzdCA/IHRoaXMucmV0cm9maXREYXRhLnhpTGlzdCA6IHhpTGlzdCxcbiAgICAgIH07XG4gICAgICB0aGlzLmRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0ID0gdGhpcy5nZXREa2xzV2FzbSgpLktleXNoYXJlLmZyb21CeXRlcyhlbmNvZGUoZGtsc0tleVNoYXJlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVzZXJpYWxpemVTdGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuZGtnU2Vzc2lvbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Nlc3Npb24gbm90IGludGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgY29uc3Qgcm91bmQgPSBkZWNvZGUodGhpcy5ka2dTZXNzaW9uLnRvQnl0ZXMoKSkucm91bmQ7XG4gICAgc3dpdGNoIChyb3VuZCkge1xuICAgICAgY2FzZSAnV2FpdE1zZzEnOlxuICAgICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuUm91bmQxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dhaXRNc2cyJzpcbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLlJvdW5kMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXYWl0TXNnMyc6XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Sb3VuZDM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnV2FpdE1zZzQnOlxuICAgICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuUm91bmQ0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VuZGVkJzpcbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkNvbXBsZXRlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5JbnZhbGlkU3RhdGU7XG4gICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIFN0YXRlOiAke3JvdW5kfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXREa2coKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmRrbHNXYXNtKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWREa2xzV2FzbSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ID4gdGhpcy5uIHx8IHRoaXMucGFydHlJZHggPj0gdGhpcy5uKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBwYXJhbWV0ZXJzIGZvciBES0cnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgIT0gRGtnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIGFscmVhZHkgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIC8qIGNoZWNrcyBmb3IgZWxlY3Ryb24gcHJvY2Vzc2VzICovXG4gICAgICAhd2luZG93LnByb2Nlc3MgJiZcbiAgICAgICF3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ11cbiAgICApIHtcbiAgICAgIC8qIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGJyb3dzZXJzL3dlYiBiZWNhdXNlIGl0IHVzZXMgZmV0Y2ggdG8gcmVzb2x2ZSB0aGUgd2FzbSBhc3NldCBmb3IgdGhlIHdlYiAqL1xuICAgICAgY29uc3QgaW5pdERrbHMgPSBhd2FpdCBpbXBvcnQoJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC13ZWInKTtcbiAgICAgIGF3YWl0IGluaXREa2xzLmRlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy5fY3JlYXRlREtMc1JldHJvZml0S2V5U2hhcmUoKTtcbiAgICBpZiAodGhpcy5zZWVkICYmIHRoaXMuc2VlZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgU2VlZCBzaG91bGQgYmUgMzIgYnl0ZXMsIGdvdCAke3RoaXMuc2VlZC5sZW5ndGh9LmApO1xuICAgIH1cbiAgICBjb25zdCB7IEtleWdlblNlc3Npb24gfSA9IHRoaXMuZ2V0RGtsc1dhc20oKTtcbiAgICBpZiAodGhpcy5ka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdCkge1xuICAgICAgdGhpcy5ka2dTZXNzaW9uID0gdGhpcy5zZWVkXG4gICAgICAgID8gS2V5Z2VuU2Vzc2lvbi5pbml0S2V5Um90YXRpb24odGhpcy5ka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdCwgbmV3IFVpbnQ4QXJyYXkodGhpcy5zZWVkKSlcbiAgICAgICAgOiBLZXlnZW5TZXNzaW9uLmluaXRLZXlSb3RhdGlvbih0aGlzLmRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ka2dTZXNzaW9uID0gdGhpcy5zZWVkXG4gICAgICAgID8gbmV3IEtleWdlblNlc3Npb24odGhpcy5uLCB0aGlzLnQsIHRoaXMucGFydHlJZHgsIG5ldyBVaW50OEFycmF5KHRoaXMuc2VlZCkpXG4gICAgICAgIDogbmV3IEtleWdlblNlc3Npb24odGhpcy5uLCB0aGlzLnQsIHRoaXMucGFydHlJZHgpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZGtnU2Vzc2lvbi5jcmVhdGVGaXJzdE1lc3NhZ2UoKS5wYXlsb2FkO1xuICAgICAgdGhpcy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgZnJvbTogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmtleVNoYXJlQnVmZikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IGtleSBzaGFyZSwgREtHIGlzIG5vdCBjb21wbGV0ZSB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmtleVNoYXJlQnVmZjtcbiAgfVxuXG4gIGdldFJlZHVjZWRLZXlTaGFyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5rZXlTaGFyZUJ1ZmYpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IGdldCBrZXkgc2hhcmUsIERLRyBpcyBub3QgY29tcGxldGUgeWV0LicpO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkS2V5c2hhcmUgPSBkZWNvZGUodGhpcy5rZXlTaGFyZUJ1ZmYpO1xuICAgIGNvbnN0IHJlZHVjZWRLZXlTaGFyZTogUmVkdWNlZEtleVNoYXJlID0ge1xuICAgICAgYmlnU0xpc3Q6IGRlY29kZWRLZXlzaGFyZS5iaWdfc19saXN0LFxuICAgICAgeExpc3Q6IGRlY29kZWRLZXlzaGFyZS54X2lfbGlzdCxcbiAgICAgIHJvb3RDaGFpbkNvZGU6IGRlY29kZWRLZXlzaGFyZS5yb290X2NoYWluX2NvZGUsXG4gICAgICBwcnY6IGRlY29kZWRLZXlzaGFyZS5zX2ksXG4gICAgICBwdWI6IGRlY29kZWRLZXlzaGFyZS5wdWJsaWNfa2V5LFxuICAgIH07XG4gICAgY29uc3QgZW5jb2RlZEtleVNoYXJlID0gZW5jb2RlKHJlZHVjZWRLZXlTaGFyZSk7XG4gICAgcmV0dXJuIGVuY29kZWRLZXlTaGFyZTtcbiAgfVxuXG4gIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZXNGb3JJdGhSb3VuZDogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gICAgbGV0IG5leHRSb3VuZE1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcbiAgICBsZXQgbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXM6IERlc2VyaWFsaXplZE1lc3NhZ2VzID0geyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbXSB9O1xuICAgIHRoaXMuX3Jlc3RvcmVTZXNzaW9uKCk7XG4gICAgaWYgKCF0aGlzLmRrZ1Nlc3Npb24pIHtcbiAgICAgIHRocm93IEVycm9yKCdTZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBjb25zdCB7IE1lc3NhZ2UgfSA9IHRoaXMuZ2V0RGtsc1dhc20oKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLlJvdW5kMykge1xuICAgICAgICBjb25zdCBjb21taXRtZW50c1Vuc29ydGVkID0gbWVzc2FnZXNGb3JJdGhSb3VuZC5wMnBNZXNzYWdlc1xuICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IG0uZnJvbSwgY29tbWl0bWVudDogbS5jb21taXRtZW50IH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY29uY2F0KFt7IGZyb206IHRoaXMucGFydHlJZHgsIGNvbW1pdG1lbnQ6IHRoaXMuY2hhaW5Db2RlQ29tbWl0bWVudCB9XSk7XG4gICAgICAgIGNvbnN0IGNvbW1pdG1lbnRzU29ydGVkID0gY29tbWl0bWVudHNVbnNvcnRlZFxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS5mcm9tIC0gYi5mcm9tO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcCgoYykgPT4gYy5jb21taXRtZW50KTtcbiAgICAgICAgbmV4dFJvdW5kTWVzc2FnZXMgPSB0aGlzLmRrZ1Nlc3Npb24uaGFuZGxlTWVzc2FnZXMoXG4gICAgICAgICAgbWVzc2FnZXNGb3JJdGhSb3VuZC5icm9hZGNhc3RNZXNzYWdlc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4gbmV3IE1lc3NhZ2UobS5wYXlsb2FkLCBtLmZyb20sIHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAuY29uY2F0KG1lc3NhZ2VzRm9ySXRoUm91bmQucDJwTWVzc2FnZXMubWFwKChtKSA9PiBuZXcgTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSwgbS50bykpKSxcbiAgICAgICAgICBjb21taXRtZW50c1NvcnRlZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFJvdW5kTWVzc2FnZXMgPSB0aGlzLmRrZ1Nlc3Npb24uaGFuZGxlTWVzc2FnZXMoXG4gICAgICAgICAgbWVzc2FnZXNGb3JJdGhSb3VuZC5icm9hZGNhc3RNZXNzYWdlc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4gbmV3IE1lc3NhZ2UobS5wYXlsb2FkLCBtLmZyb20sIHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAuY29uY2F0KG1lc3NhZ2VzRm9ySXRoUm91bmQucDJwTWVzc2FnZXMubWFwKChtKSA9PiBuZXcgTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSwgbS50bykpKSxcbiAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5Sb3VuZDQpIHtcbiAgICAgICAgdGhpcy5ka2dLZXlTaGFyZSA9IHRoaXMuZGtnU2Vzc2lvbi5rZXlzaGFyZSgpO1xuICAgICAgICB0aGlzLmtleVNoYXJlQnVmZiA9IEJ1ZmZlci5mcm9tKHRoaXMuZGtnS2V5U2hhcmUudG9CeXRlcygpKTtcbiAgICAgICAgdGhpcy5ka2dLZXlTaGFyZS5mcmVlKCk7XG4gICAgICAgIGlmICh0aGlzLmRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0KSB7XG4gICAgICAgICAgdGhpcy5ka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdC5mcmVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkNvbXBsZXRlO1xuICAgICAgICByZXR1cm4geyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbXSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIHJvdW5kIGRhdGEuXG4gICAgICAgIHRoaXMuX2Rlc2VyaWFsaXplU3RhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5Sb3VuZDIpIHtcbiAgICAgICAgdGhpcy5jaGFpbkNvZGVDb21taXRtZW50ID0gdGhpcy5ka2dTZXNzaW9uLmNhbGN1bGF0ZUNoYWluQ29kZUNvbW1pdG1lbnQoKTtcbiAgICAgIH1cbiAgICAgIG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzID0ge1xuICAgICAgICBwMnBNZXNzYWdlczogbmV4dFJvdW5kTWVzc2FnZXNcbiAgICAgICAgICAuZmlsdGVyKChtKSA9PiBtLnRvX2lkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcDJwUmV0dXJuID0ge1xuICAgICAgICAgICAgICBwYXlsb2FkOiBtLnBheWxvYWQsXG4gICAgICAgICAgICAgIGZyb206IG0uZnJvbV9pZCxcbiAgICAgICAgICAgICAgdG86IG0udG9faWQhLFxuICAgICAgICAgICAgICBjb21taXRtZW50OiB0aGlzLmNoYWluQ29kZUNvbW1pdG1lbnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHAycFJldHVybjtcbiAgICAgICAgICB9KSxcbiAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IG5leHRSb3VuZE1lc3NhZ2VzXG4gICAgICAgICAgLmZpbHRlcigobSkgPT4gbS50b19pZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdFJldHVybiA9IHtcbiAgICAgICAgICAgICAgcGF5bG9hZDogbS5wYXlsb2FkLFxuICAgICAgICAgICAgICBmcm9tOiBtLmZyb21faWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGJyb2FkY2FzdFJldHVybjtcbiAgICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRrZ1N0YXRlfTogJHtlfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBuZXh0Um91bmRNZXNzYWdlcy5mb3JFYWNoKChtKSA9PiBtLmZyZWUoKSk7XG4gICAgICAvLyBTZXNzaW9uIGlzIGZyZWVkIHdoZW4ga2V5c2hhcmUgaXMgY2FsbGVkLlxuICAgICAgaWYgKHRoaXMuZGtnU3RhdGUgIT09IERrZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMuZGtnU2Vzc2lvbkJ5dGVzID0gdGhpcy5ka2dTZXNzaW9uLnRvQnl0ZXMoKTtcbiAgICAgICAgdGhpcy5ka2dTZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXM7XG4gIH1cbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!