// XMLHttpRequest.js
(function(m,u,n,g,e,d){for(g=u[d[32]]-1;g>=0;g--)n+=e[d[65]][d[70]](u[d[71]](g)-1);u=n[d[69]](' ');for(g=u[d[32]]-1;g>=0;g--)m=m[d[68]](e[d[67]](g%10+(e[d[65]][d[70]](122-e[d[66]][d[72]](g/10))),'g'),u[g]);e[d[3]]('_',m)(d)})("(9z 2w{8y s=6x8x129x;8y b=6w6x8x229x,c=6x8x259x8x169x3w!6x8x439x;9z e2w{5x.a5=s?2y s:2y 6x8x09x(_[7]);5x.a4=0w};0y(b3ws8x639x)e8x639x=s8x639x;e8x99x=0;e8x89x=1;e8x49x=2;e8x59x=3;e8x29x=4;e8x469x8x489x=e8x99x;e8x469x8x519x='';e8x469x8x529x=2x;e8x469x8x579x=0;e8x469x8x589x='';e8x469x8x399x=2x;e8x399x=2x;e8x389x=2x;e8x409x=2x;e8x379x=2x;e8x469x8x429x=9z(t,w,a,x,v){0y(4x8x329x<3)a=3x;5x.a2=a;8y r=5x,m=5x8x489x;0y(c){8y i=9z2w{0y(r.a58x489x7we8x29x){f(r);r8x149x2w}};0y(a)6x8x199x(_[41],i)}5x.a58x399x=9z2w{0y(b3w!a)3y;r8x489x=r.a58x489x;k(r);0y(r.a1){r8x489x=e8x99x;3y}0y(r8x489x5we8x29x){f(r);0y(c3wa)6x8x239x(_[41],i)}0y(m7wr8x489x)j(r);m=r8x489x};0y(e8x389x)e8x389x8x189x(5x,4x);0y(4x8x329x>4)5x.a58x429x(t,w,a,x,v);7z 0y(4x8x329x>3)5x.a58x429x(t,w,a,x);7z 5x.a58x429x(t,w,a);0y(!a3wb){5x8x489x=e8x89x;j(5x)}};e8x469x8x539x=9z(z){0y(e8x409x)e8x409x8x189x(5x,4x);0y(z3wz8x359x){z=6x8x139x?2y 6x8x139x2w8x549x(z):z8x649x;0y(!5x.a38x19x)5x.a58x559x(_[1],_[17])}5x.a58x539x(z);0y(b3w!5x.a2){5x8x489x=e8x89x;k(5x);9y(5x8x489x<e8x29x){5x8x489x0v;j(5x);0y(5x.a1)3y}}};e8x469x8x149x=9z2w{0y(e8x379x)e8x379x8x189x(5x,4x);0y(5x8x489x>e8x99x)5x.a1=3x;5x.a58x149x2w;f(5x)};e8x469x8x279x=9z2w{3y 5x.a58x279x2w};e8x469x8x289x=9z(u){3y 5x.a58x289x(u)};e8x469x8x559x=9z(u,y){0y(!5x.a3)5x.a3=1w;5x.a3[u]=y;3y 5x.a58x559x(u,y)};e8x469x8x159x=9z(u,h,d){8z(8y l=0,q;q=5x.a4[l];l0v)0y(q[0]5wu3wq[1]5wh3wq[2]5wd)3y;5x.a48x479x([u,h,d])};e8x469x8x509x=9z(u,h,d){8z(8y l=0,q;q=5x.a4[l];l0v)0y(q[0]5wu3wq[1]5wh3wq[2]5wd)1z;0y(q)5x.a48x569x(l,1)};e8x469x8x249x=9z(p){8y p={'type':p8x629x,'target':5x,'currentTarget':5x,'eventPhase':2,'bubbles':p8x209x,'cancelable':p8x219x,'timeStamp':p8x609x,'stopPropagation':9z2w1w,'preventDefault':9z2w1w,'0zitEvent':9z2w1w};0y(p8x629x5w_[49]3w5x8x399x)(5x8x399x8x299x4w5x8x399x)8x189x(5x,[p]);8z(8y l=0,q;q=5x.a4[l];l0v)0y(q[0]5wp8x629x3w!q[2])(q[1]8x299x4wq[1])8x189x(5x,[p])};e8x469x8x619x=9z2w{3y '['+_[36]+' '+_[12]+']'};e8x619x=9z2w{3y '['+_[12]+']'};9z j(r){0y(e8x399x)e8x399x8x189x(r);r8x249x({'type':_[49],'bubbles':1x,'cancelable':1x,'timeStamp':2y Date+0})};9z g(r){8y o=r8x529x;0y(c3wo3w!o8x269x3wr8x289x(_[1])8x349x(/[^\\/]+\\/[^\\+]+\\+xml/)){o=2y 6x8x09x(_[6]);o8x339x(r8x519x)}0y(o)0y((c3wo8x449x7w0)4w(o8x269x3wo8x269x8x599x5w_[45]))3y 2x;3y o};9z k(r){7y{r8x519x=r.a58x519x}3z(e)1w7y{r8x529x=g(r.a5)}3z(e)1w7y{r8x579x=r.a58x579x}3z(e)1w7y{r8x589x=r.a58x589x}3z(e)1w};9z f(r){r.a58x399x=2y 6x8x39x;6z r.a3};0y(!6x8x39x8x469x8x189x){6x8x39x8x469x8x189x=9z(r,n){0y(!n)n=0w;r.a0=5x;r.a0(n[0],n[1],n[2],n[3],n[4]);6z r.a0}};6x8x129x=e})2w;",">?!>=!..!,,!>.!>,!>\"!\"\"!>>!}}!\'\'!*)!~|!^\\!^^!\\`\\!uofnvdpe!xpeojx!tjiu!tuofnvhsb!fvsu!mmvo!ftmbg!iujx!fmjix!sbw!zsu!idujxt!gpfqzu!xpsiu!osvufs!xfo!gpfdobutoj!gj!opjudovg!spg!ftmf!fufmfe!umvbgfe!fvojuopd!idubd!ftbd!lbfsc!oj",'',0,this,'ActiveXObject Content-Type DONE Function HEADERS_RECEIVED LOADING Microsoft.XMLDOM Microsoft.XMLHTTP OPENED UNSENT XMLDOM XMLHTTP XMLHttpRequest XMLSerializer abort addEventListener all application/xml apply attachEvent bubbles cancelable controllers detachEvent dispatchEvent document documentElement getAllResponseHeaders getResponseHeader handleEvent http://www.w3.org/XML/1998/namespace http://www.w3.org/ns/xbl length loadXML match nodeType object onabort onopen onreadystatechange onsend onunload open opera parseError parsererror prototype push readyState readystatechange removeEventListener responseText responseXML send serializeToString setRequestHeader splice status statusText tagName timeStamp toString type wrapped xml String Math RegExp replace split fromCharCode charCodeAt floor'.split(' '))

