-
-
Save freidamachoi/c609b8a19723ef3af657 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function () { | |
var COMPILED = !0, | |
goog = goog || {}; | |
goog.global = this; | |
goog.DEBUG = !0; | |
goog.LOCALE = "en"; | |
goog.provide = function (a) { | |
if (!COMPILED) { | |
if (goog.isProvided_(a)) throw Error('Namespace "' + a + '" already declared.'); | |
delete goog.implicitNamespaces_[a]; | |
for (var b = a; | |
(b = b.substring(0, b.lastIndexOf("."))) && !goog.getObjectByName(b);) goog.implicitNamespaces_[b] = !0 | |
} | |
goog.exportPath_(a) | |
}; | |
goog.setTestOnly = function (a) { | |
if (COMPILED && !goog.DEBUG) throw a = a || "", Error("Importing test-only code into non-debug environment" + a ? ": " + a : "."); | |
}; | |
COMPILED || (goog.isProvided_ = function (a) { | |
return !goog.implicitNamespaces_[a] && !! goog.getObjectByName(a) | |
}, goog.implicitNamespaces_ = {}); | |
goog.exportPath_ = function (a, b, c) { | |
a = a.split("."); | |
c = c || goog.global; | |
!(a[0] in c) && c.execScript && c.execScript("var " + a[0]); | |
for (var d; a.length && (d = a.shift());)!a.length && goog.isDef(b) ? c[d] = b : c = c[d] ? c[d] : c[d] = {} | |
}; | |
goog.getObjectByName = function (a, b) { | |
for (var c = a.split("."), d = b || goog.global, e; e = c.shift();) | |
if (goog.isDefAndNotNull(d[e])) d = d[e]; | |
else return null; | |
return d | |
}; | |
goog.globalize = function (a, b) { | |
var c = b || goog.global, | |
d; | |
for (d in a) c[d] = a[d] | |
}; | |
goog.addDependency = function (a, b, c) { | |
if (!COMPILED) { | |
for (var d, a = a.replace(/\\/g, "/"), e = goog.dependencies_, f = 0; d = b[f]; f++) { | |
e.nameToPath[d] = a; | |
a in e.pathToNames || (e.pathToNames[a] = {}); | |
e.pathToNames[a][d] = true | |
} | |
for (d = 0; b = c[d]; d++) { | |
a in e.requires || (e.requires[a] = {}); | |
e.requires[a][b] = true | |
} | |
} | |
}; | |
goog.ENABLE_DEBUG_LOADER = !0; | |
goog.require = function (a) { | |
if (!COMPILED && !goog.isProvided_(a)) { | |
if (goog.ENABLE_DEBUG_LOADER) { | |
var b = goog.getPathFromDeps_(a); | |
if (b) { | |
goog.included_[b] = true; | |
goog.writeScripts_(); | |
return | |
} | |
} | |
a = "goog.require could not find: " + a; | |
goog.global.console && goog.global.console.error(a); | |
throw Error(a); | |
} | |
}; | |
goog.basePath = ""; | |
goog.nullFunction = function () {}; | |
goog.identityFunction = function (a) { | |
return a | |
}; | |
goog.abstractMethod = function () { | |
throw Error("unimplemented abstract method"); | |
}; | |
goog.addSingletonGetter = function (a) { | |
a.getInstance = function () { | |
if (a.instance_) return a.instance_; | |
goog.DEBUG && (goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = a); | |
return a.instance_ = new a | |
} | |
}; | |
goog.instantiatedSingletons_ = []; | |
!COMPILED && goog.ENABLE_DEBUG_LOADER && (goog.included_ = {}, goog.dependencies_ = { | |
pathToNames: {}, | |
nameToPath: {}, | |
requires: {}, | |
visited: {}, | |
written: {} | |
}, goog.inHtmlDocument_ = function () { | |
var a = goog.global.document; | |
return typeof a != "undefined" && "write" in a | |
}, goog.findBasePath_ = function () { | |
if (goog.global.CLOSURE_BASE_PATH) goog.basePath = goog.global.CLOSURE_BASE_PATH; | |
else if (goog.inHtmlDocument_()) | |
for (var a = goog.global.document.getElementsByTagName("script"), b = a.length - 1; b >= 0; --b) { | |
var c = a[b].src, | |
d = c.lastIndexOf("?"), | |
d = d == -1 ? c.length : d; | |
if (c.substr(d - 7, 7) == "base.js") { | |
goog.basePath = c.substr(0, d - 7); | |
break | |
} | |
} | |
}, goog.importScript_ = function (a) { | |
var b = goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_; | |
!goog.dependencies_.written[a] && b(a) && (goog.dependencies_.written[a] = true) | |
}, goog.writeScriptTag_ = function (a) { | |
if (goog.inHtmlDocument_()) { | |
goog.global.document.write('<script type="text/javascript" src="' + a + '"><\/script>'); | |
return true | |
} | |
return false | |
}, goog.writeScripts_ = function () { | |
function a(e) { | |
if (!(e in d.written)) { | |
if (!(e in | |
d.visited)) { | |
d.visited[e] = true; | |
if (e in d.requires) | |
for (var g in d.requires[e]) | |
if (!goog.isProvided_(g)) | |
if (g in d.nameToPath) a(d.nameToPath[g]); | |
else throw Error("Undefined nameToPath for " + g); | |
} | |
if (!(e in c)) { | |
c[e] = true; | |
b.push(e) | |
} | |
} | |
} | |
var b = [], | |
c = {}, d = goog.dependencies_, | |
e; | |
for (e in goog.included_) d.written[e] || a(e); | |
for (e = 0; e < b.length; e++) | |
if (b[e]) goog.importScript_(goog.basePath + b[e]); | |
else throw Error("Undefined script input"); | |
}, goog.getPathFromDeps_ = function (a) { | |
return a in goog.dependencies_.nameToPath ? goog.dependencies_.nameToPath[a] : | |
null | |
}, goog.findBasePath_(), goog.global.CLOSURE_NO_DEPS || goog.importScript_(goog.basePath + "deps.js")); | |
goog.typeOf = function (a) { | |
var b = typeof a; | |
if (b == "object") | |
if (a) { | |
if (a instanceof Array) return "array"; | |
if (a instanceof Object) return b; | |
var c = Object.prototype.toString.call(a); | |
if (c == "[object Window]") return "object"; | |
if (c == "[object Array]" || typeof a.length == "number" && typeof a.splice != "undefined" && typeof a.propertyIsEnumerable != "undefined" && !a.propertyIsEnumerable("splice")) return "array"; | |
if (c == "[object Function]" || typeof a.call != "undefined" && typeof a.propertyIsEnumerable != "undefined" && !a.propertyIsEnumerable("call")) return "function" | |
} else return "null"; | |
else if (b == "function" && typeof a.call == "undefined") return "object"; | |
return b | |
}; | |
goog.isDef = function (a) { | |
return a !== void 0 | |
}; | |
goog.isNull = function (a) { | |
return a === null | |
}; | |
goog.isDefAndNotNull = function (a) { | |
return a != null | |
}; | |
goog.isArray = function (a) { | |
return goog.typeOf(a) == "array" | |
}; | |
goog.isArrayLike = function (a) { | |
var b = goog.typeOf(a); | |
return b == "array" || b == "object" && typeof a.length == "number" | |
}; | |
goog.isDateLike = function (a) { | |
return goog.isObject(a) && typeof a.getFullYear == "function" | |
}; | |
goog.isString = function (a) { | |
return typeof a == "string" | |
}; | |
goog.isBoolean = function (a) { | |
return typeof a == "boolean" | |
}; | |
goog.isNumber = function (a) { | |
return typeof a == "number" | |
}; | |
goog.isFunction = function (a) { | |
return goog.typeOf(a) == "function" | |
}; | |
goog.isObject = function (a) { | |
var b = typeof a; | |
return b == "object" && a != null || b == "function" | |
}; | |
goog.getUid = function (a) { | |
return a[goog.UID_PROPERTY_] || (a[goog.UID_PROPERTY_] = ++goog.uidCounter_) | |
}; | |
goog.removeUid = function (a) { | |
"removeAttribute" in a && a.removeAttribute(goog.UID_PROPERTY_); | |
try { | |
delete a[goog.UID_PROPERTY_] | |
} catch (b) {} | |
}; | |
goog.UID_PROPERTY_ = "closure_uid_" + Math.floor(2147483648 * Math.random()).toString(36); | |
goog.uidCounter_ = 0; | |
goog.getHashCode = goog.getUid; | |
goog.removeHashCode = goog.removeUid; | |
goog.cloneObject = function (a) { | |
var b = goog.typeOf(a); | |
if (b == "object" || b == "array") { | |
if (a.clone) return a.clone(); | |
var b = b == "array" ? [] : {}, c; | |
for (c in a) b[c] = goog.cloneObject(a[c]); | |
return b | |
} | |
return a | |
}; | |
goog.bindNative_ = function (a, b, c) { | |
return a.call.apply(a.bind, arguments) | |
}; | |
goog.bindJs_ = function (a, b, c) { | |
if (!a) throw Error(); | |
if (arguments.length > 2) { | |
var d = Array.prototype.slice.call(arguments, 2); | |
return function () { | |
var c = Array.prototype.slice.call(arguments); | |
Array.prototype.unshift.apply(c, d); | |
return a.apply(b, c) | |
} | |
} | |
return function () { | |
return a.apply(b, arguments) | |
} | |
}; | |
goog.bind = function (a, b, c) { | |
goog.bind = Function.prototype.bind && Function.prototype.bind.toString().indexOf("native code") != -1 ? goog.bindNative_ : goog.bindJs_; | |
return goog.bind.apply(null, arguments) | |
}; | |
goog.partial = function (a, b) { | |
var c = Array.prototype.slice.call(arguments, 1); | |
return function () { | |
var b = Array.prototype.slice.call(arguments); | |
b.unshift.apply(b, c); | |
return a.apply(this, b) | |
} | |
}; | |
goog.mixin = function (a, b) { | |
for (var c in b) a[c] = b[c] | |
}; | |
goog.now = Date.now || function () { | |
return +new Date | |
}; | |
goog.globalEval = function (a) { | |
if (goog.global.execScript) goog.global.execScript(a, "JavaScript"); | |
else if (goog.global.eval) { | |
if (goog.evalWorksForGlobals_ == null) { | |
goog.global.eval("var _et_ = 1;"); | |
if (typeof goog.global._et_ != "undefined") { | |
delete goog.global._et_; | |
goog.evalWorksForGlobals_ = true | |
} else goog.evalWorksForGlobals_ = false | |
} | |
if (goog.evalWorksForGlobals_) goog.global.eval(a); | |
else { | |
var b = goog.global.document, | |
c = b.createElement("script"); | |
c.type = "text/javascript"; | |
c.defer = false; | |
c.appendChild(b.createTextNode(a)); | |
b.body.appendChild(c); | |
b.body.removeChild(c) | |
} | |
} else throw Error("goog.globalEval not available"); | |
}; | |
goog.evalWorksForGlobals_ = null; | |
goog.getCssName = function (a, b) { | |
var c = function (a) { | |
return goog.cssNameMapping_[a] || a | |
}, d = function (a) { | |
for (var a = a.split("-"), b = [], d = 0; d < a.length; d++) b.push(c(a[d])); | |
return b.join("-") | |
}, d = goog.cssNameMapping_ ? goog.cssNameMappingStyle_ == "BY_WHOLE" ? c : d : function (a) { | |
return a | |
}; | |
return b ? a + "-" + d(b) : d(a) | |
}; | |
goog.setCssNameMapping = function (a, b) { | |
goog.cssNameMapping_ = a; | |
goog.cssNameMappingStyle_ = b | |
}; | |
!COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING && (goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING); | |
goog.getMsg = function (a, b) { | |
var c = b || {}, d; | |
for (d in c) var e = ("" + c[d]).replace(/\$/g, "$$$$"), | |
a = a.replace(RegExp("\\{\\$" + d + "\\}", "gi"), e); | |
return a | |
}; | |
goog.exportSymbol = function (a, b, c) { | |
goog.exportPath_(a, b, c) | |
}; | |
goog.exportProperty = function (a, b, c) { | |
a[b] = c | |
}; | |
goog.inherits = function (a, b) { | |
function c() {} | |
c.prototype = b.prototype; | |
a.superClass_ = b.prototype; | |
a.prototype = new c; | |
a.prototype.constructor = a | |
}; | |
goog.base = function (a, b, c) { | |
var d = arguments.callee.caller; | |
if (d.superClass_) return d.superClass_.constructor.apply(a, Array.prototype.slice.call(arguments, 1)); | |
for (var e = Array.prototype.slice.call(arguments, 2), f = false, g = a.constructor; g; g = g.superClass_ && g.superClass_.constructor) | |
if (g.prototype[b] === d) f = true; | |
else if (f) return g.prototype[b].apply(a, e); | |
if (a[b] === d) return a.constructor.prototype[b].apply(a, e); | |
throw Error("goog.base called from a method of one name to a method of a different name"); | |
}; | |
goog.scope = function (a) { | |
a.call(goog.global) | |
}; | |
var fb = { | |
util: {} | |
}; | |
fb.util.validation = {}; | |
fb.util.validation.validateArgCount = function (a, b, c, d) { | |
var e; | |
d < b ? e = "at least " + b : d > c && (e = 0 === c ? "none" : "no more than " + c); | |
if (e) throw Error(a + " failed: Was called with " + d + (1 === d ? " argument." : " arguments.") + " Expects " + e + "."); | |
}; | |
fb.util.validation.errorPrefix_ = function (a, b, c) { | |
var d = ""; | |
switch (b) { | |
case 1: | |
d = c ? "first" : "First"; | |
break; | |
case 2: | |
d = c ? "second" : "Second"; | |
break; | |
case 3: | |
d = c ? "third" : "Third"; | |
break; | |
case 4: | |
d = c ? "fourth" : "Fourth"; | |
break; | |
default: | |
fb.core.util.validation.assert(!1, "errorPrefix_ called with argumentNumber > 4. Need to update it?") | |
} | |
return a + " failed: " + (d + " argument ") | |
}; | |
fb.util.validation.validateNamespace = function (a, b, c, d) { | |
if ((!d || goog.isDef(c)) && !goog.isString(c)) throw Error(fb.util.validation.errorPrefix_(a, b, d) + "must be a valid firebase namespace."); | |
}; | |
fb.util.validation.validateCallback = function (a, b, c, d) { | |
if ((!d || goog.isDef(c)) && !goog.isFunction(c)) throw Error(fb.util.validation.errorPrefix_(a, b, d) + "must be a valid function."); | |
}; | |
fb.util.validation.validateString = function (a, b, c, d) { | |
if ((!d || goog.isDef(c)) && !goog.isString(c)) throw Error(fb.util.validation.errorPrefix_(a, b, d) + "must be a valid string."); | |
}; | |
fb.util.validation.validateContextObject = function (a, b, c, d) { | |
if (!d || goog.isDef(c)) | |
if (!goog.isObject(c) || null === c) throw Error(fb.util.validation.errorPrefix_(a, b, d) + "must be a valid context object."); | |
}; | |
fb.simplelogin = {}; | |
fb.simplelogin.persona = {}; | |
fb.simplelogin.persona.login = function (a) { | |
navigator.id.watch({ | |
onlogin: function (b) { | |
a(b) | |
}, | |
onlogout: function () {} | |
}); | |
navigator.id.request({ | |
oncancel: function () { | |
a(null) | |
} | |
}) | |
}; | |
fb.constants = {}; | |
var NODE_CLIENT = !1; | |
goog.json = {}; | |
goog.json.isValid_ = function (a) { | |
return /^\s*$/.test(a) ? !1 : /^[\],:{}\s\u2028\u2029]*$/.test(a.replace(/\\["\\\/bfnrtu]/g, "@").replace(/"[^"\\\n\r\u2028\u2029\x00-\x08\x10-\x1f\x80-\x9f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g, "")) | |
}; | |
goog.json.parse = function (a) { | |
a = String(a); | |
if (goog.json.isValid_(a)) try { | |
return eval("(" + a + ")") | |
} catch (b) {} | |
throw Error("Invalid JSON string: " + a); | |
}; | |
goog.json.unsafeParse = function (a) { | |
return eval("(" + a + ")") | |
}; | |
goog.json.serialize = function (a, b) { | |
return (new goog.json.Serializer(b)).serialize(a) | |
}; | |
goog.json.Serializer = function (a) { | |
this.replacer_ = a | |
}; | |
goog.json.Serializer.prototype.serialize = function (a) { | |
var b = []; | |
this.serialize_(a, b); | |
return b.join("") | |
}; | |
goog.json.Serializer.prototype.serialize_ = function (a, b) { | |
switch (typeof a) { | |
case "string": | |
this.serializeString_(a, b); | |
break; | |
case "number": | |
this.serializeNumber_(a, b); | |
break; | |
case "boolean": | |
b.push(a); | |
break; | |
case "undefined": | |
b.push("null"); | |
break; | |
case "object": | |
if (null == a) { | |
b.push("null"); | |
break | |
} | |
if (goog.isArray(a)) { | |
this.serializeArray(a, b); | |
break | |
} | |
this.serializeObject_(a, b); | |
break; | |
case "function": | |
break; | |
default: | |
throw Error("Unknown type: " + typeof a); | |
} | |
}; | |
goog.json.Serializer.charToJsonCharCache_ = { | |
'"': '\\"', | |
"\\": "\\\\", | |
"/": "\\/", | |
"\b": "\\b", | |
"\f": "\\f", | |
"\n": "\\n", | |
"\r": "\\r", | |
"\t": "\\t", | |
"\x0B": "\\u000b" | |
}; | |
goog.json.Serializer.charsToReplace_ = /\uffff/.test("\uffff") ? /[\\\"\x00-\x1f\x7f-\uffff]/g : /[\\\"\x00-\x1f\x7f-\xff]/g; | |
goog.json.Serializer.prototype.serializeString_ = function (a, b) { | |
b.push('"', a.replace(goog.json.Serializer.charsToReplace_, function (a) { | |
if (a in goog.json.Serializer.charToJsonCharCache_) return goog.json.Serializer.charToJsonCharCache_[a]; | |
var b = a.charCodeAt(0), | |
e = "\\u"; | |
16 > b ? e += "000" : 256 > b ? e += "00" : 4096 > b && (e += "0"); | |
return goog.json.Serializer.charToJsonCharCache_[a] = e + b.toString(16) | |
}), '"') | |
}; | |
goog.json.Serializer.prototype.serializeNumber_ = function (a, b) { | |
b.push(isFinite(a) && !isNaN(a) ? a : "null") | |
}; | |
goog.json.Serializer.prototype.serializeArray = function (a, b) { | |
var c = a.length; | |
b.push("["); | |
for (var d = "", e = 0; e < c; e++) b.push(d), d = a[e], this.serialize_(this.replacer_ ? this.replacer_.call(a, String(e), d) : d, b), d = ","; | |
b.push("]") | |
}; | |
goog.json.Serializer.prototype.serializeObject_ = function (a, b) { | |
b.push("{"); | |
var c = "", | |
d; | |
for (d in a) | |
if (Object.prototype.hasOwnProperty.call(a, d)) { | |
var e = a[d]; | |
"function" != typeof e && (b.push(c), this.serializeString_(d, b), b.push(":"), this.serialize_(this.replacer_ ? this.replacer_.call(a, d, e) : e, b), c = ",") | |
} | |
b.push("}") | |
}; | |
fb.util.json = {}; | |
fb.util.json.eval = function (a) { | |
return "undefined" !== typeof JSON && goog.isDef(JSON.parse) ? JSON.parse(a) : goog.json.parse(a) | |
}; | |
fb.util.json.stringify = function (a) { | |
return "undefined" !== typeof JSON && goog.isDef(JSON.stringify) ? JSON.stringify(a) : goog.json.serialize(a) | |
}; | |
fb.simplelogin.validation = {}; | |
var VALID_EMAIL_REGEX_ = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; | |
fb.simplelogin.validation.isValidEmail = function (a) { | |
return goog.isString(a) && VALID_EMAIL_REGEX_.test(a) | |
}; | |
fb.simplelogin.validation.isValidPassword = function (a) { | |
return goog.isString(a) | |
}; | |
fb.simplelogin.validation.validateUser = function (a, b, c, d) { | |
if ((!d || goog.isDef(c)) && !fb.simplelogin.validation.isValidEmail(c)) throw Error(fb.util.validation.errorPrefix_(a, b, d) + "must be a valid email address."); | |
}; | |
fb.simplelogin.validation.validatePassword = function (a, b, c, d) { | |
if ((!d || goog.isDef(c)) && !fb.simplelogin.validation.isValidPassword(c)) throw Error(fb.util.validation.errorPrefix_(a, b, d) + "must be a valid password."); | |
}; | |
fb.simplelogin.winchan = function () { | |
function a(a, b, c) { | |
a.attachEvent ? a.attachEvent("on" + b, c) : a.addEventListener && a.addEventListener(b, c, !1) | |
} | |
function b(a, b, c) { | |
a.detachEvent ? a.detachEvent("on" + b, c) : a.removeEventListener && a.removeEventListener(b, c, !1) | |
} | |
function c(a) { | |
/^https?:\/\//.test(a) || (a = window.location.href); | |
var b = /^(https?:\/\/[\-_a-zA-Z\.0-9:]+)/.exec(a); | |
return b ? b[1] : a | |
} | |
var d = "die", | |
e, f = -1, | |
g = navigator.userAgent; | |
if ("Microsoft Internet Explorer" === navigator.appName) { | |
var h = /MSIE ([0-9]{1,}[\.0-9]{0,})/; | |
(g = g.match(h)) && 1 < g.length && (f = parseFloat(g[1])) | |
} else -1 < g.indexOf("Trident") && (h = /rv:([0-9]{2,2}[\.0-9]{0,})/, (g = g.match(h)) && 1 < g.length && (f = parseFloat(g[1]))); | |
e = 8 <= f; | |
return fb.util.json && fb.util.json.eval && fb.util.json.stringify && window.postMessage ? { | |
open: function (f, g) { | |
function h() { | |
n && document.body.removeChild(n); | |
n = void 0; | |
w && (w = clearInterval(w)); | |
b(window, "message", l); | |
b(window, "unload", h); | |
if (v) try { | |
v.close() | |
} catch (a) { | |
p.postMessage(d, r) | |
} | |
v = p = void 0 | |
} | |
function l(a) { | |
if (a.origin === r) try { | |
var b = fb.util.json.eval(a.data); | |
"ready" === b.a ? p.postMessage(x, r) : "error" === b.a ? (h(), g && (g(b.d), g = null)) : "response" === b.a && (h(), g && (g(null, b.d), g = null)) | |
} catch (c) {} | |
} | |
if (!g) throw "missing required callback argument"; | |
var m; | |
f.url || (m = "missing required 'url' parameter"); | |
f.relay_url || (m = "missing required 'relay_url' parameter"); | |
m && setTimeout(function () { | |
g(m) | |
}, 0); | |
f.window_name || (f.window_name = null); | |
var o; | |
if (!(o = !f.window_features)) a: { | |
try { | |
var q = navigator.userAgent; | |
o = -1 != q.indexOf("Fennec/") || -1 != q.indexOf("Firefox/") && -1 != q.indexOf("Android"); | |
break a | |
} catch (u) {} | |
o = !1 | |
} | |
o && (f.window_features = void 0); | |
var n, r = c(f.url); | |
if (r !== c(f.relay_url)) return setTimeout(function () { | |
g("invalid arguments: origin of url and relay_url must match") | |
}, 0); | |
var p; | |
e && (n = document.createElement("iframe"), n.setAttribute("src", f.relay_url), n.style.display = "none", n.setAttribute("name", "__winchan_relay_frame"), document.body.appendChild(n), p = n.contentWindow); | |
var v = window.open(f.url, f.window_name, f.window_features); | |
p || (p = v); | |
var w = setInterval(function () { | |
if (v && v.closed) { | |
h(); | |
if (g) { | |
g("unknown closed window"); | |
g = null | |
} | |
} | |
}, 500), | |
x = fb.util.json.stringify({ | |
a: "request", | |
d: f.params | |
}); | |
a(window, "unload", h); | |
a(window, "message", l); | |
return { | |
close: h, | |
focus: function () { | |
if (v) try { | |
v.focus() | |
} catch (a) {} | |
} | |
} | |
}, | |
onOpen: function (c) { | |
function f(a) { | |
a = fb.util.json.stringify(a); | |
e ? p.doPost(a, m) : p.postMessage(a, m) | |
} | |
function g(a) { | |
var d; | |
try { | |
d = fb.util.json.eval(a.data) | |
} catch (e) {} | |
d && "request" === d.a && (b(window, "message", g), m = a.origin, c && setTimeout(function () { | |
c(m, d.d, function (a) { | |
c = void 0; | |
f({ | |
a: "response", | |
d: a | |
}) | |
}) | |
}, 0)) | |
} | |
function h(a) { | |
if (a.data === d) try { | |
window.close() | |
} catch (b) {} | |
} | |
var m = "*", | |
o; | |
if (e) a: { | |
for (var q = window.location, u = window.opener.frames, q = q.protocol + "//" + q.host, n = u.length - 1; 0 <= n; n--) try { | |
if (0 === u[n].location.href.indexOf(q) && "__winchan_relay_frame" === u[n].name) { | |
o = u[n]; | |
break a | |
} | |
} catch (r) {} | |
o = void 0 | |
} else o = window.opener; | |
var p = o; | |
if (!p) throw "can't find relay frame"; | |
a(e ? p : window, "message", g); | |
a(e ? p : window, "message", h); | |
try { | |
f({ | |
a: "ready" | |
}) | |
} catch (v) { | |
a(p, "load", function () { | |
f({ | |
a: "ready" | |
}) | |
}) | |
} | |
var w = function () { | |
try { | |
b(e ? p : window, "message", h) | |
} catch (a) {} | |
c && f({ | |
a: "error", | |
d: "client closed window" | |
}); | |
c = void 0; | |
try { | |
window.close() | |
} catch (d) {} | |
}; | |
a(window, "unload", w); | |
return { | |
detach: function () { | |
b(window, "unload", w) | |
} | |
} | |
} | |
} : { | |
open: function (a, b, c, d) { | |
setTimeout(function () { | |
d("unsupported browser") | |
}, 0) | |
}, | |
onOpen: function (a) { | |
setTimeout(function () { | |
a("unsupported browser") | |
}, 0) | |
} | |
} | |
}(); | |
fb.util.sjcl = {}; | |
var sjcl = { | |
cipher: {}, | |
hash: {}, | |
keyexchange: {}, | |
mode: {}, | |
misc: {}, | |
codec: {}, | |
exception: { | |
corrupt: function (a) { | |
this.toString = function () { | |
return "CORRUPT: " + this.message | |
}; | |
this.message = a | |
}, | |
invalid: function (a) { | |
this.toString = function () { | |
return "INVALID: " + this.message | |
}; | |
this.message = a | |
}, | |
bug: function (a) { | |
this.toString = function () { | |
return "BUG: " + this.message | |
}; | |
this.message = a | |
}, | |
notReady: function (a) { | |
this.toString = function () { | |
return "NOT READY: " + this.message | |
}; | |
this.message = a | |
} | |
} | |
}; | |
"undefined" != typeof module && module.exports && (module.exports = sjcl); | |
sjcl.cipher.aes = function (a) { | |
this.h[0][0][0] || this.w(); | |
var b, c, d, e, f = this.h[0][4], | |
g = this.h[1]; | |
b = a.length; | |
var h = 1; | |
if (b !== 4 && b !== 6 && b !== 8) throw new sjcl.exception.invalid("invalid aes key size"); | |
this.a = [d = a.slice(0), e = []]; | |
for (a = b; a < 4 * b + 28; a++) { | |
c = d[a - 1]; | |
if (a % b === 0 || b === 8 && a % b === 4) { | |
c = f[c >>> 24] << 24 ^ f[c >> 16 & 255] << 16 ^ f[c >> 8 & 255] << 8 ^ f[c & 255]; | |
if (a % b === 0) { | |
c = c << 8 ^ c >>> 24 ^ h << 24; | |
h = h << 1 ^ (h >> 7) * 283 | |
} | |
} | |
d[a] = d[a - b] ^ c | |
} | |
for (b = 0; a; b++, a--) { | |
c = d[b & 3 ? a : a - 4]; | |
e[b] = a <= 4 || b < 4 ? c : g[0][f[c >>> 24]] ^ g[1][f[c >> 16 & 255]] ^ g[2][f[c >> 8 & 255]] ^ | |
g[3][f[c & 255]] | |
} | |
}; | |
sjcl.cipher.aes.prototype = { | |
encrypt: function (a) { | |
return this.G(a, 0) | |
}, | |
decrypt: function (a) { | |
return this.G(a, 1) | |
}, | |
h: [ | |
[ | |
[], | |
[], | |
[], | |
[], | |
[] | |
], | |
[ | |
[], | |
[], | |
[], | |
[], | |
[] | |
] | |
], | |
w: function () { | |
var a = this.h[0], | |
b = this.h[1], | |
c = a[4], | |
d = b[4], | |
e, f, g, h = [], | |
i = [], | |
k, j, l, m; | |
for (e = 0; e < 256; e++) i[(h[e] = e << 1 ^ (e >> 7) * 283) ^ e] = e; | |
for (f = g = 0; !c[f]; f = f ^ (k || 1), g = i[g] || 1) { | |
l = g ^ g << 1 ^ g << 2 ^ g << 3 ^ g << 4; | |
l = l >> 8 ^ l & 255 ^ 99; | |
c[f] = l; | |
d[l] = f; | |
j = h[e = h[k = h[f]]]; | |
m = j * 16843009 ^ e * 65537 ^ k * 257 ^ f * 16843008; | |
j = h[l] * 257 ^ l * 16843008; | |
for (e = 0; e < 4; e++) { | |
a[e][f] = j = j << 24 ^ j >>> 8; | |
b[e][l] = m = m << 24 ^ m >>> 8 | |
} | |
} | |
for (e = | |
0; e < 5; e++) { | |
a[e] = a[e].slice(0); | |
b[e] = b[e].slice(0) | |
} | |
}, | |
G: function (a, b) { | |
if (a.length !== 4) throw new sjcl.exception.invalid("invalid aes block size"); | |
var c = this.a[b], | |
d = a[0] ^ c[0], | |
e = a[b ? 3 : 1] ^ c[1], | |
f = a[2] ^ c[2], | |
a = a[b ? 1 : 3] ^ c[3], | |
g, h, i, k = c.length / 4 - 2, | |
j, l = 4, | |
m = [0, 0, 0, 0]; | |
g = this.h[b]; | |
var o = g[0], | |
q = g[1], | |
u = g[2], | |
n = g[3], | |
r = g[4]; | |
for (j = 0; j < k; j++) { | |
g = o[d >>> 24] ^ q[e >> 16 & 255] ^ u[f >> 8 & 255] ^ n[a & 255] ^ c[l]; | |
h = o[e >>> 24] ^ q[f >> 16 & 255] ^ u[a >> 8 & 255] ^ n[d & 255] ^ c[l + 1]; | |
i = o[f >>> 24] ^ q[a >> 16 & 255] ^ u[d >> 8 & 255] ^ n[e & 255] ^ c[l + 2]; | |
a = o[a >>> 24] ^ q[d >> 16 & 255] ^ | |
u[e >> 8 & 255] ^ n[f & 255] ^ c[l + 3]; | |
l = l + 4; | |
d = g; | |
e = h; | |
f = i | |
} | |
for (j = 0; j < 4; j++) { | |
m[b ? 3 & -j : j] = r[d >>> 24] << 24 ^ r[e >> 16 & 255] << 16 ^ r[f >> 8 & 255] << 8 ^ r[a & 255] ^ c[l++]; | |
g = d; | |
d = e; | |
e = f; | |
f = a; | |
a = g | |
} | |
return m | |
} | |
}; | |
sjcl.bitArray = { | |
bitSlice: function (a, b, c) { | |
a = sjcl.bitArray.N(a.slice(b / 32), 32 - (b & 31)).slice(1); | |
return c === void 0 ? a : sjcl.bitArray.clamp(a, c - b) | |
}, | |
extract: function (a, b, c) { | |
var d = Math.floor(-b - c & 31); | |
return ((b + c - 1 ^ b) & -32 ? a[b / 32 | 0] << 32 - d ^ a[b / 32 + 1 | 0] >>> d : a[b / 32 | 0] >>> d) & (1 << c) - 1 | |
}, | |
concat: function (a, b) { | |
if (a.length === 0 || b.length === 0) return a.concat(b); | |
var c = a[a.length - 1], | |
d = sjcl.bitArray.getPartial(c); | |
return d === 32 ? a.concat(b) : sjcl.bitArray.N(b, d, c | 0, a.slice(0, a.length - 1)) | |
}, | |
bitLength: function (a) { | |
var b = a.length; | |
return b === | |
0 ? 0 : (b - 1) * 32 + sjcl.bitArray.getPartial(a[b - 1]) | |
}, | |
clamp: function (a, b) { | |
if (a.length * 32 < b) return a; | |
var a = a.slice(0, Math.ceil(b / 32)), | |
c = a.length, | |
b = b & 31; | |
c > 0 && b && (a[c - 1] = sjcl.bitArray.partial(b, a[c - 1] & 2147483648 >> b - 1, 1)); | |
return a | |
}, | |
partial: function (a, b, c) { | |
return a === 32 ? b : (c ? b | 0 : b << 32 - a) + a * 1099511627776 | |
}, | |
getPartial: function (a) { | |
return Math.round(a / 1099511627776) || 32 | |
}, | |
equal: function (a, b) { | |
if (sjcl.bitArray.bitLength(a) !== sjcl.bitArray.bitLength(b)) return false; | |
var c = 0, | |
d; | |
for (d = 0; d < a.length; d++) c = c | a[d] ^ b[d]; | |
return c === | |
0 | |
}, | |
N: function (a, b, c, d) { | |
var e; | |
for (d === void 0 && (d = []); b >= 32; b = b - 32) { | |
d.push(c); | |
c = 0 | |
} | |
if (b === 0) return d.concat(a); | |
for (e = 0; e < a.length; e++) { | |
d.push(c | a[e] >>> b); | |
c = a[e] << 32 - b | |
} | |
e = a.length ? a[a.length - 1] : 0; | |
a = sjcl.bitArray.getPartial(e); | |
d.push(sjcl.bitArray.partial(b + a & 31, b + a > 32 ? c : d.pop(), 1)); | |
return d | |
}, | |
O: function (a, b) { | |
return [a[0] ^ b[0], a[1] ^ b[1], a[2] ^ b[2], a[3] ^ b[3]] | |
} | |
}; | |
sjcl.codec.utf8String = { | |
fromBits: function (a) { | |
var b = "", | |
c = sjcl.bitArray.bitLength(a), | |
d, e; | |
for (d = 0; d < c / 8; d++) { | |
(d & 3) === 0 && (e = a[d / 4]); | |
b = b + String.fromCharCode(e >>> 24); | |
e = e << 8 | |
} | |
return decodeURIComponent(escape(b)) | |
}, | |
toBits: function (a) { | |
var a = unescape(encodeURIComponent(a)), | |
b = [], | |
c, d = 0; | |
for (c = 0; c < a.length; c++) { | |
d = d << 8 | a.charCodeAt(c); | |
if ((c & 3) === 3) { | |
b.push(d); | |
d = 0 | |
} | |
} | |
c & 3 && b.push(sjcl.bitArray.partial(8 * (c & 3), d)); | |
return b | |
} | |
}; | |
sjcl.codec.base64 = { | |
C: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", | |
fromBits: function (a, b, c) { | |
var d = "", | |
e = 0, | |
f = sjcl.codec.base64.C, | |
g = 0, | |
h = sjcl.bitArray.bitLength(a); | |
c && (f = f.substr(0, 62) + "-_"); | |
for (c = 0; d.length * 6 < h;) { | |
d = d + f.charAt((g ^ a[c] >>> e) >>> 26); | |
if (e < 6) { | |
g = a[c] << 6 - e; | |
e = e + 26; | |
c++ | |
} else { | |
g = g << 6; | |
e = e - 6 | |
} | |
} | |
for (; d.length & 3 && !b;) d = d + "="; | |
return d | |
}, | |
toBits: function (a, b) { | |
var a = a.replace(/\s|=/g, ""), | |
c = [], | |
d = 0, | |
e = sjcl.codec.base64.C, | |
f = 0, | |
g; | |
b && (e = e.substr(0, 62) + "-_"); | |
for (b = 0; b < a.length; b++) { | |
g = e.indexOf(a.charAt(b)); | |
if (g < 0) throw new sjcl.exception.invalid("this isn't base64!"); | |
if (d > 26) { | |
d = d - 26; | |
c.push(f ^ g >>> d); | |
f = g << 32 - d | |
} else { | |
d = d + 6; | |
f = f ^ g << 32 - d | |
} | |
} | |
d & 56 && c.push(sjcl.bitArray.partial(d & 56, f, 1)); | |
return c | |
} | |
}; | |
sjcl.codec.base64url = { | |
fromBits: function (a) { | |
return sjcl.codec.base64.fromBits(a, 1, 1) | |
}, | |
toBits: function (a) { | |
return sjcl.codec.base64.toBits(a, 1) | |
} | |
}; | |
sjcl.hash.sha256 = function (a) { | |
this.a[0] || this.w(); | |
if (a) { | |
this.m = a.m.slice(0); | |
this.i = a.i.slice(0); | |
this.e = a.e | |
} else this.reset() | |
}; | |
sjcl.hash.sha256.hash = function (a) { | |
return (new sjcl.hash.sha256).update(a).finalize() | |
}; | |
sjcl.hash.sha256.prototype = { | |
blockSize: 512, | |
reset: function () { | |
this.m = this.L.slice(0); | |
this.i = []; | |
this.e = 0; | |
return this | |
}, | |
update: function (a) { | |
typeof a === "string" && (a = sjcl.codec.utf8String.toBits(a)); | |
var b, c = this.i = sjcl.bitArray.concat(this.i, a); | |
b = this.e; | |
a = this.e = b + sjcl.bitArray.bitLength(a); | |
for (b = 512 + b & -512; b <= a; b = b + 512) this.B(c.splice(0, 16)); | |
return this | |
}, | |
finalize: function () { | |
var a, b = this.i, | |
c = this.m, | |
b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1, 1)]); | |
for (a = b.length + 2; a & 15; a++) b.push(0); | |
b.push(Math.floor(this.e / | |
4294967296)); | |
for (b.push(this.e | 0); b.length;) this.B(b.splice(0, 16)); | |
this.reset(); | |
return c | |
}, | |
L: [], | |
a: [], | |
w: function () { | |
function a(a) { | |
return (a - Math.floor(a)) * 4294967296 | 0 | |
} | |
var b = 0, | |
c = 2, | |
d; | |
a: for (; b < 64; c++) { | |
for (d = 2; d * d <= c; d++) | |
if (c % d === 0) continue a; | |
b < 8 && (this.L[b] = a(Math.pow(c, 0.5))); | |
this.a[b] = a(Math.pow(c, 1 / 3)); | |
b++ | |
} | |
}, | |
B: function (a) { | |
for (var b, c, d = a.slice(0), e = this.m, f = this.a, g = e[0], h = e[1], i = e[2], k = e[3], j = e[4], l = e[5], m = e[6], o = e[7], a = 0; a < 64; a++) { | |
if (a < 16) b = d[a]; | |
else { | |
b = d[a + 1 & 15]; | |
c = d[a + 14 & 15]; | |
b = d[a & 15] = (b >>> 7 ^ b >>> 18 ^ | |
b >>> 3 ^ b << 25 ^ b << 14) + (c >>> 17 ^ c >>> 19 ^ c >>> 10 ^ c << 15 ^ c << 13) + d[a & 15] + d[a + 9 & 15] | 0 | |
} | |
b = b + o + (j >>> 6 ^ j >>> 11 ^ j >>> 25 ^ j << 26 ^ j << 21 ^ j << 7) + (m ^ j & (l ^ m)) + f[a]; | |
o = m; | |
m = l; | |
l = j; | |
j = k + b | 0; | |
k = i; | |
i = h; | |
h = g; | |
g = b + (h & i ^ k & (h ^ i)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0 | |
} | |
e[0] = e[0] + g | 0; | |
e[1] = e[1] + h | 0; | |
e[2] = e[2] + i | 0; | |
e[3] = e[3] + k | 0; | |
e[4] = e[4] + j | 0; | |
e[5] = e[5] + l | 0; | |
e[6] = e[6] + m | 0; | |
e[7] = e[7] + o | 0 | |
} | |
}; | |
sjcl.mode.ccm = { | |
name: "ccm", | |
encrypt: function (a, b, c, d, e) { | |
var f, g = b.slice(0), | |
h = sjcl.bitArray, | |
i = h.bitLength(c) / 8, | |
k = h.bitLength(g) / 8, | |
e = e || 64, | |
d = d || []; | |
if (i < 7) throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"); | |
for (f = 2; f < 4 && k >>> 8 * f; f++); | |
f < 15 - i && (f = 15 - i); | |
c = h.clamp(c, 8 * (15 - f)); | |
b = sjcl.mode.ccm.F(a, b, c, d, e, f); | |
g = sjcl.mode.ccm.H(a, g, c, b, e, f); | |
return h.concat(g.data, g.tag) | |
}, | |
decrypt: function (a, b, c, d, e) { | |
var e = e || 64, | |
d = d || [], | |
f = sjcl.bitArray, | |
g = f.bitLength(c) / 8, | |
h = f.bitLength(b), | |
i = f.clamp(b, h - e), | |
k = f.bitSlice(b, | |
h - e), | |
h = (h - e) / 8; | |
if (g < 7) throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"); | |
for (b = 2; b < 4 && h >>> 8 * b; b++); | |
b < 15 - g && (b = 15 - g); | |
c = f.clamp(c, 8 * (15 - b)); | |
i = sjcl.mode.ccm.H(a, i, c, k, e, b); | |
a = sjcl.mode.ccm.F(a, i.data, c, d, e, b); | |
if (!f.equal(i.tag, a)) throw new sjcl.exception.corrupt("ccm: tag doesn't match"); | |
return i.data | |
}, | |
F: function (a, b, c, d, e, f) { | |
var g = [], | |
h = sjcl.bitArray, | |
i = h.O, | |
e = e / 8; | |
if (e % 2 || e < 4 || e > 16) throw new sjcl.exception.invalid("ccm: invalid tag length"); | |
if (d.length > 4294967295 || b.length > 4294967295) throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data"); | |
f = [h.partial(8, (d.length ? 64 : 0) | e - 2 << 2 | f - 1)]; | |
f = h.concat(f, c); | |
f[3] = f[3] | h.bitLength(b) / 8; | |
f = a.encrypt(f); | |
if (d.length) { | |
c = h.bitLength(d) / 8; | |
c <= 65279 ? g = [h.partial(16, c)] : c <= 4294967295 && (g = h.concat([h.partial(16, 65534)], [c])); | |
g = h.concat(g, d); | |
for (d = 0; d < g.length; d = d + 4) f = a.encrypt(i(f, g.slice(d, d + 4).concat([0, 0, 0]))) | |
} | |
for (d = 0; d < b.length; d = d + 4) f = a.encrypt(i(f, b.slice(d, d + 4).concat([0, 0, 0]))); | |
return h.clamp(f, e * 8) | |
}, | |
H: function (a, b, c, d, e, f) { | |
var g, h = sjcl.bitArray; | |
g = h.O; | |
var i = b.length, | |
k = h.bitLength(b), | |
c = h.concat([h.partial(8, | |
f - 1)], c).concat([0, 0, 0]).slice(0, 4), | |
d = h.bitSlice(g(d, a.encrypt(c)), 0, e); | |
if (!i) return { | |
tag: d, | |
data: [] | |
}; | |
for (g = 0; g < i; g = g + 4) { | |
c[3]++; | |
e = a.encrypt(c); | |
b[g] = b[g] ^ e[0]; | |
b[g + 1] = b[g + 1] ^ e[1]; | |
b[g + 2] = b[g + 2] ^ e[2]; | |
b[g + 3] = b[g + 3] ^ e[3] | |
} | |
return { | |
tag: d, | |
data: h.clamp(b, k) | |
} | |
} | |
}; | |
sjcl.misc.hmac = function (a, b) { | |
this.K = b = b || sjcl.hash.sha256; | |
var c = [ | |
[], | |
[] | |
], | |
d = b.prototype.blockSize / 32; | |
this.k = [new b, new b]; | |
a.length > d && (a = b.hash(a)); | |
for (b = 0; b < d; b++) { | |
c[0][b] = a[b] ^ 909522486; | |
c[1][b] = a[b] ^ 1549556828 | |
} | |
this.k[0].update(c[0]); | |
this.k[1].update(c[1]) | |
}; | |
sjcl.misc.hmac.prototype.encrypt = sjcl.misc.hmac.prototype.mac = function (a) { | |
a = (new this.K(this.k[0])).update(a).finalize(); | |
return (new this.K(this.k[1])).update(a).finalize() | |
}; | |
sjcl.misc.pbkdf2 = function (a, b, c, d, e) { | |
c = c || 1E3; | |
if (d < 0 || c < 0) throw sjcl.exception.invalid("invalid params to pbkdf2"); | |
typeof a === "string" && (a = sjcl.codec.utf8String.toBits(a)); | |
var e = e || sjcl.misc.hmac, | |
a = new e(a), | |
f, g, h, i, k = [], | |
j = sjcl.bitArray; | |
for (i = 1; 32 * k.length < (d || 1); i++) { | |
e = f = a.encrypt(j.concat(b, [i])); | |
for (g = 1; g < c; g++) { | |
f = a.encrypt(f); | |
for (h = 0; h < f.length; h++) e[h] = e[h] ^ f[h] | |
} | |
k = k.concat(e) | |
} | |
d && (k = j.clamp(k, d)); | |
return k | |
}; | |
sjcl.random = { | |
randomWords: function (a, b) { | |
var c = [], | |
b = this.isReady(b), | |
d; | |
if (b === 0) throw new sjcl.exception.notReady("generator isn't seeded"); | |
b & 2 && this.T(!(b & 1)); | |
for (b = 0; b < a; b = b + 4) { | |
(b + 1) % 65536 === 0 && this.J(); | |
d = this.u(); | |
c.push(d[0], d[1], d[2], d[3]) | |
} | |
this.J(); | |
return c.slice(0, a) | |
}, | |
setDefaultParanoia: function (a) { | |
this.s = a | |
}, | |
addEntropy: function (a, b, c) { | |
var c = c || "user", | |
d, e, f = (new Date).valueOf(), | |
g = this.p[c], | |
h = this.isReady(), | |
i = 0; | |
d = this.D[c]; | |
d === void 0 && (d = this.D[c] = this.Q++); | |
g === void 0 && (g = this.p[c] = 0); | |
this.p[c] = (this.p[c] + | |
1) % this.b.length; | |
switch (typeof a) { | |
case "number": | |
b === void 0 && (b = 1); | |
this.b[g].update([d, this.t++, 1, b, f, 1, a | 0]); | |
break; | |
case "object": | |
c = Object.prototype.toString.call(a); | |
if (c === "[object Uint32Array]") { | |
e = []; | |
for (c = 0; c < a.length; c++) e.push(a[c]); | |
a = e | |
} else { | |
c !== "[object Array]" && (i = 1); | |
for (c = 0; c < a.length && !i; c++) typeof a[c] != "number" && (i = 1) | |
} if (!i) { | |
if (b === void 0) | |
for (c = b = 0; c < a.length; c++) | |
for (e = a[c]; e > 0;) { | |
b++; | |
e = e >>> 1 | |
} | |
this.b[g].update([d, this.t++, 2, b, f, a.length].concat(a)) | |
} | |
break; | |
case "string": | |
if (b === void 0) b = a.length; | |
this.b[g].update([d, this.t++, 3, b, f, a.length]); | |
this.b[g].update(a); | |
break; | |
default: | |
i = 1 | |
} | |
if (i) throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string"); | |
this.j[g] = this.j[g] + b; | |
this.f = this.f + b; | |
if (h === 0) { | |
this.isReady() !== 0 && this.I("seeded", Math.max(this.g, this.f)); | |
this.I("progress", this.getProgress()) | |
} | |
}, | |
isReady: function (a) { | |
a = this.A[a !== void 0 ? a : this.s]; | |
return this.g && this.g >= a ? this.j[0] > 80 && (new Date).valueOf() > this.M ? 3 : 1 : this.f >= a ? 2 : 0 | |
}, | |
getProgress: function (a) { | |
a = this.A[a ? | |
a : this.s]; | |
return this.g >= a ? 1 : this.f > a ? 1 : this.f / a | |
}, | |
startCollectors: function () { | |
if (!this.l) { | |
if (window.addEventListener) { | |
window.addEventListener("load", this.n, false); | |
window.addEventListener("mousemove", this.o, false) | |
} else if (document.attachEvent) { | |
document.attachEvent("onload", this.n); | |
document.attachEvent("onmousemove", this.o) | |
} else throw new sjcl.exception.bug("can't attach event"); | |
this.l = true | |
} | |
}, | |
stopCollectors: function () { | |
if (this.l) { | |
if (window.removeEventListener) { | |
window.removeEventListener("load", this.n, | |
false); | |
window.removeEventListener("mousemove", this.o, false) | |
} else if (window.detachEvent) { | |
window.detachEvent("onload", this.n); | |
window.detachEvent("onmousemove", this.o) | |
} | |
this.l = false | |
} | |
}, | |
addEventListener: function (a, b) { | |
this.q[a][this.P++] = b | |
}, | |
removeEventListener: function (a, b) { | |
var c, a = this.q[a], | |
d = []; | |
for (c in a) a.hasOwnProperty(c) && a[c] === b && d.push(c); | |
for (b = 0; b < d.length; b++) { | |
c = d[b]; | |
delete a[c] | |
} | |
}, | |
b: [new sjcl.hash.sha256], | |
j: [0], | |
z: 0, | |
p: {}, | |
t: 0, | |
D: {}, | |
Q: 0, | |
g: 0, | |
f: 0, | |
M: 0, | |
a: [0, 0, 0, 0, 0, 0, 0, 0], | |
d: [0, 0, 0, 0], | |
r: void 0, | |
s: 6, | |
l: !1, | |
q: { | |
progress: {}, | |
seeded: {} | |
}, | |
P: 0, | |
A: [0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024], | |
u: function () { | |
for (var a = 0; a < 4; a++) { | |
this.d[a] = this.d[a] + 1 | 0; | |
if (this.d[a]) break | |
} | |
return this.r.encrypt(this.d) | |
}, | |
J: function () { | |
this.a = this.u().concat(this.u()); | |
this.r = new sjcl.cipher.aes(this.a) | |
}, | |
S: function (a) { | |
this.a = sjcl.hash.sha256.hash(this.a.concat(a)); | |
this.r = new sjcl.cipher.aes(this.a); | |
for (a = 0; a < 4; a++) { | |
this.d[a] = this.d[a] + 1 | 0; | |
if (this.d[a]) break | |
} | |
}, | |
T: function (a) { | |
var b = [], | |
c = 0, | |
d; | |
this.M = b[0] = (new Date).valueOf() + 3E4; | |
for (d = 0; d < 16; d++) b.push(Math.random() * | |
4294967296 | 0); | |
for (d = 0; d < this.b.length; d++) { | |
b = b.concat(this.b[d].finalize()); | |
c = c + this.j[d]; | |
this.j[d] = 0; | |
if (!a && this.z & 1 << d) break | |
} | |
if (this.z >= 1 << this.b.length) { | |
this.b.push(new sjcl.hash.sha256); | |
this.j.push(0) | |
} | |
this.f = this.f - c; | |
if (c > this.g) this.g = c; | |
this.z++; | |
this.S(b) | |
}, | |
o: function (a) { | |
sjcl.random.addEntropy([a.x || a.clientX || a.offsetX || 0, a.y || a.clientY || a.offsetY || 0], 2, "mouse") | |
}, | |
n: function () { | |
sjcl.random.addEntropy((new Date).valueOf(), 2, "loadtime") | |
}, | |
I: function (a, b) { | |
var c, a = sjcl.random.q[a], | |
d = []; | |
for (c in a) a.hasOwnProperty(c) && | |
d.push(a[c]); | |
for (c = 0; c < d.length; c++) d[c](b) | |
} | |
}; | |
try { | |
var s = new Uint32Array(32); | |
crypto.getRandomValues(s); | |
sjcl.random.addEntropy(s, 1024, "crypto['getRandomValues']") | |
} catch (t) {} | |
sjcl.json = { | |
defaults: { | |
v: 1, | |
iter: 1E3, | |
ks: 128, | |
ts: 64, | |
mode: "ccm", | |
adata: "", | |
cipher: "aes" | |
}, | |
encrypt: function (a, b, c, d) { | |
var c = c || {}, d = d || {}, e = sjcl.json, | |
f = e.c({ | |
iv: sjcl.random.randomWords(4, 0) | |
}, e.defaults), | |
g; | |
e.c(f, c); | |
c = f.adata; | |
if (typeof f.salt === "string") f.salt = sjcl.codec.base64.toBits(f.salt); | |
if (typeof f.iv === "string") f.iv = sjcl.codec.base64.toBits(f.iv); | |
if (!sjcl.mode[f.mode] || !sjcl.cipher[f.cipher] || typeof a === "string" && f.iter <= 100 || f.ts !== 64 && f.ts !== 96 && f.ts !== 128 || f.ks !== 128 && f.ks !== 192 && f.ks !== 256 || f.iv.length < | |
2 || f.iv.length > 4) throw new sjcl.exception.invalid("json encrypt: invalid parameters"); | |
if (typeof a === "string") { | |
g = sjcl.misc.cachedPbkdf2(a, f); | |
a = g.key.slice(0, f.ks / 32); | |
f.salt = g.salt | |
} | |
typeof b === "string" && (b = sjcl.codec.utf8String.toBits(b)); | |
typeof c === "string" && (c = sjcl.codec.utf8String.toBits(c)); | |
g = new sjcl.cipher[f.cipher](a); | |
e.c(d, f); | |
d.key = a; | |
f.ct = sjcl.mode[f.mode].encrypt(g, b, f.iv, c, f.ts); | |
return e.encode(f) | |
}, | |
decrypt: function (a, b, c, d) { | |
var c = c || {}, d = d || {}, e = sjcl.json, | |
b = e.c(e.c(e.c({}, e.defaults), e.decode(b)), | |
c, true), | |
f, c = b.adata; | |
if (typeof b.salt === "string") b.salt = sjcl.codec.base64.toBits(b.salt); | |
if (typeof b.iv === "string") b.iv = sjcl.codec.base64.toBits(b.iv); | |
if (!sjcl.mode[b.mode] || !sjcl.cipher[b.cipher] || typeof a === "string" && b.iter <= 100 || b.ts !== 64 && b.ts !== 96 && b.ts !== 128 || b.ks !== 128 && b.ks !== 192 && b.ks !== 256 || !b.iv || b.iv.length < 2 || b.iv.length > 4) throw new sjcl.exception.invalid("json decrypt: invalid parameters"); | |
if (typeof a === "string") { | |
f = sjcl.misc.cachedPbkdf2(a, b); | |
a = f.key.slice(0, b.ks / 32); | |
b.salt = f.salt | |
} | |
typeof c === | |
"string" && (c = sjcl.codec.utf8String.toBits(c)); | |
f = new sjcl.cipher[b.cipher](a); | |
c = sjcl.mode[b.mode].decrypt(f, b.ct, b.iv, c, b.ts); | |
e.c(d, b); | |
d.key = a; | |
return sjcl.codec.utf8String.fromBits(c) | |
}, | |
encode: function (a) { | |
var b, c = "{", | |
d = ""; | |
for (b in a) | |
if (a.hasOwnProperty(b)) { | |
if (!b.match(/^[a-z0-9]+$/i)) throw new sjcl.exception.invalid("json encode: invalid property name"); | |
c = c + (d + '"' + b + '":'); | |
d = ","; | |
switch (typeof a[b]) { | |
case "number": | |
case "boolean": | |
c = c + a[b]; | |
break; | |
case "string": | |
c = c + ('"' + escape(a[b]) + '"'); | |
break; | |
case "object": | |
c = | |
c + ('"' + sjcl.codec.base64.fromBits(a[b], 0) + '"'); | |
break; | |
default: | |
throw new sjcl.exception.bug("json encode: unsupported type"); | |
} | |
} | |
return c + "}" | |
}, | |
decode: function (a) { | |
a = a.replace(/\s/g, ""); | |
if (!a.match(/^\{.*\}$/)) throw new sjcl.exception.invalid("json decode: this isn't json!"); | |
var a = a.replace(/^\{|\}$/g, "").split(/,/), | |
b = {}, c, d; | |
for (c = 0; c < a.length; c++) { | |
if (!(d = a[c].match(/^(?:(["']?)([a-z][a-z0-9]*)\1):(?:(\d+)|"([a-z0-9+\/%*_.@=\-]*)")$/i))) throw new sjcl.exception.invalid("json decode: this isn't json!"); | |
b[d[2]] = d[3] ? parseInt(d[3], 10) : d[2].match(/^(ct|salt|iv)$/) ? sjcl.codec.base64.toBits(d[4]) : unescape(d[4]) | |
} | |
return b | |
}, | |
c: function (a, b, c) { | |
a === void 0 && (a = {}); | |
if (b === void 0) return a; | |
for (var d in b) | |
if (b.hasOwnProperty(d)) { | |
if (c && a[d] !== void 0 && a[d] !== b[d]) throw new sjcl.exception.invalid("required parameter overridden"); | |
a[d] = b[d] | |
} | |
return a | |
}, | |
V: function (a, b) { | |
var c = {}, d; | |
for (d in a) a.hasOwnProperty(d) && a[d] !== b[d] && (c[d] = a[d]); | |
return c | |
}, | |
U: function (a, b) { | |
var c = {}, d; | |
for (d = 0; d < b.length; d++) a[b[d]] !== void 0 && (c[b[d]] = | |
a[b[d]]); | |
return c | |
} | |
}; | |
sjcl.encrypt = sjcl.json.encrypt; | |
sjcl.decrypt = sjcl.json.decrypt; | |
sjcl.misc.R = {}; | |
sjcl.misc.cachedPbkdf2 = function (a, b) { | |
var c = sjcl.misc.R, | |
d, b = b || {}; | |
d = b.iter || 1E3; | |
c = c[a] = c[a] || {}; | |
d = c[d] = c[d] || { | |
firstSalt: b.salt && b.salt.length ? b.salt.slice(0) : sjcl.random.randomWords(2, 0) | |
}; | |
c = b.salt === void 0 ? d.firstSalt : b.salt; | |
d[c] = d[c] || sjcl.misc.pbkdf2(a, c, b.iter); | |
return { | |
key: d[c].slice(0), | |
salt: c.slice(0) | |
} | |
}; | |
var FirebaseSimpleLogin = function (a, b, c) { | |
var d = a.toString(), | |
e = null; | |
fb.util.validation.validateArgCount("new FirebaseSimpleLogin", 1, 3, arguments.length); | |
fb.util.validation.validateCallback("new FirebaseSimpleLogin", 2, b, !1); | |
if ("string" === typeof a) throw Error("new FirebaseSimpleLogin(): Oops, it looks like you passed a string instead of a Firebase reference (i.e. new Firebase(<firebaseURL>))."); | |
if (goog.isString(d)) { | |
var f = d.indexOf("//"); | |
0 <= f && (d = d.substring(f + 2)); | |
f = d.indexOf("."); | |
0 <= f && (e = d.substring(0, | |
f)) | |
} | |
if (!goog.isString(e)) throw Error("new FirebaseSimpleLogin(): First argument must be a valid Firebase reference (i.e. new Firebase(<firebaseURL>))."); | |
"file:" === window.location.protocol && (!this.isMobilePhoneGap() && !this.isMobileTriggerIo() && console && console.log) && console.log("FirebaseSimpleLogin(): Due to browser security restrictions, loading applications via `file://*` URLs will prevent popup-based authentication providers from working properly. When testing locally, you'll need to run a barebones webserver on your machine rather than loading your test files via `file://*`. The easiest way to run a barebones server on your local machine is to `cd` to the root directory of your code and run `python -m SimpleHTTPServer`, which will allow you to access your content via `http://127.0.0.1:8000/*`."); | |
this.mRef = a; | |
this.mNamespace = e; | |
this.mApiHost = "https://auth.firebase.com"; | |
this.sessionLengthDays = null; | |
this.mLoginStateChange = function () { | |
var d = Array.prototype.slice.apply(arguments), | |
e = { | |
anonymous: ["uid", "firebaseAuthToken", "id", "provider"], | |
password: "uid email firebaseAuthToken id md5_hash provider".split(" "), | |
facebook: "uid accessToken displayName firebaseAuthToken id provider".split(" "), | |
github: "uid accessToken displayName firebaseAuthToken id provider username".split(" "), | |
persona: "uid email firebaseAuthToken id md5_hash provider".split(" "), | |
twitter: "uid accessToken accessTokenSecret displayName firebaseAuthToken id provider username".split(" ") | |
}; | |
if ("function" === typeof window.Proxy && 2 === window.Proxy.length && d[1] && d[1].provider) { | |
var f = d[1].provider; | |
Firebase && (Firebase.INTERNAL && Firebase.INTERNAL.statsIncrementCounter) && (d[1] = new Proxy(d[1], { | |
get: function (b, c) { | |
0 > e[f].indexOf(c) && Firebase.INTERNAL.statsIncrementCounter(a, "simple_login_undocumented_attribute_use." + c); | |
return b[c] | |
} | |
})) | |
} | |
setTimeout(function () { | |
b.apply(c, d) | |
}, 0) | |
}; | |
this.resumeSession() | |
}; | |
goog.exportSymbol("FirebaseSimpleLogin", FirebaseSimpleLogin); | |
FirebaseSimpleLogin.onOpen = function (a) { | |
fb.simplelogin.winchan.onOpen(a) | |
}; | |
goog.exportProperty(FirebaseSimpleLogin, "onOpen", FirebaseSimpleLogin.onOpen); | |
FirebaseSimpleLogin.prototype.hasLocalStorage = function () { | |
try { | |
localStorage.setItem("firebase-sentinel", "test"); | |
var a = localStorage.getItem("firebase-sentinel"); | |
localStorage.removeItem("firebase-sentinel"); | |
return "test" === a | |
} catch (b) {} | |
return !1 | |
}; | |
FirebaseSimpleLogin.prototype.resumeSession = function () { | |
var a = {}; | |
if (this.hasLocalStorage()) { | |
var b = this.readCookie("firebaseSessionKey"), | |
c = localStorage.getItem("firebaseSession"); | |
if (b && c) try { | |
a = fb.util.json.eval(sjcl.decrypt(b, fb.util.json.eval(c))) | |
} catch (d) {} | |
} | |
a && a.token && a.user ? this.attemptAuth(a.token, a.user, !1) : this.mLoginStateChange(null, null) | |
}; | |
FirebaseSimpleLogin.prototype.saveSession = function (a, b) { | |
if (this.hasLocalStorage()) { | |
var c = b.sessionKey, | |
d = sjcl.encrypt(c, fb.util.json.stringify({ | |
token: a, | |
user: b | |
})); | |
this.writeCookie("firebaseSessionKey", c, this.sessionLengthDays); | |
localStorage.setItem("firebaseSession", fb.util.json.stringify(d)) | |
} | |
}; | |
FirebaseSimpleLogin.prototype.clearSession = function () { | |
this.hasLocalStorage() && (this.writeCookie("firebaseSessionKey", "", -1), localStorage.removeItem("firebaseSession")) | |
}; | |
FirebaseSimpleLogin.prototype.writeCookie = function (a, b, c) { | |
var d = ""; | |
c && (d = new Date, d.setTime(d.getTime() + 864E5 * c), d = "; expires=" + d.toGMTString()); | |
document.cookie = a + "=" + b + d + "; path=/" | |
}; | |
FirebaseSimpleLogin.prototype.readCookie = function (a) { | |
for (var a = a + "=", b = document.cookie.split(";"), c = 0; c < b.length; c++) { | |
for (var d = b[c]; | |
" " == d.charAt(0);) d = d.substring(1, d.length); | |
if (0 == d.indexOf(a)) return d.substring(a.length, d.length) | |
} | |
return null | |
}; | |
FirebaseSimpleLogin.prototype.attemptAuth = function (a, b, c) { | |
var d = this; | |
this.mRef.auth(a, function (e, f) { | |
e ? (d.clearSession(), d.mLoginStateChange(null, null)) : (c && d.saveSession(a, b), "function" == typeof f && f(), delete b.sessionKey, b.firebaseAuthToken = a, d.mLoginStateChange(null, b)) | |
}, function () { | |
d.clearSession(); | |
d.mLoginStateChange(null, null) | |
}) | |
}; | |
FirebaseSimpleLogin.prototype.login = function (a) { | |
fb.util.validation.validateString(d, 1, a, !1); | |
var b = this, | |
c = {}, a = a.toLowerCase(), | |
d = "FirebaseSimpleLogin.login(" + a + ")"; | |
if ("password" === a) { | |
c = arguments[1] || {}; | |
if (!fb.simplelogin.validation.isValidEmail(c.email)) return this.mLoginStateChange(this.formatError({ | |
code: "INVALID_EMAIL", | |
message: "Invalid email specified." | |
})); | |
if (!fb.simplelogin.validation.isValidPassword(c.password)) return this.mLoginStateChange(this.formatError({ | |
code: "INVALID_PASSWORD", | |
message: "Invalid password specified." | |
})) | |
} else if ("facebook" === | |
a || "github" === a || "persona" === a || "twitter" === a || "anonymous" === a) fb.util.validation.validateArgCount(d, 1, 2, arguments.length), c = arguments[1] || {}; | |
var e = this.mLoginStateChange; | |
this.sessionLengthDays = c.rememberMe ? 30 : null; | |
switch (a) { | |
case "password": | |
this.jsonp("/auth/firebase", { | |
email: c.email, | |
password: c.password | |
}, function (a, c) { | |
a || !c.token ? e(b.formatError(a)) : b.attemptAuth(c.token, c.user, !0) | |
}); | |
break; | |
case "github": | |
c.height = 850, c.width = 950; | |
case "facebook": | |
case "twitter": | |
d = "twitter" === a && c.user_id && c.oauth_token && | |
c.oauth_token_secret; | |
"facebook" === a && c.access_token || d ? this.jsonp("/auth/" + a + "/token", c, function (a, c) { | |
a || !c.token ? e(b.formatError(a)) : b.attemptAuth(c.token, c.user, !0) | |
}) : this.launchAuthWindow(a, c, function (a, c, d) { | |
a ? b.mLoginStateChange(b.formatError(a), null) : b.attemptAuth(c, d, !0) | |
}); | |
break; | |
case "persona": | |
if (!navigator.id) throw Error(d + ": Unable to find Persona include.js"); | |
fb.simplelogin.persona.login(function (a) { | |
null === a ? e(b.formatError({ | |
code: "UNKNOWN_ERROR", | |
message: "User denied authentication request or an error occurred." | |
})) : | |
b.jsonp("/auth/persona/token", { | |
assertion: a | |
}, function (a, c) { | |
a || !c.token ? e(b.formatError(a), null) : b.attemptAuth(c.token, c.user, !0) | |
}) | |
}); | |
break; | |
case "anonymous": | |
b.jsonp("/auth/anonymous", {}, function (a, c) { | |
a || !c.token ? e(b.formatError(a), null) : b.attemptAuth(c.token, c.user, !0) | |
}); | |
break; | |
default: | |
throw Error("FirebaseSimpleLogin.login() failed: unrecognized authentication provider"); | |
} | |
}; | |
goog.exportProperty(FirebaseSimpleLogin.prototype, "login", FirebaseSimpleLogin.prototype.login); | |
FirebaseSimpleLogin.prototype.logout = function () { | |
fb.util.validation.validateArgCount("FirebaseSimpleLogin.logout", 0, 0, arguments.length); | |
this.clearSession(); | |
this.mRef.unauth(); | |
this.mLoginStateChange(null, null) | |
}; | |
goog.exportProperty(FirebaseSimpleLogin.prototype, "logout", FirebaseSimpleLogin.prototype.logout); | |
FirebaseSimpleLogin.prototype.parseURL = function (a) { | |
var b = document.createElement("a"); | |
b.href = a; | |
for (var a = b.protocol.replace(":", ""), c = b.hostname, d = b.port, e = b.search, f = {}, g = b.search.replace(/^\?/, "").split("&"), h = g.length, i = 0, k; i < h; i++) g[i] && (k = g[i].split("="), f[k[0]] = k[1]); | |
return { | |
protocol: a, | |
host: c, | |
port: d, | |
query: e, | |
params: f, | |
hash: b.hash.replace("#", ""), | |
path: b.pathname.replace(/^([^\/])/, "/$1") | |
} | |
}; | |
FirebaseSimpleLogin.prototype.isMobilePhoneGap = function () { | |
return (window.cordova || window.PhoneGap || window.phonegap) && /^file:\/{3}[^\/]/i.test(window.location.href) && /ios|iphone|ipod|ipad|android/i.test(navigator.userAgent) | |
}; | |
FirebaseSimpleLogin.prototype.isMobileTriggerIo = function () { | |
return window.forge && /^file:\/{3}[^\/]/i.test(window.location.href) && /ios|iphone|ipod|ipad|android/i.test(navigator.userAgent) | |
}; | |
FirebaseSimpleLogin.prototype.launchAuthWindow = function (a, b, c) { | |
var d = this, | |
a = this.mApiHost + "/auth/" + a + "?firebase=" + this.mNamespace; | |
b.scope && (a += "&scope=" + b.scope); | |
var e = { | |
menubar: 0, | |
location: 0, | |
resizable: 0, | |
scrollbars: 1, | |
status: 0, | |
dialog: 1, | |
width: 700, | |
height: 375 | |
}; | |
b.height && (e.height = b.height, delete b.height); | |
b.width && (e.width = b.width, delete b.width); | |
if (this.isMobilePhoneGap()) { | |
var f = window.open(a + "&internalRedirect=true&transport=internalRedirect", "blank", "location=no"), | |
g = !1; | |
f.addEventListener("loadstop", | |
function (a) { | |
try { | |
var b = d.parseURL(a.url); | |
if (b.path === "/auth/_blank") { | |
f.close(); | |
var e = b.params, | |
a = {}, h; | |
for (h in e) try { | |
a[h] = fb.util.json.eval(decodeURIComponent(e[h])) | |
} catch (m) {} | |
if (!g) { | |
g = true; | |
return a && a.error ? c(a.error) : a && a.token && a.user ? c(null, a.token, a.user) : c({ | |
code: "UNKNOWN_ERROR", | |
message: "An unknown error occurred." | |
}) | |
} | |
} | |
} catch (o) { | |
f.close(); | |
if (!g) { | |
g = true; | |
return c({ | |
code: "UNKNOWN_ERROR", | |
message: "An unknown error occurred." | |
}) | |
} | |
} | |
}); | |
f.addEventListener("exit", function () { | |
if (!g) { | |
g = true; | |
return c({ | |
code: "UNKNOWN_ERROR", | |
message: "An unknown error occurred." | |
}) | |
} | |
}); | |
setTimeout(function () { | |
f && f.close && f.close() | |
}, 4E4) | |
} else if (this.isMobileTriggerIo()) { | |
if (!window.forge || !window.forge.tabs) return c({ | |
code: "TRIGGER_IO_ERROR", | |
message: '"forge.tabs" module required when using Firebase Simple Login and Trigger.io' | |
}); | |
forge.tabs.openWithOptions({ | |
url: a + "&internalRedirect=true&transport=internalRedirect", | |
pattern: this.mApiHost + "/auth/_blank*" | |
}, function (a) { | |
var b = null; | |
if (a && a.url) try { | |
var e = d.parseURL(a.url).params, | |
b = {}, f; | |
for (f in e) b[f] = | |
fb.util.json.eval(decodeURIComponent(e[f])) | |
} catch (g) {} else if (a && a.userCancelled) return c({ | |
code: "USER_DENIED", | |
message: "User cancelled the authentication request." | |
}); | |
return b && b.token && b.user ? c(null, b.token, b.user) : b && b.error ? c(b.error) : c({ | |
code: "UNKNOWN_ERROR", | |
message: "An unknown error occurred." | |
}) | |
}, function () { | |
c({ | |
code: "UNKNOWN_ERROR", | |
message: "An unknown error occurred." | |
}) | |
}) | |
} else { | |
var b = [], | |
h; | |
for (h in e) b.push(h + "=" + e[h]); | |
fb.simplelogin.winchan.open({ | |
url: a + "&transport=winchan", | |
relay_url: this.mApiHost + | |
"/auth/channel", | |
window_features: b.join(",") | |
}, function (a, b) { | |
b && b.token && b.user ? c(null, b.token, b.user) : a === "unknown closed window" ? c({ | |
code: "USER_DENIED", | |
message: "User cancelled the authentication request." | |
}) : b.error ? c(b.error) : c({ | |
code: "UNKNOWN_ERROR", | |
message: "An unknown error occurred." | |
}) | |
}) | |
} | |
}; | |
FirebaseSimpleLogin.prototype.createUser = function (a, b, c) { | |
var d = this; | |
fb.util.validation.validateArgCount("FirebaseSimpleLogin.createUser", 3, 3, arguments.length); | |
fb.util.validation.validateCallback("FirebaseSimpleLogin.createUser", 3, c, !1); | |
if (!fb.simplelogin.validation.isValidEmail(a)) return c(this.formatError({ | |
code: "INVALID_EMAIL", | |
message: "Invalid email specified." | |
})); | |
if (!fb.simplelogin.validation.isValidPassword(b)) return c(this.formatError({ | |
code: "INVALID_PASSWORD", | |
message: "Invalid password specified. " | |
})); | |
this.jsonp("/auth/firebase/create", { | |
email: a, | |
password: b | |
}, function (a, b) { | |
a ? c(d.formatError(a), null) : c(null, b) | |
}) | |
}; | |
goog.exportProperty(FirebaseSimpleLogin.prototype, "createUser", FirebaseSimpleLogin.prototype.createUser); | |
FirebaseSimpleLogin.prototype.changePassword = function (a, b, c, d) { | |
var e = this; | |
fb.util.validation.validateArgCount("FirebaseSimpleLogin.changePassword", 4, 4, arguments.length); | |
fb.util.validation.validateCallback("FirebaseSimpleLogin.changePassword", 4, d, !1); | |
if (!fb.simplelogin.validation.isValidEmail(a)) return d(this.formatError({ | |
code: "INVALID_EMAIL", | |
message: "Invalid email specified." | |
})); | |
if (!fb.simplelogin.validation.isValidPassword(b) || !fb.simplelogin.validation.isValidPassword(c)) return d(this.formatError({ | |
code: "INVALID_PASSWORD", | |
message: "Invalid password specified. " | |
})); | |
this.jsonp("/auth/firebase/update", { | |
email: a, | |
oldPassword: b, | |
newPassword: c | |
}, function (a) { | |
a ? d(e.formatError(a), !1) : d(null, !0) | |
}) | |
}; | |
goog.exportProperty(FirebaseSimpleLogin.prototype, "changePassword", FirebaseSimpleLogin.prototype.changePassword); | |
FirebaseSimpleLogin.prototype.removeUser = function (a, b, c) { | |
var d = this; | |
fb.util.validation.validateArgCount("FirebaseSimpleLogin.removeUser", 3, 3, arguments.length); | |
fb.util.validation.validateCallback("FirebaseSimpleLogin.removeUser", 3, c, !1); | |
if (!fb.simplelogin.validation.isValidEmail(a)) return c(this.formatError({ | |
code: "INVALID_EMAIL", | |
message: "Invalid email specified." | |
})); | |
if (!fb.simplelogin.validation.isValidPassword(b)) return c(this.formatError({ | |
code: "INVALID_PASSWORD", | |
message: "Invalid password specified. " | |
})); | |
this.jsonp("/auth/firebase/remove", { | |
email: a, | |
password: b | |
}, function (a) { | |
a ? c(d.formatError(a), !1) : c(null, !0) | |
}) | |
}; | |
goog.exportProperty(FirebaseSimpleLogin.prototype, "removeUser", FirebaseSimpleLogin.prototype.removeUser); | |
FirebaseSimpleLogin._callbacks = {}; | |
FirebaseSimpleLogin.prototype.jsonp = function (a, b, c) { | |
var d = this, | |
e = this.mApiHost + a, | |
e = e + (/\?/.test(e) ? "" : "?"), | |
e = e + ("&firebase=" + this.mNamespace), | |
e = e + "&transport=jsonp", | |
f; | |
for (f in b) e += "&" + encodeURIComponent(f) + "=" + encodeURIComponent(b[f]); | |
var g = "_firebaseXDR" + (new Date).getTime().toString() + Math.floor(100 * Math.random()), | |
e = e + ("&callback=" + encodeURIComponent("FirebaseSimpleLogin._callbacks." + g)); | |
FirebaseSimpleLogin._callbacks[g] = function (a) { | |
var b = a.error || null; | |
delete a.error; | |
c(b, a); | |
setTimeout(function () { | |
delete FirebaseSimpleLogin._callbacks[g]; | |
var a = document.getElementById(g); | |
null !== a && a.parentNode.removeChild(a) | |
}) | |
}; | |
setTimeout(function () { | |
try { | |
var a = document.createElement("script"); | |
a.type = "text/javascript"; | |
a.id = g; | |
a.async = !0; | |
a.src = e; | |
a.onerror = function () { | |
var a = document.getElementById(g); | |
null !== a && a.parentNode.removeChild(a); | |
c(d.formatError({ | |
code: "SERVER_ERROR", | |
message: "An unknown server error occurred." | |
})) | |
}; | |
var b = document.getElementsByTagName("script")[0]; | |
b.parentNode.insertBefore(a, b) | |
} catch (f) { | |
c(d.formatError({ | |
code: "SERVER_ERROR", | |
message: "An unknown server error occurred." | |
})) | |
} | |
}, | |
1) | |
}; | |
FirebaseSimpleLogin.prototype.formatError = function (a) { | |
var b = Error(a.message || ""); | |
b.code = a.code || "UNKNOWN_ERROR"; | |
return b | |
}; | |
var FirebaseAuthClient = function (a, b, c) { | |
Firebase && (Firebase.INTERNAL && Firebase.INTERNAL.statsIncrementCounter) && Firebase.INTERNAL.statsIncrementCounter(a, "simple_login_deprecated_constructor"); | |
"undefined" !== typeof console && ("undefined" !== typeof console.warn ? console.warn("FirebaseAuthClient class being deprecated. Please use https://cdn.firebase.com/v0/firebase-simple-login.js and reference FirebaseSimpleLogin instead.") : console.log("FirebaseAuthClient class being deprecated. Please use https://cdn.firebase.com/v0/firebase-simple-login.js and reference FirebaseSimpleLogin instead.")); | |
return new FirebaseSimpleLogin(a, b, c) | |
}; | |
goog.exportSymbol("FirebaseAuthClient", FirebaseAuthClient); | |
FirebaseAuthClient.onOpen = FirebaseSimpleLogin.onOpen; | |
goog.exportProperty(FirebaseAuthClient, "onOpen", FirebaseAuthClient.onOpen); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment