JS={extend:function(e,d){d=d||{};for(var f in d){if(e[f]===d[f]){continue;}e[f]=d[f];}return e;},makeFunction:function(){return function(){return this.initialize?(this.initialize.apply(this,arguments)||this):this;};},makeBridge:function(d){var c=function(){};c.prototype=d.prototype;return new c;},delegate:function(d,c){return function(){return this[d][c].apply(this[d],arguments);
};},bind:function(){var e=JS.array(arguments),d=e.shift(),f=e.shift()||null;return function(){return d.apply(f,e.concat(JS.array(arguments)));};},callsSuper:function(b){return b.SUPER===undefined?b.SUPER=/\bcallSuper\b/.test(b.toString()):b.SUPER;},mask:function(d){var c=d.toString().replace(/callSuper/g,"super");
d.toString=function(){return c;};return d;},array:function(e){if(!e){return[];}if(e.toArray){return e.toArray();}var d=e.length,f=[];while(d--){f[d]=e[d];}return f;},indexOf:function(f,e){for(var h=0,g=f.length;h<g;h++){if(f[h]===e){return h;}}return -1;},isFn:function(b){return b instanceof Function;
},ignore:function(d,c){return/^(include|extend)$/.test(d)&&typeof c==="object";}};JS.Module=JS.makeFunction();JS.extend(JS.Module.prototype,{initialize:function(d,c){c=c||{};this.__mod__=this;this.__inc__=[];this.__fns__={};this.__dep__=[];this.__res__=c._1||null;this.include(d||{});},define:function(f,e,h){h=h||{};
this.__fns__[f]=e;if(JS.Module._0&&h._0&&JS.isFn(e)){JS.Module._0(f,h._0);}var g=this.__dep__.length;while(g--){this.__dep__[g].resolve();}},instanceMethod:function(d){var c=this.lookup(d).pop();return JS.isFn(c)?c:null;},include:function(t,s,r){if(!t){return r&&this.resolve();}s=s||{};var q=t.include,o=t.extend,p,n,k,m,l=s._4||this;
if(t.__inc__&&t.__fns__){this.__inc__.push(t);t.__dep__.push(this);if(s._2){t.extended&&t.extended(s._2);}else{t.included&&t.included(l);}}else{if(s._5){for(m in t){if(JS.ignore(m,t[m])){continue;}this.define(m,t[m],{_0:l||s._2||this});}}else{if(typeof q==="object"){p=[].concat(q);for(n=0,k=p.length;
n<k;n++){l.include(p[n],s);}}if(typeof o==="object"){p=[].concat(o);for(n=0,k=p.length;n<k;n++){l.extend(p[n],false);}l.extend();}s._5=true;return l.include(t,s,r);}}r&&this.resolve();},includes:function(d){if(Object===d||this===d||this.__res__===d.prototype){return true;}var c=this.__inc__.length;while(c--){if(this.__inc__[c].includes(d)){return true;
}}return false;},ancestors:function(g){g=g||[];for(var e=0,j=this.__inc__.length;e<j;e++){this.__inc__[e].ancestors(g);}var i=(this.__res__||{}).klass,h=(i&&this.__res__===i.prototype)?i:this;if(JS.indexOf(g,h)===-1){g.push(h);}return g;},lookup:function(h){var g=this.ancestors(),l=[],k,i,j;for(k=0,i=g.length;
k<i;k++){j=g[k].__mod__.__fns__[h];if(j){l.push(j);}}return l;},make:function(e,d){if(!JS.isFn(d)||!JS.callsSuper(d)){return d;}var f=this;return function(){return f.chain(this,e,arguments);};},chain:JS.mask(function(p,o,m){var n=this.lookup(o),l=n.length-1,a=p.callSuper,k=JS.array(m),b;p.callSuper=function(){var d=arguments.length;
while(d--){k[d]=arguments[d];}l-=1;var c=n[l].apply(p,k);l+=1;return c;};b=n.pop().apply(p,k);a?p.callSuper=a:delete p.callSuper;return b;}),resolve:function(h){var h=h||this,g=h.__res__,l,k,i,j;if(h===this){l=this.__dep__.length;while(l--){this.__dep__[l].resolve();}}if(!g){return;}for(l=0,k=this.__inc__.length;
l<k;l++){this.__inc__[l].resolve(h);}for(i in this.__fns__){j=h.make(i,this.__fns__[i]);if(g[i]!==j){g[i]=j;}}}});JS.ObjectMethods=new JS.Module({__eigen__:function(){if(this.__meta__){return this.__meta__;}var b=this.__meta__=new JS.Module({},{_1:this});b.include(this.klass.__mod__);return b;},extend:function(d,c){return this.__eigen__().include(d,{_2:this},c!==false);
},isA:function(b){return this.__eigen__().includes(b);},method:function(e){var d=this,f=d.__mcache__=d.__mcache__||{};if((f[e]||{}).fn===d[e]){return f[e].bd;}return(f[e]={fn:d[e],bd:JS.bind(d[e],d)}).bd;}});JS.Class=JS.makeFunction();JS.extend(JS.Class.prototype=JS.makeBridge(JS.Module),{initialize:function(e,d){var f=JS.extend(JS.makeFunction(),this);
f.klass=f.constructor=this.klass;if(!JS.isFn(e)){d=e;e=Object;}f.inherit(e);f.include(d,null,false);f.resolve();do{e.inherited&&e.inherited(f);}while(e=e.superclass);return f;},inherit:function(d){this.superclass=d;if(this.__eigen__){this.__eigen__().include(d.__eigen__?d.__eigen__():new JS.Module(d.prototype));
this.__meta__.resolve();}this.subclasses=[];(d.subclasses||[]).push(this);var c=this.prototype=JS.makeBridge(d);c.klass=c.constructor=this;this.__mod__=new JS.Module({},{_1:this.prototype});this.include(JS.ObjectMethods,null,false);if(d!==Object){this.include(d.__mod__||new JS.Module(d.prototype,{_1:d.prototype}),null,false);
}},include:function(f,e,h){if(!f){return;}var g=this.__mod__,e=e||{};e._4=this;return g.include(f,e,h!==false);},extend:function(d){if(!this.callSuper){return;}this.callSuper();var c=this.subclasses.length;while(c--){this.subclasses[c].extend();}},define:function(){var b=this.__mod__;b.define.apply(b,arguments);
b.resolve();},includes:JS.delegate("__mod__","includes"),ancestors:JS.delegate("__mod__","ancestors"),resolve:JS.delegate("__mod__","resolve")});JS.Module=JS.extend(new JS.Class(JS.Module.prototype),JS.ObjectMethods.__fns__);JS.Module.include(JS.ObjectMethods);JS.Class=JS.extend(new JS.Class(JS.Module,JS.Class.prototype),JS.ObjectMethods.__fns__);
JS.Module.klass=JS.Module.constructor=JS.Class.klass=JS.Class.constructor=JS.Class;JS.Module.extend({_3:[],methodAdded:function(d,c){this._3.push([d,c]);},_0:function(f,e){var h=this._3,g=h.length;while(g--){h[g][0].call(h[g][1]||null,f,e);}}});JS.extend(JS,{Interface:new JS.Class({initialize:function(a){this.test=function(e,d){var f=a.length;
while(f--){if(!JS.isFn(e[a[f]])){return d?a[f]:false;}}return true;};},extend:{ensure:function(){var f=JS.array(arguments),e=f.shift(),h,g;while(h=f.shift()){g=h.test(e,true);if(g!==true){throw new Error("object does not implement "+g+"()");}}}}}),Singleton:new JS.Class({initialize:function(d,c){return new (new JS.Class(d,c));
}})});
