eff
Version:
An extensible effect monad based on the freer monad
164 lines (147 loc) • 20.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.interpretInputStdIn = exports.interpretInput = exports.getKeypress = exports.getCharacter = void 0;
var _daggy = _interopRequireDefault(require("daggy"));
var _ramda = require("ramda");
var _eff = require("./eff.js");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var Input = _daggy.default.taggedSum("Input", {
getCharacter: [],
getKeypress: []
});
var getCharacter = (0, _ramda.always)((0, _eff.send)(Input.getCharacter));
exports.getCharacter = getCharacter;
var getKeypress = (0, _ramda.always)((0, _eff.send)(Input.getKeypress));
exports.getKeypress = getKeypress;
var zeroPrefixedKeypress = function zeroPrefixedKeypress(inputStream) {
return (0, _ramda.cond)([[(0, _ramda.equals)("A"), (0, _ramda.always)({
name: "up"
})], [(0, _ramda.equals)("B"), (0, _ramda.always)({
name: "down"
})], [(0, _ramda.equals)("C"), (0, _ramda.always)({
name: "right"
})], [(0, _ramda.equals)("D"), (0, _ramda.always)({
name: "left"
})], [(0, _ramda.equals)("E"), (0, _ramda.always)({
name: "clear"
})], [(0, _ramda.equals)("F"), (0, _ramda.always)({
name: "end"
})], [(0, _ramda.equals)("H"), (0, _ramda.always)({
name: "home"
})], [_ramda.T, (0, _ramda.always)({})]])(inputStream.read(1));
};
var controlSequenceKeypress = function controlSequenceKeypress(inputStream) {
return (0, _ramda.cond)([[(0, _ramda.equals)("A"), (0, _ramda.always)({
name: "up"
})], [(0, _ramda.equals)("B"), (0, _ramda.always)({
name: "down"
})], [(0, _ramda.equals)("C"), (0, _ramda.always)({
name: "right"
})], [(0, _ramda.equals)("D"), (0, _ramda.always)({
name: "left"
})], [(0, _ramda.equals)("E"), (0, _ramda.always)({
name: "clear"
})], [(0, _ramda.equals)("F"), (0, _ramda.always)({
name: "end"
})], [(0, _ramda.equals)("H"), (0, _ramda.always)({
name: "home"
})], [_ramda.T, (0, _ramda.always)({})]])(inputStream.read(1));
};
var escapedKeypress = function escapedKeypress(inputStream) {
return (0, _ramda.cond)([[(0, _ramda.equals)(""), (0, _ramda.always)({})], [(0, _ramda.either)((0, _ramda.equals)("\b"), (0, _ramda.equals)("\x7f")), (0, _ramda.always)({
name: "backspace",
meta: true
})], [(0, _ramda.equals)(" "), (0, _ramda.always)({
name: "space",
meta: true,
string: " "
})], [(0, _ramda.test)(/[a-zA-Z0-9]/), (0, _ramda.applySpec)({
name: _ramda.toLower,
meta: _ramda.T,
shift: (0, _ramda.test)(/[A-Z]/)
})], [(0, _ramda.equals)("0"), function () {
return zeroPrefixedKeypress(inputStream);
}], [(0, _ramda.equals)("["), function () {
return controlSequenceKeypress(inputStream);
}], [_ramda.T, (0, _ramda.always)({})]])((inputStream.read(1) || "").toString());
};
var nextKeypress = function nextKeypress(inputStream) {
return _objectSpread({
name: "unknown",
ctrl: false,
meta: false,
shift: false,
string: ""
}, (0, _ramda.cond)([[(0, _ramda.equals)(""), (0, _ramda.always)({})], [(0, _ramda.equals)("\r"), (0, _ramda.always)({
name: "return",
string: "\r"
})], [(0, _ramda.equals)("\n"), (0, _ramda.always)({
name: "enter",
string: "\n"
})], [(0, _ramda.equals)("\t"), (0, _ramda.always)({
name: "tab",
string: "\t"
})], [(0, _ramda.either)((0, _ramda.equals)("\b"), (0, _ramda.equals)("\x7f")), (0, _ramda.always)({
name: "backspace"
})], [(0, _ramda.equals)(" "), (0, _ramda.always)({
name: "space",
string: " "
})], [(0, _ramda.equals)("\x1b"), function () {
return escapedKeypress(inputStream);
}], [// $FlowFixMe
(0, _ramda.flip)(_ramda.lte)("\x1a"), (0, _ramda.pipe)(function (c) {
return c.charCodeAt(0);
}, (0, _ramda.add)(96), String.fromCharCode, (0, _ramda.applySpec)({
name: _ramda.identity,
ctrl: _ramda.T,
string: _ramda.identity
}))], [(0, _ramda.anyPass)([(0, _ramda.both)((0, _ramda.flip)(_ramda.gte)("a"), (0, _ramda.flip)(_ramda.lte)("z")), function (c) {
return c.charCodeAt(0) >= 161;
}, function (c) {
return c.charCodeAt(0) >= 33 && c.charCodeAt(0) <= 64;
}]), (0, _ramda.applySpec)({
name: _ramda.identity,
string: _ramda.identity
})], [(0, _ramda.both)((0, _ramda.flip)(_ramda.gte)("A"), (0, _ramda.flip)(_ramda.lte)("Z")), (0, _ramda.applySpec)({
name: _ramda.toLower,
shift: _ramda.T,
string: _ramda.identity
})], [_ramda.T, (0, _ramda.always)({})]])((inputStream.read(1) || "").toString()));
};
var interpretInput = function interpretInput(inputStream) {
return (0, _eff.interpreter)({
predicate: function predicate(x) {
return Input.is(x);
},
handler: function handler(inputEffect) {
return inputEffect.cata({
getCharacter: function getCharacter() {
return function (continuation) {
if (inputStream.setRawMode) inputStream.setRawMode(true); // Needed to get characters *before* `enter` is pressed
inputStream.setEncoding("utf8");
inputStream.once("readable", function () {
return continuation(inputStream.read(1));
});
};
},
getKeypress: function getKeypress() {
return function (continuation) {
if (inputStream.setRawMode) inputStream.setRawMode(true); // Needed to get characters *before* `enter` is pressed
inputStream.setEncoding("utf8");
inputStream.once("readable", function () {
return continuation(nextKeypress(inputStream));
});
};
}
});
}
});
};
exports.interpretInput = interpretInput;
var interpretInputStdIn = interpretInput(process.stdin);
exports.interpretInputStdIn = interpretInputStdIn;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NvdXJjZXMvaW5wdXQuanMiXSwibmFtZXMiOlsiSW5wdXQiLCJkYWdneSIsInRhZ2dlZFN1bSIsImdldENoYXJhY3RlciIsImdldEtleXByZXNzIiwiemVyb1ByZWZpeGVkS2V5cHJlc3MiLCJpbnB1dFN0cmVhbSIsIm5hbWUiLCJUIiwicmVhZCIsImNvbnRyb2xTZXF1ZW5jZUtleXByZXNzIiwiZXNjYXBlZEtleXByZXNzIiwibWV0YSIsInN0cmluZyIsInRvTG93ZXIiLCJzaGlmdCIsInRvU3RyaW5nIiwibmV4dEtleXByZXNzIiwiY3RybCIsImx0ZSIsImMiLCJjaGFyQ29kZUF0IiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiaWRlbnRpdHkiLCJndGUiLCJpbnRlcnByZXRJbnB1dCIsInByZWRpY2F0ZSIsIngiLCJpcyIsImhhbmRsZXIiLCJpbnB1dEVmZmVjdCIsImNhdGEiLCJjb250aW51YXRpb24iLCJzZXRSYXdNb2RlIiwic2V0RW5jb2RpbmciLCJvbmNlIiwiaW50ZXJwcmV0SW5wdXRTdGRJbiIsInByb2Nlc3MiLCJzdGRpbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUNBOztBQW1CQTs7Ozs7Ozs7QUFFQSxJQUFNQSxLQUFLLEdBQUdDLGVBQU1DLFNBQU4sQ0FBZ0IsT0FBaEIsRUFBeUI7QUFDdENDLEVBQUFBLFlBQVksRUFBRSxFQUR3QjtBQUV0Q0MsRUFBQUEsV0FBVyxFQUFFO0FBRnlCLENBQXpCLENBQWQ7O0FBS08sSUFBTUQsWUFBWSxHQUFHLG1CQUFPLGVBQUtILEtBQUssQ0FBQ0csWUFBWCxDQUFQLENBQXJCOztBQUNBLElBQU1DLFdBQVcsR0FBRyxtQkFBTyxlQUFLSixLQUFLLENBQUNJLFdBQVgsQ0FBUCxDQUFwQjs7O0FBRVAsSUFBTUMsb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUF1QixDQUFBQyxXQUFXO0FBQUEsU0FDdkMsaUJBQUssQ0FDSixDQUFDLG1CQUFPLEdBQVAsQ0FBRCxFQUFjLG1CQUFPO0FBQUVDLElB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QTZCO0FBQUEscUJBQU1ILFlBQVksQ0FBQzNCLFdBQVcsQ0FBQ0csSUFBWixDQUFpQixDQUFqQixDQUFELENBQWxCO0FBQUEsYUFBN0I7QUFDQSxXQUxhO0FBQUEsU0FERTtBQU9oQkwsUUFBQUEsV0FBVyxFQUFFO0FBQUEsaUJBQU0sVUFBQTZCLFlBQVksRUFBSTtBQUNsQyxnQkFBSTNCLFdBQVcsQ0FBQzRCLFVBQWhCLEVBQTRCNUIsV0FBVyxDQUFDNEIsVUFBWixDQUF1QixJQUF2QixFQURNLENBQ3dCOztBQUMxRDVCLFlBQUFBLFdBQVcsQ0FBQzZCLFdBQVosQ0FBd0IsTUFBeEI7QUFFQTdCLFlBQUFBLFdBQVcsQ0FBQzhCLElBQVosQ0FBaUIsVUFBakIsRUFBNkI7QUFBQSxxQkFDNUJILFlBQVksQ0FBQ2hCLFlBQVksQ0FBQ1gsV0FBRCxDQUFiLENBRGdCO0FBQUEsYUFBN0I7QUFHQSxXQVBZO0FBQUE7QUFQRyxPQUFqQixDQURtQjtBQUFBO0FBRlQsR0FBWixDQUg2QjtBQUFBLENBQXZCOzs7QUF3QkEsSUFBTStCLG1CQUFtQixHQUFHWCxjQUFjLENBQUNZLE9BQU8sQ0FBQ0MsS0FBVCxDQUExQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIEBmbG93ICovXG5cbmltcG9ydCBkYWdneSBmcm9tIFwiZGFnZ3lcIjtcbmltcG9ydCB7XG5cdGFsd2F5cyxcblx0Y29uZCxcblx0ZWl0aGVyLFxuXHRlcXVhbHMsXG5cdGZsaXAsXG5cdGx0ZSxcblx0VCxcblx0dGVzdCxcblx0YXBwbHlTcGVjLFxuXHR0b0xvd2VyLFxuXHRwaXBlLFxuXHRhZGQsXG5cdGlkZW50aXR5LFxuXHRndGUsXG5cdGJvdGgsXG5cdGFueVBhc3MsXG59IGZyb20gXCJyYW1kYVwiO1xuXG5pbXBvcnQgeyBpbnRlcnByZXRlciwgc2VuZCB9IGZyb20gXCIuL2VmZi5qc1wiO1xuXG5jb25zdCBJbnB1dCA9IGRhZ2d5LnRhZ2dlZFN1bShcIklucHV0XCIsIHtcblx0Z2V0Q2hhcmFjdGVyOiBbXSxcblx0Z2V0S2V5cHJlc3M6IFtdLFxufSk7XG5cbmV4cG9ydCBjb25zdCBnZXRDaGFyYWN0ZXIgPSBhbHdheXMoc2VuZChJbnB1dC5nZXRDaGFyYWN0ZXIpKTtcbmV4cG9ydCBjb25zdCBnZXRLZXlwcmVzcyA9IGFsd2F5cyhzZW5kKElucHV0LmdldEtleXByZXNzKSk7XG5cbmNvbnN0IHplcm9QcmVmaXhlZEtleXByZXNzID0gaW5wdXRTdHJlYW0gPT5cblx0Y29uZChbXG5cdFx0W2VxdWFscyhcIkFcIiksIGFsd2F5cyh7IG5hbWU6IFwidXBcIiB9KV0sXG5cdFx0W2VxdWFscyhcIkJcIiksIGFsd2F5cyh7IG5hbWU6IFwiZG93blwiIH0pXSxcblx0XHRbZXF1YWxzKFwiQ1wiKSwgYWx3YXlzKHsgbmFtZTogXCJyaWdodFwiIH0pXSxcblx0XHRbZXF1YWxzKFwiRFwiKSwgYWx3YXlzKHsgbmFtZTogXCJsZWZ0XCIgfSldLFxuXHRcdFtlcXVhbHMoXCJFXCIpLCBhbHdheXMoeyBuYW1lOiBcImNsZWFyXCIgfSldLFxuXHRcdFtlcXVhbHMoXCJGXCIpLCBhbHdheXMoeyBuYW1lOiBcImVuZFwiIH0pXSxcblx0XHRbZXF1YWxzKFwiSFwiKSwgYWx3YXlzKHsgbmFtZTogXCJob21lXCIgfSldLFxuXHRcdFtULCBhbHdheXMoe30pXSxcblx0XSkoaW5wdXRTdHJlYW0ucmVhZCgxKSk7XG5cbmNvbnN0IGNvbnRyb2xTZXF1ZW5jZUtleXByZXNzID0gaW5wdXRTdHJlYW0gPT5cblx0Y29uZChbXG5cdFx0W2VxdWFscyhcIkFcIiksIGFsd2F5cyh7IG5hbWU6IFwidXBcIiB9KV0sXG5cdFx0W2VxdWFscyhcIkJcIiksIGFsd2F5cyh7IG5hbWU6IFwiZG93blwiIH0pXSxcblx0XHRbZXF1YWxzKFwiQ1wiKSwgYWx3YXlzKHsgbmFtZTogXCJyaWdodFwiIH0pXSxcblx0XHRbZXF1YWxzKFwiRFwiKSwgYWx3YXlzKHsgbmFtZTogXCJsZWZ0XCIgfSldLFxuXHRcdFtlcXVhbHMoXCJFXCIpLCBhbHdheXMoeyBuYW1lOiBcImNsZWFyXCIgfSldLFxuXHRcdFtlcXVhbHMoXCJGXCIpLCBhbHdheXMoeyBuYW1lOiBcImVuZFwiIH0pXSxcblx0XHRbZXF1YWxzKFwiSFwiKSwgYWx3YXlzKHsgbmFtZTogXCJob21lXCIgfSldLFxuXHRcdFtULCBhbHdheXMoe30pXSxcblx0XSkoaW5wdXRTdHJlYW0ucmVhZCgxKSk7XG5cbmNvbnN0IGVzY2FwZWRLZXlwcmVzcyA9IGlucHV0U3RyZWFtID0+XG5cdGNvbmQoW1xuXHRcdFtlcXVhbHMoXCJcIiksIGFsd2F5cyh7fSldLFxuXHRcdFtcblx0XHRcdGVpdGhlcihlcXVhbHMoXCJcXGJcIiksIGVxdWFscyhcIlxceDdmXCIpKSxcblx0XHRcdGFsd2F5cyh7IG5hbWU6IFwiYmFja3NwYWNlXCIsIG1ldGE6IHRydWUgfSksXG5cdFx0XSxcblx0XHRbZXF1YWxzKFwiIFwiKSwgYWx3YXlzKHsgbmFtZTogXCJzcGFjZVwiLCBtZXRhOiB0cnVlLCBzdHJpbmc6IFwiIFwiIH0pXSxcblx0XHRbXG5cdFx0XHR0ZXN0KC9bYS16QS1aMC05XS8pLFxuXHRcdFx0YXBwbHlTcGVjKHsgbmFtZTogdG9Mb3dlciwgbWV0YTogVCwgc2hpZnQ6IHRlc3QoL1tBLVpdLykgfSksXG5cdFx0XSxcblx0XHRbZXF1YWxzKFwiMFwiKSwgKCkgPT4gemVyb1ByZWZpeGVkS2V5cHJlc3MoaW5wdXRTdHJlYW0pXSxcblx0XHRbZXF1YWxzKFwiW1wiKSwgKCkgPT4gY29udHJvbFNlcXVlbmNlS2V5cHJlc3MoaW5wdXRTdHJlYW0pXSxcblx0XHRbVCwgYWx3YXlzKHt9KV0sXG5cdF0pKChpbnB1dFN0cmVhbS5yZWFkKDEpIHx8IFwiXCIpLnRvU3RyaW5nKCkpO1xuXG5jb25zdCBuZXh0S2V5cHJlc3MgPSBpbnB1dFN0cmVhbSA9PiAoe1xuXHRuYW1lOiBcInVua25vd25cIixcblx0Y3RybDogZmFsc2UsXG5cdG1ldGE6IGZhbHNlLFxuXHRzaGlmdDogZmFsc2UsXG5cdHN0cmluZzogXCJcIixcblx0Li4uY29uZChbXG5cdFx0W2VxdWFscyhcIlwiKSwgYWx3YXlzKHt9KV0sXG5cdFx0W2VxdWFscyhcIlxcclwiKSwgYWx3YXlzKHsgbmFtZTogXCJyZXR1cm5cIiwgc3RyaW5nOiBcIlxcclwiIH0pXSxcblx0XHRbZXF1YWxzKFwiXFxuXCIpLCBhbHdheXMoeyBuYW1lOiBcImVudGVyXCIsIHN0cmluZzogXCJcXG5cIiB9KV0sXG5cdFx0W2VxdWFscyhcIlxcdFwiKSwgYWx3YXlzKHsgbmFtZTogXCJ0YWJcIiwgc3RyaW5nOiBcIlxcdFwiIH0pXSxcblx0XHRbZWl0aGVyKGVxdWFscyhcIlxcYlwiKSwgZXF1YWxzKFwiXFx4N2ZcIikpLCBhbHdheXMoeyBuYW1lOiBcImJhY2tzcGFjZVwiIH0pXSxcblx0XHRbZXF1YWxzKFwiIFwiKSwgYWx3YXlzKHsgbmFtZTogXCJzcGFjZVwiLCBzdHJpbmc6IFwiIFwiIH0pXSxcblx0XHRbZXF1YWxzKFwiXFx4MWJcIiksICgpID0+IGVzY2FwZWRLZXlwcmVzcyhpbnB1dFN0cmVhbSldLFxuXHRcdFtcblx0XHRcdC8vICRGbG93Rml4TWVcblx0XHRcdGZsaXAobHRlKShcIlxceDFhXCIpLFxuXHRcdFx0cGlwZShcblx0XHRcdFx0YyA9PiBjLmNoYXJDb2RlQXQoMCksXG5cdFx0XHRcdGFkZCg5NiksXG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUsXG5cdFx0XHRcdGFwcGx5U3BlYyh7XG5cdFx0XHRcdFx0bmFtZTogaWRlbnRpdHksXG5cdFx0XHRcdFx0Y3RybDogVCxcblx0XHRcdFx0XHRzdHJpbmc6IGlkZW50aXR5LFxuXHRcdFx0XHR9KSxcblx0XHRcdCksXG5cdFx0XSxcblx0XHRbXG5cdFx0XHRhbnlQYXNzKFtcblx0XHRcdFx0Ym90aChmbGlwKGd0ZSkoXCJhXCIpLCBmbGlwKGx0ZSkoXCJ6XCIpKSxcblx0XHRcdFx0YyA9PiBjLmNoYXJDb2RlQXQoMCkgPj0gMTYxLFxuXHRcdFx0XHRjID0+IGMuY2hhckNvZGVBdCgwKSA+PSAzMyAmJiBjLmNoYXJDb2RlQXQoMCkgPD0gNjQsXG5cdFx0XHRdKSxcblx0XHRcdGFwcGx5U3BlYyh7IG5hbWU6IGlkZW50aXR5LCBzdHJpbmc6IGlkZW50aXR5IH0pLFxuXHRcdF0sXG5cdFx0W1xuXHRcdFx0Ym90aChmbGlwKGd0ZSkoXCJBXCIpLCBmbGlwKGx0ZSkoXCJaXCIpKSxcblx0XHRcdGFwcGx5U3BlYyh7IG5hbWU6IHRvTG93ZXIsIHNoaWZ0OiBULCBzdHJpbmc6IGlkZW50aXR5IH0pLFxuXHRcdF0sXG5cdFx0W1QsIGFsd2F5cyh7fSldLFxuXHRdKSgoaW5wdXRTdHJlYW0ucmVhZCgxKSB8fCBcIlwiKS50b1N0cmluZygpKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgaW50ZXJwcmV0SW5wdXQgPSAoXG5cdGlucHV0U3RyZWFtOiBzdHJlYW0kUmVhZGFibGUgJiB7ICtzZXRSYXdNb2RlPzogYm9vbGVhbiA9PiB2b2lkIH0sXG4pID0+XG5cdGludGVycHJldGVyKHtcblx0XHRwcmVkaWNhdGU6IHggPT4gSW5wdXQuaXMoeCksXG5cdFx0aGFuZGxlcjogaW5wdXRFZmZlY3QgPT5cblx0XHRcdGlucHV0RWZmZWN0LmNhdGEoe1xuXHRcdFx0XHRnZXRDaGFyYWN0ZXI6ICgpID0+IGNvbnRpbnVhdGlvbiA9PiB7XG5cdFx0XHRcdFx0aWYgKGlucHV0U3RyZWFtLnNldFJhd01vZGUpIGlucHV0U3RyZWFtLnNldFJhd01vZGUodHJ1ZSk7IC8vIE5lZWRlZCB0byBnZXQgY2hhcmFjdGVycyAqYmVmb3JlKiBgZW50ZXJgIGlzIHByZXNzZWRcblx0XHRcdFx0XHRpbnB1dFN0cmVhbS5zZXRFbmNvZGluZyhcInV0ZjhcIik7XG5cblx0XHRcdFx0XHRpbnB1dFN0cmVhbS5vbmNlKFwicmVhZGFibGVcIiwgKCkgPT4gY29udGludWF0aW9uKGlucHV0U3RyZWFtLnJlYWQoMSkpKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0S2V5cHJlc3M6ICgpID0+IGNvbnRpbnVhdGlvbiA9PiB7XG5cdFx0XHRcdFx0aWYgKGlucHV0U3RyZWFtLnNldFJhd01vZGUpIGlucHV0U3RyZWFtLnNldFJhd01vZGUodHJ1ZSk7IC8vIE5lZWRlZCB0byBnZXQgY2hhcmFjdGVycyAqYmVmb3JlKiBgZW50ZXJgIGlzIHByZXNzZWRcblx0XHRcdFx0XHRpbnB1dFN0cmVhbS5zZXRFbmNvZGluZyhcInV0ZjhcIik7XG5cblx0XHRcdFx0XHRpbnB1dFN0cmVhbS5vbmNlKFwicmVhZGFibGVcIiwgKCkgPT5cblx0XHRcdFx0XHRcdGNvbnRpbnVhdGlvbihuZXh0S2V5cHJlc3MoaW5wdXRTdHJlYW0pKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSksXG5cdH0pO1xuXG5leHBvcnQgY29uc3QgaW50ZXJwcmV0SW5wdXRTdGRJbiA9IGludGVycHJldElucHV0KHByb2Nlc3Muc3RkaW4pO1xuIl19