computed-types
Version:
Runtime validation types for TypeScript.
100 lines (81 loc) • 12.4 kB
JavaScript
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _validations = require("./schema/validations");
var _utils = require("./schema/utils");
var _logic = require("./schema/logic");
class Validator {
constructor(validator) {
this.validator = void 0;
this.validator = validator;
}
proxy() {
return new Proxy(this.validator, {
get: (target, propertyKey) => propertyKey in this ? this[propertyKey] : this.validator[propertyKey]
});
}
equals(value, error) {
return this.transform((0, _validations.equals)(value, error));
}
test(tester, error) {
return this.transform((0, _validations.test)(tester, error));
}
transform(fn, constructor = this.constructor) {
const {
validator
} = this;
return new constructor((...args) => {
const res = validator(...args);
if (!(0, _utils.isPromiseLike)(res)) {
return fn(res);
}
return res.then(ret => fn(ret));
}).proxy();
}
construct(fn) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const Class = this.constructor;
const {
validator
} = this;
return new Class((...args) => validator(...fn(...args))).proxy();
}
optional(defaultValue) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const Class = this.constructor;
const {
validator
} = this;
return new Class((0, _logic.optional)(validator, defaultValue)).proxy();
}
strictOptional(defaultValue) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const Class = this.constructor;
const {
validator
} = this;
return new Class((0, _logic.strictOptional)(validator, defaultValue)).proxy();
}
destruct(error) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const Class = this.constructor;
const {
validator
} = this;
return new Class((0, _validations.destruct)(validator, error)).proxy();
}
error(err) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const Class = this.constructor;
const {
validator
} = this;
return new Class((0, _validations.error)(validator, err)).proxy();
}
} // circular dependencies: import those after creating the validator class
// import { ObjectValidator } from './object';
// import { StringValidator } from './string';
// import { NumberValidator } from './number';
// import { BooleanValidator } from './boolean';
exports.default = Validator;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9WYWxpZGF0b3IudHMiXSwibmFtZXMiOlsiVmFsaWRhdG9yIiwiY29uc3RydWN0b3IiLCJ2YWxpZGF0b3IiLCJwcm94eSIsIlByb3h5IiwiZ2V0IiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJlcXVhbHMiLCJ2YWx1ZSIsImVycm9yIiwidHJhbnNmb3JtIiwidGVzdCIsInRlc3RlciIsImZuIiwiYXJncyIsInJlcyIsInRoZW4iLCJyZXQiLCJjb25zdHJ1Y3QiLCJDbGFzcyIsIm9wdGlvbmFsIiwiZGVmYXVsdFZhbHVlIiwic3RyaWN0T3B0aW9uYWwiLCJkZXN0cnVjdCIsImVyciJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFrQmUsTUFBTUEsU0FBTixDQUF3QztBQUc5Q0MsRUFBQUEsV0FBVyxDQUFDQyxTQUFELEVBQWU7QUFBQSxTQUZqQkEsU0FFaUI7QUFDL0IsU0FBS0EsU0FBTCxHQUFpQkEsU0FBakI7QUFDRDs7QUFFTUMsRUFBQUEsS0FBSyxHQUF5QjtBQUNuQyxXQUFPLElBQUlDLEtBQUosQ0FBVSxLQUFLRixTQUFmLEVBQTBCO0FBQy9CRyxNQUFBQSxHQUFHLEVBQUUsQ0FDSEMsTUFERyxFQUVIQyxXQUZHLEtBSUhBLFdBQVcsSUFBSSxJQUFmLEdBQ0ksS0FBS0EsV0FBTCxDQURKLEdBRUksS0FBS0wsU0FBTCxDQUFlSyxXQUFmO0FBUHlCLEtBQTFCLENBQVA7QUFTRDs7QUFFTUMsRUFBQUEsTUFBTSxDQUNYQyxLQURXLEVBRVhDLEtBRlcsRUFHMkM7QUFDdEQsV0FBTyxLQUFLQyxTQUFMLENBQWUseUJBQU9GLEtBQVAsRUFBY0MsS0FBZCxDQUFmLENBQVA7QUFDRDs7QUFFTUUsRUFBQUEsSUFBSSxDQUNUQyxNQURTLEVBRVRILEtBRlMsRUFHYTtBQUN0QixXQUFPLEtBQUtDLFNBQUwsQ0FBZSx1QkFBS0UsTUFBTCxFQUFhSCxLQUFiLENBQWYsQ0FBUDtBQUNEOztBQUVNQyxFQUFBQSxTQUFTLENBTWRHLEVBTmMsRUFPZGIsV0FBb0MsR0FBRyxLQUNwQ0EsV0FSVyxFQVNLO0FBQ25CLFVBQU07QUFBRUMsTUFBQUE7QUFBRixRQUFnQixJQUF0QjtBQUVBLFdBQU8sSUFBSUQsV0FBSixDQUFpQixDQUFDLEdBQUdjLElBQUosS0FBaUM7QUFDdkQsWUFBTUMsR0FBRyxHQUFHZCxTQUFTLENBQUMsR0FBR2EsSUFBSixDQUFyQjs7QUFFQSxVQUFJLENBQUMsMEJBQWNDLEdBQWQsQ0FBTCxFQUF5QjtBQUN2QixlQUFPRixFQUFFLENBQUNFLEdBQUQsQ0FBVDtBQUNEOztBQUVELGFBQU9BLEdBQUcsQ0FBQ0MsSUFBSixDQUFVQyxHQUFELElBQ2RKLEVBQUUsQ0FBQ0ksR0FBRCxDQURHLENBQVA7QUFHRCxLQVZNLEVBVTBEZixLQVYxRCxFQUFQO0FBV0Q7O0FBRU1nQixFQUFBQSxTQUFTLENBQ2RMLEVBRGMsRUFFeUM7QUFDdkQ7QUFDQSxVQUFNTSxLQUFLLEdBQUksSUFBRCxDQUFjbkIsV0FBNUI7QUFDQSxVQUFNO0FBQUVDLE1BQUFBO0FBQUYsUUFBZ0IsSUFBdEI7QUFFQSxXQUFPLElBQUlrQixLQUFKLENBQ0wsQ0FBQyxHQUFHTCxJQUFKLEtBQWdDYixTQUFTLENBQUMsR0FBR1ksRUFBRSxDQUFDLEdBQUdDLElBQUosQ0FBTixDQURwQyxFQUVMWixLQUZLLEVBQVA7QUFHRDs7QUFFTWtCLEVBQUFBLFFBQVEsQ0FHYkMsWUFIYSxFQVViO0FBQ0E7QUFDQSxVQUFNRixLQUFLLEdBQUksSUFBRCxDQUFjbkIsV0FBNUI7QUFDQSxVQUFNO0FBQUVDLE1BQUFBO0FBQUYsUUFBZ0IsSUFBdEI7QUFFQSxXQUFPLElBQUlrQixLQUFKLENBQVUscUJBQXFCbEIsU0FBckIsRUFBZ0NvQixZQUFoQyxDQUFWLEVBQXlEbkIsS0FBekQsRUFBUDtBQUNEOztBQUVNb0IsRUFBQUEsY0FBYyxDQUduQkQsWUFIbUIsRUFVbkI7QUFDQTtBQUNBLFVBQU1GLEtBQUssR0FBSSxJQUFELENBQWNuQixXQUE1QjtBQUNBLFVBQU07QUFBRUMsTUFBQUE7QUFBRixRQUFnQixJQUF0QjtBQUVBLFdBQU8sSUFBSWtCLEtBQUosQ0FDTCwyQkFBMkJsQixTQUEzQixFQUFzQ29CLFlBQXRDLENBREssRUFFTG5CLEtBRkssRUFBUDtBQUdEOztBQUVNcUIsRUFBQUEsUUFBUSxDQUNiZCxLQURhLEVBV2I7QUFDQTtBQUNBLFVBQU1VLEtBQUssR0FBSSxJQUFELENBQWNuQixXQUE1QjtBQUNBLFVBQU07QUFBRUMsTUFBQUE7QUFBRixRQUFnQixJQUF0QjtBQUVBLFdBQU8sSUFBSWtCLEtBQUosQ0FBVSwyQkFBU2xCLFNBQVQsRUFBb0JRLEtBQXBCLENBQVYsRUFBc0NQLEtBQXRDLEVBQVA7QUFDRDs7QUFFTU8sRUFBQUEsS0FBSyxDQUFDZSxHQUFELEVBQXNEO0FBQ2hFO0FBQ0EsVUFBTUwsS0FBSyxHQUFJLElBQUQsQ0FBY25CLFdBQTVCO0FBQ0EsVUFBTTtBQUFFQyxNQUFBQTtBQUFGLFFBQWdCLElBQXRCO0FBRUEsV0FBTyxJQUFJa0IsS0FBSixDQUFVLHdCQUFNbEIsU0FBTixFQUFpQnVCLEdBQWpCLENBQVYsRUFBaUN0QixLQUFqQyxFQUFQO0FBQ0Q7O0FBcklvRCxDLENBd0l2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZ1bmN0aW9uVHlwZSwgeyBGdW5jdGlvblBhcmFtZXRlcnMgfSBmcm9tICcuL3NjaGVtYS9GdW5jdGlvblR5cGUnO1xuaW1wb3J0IHsgRXJyb3JMaWtlLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuL3NjaGVtYS9lcnJvcnMnO1xuaW1wb3J0IHsgZGVzdHJ1Y3QsIGVxdWFscywgZXJyb3IsIHRlc3QgfSBmcm9tICcuL3NjaGVtYS92YWxpZGF0aW9ucyc7XG5pbXBvcnQgeyBpc1Byb21pc2VMaWtlLCBNYXliZUFzeW5jLCBSZXNvbHZlZFZhbHVlIH0gZnJvbSAnLi9zY2hlbWEvdXRpbHMnO1xuaW1wb3J0IHtcbiAgb3B0aW9uYWwgYXMgb3B0aW9uYWxTY2hlbWEsXG4gIHN0cmljdE9wdGlvbmFsIGFzIHN0cmljdE9wdGlvbmFsU2NoZW1hLFxufSBmcm9tICcuL3NjaGVtYS9sb2dpYyc7XG5pbXBvcnQgeyBNZXJnZVNjaGVtYVBhcmFtZXRlcnMgfSBmcm9tICcuL3NjaGVtYS9pbyc7XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvclByb3h5PFxuICBWIGV4dGVuZHMgeyB2YWxpZGF0b3I6IEZ1bmN0aW9uVHlwZSB9LFxuICBGIGV4dGVuZHMgRnVuY3Rpb25UeXBlID0gVlsndmFsaWRhdG9yJ10sXG4+ID0gT21pdDxWLCAndmFsaWRhdG9yJyB8ICdwcm94eSc+ICYgeyB2YWxpZGF0b3I6IEYgfSAmIEY7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yQ29uc3RydWN0b3I8XG4gIFYgZXh0ZW5kcyBWYWxpZGF0b3I8Rj4sXG4gIEYgZXh0ZW5kcyBGdW5jdGlvblR5cGUgPSBWWyd2YWxpZGF0b3InXSxcbj4ge1xuICBuZXcgKHZhbGlkYXRvcjogRik6IFY7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhbGlkYXRvcjxGIGV4dGVuZHMgRnVuY3Rpb25UeXBlPiB7XG4gIHB1YmxpYyByZWFkb25seSB2YWxpZGF0b3I6IEY7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHZhbGlkYXRvcjogRikge1xuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgcHVibGljIHByb3h5KCk6IFZhbGlkYXRvclByb3h5PHRoaXM+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMudmFsaWRhdG9yLCB7XG4gICAgICBnZXQ6IChcbiAgICAgICAgdGFyZ2V0OiB1bmtub3duLFxuICAgICAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgICAgKTogdGhpc1trZXlvZiB0aGlzXSB8IEZba2V5b2YgRl0gPT5cbiAgICAgICAgcHJvcGVydHlLZXkgaW4gdGhpc1xuICAgICAgICAgID8gdGhpc1twcm9wZXJ0eUtleSBhcyBrZXlvZiB0aGlzXVxuICAgICAgICAgIDogdGhpcy52YWxpZGF0b3JbcHJvcGVydHlLZXkgYXMga2V5b2YgRl0sXG4gICAgfSkgYXMgVmFsaWRhdG9yUHJveHk8dGhpcz47XG4gIH1cblxuICBwdWJsaWMgZXF1YWxzPFQgZXh0ZW5kcyBSZXNvbHZlZFZhbHVlPFJldHVyblR5cGU8Rj4+PihcbiAgICB2YWx1ZTogVCxcbiAgICBlcnJvcj86IEVycm9yTGlrZTxbUmVzb2x2ZWRWYWx1ZTxSZXR1cm5UeXBlPEY+Pl0+LFxuICApOiBWYWxpZGF0b3JQcm94eTx0aGlzLCBGdW5jdGlvblR5cGU8VCwgUGFyYW1ldGVyczxGPj4+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oZXF1YWxzKHZhbHVlLCBlcnJvcikpO1xuICB9XG5cbiAgcHVibGljIHRlc3QoXG4gICAgdGVzdGVyOiBGdW5jdGlvblR5cGU8dW5rbm93biwgW1Jlc29sdmVkVmFsdWU8UmV0dXJuVHlwZTxGPj5dPixcbiAgICBlcnJvcj86IEVycm9yTGlrZTxbUmVzb2x2ZWRWYWx1ZTxSZXR1cm5UeXBlPEY+Pl0+LFxuICApOiBWYWxpZGF0b3JQcm94eTx0aGlzPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRlc3QodGVzdGVyLCBlcnJvcikpO1xuICB9XG5cbiAgcHVibGljIHRyYW5zZm9ybTxcbiAgICBULFxuICAgIFYgZXh0ZW5kcyBWYWxpZGF0b3I8XG4gICAgICBGdW5jdGlvblR5cGU8TWF5YmVBc3luYzxSZXR1cm5UeXBlPEY+LCBUPiwgUGFyYW1ldGVyczxGPj5cbiAgICA+LFxuICA+KFxuICAgIGZuOiBGdW5jdGlvblR5cGU8VCwgW1Jlc29sdmVkVmFsdWU8UmV0dXJuVHlwZTxGPj5dPixcbiAgICBjb25zdHJ1Y3RvcjogVmFsaWRhdG9yQ29uc3RydWN0b3I8Vj4gPSB0aGlzXG4gICAgICAuY29uc3RydWN0b3IgYXMgVmFsaWRhdG9yQ29uc3RydWN0b3I8Vj4sXG4gICk6IFZhbGlkYXRvclByb3h5PFY+IHtcbiAgICBjb25zdCB7IHZhbGlkYXRvciB9ID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgY29uc3RydWN0b3IoKCguLi5hcmdzKTogVCB8IFByb21pc2VMaWtlPFQ+ID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IHZhbGlkYXRvciguLi5hcmdzKTtcblxuICAgICAgaWYgKCFpc1Byb21pc2VMaWtlKHJlcykpIHtcbiAgICAgICAgcmV0dXJuIGZuKHJlcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXMudGhlbigocmV0KSA9PlxuICAgICAgICBmbihyZXQgYXMgUmVzb2x2ZWRWYWx1ZTxSZXR1cm5UeXBlPEY+PiksXG4gICAgICApIGFzIFByb21pc2VMaWtlPFQ+O1xuICAgIH0pIGFzIEZ1bmN0aW9uVHlwZTxNYXliZUFzeW5jPFJldHVyblR5cGU8Rj4sIFQ+LCBQYXJhbWV0ZXJzPEY+PikucHJveHkoKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Q8UDAgZXh0ZW5kcyBGdW5jdGlvblBhcmFtZXRlcnM+KFxuICAgIGZuOiBGdW5jdGlvblR5cGU8UGFyYW1ldGVyczxGPiwgUDA+LFxuICApOiBWYWxpZGF0b3JQcm94eTx0aGlzLCBGdW5jdGlvblR5cGU8UmV0dXJuVHlwZTxGPiwgUDA+PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBDbGFzcyA9ICh0aGlzIGFzIGFueSkuY29uc3RydWN0b3I7XG4gICAgY29uc3QgeyB2YWxpZGF0b3IgfSA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IENsYXNzKFxuICAgICAgKC4uLmFyZ3M6IFAwKTogUmV0dXJuVHlwZTxGPiA9PiB2YWxpZGF0b3IoLi4uZm4oLi4uYXJncykpLFxuICAgICkucHJveHkoKTtcbiAgfVxuXG4gIHB1YmxpYyBvcHRpb25hbDxcbiAgICBSIGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZTxSZXR1cm5UeXBlPEY+PiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgPihcbiAgICBkZWZhdWx0VmFsdWU/OiBSLFxuICApOiBWYWxpZGF0b3JQcm94eTxcbiAgICB0aGlzLFxuICAgIEZ1bmN0aW9uVHlwZTxcbiAgICAgIFJldHVyblR5cGU8Rj4gfCBSLFxuICAgICAgTWVyZ2VTY2hlbWFQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8Rj4gfCBbKHVuZGVmaW5lZCB8IG51bGwpP10+XG4gICAgPlxuICA+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IENsYXNzID0gKHRoaXMgYXMgYW55KS5jb25zdHJ1Y3RvcjtcbiAgICBjb25zdCB7IHZhbGlkYXRvciB9ID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgQ2xhc3Mob3B0aW9uYWxTY2hlbWE8RiwgUj4odmFsaWRhdG9yLCBkZWZhdWx0VmFsdWUpKS5wcm94eSgpO1xuICB9XG5cbiAgcHVibGljIHN0cmljdE9wdGlvbmFsPFxuICAgIFIgZXh0ZW5kcyBSZXNvbHZlZFZhbHVlPFJldHVyblR5cGU8Rj4+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICA+KFxuICAgIGRlZmF1bHRWYWx1ZT86IFIsXG4gICk6IFZhbGlkYXRvclByb3h5PFxuICAgIHRoaXMsXG4gICAgRnVuY3Rpb25UeXBlPFxuICAgICAgUmV0dXJuVHlwZTxGPiB8IFIsXG4gICAgICBNZXJnZVNjaGVtYVBhcmFtZXRlcnM8UGFyYW1ldGVyczxGPiB8IFt1bmRlZmluZWQ/XT5cbiAgICA+XG4gID4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgQ2xhc3MgPSAodGhpcyBhcyBhbnkpLmNvbnN0cnVjdG9yO1xuICAgIGNvbnN0IHsgdmFsaWRhdG9yIH0gPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBDbGFzcyhcbiAgICAgIHN0cmljdE9wdGlvbmFsU2NoZW1hPEYsIFI+KHZhbGlkYXRvciwgZGVmYXVsdFZhbHVlKSxcbiAgICApLnByb3h5KCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJ1Y3QoXG4gICAgZXJyb3I/OiBFcnJvckxpa2U8UGFyYW1ldGVyczxGPj4sXG4gICk6IFZhbGlkYXRvclByb3h5PFxuICAgIHRoaXMsXG4gICAgRnVuY3Rpb25UeXBlPFxuICAgICAgTWF5YmVBc3luYzxcbiAgICAgICAgUmV0dXJuVHlwZTxGPixcbiAgICAgICAgW1ZhbGlkYXRpb25FcnJvciB8IG51bGwsIFJlc29sdmVkVmFsdWU8UmV0dXJuVHlwZTxGPj4/XVxuICAgICAgPixcbiAgICAgIFBhcmFtZXRlcnM8Rj5cbiAgICA+XG4gID4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgQ2xhc3MgPSAodGhpcyBhcyBhbnkpLmNvbnN0cnVjdG9yO1xuICAgIGNvbnN0IHsgdmFsaWRhdG9yIH0gPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBDbGFzcyhkZXN0cnVjdCh2YWxpZGF0b3IsIGVycm9yKSkucHJveHkoKTtcbiAgfVxuXG4gIHB1YmxpYyBlcnJvcihlcnI6IEVycm9yTGlrZTxQYXJhbWV0ZXJzPEY+Pik6IFZhbGlkYXRvclByb3h5PHRoaXM+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IENsYXNzID0gKHRoaXMgYXMgYW55KS5jb25zdHJ1Y3RvcjtcbiAgICBjb25zdCB7IHZhbGlkYXRvciB9ID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgQ2xhc3MoZXJyb3IodmFsaWRhdG9yLCBlcnIpKS5wcm94eSgpO1xuICB9XG59XG5cbi8vIGNpcmN1bGFyIGRlcGVuZGVuY2llczogaW1wb3J0IHRob3NlIGFmdGVyIGNyZWF0aW5nIHRoZSB2YWxpZGF0b3IgY2xhc3Ncbi8vIGltcG9ydCB7IE9iamVjdFZhbGlkYXRvciB9IGZyb20gJy4vb2JqZWN0Jztcbi8vIGltcG9ydCB7IFN0cmluZ1ZhbGlkYXRvciB9IGZyb20gJy4vc3RyaW5nJztcbi8vIGltcG9ydCB7IE51bWJlclZhbGlkYXRvciB9IGZyb20gJy4vbnVtYmVyJztcbi8vIGltcG9ydCB7IEJvb2xlYW5WYWxpZGF0b3IgfSBmcm9tICcuL2Jvb2xlYW4nO1xuIl19