PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test/integration_local_rpc/generate
Просмотр файла: outputScripts.util.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scriptTypes = exports.scriptTypesSingleSig = void 0;
exports.isSupportedDepositType = isSupportedDepositType;
exports.isSupportedSpendType = isSupportedSpendType;
exports.createScriptPubKey = createScriptPubKey;
exports.createSpendTransactionFromPrevOutputs = createSpendTransactionFromPrevOutputs;
exports.createSpendTransaction = createSpendTransaction;
exports.createPsbtSpendTransactionFromPrevTx = createPsbtSpendTransactionFromPrevTx;
exports.createPsbtSpendTransaction = createPsbtSpendTransaction;
exports.getP2trMusig2Index = getP2trMusig2Index;
const utxolib = require("../../../src");
const outputScripts_1 = require("../../../src/bitgo/outputScripts");
const testutil_1 = require("../../../src/testutil");
const bitgo_1 = require("../../../src/bitgo");
const bitgo_2 = require("../../../src/bitgo");
exports.scriptTypesSingleSig = ['p2pkh', 'p2wkh'];
exports.scriptTypes = [...exports.scriptTypesSingleSig, ...outputScripts_1.scriptTypes2Of3];
function isSupportedDepositType(network, scriptType) {
if (scriptType === 'p2pkh') {
return true;
}
if (scriptType === 'p2wkh') {
return utxolib.supportsSegwit(network);
}
return (0, outputScripts_1.isSupportedScriptType)(network, scriptType);
}
function isSupportedSpendType(network, scriptType) {
return (0, outputScripts_1.isScriptType2Of3)(scriptType) && (0, outputScripts_1.isSupportedScriptType)(network, scriptType);
}
/**
*
* @param keys - Pubkeys to use for generating the address.
* If scriptType is single-sig, the first key will be used.
* @param scriptType
* @param network
* @return {Buffer} scriptPubKey
*/
function createScriptPubKey(keys, scriptType, network) {
const pubkeys = keys.map((k) => k.publicKey);
switch (scriptType) {
case 'p2sh':
case 'p2shP2wsh':
case 'p2wsh':
case 'p2tr':
case 'p2trMusig2':
return (0, outputScripts_1.createOutputScript2of3)(pubkeys, scriptType).scriptPubKey;
case 'p2pkh':
return utxolib.payments.p2pkh({ pubkey: keys[0].publicKey }).output;
case 'p2wkh':
return utxolib.payments.p2wpkh({ pubkey: keys[0].publicKey }).output;
default:
throw new Error(`unsupported output type ${scriptType}`);
}
}
function createSpendTransactionFromPrevOutputs(keys, scriptType, prevOutputs, recipientScript, network, { signKeys = [keys[0], keys[2]], version, amountType, } = {}) {
if (signKeys.length !== 1 && signKeys.length !== 2) {
throw new Error(`signKeys length must be 1 or 2`);
}
const txBuilder = (0, bitgo_1.createTransactionBuilderForNetwork)(network, { version });
prevOutputs.forEach(({ txid, vout, script, value }, i) => {
txBuilder.addInput(txid, vout, undefined, script, value);
});
const inputSum = prevOutputs.reduce((sum, { value }) => sum + BigInt(value), BigInt(0));
const fee = network === utxolib.networks.dogecoinTest ? BigInt(1000000) : BigInt(1000);
const outputValue = inputSum - fee;
txBuilder.addOutput(recipientScript, (amountType === 'number' ? Number(outputValue) : outputValue));
const publicKeys = keys.map((k) => k.publicKey);
if (!(0, bitgo_1.isTriple)(publicKeys)) {
throw new Error();
}
prevOutputs.forEach(({ value }, vin) => {
signKeys.forEach((key) => {
(0, bitgo_1.signInput2Of3)(txBuilder, vin, scriptType, publicKeys, key, (0, testutil_1.getDefaultCosigner)(publicKeys, key.publicKey), value);
});
});
if (signKeys.length === 1) {
return txBuilder.buildIncomplete();
}
return txBuilder.build();
}
function createSpendTransaction(keys, scriptType, inputTxs, recipientScript, network, version, amountType) {
const matches = inputTxs
.map((inputTxBuffer) => {
const inputTx = (0, bitgo_1.createTransactionFromBuffer)(inputTxBuffer, network, { amountType });
const { scriptPubKey } = (0, outputScripts_1.createOutputScript2of3)(keys.map((k) => k.publicKey), scriptType);
return inputTx.outs
.map((o, vout) => {
if (!scriptPubKey.equals(o.script)) {
return;
}
return {
txid: inputTx.getId(),
vout,
value: o.value,
script: o.script,
};
})
.filter((v) => v !== undefined);
})
.reduce((all, matches) => [...all, ...matches]);
if (!matches.length) {
throw new Error(`could not find matching outputs in funding transaction`);
}
return createSpendTransactionFromPrevOutputs(keys, scriptType, matches, recipientScript, network, {
version,
amountType,
});
}
function createPsbtSpendTransactionFromPrevTx(rootWalletKeys, unspents, network, signers = ['user', 'bitgo'], version) {
const psbt = (0, bitgo_1.createPsbtForNetwork)({ network }, { version });
unspents.forEach((u, index) => {
(0, bitgo_1.addWalletUnspentToPsbt)(psbt, u, rootWalletKeys, signers[0], signers[1]);
});
const inputSum = unspents.reduce((sum, { value }) => sum + BigInt(value), BigInt(0));
const fee = network === utxolib.networks.dogecoinTest ? BigInt(1000000) : BigInt(1000);
const outputValue = inputSum - fee;
(0, bitgo_1.addWalletOutputToPsbt)(psbt, rootWalletKeys, unspents[0].chain, unspents[0].index, outputValue);
signers.forEach((keyName) => {
psbt.setAllInputsMusig2NonceHD(rootWalletKeys[keyName]);
});
signers.forEach((keyName) => {
psbt.signAllInputsHD(rootWalletKeys[keyName]);
});
if (!psbt.validateSignaturesOfAllInputs()) {
throw new Error('psbt sig validation fails');
}
psbt.finalizeAllInputs();
return psbt.extractTransaction();
}
function createPsbtSpendTransaction({ rootWalletKeys, signers, chain, index, inputTxs, network, version, amountType, }) {
const walletKeys = rootWalletKeys.deriveForChainAndIndex(chain, index);
const { scriptPubKey } = (0, outputScripts_1.createOutputScript2of3)(walletKeys.publicKeys, (0, bitgo_2.scriptTypeForChain)(chain));
const matches = inputTxs
.map((inputTxBuffer) => {
const inputTx = (0, bitgo_1.createTransactionFromBuffer)(inputTxBuffer, network, { amountType: 'bigint' });
return inputTx.outs
.map((o, vout) => {
if (!scriptPubKey.equals(o.script)) {
return;
}
return { chain, index, ...(0, bitgo_1.fromOutputWithPrevTx)(inputTx, vout) };
})
.filter((v) => v !== undefined);
})
.reduce((all, matches) => [...all, ...matches]);
if (!matches.length) {
throw new Error(`could not find matching outputs in funding transaction`);
}
const tx = createPsbtSpendTransactionFromPrevTx(rootWalletKeys, matches, network, signers, version);
return tx.clone(amountType);
}
/**
* @returns BIP32 hardcoded index for p2trMusig2 spend type. 0 for key path and 100 for script path.
* For same fixture key triple and script type (p2trMusig2),
* we need 2 different deposit and spend tx fixtures.
*/
function getP2trMusig2Index(spendType) {
return spendType === 'keyPath' ? 0 : 100;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0U2NyaXB0cy51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9pbnRlZ3JhdGlvbl9sb2NhbF9ycGMvZ2VuZXJhdGUvb3V0cHV0U2NyaXB0cy51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXVDQSx3REFVQztBQUVELG9EQUVDO0FBVUQsZ0RBaUJDO0FBRUQsc0ZBMkNDO0FBRUQsd0RBMENDO0FBRUQsb0ZBaUNDO0FBRUQsZ0VBMkNDO0FBT0QsZ0RBRUM7QUFoUUQsd0NBQXdDO0FBQ3hDLG9FQU0wQztBQUMxQyxvREFBc0U7QUFFdEUsOENBZ0I0QjtBQUM1Qiw4Q0FBd0Q7QUFFM0MsUUFBQSxvQkFBb0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQVUsQ0FBQztBQUduRCxRQUFBLFdBQVcsR0FBRyxDQUFDLEdBQUcsNEJBQW9CLEVBQUUsR0FBRywrQkFBZSxDQUFDLENBQUM7QUFLekUsU0FBZ0Isc0JBQXNCLENBQUMsT0FBZ0IsRUFBRSxVQUFzQjtJQUM3RSxJQUFJLFVBQVUsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLFVBQVUsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMzQixPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE9BQU8sSUFBQSxxQ0FBcUIsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELFNBQWdCLG9CQUFvQixDQUFDLE9BQWdCLEVBQUUsVUFBc0I7SUFDM0UsT0FBTyxJQUFBLGdDQUFnQixFQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUEscUNBQXFCLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3BGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsSUFBZSxFQUFFLFVBQXNC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QUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELE1BQU0sRUFBRSxHQUFHLG9DQUFvQyxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNwRyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUF5QixDQUFDO0FBQ3RELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsU0FBbUM7SUFDcEUsT0FBTyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHhPdXRwdXQgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7XG4gIGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMsXG4gIGlzU2NyaXB0VHlwZTJPZjMsXG4gIGlzU3VwcG9ydGVkU2NyaXB0VHlwZSxcbiAgU2NyaXB0VHlwZTJPZjMsXG4gIHNjcmlwdFR5cGVzMk9mMyxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjL2JpdGdvL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdENvc2lnbmVyLCBLZXlUcmlwbGUgfSBmcm9tICcuLi8uLi8uLi9zcmMvdGVzdHV0aWwnO1xuXG5pbXBvcnQge1xuICBpc1RyaXBsZSxcbiAgY3JlYXRlVHJhbnNhY3Rpb25CdWlsZGVyRm9yTmV0d29yayxcbiAgY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyLFxuICBzaWduSW5wdXQyT2YzLFxuICBUeE91dFBvaW50LFxuICBVdHhvVHJhbnNhY3Rpb24sXG4gIGNyZWF0ZVBzYnRGb3JOZXR3b3JrLFxuICBDaGFpbkNvZGUsXG4gIFJvb3RXYWxsZXRLZXlzLFxuICBhZGRXYWxsZXRVbnNwZW50VG9Qc2J0LFxuICBmcm9tT3V0cHV0V2l0aFByZXZUeCxcbiAgV2FsbGV0VW5zcGVudCxcbiAgS2V5TmFtZSxcbiAgYWRkV2FsbGV0T3V0cHV0VG9Qc2J0LFxuICBUdXBsZSxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjL2JpdGdvJztcbmltcG9ydCB7IHNjcmlwdFR5cGVGb3JDaGFpbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9iaXRnbyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRUeXBlc1NpbmdsZVNpZyA9IFsncDJwa2gnLCAncDJ3a2gnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNjcmlwdFR5cGVTaW5nbGVTaWcgPSAodHlwZW9mIHNjcmlwdFR5cGVzU2luZ2xlU2lnKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0VHlwZXMgPSBbLi4uc2NyaXB0VHlwZXNTaW5nbGVTaWcsIC4uLnNjcmlwdFR5cGVzMk9mM107XG5leHBvcnQgdHlwZSBTY3JpcHRUeXBlID0gU2NyaXB0VHlwZTJPZjMgfCBTY3JpcHRUeXBlU2luZ2xlU2lnO1xuXG50eXBlIE5ldHdvcmsgPSB1dHhvbGliLk5ldHdvcms7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N1cHBvcnRlZERlcG9zaXRUeXBlKG5ldHdvcms6IE5ldHdvcmssIHNjcmlwdFR5cGU6IFNjcmlwdFR5cGUpOiBib29sZWFuIHtcbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnBraCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzY3JpcHRUeXBlID09PSAncDJ3a2gnKSB7XG4gICAgcmV0dXJuIHV0eG9saWIuc3VwcG9ydHNTZWd3aXQobmV0d29yayk7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWRTY3JpcHRUeXBlKG5ldHdvcmssIHNjcmlwdFR5cGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdXBwb3J0ZWRTcGVuZFR5cGUobmV0d29yazogTmV0d29yaywgc2NyaXB0VHlwZTogU2NyaXB0VHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNTY3JpcHRUeXBlMk9mMyhzY3JpcHRUeXBlKSAmJiBpc1N1cHBvcnRlZFNjcmlwdFR5cGUobmV0d29yaywgc2NyaXB0VHlwZSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBrZXlzIC0gUHVia2V5cyB0byB1c2UgZm9yIGdlbmVyYXRpbmcgdGhlIGFkZHJlc3MuXG4gKiAgICAgICAgICAgICAgIElmIHNjcmlwdFR5cGUgaXMgc2luZ2xlLXNpZywgdGhlIGZpcnN0IGtleSB3aWxsIGJlIHVzZWQuXG4gKiBAcGFyYW0gc2NyaXB0VHlwZVxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEByZXR1cm4ge0J1ZmZlcn0gc2NyaXB0UHViS2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTY3JpcHRQdWJLZXkoa2V5czogS2V5VHJpcGxlLCBzY3JpcHRUeXBlOiBTY3JpcHRUeXBlLCBuZXR3b3JrOiBOZXR3b3JrKTogQnVmZmVyIHtcbiAgY29uc3QgcHVia2V5cyA9IGtleXMubWFwKChrKSA9PiBrLnB1YmxpY0tleSk7XG5cbiAgc3dpdGNoIChzY3JpcHRUeXBlKSB7XG4gICAgY2FzZSAncDJzaCc6XG4gICAgY2FzZSAncDJzaFAyd3NoJzpcbiAgICBjYXNlICdwMndzaCc6XG4gICAgY2FzZSAncDJ0cic6XG4gICAgY2FzZSAncDJ0ck11c2lnMic6XG4gICAgICByZXR1cm4gY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhwdWJrZXlzLCBzY3JpcHRUeXBlKS5zY3JpcHRQdWJLZXk7XG4gICAgY2FzZSAncDJwa2gnOlxuICAgICAgcmV0dXJuIHV0eG9saWIucGF5bWVudHMucDJwa2goeyBwdWJrZXk6IGtleXNbMF0ucHVibGljS2V5IH0pLm91dHB1dCBhcyBCdWZmZXI7XG4gICAgY2FzZSAncDJ3a2gnOlxuICAgICAgcmV0dXJuIHV0eG9saWIucGF5bWVudHMucDJ3cGtoKHsgcHVia2V5OiBrZXlzWzBdLnB1YmxpY0tleSB9KS5vdXRwdXQgYXMgQnVmZmVyO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIG91dHB1dCB0eXBlICR7c2NyaXB0VHlwZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3BlbmRUcmFuc2FjdGlvbkZyb21QcmV2T3V0cHV0czxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAga2V5czogS2V5VHJpcGxlLFxuICBzY3JpcHRUeXBlOiBTY3JpcHRUeXBlMk9mMyxcbiAgcHJldk91dHB1dHM6IChUeE91dFBvaW50ICYgVHhPdXRwdXQ8VE51bWJlcj4pW10sXG4gIHJlY2lwaWVudFNjcmlwdDogQnVmZmVyLFxuICBuZXR3b3JrOiBOZXR3b3JrLFxuICB7XG4gICAgc2lnbktleXMgPSBba2V5c1swXSwga2V5c1syXV0sXG4gICAgdmVyc2lvbixcbiAgICBhbW91bnRUeXBlLFxuICB9OiB7IHNpZ25LZXlzPzogQklQMzJJbnRlcmZhY2VbXTsgdmVyc2lvbj86IG51bWJlcjsgYW1vdW50VHlwZT86ICdudW1iZXInIHwgJ2JpZ2ludCcgfSA9IHt9XG4pOiBVdHhvVHJhbnNhY3Rpb248VE51bWJlcj4ge1xuICBpZiAoc2lnbktleXMubGVuZ3RoICE9PSAxICYmIHNpZ25LZXlzLmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgc2lnbktleXMgbGVuZ3RoIG11c3QgYmUgMSBvciAyYCk7XG4gIH1cblxuICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGb3JOZXR3b3JrPFROdW1iZXI+KG5ldHdvcmssIHsgdmVyc2lvbiB9KTtcblxuICBwcmV2T3V0cHV0cy5mb3JFYWNoKCh7IHR4aWQsIHZvdXQsIHNjcmlwdCwgdmFsdWUgfSwgaSkgPT4ge1xuICAgIHR4QnVpbGRlci5hZGRJbnB1dCh0eGlkLCB2b3V0LCB1bmRlZmluZWQsIHNjcmlwdCwgdmFsdWUpO1xuICB9KTtcblxuICBjb25zdCBpbnB1dFN1bSA9IHByZXZPdXRwdXRzLnJlZHVjZSgoc3VtLCB7IHZhbHVlIH0pID0+IHN1bSArIEJpZ0ludCh2YWx1ZSksIEJpZ0ludCgwKSk7XG4gIGNvbnN0IGZlZSA9IG5ldHdvcmsgPT09IHV0eG9saWIubmV0d29ya3MuZG9nZWNvaW5UZXN0ID8gQmlnSW50KDFfMDAwXzAwMCkgOiBCaWdJbnQoMV8wMDApO1xuICBjb25zdCBvdXRwdXRWYWx1ZSA9IGlucHV0U3VtIC0gZmVlO1xuXG4gIHR4QnVpbGRlci5hZGRPdXRwdXQocmVjaXBpZW50U2NyaXB0LCAoYW1vdW50VHlwZSA9PT0gJ251bWJlcicgPyBOdW1iZXIob3V0cHV0VmFsdWUpIDogb3V0cHV0VmFsdWUpIGFzIFROdW1iZXIpO1xuXG4gIGNvbnN0IHB1YmxpY0tleXMgPSBrZXlzLm1hcCgoaykgPT4gay5wdWJsaWNLZXkpO1xuICBpZiAoIWlzVHJpcGxlKHB1YmxpY0tleXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gIH1cblxuICBwcmV2T3V0cHV0cy5mb3JFYWNoKCh7IHZhbHVlIH0sIHZpbikgPT4ge1xuICAgIHNpZ25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgc2lnbklucHV0Mk9mMyh0eEJ1aWxkZXIsIHZpbiwgc2NyaXB0VHlwZSwgcHVibGljS2V5cywga2V5LCBnZXREZWZhdWx0Q29zaWduZXIocHVibGljS2V5cywga2V5LnB1YmxpY0tleSksIHZhbHVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKHNpZ25LZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB0eEJ1aWxkZXIuYnVpbGRJbmNvbXBsZXRlKCkgYXMgVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+O1xuICB9XG4gIHJldHVybiB0eEJ1aWxkZXIuYnVpbGQoKSBhcyBVdHhvVHJhbnNhY3Rpb248VE51bWJlcj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTcGVuZFRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBrZXlzOiBLZXlUcmlwbGUsXG4gIHNjcmlwdFR5cGU6IFNjcmlwdFR5cGUyT2YzLFxuICBpbnB1dFR4czogQnVmZmVyW10sXG4gIHJlY2lwaWVudFNjcmlwdDogQnVmZmVyLFxuICBuZXR3b3JrOiBOZXR3b3JrLFxuICB2ZXJzaW9uPzogbnVtYmVyLFxuICBhbW91bnRUeXBlPzogJ251bWJlcicgfCAnYmlnaW50J1xuKTogVHJhbnNhY3Rpb248VE51bWJlcj4ge1xuICBjb25zdCBtYXRjaGVzOiAoVHhPdXRQb2ludCAmIFR4T3V0cHV0PFROdW1iZXI+KVtdID0gaW5wdXRUeHNcbiAgICAubWFwKChpbnB1dFR4QnVmZmVyKTogKFR4T3V0UG9pbnQgJiBUeE91dHB1dDxUTnVtYmVyPilbXSA9PiB7XG4gICAgICBjb25zdCBpbnB1dFR4ID0gY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyPFROdW1iZXI+KGlucHV0VHhCdWZmZXIsIG5ldHdvcmssIHsgYW1vdW50VHlwZSB9KTtcblxuICAgICAgY29uc3QgeyBzY3JpcHRQdWJLZXkgfSA9IGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoXG4gICAgICAgIGtleXMubWFwKChrKSA9PiBrLnB1YmxpY0tleSksXG4gICAgICAgIHNjcmlwdFR5cGUgYXMgU2NyaXB0VHlwZTJPZjNcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBpbnB1dFR4Lm91dHNcbiAgICAgICAgLm1hcCgobywgdm91dCk6IChUeE91dFBvaW50ICYgVHhPdXRwdXQ8VE51bWJlcj4pIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICBpZiAoIXNjcmlwdFB1YktleS5lcXVhbHMoby5zY3JpcHQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eGlkOiBpbnB1dFR4LmdldElkKCksXG4gICAgICAgICAgICB2b3V0LFxuICAgICAgICAgICAgdmFsdWU6IG8udmFsdWUsXG4gICAgICAgICAgICBzY3JpcHQ6IG8uc2NyaXB0LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIFR4T3V0UG9pbnQgJiBUeE91dHB1dDxUTnVtYmVyPiA9PiB2ICE9PSB1bmRlZmluZWQpO1xuICAgIH0pXG4gICAgLnJlZHVjZSgoYWxsLCBtYXRjaGVzKSA9PiBbLi4uYWxsLCAuLi5tYXRjaGVzXSk7XG5cbiAgaWYgKCFtYXRjaGVzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgY291bGQgbm90IGZpbmQgbWF0Y2hpbmcgb3V0cHV0cyBpbiBmdW5kaW5nIHRyYW5zYWN0aW9uYCk7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlU3BlbmRUcmFuc2FjdGlvbkZyb21QcmV2T3V0cHV0czxUTnVtYmVyPihrZXlzLCBzY3JpcHRUeXBlLCBtYXRjaGVzLCByZWNpcGllbnRTY3JpcHQsIG5ldHdvcmssIHtcbiAgICB2ZXJzaW9uLFxuICAgIGFtb3VudFR5cGUsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHNidFNwZW5kVHJhbnNhY3Rpb25Gcm9tUHJldlR4KFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PGJpZ2ludD5bXSxcbiAgbmV0d29yazogTmV0d29yayxcbiAgc2lnbmVyczogVHVwbGU8S2V5TmFtZT4gPSBbJ3VzZXInLCAnYml0Z28nXSxcbiAgdmVyc2lvbj86IG51bWJlclxuKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICBjb25zdCBwc2J0ID0gY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrIH0sIHsgdmVyc2lvbiB9KTtcblxuICB1bnNwZW50cy5mb3JFYWNoKCh1LCBpbmRleCkgPT4ge1xuICAgIGFkZFdhbGxldFVuc3BlbnRUb1BzYnQocHNidCwgdSwgcm9vdFdhbGxldEtleXMsIHNpZ25lcnNbMF0sIHNpZ25lcnNbMV0pO1xuICB9KTtcblxuICBjb25zdCBpbnB1dFN1bSA9IHVuc3BlbnRzLnJlZHVjZSgoc3VtLCB7IHZhbHVlIH0pID0+IHN1bSArIEJpZ0ludCh2YWx1ZSksIEJpZ0ludCgwKSk7XG4gIGNvbnN0IGZlZSA9IG5ldHdvcmsgPT09IHV0eG9saWIubmV0d29ya3MuZG9nZWNvaW5UZXN0ID8gQmlnSW50KDFfMDAwXzAwMCkgOiBCaWdJbnQoMV8wMDApO1xuICBjb25zdCBvdXRwdXRWYWx1ZSA9IGlucHV0U3VtIC0gZmVlO1xuXG4gIGFkZFdhbGxldE91dHB1dFRvUHNidChwc2J0LCByb290V2FsbGV0S2V5cywgdW5zcGVudHNbMF0uY2hhaW4sIHVuc3BlbnRzWzBdLmluZGV4LCBvdXRwdXRWYWx1ZSk7XG5cbiAgc2lnbmVycy5mb3JFYWNoKChrZXlOYW1lKSA9PiB7XG4gICAgcHNidC5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKHJvb3RXYWxsZXRLZXlzW2tleU5hbWVdKTtcbiAgfSk7XG5cbiAgc2lnbmVycy5mb3JFYWNoKChrZXlOYW1lKSA9PiB7XG4gICAgcHNidC5zaWduQWxsSW5wdXRzSEQocm9vdFdhbGxldEtleXNba2V5TmFtZV0pO1xuICB9KTtcblxuICBpZiAoIXBzYnQudmFsaWRhdGVTaWduYXR1cmVzT2ZBbGxJbnB1dHMoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHNidCBzaWcgdmFsaWRhdGlvbiBmYWlscycpO1xuICB9XG5cbiAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICByZXR1cm4gcHNidC5leHRyYWN0VHJhbnNhY3Rpb24oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBzYnRTcGVuZFRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KHtcbiAgcm9vdFdhbGxldEtleXMsXG4gIHNpZ25lcnMsXG4gIGNoYWluLFxuICBpbmRleCxcbiAgaW5wdXRUeHMsXG4gIG5ldHdvcmssXG4gIHZlcnNpb24sXG4gIGFtb3VudFR5cGUsXG59OiB7XG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cztcbiAgc2lnbmVyczogVHVwbGU8S2V5TmFtZT47XG4gIGNoYWluOiBDaGFpbkNvZGU7XG4gIGluZGV4OiBudW1iZXI7XG4gIGlucHV0VHhzOiBCdWZmZXJbXTtcbiAgbmV0d29yazogTmV0d29yaztcbiAgdmVyc2lvbj86IG51bWJlcjtcbiAgYW1vdW50VHlwZT86ICdudW1iZXInIHwgJ2JpZ2ludCc7XG59KTogVHJhbnNhY3Rpb248VE51bWJlcj4ge1xuICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChjaGFpbiwgaW5kZXgpO1xuICBjb25zdCB7IHNjcmlwdFB1YktleSB9ID0gY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyh3YWxsZXRLZXlzLnB1YmxpY0tleXMsIHNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbikpO1xuXG4gIGNvbnN0IG1hdGNoZXMgPSBpbnB1dFR4c1xuICAgIC5tYXAoKGlucHV0VHhCdWZmZXIpOiBXYWxsZXRVbnNwZW50PGJpZ2ludD5bXSA9PiB7XG4gICAgICBjb25zdCBpbnB1dFR4ID0gY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyPGJpZ2ludD4oaW5wdXRUeEJ1ZmZlciwgbmV0d29yaywgeyBhbW91bnRUeXBlOiAnYmlnaW50JyB9KTtcblxuICAgICAgcmV0dXJuIGlucHV0VHgub3V0c1xuICAgICAgICAubWFwKChvLCB2b3V0KTogV2FsbGV0VW5zcGVudDxiaWdpbnQ+IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICBpZiAoIXNjcmlwdFB1YktleS5lcXVhbHMoby5zY3JpcHQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IGNoYWluLCBpbmRleCwgLi4uZnJvbU91dHB1dFdpdGhQcmV2VHg8YmlnaW50PihpbnB1dFR4LCB2b3V0KSB9O1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKCh2KTogdiBpcyBXYWxsZXRVbnNwZW50PGJpZ2ludD4gPT4gdiAhPT0gdW5kZWZpbmVkKTtcbiAgICB9KVxuICAgIC5yZWR1Y2UoKGFsbCwgbWF0Y2hlcykgPT4gWy4uLmFsbCwgLi4ubWF0Y2hlc10pO1xuXG4gIGlmICghbWF0Y2hlcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIG91dHB1dHMgaW4gZnVuZGluZyB0cmFuc2FjdGlvbmApO1xuICB9XG5cbiAgY29uc3QgdHggPSBjcmVhdGVQc2J0U3BlbmRUcmFuc2FjdGlvbkZyb21QcmV2VHgocm9vdFdhbGxldEtleXMsIG1hdGNoZXMsIG5ldHdvcmssIHNpZ25lcnMsIHZlcnNpb24pO1xuICByZXR1cm4gdHguY2xvbmUoYW1vdW50VHlwZSkgYXMgVHJhbnNhY3Rpb248VE51bWJlcj47XG59XG5cbi8qKlxuICogQHJldHVybnMgQklQMzIgaGFyZGNvZGVkIGluZGV4IGZvciBwMnRyTXVzaWcyIHNwZW5kIHR5cGUuIDAgZm9yIGtleSBwYXRoIGFuZCAxMDAgZm9yIHNjcmlwdCBwYXRoLlxuICogRm9yIHNhbWUgZml4dHVyZSBrZXkgdHJpcGxlIGFuZCBzY3JpcHQgdHlwZSAocDJ0ck11c2lnMiksXG4gKiB3ZSBuZWVkIDIgZGlmZmVyZW50IGRlcG9zaXQgYW5kIHNwZW5kIHR4IGZpeHR1cmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UDJ0ck11c2lnMkluZGV4KHNwZW5kVHlwZTogJ2tleVBhdGgnIHwgJ3NjcmlwdFBhdGgnKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNwZW5kVHlwZSA9PT0gJ2tleVBhdGgnID8gMCA6IDEwMDtcbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!