UNPKG

trivialmodels

Version:

A trivial javascript model system, designed to be easy to build backends for.

3 lines (2 loc) 25.9 kB
'use strict';var _get=function get(object,property,receiver){if(object===null)object=Function.prototype;var desc=Object.getOwnPropertyDescriptor(object,property);if(desc===undefined){var parent=Object.getPrototypeOf(object);if(parent===null){return undefined;}else {return get(parent,property,receiver);}}else if("value" in desc){return desc.value;}else {var getter=desc.get;if(getter===undefined){return undefined;}return getter.call(receiver);}};var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value" in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};}();Object.defineProperty(exports,"__esModule",{value:true});var _lodash=require('lodash');var _lodash2=_interopRequireDefault(_lodash);var _errors=require('./errors');var _errors2=_interopRequireDefault(_errors);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return call&&(typeof call==="object"||typeof call==="function")?call:self;}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var BaseType=function(){function BaseType(options){_classCallCheck(this,BaseType);this.$isType=true;this.options=options||{};if(this.options.sanitize&&_lodash2.default.isFunction(this.options.sanitize)){this.$sanitize=this.options.sanitize;}}_createClass(BaseType,[{key:'get',value:function get(inst,key){var val=inst.$values[key];if(val===undefined){val=this.options.default;}return val;}},{key:'set',value:function set(inst,key,val){inst.$values[key]=val;inst.$dirty=true;}},{key:'validate',value:function validate(inst,key){var valid=true;var val=this.get(inst,key);if(val===undefined||val===null){if(this.options.required&&!this.options.pk){throw new _errors2.default.Required(key);}else {return true;}}if(this.$sanitize){val=this.$sanitize(val,inst);}if(this.$validate){valid=this.$validate(val,inst);}if(valid&&this.options.validate){valid=this.options.validate.call(inst,val);if(!valid){throw new _errors2.default.CustomValidation(val);}}if(!valid){throw new _errors2.default.Validation(val,this);}return valid;}},{key:'toString',value:function toString(){return this.constructor.name;}},{key:'isPrimaryKey',get:function get(){return this.options.pk||this.options.primaryKey;}}]);return BaseType;}();var StringType=function(_BaseType){_inherits(StringType,_BaseType);function StringType(){_classCallCheck(this,StringType);return _possibleConstructorReturn(this,Object.getPrototypeOf(StringType).apply(this,arguments));}_createClass(StringType,[{key:'$validate',value:function $validate(val){if(_lodash2.default.isString(val)){return true;}else {throw new _errors2.default.Validation(val,this);}}}]);return StringType;}(BaseType);var NumberType=function(_BaseType2){_inherits(NumberType,_BaseType2);function NumberType(){_classCallCheck(this,NumberType);return _possibleConstructorReturn(this,Object.getPrototypeOf(NumberType).apply(this,arguments));}_createClass(NumberType,[{key:'$validate',value:function $validate(val){if(_lodash2.default.isNumber(val)&&isFinite(val)){if(this.options.integer&&!Number.isInteger(val)){throw new _errors2.default.Validation(val,this,'\''+val+'\' is not a valid integer.');}else {return true;}}else {throw new _errors2.default.Validation(val,this);}}}]);return NumberType;}(BaseType);var BooleanType=function(_BaseType3){_inherits(BooleanType,_BaseType3);function BooleanType(){_classCallCheck(this,BooleanType);return _possibleConstructorReturn(this,Object.getPrototypeOf(BooleanType).apply(this,arguments));}_createClass(BooleanType,[{key:'$validate',value:function $validate(val){if(_lodash2.default.isBoolean(val)){return true;}else {throw new _errors2.default.Validation(val,this);}}}]);return BooleanType;}(BaseType);var DateType=function(_BaseType4){_inherits(DateType,_BaseType4);function DateType(){_classCallCheck(this,DateType);return _possibleConstructorReturn(this,Object.getPrototypeOf(DateType).apply(this,arguments));}_createClass(DateType,[{key:'$validate',value:function $validate(val){if(_lodash2.default.isDate(val)&&isFinite(val.getTime())){return true;}else {throw new _errors2.default.Validation(val,this);}}},{key:'get',value:function get(inst,key){var ts=_get(Object.getPrototypeOf(DateType.prototype),'get',this).call(this,inst,key);if(ts===undefined&&this.options.auto){ts=Date.now();}return new Date(ts);}},{key:'set',value:function set(inst,key,val){val=new Date(val);var timestamp=val.getTime();if(isFinite(timestamp)){_get(Object.getPrototypeOf(DateType.prototype),'set',this).call(this,inst,key,timestamp);}}}]);return DateType;}(BaseType);var ObjectType=function(_BaseType5){_inherits(ObjectType,_BaseType5);function ObjectType(){_classCallCheck(this,ObjectType);return _possibleConstructorReturn(this,Object.getPrototypeOf(ObjectType).apply(this,arguments));}_createClass(ObjectType,[{key:'$validate',value:function $validate(val){if(_lodash2.default.isPlainObject(val)){if(this.options.schema){_lodash2.default.mapValues(this.options.schema,function(value,key){if(value.$isType){return value.validate({$values:val},key);}});}return true;}else {throw new _errors2.default.Validation(val,this);}}}]);return ObjectType;}(BaseType);var ArrayType=function(_BaseType6){_inherits(ArrayType,_BaseType6);function ArrayType(){_classCallCheck(this,ArrayType);return _possibleConstructorReturn(this,Object.getPrototypeOf(ArrayType).apply(this,arguments));}_createClass(ArrayType,[{key:'$validate',value:function $validate(val){if(_lodash2.default.isArray(val)){var type=this.options.type;if(type&&type.$isType){return _lodash2.default.all(val,function(item){return type.validate({$values:{item:item}},'item');});}return true;}else {throw new _errors2.default.Validation(val,this);}}}]);return ArrayType;}(BaseType);var EnumType=function(_BaseType7){_inherits(EnumType,_BaseType7);function EnumType(){_classCallCheck(this,EnumType);return _possibleConstructorReturn(this,Object.getPrototypeOf(EnumType).apply(this,arguments));}_createClass(EnumType,[{key:'$validate',value:function $validate(val){var choices=this.options.values||[];if(_lodash2.default.contains(choices,val)){return true;}else {throw new _errors2.default.Validation(val,this,'\''+val+'\' must be one of: '+this.options.values.join(', '));}}}]);return EnumType;}(BaseType);var AnyType=function(_BaseType8){_inherits(AnyType,_BaseType8);function AnyType(){_classCallCheck(this,AnyType);return _possibleConstructorReturn(this,Object.getPrototypeOf(AnyType).apply(this,arguments));}return AnyType;}(BaseType);exports.default={Base:BaseType,String:StringType,Number:NumberType,Boolean:BooleanType,Date:DateType,Object:ObjectType,Array:ArrayType,Enum:EnumType,Any:AnyType}; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6InFoRUFZTSxRQUFRLFlBRVYsU0FGRSxRQUFRLENBRUUsT0FBTyxDQUNuQixzQkFIRSxRQUFRLEVBSU4sSUFBSSxDQUFDLE9BQU8sQ0FBRyxJQUFJLENBQUMsQUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBRyxPQUFPLEVBQUksRUFBRSxDQUFDLEFBRTdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUksaUJBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQy9ELENBQ0ksSUFBSSxDQUFDLFNBQVMsQ0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUMxQyxDQUNKLGFBWEMsUUFBUSxnQ0FlTixJQUFJLENBQUUsR0FBRyxDQUNiLENBQ0ksSUFBSSxHQUFHLENBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxBQUM1QixHQUFHLEdBQUcsR0FBSyxTQUFTLENBQ3BCLENBQ0ksR0FBRyxDQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQzlCLEFBRUQsT0FBTyxHQUFHLENBQUMsQ0FDZCxnQ0FFRyxJQUFJLENBQUUsR0FBRyxDQUFFLEdBQUcsQ0FDbEIsQ0FDSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFHLEdBQUcsQ0FBQyxBQUN4QixJQUFJLENBQUMsTUFBTSxDQUFHLElBQUksQ0FBQyxDQUN0QiwwQ0FFUSxJQUFJLENBQUUsR0FBRyxDQUNsQixDQUNJLElBQUksS0FBSyxDQUFHLElBQUksQ0FBQyxBQUNqQixJQUFJLEdBQUcsQ0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBRSxHQUFHLENBQUMsQ0FBQyxBQUk5QixHQUFHLEdBQUcsR0FBSyxTQUFTLEVBQUksR0FBRyxHQUFLLElBQUksQ0FDcEMsQ0FFSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMs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QUFFLENBQUMsQUFDeEMsR0FBRyxpQkFBRSxRQUFRLENBQUMsT0FBTyxDQUFFLEdBQUcsQ0FBQyxDQUMzQixDQUNJLE9BQU8sSUFBSSxDQUFDLENBQ2YsS0FFRCxDQUNJLE1BQU0sSUFBSSxpQkFBTyxVQUFVLENBQUMsR0FBRyxDQUFFLElBQUksTUFBTyxHQUFHLHVCQUF1QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUksQ0FBQyxDQUM1RyxDQUNKLFdBYkMsUUFBUSxHQUFTLFFBQVEsTUFrQnpCLE9BQU8sZ0NBQVAsT0FBTyxzQkFBUCxPQUFPLHdCQUFQLE9BQU8sK0RBQVAsT0FBTyxpQ0FBUCxPQUFPLEdBQVMsUUFBUSxrQkFJZixDQUNYLElBQUksQ0FBRSxRQUFRLENBQ2QsTUFBTSxDQUFFLFVBQVUsQ0FDbEIsTUFBTSxDQUFFLFVBQVUsQ0FDbEIsT0FBTyxDQUFFLFdBQVcsQ0FDcEIsSUFBSSxDQUFFLFFBQVEsQ0FDZCxNQUFNLENBQUUsVUFBVSxDQUNsQixLQUFLLENBQUUsU0FBUyxDQUNoQixJQUFJLENBQUUsUUFBUSxDQUNkLEdBQUcsQ0FBRSxPQUFPLENBQ2YiLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vLyBEZWZpbmVzIHRoZSB2YXJpb3VzIHR5cGVzIGFuZCBob3cgdG8gcmV0cmlldmUsIHN0b3JlLCBzYW5pdGl6ZSBhbmQgdmFsaWRhdGUgdGhlbS5cbi8vL1xuLy8vIEBtb2R1bGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgZXJyb3JzIGZyb20gJy4vZXJyb3JzJztcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNsYXNzIEJhc2VUeXBlXG57XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucylcbiAgICB7XG4gICAgICAgIHRoaXMuJGlzVHlwZSA9IHRydWU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnNhbml0aXplICYmIF8uaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuc2FuaXRpemUpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLiRzYW5pdGl6ZSA9IHRoaXMub3B0aW9ucy5zYW5pdGl6ZTtcbiAgICAgICAgfSAvLyBlbmQgaWZcbiAgICB9IC8vIGVuZCBjb25zdHJ1Y3RvclxuXG4gICAgZ2V0IGlzUHJpbWFyeUtleSgpeyByZXR1cm4gdGhpcy5vcHRpb25zLnBrIHx8IHRoaXMub3B0aW9ucy5wcmltYXJ5S2V5OyB9XG5cbiAgICBnZXQoaW5zdCwga2V5KVxuICAgIHtcbiAgICAgICAgdmFyIHZhbCA9IGluc3QuJHZhbHVlc1trZXldO1xuICAgICAgICBpZih2YWwgPT09IHVuZGVmaW5lZClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFsID0gdGhpcy5vcHRpb25zLmRlZmF1bHQ7XG4gICAgICAgIH0gLy8gZW5kIGlmXG5cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9IC8vIGVuZCBnZXRcblxuICAgIHNldChpbnN0LCBrZXksIHZhbClcbiAgICB7XG4gICAgICAgIGluc3QuJHZhbHVlc1trZXldID0gdmFsO1xuICAgICAgICBpbnN0LiRkaXJ0eSA9IHRydWU7XG4gICAgfSAvLyBlbmQgc2V0XG5cbiAgICB2YWxpZGF0ZShpbnN0LCBrZXkpXG4gICAge1xuICAgICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXQoaW5zdCwga2V5KTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQuIFdlIGRvIHRoaXMgYmVmb3JlIGNhbGxpbmcgc2FuaXRpemUsIGJlY2F1c2Ugc2FuaXRpemUgc2hvdWxkIG5ldmVyIGJlIGFibGUgdG8gb3ZlcnJpZGVcbiAgICAgICAgLy8gdGhlIGByZXF1aXJlZGAgZmxhZy4gVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBkZWNpc2lvbiB0byBsaW1pdCB0aGUgdXRpbGl0eSBvZiBgc2FuaXRpemVgLlxuICAgICAgICBpZih2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIFByaW1hcnkga2V5cyBhcmUgX25ldmVyXyByZXF1aXJlZCBmb3IgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5yZXF1aXJlZCAmJiAhdGhpcy5vcHRpb25zLnBrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuUmVxdWlyZWQoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBPdXIgdmFsdWVzIGFyZSB1bmRlZmluZWQgb3IgbnVsbCwgYnV0IHdlJ3JlIG5vdCBhIHJlcXVpcmVkIGZpZWxkLCBzbyB3ZSByZXR1cm4gdmFsaWQuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IC8vIGVuZCBpZlxuICAgICAgICB9IC8vIGVuZCBpZlxuXG4gICAgICAgIC8vIEdpdmUgdGhlIHVzZXIgdGhlIG9wdGlvbiB0byBzYW5pdGl6ZSB0aGUgaW5wdXRzXG4gICAgICAgIGlmKHRoaXMuJHNhbml0aXplKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YWwgPSB0aGlzLiRzYW5pdGl6ZSh2YWwsIGluc3QpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuXG4gICAgICAgIC8vIENhbGwgdGhlIHR5cGUgc3BlY2lmaWMgdmFsaWRhdGlvblxuICAgICAgICBpZih0aGlzLiR2YWxpZGF0ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFsaWQgPSB0aGlzLiR2YWxpZGF0ZSh2YWwsIGluc3QpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuXG4gICAgICAgIC8vIENhbGwgdGhlIHVzZXIgZGVmaW5lZCB2YWxpZGF0aW9uLCBpZiBpdCBleGlzdHNcbiAgICAgICAgaWYodmFsaWQgJiYgdGhpcy5vcHRpb25zLnZhbGlkYXRlKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YWxpZCA9IHRoaXMub3B0aW9ucy52YWxpZGF0ZS5jYWxsKGluc3QsIHZhbCk7XG5cbiAgICAgICAgICAgIC8vIFdlIHRocm93IGEgbW9yZSBzcGVjaWZpYyBlcnJvciBpZiB3ZSBmYWlsIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmKCF2YWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkN1c3RvbVZhbGlkYXRpb24odmFsKTtcbiAgICAgICAgICAgIH0gLy8gZW5kIGlmXG4gICAgICAgIH0gLy8gZW5kIGlmXG5cbiAgICAgICAgaWYoIXZhbGlkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLlZhbGlkYXRpb24odmFsLCB0aGlzKTtcbiAgICAgICAgfSAvLyBlbmQgaWZcblxuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfSAvLyBlbmQgdmFsaWRhdGVcblxuICAgIHRvU3RyaW5nKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfSAvLyBlbmQgdG9TdHJpbmdcbn0gLy8gZW5kIEJhc2VUeXBlXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jbGFzcyBTdHJpbmdUeXBlIGV4dGVuZHMgQmFzZVR5cGVcbntcbiAgICAkdmFsaWRhdGUodmFsKVxuICAgIHtcbiAgICAgICAgaWYoXy5pc1N0cmluZyh2YWwpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuVmFsaWRhdGlvbih2YWwsIHRoaXMpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuICAgIH0gLy8gZW5kIHZhbGlkYXRlXG59IC8vIGVuZCBTdHJpbmdUeXBlXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jbGFzcyBOdW1iZXJUeXBlIGV4dGVuZHMgQmFzZVR5cGVcbntcbiAgICAkdmFsaWRhdGUodmFsKVxuICAgIHtcbiAgICAgICAgaWYoXy5pc051bWJlcih2YWwpICYmIGlzRmluaXRlKHZhbCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5pbnRlZ2VyICYmICFOdW1iZXIuaXNJbnRlZ2VyKHZhbCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5WYWxpZGF0aW9uKHZhbCwgdGhpcywgYCckeyB2YWwgfScgaXMgbm90IGEgdmFsaWQgaW50ZWdlci5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gLy8gZW5kIGlmXG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLlZhbGlkYXRpb24odmFsLCB0aGlzKTtcbiAgICAgICAgfSAvLyBlbmQgaWZcbiAgICB9IC8vIGVuZCB2YWxpZGF0ZVxufSAvLyBlbmQgTnVtYmVyVHlwZVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY2xhc3MgQm9vbGVhblR5cGUgZXh0ZW5kcyBCYXNlVHlwZVxue1xuICAgICR2YWxpZGF0ZSh2YWwpXG4gICAge1xuICAgICAgICBpZihfLmlzQm9vbGVhbih2YWwpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuVmFsaWRhdGlvbih2YWwsIHRoaXMpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuICAgIH0gLy8gZW5kIHZhbGlkYXRlXG59IC8vIGVuZCBCb29sZWFuVHlwZVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY2xhc3MgRGF0ZVR5cGUgZXh0ZW5kcyBCYXNlVHlwZVxue1xuICAgICR2YWxpZGF0ZSh2YWwpXG4gICAge1xuICAgICAgICBpZihfLmlzRGF0ZSh2YWwpICYmIGlzRmluaXRlKHZhbC5nZXRUaW1lKCkpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuVmFsaWRhdGlvbih2YWwsIHRoaXMpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuICAgIH0gLy8gZW5kIHZhbGlkYXRlXG5cbiAgICBnZXQoaW5zdCwga2V5KVxuICAgIHtcbiAgICAgICAgdmFyIHRzID0gc3VwZXIuZ2V0KGluc3QsIGtleSk7XG5cbiAgICAgICAgaWYodHMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wdGlvbnMuYXV0bylcbiAgICAgICAge1xuICAgICAgICAgICAgdHMgPSBEYXRlLm5vdygpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0cyk7XG4gICAgfSAvLyBlbmQgZ2V0XG5cbiAgICBzZXQoaW5zdCwga2V5LCB2YWwpXG4gICAge1xuICAgICAgICAvLyBBbHdheXMgYXR0ZW1wdCB0byBjYXN0IHRvIGEgRGF0ZS5cbiAgICAgICAgdmFsID0gbmV3IERhdGUodmFsKTtcblxuICAgICAgICB2YXIgdGltZXN0YW1wID0gdmFsLmdldFRpbWUoKTtcbiAgICAgICAgaWYoaXNGaW5pdGUodGltZXN0YW1wKSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gRGF0ZXMgYXJlIG5ldmVyIHN0b3JlZCBhcyBEYXRlIG9iamVjdHMsIGJ1dCBhbHdheXMgdW5peCB0aW1lc3RhbXBzIHVuZGVyIHRoZSBob29kLlxuICAgICAgICAgICAgc3VwZXIuc2V0KGluc3QsIGtleSwgdGltZXN0YW1wKTtcbiAgICAgICAgfSAvLyBlbmQgaWZcbiAgICB9IC8vIGVuZCBzZXRcbn0gLy8gZW5kIERhdGVUeXBlXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jbGFzcyBPYmplY3RUeXBlIGV4dGVuZHMgQmFzZVR5cGVcbntcbiAgICAkdmFsaWRhdGUodmFsKVxuICAgIHtcbiAgICAgICAgaWYoXy5pc1BsYWluT2JqZWN0KHZhbCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIFN1cHBvcnQgbmVzdGVkIHNjaGVtYXNcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5zY2hlbWEpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXy5tYXBWYWx1ZXModGhpcy5vcHRpb25zLnNjaGVtYSwgKHZhbHVlLCBrZXkpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHJ1biB2YWxpZGF0aW9uIGlmIGl0J3MgYSB0eXBlIGZyb20gb3VyIHR5cGUgc3lzdGVtLlxuICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZS4kaXNUeXBlKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGZhaWxzIHRvIHZhbGlkYXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbGlkYXRlKHsgJHZhbHVlczogdmFsIH0sIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IC8vIGVuZCBpZlxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuVmFsaWRhdGlvbih2YWwsIHRoaXMpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuICAgIH0gLy8gZW5kIHZhbGlkYXRlXG59IC8vIGVuZCBPYmplY3RUeXBlXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jbGFzcyBBcnJheVR5cGUgZXh0ZW5kcyBCYXNlVHlwZVxue1xuICAgICR2YWxpZGF0ZSh2YWwpXG4gICAge1xuICAgICAgICBpZihfLmlzQXJyYXkodmFsKSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gU3VwcG9ydCB0eXBlIGNoZWNraW5nXG4gICAgICAgICAgICB2YXIgdHlwZSA9IHRoaXMub3B0aW9ucy50eXBlO1xuICAgICAgICAgICAgaWYodHlwZSAmJiB0eXBlLiRpc1R5cGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uYWxsKHZhbCwgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGZhaWxzIHRvIHZhbGlkYXRlLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS52YWxpZGF0ZSh7ICR2YWx1ZXM6IHsgaXRlbSB9IH0sICdpdGVtJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IC8vIGVuZCBpZlxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuVmFsaWRhdGlvbih2YWwsIHRoaXMpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuICAgIH0gLy8gZW5kIHZhbGlkYXRlXG59IC8vIGVuZCBBcnJheVR5cGVcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNsYXNzIEVudW1UeXBlIGV4dGVuZHMgQmFzZVR5cGVcbntcbiAgICAkdmFsaWRhdGUodmFsKVxuICAgIHtcbiAgICAgICAgdmFyIGNob2ljZXMgPSB0aGlzLm9wdGlvbnMudmFsdWVzIHx8IFtdO1xuICAgICAgICBpZihfLmNvbnRhaW5zKGNob2ljZXMsIHZhbCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5WYWxpZGF0aW9uKHZhbCwgdGhpcywgYCckeyB2YWwgfScgbXVzdCBiZSBvbmUgb2Y6ICR7IHRoaXMub3B0aW9ucy52YWx1ZXMuam9pbignLCAnKSB9YCk7XG4gICAgICAgIH0gLy8gZW5kIGlmXG4gICAgfSAvLyBlbmQgdmFsaWRhdGVcbn0gLy8gZW5kIEVudW1UeXBlXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jbGFzcyBBbnlUeXBlIGV4dGVuZHMgQmFzZVR5cGUge31cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBCYXNlOiBCYXNlVHlwZSxcbiAgICBTdHJpbmc6IFN0cmluZ1R5cGUsXG4gICAgTnVtYmVyOiBOdW1iZXJUeXBlLFxuICAgIEJvb2xlYW46IEJvb2xlYW5UeXBlLFxuICAgIERhdGU6IERhdGVUeXBlLFxuICAgIE9iamVjdDogT2JqZWN0VHlwZSxcbiAgICBBcnJheTogQXJyYXlUeXBlLFxuICAgIEVudW06IEVudW1UeXBlLFxuICAgIEFueTogQW55VHlwZVxufTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiJdfQ==