PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/utxo-core/dist/src/testutil/descriptor

Просмотр файла: descriptors.js

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDefaultXPubs = getDefaultXPubs;
exports.getUnspendableKey = getUnspendableKey;
exports.getPsbtParams = getPsbtParams;
exports.containsKey = containsKey;
exports.getTapLeafScripts = getTapLeafScripts;
exports.getDescriptor = getDescriptor;
exports.getDescriptorMap = getDescriptorMap;
const assert_1 = __importDefault(require("assert"));
const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
const utxo_lib_1 = require("@bitgo/utxo-lib");
const key_utils_1 = require("../key.utils");
function getDefaultXPubs(seed) {
    return (0, key_utils_1.getKeyTriple)(seed).map((k) => k.neutered().toBase58());
}
function getUnspendableKey() {
    /*
    https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#constructing-and-spending-taproot-outputs
  
    ```
    If one or more of the spending conditions consist of just a single key (after aggregation), the most likely one should
    be made the internal key. If no such condition exists, it may be worthwhile adding one that consists of an aggregation
    of all keys participating in all scripts combined; effectively adding an "everyone agrees" branch. If that is
    inacceptable, pick as internal key a "Nothing Up My Sleeve" (NUMS) point, i.e., a point with unknown discrete
    logarithm.
  
    One example of such a point is H = lift_x(0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0) which is
    constructed by taking the hash of the standard uncompressed encoding of the secp256k1 base point G as X coordinate.
    In order to avoid leaking the information that key path spending is not possible it is recommended to pick a fresh
    integer r in the range 0...n-1 uniformly at random and use H + rG as internal key. It is possible to prove that this
    internal key does not have a known discrete logarithm with respect to G by revealing r to a verifier who can then
    reconstruct how the internal key was created.
    ```
  
    We could do the random integer trick here, but for internal testing it is sufficient to use the fixed point.
    */
    return '50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0';
}
function toDescriptorMap(v) {
    return new Map(Object.entries(v).map(([k, v]) => [k, wasm_miniscript_1.Descriptor.fromString(v, 'derivable')]));
}
function toXPub(k, path) {
    if (typeof k === 'string') {
        return k + '/' + path;
    }
    return k.neutered().toBase58() + '/' + path;
}
function toPlain(k, { xonly = false } = {}) {
    if (typeof k === 'string') {
        if (k.startsWith('xpub') || k.startsWith('xprv')) {
            return toPlain(utxo_lib_1.bip32.fromBase58(k), { xonly });
        }
        return k;
    }
    return k.publicKey.subarray(xonly ? 1 : 0).toString('hex');
}
function toXOnly(k) {
    return toPlain(k, { xonly: true });
}
function multiArgs(m, n, keys, path) {
    if (n < m) {
        throw new Error(`Cannot create ${m} of ${n} multisig`);
    }
    if (keys.length < n) {
        throw new Error(`Not enough keys for ${m} of ${n} multisig: keys.length=${keys.length}`);
    }
    keys = keys.slice(0, n);
    return [m, ...keys.map((k) => toXPub(k, path))];
}
function getPsbtParams(t) {
    switch (t) {
        case 'Wsh2Of3CltvDrop':
            return { locktime: 1 };
        default:
            return {};
    }
}
function getDescriptorNode(template, keys = getDefaultXPubs(), path = '0/*') {
    switch (template) {
        case 'Wsh2Of3':
            return {
                wsh: { multi: multiArgs(2, 3, keys, path) },
            };
        case 'Wsh2Of3CltvDrop':
            const { locktime } = getPsbtParams(template);
            (0, assert_1.default)(locktime);
            return {
                wsh: {
                    and_v: [{ 'r:after': locktime }, { multi: multiArgs(2, 3, keys, path) }],
                },
            };
        case 'Wsh2Of2':
            return {
                wsh: { multi: multiArgs(2, 2, keys, path) },
            };
        case 'Tr2Of3-NoKeyPath':
            return {
                tr: [getUnspendableKey(), { multi_a: multiArgs(2, 3, keys, path) }],
            };
        case 'Tr1Of3-NoKeyPath-Tree':
            return {
                tr: [
                    getUnspendableKey(),
                    [{ pk: toXPub(keys[0], path) }, [{ pk: toXPub(keys[1], path) }, { pk: toXPub(keys[2], path) }]],
                ],
            };
        case 'Tr1Of3-NoKeyPath-Tree-Plain':
            return {
                tr: [getUnspendableKey(), [{ pk: toXOnly(keys[0]) }, [{ pk: toXOnly(keys[1]) }, { pk: toXOnly(keys[2]) }]]],
            };
    }
    throw new Error(`Unknown descriptor template: ${template}`);
}
function getTapLeafScriptNodes(t) {
    if (Array.isArray(t)) {
        if (t.length !== 2) {
            throw new Error(`expected tuple, got: ${JSON.stringify(t)}`);
        }
        return t.map((v) => (Array.isArray(v) ? getTapLeafScriptNodes(v) : v)).flat();
    }
    if (typeof t === 'object') {
        const node = t;
        if (!('tr' in node)) {
            throw new Error(`TapLeafScripts are only supported for Taproot descriptors, got: ${t}`);
        }
        if (!Array.isArray(node.tr) || node.tr.length !== 2) {
            throw new Error(`expected tuple, got: ${JSON.stringify(node.tr)}`);
        }
        const tapscript = node.tr[1];
        if (!Array.isArray(tapscript)) {
            throw new Error(`expected tapscript to be an array, got: ${JSON.stringify(tapscript)}`);
        }
        return getTapLeafScriptNodes(tapscript);
    }
    throw new Error(`Invalid input: ${JSON.stringify(t)}`);
}
function containsKey(script, key) {
    if (script instanceof wasm_miniscript_1.Miniscript) {
        script = wasm_miniscript_1.ast.fromMiniscript(script);
    }
    if ('pk' in script) {
        return script.pk === toXOnly(key);
    }
    throw new Error(`Unsupported script type: ${JSON.stringify(script)}`);
}
function getTapLeafScripts(d) {
    return getTapLeafScriptNodes(wasm_miniscript_1.ast.fromDescriptor(d)).map((n) => wasm_miniscript_1.Miniscript.fromString(wasm_miniscript_1.ast.formatNode(n), 'tap').toString());
}
function getDescriptor(template, keys = getDefaultXPubs(), path = '0/*') {
    return wasm_miniscript_1.Descriptor.fromStringDetectType(wasm_miniscript_1.ast.formatNode(getDescriptorNode(template, keys, path)));
}
function getDescriptorMap(template, keys = getDefaultXPubs()) {
    return toDescriptorMap({
        external: getDescriptor(template, keys, '0/*').toString(),
        internal: getDescriptor(template, keys, '1/*').toString(),
    });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVzdHV0aWwvZGVzY3JpcHRvci9kZXNjcmlwdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFBLDBDQUVDO0FBRUQsOENBc0JDO0FBb0RELHNDQU9DO0FBdUVELGtDQVFDO0FBRUQsOENBSUM7QUFFRCxzQ0FNQztBQUVELDRDQVFDO0FBcE1ELG9EQUE0QjtBQUU1Qiw0REFBcUU7QUFDckUsOENBQXdEO0FBR3hELDRDQUErRDtBQUUvRCxTQUFnQixlQUFlLENBQUMsSUFBYTtJQUMzQyxPQUFPLElBQUEsd0JBQVksRUFBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBbUIsQ0FBQztBQUNsRixDQUFDO0FBRUQsU0FBZ0IsaUJBQWlCO0lBQy9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BbUJFO0lBQ0YsT0FBTyxrRUFBa0UsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsQ0FBeUI7SUFDaEQsT0FBTyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSw0QkFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsQ0FBQztBQWdCRCxTQUFTLE1BQU0sQ0FBQyxDQUEwQixFQUFFLElBQVk7SUFDdEQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxR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LFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRyxDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQzlCLFFBQTRCLEVBQzVCLE9BQTZCLGVBQWUsRUFBRTtJQUU5QyxPQUFPLGVBQWUsQ0FBQztRQUNyQixRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFO1FBQ3pELFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUU7S0FDMUQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgTWluaXNjcmlwdCwgRGVzY3JpcHRvciwgYXN0IH0gZnJvbSAnQGJpdGdvL3dhc20tbWluaXNjcmlwdCc7XG5pbXBvcnQgeyBiaXAzMiwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG5pbXBvcnQgeyBEZXNjcmlwdG9yTWFwLCBQc2J0UGFyYW1zIH0gZnJvbSAnLi4vLi4vZGVzY3JpcHRvcic7XG5pbXBvcnQgeyBnZXRLZXlUcmlwbGUsIFRyaXBsZSwgS2V5VHJpcGxlIH0gZnJvbSAnLi4va2V5LnV0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRYUHVicyhzZWVkPzogc3RyaW5nKTogVHJpcGxlPHN0cmluZz4ge1xuICByZXR1cm4gZ2V0S2V5VHJpcGxlKHNlZWQpLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIGFzIFRyaXBsZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5zcGVuZGFibGVLZXkoKTogc3RyaW5nIHtcbiAgLypcbiAgaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDM0MS5tZWRpYXdpa2kjY29uc3RydWN0aW5nLWFuZC1zcGVuZGluZy10YXByb290LW91dHB1dHNcblxuICBgYGBcbiAgSWYgb25lIG9yIG1vcmUgb2YgdGhlIHNwZW5kaW5nIGNvbmRpdGlvbnMgY29uc2lzdCBvZiBqdXN0IGEgc2luZ2xlIGtleSAoYWZ0ZXIgYWdncmVnYXRpb24pLCB0aGUgbW9zdCBsaWtlbHkgb25lIHNob3VsZFxuICBiZSBtYWRlIHRoZSBpbnRlcm5hbCBrZXkuIElmIG5vIHN1Y2ggY29uZGl0aW9uIGV4aXN0cywgaXQgbWF5IGJlIHdvcnRod2hpbGUgYWRkaW5nIG9uZSB0aGF0IGNvbnNpc3RzIG9mIGFuIGFnZ3JlZ2F0aW9uXG4gIG9mIGFsbCBrZXlzIHBhcnRpY2lwYXRpbmcgaW4gYWxsIHNjcmlwdHMgY29tYmluZWQ7IGVmZmVjdGl2ZWx5IGFkZGluZyBhbiBcImV2ZXJ5b25lIGFncmVlc1wiIGJyYW5jaC4gSWYgdGhhdCBpc1xuICBpbmFjY2VwdGFibGUsIHBpY2sgYXMgaW50ZXJuYWwga2V5IGEgXCJOb3RoaW5nIFVwIE15IFNsZWV2ZVwiIChOVU1TKSBwb2ludCwgaS5lLiwgYSBwb2ludCB3aXRoIHVua25vd24gZGlzY3JldGVcbiAgbG9nYXJpdGhtLlxuXG4gIE9uZSBleGFtcGxlIG9mIHN1Y2ggYSBwb2ludCBpcyBIID0gbGlmdF94KDB4NTA5MjliNzRjMWEwNDk1NGI3OGI0YjYwMzVlOTdhNWUwNzhhNWEwZjI4ZWM5NmQ1NDdiZmVlOWFjZTgwM2FjMCkgd2hpY2ggaXNcbiAgY29uc3RydWN0ZWQgYnkgdGFraW5nIHRoZSBoYXNoIG9mIHRoZSBzdGFuZGFyZCB1bmNvbXByZXNzZWQgZW5jb2Rpbmcgb2YgdGhlIHNlY3AyNTZrMSBiYXNlIHBvaW50IEcgYXMgWCBjb29yZGluYXRlLlxuICBJbiBvcmRlciB0byBhdm9pZCBsZWFraW5nIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGtleSBwYXRoIHNwZW5kaW5nIGlzIG5vdCBwb3NzaWJsZSBpdCBpcyByZWNvbW1lbmRlZCB0byBwaWNrIGEgZnJlc2hcbiAgaW50ZWdlciByIGluIHRoZSByYW5nZSAwLi4ubi0xIHVuaWZvcm1seSBhdCByYW5kb20gYW5kIHVzZSBIICsgckcgYXMgaW50ZXJuYWwga2V5LiBJdCBpcyBwb3NzaWJsZSB0byBwcm92ZSB0aGF0IHRoaXNcbiAgaW50ZXJuYWwga2V5IGRvZXMgbm90IGhhdmUgYSBrbm93biBkaXNjcmV0ZSBsb2dhcml0aG0gd2l0aCByZXNwZWN0IHRvIEcgYnkgcmV2ZWFsaW5nIHIgdG8gYSB2ZXJpZmllciB3aG8gY2FuIHRoZW5cbiAgcmVjb25zdHJ1Y3QgaG93IHRoZSBpbnRlcm5hbCBrZXkgd2FzIGNyZWF0ZWQuXG4gIGBgYFxuXG4gIFdlIGNvdWxkIGRvIHRoZSByYW5kb20gaW50ZWdlciB0cmljayBoZXJlLCBidXQgZm9yIGludGVybmFsIHRlc3RpbmcgaXQgaXMgc3VmZmljaWVudCB0byB1c2UgdGhlIGZpeGVkIHBvaW50LlxuICAqL1xuICByZXR1cm4gJzUwOTI5Yjc0YzFhMDQ5NTRiNzhiNGI2MDM1ZTk3YTVlMDc4YTVhMGYyOGVjOTZkNTQ3YmZlZTlhY2U4MDNhYzAnO1xufVxuXG5mdW5jdGlvbiB0b0Rlc2NyaXB0b3JNYXAodjogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IERlc2NyaXB0b3JNYXAge1xuICByZXR1cm4gbmV3IE1hcChPYmplY3QuZW50cmllcyh2KS5tYXAoKFtrLCB2XSkgPT4gW2ssIERlc2NyaXB0b3IuZnJvbVN0cmluZyh2LCAnZGVyaXZhYmxlJyldKSk7XG59XG5cbmV4cG9ydCB0eXBlIERlc2NyaXB0b3JUZW1wbGF0ZSA9XG4gIHwgJ1dzaDJPZjMnXG4gIHwgJ1RyMU9mMy1Ob0tleVBhdGgtVHJlZSdcbiAgLy8gbm8geHB1YnMsIGp1c3QgcGxhaW4ga2V5c1xuICB8ICdUcjFPZjMtTm9LZXlQYXRoLVRyZWUtUGxhaW4nXG4gIHwgJ1RyMk9mMy1Ob0tleVBhdGgnXG4gIHwgJ1dzaDJPZjInXG4gIC8qXG4gICAqIFRoaXMgaXMgYSB3cmFwcGVkIHNlZ3dpdCAyb2YzIG11bHRpc2lnIHRoYXQgYWxzbyB1c2VzIGEgcmVsYXRpdmUgbG9ja3RpbWUgd2l0aFxuICAgKiBhbiBPUF9EUk9QIChyZXF1aXJpbmcgYSBtaW5pc2NyaXB0IGV4dGVuc2lvbikuXG4gICAqIEl0IGlzIGJhc2ljYWxseSB3aGF0IGlzIHVzZWQgaW4gQ29yZURhbyBzdGFraW5nIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHwgJ1dzaDJPZjNDbHR2RHJvcCc7XG5cbmZ1bmN0aW9uIHRvWFB1YihrOiBCSVAzMkludGVyZmFjZSB8IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBrID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBrICsgJy8nICsgcGF0aDtcbiAgfVxuICByZXR1cm4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgKyAnLycgKyBwYXRoO1xufVxuXG5mdW5jdGlvbiB0b1BsYWluKGs6IEJJUDMySW50ZXJmYWNlIHwgc3RyaW5nLCB7IHhvbmx5ID0gZmFsc2UgfSA9IHt9KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBrID09PSAnc3RyaW5nJykge1xuICAgIGlmIChrLnN0YXJ0c1dpdGgoJ3hwdWInKSB8fCBrLnN0YXJ0c1dpdGgoJ3hwcnYnKSkge1xuICAgICAgcmV0dXJuIHRvUGxhaW4oYmlwMzIuZnJvbUJhc2U1OChrKSwgeyB4b25seSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGs7XG4gIH1cbiAgcmV0dXJuIGsucHVibGljS2V5LnN1YmFycmF5KHhvbmx5ID8gMSA6IDApLnRvU3RyaW5nKCdoZXgnKTtcbn1cblxuZnVuY3Rpb24gdG9YT25seShrOiBCSVAzMkludGVyZmFjZSB8IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0b1BsYWluKGssIHsgeG9ubHk6IHRydWUgfSk7XG59XG5cbmZ1bmN0aW9uIG11bHRpQXJncyhtOiBudW1iZXIsIG46IG51bWJlciwga2V5czogQklQMzJJbnRlcmZhY2VbXSB8IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmcpOiBbbnVtYmVyLCAuLi5zdHJpbmdbXV0ge1xuICBpZiAobiA8IG0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgJHttfSBvZiAke259IG11bHRpc2lnYCk7XG4gIH1cbiAgaWYgKGtleXMubGVuZ3RoIDwgbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm90IGVub3VnaCBrZXlzIGZvciAke219IG9mICR7bn0gbXVsdGlzaWc6IGtleXMubGVuZ3RoPSR7a2V5cy5sZW5ndGh9YCk7XG4gIH1cbiAga2V5cyA9IGtleXMuc2xpY2UoMCwgbik7XG4gIHJldHVybiBbbSwgLi4ua2V5cy5tYXAoKGspID0+IHRvWFB1YihrLCBwYXRoKSldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHNidFBhcmFtcyh0OiBEZXNjcmlwdG9yVGVtcGxhdGUpOiBQYXJ0aWFsPFBzYnRQYXJhbXM+IHtcbiAgc3dpdGNoICh0KSB7XG4gICAgY2FzZSAnV3NoMk9mM0NsdHZEcm9wJzpcbiAgICAgIHJldHVybiB7IGxvY2t0aW1lOiAxIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZXNjcmlwdG9yTm9kZShcbiAgdGVtcGxhdGU6IERlc2NyaXB0b3JUZW1wbGF0ZSxcbiAga2V5czogS2V5VHJpcGxlIHwgc3RyaW5nW10gPSBnZXREZWZhdWx0WFB1YnMoKSxcbiAgcGF0aCA9ICcwLyonXG4pOiBhc3QuRGVzY3JpcHRvck5vZGUge1xuICBzd2l0Y2ggKHRlbXBsYXRlKSB7XG4gICAgY2FzZSAnV3NoMk9mMyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3c2g6IHsgbXVsdGk6IG11bHRpQXJncygyLCAzLCBrZXlzLCBwYXRoKSB9LFxuICAgICAgfTtcbiAgICBjYXNlICdXc2gyT2YzQ2x0dkRyb3AnOlxuICAgICAgY29uc3QgeyBsb2NrdGltZSB9ID0gZ2V0UHNidFBhcmFtcyh0ZW1wbGF0ZSk7XG4gICAgICBhc3NlcnQobG9ja3RpbWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3NoOiB7XG4gICAgICAgICAgYW5kX3Y6IFt7ICdyOmFmdGVyJzogbG9ja3RpbWUgfSwgeyBtdWx0aTogbXVsdGlBcmdzKDIsIDMsIGtleXMsIHBhdGgpIH1dLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICBjYXNlICdXc2gyT2YyJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdzaDogeyBtdWx0aTogbXVsdGlBcmdzKDIsIDIsIGtleXMsIHBhdGgpIH0sXG4gICAgICB9O1xuICAgIGNhc2UgJ1RyMk9mMy1Ob0tleVBhdGgnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHI6IFtnZXRVbnNwZW5kYWJsZUtleSgpLCB7IG11bHRpX2E6IG11bHRpQXJncygyLCAzLCBrZXlzLCBwYXRoKSB9XSxcbiAgICAgIH07XG4gICAgY2FzZSAnVHIxT2YzLU5vS2V5UGF0aC1UcmVlJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyOiBbXG4gICAgICAgICAgZ2V0VW5zcGVuZGFibGVLZXkoKSxcbiAgICAgICAgICBbeyBwazogdG9YUHViKGtleXNbMF0sIHBhdGgpIH0sIFt7IHBrOiB0b1hQdWIoa2V5c1sxXSwgcGF0aCkgfSwgeyBwazogdG9YUHViKGtleXNbMl0sIHBhdGgpIH1dXSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgY2FzZSAnVHIxT2YzLU5vS2V5UGF0aC1UcmVlLVBsYWluJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyOiBbZ2V0VW5zcGVuZGFibGVLZXkoKSwgW3sgcGs6IHRvWE9ubHkoa2V5c1swXSkgfSwgW3sgcGs6IHRvWE9ubHkoa2V5c1sxXSkgfSwgeyBwazogdG9YT25seShrZXlzWzJdKSB9XV1dLFxuICAgICAgfTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGVzY3JpcHRvciB0ZW1wbGF0ZTogJHt0ZW1wbGF0ZX1gKTtcbn1cblxudHlwZSBUYXBUcmVlID0gW1RhcFRyZWUsIFRhcFRyZWVdIHwgYXN0Lk1pbmlzY3JpcHROb2RlO1xuXG5mdW5jdGlvbiBnZXRUYXBMZWFmU2NyaXB0Tm9kZXModDogYXN0LkRlc2NyaXB0b3JOb2RlIHwgVGFwVHJlZSk6IGFzdC5NaW5pc2NyaXB0Tm9kZVtdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodCkpIHtcbiAgICBpZiAodC5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgdHVwbGUsIGdvdDogJHtKU09OLnN0cmluZ2lmeSh0KX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHQubWFwKCh2KSA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IGdldFRhcExlYWZTY3JpcHROb2Rlcyh2KSA6IHYpKS5mbGF0KCk7XG4gIH1cblxuICBpZiAodHlwZW9mIHQgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3Qgbm9kZSA9IHQ7XG4gICAgaWYgKCEoJ3RyJyBpbiBub2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYXBMZWFmU2NyaXB0cyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIFRhcHJvb3QgZGVzY3JpcHRvcnMsIGdvdDogJHt0fWApO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZS50cikgfHwgbm9kZS50ci5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgdHVwbGUsIGdvdDogJHtKU09OLnN0cmluZ2lmeShub2RlLnRyKX1gKTtcbiAgICB9XG4gICAgY29uc3QgdGFwc2NyaXB0ID0gbm9kZS50clsxXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFwc2NyaXB0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCB0YXBzY3JpcHQgdG8gYmUgYW4gYXJyYXksIGdvdDogJHtKU09OLnN0cmluZ2lmeSh0YXBzY3JpcHQpfWApO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0VGFwTGVhZlNjcmlwdE5vZGVzKHRhcHNjcmlwdCk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5wdXQ6ICR7SlNPTi5zdHJpbmdpZnkodCl9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc0tleShzY3JpcHQ6IE1pbmlzY3JpcHQgfCBhc3QuTWluaXNjcmlwdE5vZGUsIGtleTogQklQMzJJbnRlcmZhY2UgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHNjcmlwdCBpbnN0YW5jZW9mIE1pbmlzY3JpcHQpIHtcbiAgICBzY3JpcHQgPSBhc3QuZnJvbU1pbmlzY3JpcHQoc2NyaXB0KTtcbiAgfVxuICBpZiAoJ3BrJyBpbiBzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0LnBrID09PSB0b1hPbmx5KGtleSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzY3JpcHQgdHlwZTogJHtKU09OLnN0cmluZ2lmeShzY3JpcHQpfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFwTGVhZlNjcmlwdHMoZDogRGVzY3JpcHRvcik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGdldFRhcExlYWZTY3JpcHROb2Rlcyhhc3QuZnJvbURlc2NyaXB0b3IoZCkpLm1hcCgobikgPT5cbiAgICBNaW5pc2NyaXB0LmZyb21TdHJpbmcoYXN0LmZvcm1hdE5vZGUobiksICd0YXAnKS50b1N0cmluZygpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNjcmlwdG9yKFxuICB0ZW1wbGF0ZTogRGVzY3JpcHRvclRlbXBsYXRlLFxuICBrZXlzOiBLZXlUcmlwbGUgfCBzdHJpbmdbXSA9IGdldERlZmF1bHRYUHVicygpLFxuICBwYXRoID0gJzAvKidcbik6IERlc2NyaXB0b3Ige1xuICByZXR1cm4gRGVzY3JpcHRvci5mcm9tU3RyaW5nRGV0ZWN0VHlwZShhc3QuZm9ybWF0Tm9kZShnZXREZXNjcmlwdG9yTm9kZSh0ZW1wbGF0ZSwga2V5cywgcGF0aCkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2NyaXB0b3JNYXAoXG4gIHRlbXBsYXRlOiBEZXNjcmlwdG9yVGVtcGxhdGUsXG4gIGtleXM6IEtleVRyaXBsZSB8IHN0cmluZ1tdID0gZ2V0RGVmYXVsdFhQdWJzKClcbik6IERlc2NyaXB0b3JNYXAge1xuICByZXR1cm4gdG9EZXNjcmlwdG9yTWFwKHtcbiAgICBleHRlcm5hbDogZ2V0RGVzY3JpcHRvcih0ZW1wbGF0ZSwga2V5cywgJzAvKicpLnRvU3RyaW5nKCksXG4gICAgaW50ZXJuYWw6IGdldERlc2NyaXB0b3IodGVtcGxhdGUsIGtleXMsICcxLyonKS50b1N0cmluZygpLFxuICB9KTtcbn1cbiJdfQ==

Выполнить команду


Для локальной разработки. Не используйте в интернете!