PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/src/bitgo
Просмотр файла: PsbtUtil.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProprietaryKeySubtype = exports.PSBT_PROPRIETARY_IDENTIFIER = void 0;
exports.getPsbtInputProprietaryKeyVals = getPsbtInputProprietaryKeyVals;
exports.getPsbtInputSignatureCount = getPsbtInputSignatureCount;
exports.isPsbtInputFinalized = isPsbtInputFinalized;
exports.isPsbt = isPsbt;
exports.toPsbtBuffer = toPsbtBuffer;
exports.withUnsafeNonSegwit = withUnsafeNonSegwit;
const proprietaryKeyVal_1 = require("bip174/src/lib/proprietaryKeyVal");
/**
* bitgo proprietary key identifier
*/
exports.PSBT_PROPRIETARY_IDENTIFIER = 'BITGO';
/**
* subtype for proprietary keys that bitgo uses
*/
var ProprietaryKeySubtype;
(function (ProprietaryKeySubtype) {
ProprietaryKeySubtype[ProprietaryKeySubtype["ZEC_CONSENSUS_BRANCH_ID"] = 0] = "ZEC_CONSENSUS_BRANCH_ID";
ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PARTICIPANT_PUB_KEYS"] = 1] = "MUSIG2_PARTICIPANT_PUB_KEYS";
ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PUB_NONCE"] = 2] = "MUSIG2_PUB_NONCE";
ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PARTIAL_SIG"] = 3] = "MUSIG2_PARTIAL_SIG";
})(ProprietaryKeySubtype || (exports.ProprietaryKeySubtype = ProprietaryKeySubtype = {}));
/**
* Search any data from psbt proprietary key value against keydata.
* Default identifierEncoding is utf-8 for identifier.
*/
function getPsbtInputProprietaryKeyVals(input, keySearch) {
if (!input.unknownKeyVals?.length) {
return [];
}
if (keySearch && keySearch.subtype === undefined && Buffer.isBuffer(keySearch.keydata)) {
throw new Error('invalid proprietary key search filter combination. subtype is required');
}
const keyVals = input.unknownKeyVals.map(({ key, value }, i) => {
return { key: (0, proprietaryKeyVal_1.decodeProprietaryKey)(key), value };
});
return keyVals.filter((keyVal) => {
return (keySearch === undefined ||
(keySearch.identifier === keyVal.key.identifier &&
(keySearch.subtype === undefined ||
(keySearch.subtype === keyVal.key.subtype &&
(!Buffer.isBuffer(keySearch.keydata) || keySearch.keydata.equals(keyVal.key.keydata))))));
});
}
/**
* @return partialSig/tapScriptSig/MUSIG2_PARTIAL_SIG count iff input is not finalized
*/
function getPsbtInputSignatureCount(input) {
if (isPsbtInputFinalized(input)) {
throw new Error('Input is already finalized');
}
return Math.max(Array.isArray(input.partialSig) ? input.partialSig.length : 0, Array.isArray(input.tapScriptSig) ? input.tapScriptSig.length : 0, getPsbtInputProprietaryKeyVals(input, {
identifier: exports.PSBT_PROPRIETARY_IDENTIFIER,
subtype: ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
}).length);
}
/**
* @return true iff PSBT input is finalized
*/
function isPsbtInputFinalized(input) {
return Buffer.isBuffer(input.finalScriptSig) || Buffer.isBuffer(input.finalScriptWitness);
}
/**
* @return true iff data starts with magic PSBT byte sequence
* @param data byte array or hex string
* */
function isPsbt(data) {
// https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki#specification
// 0x70736274 - ASCII for 'psbt'. 0xff - separator
if (typeof data === 'string') {
if (data.length < 10) {
return false;
}
data = Buffer.from(data.slice(0, 10), 'hex');
}
return 5 <= data.length && data.readUInt32BE(0) === 0x70736274 && data.readUInt8(4) === 0xff;
}
/**
* First checks if the input is already a buffer that starts with the magic PSBT byte sequence.
* If not, it checks if the input is a base64- or hex-encoded string that starts with PSBT header.
*
* This function is useful when reading a file that could be in any of the above formats or when
* dealing with a request that could contain a hex or base64 encoded PSBT.
*
* @param data
* @return buffer that starts with the magic PSBT byte sequence
* @throws Error when conversion is not possible
*/
function toPsbtBuffer(data) {
if (Buffer.isBuffer(data)) {
// we are dealing with a buffer that looks like a psbt already
if (isPsbt(data)) {
return data;
}
// we could be dealing with a buffer that could be a hex or base64 encoded psbt
data = data.toString('ascii');
}
if (typeof data === 'string') {
const encodings = ['hex', 'base64'];
for (const encoding of encodings) {
let buffer;
try {
buffer = Buffer.from(data, encoding);
}
catch (e) {
continue;
}
if (isPsbt(buffer)) {
return buffer;
}
}
throw new Error(`data is not in any of the following formats: ${encodings.join(', ')}`);
}
throw new Error('data must be a buffer or a string');
}
/**
* This function allows signing or validating a psbt with non-segwit inputs those do not contain nonWitnessUtxo.
*/
function withUnsafeNonSegwit(psbt, fn, unsafe = true) {
psbt.__CACHE.__UNSAFE_SIGN_NONSEGWIT = unsafe;
psbt.__CACHE.__WARN_UNSAFE_SIGN_NONSEGWIT = !unsafe;
try {
return fn();
}
finally {
psbt.__CACHE.__UNSAFE_SIGN_NONSEGWIT = false;
psbt.__CACHE.__WARN_UNSAFE_SIGN_NONSEGWIT = true;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHNidFV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vUHNidFV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBNENBLHdFQXNCQztBQUtELGdFQVlDO0FBS0Qsb0RBRUM7QUFNRCx3QkFVQztBQWFELG9DQTZCQztBQUtELGtEQVNDO0FBbEtELHdFQUF3RjtBQUl4Rjs7R0FFRztBQUNVLFFBQUEsMkJBQTJCLEdBQUcsT0FBTyxDQUFDO0FBRW5EOztHQUVHO0FBQ0gsSUFBWSxxQkFLWDtBQUxELFdBQVkscUJBQXFCO0lBQy9CLHVHQUE4QixDQUFBO0lBQzlCLCtHQUFrQyxDQUFBO0lBQ2xDLHlGQUF1QixDQUFBO0lBQ3ZCLDZGQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMVyxxQkFBcUIscUNBQXJCLHFCQUFxQixRQUtoQztBQXVCRDs7O0dBR0c7QUFDSCxTQUFnQiw4QkFBOEIsQ0FDNUMsS0FBZ0IsRUFDaEIsU0FBZ0M7SUFFaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDbEMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN2RixNQUFNLElBQUksS0FBSyxDQUFDLHdFQUF3RSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFBLHdDQUFvQixFQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FB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UyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBVSxDQUFDO1FBQzdDLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxNQUFjLENBQUM7WUFDbkIsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBSSxJQUFVLEVBQUUsRUFBVyxFQUFFLE1BQU0sR0FBRyxJQUFJO0lBQzFFLElBQVksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0lBQ3RELElBQVksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDN0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNkLENBQUM7WUFBUyxDQUFDO1FBQ1IsSUFBWSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDckQsSUFBWSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUM7SUFDNUQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWNvZGVQcm9wcmlldGFyeUtleSwgUHJvcHJpZXRhcnlLZXkgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9wcm9wcmlldGFyeUtleVZhbCc7XG5pbXBvcnQgeyBQc2J0SW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBzYnQgfSBmcm9tICdiaXRjb2luanMtbGliL3NyYy9wc2J0JztcblxuLyoqXG4gKiBiaXRnbyBwcm9wcmlldGFyeSBrZXkgaWRlbnRpZmllclxuICovXG5leHBvcnQgY29uc3QgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSID0gJ0JJVEdPJztcblxuLyoqXG4gKiBzdWJ0eXBlIGZvciBwcm9wcmlldGFyeSBrZXlzIHRoYXQgYml0Z28gdXNlc1xuICovXG5leHBvcnQgZW51bSBQcm9wcmlldGFyeUtleVN1YnR5cGUge1xuICBaRUNfQ09OU0VOU1VTX0JSQU5DSF9JRCA9IDB4MDAsXG4gIE1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyA9IDB4MDEsXG4gIE1VU0lHMl9QVUJfTk9OQ0UgPSAweDAyLFxuICBNVVNJRzJfUEFSVElBTF9TSUcgPSAweDAzLFxufVxuXG4vKipcbiAqIFBzYnQgcHJvcHJpZXRhcnkga2V5ZGF0YSBvYmplY3QuXG4gKiA8Y29tcGFjdCBzaXplIHVpbnQgaWRlbnRpZmllciBsZW5ndGg+IDxieXRlcyBpZGVudGlmaWVyPiA8Y29tcGFjdCBzaXplIHVpbnQgc3VidHlwZT4gPGJ5dGVzIHN1YmtleWRhdGE+XG4gKiA9PiA8Ynl0ZXMgdmFsdWVkYXRhPlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ByaWV0YXJ5S2V5VmFsdWUge1xuICBrZXk6IFByb3ByaWV0YXJ5S2V5O1xuICB2YWx1ZTogQnVmZmVyO1xufVxuXG4vKipcbiAqIFBzYnQgcHJvcHJpZXRhcnkga2V5ZGF0YSBvYmplY3Qgc2VhcmNoIGZpZWxkcy5cbiAqIDxjb21wYWN0IHNpemUgdWludCBpZGVudGlmaWVyIGxlbmd0aD4gPGJ5dGVzIGlkZW50aWZpZXI+IDxjb21wYWN0IHNpemUgdWludCBzdWJ0eXBlPiA8Ynl0ZXMgc3Via2V5ZGF0YT5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wcmlldGFyeUtleVNlYXJjaCB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgc3VidHlwZT86IG51bWJlcjtcbiAga2V5ZGF0YT86IEJ1ZmZlcjtcbiAgaWRlbnRpZmllckVuY29kaW5nPzogQnVmZmVyRW5jb2Rpbmc7XG59XG5cbi8qKlxuICogU2VhcmNoIGFueSBkYXRhIGZyb20gcHNidCBwcm9wcmlldGFyeSBrZXkgdmFsdWUgYWdhaW5zdCBrZXlkYXRhLlxuICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMoXG4gIGlucHV0OiBQc2J0SW5wdXQsXG4gIGtleVNlYXJjaD86IFByb3ByaWV0YXJ5S2V5U2VhcmNoXG4pOiBQcm9wcmlldGFyeUtleVZhbHVlW10ge1xuICBpZiAoIWlucHV0LnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKGtleVNlYXJjaCAmJiBrZXlTZWFyY2guc3VidHlwZSA9PT0gdW5kZWZpbmVkICYmIEJ1ZmZlci5pc0J1ZmZlcihrZXlTZWFyY2gua2V5ZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJvcHJpZXRhcnkga2V5IHNlYXJjaCBmaWx0ZXIgY29tYmluYXRpb24uIHN1YnR5cGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBjb25zdCBrZXlWYWxzID0gaW5wdXQudW5rbm93bktleVZhbHMubWFwKCh7IGtleSwgdmFsdWUgfSwgaSkgPT4ge1xuICAgIHJldHVybiB7IGtleTogZGVjb2RlUHJvcHJpZXRhcnlLZXkoa2V5KSwgdmFsdWUgfTtcbiAgfSk7XG4gIHJldHVybiBrZXlWYWxzLmZpbHRlcigoa2V5VmFsKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGtleVNlYXJjaCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAoa2V5U2VhcmNoLmlkZW50aWZpZXIgPT09IGtleVZhbC5rZXkuaWRlbnRpZmllciAmJlxuICAgICAgICAoa2V5U2VhcmNoLnN1YnR5cGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChrZXlTZWFyY2guc3VidHlwZSA9PT0ga2V5VmFsLmtleS5zdWJ0eXBlICYmXG4gICAgICAgICAgICAoIUJ1ZmZlci5pc0J1ZmZlcihrZXlTZWFyY2gua2V5ZGF0YSkgfHwga2V5U2VhcmNoLmtleWRhdGEuZXF1YWxzKGtleVZhbC5rZXkua2V5ZGF0YSkpKSkpXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQHJldHVybiBwYXJ0aWFsU2lnL3RhcFNjcmlwdFNpZy9NVVNJRzJfUEFSVElBTF9TSUcgY291bnQgaWZmIGlucHV0IGlzIG5vdCBmaW5hbGl6ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50KGlucHV0OiBQc2J0SW5wdXQpOiBudW1iZXIge1xuICBpZiAoaXNQc2J0SW5wdXRGaW5hbGl6ZWQoaW5wdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBpcyBhbHJlYWR5IGZpbmFsaXplZCcpO1xuICB9XG4gIHJldHVybiBNYXRoLm1heChcbiAgICBBcnJheS5pc0FycmF5KGlucHV0LnBhcnRpYWxTaWcpID8gaW5wdXQucGFydGlhbFNpZy5sZW5ndGggOiAwLFxuICAgIEFycmF5LmlzQXJyYXkoaW5wdXQudGFwU2NyaXB0U2lnKSA/IGlucHV0LnRhcFNjcmlwdFNpZy5sZW5ndGggOiAwLFxuICAgIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwge1xuICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICB9KS5sZW5ndGhcbiAgKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHRydWUgaWZmIFBTQlQgaW5wdXQgaXMgZmluYWxpemVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BzYnRJbnB1dEZpbmFsaXplZChpbnB1dDogUHNidElucHV0KTogYm9vbGVhbiB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoaW5wdXQuZmluYWxTY3JpcHRTaWcpIHx8IEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC5maW5hbFNjcmlwdFdpdG5lc3MpO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZmYgZGF0YSBzdGFydHMgd2l0aCBtYWdpYyBQU0JUIGJ5dGUgc2VxdWVuY2VcbiAqIEBwYXJhbSBkYXRhIGJ5dGUgYXJyYXkgb3IgaGV4IHN0cmluZ1xuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BzYnQoZGF0YTogQnVmZmVyIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAxNzQubWVkaWF3aWtpI3NwZWNpZmljYXRpb25cbiAgLy8gMHg3MDczNjI3NCAtIEFTQ0lJIGZvciAncHNidCcuIDB4ZmYgLSBzZXBhcmF0b3JcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IDEwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLnNsaWNlKDAsIDEwKSwgJ2hleCcpO1xuICB9XG4gIHJldHVybiA1IDw9IGRhdGEubGVuZ3RoICYmIGRhdGEucmVhZFVJbnQzMkJFKDApID09PSAweDcwNzM2Mjc0ICYmIGRhdGEucmVhZFVJbnQ4KDQpID09PSAweGZmO1xufVxuXG4vKipcbiAqIEZpcnN0IGNoZWNrcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBhIGJ1ZmZlciB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBtYWdpYyBQU0JUIGJ5dGUgc2VxdWVuY2UuXG4gKiBJZiBub3QsIGl0IGNoZWNrcyBpZiB0aGUgaW5wdXQgaXMgYSBiYXNlNjQtIG9yIGhleC1lbmNvZGVkIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIFBTQlQgaGVhZGVyLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4gcmVhZGluZyBhIGZpbGUgdGhhdCBjb3VsZCBiZSBpbiBhbnkgb2YgdGhlIGFib3ZlIGZvcm1hdHMgb3Igd2hlblxuICogZGVhbGluZyB3aXRoIGEgcmVxdWVzdCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBoZXggb3IgYmFzZTY0IGVuY29kZWQgUFNCVC5cbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybiBidWZmZXIgdGhhdCBzdGFydHMgd2l0aCB0aGUgbWFnaWMgUFNCVCBieXRlIHNlcXVlbmNlXG4gKiBAdGhyb3dzIEVycm9yIHdoZW4gY29udmVyc2lvbiBpcyBub3QgcG9zc2libGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHNidEJ1ZmZlcihkYXRhOiBCdWZmZXIgfCBzdHJpbmcpOiBCdWZmZXIge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgLy8gd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJ1ZmZlciB0aGF0IGxvb2tzIGxpa2UgYSBwc2J0IGFscmVhZHlcbiAgICBpZiAoaXNQc2J0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvLyB3ZSBjb3VsZCBiZSBkZWFsaW5nIHdpdGggYSBidWZmZXIgdGhhdCBjb3VsZCBiZSBhIGhleCBvciBiYXNlNjQgZW5jb2RlZCBwc2J0XG4gICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoJ2FzY2lpJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZW5jb2RpbmdzID0gWydoZXgnLCAnYmFzZTY0J10gYXMgY29uc3Q7XG4gICAgZm9yIChjb25zdCBlbmNvZGluZyBvZiBlbmNvZGluZ3MpIHtcbiAgICAgIGxldCBidWZmZXI6IEJ1ZmZlcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGRhdGEsIGVuY29kaW5nKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNQc2J0KGJ1ZmZlcikpIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRhdGEgaXMgbm90IGluIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6ICR7ZW5jb2RpbmdzLmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGEgbXVzdCBiZSBhIGJ1ZmZlciBvciBhIHN0cmluZycpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHNpZ25pbmcgb3IgdmFsaWRhdGluZyBhIHBzYnQgd2l0aCBub24tc2Vnd2l0IGlucHV0cyB0aG9zZSBkbyBub3QgY29udGFpbiBub25XaXRuZXNzVXR4by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhVbnNhZmVOb25TZWd3aXQ8VD4ocHNidDogUHNidCwgZm46ICgpID0+IFQsIHVuc2FmZSA9IHRydWUpOiBUIHtcbiAgKHBzYnQgYXMgYW55KS5fX0NBQ0hFLl9fVU5TQUZFX1NJR05fTk9OU0VHV0lUID0gdW5zYWZlO1xuICAocHNidCBhcyBhbnkpLl9fQ0FDSEUuX19XQVJOX1VOU0FGRV9TSUdOX05PTlNFR1dJVCA9ICF1bnNhZmU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgKHBzYnQgYXMgYW55KS5fX0NBQ0hFLl9fVU5TQUZFX1NJR05fTk9OU0VHV0lUID0gZmFsc2U7XG4gICAgKHBzYnQgYXMgYW55KS5fX0NBQ0hFLl9fV0FSTl9VTlNBRkVfU0lHTl9OT05TRUdXSVQgPSB0cnVlO1xuICB9XG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!