UNPKG

eff

Version:

An extensible effect monad based on the freer monad

164 lines (147 loc) 20.2 kB
"use strict"; 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