PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test
Просмотр файла: transaction_util.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultTestOutputAmount = void 0;
exports.getSignKeyCombinations = getSignKeyCombinations;
exports.parseTransactionRoundTrip = parseTransactionRoundTrip;
exports.mockTransactionId = mockTransactionId;
exports.getPrevOutput = getPrevOutput;
exports.getPrevOutputs = getPrevOutputs;
exports.getTransactionBuilder = getTransactionBuilder;
exports.getUnsignedTransaction2Of3 = getUnsignedTransaction2Of3;
exports.getHalfSignedTransaction2Of3 = getHalfSignedTransaction2Of3;
exports.getFullSignedTransactionP2shP2pk = getFullSignedTransactionP2shP2pk;
exports.getFullSignedTransaction2Of3 = getFullSignedTransaction2Of3;
exports.getTransactionStages = getTransactionStages;
const assert = require("assert");
const src_1 = require("../src");
const outputScripts_1 = require("../src/bitgo/outputScripts");
const bitgo_1 = require("../src/bitgo");
const outputScripts_util_1 = require("./integration_local_rpc/generate/outputScripts.util");
const fixtures_1 = require("./integration_local_rpc/generate/fixtures");
function getSignKeyCombinations(length) {
if (length === 0) {
return [];
}
if (length === 1) {
return fixtures_1.fixtureKeys.map((k) => [k]);
}
return getSignKeyCombinations(length - 1)
.map((head) => fixtures_1.fixtureKeys.filter((k) => !head.includes(k)).map((k) => [...head, k]))
.reduce((all, keys) => [...all, ...keys]);
}
function parseTransactionRoundTrip(buf, network, { inputs, amountType = 'number', version, roundTripPsbt = true, } = {}) {
const tx = (0, bitgo_1.createTransactionFromBuffer)(buf, network, { version, amountType });
assert.strictEqual(tx.byteLength(), buf.length);
assert.strictEqual(tx.toBuffer().toString('hex'), buf.toString('hex'));
// Test `Transaction.clone()` implementation
assert.strictEqual(tx.clone().toBuffer().toString('hex'), buf.toString('hex'));
if (inputs) {
const bigintTx = tx.clone('bigint');
const bigintInputs = inputs.map((input) => ({ ...input, value: BigInt(input.value) }));
if (roundTripPsbt) {
// Test UtxoPsbt.fromTransaction() implementation
assert.strictEqual(bitgo_1.UtxoPsbt.fromTransaction(bigintTx, bigintInputs)
.finalizeAllInputs()
.extractTransaction()
.toBuffer()
.toString('hex'), buf.toString('hex'));
// Test UtxoPsbt.toBuffer() and UtxoPsbt.fromBuffer() implementation
assert.strictEqual((0, bitgo_1.createPsbtFromBuffer)((0, bitgo_1.createPsbtFromTransaction)(bigintTx, bigintInputs).toBuffer(), network)
.finalizeAllInputs()
.extractTransaction()
.toBuffer()
.toString('hex'), buf.toString('hex'));
}
// Test `TransactionBuilder.fromTransaction()` implementation
assert.strictEqual((0, bitgo_1.createTransactionBuilderFromTransaction)(tx, inputs).build().toBuffer().toString('hex'), buf.toString('hex'));
}
return tx;
}
exports.defaultTestOutputAmount = 1e8;
function mockTransactionId(v = 0xff) {
return Buffer.alloc(32).fill(v).toString('hex');
}
function getPrevOutput(scriptType, value, network, vout = 0, { keys = fixtures_1.fixtureKeys, prevTx, } = {}) {
const script = (0, outputScripts_1.isScriptType2Of3)(scriptType)
? (0, outputScripts_1.createOutputScript2of3)(keys.map((k) => k.publicKey), scriptType).scriptPubKey
: (0, outputScripts_1.createOutputScriptP2shP2pk)(keys[0].publicKey).scriptPubKey;
if (prevTx === true) {
const txb = (0, bitgo_1.createTransactionBuilderForNetwork)(network);
txb.addInput(Buffer.alloc(32).fill(1), 0);
txb.addOutput(script, value);
prevTx = txb.buildIncomplete();
}
return {
txid: prevTx ? prevTx.getId() : mockTransactionId(),
vout,
script,
value,
prevTx: prevTx ? prevTx.toBuffer() : undefined,
};
}
function getPrevOutputs(scriptType, value, network, { keys = fixtures_1.fixtureKeys, prevTx } = {}) {
return [getPrevOutput(scriptType, value, network, 0, { keys, prevTx })];
}
function getTransactionBuilder(keys, halfSigners, scriptType, network, { amountType = 'number', outputAmount = exports.defaultTestOutputAmount, prevOutputs = getPrevOutputs(scriptType, (0, bitgo_1.toTNumber)(outputAmount, amountType), network), } = {}) {
const txBuilder = (0, bitgo_1.createTransactionBuilderForNetwork)(network);
prevOutputs.forEach(({ txid, vout }) => {
txBuilder.addInput(txid, vout);
});
const recipientScript = (0, outputScripts_util_1.createScriptPubKey)(fixtures_1.fixtureKeys, 'p2pkh', src_1.networks.bitcoin);
txBuilder.addOutput(recipientScript, (0, bitgo_1.toTNumber)(BigInt(outputAmount) - BigInt(1000), amountType));
const pubkeys = keys.map((k) => k.publicKey);
assert((0, bitgo_1.isTriple)(pubkeys));
prevOutputs.forEach(({ value }, vin) => {
halfSigners.forEach(({ signer, cosigner }) => {
if (scriptType === 'p2shP2pk') {
(0, bitgo_1.signInputP2shP2pk)(txBuilder, vin, signer);
}
else {
if (!cosigner) {
throw new Error(`must set cosigner`);
}
(0, bitgo_1.signInput2Of3)(txBuilder, vin, scriptType, pubkeys, signer, cosigner.publicKey, value);
}
});
});
return txBuilder;
}
function getUnsignedTransaction2Of3(keys, scriptType, network, params = {}) {
return getTransactionBuilder(keys, [], scriptType, network, params).buildIncomplete();
}
function getHalfSignedTransaction2Of3(keys, signer1, signer2, scriptType, network, opts = {}) {
return getTransactionBuilder(keys, [{ signer: signer1, cosigner: signer2 }], scriptType, network, opts).buildIncomplete();
}
function getFullSignedTransactionP2shP2pk(keys, signer1, network, opts = {}) {
return getTransactionBuilder(keys, [{ signer: signer1 }], 'p2shP2pk', network, opts).build();
}
function getFullSignedTransaction2Of3(keys, signer1, signer2, scriptType, network, opts = {}) {
return getTransactionBuilder(keys, [
{ signer: signer1, cosigner: signer2 },
{ signer: signer2, cosigner: signer1 },
], scriptType, network, opts).build();
}
function getTransactionStages(keys, signer1, signer2, scriptType, network, opts) {
const halfSigned = getHalfSignedTransaction2Of3(keys, signer1, signer2, scriptType, network, opts);
const fullSigned = scriptType === 'p2shP2pk'
? halfSigned
: getFullSignedTransaction2Of3(keys, signer1, signer2, scriptType, network, opts);
return {
unsigned: getUnsignedTransaction2Of3(keys, scriptType, network, opts),
halfSigned,
fullSigned,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25fdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvdHJhbnNhY3Rpb25fdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpQ0Esd0RBVUM7QUFFRCw4REFzREM7QUFJRCw4Q0FFQztBQUVELHNDQWtDQztBQUVELHdDQU9DO0FBYUQsc0RBcUNDO0FBRUQsZ0VBT0M7QUFFRCxvRUFlQztBQUVELDRFQU9DO0FBRUQsb0VBa0JDO0FBRUQsb0RBdUJDO0FBdlJELGlDQUFpQztBQUdqQyxnQ0FBMkM7QUFFM0MsOERBS29DO0FBQ3BDLHdDQWVzQjtBQUd0Qiw0RkFBeUY7QUFDekYsd0VBQXdFO0FBRXhFLFNBQWdCLHNCQUFzQixDQUFDLE1BQWM7SUFDbkQsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakIsT0FBTyxzQkFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxPQUFPLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDdEMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxzQkFBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEYsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENB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ckUsVUFBVTtRQUNWLFVBQVU7S0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnYmlwMzInO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBUeE91dHB1dCB9IGZyb20gJ2JpdGNvaW5qcy1saWInO1xuXG5pbXBvcnQgeyBuZXR3b3JrcywgTmV0d29yayB9IGZyb20gJy4uL3NyYyc7XG5cbmltcG9ydCB7XG4gIGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMsXG4gIGNyZWF0ZU91dHB1dFNjcmlwdFAyc2hQMnBrLFxuICBpc1NjcmlwdFR5cGUyT2YzLFxuICBTY3JpcHRUeXBlMk9mMyxcbn0gZnJvbSAnLi4vc3JjL2JpdGdvL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHtcbiAgaXNUcmlwbGUsXG4gIGNyZWF0ZVBzYnRGcm9tQnVmZmVyLFxuICBjcmVhdGVQc2J0RnJvbVRyYW5zYWN0aW9uLFxuICBjcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGb3JOZXR3b3JrLFxuICBjcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGcm9tVHJhbnNhY3Rpb24sXG4gIGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcixcbiAgc2lnbklucHV0Mk9mMyxcbiAgc2lnbklucHV0UDJzaFAycGssXG4gIFR4T3V0UG9pbnQsXG4gIFV0eG9UcmFuc2FjdGlvbixcbiAgVXR4b1RyYW5zYWN0aW9uQnVpbGRlcixcbiAgUHJldk91dHB1dCxcbiAgdG9UTnVtYmVyLFxuICBVdHhvUHNidCxcbn0gZnJvbSAnLi4vc3JjL2JpdGdvJztcbmltcG9ydCB7IEtleVRyaXBsZSB9IGZyb20gJy4uL3NyYy90ZXN0dXRpbCc7XG5cbmltcG9ydCB7IGNyZWF0ZVNjcmlwdFB1YktleSB9IGZyb20gJy4vaW50ZWdyYXRpb25fbG9jYWxfcnBjL2dlbmVyYXRlL291dHB1dFNjcmlwdHMudXRpbCc7XG5pbXBvcnQgeyBmaXh0dXJlS2V5cyB9IGZyb20gJy4vaW50ZWdyYXRpb25fbG9jYWxfcnBjL2dlbmVyYXRlL2ZpeHR1cmVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpZ25LZXlDb21iaW5hdGlvbnMobGVuZ3RoOiBudW1iZXIpOiBCSVAzMkludGVyZmFjZVtdW10ge1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChsZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZml4dHVyZUtleXMubWFwKChrKSA9PiBba10pO1xuICB9XG4gIHJldHVybiBnZXRTaWduS2V5Q29tYmluYXRpb25zKGxlbmd0aCAtIDEpXG4gICAgLm1hcCgoaGVhZCkgPT4gZml4dHVyZUtleXMuZmlsdGVyKChrKSA9PiAhaGVhZC5pbmNsdWRlcyhrKSkubWFwKChrKSA9PiBbLi4uaGVhZCwga10pKVxuICAgIC5yZWR1Y2UoKGFsbCwga2V5cykgPT4gWy4uLmFsbCwgLi4ua2V5c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUcmFuc2FjdGlvblJvdW5kVHJpcDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50LCBUIGV4dGVuZHMgVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+PihcbiAgYnVmOiBCdWZmZXIsXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIHtcbiAgICBpbnB1dHMsXG4gICAgYW1vdW50VHlwZSA9ICdudW1iZXInLFxuICAgIHZlcnNpb24sXG4gICAgcm91bmRUcmlwUHNidCA9IHRydWUsXG4gIH06IHtcbiAgICBpbnB1dHM/OiAoVHhPdXRQb2ludCAmIFR4T3V0cHV0PFROdW1iZXI+KVtdO1xuICAgIGFtb3VudFR5cGU/OiAnbnVtYmVyJyB8ICdiaWdpbnQnO1xuICAgIHZlcnNpb24/OiBudW1iZXI7XG4gICAgcm91bmRUcmlwUHNidD86IGJvb2xlYW47XG4gIH0gPSB7fVxuKTogVCB7XG4gIGNvbnN0IHR4ID0gY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyPFROdW1iZXI+KGJ1ZiwgbmV0d29yaywgeyB2ZXJzaW9uLCBhbW91bnRUeXBlIH0pO1xuICBhc3NlcnQuc3RyaWN0RXF1YWwodHguYnl0ZUxlbmd0aCgpLCBidWYubGVuZ3RoKTtcbiAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4LnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLCBidWYudG9TdHJpbmcoJ2hleCcpKTtcblxuICAvLyBUZXN0IGBUcmFuc2FjdGlvbi5jbG9uZSgpYCBpbXBsZW1lbnRhdGlvblxuICBhc3NlcnQuc3RyaWN0RXF1YWwodHguY2xvbmUoKS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSwgYnVmLnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgaWYgKGlucHV0cykge1xuICAgIGNvbnN0IGJpZ2ludFR4ID0gdHguY2xvbmU8YmlnaW50PignYmlnaW50Jyk7XG4gICAgY29uc3QgYmlnaW50SW5wdXRzID0gaW5wdXRzLm1hcCgoaW5wdXQpID0+ICh7IC4uLmlucHV0LCB2YWx1ZTogQmlnSW50KGlucHV0LnZhbHVlKSB9KSk7XG4gICAgaWYgKHJvdW5kVHJpcFBzYnQpIHtcbiAgICAgIC8vIFRlc3QgVXR4b1BzYnQuZnJvbVRyYW5zYWN0aW9uKCkgaW1wbGVtZW50YXRpb25cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgVXR4b1BzYnQuZnJvbVRyYW5zYWN0aW9uKGJpZ2ludFR4LCBiaWdpbnRJbnB1dHMpXG4gICAgICAgICAgLmZpbmFsaXplQWxsSW5wdXRzKClcbiAgICAgICAgICAuZXh0cmFjdFRyYW5zYWN0aW9uKClcbiAgICAgICAgICAudG9CdWZmZXIoKVxuICAgICAgICAgIC50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGJ1Zi50b1N0cmluZygnaGV4JylcbiAgICAgICk7XG5cbiAgICAgIC8vIFRlc3QgVXR4b1BzYnQudG9CdWZmZXIoKSBhbmQgVXR4b1BzYnQuZnJvbUJ1ZmZlcigpIGltcGxlbWVudGF0aW9uXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgIGNyZWF0ZVBzYnRGcm9tQnVmZmVyKGNyZWF0ZVBzYnRGcm9tVHJhbnNhY3Rpb24oYmlnaW50VHgsIGJpZ2ludElucHV0cykudG9CdWZmZXIoKSwgbmV0d29yaylcbiAgICAgICAgICAuZmluYWxpemVBbGxJbnB1dHMoKVxuICAgICAgICAgIC5leHRyYWN0VHJhbnNhY3Rpb24oKVxuICAgICAgICAgIC50b0J1ZmZlcigpXG4gICAgICAgICAgLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgYnVmLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVGVzdCBgVHJhbnNhY3Rpb25CdWlsZGVyLmZyb21UcmFuc2FjdGlvbigpYCBpbXBsZW1lbnRhdGlvblxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIGNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZyb21UcmFuc2FjdGlvbjxUTnVtYmVyPih0eCwgaW5wdXRzKS5idWlsZCgpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgYnVmLnRvU3RyaW5nKCdoZXgnKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdHggYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRUZXN0T3V0cHV0QW1vdW50ID0gMWU4O1xuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RyYW5zYWN0aW9uSWQodiA9IDB4ZmYpOiBzdHJpbmcge1xuICByZXR1cm4gQnVmZmVyLmFsbG9jKDMyKS5maWxsKHYpLnRvU3RyaW5nKCdoZXgnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByZXZPdXRwdXQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIHNjcmlwdFR5cGU6IFNjcmlwdFR5cGUyT2YzIHwgJ3Ayc2hQMnBrJyxcbiAgdmFsdWU6IFROdW1iZXIsXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIHZvdXQgPSAwLFxuICB7XG4gICAga2V5cyA9IGZpeHR1cmVLZXlzLFxuICAgIHByZXZUeCxcbiAgfToge1xuICAgIGtleXM/OiBLZXlUcmlwbGU7XG4gICAgcHJldlR4PzogVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHwgYm9vbGVhbjtcbiAgfSA9IHt9XG4pOiBQcmV2T3V0cHV0PFROdW1iZXI+IHtcbiAgY29uc3Qgc2NyaXB0ID0gaXNTY3JpcHRUeXBlMk9mMyhzY3JpcHRUeXBlKVxuICAgID8gY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhcbiAgICAgICAga2V5cy5tYXAoKGspID0+IGsucHVibGljS2V5KSxcbiAgICAgICAgc2NyaXB0VHlwZVxuICAgICAgKS5zY3JpcHRQdWJLZXlcbiAgICA6IGNyZWF0ZU91dHB1dFNjcmlwdFAyc2hQMnBrKGtleXNbMF0ucHVibGljS2V5KS5zY3JpcHRQdWJLZXk7XG5cbiAgaWYgKHByZXZUeCA9PT0gdHJ1ZSkge1xuICAgIGNvbnN0IHR4YiA9IGNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZvck5ldHdvcms8VE51bWJlcj4obmV0d29yayk7XG4gICAgdHhiLmFkZElucHV0KEJ1ZmZlci5hbGxvYygzMikuZmlsbCgxKSwgMCk7XG4gICAgdHhiLmFkZE91dHB1dChzY3JpcHQsIHZhbHVlKTtcbiAgICBwcmV2VHggPSB0eGIuYnVpbGRJbmNvbXBsZXRlKCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR4aWQ6IHByZXZUeCA/IHByZXZUeC5nZXRJZCgpIDogbW9ja1RyYW5zYWN0aW9uSWQoKSxcbiAgICB2b3V0LFxuICAgIHNjcmlwdCxcbiAgICB2YWx1ZSxcbiAgICBwcmV2VHg6IHByZXZUeCA/IHByZXZUeC50b0J1ZmZlcigpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJldk91dHB1dHM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIHNjcmlwdFR5cGU6IFNjcmlwdFR5cGUyT2YzIHwgJ3Ayc2hQMnBrJyxcbiAgdmFsdWU6IFROdW1iZXIsXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIHsga2V5cyA9IGZpeHR1cmVLZXlzLCBwcmV2VHggfTogeyBrZXlzPzogS2V5VHJpcGxlOyBwcmV2VHg/OiBib29sZWFuIH0gPSB7fVxuKTogUHJldk91dHB1dDxUTnVtYmVyPltdIHtcbiAgcmV0dXJuIFtnZXRQcmV2T3V0cHV0PFROdW1iZXI+KHNjcmlwdFR5cGUsIHZhbHVlLCBuZXR3b3JrLCAwLCB7IGtleXMsIHByZXZUeCB9KV07XG59XG5cbmV4cG9ydCB0eXBlIEhhbGZTaWduZXIgPSB7XG4gIHNpZ25lcjogQklQMzJJbnRlcmZhY2U7XG4gIGNvc2lnbmVyPzogQklQMzJJbnRlcmZhY2U7XG59O1xuXG50eXBlIFRyYW5zYWN0aW9uVXRpbEJ1aWxkT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiA9IHtcbiAgYW1vdW50VHlwZT86ICdudW1iZXInIHwgJ2JpZ2ludCc7XG4gIG91dHB1dEFtb3VudD86IG51bWJlciB8IGJpZ2ludCB8IHN0cmluZztcbiAgcHJldk91dHB1dHM/OiBQcmV2T3V0cHV0PFROdW1iZXI+W107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBrZXlzOiBLZXlUcmlwbGUsXG4gIGhhbGZTaWduZXJzOiBIYWxmU2lnbmVyW10sXG4gIHNjcmlwdFR5cGU6IFNjcmlwdFR5cGUyT2YzIHwgJ3Ayc2hQMnBrJyxcbiAgbmV0d29yazogTmV0d29yayxcbiAge1xuICAgIGFtb3VudFR5cGUgPSAnbnVtYmVyJyxcbiAgICBvdXRwdXRBbW91bnQgPSBkZWZhdWx0VGVzdE91dHB1dEFtb3VudCxcbiAgICBwcmV2T3V0cHV0cyA9IGdldFByZXZPdXRwdXRzPFROdW1iZXI+KHNjcmlwdFR5cGUsIHRvVE51bWJlcjxUTnVtYmVyPihvdXRwdXRBbW91bnQsIGFtb3VudFR5cGUpLCBuZXR3b3JrKSxcbiAgfTogVHJhbnNhY3Rpb25VdGlsQnVpbGRPcHRpb25zPFROdW1iZXI+ID0ge31cbik6IFV0eG9UcmFuc2FjdGlvbkJ1aWxkZXI8VE51bWJlcj4ge1xuICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGb3JOZXR3b3JrPFROdW1iZXI+KG5ldHdvcmspO1xuXG4gIHByZXZPdXRwdXRzLmZvckVhY2goKHsgdHhpZCwgdm91dCB9KSA9PiB7XG4gICAgdHhCdWlsZGVyLmFkZElucHV0KHR4aWQsIHZvdXQpO1xuICB9KTtcblxuICBjb25zdCByZWNpcGllbnRTY3JpcHQgPSBjcmVhdGVTY3JpcHRQdWJLZXkoZml4dHVyZUtleXMsICdwMnBraCcsIG5ldHdvcmtzLmJpdGNvaW4pO1xuICB0eEJ1aWxkZXIuYWRkT3V0cHV0KHJlY2lwaWVudFNjcmlwdCwgdG9UTnVtYmVyPFROdW1iZXI+KEJpZ0ludChvdXRwdXRBbW91bnQpIC0gQmlnSW50KDEwMDApLCBhbW91bnRUeXBlKSk7XG5cbiAgY29uc3QgcHVia2V5cyA9IGtleXMubWFwKChrKSA9PiBrLnB1YmxpY0tleSk7XG4gIGFzc2VydChpc1RyaXBsZShwdWJrZXlzKSk7XG5cbiAgcHJldk91dHB1dHMuZm9yRWFjaCgoeyB2YWx1ZSB9LCB2aW4pID0+IHtcbiAgICBoYWxmU2lnbmVycy5mb3JFYWNoKCh7IHNpZ25lciwgY29zaWduZXIgfSkgPT4ge1xuICAgICAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgICAgc2lnbklucHV0UDJzaFAycGsodHhCdWlsZGVyLCB2aW4sIHNpZ25lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWNvc2lnbmVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHNldCBjb3NpZ25lcmApO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25JbnB1dDJPZjModHhCdWlsZGVyLCB2aW4sIHNjcmlwdFR5cGUgYXMgU2NyaXB0VHlwZTJPZjMsIHB1YmtleXMsIHNpZ25lciwgY29zaWduZXIucHVibGljS2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB0eEJ1aWxkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbnNpZ25lZFRyYW5zYWN0aW9uMk9mMzxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAga2V5czogS2V5VHJpcGxlLFxuICBzY3JpcHRUeXBlOiBTY3JpcHRUeXBlMk9mMyB8ICdwMnNoUDJwaycsXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIHBhcmFtczogVHJhbnNhY3Rpb25VdGlsQnVpbGRPcHRpb25zPFROdW1iZXI+ID0ge31cbik6IFV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gIHJldHVybiBnZXRUcmFuc2FjdGlvbkJ1aWxkZXI8VE51bWJlcj4oa2V5cywgW10sIHNjcmlwdFR5cGUsIG5ldHdvcmssIHBhcmFtcykuYnVpbGRJbmNvbXBsZXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWxmU2lnbmVkVHJhbnNhY3Rpb24yT2YzPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBrZXlzOiBLZXlUcmlwbGUsXG4gIHNpZ25lcjE6IEJJUDMySW50ZXJmYWNlLFxuICBzaWduZXIyOiBCSVAzMkludGVyZmFjZSxcbiAgc2NyaXB0VHlwZTogU2NyaXB0VHlwZTJPZjMgfCAncDJzaFAycGsnLFxuICBuZXR3b3JrOiBOZXR3b3JrLFxuICBvcHRzOiBUcmFuc2FjdGlvblV0aWxCdWlsZE9wdGlvbnM8VE51bWJlcj4gPSB7fVxuKTogVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgcmV0dXJuIGdldFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPihcbiAgICBrZXlzLFxuICAgIFt7IHNpZ25lcjogc2lnbmVyMSwgY29zaWduZXI6IHNpZ25lcjIgfV0sXG4gICAgc2NyaXB0VHlwZSxcbiAgICBuZXR3b3JrLFxuICAgIG9wdHNcbiAgKS5idWlsZEluY29tcGxldGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bGxTaWduZWRUcmFuc2FjdGlvblAyc2hQMnBrPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBrZXlzOiBLZXlUcmlwbGUsXG4gIHNpZ25lcjE6IEJJUDMySW50ZXJmYWNlLFxuICBuZXR3b3JrOiBOZXR3b3JrLFxuICBvcHRzOiBUcmFuc2FjdGlvblV0aWxCdWlsZE9wdGlvbnM8VE51bWJlcj4gPSB7fVxuKTogVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgcmV0dXJuIGdldFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPihrZXlzLCBbeyBzaWduZXI6IHNpZ25lcjEgfV0sICdwMnNoUDJwaycsIG5ldHdvcmssIG9wdHMpLmJ1aWxkKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdWxsU2lnbmVkVHJhbnNhY3Rpb24yT2YzPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBrZXlzOiBLZXlUcmlwbGUsXG4gIHNpZ25lcjE6IEJJUDMySW50ZXJmYWNlLFxuICBzaWduZXIyOiBCSVAzMkludGVyZmFjZSxcbiAgc2NyaXB0VHlwZTogU2NyaXB0VHlwZTJPZjMgfCAncDJzaFAycGsnLFxuICBuZXR3b3JrOiBOZXR3b3JrLFxuICBvcHRzOiBUcmFuc2FjdGlvblV0aWxCdWlsZE9wdGlvbnM8VE51bWJlcj4gPSB7fVxuKTogVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgcmV0dXJuIGdldFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPihcbiAgICBrZXlzLFxuICAgIFtcbiAgICAgIHsgc2lnbmVyOiBzaWduZXIxLCBjb3NpZ25lcjogc2lnbmVyMiB9LFxuICAgICAgeyBzaWduZXI6IHNpZ25lcjIsIGNvc2lnbmVyOiBzaWduZXIxIH0sXG4gICAgXSxcbiAgICBzY3JpcHRUeXBlLFxuICAgIG5ldHdvcmssXG4gICAgb3B0c1xuICApLmJ1aWxkKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvblN0YWdlczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAga2V5czogS2V5VHJpcGxlLFxuICBzaWduZXIxOiBCSVAzMkludGVyZmFjZSxcbiAgc2lnbmVyMjogQklQMzJJbnRlcmZhY2UsXG4gIHNjcmlwdFR5cGU6IFNjcmlwdFR5cGUyT2YzIHwgJ3Ayc2hQMnBrJyxcbiAgbmV0d29yazogTmV0d29yayxcbiAgb3B0czogVHJhbnNhY3Rpb25VdGlsQnVpbGRPcHRpb25zPFROdW1iZXI+XG4pOiB7XG4gIHVuc2lnbmVkOiBVdHhvVHJhbnNhY3Rpb248VE51bWJlcj47XG4gIGhhbGZTaWduZWQ6IFV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPjtcbiAgZnVsbFNpZ25lZDogVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+O1xufSB7XG4gIGNvbnN0IGhhbGZTaWduZWQgPSBnZXRIYWxmU2lnbmVkVHJhbnNhY3Rpb24yT2YzKGtleXMsIHNpZ25lcjEsIHNpZ25lcjIsIHNjcmlwdFR5cGUsIG5ldHdvcmssIG9wdHMpO1xuICBjb25zdCBmdWxsU2lnbmVkID1cbiAgICBzY3JpcHRUeXBlID09PSAncDJzaFAycGsnXG4gICAgICA/IGhhbGZTaWduZWRcbiAgICAgIDogZ2V0RnVsbFNpZ25lZFRyYW5zYWN0aW9uMk9mMyhrZXlzLCBzaWduZXIxLCBzaWduZXIyLCBzY3JpcHRUeXBlLCBuZXR3b3JrLCBvcHRzKTtcblxuICByZXR1cm4ge1xuICAgIHVuc2lnbmVkOiBnZXRVbnNpZ25lZFRyYW5zYWN0aW9uMk9mMyhrZXlzLCBzY3JpcHRUeXBlLCBuZXR3b3JrLCBvcHRzKSxcbiAgICBoYWxmU2lnbmVkLFxuICAgIGZ1bGxTaWduZWQsXG4gIH07XG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!