PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/unspents/dist/test
Просмотр файла: testutils.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;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getOutputDimensionsForUnspentType = exports.getInputDimensionsForUnspentType = exports.UnspentTypeOpReturn = exports.UnspentTypePubKeyHash = exports.UnspentTypeScript2of3 = exports.UnspentTypeP2shP2pk = void 0;
exports.getInputScriptTypes = getInputScriptTypes;
exports.constructPsbt = constructPsbt;
exports.getSignedTransaction = getSignedTransaction;
const unspents = __importStar(require("../src"));
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const assert_1 = __importDefault(require("assert"));
const txGen_1 = require("./signedTx/txGen");
/**
* makeEnum('a', 'b') returns `{ a: 'a', b: 'b' }`
*
* @param args
* @return map with string keys and symbol values
*/
const makeEnum = (...args) => args.reduce((obj, key) => Object.assign(obj, { [key]: key }), {});
exports.UnspentTypeP2shP2pk = 'p2shP2pk';
// p2trMusig2 is assumed to be script path only. taprootKeyPathSpend is for p2trMusig2 key path
exports.UnspentTypeScript2of3 = makeEnum('p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2', 'taprootKeyPathSpend');
exports.UnspentTypePubKeyHash = makeEnum('p2pkh', 'p2wpkh');
class UnspentTypeOpReturn {
constructor(size) {
this.size = size;
}
toString() {
return `opReturn(${this.size})`;
}
}
exports.UnspentTypeOpReturn = UnspentTypeOpReturn;
function getInputScriptTypes() {
return [...utxolib.bitgo.outputScripts.scriptTypes2Of3, 'p2shP2pk', 'taprootKeyPathSpend'];
}
/**
* Return the input dimensions based on unspent type
* @param unspentType - one of UnspentTypeScript2of3
* @return Dimensions
*/
const getInputDimensionsForUnspentType = (unspentType) => {
switch (unspentType) {
case exports.UnspentTypeScript2of3.p2sh:
return unspents.Dimensions.sum({ nP2shInputs: 1 });
case exports.UnspentTypeScript2of3.p2shP2wsh:
return unspents.Dimensions.sum({ nP2shP2wshInputs: 1 });
case exports.UnspentTypeScript2of3.p2wsh:
return unspents.Dimensions.sum({ nP2wshInputs: 1 });
case exports.UnspentTypeScript2of3.p2tr:
case exports.UnspentTypeScript2of3.p2trMusig2:
return unspents.Dimensions.sum({ nP2trScriptPathLevel1Inputs: 1 });
case exports.UnspentTypeScript2of3.taprootKeyPathSpend:
return unspents.Dimensions.sum({ nP2trKeypathInputs: 1 });
case exports.UnspentTypeP2shP2pk:
return unspents.Dimensions.sum({ nP2shP2pkInputs: 1 });
}
throw new Error(`no input dimensions for ${unspentType}`);
};
exports.getInputDimensionsForUnspentType = getInputDimensionsForUnspentType;
const getOutputDimensionsForUnspentType = (unspentType) => {
/* The values here are validated in the test 'calculates output dimensions dynamically' */
switch (unspentType) {
case exports.UnspentTypeScript2of3.p2sh:
case exports.UnspentTypeScript2of3.p2shP2wsh:
case exports.UnspentTypeP2shP2pk:
return unspents.Dimensions.fromOutputScriptLength(23);
case exports.UnspentTypeScript2of3.p2wsh:
return unspents.Dimensions.fromOutputScriptLength(34);
case exports.UnspentTypeScript2of3.p2tr:
case exports.UnspentTypeScript2of3.p2trMusig2:
case exports.UnspentTypeScript2of3.taprootKeyPathSpend:
return unspents.Dimensions.fromOutputScriptLength(34);
case exports.UnspentTypePubKeyHash.p2pkh:
return unspents.Dimensions.fromOutputScriptLength(25);
case exports.UnspentTypePubKeyHash.p2wpkh:
return unspents.Dimensions.fromOutputScriptLength(22);
default:
if (unspentType instanceof UnspentTypeOpReturn) {
return unspents.Dimensions.fromOutputScriptLength(1 + unspentType.size);
}
throw new TypeError(`unknown unspentType ${unspentType}`);
}
};
exports.getOutputDimensionsForUnspentType = getOutputDimensionsForUnspentType;
function getDefaultSignerNames(inputType, signers) {
if (signers) {
return [signers.signerName, signers.cosignerName];
}
if (inputType === 'p2shP2pk') {
return ['user'];
}
if (inputType === 'p2trMusig2') {
return ['user', 'backup'];
}
return ['user', 'bitgo'];
}
function constructPsbt(keys, inputTypes, outputTypes, signatureStatus, signers) {
const psbt = utxolib.bitgo.createPsbtForNetwork({ network: utxolib.networks.bitcoin });
inputTypes.forEach((t, i) => {
if (t === 'p2shP2pk') {
const signer = keys[getDefaultSignerNames(t, signers)[0]];
const unspent = utxolib.testutil.mockReplayProtectionUnspent(utxolib.networks.bitcoin, BigInt(10), {
key: signer,
vout: i,
});
const { redeemScript } = utxolib.bitgo.outputScripts.createOutputScriptP2shP2pk(signer.publicKey);
assert_1.default.ok(redeemScript);
utxolib.bitgo.addReplayProtectionUnspentToPsbt(psbt, unspent, redeemScript);
}
else {
const unspent = utxolib.testutil.mockWalletUnspent(utxolib.networks.bitcoin, BigInt(10), {
keys,
chain: utxolib.bitgo.getExternalChainCode(t === 'taprootKeyPathSpend' ? 'p2trMusig2' : t),
vout: i,
index: i,
});
const signerNames = getDefaultSignerNames(t, signers);
utxolib.bitgo.addWalletUnspentToPsbt(psbt, unspent, keys, signerNames[0], signerNames[1]);
}
});
outputTypes.forEach((t, index) => {
psbt.addOutput({
script: (0, txGen_1.createScriptPubKey)(keys.triple, t),
value: BigInt(10),
});
});
if (signatureStatus === 'unsigned') {
return psbt;
}
psbt.setAllInputsMusig2NonceHD(keys['user']);
psbt.setAllInputsMusig2NonceHD(keys['bitgo']);
inputTypes.forEach((t, i) => {
const signerNames = getDefaultSignerNames(t, signers);
if (t === 'p2shP2pk') {
if (signatureStatus === 'fullysigned') {
psbt.signInput(i, keys[signerNames[0]]);
}
}
else {
psbt.signInputHD(i, keys[signerNames[0]]);
if (signatureStatus === 'fullysigned') {
psbt.signInputHD(i, keys[signerNames[1]]);
}
}
});
if (signatureStatus === 'fullysigned') {
assert_1.default.ok(psbt.validateSignaturesOfAllInputs());
}
return psbt;
}
function getSignedTransaction(keys, signerName, cosignerName, inputTypes, outputTypes) {
const psbt = constructPsbt(keys, inputTypes, outputTypes, 'fullysigned', { signerName, cosignerName });
psbt.finalizeAllInputs();
return psbt.extractTransaction().clone('number');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdHV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC90ZXN0dXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkNBLGtEQUVDO0FBbUVELHNDQThEQztBQUVELG9EQVVDO0FBNUxELGlEQUFtQztBQUNuQyx5REFBMkM7QUFDM0Msb0RBQTRCO0FBQzVCLDRDQUFzRDtBQUV0RDs7Ozs7R0FLRztBQUNILE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFjLEVBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVsRyxRQUFBLG1CQUFtQixHQUFHLFVBQVUsQ0FBQztBQUU5QywrRkFBK0Y7QUFDbEYsUUFBQSxxQkFBcUIsR0FPOUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUUzRSxRQUFBLHFCQUFxQixHQUc5QixRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBSWhDLE1BQWEsbUJBQW1CO0lBRTlCLFlBQVksSUFBWTtRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sWUFBWSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBVEQsa0RBU0M7QUFJRCxTQUFnQixtQkFBbUI7SUFDakMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLFVBQVUsRUFB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QixXQUE4QjtJQUU5QixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDdkcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDekIsT0FBUSxJQUFJLENBQUMsa0JBQWtCLEVBQTRDLENBQUMsS0FBSyxDQUFTLFFBQVEsQ0FBQyxDQUFDO0FBQ3RHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1bnNwZW50cyBmcm9tICcuLi9zcmMnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY3JlYXRlU2NyaXB0UHViS2V5IH0gZnJvbSAnLi9zaWduZWRUeC90eEdlbic7XG5cbi8qKlxuICogbWFrZUVudW0oJ2EnLCAnYicpIHJldHVybnMgYHsgYTogJ2EnLCBiOiAnYicgfWBcbiAqXG4gKiBAcGFyYW0gYXJnc1xuICogQHJldHVybiBtYXAgd2l0aCBzdHJpbmcga2V5cyBhbmQgc3ltYm9sIHZhbHVlc1xuICovXG5jb25zdCBtYWtlRW51bSA9ICguLi5hcmdzOiBzdHJpbmdbXSk6IGFueSA9PiBhcmdzLnJlZHVjZSgob2JqLCBrZXkpID0+IE9iamVjdC5hc3NpZ24ob2JqLCB7IFtrZXldOiBrZXkgfSksIHt9KTtcblxuZXhwb3J0IGNvbnN0IFVuc3BlbnRUeXBlUDJzaFAycGsgPSAncDJzaFAycGsnO1xuXG4vLyBwMnRyTXVzaWcyIGlzIGFzc3VtZWQgdG8gYmUgc2NyaXB0IHBhdGggb25seS4gdGFwcm9vdEtleVBhdGhTcGVuZCBpcyBmb3IgcDJ0ck11c2lnMiBrZXkgcGF0aFxuZXhwb3J0IGNvbnN0IFVuc3BlbnRUeXBlU2NyaXB0Mm9mMzoge1xuICBwMnNoOiBzdHJpbmc7XG4gIHAyc2hQMndzaDogc3RyaW5nO1xuICBwMndzaDogc3RyaW5nO1xuICBwMnRyOiBzdHJpbmc7XG4gIHAydHJNdXNpZzI6IHN0cmluZztcbiAgdGFwcm9vdEtleVBhdGhTcGVuZDogc3RyaW5nO1xufSA9IG1ha2VFbnVtKCdwMnNoJywgJ3Ayc2hQMndzaCcsICdwMndzaCcsICdwMnRyJywgJ3AydHJNdXNpZzInLCAndGFwcm9vdEtleVBhdGhTcGVuZCcpO1xuXG5leHBvcnQgY29uc3QgVW5zcGVudFR5cGVQdWJLZXlIYXNoOiB7XG4gIHAycGtoOiAncDJwa2gnO1xuICBwMndwa2g6ICdwMndwa2gnO1xufSA9IG1ha2VFbnVtKCdwMnBraCcsICdwMndwa2gnKTtcblxuZXhwb3J0IHR5cGUgVGVzdFVuc3BlbnRUeXBlID0gc3RyaW5nIHwgVW5zcGVudFR5cGVPcFJldHVybjtcblxuZXhwb3J0IGNsYXNzIFVuc3BlbnRUeXBlT3BSZXR1cm4ge1xuICBwdWJsaWMgc2l6ZTogbnVtYmVyO1xuICBjb25zdHJ1Y3RvcihzaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLnNpemUgPSBzaXplO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBvcFJldHVybigke3RoaXMuc2l6ZX0pYDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBJbnB1dFNjcmlwdFR5cGUgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZSB8ICd0YXByb290S2V5UGF0aFNwZW5kJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldElucHV0U2NyaXB0VHlwZXMoKTogSW5wdXRTY3JpcHRUeXBlW10ge1xuICByZXR1cm4gWy4uLnV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjMsICdwMnNoUDJwaycsICd0YXByb290S2V5UGF0aFNwZW5kJ107XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBpbnB1dCBkaW1lbnNpb25zIGJhc2VkIG9uIHVuc3BlbnQgdHlwZVxuICogQHBhcmFtIHVuc3BlbnRUeXBlIC0gb25lIG9mIFVuc3BlbnRUeXBlU2NyaXB0Mm9mM1xuICogQHJldHVybiBEaW1lbnNpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRJbnB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSA9ICh1bnNwZW50VHlwZTogVGVzdFVuc3BlbnRUeXBlKTogdW5zcGVudHMuRGltZW5zaW9ucyA9PiB7XG4gIHN3aXRjaCAodW5zcGVudFR5cGUpIHtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnNoOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuc3VtKHsgblAyc2hJbnB1dHM6IDEgfSk7XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJzaFAyd3NoOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuc3VtKHsgblAyc2hQMndzaElucHV0czogMSB9KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMndzaDpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLnN1bSh7IG5QMndzaElucHV0czogMSB9KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnRyOlxuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHJNdXNpZzI6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5zdW0oeyBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDEgfSk7XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMudGFwcm9vdEtleVBhdGhTcGVuZDpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLnN1bSh7IG5QMnRyS2V5cGF0aElucHV0czogMSB9KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlUDJzaFAycGs6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5zdW0oeyBuUDJzaFAycGtJbnB1dHM6IDEgfSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBubyBpbnB1dCBkaW1lbnNpb25zIGZvciAke3Vuc3BlbnRUeXBlfWApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE91dHB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSA9ICh1bnNwZW50VHlwZTogVGVzdFVuc3BlbnRUeXBlKTogdW5zcGVudHMuRGltZW5zaW9ucyA9PiB7XG4gIC8qIFRoZSB2YWx1ZXMgaGVyZSBhcmUgdmFsaWRhdGVkIGluIHRoZSB0ZXN0ICdjYWxjdWxhdGVzIG91dHB1dCBkaW1lbnNpb25zIGR5bmFtaWNhbGx5JyAqL1xuICBzd2l0Y2ggKHVuc3BlbnRUeXBlKSB7XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJzaDpcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnNoUDJ3c2g6XG4gICAgY2FzZSBVbnNwZW50VHlwZVAyc2hQMnBrOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aCgyMyk7XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJ3c2g6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5mcm9tT3V0cHV0U2NyaXB0TGVuZ3RoKDM0KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnRyOlxuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHJNdXNpZzI6XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMudGFwcm9vdEtleVBhdGhTcGVuZDpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLmZyb21PdXRwdXRTY3JpcHRMZW5ndGgoMzQpO1xuICAgIGNhc2UgVW5zcGVudFR5cGVQdWJLZXlIYXNoLnAycGtoOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aCgyNSk7XG4gICAgY2FzZSBVbnNwZW50VHlwZVB1YktleUhhc2gucDJ3cGtoOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aCgyMik7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh1bnNwZW50VHlwZSBpbnN0YW5jZW9mIFVuc3BlbnRUeXBlT3BSZXR1cm4pIHtcbiAgICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aCgxICsgdW5zcGVudFR5cGUuc2l6ZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGB1bmtub3duIHVuc3BlbnRUeXBlICR7dW5zcGVudFR5cGV9YCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRTaWduZXJOYW1lcyhcbiAgaW5wdXRUeXBlOiBJbnB1dFNjcmlwdFR5cGUsXG4gIHNpZ25lcnM/OiB7IHNpZ25lck5hbWU6IHV0eG9saWIuYml0Z28uS2V5TmFtZTsgY29zaWduZXJOYW1lOiB1dHhvbGliLmJpdGdvLktleU5hbWUgfVxuKTogdXR4b2xpYi5iaXRnby5LZXlOYW1lW10ge1xuICBpZiAoc2lnbmVycykge1xuICAgIHJldHVybiBbc2lnbmVycy5zaWduZXJOYW1lLCBzaWduZXJzLmNvc2lnbmVyTmFtZV07XG4gIH1cbiAgaWYgKGlucHV0VHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgIHJldHVybiBbJ3VzZXInXTtcbiAgfVxuICBpZiAoaW5wdXRUeXBlID09PSAncDJ0ck11c2lnMicpIHtcbiAgICByZXR1cm4gWyd1c2VyJywgJ2JhY2t1cCddO1xuICB9XG4gIHJldHVybiBbJ3VzZXInLCAnYml0Z28nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdFBzYnQoXG4gIGtleXM6IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMsXG4gIGlucHV0VHlwZXM6IElucHV0U2NyaXB0VHlwZVtdLFxuICBvdXRwdXRUeXBlczogVGVzdFVuc3BlbnRUeXBlW10sXG4gIHNpZ25hdHVyZVN0YXR1czogJ3Vuc2lnbmVkJyB8ICdoYWxmc2lnbmVkJyB8ICdmdWxseXNpZ25lZCcsXG4gIHNpZ25lcnM/OiB7IHNpZ25lck5hbWU6IHV0eG9saWIuYml0Z28uS2V5TmFtZTsgY29zaWduZXJOYW1lOiB1dHhvbGliLmJpdGdvLktleU5hbWUgfVxuKTogdXR4b2xpYi5iaXRnby5VdHhvUHNidDx1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+PiB7XG4gIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luIH0pO1xuXG4gIGlucHV0VHlwZXMuZm9yRWFjaCgodCwgaSkgPT4ge1xuICAgIGlmICh0ID09PSAncDJzaFAycGsnKSB7XG4gICAgICBjb25zdCBzaWduZXIgPSBrZXlzW2dldERlZmF1bHRTaWduZXJOYW1lcyh0LCBzaWduZXJzKVswXV07XG4gICAgICBjb25zdCB1bnNwZW50ID0gdXR4b2xpYi50ZXN0dXRpbC5tb2NrUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQodXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLCBCaWdJbnQoMTApLCB7XG4gICAgICAgIGtleTogc2lnbmVyLFxuICAgICAgICB2b3V0OiBpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IHJlZGVlbVNjcmlwdCB9ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdFAyc2hQMnBrKHNpZ25lci5wdWJsaWNLZXkpO1xuICAgICAgYXNzZXJ0Lm9rKHJlZGVlbVNjcmlwdCk7XG4gICAgICB1dHhvbGliLmJpdGdvLmFkZFJlcGxheVByb3RlY3Rpb25VbnNwZW50VG9Qc2J0KHBzYnQsIHVuc3BlbnQsIHJlZGVlbVNjcmlwdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVuc3BlbnQgPSB1dHhvbGliLnRlc3R1dGlsLm1vY2tXYWxsZXRVbnNwZW50KHV0eG9saWIubmV0d29ya3MuYml0Y29pbiwgQmlnSW50KDEwKSwge1xuICAgICAgICBrZXlzLFxuICAgICAgICBjaGFpbjogdXR4b2xpYi5iaXRnby5nZXRFeHRlcm5hbENoYWluQ29kZSh0ID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAncDJ0ck11c2lnMicgOiB0KSxcbiAgICAgICAgdm91dDogaSxcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25lck5hbWVzID0gZ2V0RGVmYXVsdFNpZ25lck5hbWVzKHQsIHNpZ25lcnMpO1xuICAgICAgdXR4b2xpYi5iaXRnby5hZGRXYWxsZXRVbnNwZW50VG9Qc2J0KHBzYnQsIHVuc3BlbnQsIGtleXMsIHNpZ25lck5hbWVzWzBdLCBzaWduZXJOYW1lc1sxXSk7XG4gICAgfVxuICB9KTtcblxuICBvdXRwdXRUeXBlcy5mb3JFYWNoKCh0LCBpbmRleCkgPT4ge1xuICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgIHNjcmlwdDogY3JlYXRlU2NyaXB0UHViS2V5KGtleXMudHJpcGxlLCB0KSxcbiAgICAgIHZhbHVlOiBCaWdJbnQoMTApLFxuICAgIH0pO1xuICB9KTtcblxuICBpZiAoc2lnbmF0dXJlU3RhdHVzID09PSAndW5zaWduZWQnKSB7XG4gICAgcmV0dXJuIHBzYnQ7XG4gIH1cblxuICBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoa2V5c1sndXNlciddKTtcbiAgcHNidC5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKGtleXNbJ2JpdGdvJ10pO1xuXG4gIGlucHV0VHlwZXMuZm9yRWFjaCgodCwgaSkgPT4ge1xuICAgIGNvbnN0IHNpZ25lck5hbWVzID0gZ2V0RGVmYXVsdFNpZ25lck5hbWVzKHQsIHNpZ25lcnMpO1xuICAgIGlmICh0ID09PSAncDJzaFAycGsnKSB7XG4gICAgICBpZiAoc2lnbmF0dXJlU3RhdHVzID09PSAnZnVsbHlzaWduZWQnKSB7XG4gICAgICAgIHBzYnQuc2lnbklucHV0KGksIGtleXNbc2lnbmVyTmFtZXNbMF1dKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHNidC5zaWduSW5wdXRIRChpLCBrZXlzW3NpZ25lck5hbWVzWzBdXSk7XG4gICAgICBpZiAoc2lnbmF0dXJlU3RhdHVzID09PSAnZnVsbHlzaWduZWQnKSB7XG4gICAgICAgIHBzYnQuc2lnbklucHV0SEQoaSwga2V5c1tzaWduZXJOYW1lc1sxXV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGlmIChzaWduYXR1cmVTdGF0dXMgPT09ICdmdWxseXNpZ25lZCcpIHtcbiAgICBhc3NlcnQub2socHNidC52YWxpZGF0ZVNpZ25hdHVyZXNPZkFsbElucHV0cygpKTtcbiAgfVxuICByZXR1cm4gcHNidDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpZ25lZFRyYW5zYWN0aW9uKFxuICBrZXlzOiB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLFxuICBzaWduZXJOYW1lOiB1dHhvbGliLmJpdGdvLktleU5hbWUsXG4gIGNvc2lnbmVyTmFtZTogdXR4b2xpYi5iaXRnby5LZXlOYW1lLFxuICBpbnB1dFR5cGVzOiBJbnB1dFNjcmlwdFR5cGVbXSxcbiAgb3V0cHV0VHlwZXM6IFRlc3RVbnNwZW50VHlwZVtdXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbiB7XG4gIGNvbnN0IHBzYnQgPSBjb25zdHJ1Y3RQc2J0KGtleXMsIGlucHV0VHlwZXMsIG91dHB1dFR5cGVzLCAnZnVsbHlzaWduZWQnLCB7IHNpZ25lck5hbWUsIGNvc2lnbmVyTmFtZSB9KTtcbiAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICByZXR1cm4gKHBzYnQuZXh0cmFjdFRyYW5zYWN0aW9uKCkgYXMgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248YmlnaW50PikuY2xvbmU8bnVtYmVyPignbnVtYmVyJyk7XG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!