// json2.js
if(!this.JSON){JSON={};}
(function(){function f(n){return n<10?'0'+n:n;}
if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return this.getUTCFullYear()+'-'+
f(this.getUTCMonth()+1)+'-'+
f(this.getUTCDate())+'T'+
f(this.getUTCHours())+':'+
f(this.getUTCMinutes())+':'+
f(this.getUTCSeconds())+'Z';};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};}
var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapeable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapeable.lastIndex=0;return escapeable.test(string)?'"'+string.replace(escapeable,function(a){var c=meta[a];if(typeof c==='string'){return c;}
return'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}
function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}
if(typeof rep==='function'){value=rep.call(holder,key,value);}
switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}
gap+=indent;partial=[];if(typeof value.length==='number'&&!value.propertyIsEnumerable('length')){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}
v=partial.length===0?'[]':gap?'[\n'+gap+
partial.join(',\n'+gap)+'\n'+
mind+']':'['+partial.join(',')+']';gap=mind;return v;}
if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}
v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+
mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}
if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}
rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}
return str('',{'':value});};}
if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}
return reviver.call(holder,key,value);}
cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+
('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}
if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}
throw new SyntaxError('JSON.parse');};}})();

function JSONRPCError ()
{
	if (arguments.length == 1)
	{
		this.message = arguments[0].message;
		this.code = arguments[0].code;
		if (arguments[0].hasOwnProperty("error"))
			this.error = arguments[0].error;
	}
	else if (arguments.length > 1)
	{
		this.message = arguments[0];
		this.code = arguments[1];
		this.error = (arguments.length > 2 ? arguments[2] : null);
	}
}

JSONRPCError.prototype.name = "JSONRPCError";

JSONRPCError.prototype.toString = function ()
{
	return "JSONRPCError: "+this.message;
}

JSONRPCError.prototype.getDescription = function ()
{
	var msg = 	"Name: "+this.name+"\n"+
				"Message: "+this.message+"\n"+
				"Code: "+this.code;
	if (this.name == "JSONRPCError" && this.error)
	{
		msg += 	"Type: "+this.error.name+"\n"+
				"Error: "+this.error.errstr+"\n"+
				"File: "+this.error.errfile+":"+this.error.errline;
	}

	return msg;
}

