PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-ada/dist/src/lib/messages/cip8
Просмотр файла: cip8Message.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.Cip8Message = void 0;
const sdk_core_1 = require("@bitgo/sdk-core");
const CardanoSL = __importStar(require("@emurgo/cardano-serialization-lib-nodejs"));
const utils_1 = require("./utils");
/**
* Implementation of Message for CIP8 standard
*/
class Cip8Message extends sdk_core_1.BaseMessage {
constructor(options) {
super({
...options,
type: sdk_core_1.MessageStandardType.CIP8,
});
}
/**
* Returns the hash of the CIP-8 prefixed message
*/
async getSignablePayload() {
const { addressCborBytes } = this.validateAndGetCommonSetup();
const { sigStructureCborBytes } = (0, utils_1.createCSLSigStructure)(addressCborBytes, this.payload);
this.signablePayload = Buffer.from(sigStructureCborBytes);
return this.signablePayload;
}
/*
* Returns broadcastable signatures in COSE format according to CIP8 standard
*
* This method transforms the internal signatures into a format suitable for broadcasting
* by constructing COSE (CBOR Object Signing and Encryption) objects that comply with
* the CIP8 message signing specification.
*
* @returns Array of signatures with COSE-formatted signature data and public keys
* @throws Error if required setup validation fails
*/
getBroadcastableSignatures() {
if (!this.signatures.length) {
return [];
}
const signature = this.signatures[0].signature;
const publicKeyHex = this.signatures[0].publicKey.pub;
const { addressCborBytes } = this.validateAndGetCommonSetup();
const { protectedHeaderCborBytes, payloadBytes } = (0, utils_1.createCSLSigStructure)(addressCborBytes, this.payload);
const coseObjectsOutput = (0, utils_1.constructCSLCoseObjects)(protectedHeaderCborBytes, payloadBytes, signature, CardanoSL.PublicKey.from_bytes(Buffer.from(publicKeyHex, 'hex')));
const coseObjectsBuffer = (0, utils_1.coseObjectsOutputToBuffer)(coseObjectsOutput);
return [
{
signature: coseObjectsBuffer,
publicKey: {
pub: publicKeyHex,
},
},
];
}
/**
* Verifies the encoded payload against the provided metadata
* @param messageEncodedHex The hex-encoded message to verify
* @param metadata Metadata containing signer addresses
* @returns True if the encoded payload matches the expected format, false otherwise
*/
async verifyEncodedPayload(messageEncodedHex, metadata) {
if (!metadata) {
throw new Error('Metadata is required for verifying the encoded payload');
}
const signers = metadata.signers;
if (signers.length === 0) {
throw new Error('At least one signer address is required in metadata for verification');
}
this.addSigner(signers[0]);
const signablePayload = await this.getSignablePayload();
let signablePayloadHex;
if (Buffer.isBuffer(signablePayload)) {
signablePayloadHex = signablePayload.toString('hex');
}
else {
signablePayloadHex = signablePayload;
}
return signablePayloadHex === messageEncodedHex;
}
/**
* Validates required fields and returns common setup objects
* @private
*/
validateAndGetCommonSetup() {
if (!this.payload) {
throw new Error('Payload is required to build a CIP8 message');
}
if (!this.signers || this.signers.length === 0) {
throw new Error('A signer address is required to build a CIP8 message');
}
let cslAddress;
try {
cslAddress = CardanoSL.Address.from_bech32(this.signers[0]);
}
catch (error) {
// Convert string errors to proper Error objects
if (typeof error === 'string') {
throw new Error(`Invalid signer address: ${error}`);
}
throw error;
}
const addressCborBytes = cslAddress.to_bytes();
return { addressCborBytes };
}
}
exports.Cip8Message = Cip8Message;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lwOE1lc3NhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL21lc3NhZ2VzL2NpcDgvY2lwOE1lc3NhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQThGO0FBQzlGLG9GQUFzRTtBQUN0RSxtQ0FBb0c7QUFFcEc7O0dBRUc7QUFDSCxNQUFhLFdBQVksU0FBUSxzQkFBVztJQUMxQyxZQUFZLE9BQXVCO1FBQ2pDLEtBQUssQ0FBQztZQUNKLEdBQUcsT0FBTztZQUNWLElBQUksRUFBRSw4QkFBbUIsQ0FBQyxJQUFJO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxrQkFBa0I7UUFDdEIsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDOUQsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsSUFBQSw2QkFBcUIsRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDMUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCwwQkFBMEI7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDL0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBRXRELE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzlELE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFBLDZCQUFxQixFQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6RyxNQUFNLGlCQUFpQixHQUFHLElBQUEsK0JBQXVCLEVBQy9DLHdCQUF3QixFQUN4QixZQUFZLEVBQ1osU0FBUyxFQUNULFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQ2pFLENBQUM7UUFDRixNQUFNLGlCQUFpQixHQUFHLElBQUEsaUNBQXlCLEVBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN2RSxPQUFPO1lBQ0w7Z0JBQ0UsU0FBUyxFQUFFLGlCQUFpQjtnQkFDNUIsU0FBUyxFQUFFO29CQUNULEdBQUcsRUFBRSxZQUFZO2lCQUNsQjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBeUIsRUFBRSxRQUFrQztRQUN0RixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFtQixDQUFDO1FBQzdDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4RCxJQUFJLGtCQUEwQixDQUFDO1FBQy9CLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQ3JDLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUFNLENBQUM7WUFDTixrQkFBa0IsR0FBRyxlQUFlLENBQUM7UUFDdkMsQ0FBQztRQUNELE9BQU8sa0JBQWtCLEtBQUssaUJBQWlCLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxJQUFJLFVBQTZCLENBQUM7UUFDbEMsSUFBSSxDQUFDO1lBQ0gsVUFBVSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGdEQUFnRDtZQUNoRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUEzR0Qsa0NBMkdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZU1lc3NhZ2UsIE1lc3NhZ2VPcHRpb25zLCBNZXNzYWdlU3RhbmRhcmRUeXBlLCBTaWduYXR1cmUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgQ2FyZGFub1NMIGZyb20gJ0BlbXVyZ28vY2FyZGFuby1zZXJpYWxpemF0aW9uLWxpYi1ub2RlanMnO1xuaW1wb3J0IHsgY29uc3RydWN0Q1NMQ29zZU9iamVjdHMsIGNvc2VPYmplY3RzT3V0cHV0VG9CdWZmZXIsIGNyZWF0ZUNTTFNpZ1N0cnVjdHVyZSB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2UgZm9yIENJUDggc3RhbmRhcmRcbiAqL1xuZXhwb3J0IGNsYXNzIENpcDhNZXNzYWdlIGV4dGVuZHMgQmFzZU1lc3NhZ2Uge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNZXNzYWdlT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0eXBlOiBNZXNzYWdlU3RhbmRhcmRUeXBlLkNJUDgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaGFzaCBvZiB0aGUgQ0lQLTggcHJlZml4ZWQgbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgZ2V0U2lnbmFibGVQYXlsb2FkKCk6IFByb21pc2U8c3RyaW5nIHwgQnVmZmVyPiB7XG4gICAgY29uc3QgeyBhZGRyZXNzQ2JvckJ5dGVzIH0gPSB0aGlzLnZhbGlkYXRlQW5kR2V0Q29tbW9uU2V0dXAoKTtcbiAgICBjb25zdCB7IHNpZ1N0cnVjdHVyZUNib3JCeXRlcyB9ID0gY3JlYXRlQ1NMU2lnU3RydWN0dXJlKGFkZHJlc3NDYm9yQnl0ZXMsIHRoaXMucGF5bG9hZCk7XG4gICAgdGhpcy5zaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbShzaWdTdHJ1Y3R1cmVDYm9yQnl0ZXMpO1xuICAgIHJldHVybiB0aGlzLnNpZ25hYmxlUGF5bG9hZDtcbiAgfVxuXG4gIC8qXG4gICAqIFJldHVybnMgYnJvYWRjYXN0YWJsZSBzaWduYXR1cmVzIGluIENPU0UgZm9ybWF0IGFjY29yZGluZyB0byBDSVA4IHN0YW5kYXJkXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgdGhlIGludGVybmFsIHNpZ25hdHVyZXMgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgYnJvYWRjYXN0aW5nXG4gICAqIGJ5IGNvbnN0cnVjdGluZyBDT1NFIChDQk9SIE9iamVjdCBTaWduaW5nIGFuZCBFbmNyeXB0aW9uKSBvYmplY3RzIHRoYXQgY29tcGx5IHdpdGhcbiAgICogdGhlIENJUDggbWVzc2FnZSBzaWduaW5nIHNwZWNpZmljYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNpZ25hdHVyZXMgd2l0aCBDT1NFLWZvcm1hdHRlZCBzaWduYXR1cmUgZGF0YSBhbmQgcHVibGljIGtleXNcbiAgICogQHRocm93cyBFcnJvciBpZiByZXF1aXJlZCBzZXR1cCB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBnZXRCcm9hZGNhc3RhYmxlU2lnbmF0dXJlcygpOiBTaWduYXR1cmVbXSB7XG4gICAgaWYgKCF0aGlzLnNpZ25hdHVyZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5zaWduYXR1cmVzWzBdLnNpZ25hdHVyZTtcbiAgICBjb25zdCBwdWJsaWNLZXlIZXggPSB0aGlzLnNpZ25hdHVyZXNbMF0ucHVibGljS2V5LnB1YjtcblxuICAgIGNvbnN0IHsgYWRkcmVzc0Nib3JCeXRlcyB9ID0gdGhpcy52YWxpZGF0ZUFuZEdldENvbW1vblNldHVwKCk7XG4gICAgY29uc3QgeyBwcm90ZWN0ZWRIZWFkZXJDYm9yQnl0ZXMsIHBheWxvYWRCeXRlcyB9ID0gY3JlYXRlQ1NMU2lnU3RydWN0dXJlKGFkZHJlc3NDYm9yQnl0ZXMsIHRoaXMucGF5bG9hZCk7XG5cbiAgICBjb25zdCBjb3NlT2JqZWN0c091dHB1dCA9IGNvbnN0cnVjdENTTENvc2VPYmplY3RzKFxuICAgICAgcHJvdGVjdGVkSGVhZGVyQ2JvckJ5dGVzLFxuICAgICAgcGF5bG9hZEJ5dGVzLFxuICAgICAgc2lnbmF0dXJlLFxuICAgICAgQ2FyZGFub1NMLlB1YmxpY0tleS5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKHB1YmxpY0tleUhleCwgJ2hleCcpKVxuICAgICk7XG4gICAgY29uc3QgY29zZU9iamVjdHNCdWZmZXIgPSBjb3NlT2JqZWN0c091dHB1dFRvQnVmZmVyKGNvc2VPYmplY3RzT3V0cHV0KTtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBzaWduYXR1cmU6IGNvc2VPYmplY3RzQnVmZmVyLFxuICAgICAgICBwdWJsaWNLZXk6IHtcbiAgICAgICAgICBwdWI6IHB1YmxpY0tleUhleCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZW5jb2RlZCBwYXlsb2FkIGFnYWluc3QgdGhlIHByb3ZpZGVkIG1ldGFkYXRhXG4gICAqIEBwYXJhbSBtZXNzYWdlRW5jb2RlZEhleCBUaGUgaGV4LWVuY29kZWQgbWVzc2FnZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIG1ldGFkYXRhIE1ldGFkYXRhIGNvbnRhaW5pbmcgc2lnbmVyIGFkZHJlc3Nlc1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlbmNvZGVkIHBheWxvYWQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgZm9ybWF0LCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGFzeW5jIHZlcmlmeUVuY29kZWRQYXlsb2FkKG1lc3NhZ2VFbmNvZGVkSGV4OiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIW1ldGFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGFkYXRhIGlzIHJlcXVpcmVkIGZvciB2ZXJpZnlpbmcgdGhlIGVuY29kZWQgcGF5bG9hZCcpO1xuICAgIH1cbiAgICBjb25zdCBzaWduZXJzID0gbWV0YWRhdGEuc2lnbmVycyBhcyBzdHJpbmdbXTtcbiAgICBpZiAoc2lnbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXQgbGVhc3Qgb25lIHNpZ25lciBhZGRyZXNzIGlzIHJlcXVpcmVkIGluIG1ldGFkYXRhIGZvciB2ZXJpZmljYXRpb24nKTtcbiAgICB9XG4gICAgdGhpcy5hZGRTaWduZXIoc2lnbmVyc1swXSk7XG4gICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gYXdhaXQgdGhpcy5nZXRTaWduYWJsZVBheWxvYWQoKTtcbiAgICBsZXQgc2lnbmFibGVQYXlsb2FkSGV4OiBzdHJpbmc7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzaWduYWJsZVBheWxvYWQpKSB7XG4gICAgICBzaWduYWJsZVBheWxvYWRIZXggPSBzaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWduYWJsZVBheWxvYWRIZXggPSBzaWduYWJsZVBheWxvYWQ7XG4gICAgfVxuICAgIHJldHVybiBzaWduYWJsZVBheWxvYWRIZXggPT09IG1lc3NhZ2VFbmNvZGVkSGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyByZXF1aXJlZCBmaWVsZHMgYW5kIHJldHVybnMgY29tbW9uIHNldHVwIG9iamVjdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVBbmRHZXRDb21tb25TZXR1cCgpIHtcbiAgICBpZiAoIXRoaXMucGF5bG9hZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXlsb2FkIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgQ0lQOCBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zaWduZXJzIHx8IHRoaXMuc2lnbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzaWduZXIgYWRkcmVzcyBpcyByZXF1aXJlZCB0byBidWlsZCBhIENJUDggbWVzc2FnZScpO1xuICAgIH1cblxuICAgIGxldCBjc2xBZGRyZXNzOiBDYXJkYW5vU0wuQWRkcmVzcztcbiAgICB0cnkge1xuICAgICAgY3NsQWRkcmVzcyA9IENhcmRhbm9TTC5BZGRyZXNzLmZyb21fYmVjaDMyKHRoaXMuc2lnbmVyc1swXSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIENvbnZlcnQgc3RyaW5nIGVycm9ycyB0byBwcm9wZXIgRXJyb3Igb2JqZWN0c1xuICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpZ25lciBhZGRyZXNzOiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkcmVzc0Nib3JCeXRlcyA9IGNzbEFkZHJlc3MudG9fYnl0ZXMoKTtcbiAgICByZXR1cm4geyBhZGRyZXNzQ2JvckJ5dGVzIH07XG4gIH1cbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!