111 lines
15 KiB
JavaScript
111 lines
15 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.liftUndefined = exports.liftResult = exports.locateFailure = exports.chain = exports.using = exports.tryCatch = exports.assertSuccess = exports.errorFrom = exports.errorMessage = exports.unpackOr = exports.unpack = exports.isSuccess = exports.isFailure = exports.failure = void 0;
|
|
// Ensures you must use `fail()` to construct an instance of type Failure
|
|
const errorSym = Symbol('error');
|
|
function mkLocate(prefix) {
|
|
const ret = (error) => failure(`${prefix}: ${error}`);
|
|
ret.in = (prefix2) => mkLocate(`${prefix}: ${prefix2}`);
|
|
ret.locate = locateFailure(prefix);
|
|
return ret;
|
|
}
|
|
function failure(error) {
|
|
return { [errorSym]: error };
|
|
}
|
|
exports.failure = failure;
|
|
failure.in = (prefix) => mkLocate(prefix);
|
|
failure.locate = (x) => x;
|
|
function isFailure(x) {
|
|
return !!x && typeof x === 'object' && x[errorSym];
|
|
}
|
|
exports.isFailure = isFailure;
|
|
function isSuccess(x) {
|
|
return !isFailure(x);
|
|
}
|
|
exports.isSuccess = isSuccess;
|
|
function unpack(x) {
|
|
if (isFailure(x)) {
|
|
throw new Error(`unpack: ${x[errorSym]}`);
|
|
}
|
|
return x;
|
|
}
|
|
exports.unpack = unpack;
|
|
function unpackOr(x, def) {
|
|
return (isFailure(x) ? def : x);
|
|
}
|
|
exports.unpackOr = unpackOr;
|
|
function errorMessage(x) {
|
|
return x[errorSym];
|
|
}
|
|
exports.errorMessage = errorMessage;
|
|
function errorFrom(x) {
|
|
return new Error(errorMessage(x));
|
|
}
|
|
exports.errorFrom = errorFrom;
|
|
function assertSuccess(x) {
|
|
if (isFailure(x)) {
|
|
throw errorFrom(x);
|
|
}
|
|
}
|
|
exports.assertSuccess = assertSuccess;
|
|
function tryCatch(failOrBlock, maybeBlock) {
|
|
const block = (maybeBlock ?? failOrBlock);
|
|
const f = (maybeBlock ? failOrBlock : failure);
|
|
try {
|
|
return block();
|
|
}
|
|
catch (e) {
|
|
return f(`Error: ${e.message}\n${e.stack}`);
|
|
}
|
|
}
|
|
exports.tryCatch = tryCatch;
|
|
function using(value, block) {
|
|
if (isFailure(value)) {
|
|
return value;
|
|
}
|
|
return block(value);
|
|
}
|
|
exports.using = using;
|
|
function chain(value, ...fns) {
|
|
for (const fn of fns) {
|
|
if (isFailure(value)) {
|
|
return value;
|
|
}
|
|
value = fn(value);
|
|
}
|
|
return value;
|
|
}
|
|
exports.chain = chain;
|
|
/* eslint-enable prettier/prettier */
|
|
/**
|
|
* Make a function that will prepend a prefix to error messages
|
|
*
|
|
* This is one way to be specific about the location where errors originate, by prefixing
|
|
* errors as the call stack unwinds.
|
|
*
|
|
* A different method is to pass in a modified failure function using `failure.in(...)`,
|
|
* to build the error message as the call stack deepens.
|
|
*/
|
|
function locateFailure(prefix) {
|
|
return (x) => (isFailure(x) ? failure(`${prefix}: ${x[errorSym]}`) : x);
|
|
}
|
|
exports.locateFailure = locateFailure;
|
|
function liftResult(xs) {
|
|
const failures = Array.isArray(xs) ? xs.filter(isFailure) : Object.values(xs).filter(isFailure);
|
|
if (failures.length > 0) {
|
|
return failure(failures.map(errorMessage).join(', '));
|
|
}
|
|
return xs;
|
|
}
|
|
exports.liftResult = liftResult;
|
|
function liftUndefined(valueOrFunction) {
|
|
if (typeof valueOrFunction === 'function') {
|
|
return (...args) => {
|
|
const value = valueOrFunction(...args);
|
|
return value !== undefined ? value : failure('value is undefined');
|
|
};
|
|
}
|
|
return valueOrFunction !== undefined ? valueOrFunction : failure('value is undefined');
|
|
}
|
|
exports.liftUndefined = liftUndefined;
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBeUU7QUFDekUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBYWpDLFNBQVMsUUFBUSxDQUFDLE1BQWM7SUFDOUIsTUFBTSxHQUFHLEdBQVMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUlELFNBQWdCLE9BQU8sQ0FBQyxLQUFhO0lBQ25DLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFGRCwwQkFFQztBQUNELE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsRCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUksQ0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFeEMsU0FBZ0IsU0FBUyxDQUFJLENBQVk7SUFDdkMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSyxDQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUZELDhCQUVDO0FBRUQsU0FBZ0IsU0FBUyxDQUFJLENBQVk7SUFDdkMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFD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O0lBQ2hHLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdkIsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUN2RDtJQUNELE9BQU8sRUFBUyxDQUFDO0FBQ25CLENBQUM7QUFSRCxnQ0FRQztBQU9ELFNBQWdCLGFBQWEsQ0FBQyxlQUFvQjtJQUNoRCxJQUFJLE9BQU8sZUFBZSxLQUFLLFVBQVUsRUFBRTtRQUN6QyxPQUFPLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRTtZQUN4QixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUN2QyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDO0tBQ0g7SUFDRCxPQUFPLGVBQWUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDekYsQ0FBQztBQVJELHNDQVFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRW5zdXJlcyB5b3UgbXVzdCB1c2UgYGZhaWwoKWAgdG8gY29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHR5cGUgRmFpbHVyZVxuY29uc3QgZXJyb3JTeW0gPSBTeW1ib2woJ2Vycm9yJyk7XG5cbmV4cG9ydCB0eXBlIFJlc3VsdDxBPiA9IEEgfCBGYWlsdXJlO1xuZXhwb3J0IGludGVyZmFjZSBGYWlsdXJlIHtcbiAgcmVhZG9ubHkgW2Vycm9yU3ltXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhaWwge1xuICAoZXJyb3I6IHN0cmluZyk6IEZhaWx1cmU7XG4gIGluKHByZWZpeDogc3RyaW5nKTogRmFpbDtcbiAgbG9jYXRlPEE+KHg6IFJlc3VsdDxBPik6IFJlc3VsdDxBPjtcbn1cblxuZnVuY3Rpb24gbWtMb2NhdGUocHJlZml4OiBzdHJpbmcpOiBGYWlsIHtcbiAgY29uc3QgcmV0OiBGYWlsID0gKGVycm9yOiBzdHJpbmcpID0+IGZhaWx1cmUoYCR7cHJlZml4fTogJHtlcnJvcn1gKTtcbiAgcmV0LmluID0gKHByZWZpeDI6IHN0cmluZykgPT4gbWtMb2NhdGUoYCR7cHJlZml4fTogJHtwcmVmaXgyfWApO1xuICByZXQubG9jYXRlID0gbG9jYXRlRmFpbHVyZShwcmVmaXgpO1xuICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIGZhaWx1cmUgZXh0ZW5kcyBGYWlsIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKGVycm9yOiBzdHJpbmcpOiBGYWlsdXJlIHtcbiAgcmV0dXJuIHsgW2Vycm9yU3ltXTogZXJyb3IgfTtcbn1cbmZhaWx1cmUuaW4gPSAocHJlZml4OiBzdHJpbmcpID0+IG1rTG9jYXRlKHByZWZpeCk7XG5mYWlsdXJlLmxvY2F0ZSA9IDxBPih4OiBSZXN1bHQ8QT4pID0+IHg7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZhaWx1cmU8QT4oeDogUmVzdWx0PEE+KTogeCBpcyBGYWlsdXJlIHtcbiAgcmV0dXJuICEheCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgKHggYXMgYW55KVtlcnJvclN5bV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N1Y2Nlc3M8QT4oeDogUmVzdWx0PEE+KTogeCBpcyBBIHtcbiAgcmV0dXJuICFpc0ZhaWx1cmUoeCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnBhY2s8QT4oeDogUmVzdWx0PEE+KTogQSB7XG4gIGlmIChpc0ZhaWx1cmUoeCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVucGFjazogJHt4W2Vycm9yU3ltXX1gKTtcbiAgfVxuICByZXR1cm4geDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVucGFja09yPEEsIEI+KHg6IFJlc3VsdDxBPiwgZGVmOiBCKTogQiBleHRlbmRzIEEgPyBBIDogQSB8IEIge1xuICByZXR1cm4gKGlzRmFpbHVyZSh4KSA/IGRlZiA6IHgpIGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZSh4OiBGYWlsdXJlKTogc3RyaW5nIHtcbiAgcmV0dXJuIHhbZXJyb3JTeW1dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JGcm9tKHg6IEZhaWx1cmUpOiBFcnJvciB7XG4gIHJldHVybiBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKHgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFN1Y2Nlc3M8QT4oeDogUmVzdWx0PEE+KTogYXNzZXJ0cyB4IGlzIEE7XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3VjY2Vzcyh4OiBGYWlsdXJlKTogbmV2ZXI7XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3VjY2Vzcyh4OiBGYWlsdXJlKTogdm9pZCB7XG4gIGlmIChpc0ZhaWx1cmUoeCkpIHtcbiAgICB0aHJvdyBlcnJvckZyb20oeCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUNhdGNoPEE+KGJsb2NrOiAoKSA9PiBBKTogUmVzdWx0PEE+O1xuZXhwb3J0IGZ1bmN0aW9uIHRyeUNhdGNoPEE+KGZhaWxGbjogRmFpbCwgYmxvY2s6ICgpID0+IEEpOiBSZXN1bHQ8QT47XG5leHBvcnQgZnVuY3Rpb24gdHJ5Q2F0Y2g8QT4oZmFpbE9yQmxvY2s6IEZhaWwgfCAoKCkgPT4gQSksIG1heWJlQmxvY2s/OiAoKSA9PiBBKTogUmVzdWx0PEE+IHtcbiAgY29uc3QgYmxvY2s6ICgpID0+IEEgPSAobWF5YmVCbG9jayA/PyBmYWlsT3JCbG9jaykgYXMgYW55O1xuICBjb25zdCBmOiBGYWlsID0gKG1heWJlQmxvY2sgPyBmYWlsT3JCbG9jayA6IGZhaWx1cmUpIGFzIGFueTtcblxuICB0cnkge1xuICAgIHJldHVybiBibG9jaygpO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICByZXR1cm4gZihgRXJyb3I6ICR7ZS5tZXNzYWdlfVxcbiR7ZS5zdGFja31gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNpbmc8QSwgQj4odmFsdWU6IFJlc3VsdDxBPiwgYmxvY2s6ICh4OiBBKSA9PiBSZXN1bHQ8Qj4pOiBSZXN1bHQ8Qj4ge1xuICBpZiAoaXNGYWlsdXJlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gYmxvY2sodmFsdWUpO1xufVxuXG4vKipcbiAqIExpa2UgJ3VzaW5nJywgYnV0IGNhbiB0YWtlIGFueSBudW1iZXIgb2YgZnVuY3Rpb25zXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIHByZXR0aWVyL3ByZXR0aWVyICovXG5leHBvcnQgZnVuY3Rpb24gY2hhaW48QSwgQj4odmFsdWU6IFJlc3VsdDxBPiwgYjA6ICh4OiBBKSA9PiBSZXN1bHQ8Qj4pOiBSZXN1bHQ8Qj47XG5leHBvcnQgZnVuY3Rpb24gY2hhaW48QSwgQiwgQz4odmFsdWU6IFJlc3VsdDxBPiwgYjA6ICh4OiBBKSA9PiBSZXN1bHQ8Qj4sIGIxOiAoeDogQikgPT4gUmVzdWx0PEM+KTogUmVzdWx0PEM+O1xuZXhwb3J0IGZ1bmN0aW9uIGNoYWluPEEsIEIsIEMsIEQ+KHZhbHVlOiBSZXN1bHQ8QT4sIGIwOiAoeDogQSkgPT4gUmVzdWx0PEI+LCBiMTogKHg6IEIpID0+IFJlc3VsdDxDPiwgYjI6ICh4OiBDKSA9PiBSZXN1bHQ8RD4pOiBSZXN1bHQ8RD47XG5leHBvcnQgZnVuY3Rpb24gY2hhaW48QSwgQiwgQywgRCwgRT4odmFsdWU6IFJlc3VsdDxBPiwgYjA6ICh4OiBBKSA9PiBSZXN1bHQ8Qj4sIGIxOiAoeDogQikgPT4gUmVzdWx0PEM+LCBiMjogKHg6IEMpID0+IFJlc3VsdDxEPiwgYjM6ICh4OiBEKSA9PiBSZXN1bHQ8RT4pOiBSZXN1bHQ8RT47XG5leHBvcnQgZnVuY3Rpb24gY2hhaW48QSwgQiwgQywgRCwgRSwgRj4odmFsdWU6IFJlc3VsdDxBPiwgYjA6ICh4OiBBKSA9PiBSZXN1bHQ8Qj4sIGIxOiAoeDogQikgPT4gUmVzdWx0PEM+LCBiMjogKHg6IEMpID0+IFJlc3VsdDxEPiwgYjM6ICh4OiBEKSA9PiBSZXN1bHQ8RT4sIGI0OiAoeDogRSkgPT4gUmVzdWx0PEY+KTogUmVzdWx0PEY+O1xuZXhwb3J0IGZ1bmN0aW9uIGNoYWluPEEsIEIsIEMsIEQsIEUsIEYsIEc+KHZhbHVlOiBSZXN1bHQ8QT4sIGIwOiAoeDogQSkgPT4gUmVzdWx0PEI+LCBiMTogKHg6IEIpID0+IFJlc3VsdDxDPiwgYjI6ICh4OiBDKSA9PiBSZXN1bHQ8RD4sIGIzOiAoeDogRCkgPT4gUmVzdWx0PEU+LCBiNDogKHg6IEUpID0+IFJlc3VsdDxGPiwgYjU6ICh4OiBGKSA9PiBSZXN1bHQ8Rz4pOiBSZXN1bHQ8Rz47XG5leHBvcnQgZnVuY3Rpb24gY2hhaW4odmFsdWU6IFJlc3VsdDxhbnk+LCAuLi5mbnM6IEFycmF5PCh4OiBhbnkpID0+IFJlc3VsdDxhbnk+Pik6IFJlc3VsdDxhbnk+IHtcbiAgZm9yIChjb25zdCBmbiBvZiBmbnMpIHtcbiAgICBpZiAoaXNGYWlsdXJlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG4vKiBlc2xpbnQtZW5hYmxlIHByZXR0aWVyL3ByZXR0aWVyICovXG5cbi8qKlxuICogTWFrZSBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBwcmVwZW5kIGEgcHJlZml4IHRvIGVycm9yIG1lc3NhZ2VzXG4gKlxuICogVGhpcyBpcyBvbmUgd2F5IHRvIGJlIHNwZWNpZmljIGFib3V0IHRoZSBsb2NhdGlvbiB3aGVyZSBlcnJvcnMgb3JpZ2luYXRlLCBieSBwcmVmaXhpbmdcbiAqIGVycm9ycyBhcyB0aGUgY2FsbCBzdGFjayB1bndpbmRzLlxuICpcbiAqIEEgZGlmZmVyZW50IG1ldGhvZCBpcyB0byBwYXNzIGluIGEgbW9kaWZpZWQgZmFpbHVyZSBmdW5jdGlvbiB1c2luZyBgZmFpbHVyZS5pbiguLi4pYCxcbiAqIHRvIGJ1aWxkIHRoZSBlcnJvciBtZXNzYWdlIGFzIHRoZSBjYWxsIHN0YWNrIGRlZXBlbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NhdGVGYWlsdXJlKHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiA8QT4oeDogUmVzdWx0PEE+KTogUmVzdWx0PEE+ID0+IChpc0ZhaWx1cmUoeCkgPyBmYWlsdXJlKGAke3ByZWZpeH06ICR7eFtlcnJvclN5bV19YCkgOiB4KTtcbn1cblxuZXhwb3J0IHR5cGUgRmFpbHVyZXMgPSBBcnJheTxGYWlsdXJlPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpZnRSZXN1bHQ8QT4oeHM6IFJlY29yZDxzdHJpbmcsIFJlc3VsdDxBPj4pOiBSZXN1bHQ8UmVjb3JkPHN0cmluZywgQT4+O1xuZXhwb3J0IGZ1bmN0aW9uIGxpZnRSZXN1bHQ8QT4oeHM6IEFycmF5PFJlc3VsdDxBPj4pOiBSZXN1bHQ8QXJyYXk8QT4+O1xuZXhwb3J0IGZ1bmN0aW9uIGxpZnRSZXN1bHQ8QT4oXG4gIHhzOiBSZWNvcmQ8c3RyaW5nLCBSZXN1bHQ8QT4+IHwgQXJyYXk8UmVzdWx0PEE+Pixcbik6IFJlc3VsdDxSZWNvcmQ8c3RyaW5nLCBBPj4gfCBSZXN1bHQ8QXJyYXk8QT4+IHtcbiAgY29uc3QgZmFpbHVyZXMgPSBBcnJheS5pc0FycmF5KHhzKSA/IHhzLmZpbHRlcihpc0ZhaWx1cmUpIDogT2JqZWN0LnZhbHVlcyh4cykuZmlsdGVyKGlzRmFpbHVyZSk7XG4gIGlmIChmYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUoZmFpbHVyZXMubWFwKGVycm9yTWVzc2FnZSkuam9pbignLCAnKSk7XG4gIH1cbiAgcmV0dXJuIHhzIGFzIGFueTtcbn1cblxuLyoqXG4gKiBMaWZ0IGEgdmFsdWUgdGhhdCBjYW4gYmUgJ3VuZGVmaW5lZCcgdG8gYSByZXN1bHQsIG9yIGEgZnVuY3Rpb24gdGhhdCBjYW4gcmV0dXJuIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpZnRVbmRlZmluZWQ8QT4odjogQSB8IHVuZGVmaW5lZCk6IFJlc3VsdDxOb25OdWxsYWJsZTxBPj47XG5leHBvcnQgZnVuY3Rpb24gbGlmdFVuZGVmaW5lZDxBLCBGIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBBPih2OiBGKTogKHg6IFBhcmFtZXRlcnM8Rj4pID0+IFJlc3VsdDxOb25OdWxsYWJsZTxBPj47XG5leHBvcnQgZnVuY3Rpb24gbGlmdFVuZGVmaW5lZCh2YWx1ZU9yRnVuY3Rpb246IGFueSk6IGFueSB7XG4gIGlmICh0eXBlb2YgdmFsdWVPckZ1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZU9yRnVuY3Rpb24oLi4uYXJncyk7XG4gICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogZmFpbHVyZSgndmFsdWUgaXMgdW5kZWZpbmVkJyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gdmFsdWVPckZ1bmN0aW9uICE9PSB1bmRlZmluZWQgPyB2YWx1ZU9yRnVuY3Rpb24gOiBmYWlsdXJlKCd2YWx1ZSBpcyB1bmRlZmluZWQnKTtcbn1cbiJdfQ==
|