function JSONClient (namespace, ignoreDescription)
{
	this.__namespace = namespace;

	if (!ignoreDescription)
	{
		var methods = null;
		try
		{
			methods = this.__exec("system.listMethods");
		}
		catch (e)
		{
			if (e instanceof JSONRPCError)
			{
				try
				{
					var description = this.__exec("system.describe");
					if (description.hasOwnProperty("procs"))
					{
						methods = new Array();
						for (var key in description.procs)
						{
							if (description.procs.hasOwnProperty(key))
								methods.push(description.procs[key].name);
						}
					}
				}
				catch (e)
				{
					if (e instanceof JSONRPCError)
					{
					}
					else
						throw e;
				}
			}
			else
				throw e;
		}

		if (methods != null)
		{
			for (var i=0; i<methods.length; i++)
			{
				var method = methods[i]
				var path = method.split(".");
				var obj = this;
				for (var j=0; j<path.length - 1; j++)
				{
					if (!obj.hasOwnProperty(path[j]))
					{
						obj[path[j]] = new JSONClient(this.__namespace, true);
						obj = obj[path[j]];
					}
				}

				if (!obj.hasOwnProperty(path[j]))
					obj[path[j]] = new Function("return this.__execv(\""+method+"\", arguments);");
			}
		}
	}
}

JSONClient.prototype.__execAsync = function (method, callback)
{
	var params = new Array();
	var i,j;
	for (i=2,j=0; i<arguments.length; i++,j++)
	{
		params[j] = arguments[i];
	}
	this.__execAsyncv(method, callback, params);
}

JSONClient.prototype.__execAsyncEx = function (method, callback, id)
{
	var params = new Array();
	var i,j;
	for (i=3,j=0; i<arguments.length; i++,j++)
	{
		params[j] = arguments[i];
	}
	this.__execAsyncvEx(method, callback, id, params);
}

JSONClient.prototype.__execAsyncvEx = function (method, callback, id, params)
{
	var req = new XMLHttpRequest();
	req.open("POST", this.__namespace, true);
	req.__id = id;
	req.__callback = callback;
	req.onreadystatechange = function ()
	{
		if (this.readyState == XMLHttpRequest.DONE)
		{
			if (this.responseText == null || this.responseText.length == 0)
				this.__callback(false, new JSONRPCError("Invalid JSON response", 0), this.__id);
			else
			{
				try
				{
					var response = JSON.parse(this.responseText);
					try
					{
						if (response.hasOwnProperty("error") && response.error != null)
							this.__callback(false, new JSONRPCError(response.error), this.__id);
						else if (this.status == 200 && response.hasOwnProperty("result"))
							this.__callback(true, response.result, this.__id);
						else
							this.__callback(false, new JSONRPCError("Invalid JSON-RPC response", 0), this.__id);
					}
					catch (ignored)
					{
					}
				}
				catch (e)
				{
					this.__callback(false, e, this.__id);
				}
			}
		}
	};
	req.setRequestHeader("Content-Type", "application/json");
	req.setRequestHeader("Accept", "application/json");
	req.setRequestHeader("X-JSON-RPC", method);
	req.send(JSON.stringify({"version" : "1.1", "method" : method, "params" : params, "id" : null}));
}

JSONClient.prototype.__execAsyncv = function (method, callback, params)
{
	this.__execAsyncvEx(method, callback, null, params);
}

JSONClient.prototype.toString = function ()
{
	return "JSONClient("+this.__namespace+")";
}

JSONClient.prototype.__execv = function (method, params)
{
	var args;
	if (typeof params == "object")
	{
		args = [];
		for (var i=0; i<params.length; i++)
			args.push(params[i]);
	}
	else
		args = params;
	var req = new XMLHttpRequest();
	req.open("POST", this.__namespace, false);
	req.setRequestHeader("Content-Type", "application/json");
	req.setRequestHeader("Accept", "application/json");
	req.setRequestHeader("X-JSON-RPC", method);
	req.send(JSON.stringify({"version" : "1.1", "method" : method, "params" : args}));
	if (req.responseText == null || req.responseText.length == 0)
		throw new JSONRPCError("Invalid JSON response", 0);
	else
	{
		var response = JSON.parse(req.responseText);
		if (response.hasOwnProperty("error") && response.error != null)
			throw new JSONRPCError(response.error);
		else if (req.status == 200 && response.hasOwnProperty("result"))
			return response.result;
		else
			throw new JSONRPCError("Invalid JSON-RPC response", 0);
	}
}

JSONClient.prototype.__exec = function (method)
{
	var params = new Array();
	var i, j;
	for (i=1, j=0; i<arguments.length; i++,j++)
	{
		params[j] = arguments[i];
	}
	return this.__execv(method, params);
}

