App Engine Python SDK version 1.9.13
[gae.git] / python / google / appengine / tools / dev-channel-js.js
blobdb6866cc54359f1cf694d1aa749ed18f05e43dee
1 (function() { var goog = goog || {};
2 goog.global = this;
3 goog.isDef = function(val) {
4   return void 0 !== val;
5 };
6 goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) {
7   var parts = name.split("."), cur = opt_objectToExportTo || goog.global;
8   parts[0] in cur || !cur.execScript || cur.execScript("var " + parts[0]);
9   for (var part;parts.length && (part = parts.shift());) {
10     !parts.length && goog.isDef(opt_object) ? cur[part] = opt_object : cur = cur[part] ? cur[part] : cur[part] = {};
11   }
13 goog.define = function(name, defaultValue) {
14   var value = defaultValue;
15   goog.exportPath_(name, value);
17 goog.DEBUG = !0;
18 goog.LOCALE = "en";
19 goog.TRUSTED_SITE = !0;
20 goog.STRICT_MODE_COMPATIBLE = !1;
21 goog.provide = function(name) {
22   goog.constructNamespace_(name);
24 goog.constructNamespace_ = function(name, opt_obj) {
25   goog.exportPath_(name, opt_obj);
27 goog.module = function(name) {
28   if (!goog.isString(name) || !name) {
29     throw Error("Invalid module identifier");
30   }
31   if (!goog.isInModuleLoader_()) {
32     throw Error("Module " + name + " has been loaded incorrectly.");
33   }
34   if (goog.moduleLoaderState_.moduleName) {
35     throw Error("goog.module may only be called once per module.");
36   }
37   goog.moduleLoaderState_.moduleName = name;
39 goog.module.get = function(name) {
40   return goog.module.getInternal_(name);
42 goog.module.getInternal_ = function() {
44 goog.moduleLoaderState_ = null;
45 goog.isInModuleLoader_ = function() {
46   return null != goog.moduleLoaderState_;
48 goog.module.declareTestMethods = function() {
49   if (!goog.isInModuleLoader_()) {
50     throw Error("goog.module.declareTestMethods must be called from within a goog.module");
51   }
52   goog.moduleLoaderState_.declareTestMethods = !0;
54 goog.module.declareLegacyNamespace = function() {
55   goog.moduleLoaderState_.declareLegacyNamespace = !0;
57 goog.setTestOnly = function(opt_message) {
58   if (!goog.DEBUG) {
59     throw opt_message = opt_message || "", Error("Importing test-only code into non-debug environment" + (opt_message ? ": " + opt_message : "."));
60   }
62 goog.forwardDeclare = function() {
64 goog.getObjectByName = function(name, opt_obj) {
65   for (var parts = name.split("."), cur = opt_obj || goog.global, part;part = parts.shift();) {
66     if (goog.isDefAndNotNull(cur[part])) {
67       cur = cur[part];
68     } else {
69       return null;
70     }
71   }
72   return cur;
74 goog.globalize = function(obj, opt_global) {
75   var global = opt_global || goog.global, x;
76   for (x in obj) {
77     global[x] = obj[x];
78   }
80 goog.addDependency = function(relPath, provides, requires, opt_isModule) {
81   if (goog.DEPENDENCIES_ENABLED) {
82     for (var provide, require, path = relPath.replace(/\\/g, "/"), deps = goog.dependencies_, i = 0;provide = provides[i];i++) {
83       deps.nameToPath[provide] = path, deps.pathIsModule[path] = !!opt_isModule;
84     }
85     for (var j = 0;require = requires[j];j++) {
86       path in deps.requires || (deps.requires[path] = {}), deps.requires[path][require] = !0;
87     }
88   }
90 goog.useStrictRequires = !1;
91 goog.ENABLE_DEBUG_LOADER = !0;
92 goog.logToConsole_ = function(msg) {
93   goog.global.console && goog.global.console.error(msg);
95 goog.require = function() {
97 goog.basePath = "";
98 goog.nullFunction = function() {
100 goog.identityFunction = function(opt_returnValue) {
101   return opt_returnValue;
103 goog.abstractMethod = function() {
104   throw Error("unimplemented abstract method");
106 goog.addSingletonGetter = function(ctor) {
107   ctor.getInstance = function() {
108     if (ctor.instance_) {
109       return ctor.instance_;
110     }
111     goog.DEBUG && (goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor);
112     return ctor.instance_ = new ctor;
113   };
115 goog.instantiatedSingletons_ = [];
116 goog.LOAD_MODULE_USING_EVAL = !0;
117 goog.SEAL_MODULE_EXPORTS = goog.DEBUG;
118 goog.loadedModules_ = {};
119 goog.DEPENDENCIES_ENABLED = !1;
120 goog.DEPENDENCIES_ENABLED && (goog.included_ = {}, goog.dependencies_ = {pathIsModule:{}, nameToPath:{}, requires:{}, visited:{}, written:{}}, goog.inHtmlDocument_ = function() {
121   var doc = goog.global.document;
122   return "undefined" != typeof doc && "write" in doc;
123 }, goog.findBasePath_ = function() {
124   if (goog.global.CLOSURE_BASE_PATH) {
125     goog.basePath = goog.global.CLOSURE_BASE_PATH;
126   } else {
127     if (goog.inHtmlDocument_()) {
128       for (var doc = goog.global.document, scripts = doc.getElementsByTagName("script"), i = scripts.length - 1;0 <= i;--i) {
129         var src = scripts[i].src, qmark = src.lastIndexOf("?"), l = -1 == qmark ? src.length : qmark;
130         if ("base.js" == src.substr(l - 7, 7)) {
131           goog.basePath = src.substr(0, l - 7);
132           break;
133         }
134       }
135     }
136   }
137 }, goog.importScript_ = function(src, opt_sourceText) {
138   var importScript = goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_;
139   importScript(src, opt_sourceText) && (goog.dependencies_.written[src] = !0);
140 }, goog.IS_OLD_IE_ = goog.global.document && goog.global.document.all && !goog.global.atob, goog.importModule_ = function(src) {
141   var bootstrap = 'goog.retrieveAndExecModule_("' + src + '");';
142   goog.importScript_("", bootstrap) && (goog.dependencies_.written[src] = !0);
143 }, goog.queuedModules_ = [], goog.retrieveAndExecModule_ = function(src) {
144   for (var separator;-1 != (separator = src.indexOf("/./"));) {
145     src = src.substr(0, separator) + src.substr(separator + 2);
146   }
147   for (;-1 != (separator = src.indexOf("/../"));) {
148     var previousComponent = src.lastIndexOf("/", separator - 1);
149     src = src.substr(0, previousComponent) + src.substr(separator + 3);
150   }
151   var importScript = goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_, scriptText = null, xhr = new goog.global.XMLHttpRequest;
152   xhr.onload = function() {
153     scriptText = this.responseText;
154   };
155   xhr.open("get", src, !1);
156   xhr.send();
157   scriptText = xhr.responseText;
158   if (null != scriptText) {
159     var execModuleScript = goog.wrapModule_(src, scriptText), isOldIE = goog.IS_OLD_IE_;
160     isOldIE ? goog.queuedModules_.push(execModuleScript) : importScript(src, execModuleScript);
161     goog.dependencies_.written[src] = !0;
162   } else {
163     throw Error("load of " + src + "failed");
164   }
165 }, goog.wrapModule_ = function(srcUrl, scriptText) {
166   return goog.LOAD_MODULE_USING_EVAL && goog.isDef(goog.global.JSON) ? "goog.loadModule(" + goog.global.JSON.stringify(scriptText + "\n//# sourceURL=" + srcUrl + "\n") + ");" : 'goog.loadModule(function(exports) {"use strict";' + scriptText + "\n;return exports});\n//# sourceURL=" + srcUrl + "\n";
167 }, goog.loadQueuedModules_ = function() {
168   var count = goog.queuedModules_.length;
169   if (0 < count) {
170     var queue = goog.queuedModules_;
171     goog.queuedModules_ = [];
172     for (var i = 0;i < count;i++) {
173       var entry = queue[i];
174       goog.globalEval(entry);
175     }
176   }
177 }, goog.loadModule = function(moduleDef) {
178   try {
179     goog.moduleLoaderState_ = {moduleName:void 0, declareTestMethods:!1};
180     var exports;
181     if (goog.isFunction(moduleDef)) {
182       exports = moduleDef.call(goog.global, {});
183     } else {
184       if (goog.isString(moduleDef)) {
185         exports = goog.loadModuleFromSource_.call(goog.global, moduleDef);
186       } else {
187         throw Error("Invalid module definition");
188       }
189     }
190     var moduleName = goog.moduleLoaderState_.moduleName;
191     if (!goog.isString(moduleName) || !moduleName) {
192       throw Error('Invalid module name "' + moduleName + '"');
193     }
194     goog.moduleLoaderState_.declareLegacyNamespace ? goog.constructNamespace_(moduleName, exports) : goog.SEAL_MODULE_EXPORTS && Object.seal && Object.seal(exports);
195     goog.loadedModules_[moduleName] = exports;
196     if (goog.moduleLoaderState_.declareTestMethods) {
197       for (var entry in exports) {
198         if (0 === entry.indexOf("test", 0) || "tearDown" == entry || "setup" == entry) {
199           goog.global[entry] = exports[entry];
200         }
201       }
202     }
203   } finally {
204     goog.moduleLoaderState_ = null;
205   }
206 }, goog.loadModuleFromSource_ = function(JSCompiler_OptimizeArgumentsArray_p0) {
207   var exports = {};
208   eval(JSCompiler_OptimizeArgumentsArray_p0);
209   return exports;
210 }, goog.writeScriptTag_ = function(src, opt_sourceText) {
211   if (goog.inHtmlDocument_()) {
212     var doc = goog.global.document;
213     if ("complete" == doc.readyState) {
214       var isDeps = /\bdeps.js$/.test(src);
215       if (isDeps) {
216         return!1;
217       }
218       throw Error('Cannot write "' + src + '" after document load');
219     }
220     var isOldIE = goog.IS_OLD_IE_;
221     if (void 0 === opt_sourceText) {
222       if (isOldIE) {
223         var state = " onreadystatechange='goog.onScriptLoad_(this, " + ++goog.lastNonModuleScriptIndex_ + ")' ";
224         doc.write('<script type="text/javascript" src="' + src + '"' + state + ">\x3c/script>");
225       } else {
226         doc.write('<script type="text/javascript" src="' + src + '">\x3c/script>');
227       }
228     } else {
229       doc.write('<script type="text/javascript">' + opt_sourceText + "\x3c/script>");
230     }
231     return!0;
232   }
233   return!1;
234 }, goog.lastNonModuleScriptIndex_ = 0, goog.onScriptLoad_ = function(script, scriptIndex) {
235   "complete" == script.readyState && goog.lastNonModuleScriptIndex_ == scriptIndex && goog.loadQueuedModules_();
236   return!0;
237 }, goog.writeScripts_ = function() {
238   function visitNode(path) {
239     if (!(path in deps.written)) {
240       if (!(path in deps.visited) && (deps.visited[path] = !0, path in deps.requires)) {
241         for (var requireName in deps.requires[path]) {
242           if (!goog.isProvided_(requireName)) {
243             if (requireName in deps.nameToPath) {
244               visitNode(deps.nameToPath[requireName]);
245             } else {
246               throw Error("Undefined nameToPath for " + requireName);
247             }
248           }
249         }
250       }
251       path in seenScript || (seenScript[path] = !0, scripts.push(path));
252     }
253   }
254   var scripts = [], seenScript = {}, deps = goog.dependencies_, path$$0;
255   for (path$$0 in goog.included_) {
256     deps.written[path$$0] || visitNode(path$$0);
257   }
258   for (var i = 0;i < scripts.length;i++) {
259     path$$0 = scripts[i], goog.dependencies_.written[path$$0] = !0;
260   }
261   var moduleState = goog.moduleLoaderState_;
262   goog.moduleLoaderState_ = null;
263   for (i = 0;i < scripts.length;i++) {
264     if (path$$0 = scripts[i]) {
265       deps.pathIsModule[path$$0] ? goog.importModule_(goog.basePath + path$$0) : goog.importScript_(goog.basePath + path$$0);
266     } else {
267       throw goog.moduleLoaderState_ = moduleState, Error("Undefined script input");
268     }
269   }
270   goog.moduleLoaderState_ = moduleState;
271 }, goog.getPathFromDeps_ = function(rule) {
272   return rule in goog.dependencies_.nameToPath ? goog.dependencies_.nameToPath[rule] : null;
273 }, goog.findBasePath_(), goog.global.CLOSURE_NO_DEPS || goog.importScript_(goog.basePath + "deps.js"));
274 goog.typeOf = function(value) {
275   var s = typeof value;
276   if ("object" == s) {
277     if (value) {
278       if (value instanceof Array) {
279         return "array";
280       }
281       if (value instanceof Object) {
282         return s;
283       }
284       var className = Object.prototype.toString.call(value);
285       if ("[object Window]" == className) {
286         return "object";
287       }
288       if ("[object Array]" == className || "number" == typeof value.length && "undefined" != typeof value.splice && "undefined" != typeof value.propertyIsEnumerable && !value.propertyIsEnumerable("splice")) {
289         return "array";
290       }
291       if ("[object Function]" == className || "undefined" != typeof value.call && "undefined" != typeof value.propertyIsEnumerable && !value.propertyIsEnumerable("call")) {
292         return "function";
293       }
294     } else {
295       return "null";
296     }
297   } else {
298     if ("function" == s && "undefined" == typeof value.call) {
299       return "object";
300     }
301   }
302   return s;
304 goog.isNull = function(val) {
305   return null === val;
307 goog.isDefAndNotNull = function(val) {
308   return null != val;
310 goog.isArray = function(val) {
311   return "array" == goog.typeOf(val);
313 goog.isArrayLike = function(val) {
314   var type = goog.typeOf(val);
315   return "array" == type || "object" == type && "number" == typeof val.length;
317 goog.isDateLike = function(val) {
318   return goog.isObject(val) && "function" == typeof val.getFullYear;
320 goog.isString = function(val) {
321   return "string" == typeof val;
323 goog.isBoolean = function(val) {
324   return "boolean" == typeof val;
326 goog.isNumber = function(val) {
327   return "number" == typeof val;
329 goog.isFunction = function(val) {
330   return "function" == goog.typeOf(val);
332 goog.isObject = function(val) {
333   var type = typeof val;
334   return "object" == type && null != val || "function" == type;
336 goog.getUid = function(obj) {
337   return obj[goog.UID_PROPERTY_] || (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_);
339 goog.hasUid = function(obj) {
340   return!!obj[goog.UID_PROPERTY_];
342 goog.removeUid = function(obj) {
343   "removeAttribute" in obj && obj.removeAttribute(goog.UID_PROPERTY_);
344   try {
345     delete obj[goog.UID_PROPERTY_];
346   } catch (ex) {
347   }
349 goog.UID_PROPERTY_ = "closure_uid_" + (1E9 * Math.random() >>> 0);
350 goog.uidCounter_ = 0;
351 goog.getHashCode = goog.getUid;
352 goog.removeHashCode = goog.removeUid;
353 goog.cloneObject = function(obj) {
354   var type = goog.typeOf(obj);
355   if ("object" == type || "array" == type) {
356     if (obj.clone) {
357       return obj.clone();
358     }
359     var clone = "array" == type ? [] : {}, key;
360     for (key in obj) {
361       clone[key] = goog.cloneObject(obj[key]);
362     }
363     return clone;
364   }
365   return obj;
367 goog.bindNative_ = function(fn, selfObj, var_args) {
368   return fn.call.apply(fn.bind, arguments);
370 goog.bindJs_ = function(fn, selfObj, var_args) {
371   if (!fn) {
372     throw Error();
373   }
374   if (2 < arguments.length) {
375     var boundArgs = Array.prototype.slice.call(arguments, 2);
376     return function() {
377       var newArgs = Array.prototype.slice.call(arguments);
378       Array.prototype.unshift.apply(newArgs, boundArgs);
379       return fn.apply(selfObj, newArgs);
380     };
381   }
382   return function() {
383     return fn.apply(selfObj, arguments);
384   };
386 goog.bind = function(fn, selfObj, var_args) {
387   Function.prototype.bind && -1 != Function.prototype.bind.toString().indexOf("native code") ? goog.bind = goog.bindNative_ : goog.bind = goog.bindJs_;
388   return goog.bind.apply(null, arguments);
390 goog.partial = function(fn, var_args) {
391   var args = Array.prototype.slice.call(arguments, 1);
392   return function() {
393     var newArgs = args.slice();
394     newArgs.push.apply(newArgs, arguments);
395     return fn.apply(this, newArgs);
396   };
398 goog.mixin = function(target, source) {
399   for (var x in source) {
400     target[x] = source[x];
401   }
403 goog.now = goog.TRUSTED_SITE && Date.now || function() {
404   return+new Date;
406 goog.globalEval = function(script) {
407   if (goog.global.execScript) {
408     goog.global.execScript(script, "JavaScript");
409   } else {
410     if (goog.global.eval) {
411       if (null == goog.evalWorksForGlobals_ && (goog.global.eval("var _et_ = 1;"), "undefined" != typeof goog.global._et_ ? (delete goog.global._et_, goog.evalWorksForGlobals_ = !0) : goog.evalWorksForGlobals_ = !1), goog.evalWorksForGlobals_) {
412         goog.global.eval(script);
413       } else {
414         var doc = goog.global.document, scriptElt = doc.createElement("script");
415         scriptElt.type = "text/javascript";
416         scriptElt.defer = !1;
417         scriptElt.appendChild(doc.createTextNode(script));
418         doc.body.appendChild(scriptElt);
419         doc.body.removeChild(scriptElt);
420       }
421     } else {
422       throw Error("goog.globalEval not available");
423     }
424   }
426 goog.evalWorksForGlobals_ = null;
427 goog.getCssName = function(className, opt_modifier) {
428   var getMapping = function(cssName) {
429     return goog.cssNameMapping_[cssName] || cssName;
430   }, renameByParts = function(cssName) {
431     for (var parts = cssName.split("-"), mapped = [], i = 0;i < parts.length;i++) {
432       mapped.push(getMapping(parts[i]));
433     }
434     return mapped.join("-");
435   }, rename;
436   rename = goog.cssNameMapping_ ? "BY_WHOLE" == goog.cssNameMappingStyle_ ? getMapping : renameByParts : function(a) {
437     return a;
438   };
439   return opt_modifier ? className + "-" + rename(opt_modifier) : rename(className);
441 goog.setCssNameMapping = function(mapping, opt_style) {
442   goog.cssNameMapping_ = mapping;
443   goog.cssNameMappingStyle_ = opt_style;
445 goog.getMsg = function(str, opt_values) {
446   opt_values && (str = str.replace(/\{\$([^}]+)}/g, function(match, key) {
447     return key in opt_values ? opt_values[key] : match;
448   }));
449   return str;
451 goog.getMsgWithFallback = function(a) {
452   return a;
454 goog.exportSymbol = function(publicPath, object, opt_objectToExportTo) {
455   goog.exportPath_(publicPath, object, opt_objectToExportTo);
457 goog.exportProperty = function(object, publicName, symbol) {
458   object[publicName] = symbol;
460 goog.inherits = function(childCtor, parentCtor) {
461   function tempCtor() {
462   }
463   tempCtor.prototype = parentCtor.prototype;
464   childCtor.superClass_ = parentCtor.prototype;
465   childCtor.prototype = new tempCtor;
466   childCtor.prototype.constructor = childCtor;
467   childCtor.base = function(me, methodName, var_args) {
468     var args = Array.prototype.slice.call(arguments, 2);
469     return parentCtor.prototype[methodName].apply(me, args);
470   };
472 goog.base = function(me, opt_methodName, var_args) {
473   var caller = arguments.callee.caller;
474   if (goog.STRICT_MODE_COMPATIBLE || goog.DEBUG && !caller) {
475     throw Error("arguments.caller not defined.  goog.base() cannot be used with strict mode code. See http://www.ecma-international.org/ecma-262/5.1/#sec-C");
476   }
477   if (caller.superClass_) {
478     return caller.superClass_.constructor.apply(me, Array.prototype.slice.call(arguments, 1));
479   }
480   for (var args = Array.prototype.slice.call(arguments, 2), foundCaller = !1, ctor = me.constructor;ctor;ctor = ctor.superClass_ && ctor.superClass_.constructor) {
481     if (ctor.prototype[opt_methodName] === caller) {
482       foundCaller = !0;
483     } else {
484       if (foundCaller) {
485         return ctor.prototype[opt_methodName].apply(me, args);
486       }
487     }
488   }
489   if (me[opt_methodName] === caller) {
490     return me.constructor.prototype[opt_methodName].apply(me, args);
491   }
492   throw Error("goog.base called from a method of one name to a method of a different name");
494 goog.scope = function(fn) {
495   fn.call(goog.global);
497 goog.MODIFY_FUNCTION_PROTOTYPES = !0;
498 goog.MODIFY_FUNCTION_PROTOTYPES && (Function.prototype.bind = Function.prototype.bind || function(selfObj, var_args) {
499   if (1 < arguments.length) {
500     var args = Array.prototype.slice.call(arguments, 1);
501     args.unshift(this, selfObj);
502     return goog.bind.apply(null, args);
503   }
504   return goog.bind(this, selfObj);
505 }, Function.prototype.partial = function(var_args) {
506   var args = Array.prototype.slice.call(arguments);
507   args.unshift(this, null);
508   return goog.bind.apply(null, args);
509 }, Function.prototype.inherits = function(parentCtor) {
510   goog.inherits(this, parentCtor);
511 }, Function.prototype.mixin = function(source) {
512   goog.mixin(this.prototype, source);
514 goog.defineClass = function(superClass, def) {
515   var constructor = def.constructor, statics = def.statics;
516   constructor && constructor != Object.prototype.constructor || (constructor = function() {
517     throw Error("cannot instantiate an interface (no constructor defined).");
518   });
519   var cls = goog.defineClass.createSealingConstructor_(constructor, superClass);
520   superClass && goog.inherits(cls, superClass);
521   delete def.constructor;
522   delete def.statics;
523   goog.defineClass.applyProperties_(cls.prototype, def);
524   null != statics && (statics instanceof Function ? statics(cls) : goog.defineClass.applyProperties_(cls, statics));
525   return cls;
527 goog.defineClass.SEAL_CLASS_INSTANCES = goog.DEBUG;
528 goog.defineClass.createSealingConstructor_ = function(ctr, superClass) {
529   if (goog.defineClass.SEAL_CLASS_INSTANCES && Object.seal instanceof Function) {
530     if (superClass && superClass.prototype && superClass.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_]) {
531       return ctr;
532     }
533     var wrappedCtr = function() {
534       var instance = ctr.apply(this, arguments) || this;
535       instance[goog.UID_PROPERTY_] = instance[goog.UID_PROPERTY_];
536       this.constructor === wrappedCtr && Object.seal(instance);
537       return instance;
538     };
539     return wrappedCtr;
540   }
541   return ctr;
543 goog.defineClass.OBJECT_PROTOTYPE_FIELDS_ = "constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");
544 goog.defineClass.applyProperties_ = function(target, source) {
545   for (var key in source) {
546     Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
547   }
548   for (var i = 0;i < goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length;i++) {
549     key = goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[i], Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
550   }
552 goog.tagUnsealableClass = function() {
554 goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_ = "goog_defineClass_legacy_unsealable";
555 goog.debug = {};
556 goog.debug.Error = function(opt_msg) {
557   if (Error.captureStackTrace) {
558     Error.captureStackTrace(this, goog.debug.Error);
559   } else {
560     var stack = Error().stack;
561     stack && (this.stack = stack);
562   }
563   opt_msg && (this.message = String(opt_msg));
565 goog.inherits(goog.debug.Error, Error);
566 goog.debug.Error.prototype.name = "CustomError";
567 goog.dom = {};
568 goog.dom.NodeType = {ELEMENT:1, ATTRIBUTE:2, TEXT:3, CDATA_SECTION:4, ENTITY_REFERENCE:5, ENTITY:6, PROCESSING_INSTRUCTION:7, COMMENT:8, DOCUMENT:9, DOCUMENT_TYPE:10, DOCUMENT_FRAGMENT:11, NOTATION:12};
569 goog.string = {};
570 goog.string.DETECT_DOUBLE_ESCAPING = !1;
571 goog.string.Unicode = {NBSP:"\u00a0"};
572 goog.string.startsWith = function(str, prefix) {
573   return 0 == str.lastIndexOf(prefix, 0);
575 goog.string.endsWith = function(str, suffix) {
576   var l = str.length - suffix.length;
577   return 0 <= l && str.indexOf(suffix, l) == l;
579 goog.string.caseInsensitiveStartsWith = function(str, prefix) {
580   return 0 == goog.string.caseInsensitiveCompare(prefix, str.substr(0, prefix.length));
582 goog.string.caseInsensitiveEndsWith = function(str, suffix) {
583   return 0 == goog.string.caseInsensitiveCompare(suffix, str.substr(str.length - suffix.length, suffix.length));
585 goog.string.caseInsensitiveEquals = function(str1, str2) {
586   return str1.toLowerCase() == str2.toLowerCase();
588 goog.string.subs = function(str, var_args) {
589   for (var splitParts = str.split("%s"), returnString = "", subsArguments = Array.prototype.slice.call(arguments, 1);subsArguments.length && 1 < splitParts.length;) {
590     returnString += splitParts.shift() + subsArguments.shift();
591   }
592   return returnString + splitParts.join("%s");
594 goog.string.collapseWhitespace = function(str) {
595   return str.replace(/[\s\xa0]+/g, " ").replace(/^\s+|\s+$/g, "");
597 goog.string.isEmpty = function(str) {
598   return/^[\s\xa0]*$/.test(str);
600 goog.string.isEmptySafe = function(str) {
601   return goog.string.isEmpty(goog.string.makeSafe(str));
603 goog.string.isBreakingWhitespace = function(str) {
604   return!/[^\t\n\r ]/.test(str);
606 goog.string.isAlpha = function(str) {
607   return!/[^a-zA-Z]/.test(str);
609 goog.string.isNumeric = function(str) {
610   return!/[^0-9]/.test(str);
612 goog.string.isAlphaNumeric = function(str) {
613   return!/[^a-zA-Z0-9]/.test(str);
615 goog.string.isSpace = function(ch) {
616   return " " == ch;
618 goog.string.isUnicodeChar = function(ch) {
619   return 1 == ch.length && " " <= ch && "~" >= ch || "\u0080" <= ch && "\ufffd" >= ch;
621 goog.string.stripNewlines = function(str) {
622   return str.replace(/(\r\n|\r|\n)+/g, " ");
624 goog.string.canonicalizeNewlines = function(str) {
625   return str.replace(/(\r\n|\r|\n)/g, "\n");
627 goog.string.normalizeWhitespace = function(str) {
628   return str.replace(/\xa0|\s/g, " ");
630 goog.string.normalizeSpaces = function(str) {
631   return str.replace(/\xa0|[ \t]+/g, " ");
633 goog.string.collapseBreakingSpaces = function(str) {
634   return str.replace(/[\t\r\n ]+/g, " ").replace(/^[\t\r\n ]+|[\t\r\n ]+$/g, "");
636 goog.string.trim = goog.TRUSTED_SITE && String.prototype.trim ? function(str) {
637   return str.trim();
638 } : function(str) {
639   return str.replace(/^[\s\xa0]+|[\s\xa0]+$/g, "");
641 goog.string.trimLeft = function(str) {
642   return str.replace(/^[\s\xa0]+/, "");
644 goog.string.trimRight = function(str) {
645   return str.replace(/[\s\xa0]+$/, "");
647 goog.string.caseInsensitiveCompare = function(str1, str2) {
648   var test1 = String(str1).toLowerCase(), test2 = String(str2).toLowerCase();
649   return test1 < test2 ? -1 : test1 == test2 ? 0 : 1;
651 goog.string.numerateCompareRegExp_ = /(\.\d+)|(\d+)|(\D+)/g;
652 goog.string.numerateCompare = function(str1, str2) {
653   if (str1 == str2) {
654     return 0;
655   }
656   if (!str1) {
657     return-1;
658   }
659   if (!str2) {
660     return 1;
661   }
662   for (var tokens1 = str1.toLowerCase().match(goog.string.numerateCompareRegExp_), tokens2 = str2.toLowerCase().match(goog.string.numerateCompareRegExp_), count = Math.min(tokens1.length, tokens2.length), i = 0;i < count;i++) {
663     var a = tokens1[i], b = tokens2[i];
664     if (a != b) {
665       var num1 = parseInt(a, 10);
666       if (!isNaN(num1)) {
667         var num2 = parseInt(b, 10);
668         if (!isNaN(num2) && num1 - num2) {
669           return num1 - num2;
670         }
671       }
672       return a < b ? -1 : 1;
673     }
674   }
675   return tokens1.length != tokens2.length ? tokens1.length - tokens2.length : str1 < str2 ? -1 : 1;
677 goog.string.urlEncode = function(str) {
678   return encodeURIComponent(String(str));
680 goog.string.urlDecode = function(str) {
681   return decodeURIComponent(str.replace(/\+/g, " "));
683 goog.string.newLineToBr = function(str, opt_xml) {
684   return str.replace(/(\r\n|\r|\n)/g, opt_xml ? "<br />" : "<br>");
686 goog.string.htmlEscape = function(str, opt_isLikelyToContainHtmlChars) {
687   if (opt_isLikelyToContainHtmlChars) {
688     str = str.replace(goog.string.AMP_RE_, "&amp;").replace(goog.string.LT_RE_, "&lt;").replace(goog.string.GT_RE_, "&gt;").replace(goog.string.QUOT_RE_, "&quot;").replace(goog.string.SINGLE_QUOTE_RE_, "&#39;").replace(goog.string.NULL_RE_, "&#0;"), goog.string.DETECT_DOUBLE_ESCAPING && (str = str.replace(goog.string.E_RE_, "&#101;"));
689   } else {
690     if (!goog.string.ALL_RE_.test(str)) {
691       return str;
692     }
693     -1 != str.indexOf("&") && (str = str.replace(goog.string.AMP_RE_, "&amp;"));
694     -1 != str.indexOf("<") && (str = str.replace(goog.string.LT_RE_, "&lt;"));
695     -1 != str.indexOf(">") && (str = str.replace(goog.string.GT_RE_, "&gt;"));
696     -1 != str.indexOf('"') && (str = str.replace(goog.string.QUOT_RE_, "&quot;"));
697     -1 != str.indexOf("'") && (str = str.replace(goog.string.SINGLE_QUOTE_RE_, "&#39;"));
698     -1 != str.indexOf("\x00") && (str = str.replace(goog.string.NULL_RE_, "&#0;"));
699     goog.string.DETECT_DOUBLE_ESCAPING && -1 != str.indexOf("e") && (str = str.replace(goog.string.E_RE_, "&#101;"));
700   }
701   return str;
703 goog.string.AMP_RE_ = /&/g;
704 goog.string.LT_RE_ = /</g;
705 goog.string.GT_RE_ = />/g;
706 goog.string.QUOT_RE_ = /"/g;
707 goog.string.SINGLE_QUOTE_RE_ = /'/g;
708 goog.string.NULL_RE_ = /\x00/g;
709 goog.string.E_RE_ = /e/g;
710 goog.string.ALL_RE_ = goog.string.DETECT_DOUBLE_ESCAPING ? /[\x00&<>"'e]/ : /[\x00&<>"']/;
711 goog.string.unescapeEntities = function(str) {
712   return goog.string.contains(str, "&") ? "document" in goog.global ? goog.string.unescapeEntitiesUsingDom_(str) : goog.string.unescapePureXmlEntities_(str) : str;
714 goog.string.unescapeEntitiesWithDocument = function(str, document) {
715   return goog.string.contains(str, "&") ? goog.string.unescapeEntitiesUsingDom_(str, document) : str;
717 goog.string.unescapeEntitiesUsingDom_ = function(str, opt_document) {
718   var seen = {"&amp;":"&", "&lt;":"<", "&gt;":">", "&quot;":'"'}, div;
719   div = opt_document ? opt_document.createElement("div") : goog.global.document.createElement("div");
720   return str.replace(goog.string.HTML_ENTITY_PATTERN_, function(s, entity) {
721     var value = seen[s];
722     if (value) {
723       return value;
724     }
725     if ("#" == entity.charAt(0)) {
726       var n = Number("0" + entity.substr(1));
727       isNaN(n) || (value = String.fromCharCode(n));
728     }
729     value || (div.innerHTML = s + " ", value = div.firstChild.nodeValue.slice(0, -1));
730     return seen[s] = value;
731   });
733 goog.string.unescapePureXmlEntities_ = function(str) {
734   return str.replace(/&([^;]+);/g, function(s, entity) {
735     switch(entity) {
736       case "amp":
737         return "&";
738       case "lt":
739         return "<";
740       case "gt":
741         return ">";
742       case "quot":
743         return'"';
744       default:
745         if ("#" == entity.charAt(0)) {
746           var n = Number("0" + entity.substr(1));
747           if (!isNaN(n)) {
748             return String.fromCharCode(n);
749           }
750         }
751         return s;
752     }
753   });
755 goog.string.HTML_ENTITY_PATTERN_ = /&([^;\s<&]+);?/g;
756 goog.string.whitespaceEscape = function(str, opt_xml) {
757   return goog.string.newLineToBr(str.replace(/  /g, " &#160;"), opt_xml);
759 goog.string.preserveSpaces = function(str) {
760   return str.replace(/(^|[\n ]) /g, "$1" + goog.string.Unicode.NBSP);
762 goog.string.stripQuotes = function(str, quoteChars) {
763   for (var length = quoteChars.length, i = 0;i < length;i++) {
764     var quoteChar = 1 == length ? quoteChars : quoteChars.charAt(i);
765     if (str.charAt(0) == quoteChar && str.charAt(str.length - 1) == quoteChar) {
766       return str.substring(1, str.length - 1);
767     }
768   }
769   return str;
771 goog.string.truncate = function(str, chars, opt_protectEscapedCharacters) {
772   opt_protectEscapedCharacters && (str = goog.string.unescapeEntities(str));
773   str.length > chars && (str = str.substring(0, chars - 3) + "...");
774   opt_protectEscapedCharacters && (str = goog.string.htmlEscape(str));
775   return str;
777 goog.string.truncateMiddle = function(str, chars, opt_protectEscapedCharacters, opt_trailingChars) {
778   opt_protectEscapedCharacters && (str = goog.string.unescapeEntities(str));
779   if (opt_trailingChars && str.length > chars) {
780     opt_trailingChars > chars && (opt_trailingChars = chars);
781     var endPoint = str.length - opt_trailingChars, startPoint = chars - opt_trailingChars;
782     str = str.substring(0, startPoint) + "..." + str.substring(endPoint);
783   } else {
784     if (str.length > chars) {
785       var half = Math.floor(chars / 2), endPos = str.length - half, half = half + chars % 2;
786       str = str.substring(0, half) + "..." + str.substring(endPos);
787     }
788   }
789   opt_protectEscapedCharacters && (str = goog.string.htmlEscape(str));
790   return str;
792 goog.string.specialEscapeChars_ = {"\x00":"\\0", "\b":"\\b", "\f":"\\f", "\n":"\\n", "\r":"\\r", "\t":"\\t", "\x0B":"\\x0B", '"':'\\"', "\\":"\\\\"};
793 goog.string.jsEscapeCache_ = {"'":"\\'"};
794 goog.string.quote = function(s) {
795   s = String(s);
796   if (s.quote) {
797     return s.quote();
798   }
799   for (var sb = ['"'], i = 0;i < s.length;i++) {
800     var ch = s.charAt(i), cc = ch.charCodeAt(0);
801     sb[i + 1] = goog.string.specialEscapeChars_[ch] || (31 < cc && 127 > cc ? ch : goog.string.escapeChar(ch));
802   }
803   sb.push('"');
804   return sb.join("");
806 goog.string.escapeString = function(str) {
807   for (var sb = [], i = 0;i < str.length;i++) {
808     sb[i] = goog.string.escapeChar(str.charAt(i));
809   }
810   return sb.join("");
812 goog.string.escapeChar = function(c) {
813   if (c in goog.string.jsEscapeCache_) {
814     return goog.string.jsEscapeCache_[c];
815   }
816   if (c in goog.string.specialEscapeChars_) {
817     return goog.string.jsEscapeCache_[c] = goog.string.specialEscapeChars_[c];
818   }
819   var rv = c, cc = c.charCodeAt(0);
820   if (31 < cc && 127 > cc) {
821     rv = c;
822   } else {
823     if (256 > cc) {
824       if (rv = "\\x", 16 > cc || 256 < cc) {
825         rv += "0";
826       }
827     } else {
828       rv = "\\u", 4096 > cc && (rv += "0");
829     }
830     rv += cc.toString(16).toUpperCase();
831   }
832   return goog.string.jsEscapeCache_[c] = rv;
834 goog.string.contains = function(str, subString) {
835   return-1 != str.indexOf(subString);
837 goog.string.caseInsensitiveContains = function(str, subString) {
838   return goog.string.contains(str.toLowerCase(), subString.toLowerCase());
840 goog.string.countOf = function(s, ss) {
841   return s && ss ? s.split(ss).length - 1 : 0;
843 goog.string.removeAt = function(s, index, stringLength) {
844   var resultStr = s;
845   0 <= index && index < s.length && 0 < stringLength && (resultStr = s.substr(0, index) + s.substr(index + stringLength, s.length - index - stringLength));
846   return resultStr;
848 goog.string.remove = function(s, ss) {
849   var re = new RegExp(goog.string.regExpEscape(ss), "");
850   return s.replace(re, "");
852 goog.string.removeAll = function(s, ss) {
853   var re = new RegExp(goog.string.regExpEscape(ss), "g");
854   return s.replace(re, "");
856 goog.string.regExpEscape = function(s) {
857   return String(s).replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, "\\$1").replace(/\x08/g, "\\x08");
859 goog.string.repeat = function(string, length) {
860   return Array(length + 1).join(string);
862 goog.string.padNumber = function(num, length, opt_precision) {
863   var s = goog.isDef(opt_precision) ? num.toFixed(opt_precision) : String(num), index = s.indexOf(".");
864   -1 == index && (index = s.length);
865   return goog.string.repeat("0", Math.max(0, length - index)) + s;
867 goog.string.makeSafe = function(obj) {
868   return null == obj ? "" : String(obj);
870 goog.string.buildString = function(var_args) {
871   return Array.prototype.join.call(arguments, "");
873 goog.string.getRandomString = function() {
874   return Math.floor(2147483648 * Math.random()).toString(36) + Math.abs(Math.floor(2147483648 * Math.random()) ^ goog.now()).toString(36);
876 goog.string.compareVersions = function(version1, version2) {
877   for (var order = 0, v1Subs = goog.string.trim(String(version1)).split("."), v2Subs = goog.string.trim(String(version2)).split("."), subCount = Math.max(v1Subs.length, v2Subs.length), subIdx = 0;0 == order && subIdx < subCount;subIdx++) {
878     var v1Sub = v1Subs[subIdx] || "", v2Sub = v2Subs[subIdx] || "", v1CompParser = RegExp("(\\d*)(\\D*)", "g"), v2CompParser = RegExp("(\\d*)(\\D*)", "g");
879     do {
880       var v1Comp = v1CompParser.exec(v1Sub) || ["", "", ""], v2Comp = v2CompParser.exec(v2Sub) || ["", "", ""];
881       if (0 == v1Comp[0].length && 0 == v2Comp[0].length) {
882         break;
883       }
884       var v1CompNum = 0 == v1Comp[1].length ? 0 : parseInt(v1Comp[1], 10), v2CompNum = 0 == v2Comp[1].length ? 0 : parseInt(v2Comp[1], 10), order = goog.string.compareElements_(v1CompNum, v2CompNum) || goog.string.compareElements_(0 == v1Comp[2].length, 0 == v2Comp[2].length) || goog.string.compareElements_(v1Comp[2], v2Comp[2]);
885     } while (0 == order);
886   }
887   return order;
889 goog.string.compareElements_ = function(left, right) {
890   return left < right ? -1 : left > right ? 1 : 0;
892 goog.string.HASHCODE_MAX_ = 4294967296;
893 goog.string.hashCode = function(str) {
894   for (var result = 0, i = 0;i < str.length;++i) {
895     result = 31 * result + str.charCodeAt(i), result %= goog.string.HASHCODE_MAX_;
896   }
897   return result;
899 goog.string.uniqueStringCounter_ = 2147483648 * Math.random() | 0;
900 goog.string.createUniqueString = function() {
901   return "goog_" + goog.string.uniqueStringCounter_++;
903 goog.string.toNumber = function(str) {
904   var num = Number(str);
905   return 0 == num && goog.string.isEmpty(str) ? NaN : num;
907 goog.string.isLowerCamelCase = function(str) {
908   return/^[a-z]+([A-Z][a-z]*)*$/.test(str);
910 goog.string.isUpperCamelCase = function(str) {
911   return/^([A-Z][a-z]*)+$/.test(str);
913 goog.string.toCamelCase = function(str) {
914   return String(str).replace(/\-([a-z])/g, function(all, match) {
915     return match.toUpperCase();
916   });
918 goog.string.toSelectorCase = function(str) {
919   return String(str).replace(/([A-Z])/g, "-$1").toLowerCase();
921 goog.string.toTitleCase = function(str, opt_delimiters) {
922   var delimiters = goog.isString(opt_delimiters) ? goog.string.regExpEscape(opt_delimiters) : "\\s", delimiters = delimiters ? "|[" + delimiters + "]+" : "", regexp = new RegExp("(^" + delimiters + ")([a-z])", "g");
923   return str.replace(regexp, function(all, p1, p2) {
924     return p1 + p2.toUpperCase();
925   });
927 goog.string.parseInt = function(value) {
928   isFinite(value) && (value = String(value));
929   return goog.isString(value) ? /^\s*-?0x/i.test(value) ? parseInt(value, 16) : parseInt(value, 10) : NaN;
931 goog.string.splitLimit = function(str, separator, limit) {
932   for (var parts = str.split(separator), returnVal = [];0 < limit && parts.length;) {
933     returnVal.push(parts.shift()), limit--;
934   }
935   parts.length && returnVal.push(parts.join(separator));
936   return returnVal;
938 goog.asserts = {};
939 goog.asserts.ENABLE_ASSERTS = goog.DEBUG;
940 goog.asserts.AssertionError = function(messagePattern, messageArgs) {
941   messageArgs.unshift(messagePattern);
942   goog.debug.Error.call(this, goog.string.subs.apply(null, messageArgs));
943   messageArgs.shift();
945 goog.inherits(goog.asserts.AssertionError, goog.debug.Error);
946 goog.asserts.AssertionError.prototype.name = "AssertionError";
947 goog.asserts.DEFAULT_ERROR_HANDLER = function(e) {
948   throw e;
950 goog.asserts.errorHandler_ = goog.asserts.DEFAULT_ERROR_HANDLER;
951 goog.asserts.doAssertFailure_ = function(defaultMessage, defaultArgs, givenMessage, givenArgs) {
952   var message = "Assertion failed";
953   if (givenMessage) {
954     var message = message + (": " + givenMessage), args = givenArgs
955   } else {
956     defaultMessage && (message += ": " + defaultMessage, args = defaultArgs);
957   }
958   var e = new goog.asserts.AssertionError("" + message, args || []);
959   goog.asserts.errorHandler_(e);
961 goog.asserts.setErrorHandler = function(errorHandler) {
962   goog.asserts.ENABLE_ASSERTS && (goog.asserts.errorHandler_ = errorHandler);
964 goog.asserts.assert = function(condition, opt_message, var_args) {
965   goog.asserts.ENABLE_ASSERTS && !condition && goog.asserts.doAssertFailure_("", null, opt_message, Array.prototype.slice.call(arguments, 2));
966   return condition;
968 goog.asserts.fail = function(opt_message, var_args) {
969   goog.asserts.ENABLE_ASSERTS && goog.asserts.errorHandler_(new goog.asserts.AssertionError("Failure" + (opt_message ? ": " + opt_message : ""), Array.prototype.slice.call(arguments, 1)));
971 goog.asserts.assertNumber = function(value, opt_message, var_args) {
972   goog.asserts.ENABLE_ASSERTS && !goog.isNumber(value) && goog.asserts.doAssertFailure_("Expected number but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2));
973   return value;
975 goog.asserts.assertString = function(value, opt_message, var_args) {
976   goog.asserts.ENABLE_ASSERTS && !goog.isString(value) && goog.asserts.doAssertFailure_("Expected string but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2));
977   return value;
979 goog.asserts.assertFunction = function(value, opt_message, var_args) {
980   goog.asserts.ENABLE_ASSERTS && !goog.isFunction(value) && goog.asserts.doAssertFailure_("Expected function but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2));
981   return value;
983 goog.asserts.assertObject = function(value, opt_message, var_args) {
984   goog.asserts.ENABLE_ASSERTS && !goog.isObject(value) && goog.asserts.doAssertFailure_("Expected object but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2));
985   return value;
987 goog.asserts.assertArray = function(value, opt_message, var_args) {
988   goog.asserts.ENABLE_ASSERTS && !goog.isArray(value) && goog.asserts.doAssertFailure_("Expected array but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2));
989   return value;
991 goog.asserts.assertBoolean = function(value, opt_message, var_args) {
992   goog.asserts.ENABLE_ASSERTS && !goog.isBoolean(value) && goog.asserts.doAssertFailure_("Expected boolean but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2));
993   return value;
995 goog.asserts.assertElement = function(value, opt_message, var_args) {
996   !goog.asserts.ENABLE_ASSERTS || goog.isObject(value) && value.nodeType == goog.dom.NodeType.ELEMENT || goog.asserts.doAssertFailure_("Expected Element but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2));
997   return value;
999 goog.asserts.assertInstanceof = function(value, type, opt_message, var_args) {
1000   !goog.asserts.ENABLE_ASSERTS || value instanceof type || goog.asserts.doAssertFailure_("instanceof check failed.", null, opt_message, Array.prototype.slice.call(arguments, 3));
1001   return value;
1003 goog.asserts.assertObjectPrototypeIsIntact = function() {
1004   for (var key in Object.prototype) {
1005     goog.asserts.fail(key + " should not be enumerable in Object.prototype.");
1006   }
1008 goog.array = {};
1009 goog.NATIVE_ARRAY_PROTOTYPES = goog.TRUSTED_SITE;
1010 goog.array.ASSUME_NATIVE_FUNCTIONS = !1;
1011 goog.array.peek = function(array) {
1012   return array[array.length - 1];
1014 goog.array.last = goog.array.peek;
1015 goog.array.ARRAY_PROTOTYPE_ = Array.prototype;
1016 goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.indexOf) ? function(arr, obj, opt_fromIndex) {
1017   goog.asserts.assert(null != arr.length);
1018   return goog.array.ARRAY_PROTOTYPE_.indexOf.call(arr, obj, opt_fromIndex);
1019 } : function(arr, obj, opt_fromIndex) {
1020   var fromIndex = null == opt_fromIndex ? 0 : 0 > opt_fromIndex ? Math.max(0, arr.length + opt_fromIndex) : opt_fromIndex;
1021   if (goog.isString(arr)) {
1022     return goog.isString(obj) && 1 == obj.length ? arr.indexOf(obj, fromIndex) : -1;
1023   }
1024   for (var i = fromIndex;i < arr.length;i++) {
1025     if (i in arr && arr[i] === obj) {
1026       return i;
1027     }
1028   }
1029   return-1;
1031 goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.lastIndexOf) ? function(arr, obj, opt_fromIndex) {
1032   goog.asserts.assert(null != arr.length);
1033   var fromIndex = null == opt_fromIndex ? arr.length - 1 : opt_fromIndex;
1034   return goog.array.ARRAY_PROTOTYPE_.lastIndexOf.call(arr, obj, fromIndex);
1035 } : function(arr, obj, opt_fromIndex) {
1036   var fromIndex = null == opt_fromIndex ? arr.length - 1 : opt_fromIndex;
1037   0 > fromIndex && (fromIndex = Math.max(0, arr.length + fromIndex));
1038   if (goog.isString(arr)) {
1039     return goog.isString(obj) && 1 == obj.length ? arr.lastIndexOf(obj, fromIndex) : -1;
1040   }
1041   for (var i = fromIndex;0 <= i;i--) {
1042     if (i in arr && arr[i] === obj) {
1043       return i;
1044     }
1045   }
1046   return-1;
1048 goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.forEach) ? function(arr, f, opt_obj) {
1049   goog.asserts.assert(null != arr.length);
1050   goog.array.ARRAY_PROTOTYPE_.forEach.call(arr, f, opt_obj);
1051 } : function(arr, f, opt_obj) {
1052   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
1053     i in arr2 && f.call(opt_obj, arr2[i], i, arr);
1054   }
1056 goog.array.forEachRight = function(arr, f, opt_obj) {
1057   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = l - 1;0 <= i;--i) {
1058     i in arr2 && f.call(opt_obj, arr2[i], i, arr);
1059   }
1061 goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.filter) ? function(arr, f, opt_obj) {
1062   goog.asserts.assert(null != arr.length);
1063   return goog.array.ARRAY_PROTOTYPE_.filter.call(arr, f, opt_obj);
1064 } : function(arr, f, opt_obj) {
1065   for (var l = arr.length, res = [], resLength = 0, arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
1066     if (i in arr2) {
1067       var val = arr2[i];
1068       f.call(opt_obj, val, i, arr) && (res[resLength++] = val);
1069     }
1070   }
1071   return res;
1073 goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.map) ? function(arr, f, opt_obj) {
1074   goog.asserts.assert(null != arr.length);
1075   return goog.array.ARRAY_PROTOTYPE_.map.call(arr, f, opt_obj);
1076 } : function(arr, f, opt_obj) {
1077   for (var l = arr.length, res = Array(l), arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
1078     i in arr2 && (res[i] = f.call(opt_obj, arr2[i], i, arr));
1079   }
1080   return res;
1082 goog.array.reduce = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.reduce) ? function(arr, f, val, opt_obj) {
1083   goog.asserts.assert(null != arr.length);
1084   opt_obj && (f = goog.bind(f, opt_obj));
1085   return goog.array.ARRAY_PROTOTYPE_.reduce.call(arr, f, val);
1086 } : function(arr, f, val$$0, opt_obj) {
1087   var rval = val$$0;
1088   goog.array.forEach(arr, function(val, index) {
1089     rval = f.call(opt_obj, rval, val, index, arr);
1090   });
1091   return rval;
1093 goog.array.reduceRight = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.reduceRight) ? function(arr, f, val, opt_obj) {
1094   goog.asserts.assert(null != arr.length);
1095   opt_obj && (f = goog.bind(f, opt_obj));
1096   return goog.array.ARRAY_PROTOTYPE_.reduceRight.call(arr, f, val);
1097 } : function(arr, f, val$$0, opt_obj) {
1098   var rval = val$$0;
1099   goog.array.forEachRight(arr, function(val, index) {
1100     rval = f.call(opt_obj, rval, val, index, arr);
1101   });
1102   return rval;
1104 goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.some) ? function(arr, f, opt_obj) {
1105   goog.asserts.assert(null != arr.length);
1106   return goog.array.ARRAY_PROTOTYPE_.some.call(arr, f, opt_obj);
1107 } : function(arr, f, opt_obj) {
1108   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
1109     if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) {
1110       return!0;
1111     }
1112   }
1113   return!1;
1115 goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.every) ? function(arr, f, opt_obj) {
1116   goog.asserts.assert(null != arr.length);
1117   return goog.array.ARRAY_PROTOTYPE_.every.call(arr, f, opt_obj);
1118 } : function(arr, f, opt_obj) {
1119   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
1120     if (i in arr2 && !f.call(opt_obj, arr2[i], i, arr)) {
1121       return!1;
1122     }
1123   }
1124   return!0;
1126 goog.array.count = function(arr$$0, f, opt_obj) {
1127   var count = 0;
1128   goog.array.forEach(arr$$0, function(element, index, arr) {
1129     f.call(opt_obj, element, index, arr) && ++count;
1130   }, opt_obj);
1131   return count;
1133 goog.array.find = function(arr, f, opt_obj) {
1134   var i = goog.array.findIndex(arr, f, opt_obj);
1135   return 0 > i ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];
1137 goog.array.findIndex = function(arr, f, opt_obj) {
1138   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
1139     if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) {
1140       return i;
1141     }
1142   }
1143   return-1;
1145 goog.array.findRight = function(arr, f, opt_obj) {
1146   var i = goog.array.findIndexRight(arr, f, opt_obj);
1147   return 0 > i ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];
1149 goog.array.findIndexRight = function(arr, f, opt_obj) {
1150   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = l - 1;0 <= i;i--) {
1151     if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) {
1152       return i;
1153     }
1154   }
1155   return-1;
1157 goog.array.contains = function(arr, obj) {
1158   return 0 <= goog.array.indexOf(arr, obj);
1160 goog.array.isEmpty = function(arr) {
1161   return 0 == arr.length;
1163 goog.array.clear = function(arr) {
1164   if (!goog.isArray(arr)) {
1165     for (var i = arr.length - 1;0 <= i;i--) {
1166       delete arr[i];
1167     }
1168   }
1169   arr.length = 0;
1171 goog.array.insert = function(arr, obj) {
1172   goog.array.contains(arr, obj) || arr.push(obj);
1174 goog.array.insertAt = function(arr, obj, opt_i) {
1175   goog.array.splice(arr, opt_i, 0, obj);
1177 goog.array.insertArrayAt = function(arr, elementsToAdd, opt_i) {
1178   goog.partial(goog.array.splice, arr, opt_i, 0).apply(null, elementsToAdd);
1180 goog.array.insertBefore = function(arr, obj, opt_obj2) {
1181   var i;
1182   2 == arguments.length || 0 > (i = goog.array.indexOf(arr, opt_obj2)) ? arr.push(obj) : goog.array.insertAt(arr, obj, i);
1184 goog.array.remove = function(arr, obj) {
1185   var i = goog.array.indexOf(arr, obj), rv;
1186   (rv = 0 <= i) && goog.array.removeAt(arr, i);
1187   return rv;
1189 goog.array.removeAt = function(arr, i) {
1190   goog.asserts.assert(null != arr.length);
1191   return 1 == goog.array.ARRAY_PROTOTYPE_.splice.call(arr, i, 1).length;
1193 goog.array.removeIf = function(arr, f, opt_obj) {
1194   var i = goog.array.findIndex(arr, f, opt_obj);
1195   return 0 <= i ? (goog.array.removeAt(arr, i), !0) : !1;
1197 goog.array.removeAllIf = function(arr, f, opt_obj) {
1198   var removedCount = 0;
1199   goog.array.forEachRight(arr, function(val, index) {
1200     f.call(opt_obj, val, index, arr) && goog.array.removeAt(arr, index) && removedCount++;
1201   });
1202   return removedCount;
1204 goog.array.concat = function(var_args) {
1205   return goog.array.ARRAY_PROTOTYPE_.concat.apply(goog.array.ARRAY_PROTOTYPE_, arguments);
1207 goog.array.join = function(var_args) {
1208   return goog.array.ARRAY_PROTOTYPE_.concat.apply(goog.array.ARRAY_PROTOTYPE_, arguments);
1210 goog.array.toArray = function(object) {
1211   var length = object.length;
1212   if (0 < length) {
1213     for (var rv = Array(length), i = 0;i < length;i++) {
1214       rv[i] = object[i];
1215     }
1216     return rv;
1217   }
1218   return[];
1220 goog.array.clone = goog.array.toArray;
1221 goog.array.extend = function(arr1, var_args) {
1222   for (var i = 1;i < arguments.length;i++) {
1223     var arr2 = arguments[i], isArrayLike;
1224     if (goog.isArray(arr2) || (isArrayLike = goog.isArrayLike(arr2)) && Object.prototype.hasOwnProperty.call(arr2, "callee")) {
1225       arr1.push.apply(arr1, arr2);
1226     } else {
1227       if (isArrayLike) {
1228         for (var len1 = arr1.length, len2 = arr2.length, j = 0;j < len2;j++) {
1229           arr1[len1 + j] = arr2[j];
1230         }
1231       } else {
1232         arr1.push(arr2);
1233       }
1234     }
1235   }
1237 goog.array.splice = function(arr, index, howMany, var_args) {
1238   goog.asserts.assert(null != arr.length);
1239   return goog.array.ARRAY_PROTOTYPE_.splice.apply(arr, goog.array.slice(arguments, 1));
1241 goog.array.slice = function(arr, start, opt_end) {
1242   goog.asserts.assert(null != arr.length);
1243   return 2 >= arguments.length ? goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start) : goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start, opt_end);
1245 goog.array.removeDuplicates = function(arr, opt_rv, opt_hashFn) {
1246   for (var returnArray = opt_rv || arr, defaultHashFn = function() {
1247     return goog.isObject(current) ? "o" + goog.getUid(current) : (typeof current).charAt(0) + current;
1248   }, hashFn = opt_hashFn || defaultHashFn, seen = {}, cursorInsert = 0, cursorRead = 0;cursorRead < arr.length;) {
1249     var current = arr[cursorRead++], key = hashFn(current);
1250     Object.prototype.hasOwnProperty.call(seen, key) || (seen[key] = !0, returnArray[cursorInsert++] = current);
1251   }
1252   returnArray.length = cursorInsert;
1254 goog.array.binarySearch = function(arr, target, opt_compareFn) {
1255   return goog.array.binarySearch_(arr, opt_compareFn || goog.array.defaultCompare, !1, target);
1257 goog.array.binarySelect = function(arr, evaluator, opt_obj) {
1258   return goog.array.binarySearch_(arr, evaluator, !0, void 0, opt_obj);
1260 goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target, opt_selfObj) {
1261   for (var left = 0, right = arr.length, found;left < right;) {
1262     var middle = left + right >> 1, compareResult;
1263     compareResult = isEvaluator ? compareFn.call(opt_selfObj, arr[middle], middle, arr) : compareFn(opt_target, arr[middle]);
1264     0 < compareResult ? left = middle + 1 : (right = middle, found = !compareResult);
1265   }
1266   return found ? left : ~left;
1268 goog.array.sort = function(arr, opt_compareFn) {
1269   arr.sort(opt_compareFn || goog.array.defaultCompare);
1271 goog.array.stableSort = function(arr, opt_compareFn) {
1272   function stableCompareFn(obj1, obj2) {
1273     return valueCompareFn(obj1.value, obj2.value) || obj1.index - obj2.index;
1274   }
1275   for (var i = 0;i < arr.length;i++) {
1276     arr[i] = {index:i, value:arr[i]};
1277   }
1278   var valueCompareFn = opt_compareFn || goog.array.defaultCompare;
1279   goog.array.sort(arr, stableCompareFn);
1280   for (i = 0;i < arr.length;i++) {
1281     arr[i] = arr[i].value;
1282   }
1284 goog.array.sortByKey = function(arr, keyFn, opt_compareFn) {
1285   var keyCompareFn = opt_compareFn || goog.array.defaultCompare;
1286   goog.array.sort(arr, function(a, b) {
1287     return keyCompareFn(keyFn(a), keyFn(b));
1288   });
1290 goog.array.sortObjectsByKey = function(arr, key, opt_compareFn) {
1291   goog.array.sortByKey(arr, function(obj) {
1292     return obj[key];
1293   }, opt_compareFn);
1295 goog.array.isSorted = function(arr, opt_compareFn, opt_strict) {
1296   for (var compare = opt_compareFn || goog.array.defaultCompare, i = 1;i < arr.length;i++) {
1297     var compareResult = compare(arr[i - 1], arr[i]);
1298     if (0 < compareResult || 0 == compareResult && opt_strict) {
1299       return!1;
1300     }
1301   }
1302   return!0;
1304 goog.array.equals = function(arr1, arr2, opt_equalsFn) {
1305   if (!goog.isArrayLike(arr1) || !goog.isArrayLike(arr2) || arr1.length != arr2.length) {
1306     return!1;
1307   }
1308   for (var l = arr1.length, equalsFn = opt_equalsFn || goog.array.defaultCompareEquality, i = 0;i < l;i++) {
1309     if (!equalsFn(arr1[i], arr2[i])) {
1310       return!1;
1311     }
1312   }
1313   return!0;
1315 goog.array.compare3 = function(arr1, arr2, opt_compareFn) {
1316   for (var compare = opt_compareFn || goog.array.defaultCompare, l = Math.min(arr1.length, arr2.length), i = 0;i < l;i++) {
1317     var result = compare(arr1[i], arr2[i]);
1318     if (0 != result) {
1319       return result;
1320     }
1321   }
1322   return goog.array.defaultCompare(arr1.length, arr2.length);
1324 goog.array.defaultCompare = function(a, b) {
1325   return a > b ? 1 : a < b ? -1 : 0;
1327 goog.array.defaultCompareEquality = function(a, b) {
1328   return a === b;
1330 goog.array.binaryInsert = function(array, value, opt_compareFn) {
1331   var index = goog.array.binarySearch(array, value, opt_compareFn);
1332   return 0 > index ? (goog.array.insertAt(array, value, -(index + 1)), !0) : !1;
1334 goog.array.binaryRemove = function(array, value, opt_compareFn) {
1335   var index = goog.array.binarySearch(array, value, opt_compareFn);
1336   return 0 <= index ? goog.array.removeAt(array, index) : !1;
1338 goog.array.bucket = function(array, sorter, opt_obj) {
1339   for (var buckets = {}, i = 0;i < array.length;i++) {
1340     var value = array[i], key = sorter.call(opt_obj, value, i, array);
1341     if (goog.isDef(key)) {
1342       var bucket = buckets[key] || (buckets[key] = []);
1343       bucket.push(value);
1344     }
1345   }
1346   return buckets;
1348 goog.array.toObject = function(arr, keyFunc, opt_obj) {
1349   var ret = {};
1350   goog.array.forEach(arr, function(element, index) {
1351     ret[keyFunc.call(opt_obj, element, index, arr)] = element;
1352   });
1353   return ret;
1355 goog.array.range = function(startOrEnd, opt_end, opt_step) {
1356   var array = [], start = 0, end = startOrEnd, step = opt_step || 1;
1357   void 0 !== opt_end && (start = startOrEnd, end = opt_end);
1358   if (0 > step * (end - start)) {
1359     return[];
1360   }
1361   if (0 < step) {
1362     for (var i = start;i < end;i += step) {
1363       array.push(i);
1364     }
1365   } else {
1366     for (i = start;i > end;i += step) {
1367       array.push(i);
1368     }
1369   }
1370   return array;
1372 goog.array.repeat = function(value, n) {
1373   for (var array = [], i = 0;i < n;i++) {
1374     array[i] = value;
1375   }
1376   return array;
1378 goog.array.flatten = function(var_args) {
1379   for (var result = [], i = 0;i < arguments.length;i++) {
1380     var element = arguments[i];
1381     goog.isArray(element) ? result.push.apply(result, goog.array.flatten.apply(null, element)) : result.push(element);
1382   }
1383   return result;
1385 goog.array.rotate = function(array, n) {
1386   goog.asserts.assert(null != array.length);
1387   array.length && (n %= array.length, 0 < n ? goog.array.ARRAY_PROTOTYPE_.unshift.apply(array, array.splice(-n, n)) : 0 > n && goog.array.ARRAY_PROTOTYPE_.push.apply(array, array.splice(0, -n)));
1388   return array;
1390 goog.array.moveItem = function(arr, fromIndex, toIndex) {
1391   goog.asserts.assert(0 <= fromIndex && fromIndex < arr.length);
1392   goog.asserts.assert(0 <= toIndex && toIndex < arr.length);
1393   var removedItems = goog.array.ARRAY_PROTOTYPE_.splice.call(arr, fromIndex, 1);
1394   goog.array.ARRAY_PROTOTYPE_.splice.call(arr, toIndex, 0, removedItems[0]);
1396 goog.array.zip = function(var_args) {
1397   if (!arguments.length) {
1398     return[];
1399   }
1400   for (var result = [], i = 0;;i++) {
1401     for (var value = [], j = 0;j < arguments.length;j++) {
1402       var arr = arguments[j];
1403       if (i >= arr.length) {
1404         return result;
1405       }
1406       value.push(arr[i]);
1407     }
1408     result.push(value);
1409   }
1411 goog.array.shuffle = function(arr, opt_randFn) {
1412   for (var randFn = opt_randFn || Math.random, i = arr.length - 1;0 < i;i--) {
1413     var j = Math.floor(randFn() * (i + 1)), tmp = arr[i];
1414     arr[i] = arr[j];
1415     arr[j] = tmp;
1416   }
1418 goog.math = {};
1419 goog.math.randomInt = function(a) {
1420   return Math.floor(Math.random() * a);
1422 goog.math.uniformRandom = function(a, b) {
1423   return a + Math.random() * (b - a);
1425 goog.math.clamp = function(value, min, max) {
1426   return Math.min(Math.max(value, min), max);
1428 goog.math.modulo = function(a, b) {
1429   var r = a % b;
1430   return 0 > r * b ? r + b : r;
1432 goog.math.lerp = function(a, b, x) {
1433   return a + x * (b - a);
1435 goog.math.nearlyEquals = function(a, b, opt_tolerance) {
1436   return Math.abs(a - b) <= (opt_tolerance || 1E-6);
1438 goog.math.standardAngle = function(angle) {
1439   return goog.math.modulo(angle, 360);
1441 goog.math.standardAngleInRadians = function(angle) {
1442   return goog.math.modulo(angle, 2 * Math.PI);
1444 goog.math.toRadians = function(angleDegrees) {
1445   return angleDegrees * Math.PI / 180;
1447 goog.math.toDegrees = function(angleRadians) {
1448   return 180 * angleRadians / Math.PI;
1450 goog.math.angleDx = function(degrees, radius) {
1451   return radius * Math.cos(goog.math.toRadians(degrees));
1453 goog.math.angleDy = function(degrees, radius) {
1454   return radius * Math.sin(goog.math.toRadians(degrees));
1456 goog.math.angle = function(x1, y1, x2, y2) {
1457   return goog.math.standardAngle(goog.math.toDegrees(Math.atan2(y2 - y1, x2 - x1)));
1459 goog.math.angleDifference = function(startAngle, endAngle) {
1460   var d = goog.math.standardAngle(endAngle) - goog.math.standardAngle(startAngle);
1461   180 < d ? d -= 360 : -180 >= d && (d = 360 + d);
1462   return d;
1464 goog.math.sign = function(x) {
1465   return 0 == x ? 0 : 0 > x ? -1 : 1;
1467 goog.math.longestCommonSubsequence = function(array1, array2, opt_compareFn, opt_collectorFn) {
1468   for (var compare = opt_compareFn || function(a, b) {
1469     return a == b;
1470   }, collect = opt_collectorFn || function(i1) {
1471     return array1[i1];
1472   }, length1 = array1.length, length2 = array2.length, arr = [], i = 0;i < length1 + 1;i++) {
1473     arr[i] = [], arr[i][0] = 0;
1474   }
1475   for (var j = 0;j < length2 + 1;j++) {
1476     arr[0][j] = 0;
1477   }
1478   for (i = 1;i <= length1;i++) {
1479     for (j = 1;j <= length2;j++) {
1480       compare(array1[i - 1], array2[j - 1]) ? arr[i][j] = arr[i - 1][j - 1] + 1 : arr[i][j] = Math.max(arr[i - 1][j], arr[i][j - 1]);
1481     }
1482   }
1483   for (var result = [], i = length1, j = length2;0 < i && 0 < j;) {
1484     compare(array1[i - 1], array2[j - 1]) ? (result.unshift(collect(i - 1, j - 1)), i--, j--) : arr[i - 1][j] > arr[i][j - 1] ? i-- : j--;
1485   }
1486   return result;
1488 goog.math.sum = function(var_args) {
1489   return goog.array.reduce(arguments, function(sum, value) {
1490     return sum + value;
1491   }, 0);
1493 goog.math.average = function(var_args) {
1494   return goog.math.sum.apply(null, arguments) / arguments.length;
1496 goog.math.sampleVariance = function(var_args) {
1497   var sampleSize = arguments.length;
1498   if (2 > sampleSize) {
1499     return 0;
1500   }
1501   var mean = goog.math.average.apply(null, arguments), variance = goog.math.sum.apply(null, goog.array.map(arguments, function(val) {
1502     return Math.pow(val - mean, 2);
1503   })) / (sampleSize - 1);
1504   return variance;
1506 goog.math.standardDeviation = function(var_args) {
1507   return Math.sqrt(goog.math.sampleVariance.apply(null, arguments));
1509 goog.math.isInt = function(num) {
1510   return isFinite(num) && 0 == num % 1;
1512 goog.math.isFiniteNumber = function(num) {
1513   return isFinite(num) && !isNaN(num);
1515 goog.math.log10Floor = function(num) {
1516   if (0 < num) {
1517     var x = Math.round(Math.log(num) * Math.LOG10E);
1518     return x - (parseFloat("1e" + x) > num);
1519   }
1520   return 0 == num ? -Infinity : NaN;
1522 goog.math.safeFloor = function(num, opt_epsilon) {
1523   goog.asserts.assert(!goog.isDef(opt_epsilon) || 0 < opt_epsilon);
1524   return Math.floor(num + (opt_epsilon || 2E-15));
1526 goog.math.safeCeil = function(num, opt_epsilon) {
1527   goog.asserts.assert(!goog.isDef(opt_epsilon) || 0 < opt_epsilon);
1528   return Math.ceil(num - (opt_epsilon || 2E-15));
1530 goog.math.Coordinate = function(opt_x, opt_y) {
1531   this.x = goog.isDef(opt_x) ? opt_x : 0;
1532   this.y = goog.isDef(opt_y) ? opt_y : 0;
1534 goog.math.Coordinate.prototype.clone = function() {
1535   return new goog.math.Coordinate(this.x, this.y);
1537 goog.DEBUG && (goog.math.Coordinate.prototype.toString = function() {
1538   return "(" + this.x + ", " + this.y + ")";
1540 goog.math.Coordinate.equals = function(a, b) {
1541   return a == b ? !0 : a && b ? a.x == b.x && a.y == b.y : !1;
1543 goog.math.Coordinate.distance = function(a, b) {
1544   var dx = a.x - b.x, dy = a.y - b.y;
1545   return Math.sqrt(dx * dx + dy * dy);
1547 goog.math.Coordinate.magnitude = function(a) {
1548   return Math.sqrt(a.x * a.x + a.y * a.y);
1550 goog.math.Coordinate.azimuth = function(a) {
1551   return goog.math.angle(0, 0, a.x, a.y);
1553 goog.math.Coordinate.squaredDistance = function(a, b) {
1554   var dx = a.x - b.x, dy = a.y - b.y;
1555   return dx * dx + dy * dy;
1557 goog.math.Coordinate.difference = function(a, b) {
1558   return new goog.math.Coordinate(a.x - b.x, a.y - b.y);
1560 goog.math.Coordinate.sum = function(a, b) {
1561   return new goog.math.Coordinate(a.x + b.x, a.y + b.y);
1563 goog.math.Coordinate.prototype.ceil = function() {
1564   this.x = Math.ceil(this.x);
1565   this.y = Math.ceil(this.y);
1566   return this;
1568 goog.math.Coordinate.prototype.floor = function() {
1569   this.x = Math.floor(this.x);
1570   this.y = Math.floor(this.y);
1571   return this;
1573 goog.math.Coordinate.prototype.round = function() {
1574   this.x = Math.round(this.x);
1575   this.y = Math.round(this.y);
1576   return this;
1578 goog.math.Coordinate.prototype.translate = function(tx, opt_ty) {
1579   tx instanceof goog.math.Coordinate ? (this.x += tx.x, this.y += tx.y) : (this.x += tx, goog.isNumber(opt_ty) && (this.y += opt_ty));
1580   return this;
1582 goog.math.Coordinate.prototype.scale = function(sx, opt_sy) {
1583   var sy = goog.isNumber(opt_sy) ? opt_sy : sx;
1584   this.x *= sx;
1585   this.y *= sy;
1586   return this;
1588 goog.math.Size = function(width, height) {
1589   this.width = width;
1590   this.height = height;
1592 goog.math.Size.equals = function(a, b) {
1593   return a == b ? !0 : a && b ? a.width == b.width && a.height == b.height : !1;
1595 goog.math.Size.prototype.clone = function() {
1596   return new goog.math.Size(this.width, this.height);
1598 goog.DEBUG && (goog.math.Size.prototype.toString = function() {
1599   return "(" + this.width + " x " + this.height + ")";
1601 goog.math.Size.prototype.area = function() {
1602   return this.width * this.height;
1604 goog.math.Size.prototype.isEmpty = function() {
1605   return!this.area();
1607 goog.math.Size.prototype.ceil = function() {
1608   this.width = Math.ceil(this.width);
1609   this.height = Math.ceil(this.height);
1610   return this;
1612 goog.math.Size.prototype.floor = function() {
1613   this.width = Math.floor(this.width);
1614   this.height = Math.floor(this.height);
1615   return this;
1617 goog.math.Size.prototype.round = function() {
1618   this.width = Math.round(this.width);
1619   this.height = Math.round(this.height);
1620   return this;
1622 goog.math.Size.prototype.scale = function(sx, opt_sy) {
1623   var sy = goog.isNumber(opt_sy) ? opt_sy : sx;
1624   this.width *= sx;
1625   this.height *= sy;
1626   return this;
1628 goog.object = {};
1629 goog.object.forEach = function(obj, f, opt_obj) {
1630   for (var key in obj) {
1631     f.call(opt_obj, obj[key], key, obj);
1632   }
1634 goog.object.filter = function(obj, f, opt_obj) {
1635   var res = {}, key;
1636   for (key in obj) {
1637     f.call(opt_obj, obj[key], key, obj) && (res[key] = obj[key]);
1638   }
1639   return res;
1641 goog.object.map = function(obj, f, opt_obj) {
1642   var res = {}, key;
1643   for (key in obj) {
1644     res[key] = f.call(opt_obj, obj[key], key, obj);
1645   }
1646   return res;
1648 goog.object.some = function(obj, f, opt_obj) {
1649   for (var key in obj) {
1650     if (f.call(opt_obj, obj[key], key, obj)) {
1651       return!0;
1652     }
1653   }
1654   return!1;
1656 goog.object.every = function(obj, f, opt_obj) {
1657   for (var key in obj) {
1658     if (!f.call(opt_obj, obj[key], key, obj)) {
1659       return!1;
1660     }
1661   }
1662   return!0;
1664 goog.object.getCount = function(obj) {
1665   var rv = 0, key;
1666   for (key in obj) {
1667     rv++;
1668   }
1669   return rv;
1671 goog.object.getAnyKey = function(obj) {
1672   for (var key in obj) {
1673     return key;
1674   }
1676 goog.object.getAnyValue = function(obj) {
1677   for (var key in obj) {
1678     return obj[key];
1679   }
1681 goog.object.contains = function(obj, val) {
1682   return goog.object.containsValue(obj, val);
1684 goog.object.getValues = function(obj) {
1685   var res = [], i = 0, key;
1686   for (key in obj) {
1687     res[i++] = obj[key];
1688   }
1689   return res;
1691 goog.object.getKeys = function(obj) {
1692   var res = [], i = 0, key;
1693   for (key in obj) {
1694     res[i++] = key;
1695   }
1696   return res;
1698 goog.object.getValueByKeys = function(obj, var_args) {
1699   for (var isArrayLike = goog.isArrayLike(var_args), keys = isArrayLike ? var_args : arguments, i = isArrayLike ? 0 : 1;i < keys.length && (obj = obj[keys[i]], goog.isDef(obj));i++) {
1700   }
1701   return obj;
1703 goog.object.containsKey = function(obj, key) {
1704   return key in obj;
1706 goog.object.containsValue = function(obj, val) {
1707   for (var key in obj) {
1708     if (obj[key] == val) {
1709       return!0;
1710     }
1711   }
1712   return!1;
1714 goog.object.findKey = function(obj, f, opt_this) {
1715   for (var key in obj) {
1716     if (f.call(opt_this, obj[key], key, obj)) {
1717       return key;
1718     }
1719   }
1721 goog.object.findValue = function(obj, f, opt_this) {
1722   var key = goog.object.findKey(obj, f, opt_this);
1723   return key && obj[key];
1725 goog.object.isEmpty = function(obj) {
1726   for (var key in obj) {
1727     return!1;
1728   }
1729   return!0;
1731 goog.object.clear = function(obj) {
1732   for (var i in obj) {
1733     delete obj[i];
1734   }
1736 goog.object.remove = function(obj, key) {
1737   var rv;
1738   (rv = key in obj) && delete obj[key];
1739   return rv;
1741 goog.object.add = function(obj, key, val) {
1742   if (key in obj) {
1743     throw Error('The object already contains the key "' + key + '"');
1744   }
1745   goog.object.set(obj, key, val);
1747 goog.object.get = function(obj, key, opt_val) {
1748   return key in obj ? obj[key] : opt_val;
1750 goog.object.set = function(obj, key, value) {
1751   obj[key] = value;
1753 goog.object.setIfUndefined = function(obj, key, value) {
1754   return key in obj ? obj[key] : obj[key] = value;
1756 goog.object.equals = function(a, b) {
1757   if (!goog.array.equals(goog.object.getKeys(a), goog.object.getKeys(b))) {
1758     return!1;
1759   }
1760   for (var k in a) {
1761     if (a[k] !== b[k]) {
1762       return!1;
1763     }
1764   }
1765   return!0;
1767 goog.object.clone = function(obj) {
1768   var res = {}, key;
1769   for (key in obj) {
1770     res[key] = obj[key];
1771   }
1772   return res;
1774 goog.object.unsafeClone = function(obj) {
1775   var type = goog.typeOf(obj);
1776   if ("object" == type || "array" == type) {
1777     if (obj.clone) {
1778       return obj.clone();
1779     }
1780     var clone = "array" == type ? [] : {}, key;
1781     for (key in obj) {
1782       clone[key] = goog.object.unsafeClone(obj[key]);
1783     }
1784     return clone;
1785   }
1786   return obj;
1788 goog.object.transpose = function(obj) {
1789   var transposed = {}, key;
1790   for (key in obj) {
1791     transposed[obj[key]] = key;
1792   }
1793   return transposed;
1795 goog.object.PROTOTYPE_FIELDS_ = "constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");
1796 goog.object.extend = function(target, var_args) {
1797   for (var key, source, i = 1;i < arguments.length;i++) {
1798     source = arguments[i];
1799     for (key in source) {
1800       target[key] = source[key];
1801     }
1802     for (var j = 0;j < goog.object.PROTOTYPE_FIELDS_.length;j++) {
1803       key = goog.object.PROTOTYPE_FIELDS_[j], Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
1804     }
1805   }
1807 goog.object.create = function(var_args) {
1808   var argLength = arguments.length;
1809   if (1 == argLength && goog.isArray(arguments[0])) {
1810     return goog.object.create.apply(null, arguments[0]);
1811   }
1812   if (argLength % 2) {
1813     throw Error("Uneven number of arguments");
1814   }
1815   for (var rv = {}, i = 0;i < argLength;i += 2) {
1816     rv[arguments[i]] = arguments[i + 1];
1817   }
1818   return rv;
1820 goog.object.createSet = function(var_args) {
1821   var argLength = arguments.length;
1822   if (1 == argLength && goog.isArray(arguments[0])) {
1823     return goog.object.createSet.apply(null, arguments[0]);
1824   }
1825   for (var rv = {}, i = 0;i < argLength;i++) {
1826     rv[arguments[i]] = !0;
1827   }
1828   return rv;
1830 goog.object.createImmutableView = function(obj) {
1831   var result = obj;
1832   Object.isFrozen && !Object.isFrozen(obj) && (result = Object.create(obj), Object.freeze(result));
1833   return result;
1835 goog.object.isImmutableView = function(obj) {
1836   return!!Object.isFrozen && Object.isFrozen(obj);
1838 goog.labs = {};
1839 goog.labs.userAgent = {};
1840 goog.labs.userAgent.util = {};
1841 goog.labs.userAgent.util.getNativeUserAgentString_ = function() {
1842   var navigator = goog.labs.userAgent.util.getNavigator_();
1843   if (navigator) {
1844     var userAgent = navigator.userAgent;
1845     if (userAgent) {
1846       return userAgent;
1847     }
1848   }
1849   return "";
1851 goog.labs.userAgent.util.getNavigator_ = function() {
1852   return goog.global.navigator;
1854 goog.labs.userAgent.util.userAgent_ = goog.labs.userAgent.util.getNativeUserAgentString_();
1855 goog.labs.userAgent.util.setUserAgent = function(opt_userAgent) {
1856   goog.labs.userAgent.util.userAgent_ = opt_userAgent || goog.labs.userAgent.util.getNativeUserAgentString_();
1858 goog.labs.userAgent.util.getUserAgent = function() {
1859   return goog.labs.userAgent.util.userAgent_;
1861 goog.labs.userAgent.util.matchUserAgent = function(str) {
1862   var userAgent = goog.labs.userAgent.util.getUserAgent();
1863   return goog.string.contains(userAgent, str);
1865 goog.labs.userAgent.util.matchUserAgentIgnoreCase = function(str) {
1866   var userAgent = goog.labs.userAgent.util.getUserAgent();
1867   return goog.string.caseInsensitiveContains(userAgent, str);
1869 goog.labs.userAgent.util.extractVersionTuples = function(userAgent) {
1870   for (var versionRegExp = RegExp("(\\w[\\w ]+)/([^\\s]+)\\s*(?:\\((.*?)\\))?", "g"), data = [], match;match = versionRegExp.exec(userAgent);) {
1871     data.push([match[1], match[2], match[3] || void 0]);
1872   }
1873   return data;
1875 goog.labs.userAgent.browser = {};
1876 goog.labs.userAgent.browser.matchOpera_ = function() {
1877   return goog.labs.userAgent.util.matchUserAgent("Opera") || goog.labs.userAgent.util.matchUserAgent("OPR");
1879 goog.labs.userAgent.browser.matchIE_ = function() {
1880   return goog.labs.userAgent.util.matchUserAgent("Trident") || goog.labs.userAgent.util.matchUserAgent("MSIE");
1882 goog.labs.userAgent.browser.matchFirefox_ = function() {
1883   return goog.labs.userAgent.util.matchUserAgent("Firefox");
1885 goog.labs.userAgent.browser.matchSafari_ = function() {
1886   return goog.labs.userAgent.util.matchUserAgent("Safari") && !goog.labs.userAgent.util.matchUserAgent("Chrome") && !goog.labs.userAgent.util.matchUserAgent("CriOS") && !goog.labs.userAgent.util.matchUserAgent("Android");
1888 goog.labs.userAgent.browser.matchChrome_ = function() {
1889   return goog.labs.userAgent.util.matchUserAgent("Chrome") || goog.labs.userAgent.util.matchUserAgent("CriOS");
1891 goog.labs.userAgent.browser.matchAndroidBrowser_ = function() {
1892   return!goog.labs.userAgent.browser.isChrome() && goog.labs.userAgent.util.matchUserAgent("Android");
1894 goog.labs.userAgent.browser.isOpera = goog.labs.userAgent.browser.matchOpera_;
1895 goog.labs.userAgent.browser.isIE = goog.labs.userAgent.browser.matchIE_;
1896 goog.labs.userAgent.browser.isFirefox = goog.labs.userAgent.browser.matchFirefox_;
1897 goog.labs.userAgent.browser.isSafari = goog.labs.userAgent.browser.matchSafari_;
1898 goog.labs.userAgent.browser.isChrome = goog.labs.userAgent.browser.matchChrome_;
1899 goog.labs.userAgent.browser.isAndroidBrowser = goog.labs.userAgent.browser.matchAndroidBrowser_;
1900 goog.labs.userAgent.browser.isSilk = function() {
1901   return goog.labs.userAgent.util.matchUserAgent("Silk");
1903 goog.labs.userAgent.browser.getVersion = function() {
1904   function lookUpValueWithKeys(keys) {
1905     var key = goog.array.find(keys, versionMapHasKey);
1906     return versionMap[key] || "";
1907   }
1908   var userAgentString = goog.labs.userAgent.util.getUserAgent();
1909   if (goog.labs.userAgent.browser.isIE()) {
1910     return goog.labs.userAgent.browser.getIEVersion_(userAgentString);
1911   }
1912   var versionTuples = goog.labs.userAgent.util.extractVersionTuples(userAgentString), versionMap = {};
1913   goog.array.forEach(versionTuples, function(tuple) {
1914     var key = tuple[0], value = tuple[1];
1915     versionMap[key] = value;
1916   });
1917   var versionMapHasKey = goog.partial(goog.object.containsKey, versionMap);
1918   if (goog.labs.userAgent.browser.isOpera()) {
1919     return lookUpValueWithKeys(["Version", "Opera", "OPR"]);
1920   }
1921   if (goog.labs.userAgent.browser.isChrome()) {
1922     return lookUpValueWithKeys(["Chrome", "CriOS"]);
1923   }
1924   var tuple = versionTuples[2];
1925   return tuple && tuple[1] || "";
1927 goog.labs.userAgent.browser.isVersionOrHigher = function(version) {
1928   return 0 <= goog.string.compareVersions(goog.labs.userAgent.browser.getVersion(), version);
1930 goog.labs.userAgent.browser.getIEVersion_ = function(userAgent) {
1931   var rv = /rv: *([\d\.]*)/.exec(userAgent);
1932   if (rv && rv[1]) {
1933     return rv[1];
1934   }
1935   var version = "", msie = /MSIE +([\d\.]+)/.exec(userAgent);
1936   if (msie && msie[1]) {
1937     var tridentVersion = /Trident\/(\d.\d)/.exec(userAgent);
1938     if ("7.0" == msie[1]) {
1939       if (tridentVersion && tridentVersion[1]) {
1940         switch(tridentVersion[1]) {
1941           case "4.0":
1942             version = "8.0";
1943             break;
1944           case "5.0":
1945             version = "9.0";
1946             break;
1947           case "6.0":
1948             version = "10.0";
1949             break;
1950           case "7.0":
1951             version = "11.0";
1952         }
1953       } else {
1954         version = "7.0";
1955       }
1956     } else {
1957       version = msie[1];
1958     }
1959   }
1960   return version;
1962 goog.labs.userAgent.engine = {};
1963 goog.labs.userAgent.engine.isPresto = function() {
1964   return goog.labs.userAgent.util.matchUserAgent("Presto");
1966 goog.labs.userAgent.engine.isTrident = function() {
1967   return goog.labs.userAgent.util.matchUserAgent("Trident") || goog.labs.userAgent.util.matchUserAgent("MSIE");
1969 goog.labs.userAgent.engine.isWebKit = function() {
1970   return goog.labs.userAgent.util.matchUserAgentIgnoreCase("WebKit");
1972 goog.labs.userAgent.engine.isGecko = function() {
1973   return goog.labs.userAgent.util.matchUserAgent("Gecko") && !goog.labs.userAgent.engine.isWebKit() && !goog.labs.userAgent.engine.isTrident();
1975 goog.labs.userAgent.engine.getVersion = function() {
1976   var userAgentString = goog.labs.userAgent.util.getUserAgent();
1977   if (userAgentString) {
1978     var tuples = goog.labs.userAgent.util.extractVersionTuples(userAgentString), engineTuple = tuples[1];
1979     if (engineTuple) {
1980       return "Gecko" == engineTuple[0] ? goog.labs.userAgent.engine.getVersionForKey_(tuples, "Firefox") : engineTuple[1];
1981     }
1982     var browserTuple = tuples[0], info;
1983     if (browserTuple && (info = browserTuple[2])) {
1984       var match = /Trident\/([^\s;]+)/.exec(info);
1985       if (match) {
1986         return match[1];
1987       }
1988     }
1989   }
1990   return "";
1992 goog.labs.userAgent.engine.isVersionOrHigher = function(version) {
1993   return 0 <= goog.string.compareVersions(goog.labs.userAgent.engine.getVersion(), version);
1995 goog.labs.userAgent.engine.getVersionForKey_ = function(tuples, key) {
1996   var pair = goog.array.find(tuples, function(pair) {
1997     return key == pair[0];
1998   });
1999   return pair && pair[1] || "";
2001 goog.userAgent = {};
2002 goog.userAgent.ASSUME_IE = !1;
2003 goog.userAgent.ASSUME_GECKO = !1;
2004 goog.userAgent.ASSUME_WEBKIT = !1;
2005 goog.userAgent.ASSUME_MOBILE_WEBKIT = !1;
2006 goog.userAgent.ASSUME_OPERA = !1;
2007 goog.userAgent.ASSUME_ANY_VERSION = !1;
2008 goog.userAgent.BROWSER_KNOWN_ = goog.userAgent.ASSUME_IE || goog.userAgent.ASSUME_GECKO || goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_OPERA;
2009 goog.userAgent.getUserAgentString = function() {
2010   return goog.labs.userAgent.util.getUserAgent();
2012 goog.userAgent.getNavigator = function() {
2013   return goog.global.navigator || null;
2015 goog.userAgent.OPERA = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_OPERA : goog.labs.userAgent.browser.isOpera();
2016 goog.userAgent.IE = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_IE : goog.labs.userAgent.browser.isIE();
2017 goog.userAgent.GECKO = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_GECKO : goog.labs.userAgent.engine.isGecko();
2018 goog.userAgent.WEBKIT = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_MOBILE_WEBKIT : goog.labs.userAgent.engine.isWebKit();
2019 goog.userAgent.isMobile_ = function() {
2020   return goog.userAgent.WEBKIT && goog.labs.userAgent.util.matchUserAgent("Mobile");
2022 goog.userAgent.MOBILE = goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.isMobile_();
2023 goog.userAgent.SAFARI = goog.userAgent.WEBKIT;
2024 goog.userAgent.determinePlatform_ = function() {
2025   var navigator = goog.userAgent.getNavigator();
2026   return navigator && navigator.platform || "";
2028 goog.userAgent.PLATFORM = goog.userAgent.determinePlatform_();
2029 goog.userAgent.ASSUME_MAC = !1;
2030 goog.userAgent.ASSUME_WINDOWS = !1;
2031 goog.userAgent.ASSUME_LINUX = !1;
2032 goog.userAgent.ASSUME_X11 = !1;
2033 goog.userAgent.ASSUME_ANDROID = !1;
2034 goog.userAgent.ASSUME_IPHONE = !1;
2035 goog.userAgent.ASSUME_IPAD = !1;
2036 goog.userAgent.PLATFORM_KNOWN_ = goog.userAgent.ASSUME_MAC || goog.userAgent.ASSUME_WINDOWS || goog.userAgent.ASSUME_LINUX || goog.userAgent.ASSUME_X11 || goog.userAgent.ASSUME_ANDROID || goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD;
2037 goog.userAgent.initPlatform_ = function() {
2038   goog.userAgent.detectedMac_ = goog.string.contains(goog.userAgent.PLATFORM, "Mac");
2039   goog.userAgent.detectedWindows_ = goog.string.contains(goog.userAgent.PLATFORM, "Win");
2040   goog.userAgent.detectedLinux_ = goog.string.contains(goog.userAgent.PLATFORM, "Linux");
2041   goog.userAgent.detectedX11_ = !!goog.userAgent.getNavigator() && goog.string.contains(goog.userAgent.getNavigator().appVersion || "", "X11");
2042   var ua = goog.userAgent.getUserAgentString();
2043   goog.userAgent.detectedAndroid_ = !!ua && goog.string.contains(ua, "Android");
2044   goog.userAgent.detectedIPhone_ = !!ua && goog.string.contains(ua, "iPhone");
2045   goog.userAgent.detectedIPad_ = !!ua && goog.string.contains(ua, "iPad");
2047 goog.userAgent.PLATFORM_KNOWN_ || goog.userAgent.initPlatform_();
2048 goog.userAgent.MAC = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_MAC : goog.userAgent.detectedMac_;
2049 goog.userAgent.WINDOWS = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_WINDOWS : goog.userAgent.detectedWindows_;
2050 goog.userAgent.LINUX = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_LINUX : goog.userAgent.detectedLinux_;
2051 goog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_X11 : goog.userAgent.detectedX11_;
2052 goog.userAgent.ANDROID = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_ANDROID : goog.userAgent.detectedAndroid_;
2053 goog.userAgent.IPHONE = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPHONE : goog.userAgent.detectedIPhone_;
2054 goog.userAgent.IPAD = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPAD : goog.userAgent.detectedIPad_;
2055 goog.userAgent.determineVersion_ = function() {
2056   var version = "", re;
2057   if (goog.userAgent.OPERA && goog.global.opera) {
2058     var operaVersion = goog.global.opera.version;
2059     return goog.isFunction(operaVersion) ? operaVersion() : operaVersion;
2060   }
2061   goog.userAgent.GECKO ? re = /rv\:([^\);]+)(\)|;)/ : goog.userAgent.IE ? re = /\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/ : goog.userAgent.WEBKIT && (re = /WebKit\/(\S+)/);
2062   if (re) {
2063     var arr = re.exec(goog.userAgent.getUserAgentString()), version = arr ? arr[1] : ""
2064   }
2065   if (goog.userAgent.IE) {
2066     var docMode = goog.userAgent.getDocumentMode_();
2067     if (docMode > parseFloat(version)) {
2068       return String(docMode);
2069     }
2070   }
2071   return version;
2073 goog.userAgent.getDocumentMode_ = function() {
2074   var doc = goog.global.document;
2075   return doc ? doc.documentMode : void 0;
2077 goog.userAgent.VERSION = goog.userAgent.determineVersion_();
2078 goog.userAgent.compare = function(v1, v2) {
2079   return goog.string.compareVersions(v1, v2);
2081 goog.userAgent.isVersionOrHigherCache_ = {};
2082 goog.userAgent.isVersionOrHigher = function(version) {
2083   return goog.userAgent.ASSUME_ANY_VERSION || goog.userAgent.isVersionOrHigherCache_[version] || (goog.userAgent.isVersionOrHigherCache_[version] = 0 <= goog.string.compareVersions(goog.userAgent.VERSION, version));
2085 goog.userAgent.isVersion = goog.userAgent.isVersionOrHigher;
2086 goog.userAgent.isDocumentModeOrHigher = function(documentMode) {
2087   return goog.userAgent.IE && goog.userAgent.DOCUMENT_MODE >= documentMode;
2089 goog.userAgent.isDocumentMode = goog.userAgent.isDocumentModeOrHigher;
2090 var JSCompiler_inline_result$$0;
2091 var doc$$inline_1 = goog.global.document;
2092 if (doc$$inline_1 && goog.userAgent.IE) {
2093   var mode$$inline_2 = goog.userAgent.getDocumentMode_();
2094   JSCompiler_inline_result$$0 = mode$$inline_2 || ("CSS1Compat" == doc$$inline_1.compatMode ? parseInt(goog.userAgent.VERSION, 10) : 5);
2095 } else {
2096   JSCompiler_inline_result$$0 = void 0;
2098 goog.userAgent.DOCUMENT_MODE = JSCompiler_inline_result$$0;
2099 goog.dom.BrowserFeature = {CAN_ADD_NAME_OR_TYPE_ATTRIBUTES:!goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9), CAN_USE_CHILDREN_ATTRIBUTE:!goog.userAgent.GECKO && !goog.userAgent.IE || goog.userAgent.IE && goog.userAgent.isDocumentModeOrHigher(9) || goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher("1.9.1"), CAN_USE_INNER_TEXT:goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("9"), CAN_USE_PARENT_ELEMENT_PROPERTY:goog.userAgent.IE || goog.userAgent.OPERA || goog.userAgent.WEBKIT, 
2100 INNER_HTML_NEEDS_SCOPED_ELEMENT:goog.userAgent.IE, LEGACY_IE_RANGES:goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)};
2101 goog.dom.TagName = {A:"A", ABBR:"ABBR", ACRONYM:"ACRONYM", ADDRESS:"ADDRESS", APPLET:"APPLET", AREA:"AREA", ARTICLE:"ARTICLE", ASIDE:"ASIDE", AUDIO:"AUDIO", B:"B", BASE:"BASE", BASEFONT:"BASEFONT", BDI:"BDI", BDO:"BDO", BIG:"BIG", BLOCKQUOTE:"BLOCKQUOTE", BODY:"BODY", BR:"BR", BUTTON:"BUTTON", CANVAS:"CANVAS", CAPTION:"CAPTION", CENTER:"CENTER", CITE:"CITE", CODE:"CODE", COL:"COL", COLGROUP:"COLGROUP", COMMAND:"COMMAND", DATA:"DATA", DATALIST:"DATALIST", DD:"DD", DEL:"DEL", DETAILS:"DETAILS", DFN:"DFN", 
2102 DIALOG:"DIALOG", DIR:"DIR", DIV:"DIV", DL:"DL", DT:"DT", EM:"EM", EMBED:"EMBED", FIELDSET:"FIELDSET", FIGCAPTION:"FIGCAPTION", FIGURE:"FIGURE", FONT:"FONT", FOOTER:"FOOTER", FORM:"FORM", FRAME:"FRAME", FRAMESET:"FRAMESET", H1:"H1", H2:"H2", H3:"H3", H4:"H4", H5:"H5", H6:"H6", HEAD:"HEAD", HEADER:"HEADER", HGROUP:"HGROUP", HR:"HR", HTML:"HTML", I:"I", IFRAME:"IFRAME", IMG:"IMG", INPUT:"INPUT", INS:"INS", ISINDEX:"ISINDEX", KBD:"KBD", KEYGEN:"KEYGEN", LABEL:"LABEL", LEGEND:"LEGEND", LI:"LI", LINK:"LINK", 
2103 MAP:"MAP", MARK:"MARK", MATH:"MATH", MENU:"MENU", META:"META", METER:"METER", NAV:"NAV", NOFRAMES:"NOFRAMES", NOSCRIPT:"NOSCRIPT", OBJECT:"OBJECT", OL:"OL", OPTGROUP:"OPTGROUP", OPTION:"OPTION", OUTPUT:"OUTPUT", P:"P", PARAM:"PARAM", PRE:"PRE", PROGRESS:"PROGRESS", Q:"Q", RP:"RP", RT:"RT", RUBY:"RUBY", S:"S", SAMP:"SAMP", SCRIPT:"SCRIPT", SECTION:"SECTION", SELECT:"SELECT", SMALL:"SMALL", SOURCE:"SOURCE", SPAN:"SPAN", STRIKE:"STRIKE", STRONG:"STRONG", STYLE:"STYLE", SUB:"SUB", SUMMARY:"SUMMARY", 
2104 SUP:"SUP", SVG:"SVG", TABLE:"TABLE", TBODY:"TBODY", TD:"TD", TEXTAREA:"TEXTAREA", TFOOT:"TFOOT", TH:"TH", THEAD:"THEAD", TIME:"TIME", TITLE:"TITLE", TR:"TR", TRACK:"TRACK", TT:"TT", U:"U", UL:"UL", VAR:"VAR", VIDEO:"VIDEO", WBR:"WBR"};
2105 goog.dom.ASSUME_QUIRKS_MODE = !1;
2106 goog.dom.ASSUME_STANDARDS_MODE = !1;
2107 goog.dom.COMPAT_MODE_KNOWN_ = goog.dom.ASSUME_QUIRKS_MODE || goog.dom.ASSUME_STANDARDS_MODE;
2108 goog.dom.getDomHelper = function(opt_element) {
2109   return opt_element ? new goog.dom.DomHelper(goog.dom.getOwnerDocument(opt_element)) : goog.dom.defaultDomHelper_ || (goog.dom.defaultDomHelper_ = new goog.dom.DomHelper);
2111 goog.dom.getDocument = function() {
2112   return document;
2114 goog.dom.getElement = function(element) {
2115   return goog.dom.getElementHelper_(document, element);
2117 goog.dom.getElementHelper_ = function(doc, element) {
2118   return goog.isString(element) ? doc.getElementById(element) : element;
2120 goog.dom.getRequiredElement = function(id) {
2121   return goog.dom.getRequiredElementHelper_(document, id);
2123 goog.dom.getRequiredElementHelper_ = function(doc, id) {
2124   goog.asserts.assertString(id);
2125   var element = goog.dom.getElementHelper_(doc, id);
2126   return element = goog.asserts.assertElement(element, "No element found with id: " + id);
2128 goog.dom.$ = goog.dom.getElement;
2129 goog.dom.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) {
2130   return goog.dom.getElementsByTagNameAndClass_(document, opt_tag, opt_class, opt_el);
2132 goog.dom.getElementsByClass = function(className, opt_el) {
2133   var parent = opt_el || document;
2134   return goog.dom.canUseQuerySelector_(parent) ? parent.querySelectorAll("." + className) : goog.dom.getElementsByTagNameAndClass_(document, "*", className, opt_el);
2136 goog.dom.getElementByClass = function(className, opt_el) {
2137   var parent = opt_el || document, retVal = null;
2138   return(retVal = goog.dom.canUseQuerySelector_(parent) ? parent.querySelector("." + className) : goog.dom.getElementsByTagNameAndClass_(document, "*", className, opt_el)[0]) || null;
2140 goog.dom.getRequiredElementByClass = function(className, opt_root) {
2141   var retValue = goog.dom.getElementByClass(className, opt_root);
2142   return goog.asserts.assert(retValue, "No element found with className: " + className);
2144 goog.dom.canUseQuerySelector_ = function(parent) {
2145   return!(!parent.querySelectorAll || !parent.querySelector);
2147 goog.dom.getElementsByTagNameAndClass_ = function(doc, opt_tag, opt_class, opt_el) {
2148   var parent = opt_el || doc, tagName = opt_tag && "*" != opt_tag ? opt_tag.toUpperCase() : "";
2149   if (goog.dom.canUseQuerySelector_(parent) && (tagName || opt_class)) {
2150     var query = tagName + (opt_class ? "." + opt_class : "");
2151     return parent.querySelectorAll(query);
2152   }
2153   if (opt_class && parent.getElementsByClassName) {
2154     var els = parent.getElementsByClassName(opt_class);
2155     if (tagName) {
2156       for (var arrayLike = {}, len = 0, i = 0, el;el = els[i];i++) {
2157         tagName == el.nodeName && (arrayLike[len++] = el);
2158       }
2159       arrayLike.length = len;
2160       return arrayLike;
2161     }
2162     return els;
2163   }
2164   els = parent.getElementsByTagName(tagName || "*");
2165   if (opt_class) {
2166     arrayLike = {};
2167     for (i = len = 0;el = els[i];i++) {
2168       var className = el.className;
2169       "function" == typeof className.split && goog.array.contains(className.split(/\s+/), opt_class) && (arrayLike[len++] = el);
2170     }
2171     arrayLike.length = len;
2172     return arrayLike;
2173   }
2174   return els;
2176 goog.dom.$$ = goog.dom.getElementsByTagNameAndClass;
2177 goog.dom.setProperties = function(element, properties) {
2178   goog.object.forEach(properties, function(val, key) {
2179     "style" == key ? element.style.cssText = val : "class" == key ? element.className = val : "for" == key ? element.htmlFor = val : key in goog.dom.DIRECT_ATTRIBUTE_MAP_ ? element.setAttribute(goog.dom.DIRECT_ATTRIBUTE_MAP_[key], val) : goog.string.startsWith(key, "aria-") || goog.string.startsWith(key, "data-") ? element.setAttribute(key, val) : element[key] = val;
2180   });
2182 goog.dom.DIRECT_ATTRIBUTE_MAP_ = {cellpadding:"cellPadding", cellspacing:"cellSpacing", colspan:"colSpan", frameborder:"frameBorder", height:"height", maxlength:"maxLength", role:"role", rowspan:"rowSpan", type:"type", usemap:"useMap", valign:"vAlign", width:"width"};
2183 goog.dom.getViewportSize = function(opt_window) {
2184   return goog.dom.getViewportSize_(opt_window || window);
2186 goog.dom.getViewportSize_ = function(win) {
2187   var doc = win.document, el = goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body;
2188   return new goog.math.Size(el.clientWidth, el.clientHeight);
2190 goog.dom.getDocumentHeight = function() {
2191   return goog.dom.getDocumentHeight_(window);
2193 goog.dom.getDocumentHeight_ = function(win) {
2194   var doc = win.document, height = 0;
2195   if (doc) {
2196     var body = doc.body, docEl = doc.documentElement;
2197     if (!docEl || !body) {
2198       return 0;
2199     }
2200     var vh = goog.dom.getViewportSize_(win).height;
2201     if (goog.dom.isCss1CompatMode_(doc) && docEl.scrollHeight) {
2202       height = docEl.scrollHeight != vh ? docEl.scrollHeight : docEl.offsetHeight;
2203     } else {
2204       var sh = docEl.scrollHeight, oh = docEl.offsetHeight;
2205       docEl.clientHeight != oh && (sh = body.scrollHeight, oh = body.offsetHeight);
2206       height = sh > vh ? sh > oh ? sh : oh : sh < oh ? sh : oh;
2207     }
2208   }
2209   return height;
2211 goog.dom.getPageScroll = function(opt_window) {
2212   var win = opt_window || goog.global || window;
2213   return goog.dom.getDomHelper(win.document).getDocumentScroll();
2215 goog.dom.getDocumentScroll = function() {
2216   return goog.dom.getDocumentScroll_(document);
2218 goog.dom.getDocumentScroll_ = function(doc) {
2219   var el = goog.dom.getDocumentScrollElement_(doc), win = goog.dom.getWindow_(doc);
2220   return goog.userAgent.IE && goog.userAgent.isVersionOrHigher("10") && win.pageYOffset != el.scrollTop ? new goog.math.Coordinate(el.scrollLeft, el.scrollTop) : new goog.math.Coordinate(win.pageXOffset || el.scrollLeft, win.pageYOffset || el.scrollTop);
2222 goog.dom.getDocumentScrollElement = function() {
2223   return goog.dom.getDocumentScrollElement_(document);
2225 goog.dom.getDocumentScrollElement_ = function(doc) {
2226   return!goog.userAgent.WEBKIT && goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body || doc.documentElement;
2228 goog.dom.getWindow = function(opt_doc) {
2229   return opt_doc ? goog.dom.getWindow_(opt_doc) : window;
2231 goog.dom.getWindow_ = function(doc) {
2232   return doc.parentWindow || doc.defaultView;
2234 goog.dom.createDom = function(tagName, opt_attributes, var_args) {
2235   return goog.dom.createDom_(document, arguments);
2237 goog.dom.createDom_ = function(doc, args) {
2238   var tagName = args[0], attributes = args[1];
2239   if (!goog.dom.BrowserFeature.CAN_ADD_NAME_OR_TYPE_ATTRIBUTES && attributes && (attributes.name || attributes.type)) {
2240     var tagNameArr = ["<", tagName];
2241     attributes.name && tagNameArr.push(' name="', goog.string.htmlEscape(attributes.name), '"');
2242     if (attributes.type) {
2243       tagNameArr.push(' type="', goog.string.htmlEscape(attributes.type), '"');
2244       var clone = {};
2245       goog.object.extend(clone, attributes);
2246       delete clone.type;
2247       attributes = clone;
2248     }
2249     tagNameArr.push(">");
2250     tagName = tagNameArr.join("");
2251   }
2252   var element = doc.createElement(tagName);
2253   attributes && (goog.isString(attributes) ? element.className = attributes : goog.isArray(attributes) ? element.className = attributes.join(" ") : goog.dom.setProperties(element, attributes));
2254   2 < args.length && goog.dom.append_(doc, element, args, 2);
2255   return element;
2257 goog.dom.append_ = function(doc, parent, args, startIndex) {
2258   function childHandler(child) {
2259     child && parent.appendChild(goog.isString(child) ? doc.createTextNode(child) : child);
2260   }
2261   for (var i = startIndex;i < args.length;i++) {
2262     var arg = args[i];
2263     goog.isArrayLike(arg) && !goog.dom.isNodeLike(arg) ? goog.array.forEach(goog.dom.isNodeList(arg) ? goog.array.toArray(arg) : arg, childHandler) : childHandler(arg);
2264   }
2266 goog.dom.$dom = goog.dom.createDom;
2267 goog.dom.createElement = function(name) {
2268   return document.createElement(name);
2270 goog.dom.createTextNode = function(content) {
2271   return document.createTextNode(String(content));
2273 goog.dom.createTable = function(rows, columns, opt_fillWithNbsp) {
2274   return goog.dom.createTable_(document, rows, columns, !!opt_fillWithNbsp);
2276 goog.dom.createTable_ = function(doc, rows, columns, fillWithNbsp) {
2277   for (var rowHtml = ["<tr>"], i = 0;i < columns;i++) {
2278     rowHtml.push(fillWithNbsp ? "<td>&nbsp;</td>" : "<td></td>");
2279   }
2280   rowHtml.push("</tr>");
2281   for (var rowHtml = rowHtml.join(""), totalHtml = ["<table>"], i = 0;i < rows;i++) {
2282     totalHtml.push(rowHtml);
2283   }
2284   totalHtml.push("</table>");
2285   var elem = doc.createElement(goog.dom.TagName.DIV);
2286   elem.innerHTML = totalHtml.join("");
2287   return elem.removeChild(elem.firstChild);
2289 goog.dom.htmlToDocumentFragment = function(htmlString) {
2290   return goog.dom.htmlToDocumentFragment_(document, htmlString);
2292 goog.dom.htmlToDocumentFragment_ = function(doc, htmlString) {
2293   var tempDiv = doc.createElement("div");
2294   goog.dom.BrowserFeature.INNER_HTML_NEEDS_SCOPED_ELEMENT ? (tempDiv.innerHTML = "<br>" + htmlString, tempDiv.removeChild(tempDiv.firstChild)) : tempDiv.innerHTML = htmlString;
2295   if (1 == tempDiv.childNodes.length) {
2296     return tempDiv.removeChild(tempDiv.firstChild);
2297   }
2298   for (var fragment = doc.createDocumentFragment();tempDiv.firstChild;) {
2299     fragment.appendChild(tempDiv.firstChild);
2300   }
2301   return fragment;
2303 goog.dom.isCss1CompatMode = function() {
2304   return goog.dom.isCss1CompatMode_(document);
2306 goog.dom.isCss1CompatMode_ = function(doc) {
2307   return goog.dom.COMPAT_MODE_KNOWN_ ? goog.dom.ASSUME_STANDARDS_MODE : "CSS1Compat" == doc.compatMode;
2309 goog.dom.canHaveChildren = function(node) {
2310   if (node.nodeType != goog.dom.NodeType.ELEMENT) {
2311     return!1;
2312   }
2313   switch(node.tagName) {
2314     case goog.dom.TagName.APPLET:
2315     ;
2316     case goog.dom.TagName.AREA:
2317     ;
2318     case goog.dom.TagName.BASE:
2319     ;
2320     case goog.dom.TagName.BR:
2321     ;
2322     case goog.dom.TagName.COL:
2323     ;
2324     case goog.dom.TagName.COMMAND:
2325     ;
2326     case goog.dom.TagName.EMBED:
2327     ;
2328     case goog.dom.TagName.FRAME:
2329     ;
2330     case goog.dom.TagName.HR:
2331     ;
2332     case goog.dom.TagName.IMG:
2333     ;
2334     case goog.dom.TagName.INPUT:
2335     ;
2336     case goog.dom.TagName.IFRAME:
2337     ;
2338     case goog.dom.TagName.ISINDEX:
2339     ;
2340     case goog.dom.TagName.KEYGEN:
2341     ;
2342     case goog.dom.TagName.LINK:
2343     ;
2344     case goog.dom.TagName.NOFRAMES:
2345     ;
2346     case goog.dom.TagName.NOSCRIPT:
2347     ;
2348     case goog.dom.TagName.META:
2349     ;
2350     case goog.dom.TagName.OBJECT:
2351     ;
2352     case goog.dom.TagName.PARAM:
2353     ;
2354     case goog.dom.TagName.SCRIPT:
2355     ;
2356     case goog.dom.TagName.SOURCE:
2357     ;
2358     case goog.dom.TagName.STYLE:
2359     ;
2360     case goog.dom.TagName.TRACK:
2361     ;
2362     case goog.dom.TagName.WBR:
2363       return!1;
2364   }
2365   return!0;
2367 goog.dom.appendChild = function(parent, child) {
2368   parent.appendChild(child);
2370 goog.dom.append = function(parent, var_args) {
2371   goog.dom.append_(goog.dom.getOwnerDocument(parent), parent, arguments, 1);
2373 goog.dom.removeChildren = function(node) {
2374   for (var child;child = node.firstChild;) {
2375     node.removeChild(child);
2376   }
2378 goog.dom.insertSiblingBefore = function(newNode, refNode) {
2379   refNode.parentNode && refNode.parentNode.insertBefore(newNode, refNode);
2381 goog.dom.insertSiblingAfter = function(newNode, refNode) {
2382   refNode.parentNode && refNode.parentNode.insertBefore(newNode, refNode.nextSibling);
2384 goog.dom.insertChildAt = function(parent, child, index) {
2385   parent.insertBefore(child, parent.childNodes[index] || null);
2387 goog.dom.removeNode = function(node) {
2388   return node && node.parentNode ? node.parentNode.removeChild(node) : null;
2390 goog.dom.replaceNode = function(newNode, oldNode) {
2391   var parent = oldNode.parentNode;
2392   parent && parent.replaceChild(newNode, oldNode);
2394 goog.dom.flattenElement = function(element) {
2395   var child, parent = element.parentNode;
2396   if (parent && parent.nodeType != goog.dom.NodeType.DOCUMENT_FRAGMENT) {
2397     if (element.removeNode) {
2398       return element.removeNode(!1);
2399     }
2400     for (;child = element.firstChild;) {
2401       parent.insertBefore(child, element);
2402     }
2403     return goog.dom.removeNode(element);
2404   }
2406 goog.dom.getChildren = function(element) {
2407   return goog.dom.BrowserFeature.CAN_USE_CHILDREN_ATTRIBUTE && void 0 != element.children ? element.children : goog.array.filter(element.childNodes, function(node) {
2408     return node.nodeType == goog.dom.NodeType.ELEMENT;
2409   });
2411 goog.dom.getFirstElementChild = function(node) {
2412   return void 0 != node.firstElementChild ? node.firstElementChild : goog.dom.getNextElementNode_(node.firstChild, !0);
2414 goog.dom.getLastElementChild = function(node) {
2415   return void 0 != node.lastElementChild ? node.lastElementChild : goog.dom.getNextElementNode_(node.lastChild, !1);
2417 goog.dom.getNextElementSibling = function(node) {
2418   return void 0 != node.nextElementSibling ? node.nextElementSibling : goog.dom.getNextElementNode_(node.nextSibling, !0);
2420 goog.dom.getPreviousElementSibling = function(node) {
2421   return void 0 != node.previousElementSibling ? node.previousElementSibling : goog.dom.getNextElementNode_(node.previousSibling, !1);
2423 goog.dom.getNextElementNode_ = function(node, forward) {
2424   for (;node && node.nodeType != goog.dom.NodeType.ELEMENT;) {
2425     node = forward ? node.nextSibling : node.previousSibling;
2426   }
2427   return node;
2429 goog.dom.getNextNode = function(node) {
2430   if (!node) {
2431     return null;
2432   }
2433   if (node.firstChild) {
2434     return node.firstChild;
2435   }
2436   for (;node && !node.nextSibling;) {
2437     node = node.parentNode;
2438   }
2439   return node ? node.nextSibling : null;
2441 goog.dom.getPreviousNode = function(node) {
2442   if (!node) {
2443     return null;
2444   }
2445   if (!node.previousSibling) {
2446     return node.parentNode;
2447   }
2448   for (node = node.previousSibling;node && node.lastChild;) {
2449     node = node.lastChild;
2450   }
2451   return node;
2453 goog.dom.isNodeLike = function(obj) {
2454   return goog.isObject(obj) && 0 < obj.nodeType;
2456 goog.dom.isElement = function(obj) {
2457   return goog.isObject(obj) && obj.nodeType == goog.dom.NodeType.ELEMENT;
2459 goog.dom.isWindow = function(obj) {
2460   return goog.isObject(obj) && obj.window == obj;
2462 goog.dom.getParentElement = function(element) {
2463   var parent;
2464   if (goog.dom.BrowserFeature.CAN_USE_PARENT_ELEMENT_PROPERTY) {
2465     var isIe9 = goog.userAgent.IE && goog.userAgent.isVersionOrHigher("9") && !goog.userAgent.isVersionOrHigher("10");
2466     if (!(isIe9 && goog.global.SVGElement && element instanceof goog.global.SVGElement) && (parent = element.parentElement)) {
2467       return parent;
2468     }
2469   }
2470   parent = element.parentNode;
2471   return goog.dom.isElement(parent) ? parent : null;
2473 goog.dom.contains = function(parent, descendant) {
2474   if (parent.contains && descendant.nodeType == goog.dom.NodeType.ELEMENT) {
2475     return parent == descendant || parent.contains(descendant);
2476   }
2477   if ("undefined" != typeof parent.compareDocumentPosition) {
2478     return parent == descendant || Boolean(parent.compareDocumentPosition(descendant) & 16);
2479   }
2480   for (;descendant && parent != descendant;) {
2481     descendant = descendant.parentNode;
2482   }
2483   return descendant == parent;
2485 goog.dom.compareNodeOrder = function(node1, node2) {
2486   if (node1 == node2) {
2487     return 0;
2488   }
2489   if (node1.compareDocumentPosition) {
2490     return node1.compareDocumentPosition(node2) & 2 ? 1 : -1;
2491   }
2492   if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {
2493     if (node1.nodeType == goog.dom.NodeType.DOCUMENT) {
2494       return-1;
2495     }
2496     if (node2.nodeType == goog.dom.NodeType.DOCUMENT) {
2497       return 1;
2498     }
2499   }
2500   if ("sourceIndex" in node1 || node1.parentNode && "sourceIndex" in node1.parentNode) {
2501     var isElement1 = node1.nodeType == goog.dom.NodeType.ELEMENT, isElement2 = node2.nodeType == goog.dom.NodeType.ELEMENT;
2502     if (isElement1 && isElement2) {
2503       return node1.sourceIndex - node2.sourceIndex;
2504     }
2505     var parent1 = node1.parentNode, parent2 = node2.parentNode;
2506     return parent1 == parent2 ? goog.dom.compareSiblingOrder_(node1, node2) : !isElement1 && goog.dom.contains(parent1, node2) ? -1 * goog.dom.compareParentsDescendantNodeIe_(node1, node2) : !isElement2 && goog.dom.contains(parent2, node1) ? goog.dom.compareParentsDescendantNodeIe_(node2, node1) : (isElement1 ? node1.sourceIndex : parent1.sourceIndex) - (isElement2 ? node2.sourceIndex : parent2.sourceIndex);
2507   }
2508   var doc = goog.dom.getOwnerDocument(node1), range1, range2;
2509   range1 = doc.createRange();
2510   range1.selectNode(node1);
2511   range1.collapse(!0);
2512   range2 = doc.createRange();
2513   range2.selectNode(node2);
2514   range2.collapse(!0);
2515   return range1.compareBoundaryPoints(goog.global.Range.START_TO_END, range2);
2517 goog.dom.compareParentsDescendantNodeIe_ = function(textNode, node) {
2518   var parent = textNode.parentNode;
2519   if (parent == node) {
2520     return-1;
2521   }
2522   for (var sibling = node;sibling.parentNode != parent;) {
2523     sibling = sibling.parentNode;
2524   }
2525   return goog.dom.compareSiblingOrder_(sibling, textNode);
2527 goog.dom.compareSiblingOrder_ = function(node1, node2) {
2528   for (var s = node2;s = s.previousSibling;) {
2529     if (s == node1) {
2530       return-1;
2531     }
2532   }
2533   return 1;
2535 goog.dom.findCommonAncestor = function(var_args) {
2536   var i, count = arguments.length;
2537   if (!count) {
2538     return null;
2539   }
2540   if (1 == count) {
2541     return arguments[0];
2542   }
2543   var paths = [], minLength = Infinity;
2544   for (i = 0;i < count;i++) {
2545     for (var ancestors = [], node = arguments[i];node;) {
2546       ancestors.unshift(node), node = node.parentNode;
2547     }
2548     paths.push(ancestors);
2549     minLength = Math.min(minLength, ancestors.length);
2550   }
2551   var output = null;
2552   for (i = 0;i < minLength;i++) {
2553     for (var first = paths[0][i], j = 1;j < count;j++) {
2554       if (first != paths[j][i]) {
2555         return output;
2556       }
2557     }
2558     output = first;
2559   }
2560   return output;
2562 goog.dom.getOwnerDocument = function(node) {
2563   goog.asserts.assert(node, "Node cannot be null or undefined.");
2564   return node.nodeType == goog.dom.NodeType.DOCUMENT ? node : node.ownerDocument || node.document;
2566 goog.dom.getFrameContentDocument = function(frame) {
2567   var doc = frame.contentDocument || frame.contentWindow.document;
2568   return doc;
2570 goog.dom.getFrameContentWindow = function(frame) {
2571   return frame.contentWindow || goog.dom.getWindow(goog.dom.getFrameContentDocument(frame));
2573 goog.dom.setTextContent = function(node, text) {
2574   goog.asserts.assert(null != node, "goog.dom.setTextContent expects a non-null value for node");
2575   if ("textContent" in node) {
2576     node.textContent = text;
2577   } else {
2578     if (node.nodeType == goog.dom.NodeType.TEXT) {
2579       node.data = text;
2580     } else {
2581       if (node.firstChild && node.firstChild.nodeType == goog.dom.NodeType.TEXT) {
2582         for (;node.lastChild != node.firstChild;) {
2583           node.removeChild(node.lastChild);
2584         }
2585         node.firstChild.data = text;
2586       } else {
2587         goog.dom.removeChildren(node);
2588         var doc = goog.dom.getOwnerDocument(node);
2589         node.appendChild(doc.createTextNode(String(text)));
2590       }
2591     }
2592   }
2594 goog.dom.getOuterHtml = function(element) {
2595   if ("outerHTML" in element) {
2596     return element.outerHTML;
2597   }
2598   var doc = goog.dom.getOwnerDocument(element), div = doc.createElement("div");
2599   div.appendChild(element.cloneNode(!0));
2600   return div.innerHTML;
2602 goog.dom.findNode = function(root, p) {
2603   var rv = [], found = goog.dom.findNodes_(root, p, rv, !0);
2604   return found ? rv[0] : void 0;
2606 goog.dom.findNodes = function(root, p) {
2607   var rv = [];
2608   goog.dom.findNodes_(root, p, rv, !1);
2609   return rv;
2611 goog.dom.findNodes_ = function(root, p, rv, findOne) {
2612   if (null != root) {
2613     for (var child = root.firstChild;child;) {
2614       if (p(child) && (rv.push(child), findOne) || goog.dom.findNodes_(child, p, rv, findOne)) {
2615         return!0;
2616       }
2617       child = child.nextSibling;
2618     }
2619   }
2620   return!1;
2622 goog.dom.TAGS_TO_IGNORE_ = {SCRIPT:1, STYLE:1, HEAD:1, IFRAME:1, OBJECT:1};
2623 goog.dom.PREDEFINED_TAG_VALUES_ = {IMG:" ", BR:"\n"};
2624 goog.dom.isFocusableTabIndex = function(element) {
2625   return goog.dom.hasSpecifiedTabIndex_(element) && goog.dom.isTabIndexFocusable_(element);
2627 goog.dom.setFocusableTabIndex = function(element, enable) {
2628   enable ? element.tabIndex = 0 : (element.tabIndex = -1, element.removeAttribute("tabIndex"));
2630 goog.dom.isFocusable = function(element) {
2631   var focusable;
2632   return(focusable = goog.dom.nativelySupportsFocus_(element) ? !element.disabled && (!goog.dom.hasSpecifiedTabIndex_(element) || goog.dom.isTabIndexFocusable_(element)) : goog.dom.isFocusableTabIndex(element)) && goog.userAgent.IE ? goog.dom.hasNonZeroBoundingRect_(element) : focusable;
2634 goog.dom.hasSpecifiedTabIndex_ = function(element) {
2635   var attrNode = element.getAttributeNode("tabindex");
2636   return goog.isDefAndNotNull(attrNode) && attrNode.specified;
2638 goog.dom.isTabIndexFocusable_ = function(element) {
2639   var index = element.tabIndex;
2640   return goog.isNumber(index) && 0 <= index && 32768 > index;
2642 goog.dom.nativelySupportsFocus_ = function(element) {
2643   return element.tagName == goog.dom.TagName.A || element.tagName == goog.dom.TagName.INPUT || element.tagName == goog.dom.TagName.TEXTAREA || element.tagName == goog.dom.TagName.SELECT || element.tagName == goog.dom.TagName.BUTTON;
2645 goog.dom.hasNonZeroBoundingRect_ = function(element) {
2646   var rect = goog.isFunction(element.getBoundingClientRect) ? element.getBoundingClientRect() : {height:element.offsetHeight, width:element.offsetWidth};
2647   return goog.isDefAndNotNull(rect) && 0 < rect.height && 0 < rect.width;
2649 goog.dom.getTextContent = function(node) {
2650   var textContent;
2651   if (goog.dom.BrowserFeature.CAN_USE_INNER_TEXT && "innerText" in node) {
2652     textContent = goog.string.canonicalizeNewlines(node.innerText);
2653   } else {
2654     var buf = [];
2655     goog.dom.getTextContent_(node, buf, !0);
2656     textContent = buf.join("");
2657   }
2658   textContent = textContent.replace(/ \xAD /g, " ").replace(/\xAD/g, "");
2659   textContent = textContent.replace(/\u200B/g, "");
2660   goog.dom.BrowserFeature.CAN_USE_INNER_TEXT || (textContent = textContent.replace(/ +/g, " "));
2661   " " != textContent && (textContent = textContent.replace(/^\s*/, ""));
2662   return textContent;
2664 goog.dom.getRawTextContent = function(node) {
2665   var buf = [];
2666   goog.dom.getTextContent_(node, buf, !1);
2667   return buf.join("");
2669 goog.dom.getTextContent_ = function(node, buf, normalizeWhitespace) {
2670   if (!(node.nodeName in goog.dom.TAGS_TO_IGNORE_)) {
2671     if (node.nodeType == goog.dom.NodeType.TEXT) {
2672       normalizeWhitespace ? buf.push(String(node.nodeValue).replace(/(\r\n|\r|\n)/g, "")) : buf.push(node.nodeValue);
2673     } else {
2674       if (node.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {
2675         buf.push(goog.dom.PREDEFINED_TAG_VALUES_[node.nodeName]);
2676       } else {
2677         for (var child = node.firstChild;child;) {
2678           goog.dom.getTextContent_(child, buf, normalizeWhitespace), child = child.nextSibling;
2679         }
2680       }
2681     }
2682   }
2684 goog.dom.getNodeTextLength = function(node) {
2685   return goog.dom.getTextContent(node).length;
2687 goog.dom.getNodeTextOffset = function(node, opt_offsetParent) {
2688   for (var root = opt_offsetParent || goog.dom.getOwnerDocument(node).body, buf = [];node && node != root;) {
2689     for (var cur = node;cur = cur.previousSibling;) {
2690       buf.unshift(goog.dom.getTextContent(cur));
2691     }
2692     node = node.parentNode;
2693   }
2694   return goog.string.trimLeft(buf.join("")).replace(/ +/g, " ").length;
2696 goog.dom.getNodeAtOffset = function(parent, offset, opt_result) {
2697   for (var stack = [parent], pos = 0, cur = null;0 < stack.length && pos < offset;) {
2698     if (cur = stack.pop(), !(cur.nodeName in goog.dom.TAGS_TO_IGNORE_)) {
2699       if (cur.nodeType == goog.dom.NodeType.TEXT) {
2700         var text = cur.nodeValue.replace(/(\r\n|\r|\n)/g, "").replace(/ +/g, " "), pos = pos + text.length
2701       } else {
2702         if (cur.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {
2703           pos += goog.dom.PREDEFINED_TAG_VALUES_[cur.nodeName].length;
2704         } else {
2705           for (var i = cur.childNodes.length - 1;0 <= i;i--) {
2706             stack.push(cur.childNodes[i]);
2707           }
2708         }
2709       }
2710     }
2711   }
2712   goog.isObject(opt_result) && (opt_result.remainder = cur ? cur.nodeValue.length + offset - pos - 1 : 0, opt_result.node = cur);
2713   return cur;
2715 goog.dom.isNodeList = function(val) {
2716   if (val && "number" == typeof val.length) {
2717     if (goog.isObject(val)) {
2718       return "function" == typeof val.item || "string" == typeof val.item;
2719     }
2720     if (goog.isFunction(val)) {
2721       return "function" == typeof val.item;
2722     }
2723   }
2724   return!1;
2726 goog.dom.getAncestorByTagNameAndClass = function(element, opt_tag, opt_class) {
2727   if (!opt_tag && !opt_class) {
2728     return null;
2729   }
2730   var tagName = opt_tag ? opt_tag.toUpperCase() : null;
2731   return goog.dom.getAncestor(element, function(node) {
2732     return(!tagName || node.nodeName == tagName) && (!opt_class || goog.isString(node.className) && goog.array.contains(node.className.split(/\s+/), opt_class));
2733   }, !0);
2735 goog.dom.getAncestorByClass = function(element, className) {
2736   return goog.dom.getAncestorByTagNameAndClass(element, null, className);
2738 goog.dom.getAncestor = function(element, matcher, opt_includeNode, opt_maxSearchSteps) {
2739   opt_includeNode || (element = element.parentNode);
2740   for (var ignoreSearchSteps = null == opt_maxSearchSteps, steps = 0;element && (ignoreSearchSteps || steps <= opt_maxSearchSteps);) {
2741     if (matcher(element)) {
2742       return element;
2743     }
2744     element = element.parentNode;
2745     steps++;
2746   }
2747   return null;
2749 goog.dom.getActiveElement = function(doc) {
2750   try {
2751     return doc && doc.activeElement;
2752   } catch (e) {
2753   }
2754   return null;
2756 goog.dom.getPixelRatio = function() {
2757   var win = goog.dom.getWindow(), isFirefoxMobile = goog.userAgent.GECKO && goog.userAgent.MOBILE;
2758   return goog.isDef(win.devicePixelRatio) && !isFirefoxMobile ? win.devicePixelRatio : win.matchMedia ? goog.dom.matchesPixelRatio_(.75) || goog.dom.matchesPixelRatio_(1.5) || goog.dom.matchesPixelRatio_(2) || goog.dom.matchesPixelRatio_(3) || 1 : 1;
2760 goog.dom.matchesPixelRatio_ = function(pixelRatio) {
2761   var win = goog.dom.getWindow(), query = "(-webkit-min-device-pixel-ratio: " + pixelRatio + "),(min--moz-device-pixel-ratio: " + pixelRatio + "),(min-resolution: " + pixelRatio + "dppx)";
2762   return win.matchMedia(query).matches ? pixelRatio : 0;
2764 goog.dom.DomHelper = function(opt_document) {
2765   this.document_ = opt_document || goog.global.document || document;
2767 goog.dom.DomHelper.prototype.getDomHelper = goog.dom.getDomHelper;
2768 goog.dom.DomHelper.prototype.getDocument = function() {
2769   return this.document_;
2771 goog.dom.DomHelper.prototype.getElement = function(element) {
2772   return goog.dom.getElementHelper_(this.document_, element);
2774 goog.dom.DomHelper.prototype.getRequiredElement = function(id) {
2775   return goog.dom.getRequiredElementHelper_(this.document_, id);
2777 goog.dom.DomHelper.prototype.$ = goog.dom.DomHelper.prototype.getElement;
2778 goog.dom.DomHelper.prototype.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) {
2779   return goog.dom.getElementsByTagNameAndClass_(this.document_, opt_tag, opt_class, opt_el);
2781 goog.dom.DomHelper.prototype.getElementsByClass = function(className, opt_el) {
2782   var doc = opt_el || this.document_;
2783   return goog.dom.getElementsByClass(className, doc);
2785 goog.dom.DomHelper.prototype.getElementByClass = function(className, opt_el) {
2786   var doc = opt_el || this.document_;
2787   return goog.dom.getElementByClass(className, doc);
2789 goog.dom.DomHelper.prototype.getRequiredElementByClass = function(className, opt_root) {
2790   var root = opt_root || this.document_;
2791   return goog.dom.getRequiredElementByClass(className, root);
2793 goog.dom.DomHelper.prototype.$$ = goog.dom.DomHelper.prototype.getElementsByTagNameAndClass;
2794 goog.dom.DomHelper.prototype.setProperties = goog.dom.setProperties;
2795 goog.dom.DomHelper.prototype.getViewportSize = function(opt_window) {
2796   return goog.dom.getViewportSize(opt_window || this.getWindow());
2798 goog.dom.DomHelper.prototype.getDocumentHeight = function() {
2799   return goog.dom.getDocumentHeight_(this.getWindow());
2801 goog.dom.DomHelper.prototype.createDom = function(tagName, opt_attributes, var_args) {
2802   return goog.dom.createDom_(this.document_, arguments);
2804 goog.dom.DomHelper.prototype.$dom = goog.dom.DomHelper.prototype.createDom;
2805 goog.dom.DomHelper.prototype.createElement = function(name) {
2806   return this.document_.createElement(name);
2808 goog.dom.DomHelper.prototype.createTextNode = function(content) {
2809   return this.document_.createTextNode(String(content));
2811 goog.dom.DomHelper.prototype.createTable = function(rows, columns, opt_fillWithNbsp) {
2812   return goog.dom.createTable_(this.document_, rows, columns, !!opt_fillWithNbsp);
2814 goog.dom.DomHelper.prototype.htmlToDocumentFragment = function(htmlString) {
2815   return goog.dom.htmlToDocumentFragment_(this.document_, htmlString);
2817 goog.dom.DomHelper.prototype.isCss1CompatMode = function() {
2818   return goog.dom.isCss1CompatMode_(this.document_);
2820 goog.dom.DomHelper.prototype.getWindow = function() {
2821   return goog.dom.getWindow_(this.document_);
2823 goog.dom.DomHelper.prototype.getDocumentScrollElement = function() {
2824   return goog.dom.getDocumentScrollElement_(this.document_);
2826 goog.dom.DomHelper.prototype.getDocumentScroll = function() {
2827   return goog.dom.getDocumentScroll_(this.document_);
2829 goog.dom.DomHelper.prototype.getActiveElement = function(opt_doc) {
2830   return goog.dom.getActiveElement(opt_doc || this.document_);
2832 goog.dom.DomHelper.prototype.appendChild = goog.dom.appendChild;
2833 goog.dom.DomHelper.prototype.append = goog.dom.append;
2834 goog.dom.DomHelper.prototype.canHaveChildren = goog.dom.canHaveChildren;
2835 goog.dom.DomHelper.prototype.removeChildren = goog.dom.removeChildren;
2836 goog.dom.DomHelper.prototype.insertSiblingBefore = goog.dom.insertSiblingBefore;
2837 goog.dom.DomHelper.prototype.insertSiblingAfter = goog.dom.insertSiblingAfter;
2838 goog.dom.DomHelper.prototype.insertChildAt = goog.dom.insertChildAt;
2839 goog.dom.DomHelper.prototype.removeNode = goog.dom.removeNode;
2840 goog.dom.DomHelper.prototype.replaceNode = goog.dom.replaceNode;
2841 goog.dom.DomHelper.prototype.flattenElement = goog.dom.flattenElement;
2842 goog.dom.DomHelper.prototype.getChildren = goog.dom.getChildren;
2843 goog.dom.DomHelper.prototype.getFirstElementChild = goog.dom.getFirstElementChild;
2844 goog.dom.DomHelper.prototype.getLastElementChild = goog.dom.getLastElementChild;
2845 goog.dom.DomHelper.prototype.getNextElementSibling = goog.dom.getNextElementSibling;
2846 goog.dom.DomHelper.prototype.getPreviousElementSibling = goog.dom.getPreviousElementSibling;
2847 goog.dom.DomHelper.prototype.getNextNode = goog.dom.getNextNode;
2848 goog.dom.DomHelper.prototype.getPreviousNode = goog.dom.getPreviousNode;
2849 goog.dom.DomHelper.prototype.isNodeLike = goog.dom.isNodeLike;
2850 goog.dom.DomHelper.prototype.isElement = goog.dom.isElement;
2851 goog.dom.DomHelper.prototype.isWindow = goog.dom.isWindow;
2852 goog.dom.DomHelper.prototype.getParentElement = goog.dom.getParentElement;
2853 goog.dom.DomHelper.prototype.contains = goog.dom.contains;
2854 goog.dom.DomHelper.prototype.compareNodeOrder = goog.dom.compareNodeOrder;
2855 goog.dom.DomHelper.prototype.findCommonAncestor = goog.dom.findCommonAncestor;
2856 goog.dom.DomHelper.prototype.getOwnerDocument = goog.dom.getOwnerDocument;
2857 goog.dom.DomHelper.prototype.getFrameContentDocument = goog.dom.getFrameContentDocument;
2858 goog.dom.DomHelper.prototype.getFrameContentWindow = goog.dom.getFrameContentWindow;
2859 goog.dom.DomHelper.prototype.setTextContent = goog.dom.setTextContent;
2860 goog.dom.DomHelper.prototype.getOuterHtml = goog.dom.getOuterHtml;
2861 goog.dom.DomHelper.prototype.findNode = goog.dom.findNode;
2862 goog.dom.DomHelper.prototype.findNodes = goog.dom.findNodes;
2863 goog.dom.DomHelper.prototype.isFocusableTabIndex = goog.dom.isFocusableTabIndex;
2864 goog.dom.DomHelper.prototype.setFocusableTabIndex = goog.dom.setFocusableTabIndex;
2865 goog.dom.DomHelper.prototype.isFocusable = goog.dom.isFocusable;
2866 goog.dom.DomHelper.prototype.getTextContent = goog.dom.getTextContent;
2867 goog.dom.DomHelper.prototype.getNodeTextLength = goog.dom.getNodeTextLength;
2868 goog.dom.DomHelper.prototype.getNodeTextOffset = goog.dom.getNodeTextOffset;
2869 goog.dom.DomHelper.prototype.getNodeAtOffset = goog.dom.getNodeAtOffset;
2870 goog.dom.DomHelper.prototype.isNodeList = goog.dom.isNodeList;
2871 goog.dom.DomHelper.prototype.getAncestorByTagNameAndClass = goog.dom.getAncestorByTagNameAndClass;
2872 goog.dom.DomHelper.prototype.getAncestorByClass = goog.dom.getAncestorByClass;
2873 goog.dom.DomHelper.prototype.getAncestor = goog.dom.getAncestor;
2874 goog.debug.entryPointRegistry = {};
2875 goog.debug.EntryPointMonitor = function() {
2877 goog.debug.entryPointRegistry.refList_ = [];
2878 goog.debug.entryPointRegistry.monitors_ = [];
2879 goog.debug.entryPointRegistry.monitorsMayExist_ = !1;
2880 goog.debug.entryPointRegistry.register = function(callback) {
2881   goog.debug.entryPointRegistry.refList_[goog.debug.entryPointRegistry.refList_.length] = callback;
2882   if (goog.debug.entryPointRegistry.monitorsMayExist_) {
2883     for (var monitors = goog.debug.entryPointRegistry.monitors_, i = 0;i < monitors.length;i++) {
2884       callback(goog.bind(monitors[i].wrap, monitors[i]));
2885     }
2886   }
2888 goog.debug.entryPointRegistry.monitorAll = function(monitor) {
2889   goog.debug.entryPointRegistry.monitorsMayExist_ = !0;
2890   for (var transformer = goog.bind(monitor.wrap, monitor), i = 0;i < goog.debug.entryPointRegistry.refList_.length;i++) {
2891     goog.debug.entryPointRegistry.refList_[i](transformer);
2892   }
2893   goog.debug.entryPointRegistry.monitors_.push(monitor);
2895 goog.debug.entryPointRegistry.unmonitorAllIfPossible = function(monitor) {
2896   var monitors = goog.debug.entryPointRegistry.monitors_;
2897   goog.asserts.assert(monitor == monitors[monitors.length - 1], "Only the most recent monitor can be unwrapped.");
2898   for (var transformer = goog.bind(monitor.unwrap, monitor), i = 0;i < goog.debug.entryPointRegistry.refList_.length;i++) {
2899     goog.debug.entryPointRegistry.refList_[i](transformer);
2900   }
2901   monitors.length--;
2903 goog.disposable = {};
2904 goog.disposable.IDisposable = function() {
2906 goog.Disposable = function() {
2907   goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF && (goog.Disposable.instances_[goog.getUid(this)] = this);
2908   this.disposed_ = this.disposed_;
2909   this.onDisposeCallbacks_ = this.onDisposeCallbacks_;
2911 goog.Disposable.MonitoringMode = {OFF:0, PERMANENT:1, INTERACTIVE:2};
2912 goog.Disposable.MONITORING_MODE = 0;
2913 goog.Disposable.INCLUDE_STACK_ON_CREATION = !0;
2914 goog.Disposable.instances_ = {};
2915 goog.Disposable.getUndisposedObjects = function() {
2916   var ret = [], id;
2917   for (id in goog.Disposable.instances_) {
2918     goog.Disposable.instances_.hasOwnProperty(id) && ret.push(goog.Disposable.instances_[Number(id)]);
2919   }
2920   return ret;
2922 goog.Disposable.clearUndisposedObjects = function() {
2923   goog.Disposable.instances_ = {};
2925 goog.Disposable.prototype.disposed_ = !1;
2926 goog.Disposable.prototype.isDisposed = function() {
2927   return this.disposed_;
2929 goog.Disposable.prototype.dispose = function() {
2930   if (!this.disposed_ && (this.disposed_ = !0, this.disposeInternal(), goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF)) {
2931     var uid = goog.getUid(this);
2932     if (goog.Disposable.MONITORING_MODE == goog.Disposable.MonitoringMode.PERMANENT && !goog.Disposable.instances_.hasOwnProperty(uid)) {
2933       throw Error(this + " did not call the goog.Disposable base constructor or was disposed of after a clearUndisposedObjects call");
2934     }
2935     delete goog.Disposable.instances_[uid];
2936   }
2938 goog.Disposable.prototype.disposeInternal = function() {
2939   if (this.onDisposeCallbacks_) {
2940     for (;this.onDisposeCallbacks_.length;) {
2941       this.onDisposeCallbacks_.shift()();
2942     }
2943   }
2945 goog.Disposable.isDisposed = function(obj) {
2946   return obj && "function" == typeof obj.isDisposed ? obj.isDisposed() : !1;
2948 goog.dispose = function(obj) {
2949   obj && "function" == typeof obj.dispose && obj.dispose();
2951 goog.disposeAll = function(var_args) {
2952   for (var i = 0, len = arguments.length;i < len;++i) {
2953     var disposable = arguments[i];
2954     goog.isArrayLike(disposable) ? goog.disposeAll.apply(null, disposable) : goog.dispose(disposable);
2955   }
2957 goog.events = {};
2958 goog.events.EventId = function(eventId) {
2959   this.id = eventId;
2961 goog.events.EventId.prototype.toString = function() {
2962   return this.id;
2964 goog.events.Event = function(type, opt_target) {
2965   this.type = type instanceof goog.events.EventId ? String(type) : type;
2966   this.currentTarget = this.target = opt_target;
2967   this.defaultPrevented = this.propagationStopped_ = !1;
2968   this.returnValue_ = !0;
2970 goog.events.Event.prototype.disposeInternal = function() {
2972 goog.events.Event.prototype.dispose = function() {
2974 goog.events.Event.prototype.stopPropagation = function() {
2975   this.propagationStopped_ = !0;
2977 goog.events.Event.prototype.preventDefault = function() {
2978   this.defaultPrevented = !0;
2979   this.returnValue_ = !1;
2981 goog.events.Event.stopPropagation = function(e) {
2982   e.stopPropagation();
2984 goog.events.Event.preventDefault = function(e) {
2985   e.preventDefault();
2987 goog.reflect = {};
2988 goog.reflect.object = function(type, object) {
2989   return object;
2991 goog.reflect.sinkValue = function(x) {
2992   goog.reflect.sinkValue[" "](x);
2993   return x;
2995 goog.reflect.sinkValue[" "] = goog.nullFunction;
2996 goog.reflect.canAccessProperty = function(obj, prop) {
2997   try {
2998     return goog.reflect.sinkValue(obj[prop]), !0;
2999   } catch (e) {
3000   }
3001   return!1;
3003 goog.events.BrowserFeature = {HAS_W3C_BUTTON:!goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9), HAS_W3C_EVENT_SUPPORT:!goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9), SET_KEY_CODE_TO_PREVENT_DEFAULT:goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("9"), HAS_NAVIGATOR_ONLINE_PROPERTY:!goog.userAgent.WEBKIT || goog.userAgent.isVersionOrHigher("528"), HAS_HTML5_NETWORK_EVENT_SUPPORT:goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher("1.9b") || goog.userAgent.IE && 
3004 goog.userAgent.isVersionOrHigher("8") || goog.userAgent.OPERA && goog.userAgent.isVersionOrHigher("9.5") || goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher("528"), HTML5_NETWORK_EVENTS_FIRE_ON_BODY:goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher("8") || goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("9"), TOUCH_ENABLED:"ontouchstart" in goog.global || !!(goog.global.document && document.documentElement && "ontouchstart" in document.documentElement) || !(!goog.global.navigator || 
3005 !goog.global.navigator.msMaxTouchPoints)};
3006 goog.events.getVendorPrefixedName_ = function(eventName) {
3007   return goog.userAgent.WEBKIT ? "webkit" + eventName : goog.userAgent.OPERA ? "o" + eventName.toLowerCase() : eventName.toLowerCase();
3009 goog.events.EventType = {CLICK:"click", RIGHTCLICK:"rightclick", DBLCLICK:"dblclick", MOUSEDOWN:"mousedown", MOUSEUP:"mouseup", MOUSEOVER:"mouseover", MOUSEOUT:"mouseout", MOUSEMOVE:"mousemove", MOUSEENTER:"mouseenter", MOUSELEAVE:"mouseleave", SELECTSTART:"selectstart", WHEEL:"wheel", KEYPRESS:"keypress", KEYDOWN:"keydown", KEYUP:"keyup", BLUR:"blur", FOCUS:"focus", DEACTIVATE:"deactivate", FOCUSIN:goog.userAgent.IE ? "focusin" : "DOMFocusIn", FOCUSOUT:goog.userAgent.IE ? "focusout" : "DOMFocusOut", 
3010 CHANGE:"change", SELECT:"select", SUBMIT:"submit", INPUT:"input", PROPERTYCHANGE:"propertychange", DRAGSTART:"dragstart", DRAG:"drag", DRAGENTER:"dragenter", DRAGOVER:"dragover", DRAGLEAVE:"dragleave", DROP:"drop", DRAGEND:"dragend", TOUCHSTART:"touchstart", TOUCHMOVE:"touchmove", TOUCHEND:"touchend", TOUCHCANCEL:"touchcancel", BEFOREUNLOAD:"beforeunload", CONSOLEMESSAGE:"consolemessage", CONTEXTMENU:"contextmenu", DOMCONTENTLOADED:"DOMContentLoaded", ERROR:"error", HELP:"help", LOAD:"load", LOSECAPTURE:"losecapture", 
3011 ORIENTATIONCHANGE:"orientationchange", READYSTATECHANGE:"readystatechange", RESIZE:"resize", SCROLL:"scroll", UNLOAD:"unload", HASHCHANGE:"hashchange", PAGEHIDE:"pagehide", PAGESHOW:"pageshow", POPSTATE:"popstate", COPY:"copy", PASTE:"paste", CUT:"cut", BEFORECOPY:"beforecopy", BEFORECUT:"beforecut", BEFOREPASTE:"beforepaste", ONLINE:"online", OFFLINE:"offline", MESSAGE:"message", CONNECT:"connect", ANIMATIONSTART:goog.events.getVendorPrefixedName_("AnimationStart"), ANIMATIONEND:goog.events.getVendorPrefixedName_("AnimationEnd"), 
3012 ANIMATIONITERATION:goog.events.getVendorPrefixedName_("AnimationIteration"), TRANSITIONEND:goog.events.getVendorPrefixedName_("TransitionEnd"), POINTERDOWN:"pointerdown", POINTERUP:"pointerup", POINTERCANCEL:"pointercancel", POINTERMOVE:"pointermove", POINTEROVER:"pointerover", POINTEROUT:"pointerout", POINTERENTER:"pointerenter", POINTERLEAVE:"pointerleave", GOTPOINTERCAPTURE:"gotpointercapture", LOSTPOINTERCAPTURE:"lostpointercapture", MSGESTURECHANGE:"MSGestureChange", MSGESTUREEND:"MSGestureEnd", 
3013 MSGESTUREHOLD:"MSGestureHold", MSGESTURESTART:"MSGestureStart", MSGESTURETAP:"MSGestureTap", MSGOTPOINTERCAPTURE:"MSGotPointerCapture", MSINERTIASTART:"MSInertiaStart", MSLOSTPOINTERCAPTURE:"MSLostPointerCapture", MSPOINTERCANCEL:"MSPointerCancel", MSPOINTERDOWN:"MSPointerDown", MSPOINTERENTER:"MSPointerEnter", MSPOINTERHOVER:"MSPointerHover", MSPOINTERLEAVE:"MSPointerLeave", MSPOINTERMOVE:"MSPointerMove", MSPOINTEROUT:"MSPointerOut", MSPOINTEROVER:"MSPointerOver", MSPOINTERUP:"MSPointerUp", TEXTINPUT:"textinput", 
3014 COMPOSITIONSTART:"compositionstart", COMPOSITIONUPDATE:"compositionupdate", COMPOSITIONEND:"compositionend", EXIT:"exit", LOADABORT:"loadabort", LOADCOMMIT:"loadcommit", LOADREDIRECT:"loadredirect", LOADSTART:"loadstart", LOADSTOP:"loadstop", RESPONSIVE:"responsive", SIZECHANGED:"sizechanged", UNRESPONSIVE:"unresponsive", VISIBILITYCHANGE:"visibilitychange", STORAGE:"storage", DOMSUBTREEMODIFIED:"DOMSubtreeModified", DOMNODEINSERTED:"DOMNodeInserted", DOMNODEREMOVED:"DOMNodeRemoved", DOMNODEREMOVEDFROMDOCUMENT:"DOMNodeRemovedFromDocument", 
3015 DOMNODEINSERTEDINTODOCUMENT:"DOMNodeInsertedIntoDocument", DOMATTRMODIFIED:"DOMAttrModified", DOMCHARACTERDATAMODIFIED:"DOMCharacterDataModified"};
3016 goog.events.BrowserEvent = function(opt_e, opt_currentTarget) {
3017   goog.events.Event.call(this, opt_e ? opt_e.type : "");
3018   this.relatedTarget = this.currentTarget = this.target = null;
3019   this.charCode = this.keyCode = this.button = this.screenY = this.screenX = this.clientY = this.clientX = this.offsetY = this.offsetX = 0;
3020   this.metaKey = this.shiftKey = this.altKey = this.ctrlKey = !1;
3021   this.event_ = this.state = null;
3022   opt_e && this.init(opt_e, opt_currentTarget);
3024 goog.inherits(goog.events.BrowserEvent, goog.events.Event);
3025 goog.events.BrowserEvent.MouseButton = {LEFT:0, MIDDLE:1, RIGHT:2};
3026 goog.events.BrowserEvent.IEButtonMap = [1, 4, 2];
3027 goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) {
3028   var type = this.type = e.type;
3029   this.target = e.target || e.srcElement;
3030   this.currentTarget = opt_currentTarget;
3031   var relatedTarget = e.relatedTarget;
3032   relatedTarget ? goog.userAgent.GECKO && (goog.reflect.canAccessProperty(relatedTarget, "nodeName") || (relatedTarget = null)) : type == goog.events.EventType.MOUSEOVER ? relatedTarget = e.fromElement : type == goog.events.EventType.MOUSEOUT && (relatedTarget = e.toElement);
3033   this.relatedTarget = relatedTarget;
3034   this.offsetX = goog.userAgent.WEBKIT || void 0 !== e.offsetX ? e.offsetX : e.layerX;
3035   this.offsetY = goog.userAgent.WEBKIT || void 0 !== e.offsetY ? e.offsetY : e.layerY;
3036   this.clientX = void 0 !== e.clientX ? e.clientX : e.pageX;
3037   this.clientY = void 0 !== e.clientY ? e.clientY : e.pageY;
3038   this.screenX = e.screenX || 0;
3039   this.screenY = e.screenY || 0;
3040   this.button = e.button;
3041   this.keyCode = e.keyCode || 0;
3042   this.charCode = e.charCode || ("keypress" == type ? e.keyCode : 0);
3043   this.ctrlKey = e.ctrlKey;
3044   this.altKey = e.altKey;
3045   this.shiftKey = e.shiftKey;
3046   this.metaKey = e.metaKey;
3047   this.state = e.state;
3048   this.event_ = e;
3049   e.defaultPrevented && this.preventDefault();
3051 goog.events.BrowserEvent.prototype.stopPropagation = function() {
3052   goog.events.BrowserEvent.superClass_.stopPropagation.call(this);
3053   this.event_.stopPropagation ? this.event_.stopPropagation() : this.event_.cancelBubble = !0;
3055 goog.events.BrowserEvent.prototype.preventDefault = function() {
3056   goog.events.BrowserEvent.superClass_.preventDefault.call(this);
3057   var be = this.event_;
3058   if (be.preventDefault) {
3059     be.preventDefault();
3060   } else {
3061     if (be.returnValue = !1, goog.events.BrowserFeature.SET_KEY_CODE_TO_PREVENT_DEFAULT) {
3062       try {
3063         if (be.ctrlKey || 112 <= be.keyCode && 123 >= be.keyCode) {
3064           be.keyCode = -1;
3065         }
3066       } catch (ex) {
3067       }
3068     }
3069   }
3071 goog.events.BrowserEvent.prototype.disposeInternal = function() {
3073 goog.events.Listenable = function() {
3075 goog.events.Listenable.IMPLEMENTED_BY_PROP = "closure_listenable_" + (1E6 * Math.random() | 0);
3076 goog.events.Listenable.addImplementation = function(cls) {
3077   cls.prototype[goog.events.Listenable.IMPLEMENTED_BY_PROP] = !0;
3079 goog.events.Listenable.isImplementedBy = function(obj) {
3080   return!(!obj || !obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]);
3082 goog.events.ListenableKey = function() {
3084 goog.events.ListenableKey.counter_ = 0;
3085 goog.events.ListenableKey.reserveKey = function() {
3086   return++goog.events.ListenableKey.counter_;
3088 goog.events.Listener = function(listener, proxy, src, type, capture, opt_handler) {
3089   this.listener = listener;
3090   this.proxy = proxy;
3091   this.src = src;
3092   this.type = type;
3093   this.capture = !!capture;
3094   this.handler = opt_handler;
3095   this.key = goog.events.ListenableKey.reserveKey();
3096   this.removed = this.callOnce = !1;
3098 goog.events.Listener.ENABLE_MONITORING = !1;
3099 goog.events.Listener.prototype.markAsRemoved = function() {
3100   this.removed = !0;
3101   this.handler = this.src = this.proxy = this.listener = null;
3103 goog.events.ListenerMap = function(src) {
3104   this.src = src;
3105   this.listeners = {};
3106   this.typeCount_ = 0;
3108 goog.events.ListenerMap.prototype.getTypeCount = function() {
3109   return this.typeCount_;
3111 goog.events.ListenerMap.prototype.add = function(type, listener, callOnce, opt_useCapture, opt_listenerScope) {
3112   var typeStr = type.toString(), listenerArray = this.listeners[typeStr];
3113   listenerArray || (listenerArray = this.listeners[typeStr] = [], this.typeCount_++);
3114   var listenerObj, index = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, opt_useCapture, opt_listenerScope);
3115   -1 < index ? (listenerObj = listenerArray[index], callOnce || (listenerObj.callOnce = !1)) : (listenerObj = new goog.events.Listener(listener, null, this.src, typeStr, !!opt_useCapture, opt_listenerScope), listenerObj.callOnce = callOnce, listenerArray.push(listenerObj));
3116   return listenerObj;
3118 goog.events.ListenerMap.prototype.remove = function(type, listener, opt_useCapture, opt_listenerScope) {
3119   var typeStr = type.toString();
3120   if (!(typeStr in this.listeners)) {
3121     return!1;
3122   }
3123   var listenerArray = this.listeners[typeStr], index = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, opt_useCapture, opt_listenerScope);
3124   if (-1 < index) {
3125     var listenerObj = listenerArray[index];
3126     listenerObj.markAsRemoved();
3127     goog.array.removeAt(listenerArray, index);
3128     0 == listenerArray.length && (delete this.listeners[typeStr], this.typeCount_--);
3129     return!0;
3130   }
3131   return!1;
3133 goog.events.ListenerMap.prototype.removeByKey = function(listener) {
3134   var type = listener.type;
3135   if (!(type in this.listeners)) {
3136     return!1;
3137   }
3138   var removed = goog.array.remove(this.listeners[type], listener);
3139   removed && (listener.markAsRemoved(), 0 == this.listeners[type].length && (delete this.listeners[type], this.typeCount_--));
3140   return removed;
3142 goog.events.ListenerMap.prototype.removeAll = function(opt_type) {
3143   var typeStr = opt_type && opt_type.toString(), count = 0, type;
3144   for (type in this.listeners) {
3145     if (!typeStr || type == typeStr) {
3146       for (var listenerArray = this.listeners[type], i = 0;i < listenerArray.length;i++) {
3147         ++count, listenerArray[i].markAsRemoved();
3148       }
3149       delete this.listeners[type];
3150       this.typeCount_--;
3151     }
3152   }
3153   return count;
3155 goog.events.ListenerMap.prototype.getListeners = function(type, capture) {
3156   var listenerArray = this.listeners[type.toString()], rv = [];
3157   if (listenerArray) {
3158     for (var i = 0;i < listenerArray.length;++i) {
3159       var listenerObj = listenerArray[i];
3160       listenerObj.capture == capture && rv.push(listenerObj);
3161     }
3162   }
3163   return rv;
3165 goog.events.ListenerMap.prototype.getListener = function(type, listener, capture, opt_listenerScope) {
3166   var listenerArray = this.listeners[type.toString()], i = -1;
3167   listenerArray && (i = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, capture, opt_listenerScope));
3168   return-1 < i ? listenerArray[i] : null;
3170 goog.events.ListenerMap.prototype.hasListener = function(opt_type, opt_capture) {
3171   var hasType = goog.isDef(opt_type), typeStr = hasType ? opt_type.toString() : "", hasCapture = goog.isDef(opt_capture);
3172   return goog.object.some(this.listeners, function(listenerArray) {
3173     for (var i = 0;i < listenerArray.length;++i) {
3174       if (!(hasType && listenerArray[i].type != typeStr || hasCapture && listenerArray[i].capture != opt_capture)) {
3175         return!0;
3176       }
3177     }
3178     return!1;
3179   });
3181 goog.events.ListenerMap.findListenerIndex_ = function(listenerArray, listener, opt_useCapture, opt_listenerScope) {
3182   for (var i = 0;i < listenerArray.length;++i) {
3183     var listenerObj = listenerArray[i];
3184     if (!listenerObj.removed && listenerObj.listener == listener && listenerObj.capture == !!opt_useCapture && listenerObj.handler == opt_listenerScope) {
3185       return i;
3186     }
3187   }
3188   return-1;
3190 goog.events.LISTENER_MAP_PROP_ = "closure_lm_" + (1E6 * Math.random() | 0);
3191 goog.events.onString_ = "on";
3192 goog.events.onStringMap_ = {};
3193 goog.events.CaptureSimulationMode = {OFF_AND_FAIL:0, OFF_AND_SILENT:1, ON:2};
3194 goog.events.CAPTURE_SIMULATION_MODE = 2;
3195 goog.events.listenerCountEstimate_ = 0;
3196 goog.events.listen = function(src, type, listener, opt_capt, opt_handler) {
3197   if (goog.isArray(type)) {
3198     for (var i = 0;i < type.length;i++) {
3199       goog.events.listen(src, type[i], listener, opt_capt, opt_handler);
3200     }
3201     return null;
3202   }
3203   listener = goog.events.wrapListener(listener);
3204   return goog.events.Listenable.isImplementedBy(src) ? src.listen(type, listener, opt_capt, opt_handler) : goog.events.listen_(src, type, listener, !1, opt_capt, opt_handler);
3206 goog.events.listen_ = function(src, type, listener, callOnce, opt_capt, opt_handler) {
3207   if (!type) {
3208     throw Error("Invalid event type");
3209   }
3210   var capture = !!opt_capt;
3211   if (capture && !goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {
3212     if (goog.events.CAPTURE_SIMULATION_MODE == goog.events.CaptureSimulationMode.OFF_AND_FAIL) {
3213       return goog.asserts.fail("Can not register capture listener in IE8-."), null;
3214     }
3215     if (goog.events.CAPTURE_SIMULATION_MODE == goog.events.CaptureSimulationMode.OFF_AND_SILENT) {
3216       return null;
3217     }
3218   }
3219   var listenerMap = goog.events.getListenerMap_(src);
3220   listenerMap || (src[goog.events.LISTENER_MAP_PROP_] = listenerMap = new goog.events.ListenerMap(src));
3221   var listenerObj = listenerMap.add(type, listener, callOnce, opt_capt, opt_handler);
3222   if (listenerObj.proxy) {
3223     return listenerObj;
3224   }
3225   var proxy = goog.events.getProxy();
3226   listenerObj.proxy = proxy;
3227   proxy.src = src;
3228   proxy.listener = listenerObj;
3229   src.addEventListener ? src.addEventListener(type.toString(), proxy, capture) : src.attachEvent(goog.events.getOnString_(type.toString()), proxy);
3230   goog.events.listenerCountEstimate_++;
3231   return listenerObj;
3233 goog.events.getProxy = function() {
3234   var proxyCallbackFunction = goog.events.handleBrowserEvent_, f = goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT ? function(eventObject) {
3235     return proxyCallbackFunction.call(f.src, f.listener, eventObject);
3236   } : function(eventObject) {
3237     var v = proxyCallbackFunction.call(f.src, f.listener, eventObject);
3238     if (!v) {
3239       return v;
3240     }
3241   };
3242   return f;
3244 goog.events.listenOnce = function(src, type, listener, opt_capt, opt_handler) {
3245   if (goog.isArray(type)) {
3246     for (var i = 0;i < type.length;i++) {
3247       goog.events.listenOnce(src, type[i], listener, opt_capt, opt_handler);
3248     }
3249     return null;
3250   }
3251   listener = goog.events.wrapListener(listener);
3252   return goog.events.Listenable.isImplementedBy(src) ? src.listenOnce(type, listener, opt_capt, opt_handler) : goog.events.listen_(src, type, listener, !0, opt_capt, opt_handler);
3254 goog.events.listenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) {
3255   wrapper.listen(src, listener, opt_capt, opt_handler);
3257 goog.events.unlisten = function(src, type, listener, opt_capt, opt_handler) {
3258   if (goog.isArray(type)) {
3259     for (var i = 0;i < type.length;i++) {
3260       goog.events.unlisten(src, type[i], listener, opt_capt, opt_handler);
3261     }
3262     return null;
3263   }
3264   listener = goog.events.wrapListener(listener);
3265   if (goog.events.Listenable.isImplementedBy(src)) {
3266     return src.unlisten(type, listener, opt_capt, opt_handler);
3267   }
3268   if (!src) {
3269     return!1;
3270   }
3271   var capture = !!opt_capt, listenerMap = goog.events.getListenerMap_(src);
3272   if (listenerMap) {
3273     var listenerObj = listenerMap.getListener(type, listener, capture, opt_handler);
3274     if (listenerObj) {
3275       return goog.events.unlistenByKey(listenerObj);
3276     }
3277   }
3278   return!1;
3280 goog.events.unlistenByKey = function(key) {
3281   if (goog.isNumber(key)) {
3282     return!1;
3283   }
3284   var listener = key;
3285   if (!listener || listener.removed) {
3286     return!1;
3287   }
3288   var src = listener.src;
3289   if (goog.events.Listenable.isImplementedBy(src)) {
3290     return src.unlistenByKey(listener);
3291   }
3292   var type = listener.type, proxy = listener.proxy;
3293   src.removeEventListener ? src.removeEventListener(type, proxy, listener.capture) : src.detachEvent && src.detachEvent(goog.events.getOnString_(type), proxy);
3294   goog.events.listenerCountEstimate_--;
3295   var listenerMap = goog.events.getListenerMap_(src);
3296   listenerMap ? (listenerMap.removeByKey(listener), 0 == listenerMap.getTypeCount() && (listenerMap.src = null, src[goog.events.LISTENER_MAP_PROP_] = null)) : listener.markAsRemoved();
3297   return!0;
3299 goog.events.unlistenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) {
3300   wrapper.unlisten(src, listener, opt_capt, opt_handler);
3302 goog.events.removeAll = function(obj, opt_type) {
3303   if (!obj) {
3304     return 0;
3305   }
3306   if (goog.events.Listenable.isImplementedBy(obj)) {
3307     return obj.removeAllListeners(opt_type);
3308   }
3309   var listenerMap = goog.events.getListenerMap_(obj);
3310   if (!listenerMap) {
3311     return 0;
3312   }
3313   var count = 0, typeStr = opt_type && opt_type.toString(), type;
3314   for (type in listenerMap.listeners) {
3315     if (!typeStr || type == typeStr) {
3316       for (var listeners = listenerMap.listeners[type].concat(), i = 0;i < listeners.length;++i) {
3317         goog.events.unlistenByKey(listeners[i]) && ++count;
3318       }
3319     }
3320   }
3321   return count;
3323 goog.events.removeAllNativeListeners = function() {
3324   return goog.events.listenerCountEstimate_ = 0;
3326 goog.events.getListeners = function(obj, type, capture) {
3327   if (goog.events.Listenable.isImplementedBy(obj)) {
3328     return obj.getListeners(type, capture);
3329   }
3330   if (!obj) {
3331     return[];
3332   }
3333   var listenerMap = goog.events.getListenerMap_(obj);
3334   return listenerMap ? listenerMap.getListeners(type, capture) : [];
3336 goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) {
3337   listener = goog.events.wrapListener(listener);
3338   var capture = !!opt_capt;
3339   if (goog.events.Listenable.isImplementedBy(src)) {
3340     return src.getListener(type, listener, capture, opt_handler);
3341   }
3342   if (!src) {
3343     return null;
3344   }
3345   var listenerMap = goog.events.getListenerMap_(src);
3346   return listenerMap ? listenerMap.getListener(type, listener, capture, opt_handler) : null;
3348 goog.events.hasListener = function(obj, opt_type, opt_capture) {
3349   if (goog.events.Listenable.isImplementedBy(obj)) {
3350     return obj.hasListener(opt_type, opt_capture);
3351   }
3352   var listenerMap = goog.events.getListenerMap_(obj);
3353   return!!listenerMap && listenerMap.hasListener(opt_type, opt_capture);
3355 goog.events.expose = function(e) {
3356   var str = [], key;
3357   for (key in e) {
3358     e[key] && e[key].id ? str.push(key + " = " + e[key] + " (" + e[key].id + ")") : str.push(key + " = " + e[key]);
3359   }
3360   return str.join("\n");
3362 goog.events.getOnString_ = function(type) {
3363   return type in goog.events.onStringMap_ ? goog.events.onStringMap_[type] : goog.events.onStringMap_[type] = goog.events.onString_ + type;
3365 goog.events.fireListeners = function(obj, type, capture, eventObject) {
3366   return goog.events.Listenable.isImplementedBy(obj) ? obj.fireListeners(type, capture, eventObject) : goog.events.fireListeners_(obj, type, capture, eventObject);
3368 goog.events.fireListeners_ = function(obj, type, capture, eventObject) {
3369   var retval = 1, listenerMap = goog.events.getListenerMap_(obj);
3370   if (listenerMap) {
3371     var listenerArray = listenerMap.listeners[type.toString()];
3372     if (listenerArray) {
3373       for (var listenerArray = listenerArray.concat(), i = 0;i < listenerArray.length;i++) {
3374         var listener = listenerArray[i];
3375         listener && listener.capture == capture && !listener.removed && (retval &= !1 !== goog.events.fireListener(listener, eventObject));
3376       }
3377     }
3378   }
3379   return Boolean(retval);
3381 goog.events.fireListener = function(listener, eventObject) {
3382   var listenerFn = listener.listener, listenerHandler = listener.handler || listener.src;
3383   listener.callOnce && goog.events.unlistenByKey(listener);
3384   return listenerFn.call(listenerHandler, eventObject);
3386 goog.events.getTotalListenerCount = function() {
3387   return goog.events.listenerCountEstimate_;
3389 goog.events.dispatchEvent = function(src, e) {
3390   goog.asserts.assert(goog.events.Listenable.isImplementedBy(src), "Can not use goog.events.dispatchEvent with non-goog.events.Listenable instance.");
3391   return src.dispatchEvent(e);
3393 goog.events.protectBrowserEventEntryPoint = function(errorHandler) {
3394   goog.events.handleBrowserEvent_ = errorHandler.protectEntryPoint(goog.events.handleBrowserEvent_);
3396 goog.events.handleBrowserEvent_ = function(listener, opt_evt) {
3397   if (listener.removed) {
3398     return!0;
3399   }
3400   if (!goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {
3401     var ieEvent = opt_evt || goog.getObjectByName("window.event"), evt = new goog.events.BrowserEvent(ieEvent, this), retval = !0;
3402     if (goog.events.CAPTURE_SIMULATION_MODE == goog.events.CaptureSimulationMode.ON) {
3403       if (!goog.events.isMarkedIeEvent_(ieEvent)) {
3404         goog.events.markIeEvent_(ieEvent);
3405         for (var ancestors = [], parent = evt.currentTarget;parent;parent = parent.parentNode) {
3406           ancestors.push(parent);
3407         }
3408         for (var type = listener.type, i = ancestors.length - 1;!evt.propagationStopped_ && 0 <= i;i--) {
3409           evt.currentTarget = ancestors[i], retval &= goog.events.fireListeners_(ancestors[i], type, !0, evt);
3410         }
3411         for (i = 0;!evt.propagationStopped_ && i < ancestors.length;i++) {
3412           evt.currentTarget = ancestors[i], retval &= goog.events.fireListeners_(ancestors[i], type, !1, evt);
3413         }
3414       }
3415     } else {
3416       retval = goog.events.fireListener(listener, evt);
3417     }
3418     return retval;
3419   }
3420   return goog.events.fireListener(listener, new goog.events.BrowserEvent(opt_evt, this));
3422 goog.events.markIeEvent_ = function(e) {
3423   var useReturnValue = !1;
3424   if (0 == e.keyCode) {
3425     try {
3426       e.keyCode = -1;
3427       return;
3428     } catch (ex) {
3429       useReturnValue = !0;
3430     }
3431   }
3432   if (useReturnValue || void 0 == e.returnValue) {
3433     e.returnValue = !0;
3434   }
3436 goog.events.isMarkedIeEvent_ = function(e) {
3437   return 0 > e.keyCode || void 0 != e.returnValue;
3439 goog.events.uniqueIdCounter_ = 0;
3440 goog.events.getUniqueId = function(identifier) {
3441   return identifier + "_" + goog.events.uniqueIdCounter_++;
3443 goog.events.getListenerMap_ = function(src) {
3444   var listenerMap = src[goog.events.LISTENER_MAP_PROP_];
3445   return listenerMap instanceof goog.events.ListenerMap ? listenerMap : null;
3447 goog.events.LISTENER_WRAPPER_PROP_ = "__closure_events_fn_" + (1E9 * Math.random() >>> 0);
3448 goog.events.wrapListener = function(listener) {
3449   goog.asserts.assert(listener, "Listener can not be null.");
3450   if (goog.isFunction(listener)) {
3451     return listener;
3452   }
3453   goog.asserts.assert(listener.handleEvent, "An object listener must have handleEvent method.");
3454   listener[goog.events.LISTENER_WRAPPER_PROP_] || (listener[goog.events.LISTENER_WRAPPER_PROP_] = function(e) {
3455     return listener.handleEvent(e);
3456   });
3457   return listener[goog.events.LISTENER_WRAPPER_PROP_];
3459 goog.debug.entryPointRegistry.register(function(transformer) {
3460   goog.events.handleBrowserEvent_ = transformer(goog.events.handleBrowserEvent_);
3462 goog.events.EventTarget = function() {
3463   goog.Disposable.call(this);
3464   this.eventTargetListeners_ = new goog.events.ListenerMap(this);
3465   this.actualEventTarget_ = this;
3466   this.parentEventTarget_ = null;
3468 goog.inherits(goog.events.EventTarget, goog.Disposable);
3469 goog.events.Listenable.addImplementation(goog.events.EventTarget);
3470 goog.events.EventTarget.MAX_ANCESTORS_ = 1E3;
3471 goog.events.EventTarget.prototype.getParentEventTarget = function() {
3472   return this.parentEventTarget_;
3474 goog.events.EventTarget.prototype.addEventListener = function(type, handler, opt_capture, opt_handlerScope) {
3475   goog.events.listen(this, type, handler, opt_capture, opt_handlerScope);
3477 goog.events.EventTarget.prototype.removeEventListener = function(type, handler, opt_capture, opt_handlerScope) {
3478   goog.events.unlisten(this, type, handler, opt_capture, opt_handlerScope);
3480 goog.events.EventTarget.prototype.dispatchEvent = function(e) {
3481   this.assertInitialized_();
3482   var ancestorsTree, ancestor = this.getParentEventTarget();
3483   if (ancestor) {
3484     ancestorsTree = [];
3485     for (var ancestorCount = 1;ancestor;ancestor = ancestor.getParentEventTarget()) {
3486       ancestorsTree.push(ancestor), goog.asserts.assert(++ancestorCount < goog.events.EventTarget.MAX_ANCESTORS_, "infinite loop");
3487     }
3488   }
3489   return goog.events.EventTarget.dispatchEventInternal_(this.actualEventTarget_, e, ancestorsTree);
3491 goog.events.EventTarget.prototype.disposeInternal = function() {
3492   goog.events.EventTarget.superClass_.disposeInternal.call(this);
3493   this.removeAllListeners();
3494   this.parentEventTarget_ = null;
3496 goog.events.EventTarget.prototype.listen = function(type, listener, opt_useCapture, opt_listenerScope) {
3497   this.assertInitialized_();
3498   return this.eventTargetListeners_.add(String(type), listener, !1, opt_useCapture, opt_listenerScope);
3500 goog.events.EventTarget.prototype.listenOnce = function(type, listener, opt_useCapture, opt_listenerScope) {
3501   return this.eventTargetListeners_.add(String(type), listener, !0, opt_useCapture, opt_listenerScope);
3503 goog.events.EventTarget.prototype.unlisten = function(type, listener, opt_useCapture, opt_listenerScope) {
3504   return this.eventTargetListeners_.remove(String(type), listener, opt_useCapture, opt_listenerScope);
3506 goog.events.EventTarget.prototype.unlistenByKey = function(key) {
3507   return this.eventTargetListeners_.removeByKey(key);
3509 goog.events.EventTarget.prototype.removeAllListeners = function(opt_type) {
3510   return this.eventTargetListeners_ ? this.eventTargetListeners_.removeAll(opt_type) : 0;
3512 goog.events.EventTarget.prototype.fireListeners = function(type, capture, eventObject) {
3513   var listenerArray = this.eventTargetListeners_.listeners[String(type)];
3514   if (!listenerArray) {
3515     return!0;
3516   }
3517   for (var listenerArray = listenerArray.concat(), rv = !0, i = 0;i < listenerArray.length;++i) {
3518     var listener = listenerArray[i];
3519     if (listener && !listener.removed && listener.capture == capture) {
3520       var listenerFn = listener.listener, listenerHandler = listener.handler || listener.src;
3521       listener.callOnce && this.unlistenByKey(listener);
3522       rv = !1 !== listenerFn.call(listenerHandler, eventObject) && rv;
3523     }
3524   }
3525   return rv && 0 != eventObject.returnValue_;
3527 goog.events.EventTarget.prototype.getListeners = function(type, capture) {
3528   return this.eventTargetListeners_.getListeners(String(type), capture);
3530 goog.events.EventTarget.prototype.getListener = function(type, listener, capture, opt_listenerScope) {
3531   return this.eventTargetListeners_.getListener(String(type), listener, capture, opt_listenerScope);
3533 goog.events.EventTarget.prototype.hasListener = function(opt_type, opt_capture) {
3534   var id = goog.isDef(opt_type) ? String(opt_type) : void 0;
3535   return this.eventTargetListeners_.hasListener(id, opt_capture);
3537 goog.events.EventTarget.prototype.assertInitialized_ = function() {
3538   goog.asserts.assert(this.eventTargetListeners_, "Event target is not initialized. Did you call the superclass (goog.events.EventTarget) constructor?");
3540 goog.events.EventTarget.dispatchEventInternal_ = function(target, e, opt_ancestorsTree) {
3541   var type = e.type || e;
3542   if (goog.isString(e)) {
3543     e = new goog.events.Event(e, target);
3544   } else {
3545     if (e instanceof goog.events.Event) {
3546       e.target = e.target || target;
3547     } else {
3548       var oldEvent = e;
3549       e = new goog.events.Event(type, target);
3550       goog.object.extend(e, oldEvent);
3551     }
3552   }
3553   var rv = !0, currentTarget;
3554   if (opt_ancestorsTree) {
3555     for (var i = opt_ancestorsTree.length - 1;!e.propagationStopped_ && 0 <= i;i--) {
3556       currentTarget = e.currentTarget = opt_ancestorsTree[i], rv = currentTarget.fireListeners(type, !0, e) && rv;
3557     }
3558   }
3559   e.propagationStopped_ || (currentTarget = e.currentTarget = target, rv = currentTarget.fireListeners(type, !0, e) && rv, e.propagationStopped_ || (rv = currentTarget.fireListeners(type, !1, e) && rv));
3560   if (opt_ancestorsTree) {
3561     for (i = 0;!e.propagationStopped_ && i < opt_ancestorsTree.length;i++) {
3562       currentTarget = e.currentTarget = opt_ancestorsTree[i], rv = currentTarget.fireListeners(type, !1, e) && rv;
3563     }
3564   }
3565   return rv;
3567 goog.json = {};
3568 goog.json.USE_NATIVE_JSON = !1;
3569 goog.json.isValid = function(s) {
3570   if (/^\s*$/.test(s)) {
3571     return!1;
3572   }
3573   var backslashesRe = /\\["\\\/bfnrtu]/g, simpleValuesRe = /"[^"\\\n\r\u2028\u2029\x00-\x08\x0a-\x1f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, openBracketsRe = /(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g, remainderRe = /^[\],:{}\s\u2028\u2029]*$/;
3574   return remainderRe.test(s.replace(backslashesRe, "@").replace(simpleValuesRe, "]").replace(openBracketsRe, ""));
3576 goog.json.parse = goog.json.USE_NATIVE_JSON ? goog.global.JSON.parse : function(s) {
3577   var o = String(s);
3578   if (goog.json.isValid(o)) {
3579     try {
3580       return eval("(" + o + ")");
3581     } catch (ex) {
3582     }
3583   }
3584   throw Error("Invalid JSON string: " + o);
3586 goog.json.unsafeParse = goog.json.USE_NATIVE_JSON ? goog.global.JSON.parse : function(s) {
3587   return eval("(" + s + ")");
3589 goog.json.serialize = goog.json.USE_NATIVE_JSON ? goog.global.JSON.stringify : function(object, opt_replacer) {
3590   return(new goog.json.Serializer(opt_replacer)).serialize(object);
3592 goog.json.Serializer = function(opt_replacer) {
3593   this.replacer_ = opt_replacer;
3595 goog.json.Serializer.prototype.serialize = function(object) {
3596   var sb = [];
3597   this.serializeInternal(object, sb);
3598   return sb.join("");
3600 goog.json.Serializer.prototype.serializeInternal = function(object, sb) {
3601   switch(typeof object) {
3602     case "string":
3603       this.serializeString_(object, sb);
3604       break;
3605     case "number":
3606       this.serializeNumber_(object, sb);
3607       break;
3608     case "boolean":
3609       sb.push(object);
3610       break;
3611     case "undefined":
3612       sb.push("null");
3613       break;
3614     case "object":
3615       if (null == object) {
3616         sb.push("null");
3617         break;
3618       }
3619       if (goog.isArray(object)) {
3620         this.serializeArray(object, sb);
3621         break;
3622       }
3623       this.serializeObject_(object, sb);
3624       break;
3625     case "function":
3626       break;
3627     default:
3628       throw Error("Unknown type: " + typeof object);;
3629   }
3631 goog.json.Serializer.charToJsonCharCache_ = {'"':'\\"', "\\":"\\\\", "/":"\\/", "\b":"\\b", "\f":"\\f", "\n":"\\n", "\r":"\\r", "\t":"\\t", "\x0B":"\\u000b"};
3632 goog.json.Serializer.charsToReplace_ = /\uffff/.test("\uffff") ? /[\\\"\x00-\x1f\x7f-\uffff]/g : /[\\\"\x00-\x1f\x7f-\xff]/g;
3633 goog.json.Serializer.prototype.serializeString_ = function(s, sb) {
3634   sb.push('"', s.replace(goog.json.Serializer.charsToReplace_, function(c) {
3635     if (c in goog.json.Serializer.charToJsonCharCache_) {
3636       return goog.json.Serializer.charToJsonCharCache_[c];
3637     }
3638     var cc = c.charCodeAt(0), rv = "\\u";
3639     16 > cc ? rv += "000" : 256 > cc ? rv += "00" : 4096 > cc && (rv += "0");
3640     return goog.json.Serializer.charToJsonCharCache_[c] = rv + cc.toString(16);
3641   }), '"');
3643 goog.json.Serializer.prototype.serializeNumber_ = function(n, sb) {
3644   sb.push(isFinite(n) && !isNaN(n) ? n : "null");
3646 goog.json.Serializer.prototype.serializeArray = function(arr, sb) {
3647   var l = arr.length;
3648   sb.push("[");
3649   for (var sep = "", i = 0;i < l;i++) {
3650     sb.push(sep);
3651     var value = arr[i];
3652     this.serializeInternal(this.replacer_ ? this.replacer_.call(arr, String(i), value) : value, sb);
3653     sep = ",";
3654   }
3655   sb.push("]");
3657 goog.json.Serializer.prototype.serializeObject_ = function(obj, sb) {
3658   sb.push("{");
3659   var sep = "", key;
3660   for (key in obj) {
3661     if (Object.prototype.hasOwnProperty.call(obj, key)) {
3662       var value = obj[key];
3663       "function" != typeof value && (sb.push(sep), this.serializeString_(key, sb), sb.push(":"), this.serializeInternal(this.replacer_ ? this.replacer_.call(obj, key, value) : value, sb), sep = ",");
3664     }
3665   }
3666   sb.push("}");
3668 goog.structs = {};
3669 goog.structs.Collection = function() {
3671 goog.functions = {};
3672 goog.functions.constant = function(retValue) {
3673   return function() {
3674     return retValue;
3675   };
3677 goog.functions.FALSE = goog.functions.constant(!1);
3678 goog.functions.TRUE = goog.functions.constant(!0);
3679 goog.functions.NULL = goog.functions.constant(null);
3680 goog.functions.identity = function(opt_returnValue) {
3681   return opt_returnValue;
3683 goog.functions.error = function(message) {
3684   return function() {
3685     throw Error(message);
3686   };
3688 goog.functions.fail = function(err) {
3689   return function() {
3690     throw err;
3691   };
3693 goog.functions.lock = function(f, opt_numArgs) {
3694   opt_numArgs = opt_numArgs || 0;
3695   return function() {
3696     return f.apply(this, Array.prototype.slice.call(arguments, 0, opt_numArgs));
3697   };
3699 goog.functions.nth = function(n) {
3700   return function() {
3701     return arguments[n];
3702   };
3704 goog.functions.withReturnValue = function(f, retValue) {
3705   return goog.functions.sequence(f, goog.functions.constant(retValue));
3707 goog.functions.compose = function(fn, var_args) {
3708   var functions = arguments, length = functions.length;
3709   return function() {
3710     var result;
3711     length && (result = functions[length - 1].apply(this, arguments));
3712     for (var i = length - 2;0 <= i;i--) {
3713       result = functions[i].call(this, result);
3714     }
3715     return result;
3716   };
3718 goog.functions.sequence = function(var_args) {
3719   var functions = arguments, length = functions.length;
3720   return function() {
3721     for (var result, i = 0;i < length;i++) {
3722       result = functions[i].apply(this, arguments);
3723     }
3724     return result;
3725   };
3727 goog.functions.and = function(var_args) {
3728   var functions = arguments, length = functions.length;
3729   return function() {
3730     for (var i = 0;i < length;i++) {
3731       if (!functions[i].apply(this, arguments)) {
3732         return!1;
3733       }
3734     }
3735     return!0;
3736   };
3738 goog.functions.or = function(var_args) {
3739   var functions = arguments, length = functions.length;
3740   return function() {
3741     for (var i = 0;i < length;i++) {
3742       if (functions[i].apply(this, arguments)) {
3743         return!0;
3744       }
3745     }
3746     return!1;
3747   };
3749 goog.functions.not = function(f) {
3750   return function() {
3751     return!f.apply(this, arguments);
3752   };
3754 goog.functions.create = function(constructor, var_args) {
3755   var temp = function() {
3756   };
3757   temp.prototype = constructor.prototype;
3758   var obj = new temp;
3759   constructor.apply(obj, Array.prototype.slice.call(arguments, 1));
3760   return obj;
3762 goog.functions.CACHE_RETURN_VALUE = !0;
3763 goog.functions.cacheReturnValue = function(fn) {
3764   var called = !1, value;
3765   return function() {
3766     if (!goog.functions.CACHE_RETURN_VALUE) {
3767       return fn();
3768     }
3769     called || (value = fn(), called = !0);
3770     return value;
3771   };
3773 goog.iter = {};
3774 goog.iter.StopIteration = "StopIteration" in goog.global ? goog.global.StopIteration : Error("StopIteration");
3775 goog.iter.Iterator = function() {
3777 goog.iter.Iterator.prototype.next = function() {
3778   throw goog.iter.StopIteration;
3780 goog.iter.Iterator.prototype.__iterator__ = function() {
3781   return this;
3783 goog.iter.toIterator = function(iterable) {
3784   if (iterable instanceof goog.iter.Iterator) {
3785     return iterable;
3786   }
3787   if ("function" == typeof iterable.__iterator__) {
3788     return iterable.__iterator__(!1);
3789   }
3790   if (goog.isArrayLike(iterable)) {
3791     var i = 0, newIter = new goog.iter.Iterator;
3792     newIter.next = function() {
3793       for (;;) {
3794         if (i >= iterable.length) {
3795           throw goog.iter.StopIteration;
3796         }
3797         if (i in iterable) {
3798           return iterable[i++];
3799         }
3800         i++;
3801       }
3802     };
3803     return newIter;
3804   }
3805   throw Error("Not implemented");
3807 goog.iter.forEach = function(iterable, f, opt_obj) {
3808   if (goog.isArrayLike(iterable)) {
3809     try {
3810       goog.array.forEach(iterable, f, opt_obj);
3811     } catch (ex) {
3812       if (ex !== goog.iter.StopIteration) {
3813         throw ex;
3814       }
3815     }
3816   } else {
3817     iterable = goog.iter.toIterator(iterable);
3818     try {
3819       for (;;) {
3820         f.call(opt_obj, iterable.next(), void 0, iterable);
3821       }
3822     } catch (ex$$0) {
3823       if (ex$$0 !== goog.iter.StopIteration) {
3824         throw ex$$0;
3825       }
3826     }
3827   }
3829 goog.iter.filter = function(iterable, f, opt_obj) {
3830   var iterator = goog.iter.toIterator(iterable), newIter = new goog.iter.Iterator;
3831   newIter.next = function() {
3832     for (;;) {
3833       var val = iterator.next();
3834       if (f.call(opt_obj, val, void 0, iterator)) {
3835         return val;
3836       }
3837     }
3838   };
3839   return newIter;
3841 goog.iter.filterFalse = function(iterable, f, opt_obj) {
3842   return goog.iter.filter(iterable, goog.functions.not(f), opt_obj);
3844 goog.iter.range = function(startOrStop, opt_stop, opt_step) {
3845   var start = 0, stop = startOrStop, step = opt_step || 1;
3846   1 < arguments.length && (start = startOrStop, stop = opt_stop);
3847   if (0 == step) {
3848     throw Error("Range step argument must not be zero");
3849   }
3850   var newIter = new goog.iter.Iterator;
3851   newIter.next = function() {
3852     if (0 < step && start >= stop || 0 > step && start <= stop) {
3853       throw goog.iter.StopIteration;
3854     }
3855     var rv = start;
3856     start += step;
3857     return rv;
3858   };
3859   return newIter;
3861 goog.iter.join = function(iterable, deliminator) {
3862   return goog.iter.toArray(iterable).join(deliminator);
3864 goog.iter.map = function(iterable, f, opt_obj) {
3865   var iterator = goog.iter.toIterator(iterable), newIter = new goog.iter.Iterator;
3866   newIter.next = function() {
3867     var val = iterator.next();
3868     return f.call(opt_obj, val, void 0, iterator);
3869   };
3870   return newIter;
3872 goog.iter.reduce = function(iterable, f, val$$0, opt_obj) {
3873   var rval = val$$0;
3874   goog.iter.forEach(iterable, function(val) {
3875     rval = f.call(opt_obj, rval, val);
3876   });
3877   return rval;
3879 goog.iter.some = function(iterable, f, opt_obj) {
3880   iterable = goog.iter.toIterator(iterable);
3881   try {
3882     for (;;) {
3883       if (f.call(opt_obj, iterable.next(), void 0, iterable)) {
3884         return!0;
3885       }
3886     }
3887   } catch (ex) {
3888     if (ex !== goog.iter.StopIteration) {
3889       throw ex;
3890     }
3891   }
3892   return!1;
3894 goog.iter.every = function(iterable, f, opt_obj) {
3895   iterable = goog.iter.toIterator(iterable);
3896   try {
3897     for (;;) {
3898       if (!f.call(opt_obj, iterable.next(), void 0, iterable)) {
3899         return!1;
3900       }
3901     }
3902   } catch (ex) {
3903     if (ex !== goog.iter.StopIteration) {
3904       throw ex;
3905     }
3906   }
3907   return!0;
3909 goog.iter.chain = function(var_args) {
3910   return goog.iter.chainFromIterable(arguments);
3912 goog.iter.chainFromIterable = function(iterable) {
3913   var iterator = goog.iter.toIterator(iterable), iter = new goog.iter.Iterator, current = null;
3914   iter.next = function() {
3915     for (;;) {
3916       if (null == current) {
3917         var it = iterator.next();
3918         current = goog.iter.toIterator(it);
3919       }
3920       try {
3921         return current.next();
3922       } catch (ex) {
3923         if (ex !== goog.iter.StopIteration) {
3924           throw ex;
3925         }
3926         current = null;
3927       }
3928     }
3929   };
3930   return iter;
3932 goog.iter.dropWhile = function(iterable, f, opt_obj) {
3933   var iterator = goog.iter.toIterator(iterable), newIter = new goog.iter.Iterator, dropping = !0;
3934   newIter.next = function() {
3935     for (;;) {
3936       var val = iterator.next();
3937       if (!dropping || !f.call(opt_obj, val, void 0, iterator)) {
3938         return dropping = !1, val;
3939       }
3940     }
3941   };
3942   return newIter;
3944 goog.iter.takeWhile = function(iterable, f, opt_obj) {
3945   var iterator = goog.iter.toIterator(iterable), newIter = new goog.iter.Iterator, taking = !0;
3946   newIter.next = function() {
3947     for (;;) {
3948       if (taking) {
3949         var val = iterator.next();
3950         if (f.call(opt_obj, val, void 0, iterator)) {
3951           return val;
3952         }
3953         taking = !1;
3954       } else {
3955         throw goog.iter.StopIteration;
3956       }
3957     }
3958   };
3959   return newIter;
3961 goog.iter.toArray = function(iterable) {
3962   if (goog.isArrayLike(iterable)) {
3963     return goog.array.toArray(iterable);
3964   }
3965   iterable = goog.iter.toIterator(iterable);
3966   var array = [];
3967   goog.iter.forEach(iterable, function(val) {
3968     array.push(val);
3969   });
3970   return array;
3972 goog.iter.equals = function(iterable1, iterable2, opt_equalsFn) {
3973   var fillValue = {}, pairs = goog.iter.zipLongest(fillValue, iterable1, iterable2), equalsFn = opt_equalsFn || goog.array.defaultCompareEquality;
3974   return goog.iter.every(pairs, function(pair) {
3975     return equalsFn(pair[0], pair[1]);
3976   });
3978 goog.iter.nextOrValue = function(iterable, defaultValue) {
3979   try {
3980     return goog.iter.toIterator(iterable).next();
3981   } catch (e) {
3982     if (e != goog.iter.StopIteration) {
3983       throw e;
3984     }
3985     return defaultValue;
3986   }
3988 goog.iter.product = function(var_args) {
3989   var someArrayEmpty = goog.array.some(arguments, function(arr) {
3990     return!arr.length;
3991   });
3992   if (someArrayEmpty || !arguments.length) {
3993     return new goog.iter.Iterator;
3994   }
3995   var iter = new goog.iter.Iterator, arrays = arguments, indicies = goog.array.repeat(0, arrays.length);
3996   iter.next = function() {
3997     if (indicies) {
3998       for (var retVal = goog.array.map(indicies, function(valueIndex, arrayIndex) {
3999         return arrays[arrayIndex][valueIndex];
4000       }), i = indicies.length - 1;0 <= i;i--) {
4001         goog.asserts.assert(indicies);
4002         if (indicies[i] < arrays[i].length - 1) {
4003           indicies[i]++;
4004           break;
4005         }
4006         if (0 == i) {
4007           indicies = null;
4008           break;
4009         }
4010         indicies[i] = 0;
4011       }
4012       return retVal;
4013     }
4014     throw goog.iter.StopIteration;
4015   };
4016   return iter;
4018 goog.iter.cycle = function(iterable) {
4019   var baseIterator = goog.iter.toIterator(iterable), cache = [], cacheIndex = 0, iter = new goog.iter.Iterator, useCache = !1;
4020   iter.next = function() {
4021     var returnElement = null;
4022     if (!useCache) {
4023       try {
4024         return returnElement = baseIterator.next(), cache.push(returnElement), returnElement;
4025       } catch (e) {
4026         if (e != goog.iter.StopIteration || goog.array.isEmpty(cache)) {
4027           throw e;
4028         }
4029         useCache = !0;
4030       }
4031     }
4032     returnElement = cache[cacheIndex];
4033     cacheIndex = (cacheIndex + 1) % cache.length;
4034     return returnElement;
4035   };
4036   return iter;
4038 goog.iter.count = function(opt_start, opt_step) {
4039   var counter = opt_start || 0, step = goog.isDef(opt_step) ? opt_step : 1, iter = new goog.iter.Iterator;
4040   iter.next = function() {
4041     var returnValue = counter;
4042     counter += step;
4043     return returnValue;
4044   };
4045   return iter;
4047 goog.iter.repeat = function(value) {
4048   var iter = new goog.iter.Iterator;
4049   iter.next = goog.functions.constant(value);
4050   return iter;
4052 goog.iter.accumulate = function(iterable) {
4053   var iterator = goog.iter.toIterator(iterable), total = 0, iter = new goog.iter.Iterator;
4054   iter.next = function() {
4055     return total += iterator.next();
4056   };
4057   return iter;
4059 goog.iter.zip = function(var_args) {
4060   var args = arguments, iter = new goog.iter.Iterator;
4061   if (0 < args.length) {
4062     var iterators = goog.array.map(args, goog.iter.toIterator);
4063     iter.next = function() {
4064       var arr = goog.array.map(iterators, function(it) {
4065         return it.next();
4066       });
4067       return arr;
4068     };
4069   }
4070   return iter;
4072 goog.iter.zipLongest = function(fillValue, var_args) {
4073   var args = goog.array.slice(arguments, 1), iter = new goog.iter.Iterator;
4074   if (0 < args.length) {
4075     var iterators = goog.array.map(args, goog.iter.toIterator);
4076     iter.next = function() {
4077       var iteratorsHaveValues = !1, arr = goog.array.map(iterators, function(it) {
4078         var returnValue;
4079         try {
4080           returnValue = it.next(), iteratorsHaveValues = !0;
4081         } catch (ex) {
4082           if (ex !== goog.iter.StopIteration) {
4083             throw ex;
4084           }
4085           returnValue = fillValue;
4086         }
4087         return returnValue;
4088       });
4089       if (!iteratorsHaveValues) {
4090         throw goog.iter.StopIteration;
4091       }
4092       return arr;
4093     };
4094   }
4095   return iter;
4097 goog.iter.compress = function(iterable, selectors) {
4098   var selectorIterator = goog.iter.toIterator(selectors);
4099   return goog.iter.filter(iterable, function() {
4100     return!!selectorIterator.next();
4101   });
4103 goog.iter.GroupByIterator_ = function(iterable, opt_keyFunc) {
4104   this.iterator = goog.iter.toIterator(iterable);
4105   this.keyFunc = opt_keyFunc || goog.functions.identity;
4107 goog.inherits(goog.iter.GroupByIterator_, goog.iter.Iterator);
4108 goog.iter.GroupByIterator_.prototype.next = function() {
4109   for (;this.currentKey == this.targetKey;) {
4110     this.currentValue = this.iterator.next(), this.currentKey = this.keyFunc(this.currentValue);
4111   }
4112   this.targetKey = this.currentKey;
4113   return[this.currentKey, this.groupItems_(this.targetKey)];
4115 goog.iter.GroupByIterator_.prototype.groupItems_ = function(targetKey) {
4116   for (var arr = [];this.currentKey == targetKey;) {
4117     arr.push(this.currentValue);
4118     try {
4119       this.currentValue = this.iterator.next();
4120     } catch (ex) {
4121       if (ex !== goog.iter.StopIteration) {
4122         throw ex;
4123       }
4124       break;
4125     }
4126     this.currentKey = this.keyFunc(this.currentValue);
4127   }
4128   return arr;
4130 goog.iter.groupBy = function(iterable, opt_keyFunc) {
4131   return new goog.iter.GroupByIterator_(iterable, opt_keyFunc);
4133 goog.iter.starMap = function(iterable, f, opt_obj) {
4134   var iterator = goog.iter.toIterator(iterable), iter = new goog.iter.Iterator;
4135   iter.next = function() {
4136     var args = goog.iter.toArray(iterator.next());
4137     return f.apply(opt_obj, goog.array.concat(args, void 0, iterator));
4138   };
4139   return iter;
4141 goog.iter.tee = function(iterable, opt_num) {
4142   var iterator = goog.iter.toIterator(iterable), num = goog.isNumber(opt_num) ? opt_num : 2, buffers = goog.array.map(goog.array.range(num), function() {
4143     return[];
4144   }), addNextIteratorValueToBuffers = function() {
4145     var val = iterator.next();
4146     goog.array.forEach(buffers, function(buffer) {
4147       buffer.push(val);
4148     });
4149   }, createIterator = function(buffer) {
4150     var iter = new goog.iter.Iterator;
4151     iter.next = function() {
4152       goog.array.isEmpty(buffer) && addNextIteratorValueToBuffers();
4153       goog.asserts.assert(!goog.array.isEmpty(buffer));
4154       return buffer.shift();
4155     };
4156     return iter;
4157   };
4158   return goog.array.map(buffers, createIterator);
4160 goog.iter.enumerate = function(iterable, opt_start) {
4161   return goog.iter.zip(goog.iter.count(opt_start), iterable);
4163 goog.iter.limit = function(iterable, limitSize) {
4164   goog.asserts.assert(goog.math.isInt(limitSize) && 0 <= limitSize);
4165   var iterator = goog.iter.toIterator(iterable), iter = new goog.iter.Iterator, remaining = limitSize;
4166   iter.next = function() {
4167     if (0 < remaining--) {
4168       return iterator.next();
4169     }
4170     throw goog.iter.StopIteration;
4171   };
4172   return iter;
4174 goog.iter.consume = function(iterable, count) {
4175   goog.asserts.assert(goog.math.isInt(count) && 0 <= count);
4176   for (var iterator = goog.iter.toIterator(iterable);0 < count--;) {
4177     goog.iter.nextOrValue(iterator, null);
4178   }
4179   return iterator;
4181 goog.iter.slice = function(iterable, start, opt_end) {
4182   goog.asserts.assert(goog.math.isInt(start) && 0 <= start);
4183   var iterator = goog.iter.consume(iterable, start);
4184   goog.isNumber(opt_end) && (goog.asserts.assert(goog.math.isInt(opt_end) && opt_end >= start), iterator = goog.iter.limit(iterator, opt_end - start));
4185   return iterator;
4187 goog.iter.hasDuplicates_ = function(arr) {
4188   var deduped = [];
4189   goog.array.removeDuplicates(arr, deduped);
4190   return arr.length != deduped.length;
4192 goog.iter.permutations = function(iterable, opt_length) {
4193   var elements = goog.iter.toArray(iterable), length = goog.isNumber(opt_length) ? opt_length : elements.length, sets = goog.array.repeat(elements, length), product = goog.iter.product.apply(void 0, sets);
4194   return goog.iter.filter(product, function(arr) {
4195     return!goog.iter.hasDuplicates_(arr);
4196   });
4198 goog.iter.combinations = function(iterable, length) {
4199   function getIndexFromElements(index) {
4200     return elements[index];
4201   }
4202   var elements = goog.iter.toArray(iterable), indexes = goog.iter.range(elements.length), indexIterator = goog.iter.permutations(indexes, length), sortedIndexIterator = goog.iter.filter(indexIterator, function(arr) {
4203     return goog.array.isSorted(arr);
4204   }), iter = new goog.iter.Iterator;
4205   iter.next = function() {
4206     return goog.array.map(sortedIndexIterator.next(), getIndexFromElements);
4207   };
4208   return iter;
4210 goog.iter.combinationsWithReplacement = function(iterable, length) {
4211   function getIndexFromElements(index) {
4212     return elements[index];
4213   }
4214   var elements = goog.iter.toArray(iterable), indexes = goog.array.range(elements.length), sets = goog.array.repeat(indexes, length), indexIterator = goog.iter.product.apply(void 0, sets), sortedIndexIterator = goog.iter.filter(indexIterator, function(arr) {
4215     return goog.array.isSorted(arr);
4216   }), iter = new goog.iter.Iterator;
4217   iter.next = function() {
4218     return goog.array.map(sortedIndexIterator.next(), getIndexFromElements);
4219   };
4220   return iter;
4222 goog.structs.Map = function(opt_map, var_args) {
4223   this.map_ = {};
4224   this.keys_ = [];
4225   this.version_ = this.count_ = 0;
4226   var argLength = arguments.length;
4227   if (1 < argLength) {
4228     if (argLength % 2) {
4229       throw Error("Uneven number of arguments");
4230     }
4231     for (var i = 0;i < argLength;i += 2) {
4232       this.set(arguments[i], arguments[i + 1]);
4233     }
4234   } else {
4235     opt_map && this.addAll(opt_map);
4236   }
4238 goog.structs.Map.prototype.getCount = function() {
4239   return this.count_;
4241 goog.structs.Map.prototype.getValues = function() {
4242   this.cleanupKeysArray_();
4243   for (var rv = [], i = 0;i < this.keys_.length;i++) {
4244     var key = this.keys_[i];
4245     rv.push(this.map_[key]);
4246   }
4247   return rv;
4249 goog.structs.Map.prototype.getKeys = function() {
4250   this.cleanupKeysArray_();
4251   return this.keys_.concat();
4253 goog.structs.Map.prototype.containsKey = function(key) {
4254   return goog.structs.Map.hasKey_(this.map_, key);
4256 goog.structs.Map.prototype.containsValue = function(val) {
4257   for (var i = 0;i < this.keys_.length;i++) {
4258     var key = this.keys_[i];
4259     if (goog.structs.Map.hasKey_(this.map_, key) && this.map_[key] == val) {
4260       return!0;
4261     }
4262   }
4263   return!1;
4265 goog.structs.Map.prototype.equals = function(otherMap, opt_equalityFn) {
4266   if (this === otherMap) {
4267     return!0;
4268   }
4269   if (this.count_ != otherMap.getCount()) {
4270     return!1;
4271   }
4272   var equalityFn = opt_equalityFn || goog.structs.Map.defaultEquals;
4273   this.cleanupKeysArray_();
4274   for (var key, i = 0;key = this.keys_[i];i++) {
4275     if (!equalityFn(this.get(key), otherMap.get(key))) {
4276       return!1;
4277     }
4278   }
4279   return!0;
4281 goog.structs.Map.defaultEquals = function(a, b) {
4282   return a === b;
4284 goog.structs.Map.prototype.isEmpty = function() {
4285   return 0 == this.count_;
4287 goog.structs.Map.prototype.clear = function() {
4288   this.map_ = {};
4289   this.version_ = this.count_ = this.keys_.length = 0;
4291 goog.structs.Map.prototype.remove = function(key) {
4292   return goog.structs.Map.hasKey_(this.map_, key) ? (delete this.map_[key], this.count_--, this.version_++, this.keys_.length > 2 * this.count_ && this.cleanupKeysArray_(), !0) : !1;
4294 goog.structs.Map.prototype.cleanupKeysArray_ = function() {
4295   if (this.count_ != this.keys_.length) {
4296     for (var srcIndex = 0, destIndex = 0;srcIndex < this.keys_.length;) {
4297       var key = this.keys_[srcIndex];
4298       goog.structs.Map.hasKey_(this.map_, key) && (this.keys_[destIndex++] = key);
4299       srcIndex++;
4300     }
4301     this.keys_.length = destIndex;
4302   }
4303   if (this.count_ != this.keys_.length) {
4304     for (var seen = {}, destIndex = srcIndex = 0;srcIndex < this.keys_.length;) {
4305       key = this.keys_[srcIndex], goog.structs.Map.hasKey_(seen, key) || (this.keys_[destIndex++] = key, seen[key] = 1), srcIndex++;
4306     }
4307     this.keys_.length = destIndex;
4308   }
4310 goog.structs.Map.prototype.get = function(key, opt_val) {
4311   return goog.structs.Map.hasKey_(this.map_, key) ? this.map_[key] : opt_val;
4313 goog.structs.Map.prototype.set = function(key, value) {
4314   goog.structs.Map.hasKey_(this.map_, key) || (this.count_++, this.keys_.push(key), this.version_++);
4315   this.map_[key] = value;
4317 goog.structs.Map.prototype.addAll = function(map) {
4318   var keys, values;
4319   map instanceof goog.structs.Map ? (keys = map.getKeys(), values = map.getValues()) : (keys = goog.object.getKeys(map), values = goog.object.getValues(map));
4320   for (var i = 0;i < keys.length;i++) {
4321     this.set(keys[i], values[i]);
4322   }
4324 goog.structs.Map.prototype.forEach = function(f, opt_obj) {
4325   for (var keys = this.getKeys(), i = 0;i < keys.length;i++) {
4326     var key = keys[i], value = this.get(key);
4327     f.call(opt_obj, value, key, this);
4328   }
4330 goog.structs.Map.prototype.clone = function() {
4331   return new goog.structs.Map(this);
4333 goog.structs.Map.prototype.transpose = function() {
4334   for (var transposed = new goog.structs.Map, i = 0;i < this.keys_.length;i++) {
4335     var key = this.keys_[i], value = this.map_[key];
4336     transposed.set(value, key);
4337   }
4338   return transposed;
4340 goog.structs.Map.prototype.toObject = function() {
4341   this.cleanupKeysArray_();
4342   for (var obj = {}, i = 0;i < this.keys_.length;i++) {
4343     var key = this.keys_[i];
4344     obj[key] = this.map_[key];
4345   }
4346   return obj;
4348 goog.structs.Map.prototype.__iterator__ = function(opt_keys) {
4349   this.cleanupKeysArray_();
4350   var i = 0, keys = this.keys_, map = this.map_, version = this.version_, selfObj = this, newIter = new goog.iter.Iterator;
4351   newIter.next = function() {
4352     for (;;) {
4353       if (version != selfObj.version_) {
4354         throw Error("The map has changed since the iterator was created");
4355       }
4356       if (i >= keys.length) {
4357         throw goog.iter.StopIteration;
4358       }
4359       var key = keys[i++];
4360       return opt_keys ? key : map[key];
4361     }
4362   };
4363   return newIter;
4365 goog.structs.Map.hasKey_ = function(obj, key) {
4366   return Object.prototype.hasOwnProperty.call(obj, key);
4368 goog.structs.getCount = function(col) {
4369   return "function" == typeof col.getCount ? col.getCount() : goog.isArrayLike(col) || goog.isString(col) ? col.length : goog.object.getCount(col);
4371 goog.structs.getValues = function(col) {
4372   if ("function" == typeof col.getValues) {
4373     return col.getValues();
4374   }
4375   if (goog.isString(col)) {
4376     return col.split("");
4377   }
4378   if (goog.isArrayLike(col)) {
4379     for (var rv = [], l = col.length, i = 0;i < l;i++) {
4380       rv.push(col[i]);
4381     }
4382     return rv;
4383   }
4384   return goog.object.getValues(col);
4386 goog.structs.getKeys = function(col) {
4387   if ("function" == typeof col.getKeys) {
4388     return col.getKeys();
4389   }
4390   if ("function" != typeof col.getValues) {
4391     if (goog.isArrayLike(col) || goog.isString(col)) {
4392       for (var rv = [], l = col.length, i = 0;i < l;i++) {
4393         rv.push(i);
4394       }
4395       return rv;
4396     }
4397     return goog.object.getKeys(col);
4398   }
4400 goog.structs.contains = function(col, val) {
4401   return "function" == typeof col.contains ? col.contains(val) : "function" == typeof col.containsValue ? col.containsValue(val) : goog.isArrayLike(col) || goog.isString(col) ? goog.array.contains(col, val) : goog.object.containsValue(col, val);
4403 goog.structs.isEmpty = function(col) {
4404   return "function" == typeof col.isEmpty ? col.isEmpty() : goog.isArrayLike(col) || goog.isString(col) ? goog.array.isEmpty(col) : goog.object.isEmpty(col);
4406 goog.structs.clear = function(col) {
4407   "function" == typeof col.clear ? col.clear() : goog.isArrayLike(col) ? goog.array.clear(col) : goog.object.clear(col);
4409 goog.structs.forEach = function(col, f, opt_obj) {
4410   if ("function" == typeof col.forEach) {
4411     col.forEach(f, opt_obj);
4412   } else {
4413     if (goog.isArrayLike(col) || goog.isString(col)) {
4414       goog.array.forEach(col, f, opt_obj);
4415     } else {
4416       for (var keys = goog.structs.getKeys(col), values = goog.structs.getValues(col), l = values.length, i = 0;i < l;i++) {
4417         f.call(opt_obj, values[i], keys && keys[i], col);
4418       }
4419     }
4420   }
4422 goog.structs.filter = function(col, f, opt_obj) {
4423   if ("function" == typeof col.filter) {
4424     return col.filter(f, opt_obj);
4425   }
4426   if (goog.isArrayLike(col) || goog.isString(col)) {
4427     return goog.array.filter(col, f, opt_obj);
4428   }
4429   var rv, keys = goog.structs.getKeys(col), values = goog.structs.getValues(col), l = values.length;
4430   if (keys) {
4431     rv = {};
4432     for (var i = 0;i < l;i++) {
4433       f.call(opt_obj, values[i], keys[i], col) && (rv[keys[i]] = values[i]);
4434     }
4435   } else {
4436     for (rv = [], i = 0;i < l;i++) {
4437       f.call(opt_obj, values[i], void 0, col) && rv.push(values[i]);
4438     }
4439   }
4440   return rv;
4442 goog.structs.map = function(col, f, opt_obj) {
4443   if ("function" == typeof col.map) {
4444     return col.map(f, opt_obj);
4445   }
4446   if (goog.isArrayLike(col) || goog.isString(col)) {
4447     return goog.array.map(col, f, opt_obj);
4448   }
4449   var rv, keys = goog.structs.getKeys(col), values = goog.structs.getValues(col), l = values.length;
4450   if (keys) {
4451     rv = {};
4452     for (var i = 0;i < l;i++) {
4453       rv[keys[i]] = f.call(opt_obj, values[i], keys[i], col);
4454     }
4455   } else {
4456     for (rv = [], i = 0;i < l;i++) {
4457       rv[i] = f.call(opt_obj, values[i], void 0, col);
4458     }
4459   }
4460   return rv;
4462 goog.structs.some = function(col, f, opt_obj) {
4463   if ("function" == typeof col.some) {
4464     return col.some(f, opt_obj);
4465   }
4466   if (goog.isArrayLike(col) || goog.isString(col)) {
4467     return goog.array.some(col, f, opt_obj);
4468   }
4469   for (var keys = goog.structs.getKeys(col), values = goog.structs.getValues(col), l = values.length, i = 0;i < l;i++) {
4470     if (f.call(opt_obj, values[i], keys && keys[i], col)) {
4471       return!0;
4472     }
4473   }
4474   return!1;
4476 goog.structs.every = function(col, f, opt_obj) {
4477   if ("function" == typeof col.every) {
4478     return col.every(f, opt_obj);
4479   }
4480   if (goog.isArrayLike(col) || goog.isString(col)) {
4481     return goog.array.every(col, f, opt_obj);
4482   }
4483   for (var keys = goog.structs.getKeys(col), values = goog.structs.getValues(col), l = values.length, i = 0;i < l;i++) {
4484     if (!f.call(opt_obj, values[i], keys && keys[i], col)) {
4485       return!1;
4486     }
4487   }
4488   return!0;
4490 goog.structs.Set = function(opt_values) {
4491   this.map_ = new goog.structs.Map;
4492   opt_values && this.addAll(opt_values);
4494 goog.structs.Set.getKey_ = function(val) {
4495   var type = typeof val;
4496   return "object" == type && val || "function" == type ? "o" + goog.getUid(val) : type.substr(0, 1) + val;
4498 goog.structs.Set.prototype.getCount = function() {
4499   return this.map_.getCount();
4501 goog.structs.Set.prototype.add = function(element) {
4502   this.map_.set(goog.structs.Set.getKey_(element), element);
4504 goog.structs.Set.prototype.addAll = function(col) {
4505   for (var values = goog.structs.getValues(col), l = values.length, i = 0;i < l;i++) {
4506     this.add(values[i]);
4507   }
4509 goog.structs.Set.prototype.removeAll = function(col) {
4510   for (var values = goog.structs.getValues(col), l = values.length, i = 0;i < l;i++) {
4511     this.remove(values[i]);
4512   }
4514 goog.structs.Set.prototype.remove = function(element) {
4515   return this.map_.remove(goog.structs.Set.getKey_(element));
4517 goog.structs.Set.prototype.clear = function() {
4518   this.map_.clear();
4520 goog.structs.Set.prototype.isEmpty = function() {
4521   return this.map_.isEmpty();
4523 goog.structs.Set.prototype.contains = function(element) {
4524   return this.map_.containsKey(goog.structs.Set.getKey_(element));
4526 goog.structs.Set.prototype.difference = function(col) {
4527   var result = this.clone();
4528   result.removeAll(col);
4529   return result;
4531 goog.structs.Set.prototype.getValues = function() {
4532   return this.map_.getValues();
4534 goog.structs.Set.prototype.clone = function() {
4535   return new goog.structs.Set(this);
4537 goog.structs.Set.prototype.equals = function(col) {
4538   return this.getCount() == goog.structs.getCount(col) && this.isSubsetOf(col);
4540 goog.structs.Set.prototype.isSubsetOf = function(col) {
4541   var colCount = goog.structs.getCount(col);
4542   if (this.getCount() > colCount) {
4543     return!1;
4544   }
4545   !(col instanceof goog.structs.Set) && 5 < colCount && (col = new goog.structs.Set(col));
4546   return goog.structs.every(this, function(value) {
4547     return goog.structs.contains(col, value);
4548   });
4550 goog.structs.Set.prototype.__iterator__ = function() {
4551   return this.map_.__iterator__(!1);
4553 goog.debug.LOGGING_ENABLED = goog.DEBUG;
4554 goog.debug.catchErrors = function(logFunc, opt_cancel, opt_target) {
4555   var target = opt_target || goog.global, oldErrorHandler = target.onerror, retVal = !!opt_cancel;
4556   goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher("535.3") && (retVal = !retVal);
4557   target.onerror = function(message, url, line, opt_col, opt_error) {
4558     oldErrorHandler && oldErrorHandler(message, url, line, opt_col, opt_error);
4559     logFunc({message:message, fileName:url, line:line, col:opt_col, error:opt_error});
4560     return retVal;
4561   };
4563 goog.debug.expose = function(obj, opt_showFn) {
4564   if ("undefined" == typeof obj) {
4565     return "undefined";
4566   }
4567   if (null == obj) {
4568     return "NULL";
4569   }
4570   var str = [], x;
4571   for (x in obj) {
4572     if (opt_showFn || !goog.isFunction(obj[x])) {
4573       var s = x + " = ";
4574       try {
4575         s += obj[x];
4576       } catch (e) {
4577         s += "*** " + e + " ***";
4578       }
4579       str.push(s);
4580     }
4581   }
4582   return str.join("\n");
4584 goog.debug.deepExpose = function(obj$$0, opt_showFn) {
4585   var str = [], helper = function(obj, space, parentSeen) {
4586     var nestspace = space + "  ", seen = new goog.structs.Set(parentSeen);
4587     try {
4588       if (goog.isDef(obj)) {
4589         if (goog.isNull(obj)) {
4590           str.push("NULL");
4591         } else {
4592           if (goog.isString(obj)) {
4593             str.push('"' + obj.replace(/\n/g, "\n" + space) + '"');
4594           } else {
4595             if (goog.isFunction(obj)) {
4596               str.push(String(obj).replace(/\n/g, "\n" + space));
4597             } else {
4598               if (goog.isObject(obj)) {
4599                 if (seen.contains(obj)) {
4600                   str.push("*** reference loop detected ***");
4601                 } else {
4602                   seen.add(obj);
4603                   str.push("{");
4604                   for (var x in obj) {
4605                     if (opt_showFn || !goog.isFunction(obj[x])) {
4606                       str.push("\n"), str.push(nestspace), str.push(x + " = "), helper(obj[x], nestspace, seen);
4607                     }
4608                   }
4609                   str.push("\n" + space + "}");
4610                 }
4611               } else {
4612                 str.push(obj);
4613               }
4614             }
4615           }
4616         }
4617       } else {
4618         str.push("undefined");
4619       }
4620     } catch (e) {
4621       str.push("*** " + e + " ***");
4622     }
4623   };
4624   helper(obj$$0, "", new goog.structs.Set);
4625   return str.join("");
4627 goog.debug.exposeArray = function(arr) {
4628   for (var str = [], i = 0;i < arr.length;i++) {
4629     goog.isArray(arr[i]) ? str.push(goog.debug.exposeArray(arr[i])) : str.push(arr[i]);
4630   }
4631   return "[ " + str.join(", ") + " ]";
4633 goog.debug.exposeException = function(err, opt_fn) {
4634   try {
4635     var e = goog.debug.normalizeErrorObject(err), error = "Message: " + goog.string.htmlEscape(e.message) + '\nUrl: <a href="view-source:' + e.fileName + '" target="_new">' + e.fileName + "</a>\nLine: " + e.lineNumber + "\n\nBrowser stack:\n" + goog.string.htmlEscape(e.stack + "-> ") + "[end]\n\nJS stack traversal:\n" + goog.string.htmlEscape(goog.debug.getStacktrace(opt_fn) + "-> ");
4636     return error;
4637   } catch (e2) {
4638     return "Exception trying to expose exception! You win, we lose. " + e2;
4639   }
4641 goog.debug.normalizeErrorObject = function(err) {
4642   var href = goog.getObjectByName("window.location.href");
4643   if (goog.isString(err)) {
4644     return{message:err, name:"Unknown error", lineNumber:"Not available", fileName:href, stack:"Not available"};
4645   }
4646   var lineNumber, fileName, threwError = !1;
4647   try {
4648     lineNumber = err.lineNumber || err.line || "Not available";
4649   } catch (e) {
4650     lineNumber = "Not available", threwError = !0;
4651   }
4652   try {
4653     fileName = err.fileName || err.filename || err.sourceURL || goog.global.$googDebugFname || href;
4654   } catch (e$$0) {
4655     fileName = "Not available", threwError = !0;
4656   }
4657   return!threwError && err.lineNumber && err.fileName && err.stack && err.message && err.name ? err : {message:err.message || "Not available", name:err.name || "UnknownError", lineNumber:lineNumber, fileName:fileName, stack:err.stack || "Not available"};
4659 goog.debug.enhanceError = function(err, opt_message) {
4660   var error;
4661   "string" == typeof err ? (error = Error(err), Error.captureStackTrace && Error.captureStackTrace(error, goog.debug.enhanceError)) : error = err;
4662   error.stack || (error.stack = goog.debug.getStacktrace(goog.debug.enhanceError));
4663   if (opt_message) {
4664     for (var x = 0;error["message" + x];) {
4665       ++x;
4666     }
4667     error["message" + x] = String(opt_message);
4668   }
4669   return error;
4671 goog.debug.getStacktraceSimple = function(opt_depth) {
4672   if (goog.STRICT_MODE_COMPATIBLE) {
4673     var stack = goog.debug.getNativeStackTrace_(goog.debug.getStacktraceSimple);
4674     if (stack) {
4675       return stack;
4676     }
4677   }
4678   for (var sb = [], fn = arguments.callee.caller, depth = 0;fn && (!opt_depth || depth < opt_depth);) {
4679     sb.push(goog.debug.getFunctionName(fn));
4680     sb.push("()\n");
4681     try {
4682       fn = fn.caller;
4683     } catch (e) {
4684       sb.push("[exception trying to get caller]\n");
4685       break;
4686     }
4687     depth++;
4688     if (depth >= goog.debug.MAX_STACK_DEPTH) {
4689       sb.push("[...long stack...]");
4690       break;
4691     }
4692   }
4693   opt_depth && depth >= opt_depth ? sb.push("[...reached max depth limit...]") : sb.push("[end]");
4694   return sb.join("");
4696 goog.debug.MAX_STACK_DEPTH = 50;
4697 goog.debug.getNativeStackTrace_ = function(fn) {
4698   var tempErr = Error();
4699   if (Error.captureStackTrace) {
4700     return Error.captureStackTrace(tempErr, fn), String(tempErr.stack);
4701   }
4702   try {
4703     throw tempErr;
4704   } catch (e) {
4705     tempErr = e;
4706   }
4707   var stack = tempErr.stack;
4708   return stack ? String(stack) : null;
4710 goog.debug.getStacktrace = function(opt_fn) {
4711   var stack;
4712   if (goog.STRICT_MODE_COMPATIBLE) {
4713     var contextFn = opt_fn || goog.debug.getStacktrace;
4714     stack = goog.debug.getNativeStackTrace_(contextFn);
4715   }
4716   stack || (stack = goog.debug.getStacktraceHelper_(opt_fn || arguments.callee.caller, []));
4717   return stack;
4719 goog.debug.getStacktraceHelper_ = function(fn, visited) {
4720   var sb = [];
4721   if (goog.array.contains(visited, fn)) {
4722     sb.push("[...circular reference...]");
4723   } else {
4724     if (fn && visited.length < goog.debug.MAX_STACK_DEPTH) {
4725       sb.push(goog.debug.getFunctionName(fn) + "(");
4726       for (var args = fn.arguments, i = 0;args && i < args.length;i++) {
4727         0 < i && sb.push(", ");
4728         var argDesc, arg = args[i];
4729         switch(typeof arg) {
4730           case "object":
4731             argDesc = arg ? "object" : "null";
4732             break;
4733           case "string":
4734             argDesc = arg;
4735             break;
4736           case "number":
4737             argDesc = String(arg);
4738             break;
4739           case "boolean":
4740             argDesc = arg ? "true" : "false";
4741             break;
4742           case "function":
4743             argDesc = (argDesc = goog.debug.getFunctionName(arg)) ? argDesc : "[fn]";
4744             break;
4745           default:
4746             argDesc = typeof arg;
4747         }
4748         40 < argDesc.length && (argDesc = argDesc.substr(0, 40) + "...");
4749         sb.push(argDesc);
4750       }
4751       visited.push(fn);
4752       sb.push(")\n");
4753       try {
4754         sb.push(goog.debug.getStacktraceHelper_(fn.caller, visited));
4755       } catch (e) {
4756         sb.push("[exception trying to get caller]\n");
4757       }
4758     } else {
4759       fn ? sb.push("[...long stack...]") : sb.push("[end]");
4760     }
4761   }
4762   return sb.join("");
4764 goog.debug.setFunctionResolver = function(resolver) {
4765   goog.debug.fnNameResolver_ = resolver;
4767 goog.debug.getFunctionName = function(fn) {
4768   if (goog.debug.fnNameCache_[fn]) {
4769     return goog.debug.fnNameCache_[fn];
4770   }
4771   if (goog.debug.fnNameResolver_) {
4772     var name = goog.debug.fnNameResolver_(fn);
4773     if (name) {
4774       return goog.debug.fnNameCache_[fn] = name;
4775     }
4776   }
4777   var functionSource = String(fn);
4778   if (!goog.debug.fnNameCache_[functionSource]) {
4779     var matches = /function ([^\(]+)/.exec(functionSource);
4780     if (matches) {
4781       var method = matches[1];
4782       goog.debug.fnNameCache_[functionSource] = method;
4783     } else {
4784       goog.debug.fnNameCache_[functionSource] = "[Anonymous]";
4785     }
4786   }
4787   return goog.debug.fnNameCache_[functionSource];
4789 goog.debug.makeWhitespaceVisible = function(string) {
4790   return string.replace(/ /g, "[_]").replace(/\f/g, "[f]").replace(/\n/g, "[n]\n").replace(/\r/g, "[r]").replace(/\t/g, "[t]");
4792 goog.debug.fnNameCache_ = {};
4793 goog.debug.LogRecord = function(level, msg, loggerName, opt_time, opt_sequenceNumber) {
4794   this.reset(level, msg, loggerName, opt_time, opt_sequenceNumber);
4796 goog.debug.LogRecord.prototype.exception_ = null;
4797 goog.debug.LogRecord.prototype.exceptionText_ = null;
4798 goog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS = !0;
4799 goog.debug.LogRecord.nextSequenceNumber_ = 0;
4800 goog.debug.LogRecord.prototype.reset = function(level, msg, loggerName, opt_time, opt_sequenceNumber) {
4801   goog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS && ("number" == typeof opt_sequenceNumber || goog.debug.LogRecord.nextSequenceNumber_++);
4802   opt_time || goog.now();
4803   this.level_ = level;
4804   this.msg_ = msg;
4805   delete this.exception_;
4806   delete this.exceptionText_;
4808 goog.debug.LogRecord.prototype.setException = function(exception) {
4809   this.exception_ = exception;
4811 goog.debug.LogRecord.prototype.setExceptionText = function(text) {
4812   this.exceptionText_ = text;
4814 goog.debug.LogRecord.prototype.setLevel = function(level) {
4815   this.level_ = level;
4817 goog.debug.LogRecord.prototype.getMessage = function() {
4818   return this.msg_;
4820 goog.debug.LogBuffer = function() {
4821   goog.asserts.assert(goog.debug.LogBuffer.isBufferingEnabled(), "Cannot use goog.debug.LogBuffer without defining goog.debug.LogBuffer.CAPACITY.");
4822   this.clear();
4824 goog.debug.LogBuffer.getInstance = function() {
4825   goog.debug.LogBuffer.instance_ || (goog.debug.LogBuffer.instance_ = new goog.debug.LogBuffer);
4826   return goog.debug.LogBuffer.instance_;
4828 goog.debug.LogBuffer.CAPACITY = 0;
4829 goog.debug.LogBuffer.prototype.addRecord = function(level, msg, loggerName) {
4830   var curIndex = (this.curIndex_ + 1) % goog.debug.LogBuffer.CAPACITY;
4831   this.curIndex_ = curIndex;
4832   if (this.isFull_) {
4833     var ret = this.buffer_[curIndex];
4834     ret.reset(level, msg, loggerName);
4835     return ret;
4836   }
4837   this.isFull_ = curIndex == goog.debug.LogBuffer.CAPACITY - 1;
4838   return this.buffer_[curIndex] = new goog.debug.LogRecord(level, msg, loggerName);
4840 goog.debug.LogBuffer.isBufferingEnabled = function() {
4841   return 0 < goog.debug.LogBuffer.CAPACITY;
4843 goog.debug.LogBuffer.prototype.clear = function() {
4844   this.buffer_ = Array(goog.debug.LogBuffer.CAPACITY);
4845   this.curIndex_ = -1;
4846   this.isFull_ = !1;
4848 goog.debug.Logger = function(name) {
4849   this.name_ = name;
4850   this.handlers_ = this.children_ = this.level_ = this.parent_ = null;
4852 goog.debug.Logger.ROOT_LOGGER_NAME = "";
4853 goog.debug.Logger.ENABLE_HIERARCHY = !0;
4854 goog.debug.Logger.ENABLE_HIERARCHY || (goog.debug.Logger.rootHandlers_ = []);
4855 goog.debug.Logger.Level = function(name, value) {
4856   this.name = name;
4857   this.value = value;
4859 goog.debug.Logger.Level.prototype.toString = function() {
4860   return this.name;
4862 goog.debug.Logger.Level.OFF = new goog.debug.Logger.Level("OFF", Infinity);
4863 goog.debug.Logger.Level.SHOUT = new goog.debug.Logger.Level("SHOUT", 1200);
4864 goog.debug.Logger.Level.SEVERE = new goog.debug.Logger.Level("SEVERE", 1E3);
4865 goog.debug.Logger.Level.WARNING = new goog.debug.Logger.Level("WARNING", 900);
4866 goog.debug.Logger.Level.INFO = new goog.debug.Logger.Level("INFO", 800);
4867 goog.debug.Logger.Level.CONFIG = new goog.debug.Logger.Level("CONFIG", 700);
4868 goog.debug.Logger.Level.FINE = new goog.debug.Logger.Level("FINE", 500);
4869 goog.debug.Logger.Level.FINER = new goog.debug.Logger.Level("FINER", 400);
4870 goog.debug.Logger.Level.FINEST = new goog.debug.Logger.Level("FINEST", 300);
4871 goog.debug.Logger.Level.ALL = new goog.debug.Logger.Level("ALL", 0);
4872 goog.debug.Logger.Level.PREDEFINED_LEVELS = [goog.debug.Logger.Level.OFF, goog.debug.Logger.Level.SHOUT, goog.debug.Logger.Level.SEVERE, goog.debug.Logger.Level.WARNING, goog.debug.Logger.Level.INFO, goog.debug.Logger.Level.CONFIG, goog.debug.Logger.Level.FINE, goog.debug.Logger.Level.FINER, goog.debug.Logger.Level.FINEST, goog.debug.Logger.Level.ALL];
4873 goog.debug.Logger.Level.predefinedLevelsCache_ = null;
4874 goog.debug.Logger.Level.createPredefinedLevelsCache_ = function() {
4875   goog.debug.Logger.Level.predefinedLevelsCache_ = {};
4876   for (var i = 0, level;level = goog.debug.Logger.Level.PREDEFINED_LEVELS[i];i++) {
4877     goog.debug.Logger.Level.predefinedLevelsCache_[level.value] = level, goog.debug.Logger.Level.predefinedLevelsCache_[level.name] = level;
4878   }
4880 goog.debug.Logger.Level.getPredefinedLevel = function(name) {
4881   goog.debug.Logger.Level.predefinedLevelsCache_ || goog.debug.Logger.Level.createPredefinedLevelsCache_();
4882   return goog.debug.Logger.Level.predefinedLevelsCache_[name] || null;
4884 goog.debug.Logger.Level.getPredefinedLevelByValue = function(value) {
4885   goog.debug.Logger.Level.predefinedLevelsCache_ || goog.debug.Logger.Level.createPredefinedLevelsCache_();
4886   if (value in goog.debug.Logger.Level.predefinedLevelsCache_) {
4887     return goog.debug.Logger.Level.predefinedLevelsCache_[value];
4888   }
4889   for (var i = 0;i < goog.debug.Logger.Level.PREDEFINED_LEVELS.length;++i) {
4890     var level = goog.debug.Logger.Level.PREDEFINED_LEVELS[i];
4891     if (level.value <= value) {
4892       return level;
4893     }
4894   }
4895   return null;
4897 goog.debug.Logger.getLogger = function(name) {
4898   return goog.debug.LogManager.getLogger(name);
4900 goog.debug.Logger.logToProfilers = function(msg) {
4901   goog.global.console && (goog.global.console.timeStamp ? goog.global.console.timeStamp(msg) : goog.global.console.markTimeline && goog.global.console.markTimeline(msg));
4902   goog.global.msWriteProfilerMark && goog.global.msWriteProfilerMark(msg);
4904 goog.debug.Logger.prototype.getName = function() {
4905   return this.name_;
4907 goog.debug.Logger.prototype.addHandler = function(handler) {
4908   goog.debug.LOGGING_ENABLED && (goog.debug.Logger.ENABLE_HIERARCHY ? (this.handlers_ || (this.handlers_ = []), this.handlers_.push(handler)) : (goog.asserts.assert(!this.name_, "Cannot call addHandler on a non-root logger when goog.debug.Logger.ENABLE_HIERARCHY is false."), goog.debug.Logger.rootHandlers_.push(handler)));
4910 goog.debug.Logger.prototype.removeHandler = function(handler) {
4911   if (goog.debug.LOGGING_ENABLED) {
4912     var handlers = goog.debug.Logger.ENABLE_HIERARCHY ? this.handlers_ : goog.debug.Logger.rootHandlers_;
4913     return!!handlers && goog.array.remove(handlers, handler);
4914   }
4915   return!1;
4917 goog.debug.Logger.prototype.getParent = function() {
4918   return this.parent_;
4920 goog.debug.Logger.prototype.getChildren = function() {
4921   this.children_ || (this.children_ = {});
4922   return this.children_;
4924 goog.debug.Logger.prototype.setLevel = function(level) {
4925   goog.debug.LOGGING_ENABLED && (goog.debug.Logger.ENABLE_HIERARCHY ? this.level_ = level : (goog.asserts.assert(!this.name_, "Cannot call setLevel() on a non-root logger when goog.debug.Logger.ENABLE_HIERARCHY is false."), goog.debug.Logger.rootLevel_ = level));
4927 goog.debug.Logger.prototype.getEffectiveLevel = function() {
4928   if (!goog.debug.LOGGING_ENABLED) {
4929     return goog.debug.Logger.Level.OFF;
4930   }
4931   if (!goog.debug.Logger.ENABLE_HIERARCHY) {
4932     return goog.debug.Logger.rootLevel_;
4933   }
4934   if (this.level_) {
4935     return this.level_;
4936   }
4937   if (this.parent_) {
4938     return this.parent_.getEffectiveLevel();
4939   }
4940   goog.asserts.fail("Root logger has no level set.");
4941   return null;
4943 goog.debug.Logger.prototype.isLoggable = function(level) {
4944   return goog.debug.LOGGING_ENABLED && level.value >= this.getEffectiveLevel().value;
4946 goog.debug.Logger.prototype.log = function(level, msg, opt_exception) {
4947   goog.debug.LOGGING_ENABLED && this.isLoggable(level) && (goog.isFunction(msg) && (msg = msg()), this.doLogRecord_(this.getLogRecord(level, msg, opt_exception, goog.debug.Logger.prototype.log)));
4949 goog.debug.Logger.prototype.getLogRecord = function(level, msg, opt_exception, opt_fnStackContext) {
4950   var logRecord = goog.debug.LogBuffer.isBufferingEnabled() ? goog.debug.LogBuffer.getInstance().addRecord(level, msg, this.name_) : new goog.debug.LogRecord(level, String(msg), this.name_);
4951   opt_exception && (logRecord.setException(opt_exception), logRecord.setExceptionText(goog.debug.exposeException(opt_exception, opt_fnStackContext || goog.debug.Logger.prototype.getLogRecord)));
4952   return logRecord;
4954 goog.debug.Logger.prototype.severe = function(msg, opt_exception) {
4955   goog.debug.LOGGING_ENABLED && this.log(goog.debug.Logger.Level.SEVERE, msg, opt_exception);
4957 goog.debug.Logger.prototype.warning = function(msg, opt_exception) {
4958   goog.debug.LOGGING_ENABLED && this.log(goog.debug.Logger.Level.WARNING, msg, opt_exception);
4960 goog.debug.Logger.prototype.info = function(msg, opt_exception) {
4961   goog.debug.LOGGING_ENABLED && this.log(goog.debug.Logger.Level.INFO, msg, opt_exception);
4963 goog.debug.Logger.prototype.fine = function(msg, opt_exception) {
4964   goog.debug.LOGGING_ENABLED && this.log(goog.debug.Logger.Level.FINE, msg, opt_exception);
4966 goog.debug.Logger.prototype.doLogRecord_ = function(logRecord) {
4967   goog.debug.Logger.logToProfilers("log:" + logRecord.getMessage());
4968   if (goog.debug.Logger.ENABLE_HIERARCHY) {
4969     for (var target = this;target;) {
4970       target.callPublish_(logRecord), target = target.getParent();
4971     }
4972   } else {
4973     for (var i = 0, handler;handler = goog.debug.Logger.rootHandlers_[i++];) {
4974       handler(logRecord);
4975     }
4976   }
4978 goog.debug.Logger.prototype.callPublish_ = function(logRecord) {
4979   if (this.handlers_) {
4980     for (var i = 0, handler;handler = this.handlers_[i];i++) {
4981       handler(logRecord);
4982     }
4983   }
4985 goog.debug.Logger.prototype.setParent_ = function(parent) {
4986   this.parent_ = parent;
4988 goog.debug.Logger.prototype.addChild_ = function(name, logger) {
4989   this.getChildren()[name] = logger;
4991 goog.debug.LogManager = {};
4992 goog.debug.LogManager.loggers_ = {};
4993 goog.debug.LogManager.rootLogger_ = null;
4994 goog.debug.LogManager.initialize = function() {
4995   goog.debug.LogManager.rootLogger_ || (goog.debug.LogManager.rootLogger_ = new goog.debug.Logger(goog.debug.Logger.ROOT_LOGGER_NAME), goog.debug.LogManager.loggers_[goog.debug.Logger.ROOT_LOGGER_NAME] = goog.debug.LogManager.rootLogger_, goog.debug.LogManager.rootLogger_.setLevel(goog.debug.Logger.Level.CONFIG));
4997 goog.debug.LogManager.getLoggers = function() {
4998   return goog.debug.LogManager.loggers_;
5000 goog.debug.LogManager.getRoot = function() {
5001   goog.debug.LogManager.initialize();
5002   return goog.debug.LogManager.rootLogger_;
5004 goog.debug.LogManager.getLogger = function(name) {
5005   goog.debug.LogManager.initialize();
5006   var ret = goog.debug.LogManager.loggers_[name];
5007   return ret || goog.debug.LogManager.createLogger_(name);
5009 goog.debug.LogManager.createFunctionForCatchErrors = function(opt_logger) {
5010   return function(info) {
5011     var logger = opt_logger || goog.debug.LogManager.getRoot();
5012     logger.severe("Error: " + info.message + " (" + info.fileName + " @ Line: " + info.line + ")");
5013   };
5015 goog.debug.LogManager.createLogger_ = function(name) {
5016   var logger = new goog.debug.Logger(name);
5017   if (goog.debug.Logger.ENABLE_HIERARCHY) {
5018     var lastDotIndex = name.lastIndexOf("."), parentName = name.substr(0, lastDotIndex), leafName = name.substr(lastDotIndex + 1), parentLogger = goog.debug.LogManager.getLogger(parentName);
5019     parentLogger.addChild_(leafName, logger);
5020     logger.setParent_(parentLogger);
5021   }
5022   return goog.debug.LogManager.loggers_[name] = logger;
5024 goog.log = {};
5025 goog.log.ENABLED = goog.debug.LOGGING_ENABLED;
5026 goog.log.ROOT_LOGGER_NAME = goog.debug.Logger.ROOT_LOGGER_NAME;
5027 goog.log.Logger = goog.debug.Logger;
5028 goog.log.Level = goog.debug.Logger.Level;
5029 goog.log.LogRecord = goog.debug.LogRecord;
5030 goog.log.getLogger = function(name, opt_level) {
5031   if (goog.log.ENABLED) {
5032     var logger = goog.debug.LogManager.getLogger(name);
5033     opt_level && logger && logger.setLevel(opt_level);
5034     return logger;
5035   }
5036   return null;
5038 goog.log.addHandler = function(logger, handler) {
5039   goog.log.ENABLED && logger && logger.addHandler(handler);
5041 goog.log.removeHandler = function(logger, handler) {
5042   return goog.log.ENABLED && logger ? logger.removeHandler(handler) : !1;
5044 goog.log.log = function(logger, level, msg, opt_exception) {
5045   goog.log.ENABLED && logger && logger.log(level, msg, opt_exception);
5047 goog.log.error = function(logger, msg, opt_exception) {
5048   goog.log.ENABLED && logger && logger.severe(msg, opt_exception);
5050 goog.log.warning = function(logger, msg, opt_exception) {
5051   goog.log.ENABLED && logger && logger.warning(msg, opt_exception);
5053 goog.log.info = function(logger, msg, opt_exception) {
5054   goog.log.ENABLED && logger && logger.info(msg, opt_exception);
5056 goog.log.fine = function(logger, msg, opt_exception) {
5057   goog.log.ENABLED && logger && logger.fine(msg, opt_exception);
5059 goog.async = {};
5060 goog.async.throwException = function(exception) {
5061   goog.global.setTimeout(function() {
5062     throw exception;
5063   }, 0);
5065 goog.async.nextTick = function(callback, opt_context) {
5066   var cb = callback;
5067   opt_context && (cb = goog.bind(callback, opt_context));
5068   cb = goog.async.nextTick.wrapCallback_(cb);
5069   !goog.isFunction(goog.global.setImmediate) || goog.global.Window && goog.global.Window.prototype.setImmediate == goog.global.setImmediate ? (goog.async.nextTick.setImmediate_ || (goog.async.nextTick.setImmediate_ = goog.async.nextTick.getSetImmediateEmulator_()), goog.async.nextTick.setImmediate_(cb)) : goog.global.setImmediate(cb);
5071 goog.async.nextTick.getSetImmediateEmulator_ = function() {
5072   var Channel = goog.global.MessageChannel;
5073   "undefined" === typeof Channel && "undefined" !== typeof window && window.postMessage && window.addEventListener && (Channel = function() {
5074     var iframe = document.createElement("iframe");
5075     iframe.style.display = "none";
5076     iframe.src = "";
5077     document.documentElement.appendChild(iframe);
5078     var win = iframe.contentWindow, doc = win.document;
5079     doc.open();
5080     doc.write("");
5081     doc.close();
5082     var message = "callImmediate" + Math.random(), origin = "file:" == win.location.protocol ? "*" : win.location.protocol + "//" + win.location.host, onmessage = goog.bind(function(e) {
5083       if (e.origin == origin || e.data == message) {
5084         this.port1.onmessage();
5085       }
5086     }, this);
5087     win.addEventListener("message", onmessage, !1);
5088     this.port1 = {};
5089     this.port2 = {postMessage:function() {
5090       win.postMessage(message, origin);
5091     }};
5092   });
5093   if ("undefined" !== typeof Channel && !goog.labs.userAgent.browser.isIE()) {
5094     var channel = new Channel, head = {}, tail = head;
5095     channel.port1.onmessage = function() {
5096       head = head.next;
5097       var cb = head.cb;
5098       head.cb = null;
5099       cb();
5100     };
5101     return function(cb) {
5102       tail.next = {cb:cb};
5103       tail = tail.next;
5104       channel.port2.postMessage(0);
5105     };
5106   }
5107   return "undefined" !== typeof document && "onreadystatechange" in document.createElement("script") ? function(cb) {
5108     var script = document.createElement("script");
5109     script.onreadystatechange = function() {
5110       script.onreadystatechange = null;
5111       script.parentNode.removeChild(script);
5112       script = null;
5113       cb();
5114       cb = null;
5115     };
5116     document.documentElement.appendChild(script);
5117   } : function(cb) {
5118     goog.global.setTimeout(cb, 0);
5119   };
5121 goog.async.nextTick.wrapCallback_ = goog.functions.identity;
5122 goog.debug.entryPointRegistry.register(function(transformer) {
5123   goog.async.nextTick.wrapCallback_ = transformer;
5125 goog.testing = {};
5126 goog.testing.watchers = {};
5127 goog.testing.watchers.resetWatchers_ = [];
5128 goog.testing.watchers.signalClockReset = function() {
5129   for (var watchers = goog.testing.watchers.resetWatchers_, i = 0;i < watchers.length;i++) {
5130     goog.testing.watchers.resetWatchers_[i]();
5131   }
5133 goog.testing.watchers.watchClockReset = function(fn) {
5134   goog.testing.watchers.resetWatchers_.push(fn);
5136 goog.async.run = function(callback, opt_context) {
5137   goog.async.run.schedule_ || goog.async.run.initializeRunner_();
5138   goog.async.run.workQueueScheduled_ || (goog.async.run.schedule_(), goog.async.run.workQueueScheduled_ = !0);
5139   goog.async.run.workQueue_.push(new goog.async.run.WorkItem_(callback, opt_context));
5141 goog.async.run.initializeRunner_ = function() {
5142   if (goog.global.Promise && goog.global.Promise.resolve) {
5143     var promise = goog.global.Promise.resolve();
5144     goog.async.run.schedule_ = function() {
5145       promise.then(goog.async.run.processWorkQueue);
5146     };
5147   } else {
5148     goog.async.run.schedule_ = function() {
5149       goog.async.nextTick(goog.async.run.processWorkQueue);
5150     };
5151   }
5153 goog.async.run.forceNextTick = function() {
5154   goog.async.run.schedule_ = function() {
5155     goog.async.nextTick(goog.async.run.processWorkQueue);
5156   };
5158 goog.async.run.workQueueScheduled_ = !1;
5159 goog.async.run.workQueue_ = [];
5160 goog.DEBUG && (goog.async.run.resetQueue_ = function() {
5161   goog.async.run.workQueueScheduled_ = !1;
5162   goog.async.run.workQueue_ = [];
5163 }, goog.testing.watchers.watchClockReset(goog.async.run.resetQueue_));
5164 goog.async.run.processWorkQueue = function() {
5165   for (;goog.async.run.workQueue_.length;) {
5166     var workItems = goog.async.run.workQueue_;
5167     goog.async.run.workQueue_ = [];
5168     for (var i = 0;i < workItems.length;i++) {
5169       var workItem = workItems[i];
5170       try {
5171         workItem.fn.call(workItem.scope);
5172       } catch (e) {
5173         goog.async.throwException(e);
5174       }
5175     }
5176   }
5177   goog.async.run.workQueueScheduled_ = !1;
5179 goog.async.run.WorkItem_ = function(fn, scope) {
5180   this.fn = fn;
5181   this.scope = scope;
5183 goog.promise = {};
5184 goog.promise.Resolver = function() {
5186 goog.Thenable = function() {
5188 goog.Thenable.prototype.then = function() {
5190 goog.Thenable.IMPLEMENTED_BY_PROP = "$goog_Thenable";
5191 goog.Thenable.addImplementation = function(ctor) {
5192   goog.exportProperty(ctor.prototype, "then", ctor.prototype.then);
5193   ctor.prototype[goog.Thenable.IMPLEMENTED_BY_PROP] = !0;
5195 goog.Thenable.isImplementedBy = function(object) {
5196   if (!object) {
5197     return!1;
5198   }
5199   try {
5200     return!!object[goog.Thenable.IMPLEMENTED_BY_PROP];
5201   } catch (e) {
5202     return!1;
5203   }
5205 goog.Promise = function(resolver, opt_context) {
5206   this.state_ = goog.Promise.State_.PENDING;
5207   this.result_ = void 0;
5208   this.callbackEntries_ = this.parent_ = null;
5209   this.executing_ = !1;
5210   0 < goog.Promise.UNHANDLED_REJECTION_DELAY ? this.unhandledRejectionId_ = 0 : 0 == goog.Promise.UNHANDLED_REJECTION_DELAY && (this.hadUnhandledRejection_ = !1);
5211   goog.Promise.LONG_STACK_TRACES && (this.stack_ = [], this.addStackTrace_(Error("created")), this.currentStep_ = 0);
5212   try {
5213     var self = this;
5214     resolver.call(opt_context, function(value) {
5215       self.resolve_(goog.Promise.State_.FULFILLED, value);
5216     }, function(reason) {
5217       if (goog.DEBUG && !(reason instanceof goog.Promise.CancellationError)) {
5218         try {
5219           if (reason instanceof Error) {
5220             throw reason;
5221           }
5222           throw Error("Promise rejected.");
5223         } catch (e) {
5224         }
5225       }
5226       self.resolve_(goog.Promise.State_.REJECTED, reason);
5227     });
5228   } catch (e$$0) {
5229     this.resolve_(goog.Promise.State_.REJECTED, e$$0);
5230   }
5232 goog.Promise.LONG_STACK_TRACES = !1;
5233 goog.Promise.UNHANDLED_REJECTION_DELAY = 0;
5234 goog.Promise.State_ = {PENDING:0, BLOCKED:1, FULFILLED:2, REJECTED:3};
5235 goog.Promise.resolve = function(opt_value) {
5236   return new goog.Promise(function(resolve) {
5237     resolve(opt_value);
5238   });
5240 goog.Promise.reject = function(opt_reason) {
5241   return new goog.Promise(function(resolve, reject) {
5242     reject(opt_reason);
5243   });
5245 goog.Promise.race = function(promises) {
5246   return new goog.Promise(function(resolve, reject) {
5247     promises.length || resolve(void 0);
5248     for (var i = 0, promise;promise = promises[i];i++) {
5249       promise.then(resolve, reject);
5250     }
5251   });
5253 goog.Promise.all = function(promises) {
5254   return new goog.Promise(function(resolve, reject) {
5255     var toFulfill = promises.length, values = [];
5256     if (toFulfill) {
5257       for (var onFulfill = function(index, value) {
5258         toFulfill--;
5259         values[index] = value;
5260         0 == toFulfill && resolve(values);
5261       }, onReject = function(reason) {
5262         reject(reason);
5263       }, i = 0, promise;promise = promises[i];i++) {
5264         promise.then(goog.partial(onFulfill, i), onReject);
5265       }
5266     } else {
5267       resolve(values);
5268     }
5269   });
5271 goog.Promise.firstFulfilled = function(promises) {
5272   return new goog.Promise(function(resolve, reject) {
5273     var toReject = promises.length, reasons = [];
5274     if (toReject) {
5275       for (var onFulfill = function(value) {
5276         resolve(value);
5277       }, onReject = function(index, reason) {
5278         toReject--;
5279         reasons[index] = reason;
5280         0 == toReject && reject(reasons);
5281       }, i = 0, promise;promise = promises[i];i++) {
5282         promise.then(onFulfill, goog.partial(onReject, i));
5283       }
5284     } else {
5285       resolve(void 0);
5286     }
5287   });
5289 goog.Promise.withResolver = function() {
5290   var resolve, reject, promise = new goog.Promise(function(rs, rj) {
5291     resolve = rs;
5292     reject = rj;
5293   });
5294   return new goog.Promise.Resolver_(promise, resolve, reject);
5296 goog.Promise.prototype.then = function(opt_onFulfilled, opt_onRejected, opt_context) {
5297   null != opt_onFulfilled && goog.asserts.assertFunction(opt_onFulfilled, "opt_onFulfilled should be a function.");
5298   null != opt_onRejected && goog.asserts.assertFunction(opt_onRejected, "opt_onRejected should be a function. Did you pass opt_context as the second argument instead of the third?");
5299   goog.Promise.LONG_STACK_TRACES && this.addStackTrace_(Error("then"));
5300   return this.addChildPromise_(goog.isFunction(opt_onFulfilled) ? opt_onFulfilled : null, goog.isFunction(opt_onRejected) ? opt_onRejected : null, opt_context);
5302 goog.Thenable.addImplementation(goog.Promise);
5303 goog.Promise.prototype.thenCatch = function(onRejected, opt_context) {
5304   goog.Promise.LONG_STACK_TRACES && this.addStackTrace_(Error("thenCatch"));
5305   return this.addChildPromise_(null, onRejected, opt_context);
5307 goog.Promise.prototype.cancel = function(opt_message) {
5308   this.state_ == goog.Promise.State_.PENDING && goog.async.run(function() {
5309     var err = new goog.Promise.CancellationError(opt_message);
5310     this.cancelInternal_(err);
5311   }, this);
5313 goog.Promise.prototype.cancelInternal_ = function(err) {
5314   this.state_ == goog.Promise.State_.PENDING && (this.parent_ ? this.parent_.cancelChild_(this, err) : this.resolve_(goog.Promise.State_.REJECTED, err));
5316 goog.Promise.prototype.cancelChild_ = function(childPromise, err) {
5317   if (this.callbackEntries_) {
5318     for (var childCount = 0, childIndex = -1, i = 0, entry;entry = this.callbackEntries_[i];i++) {
5319       var child = entry.child;
5320       if (child && (childCount++, child == childPromise && (childIndex = i), 0 <= childIndex && 1 < childCount)) {
5321         break;
5322       }
5323     }
5324     if (0 <= childIndex) {
5325       if (this.state_ == goog.Promise.State_.PENDING && 1 == childCount) {
5326         this.cancelInternal_(err);
5327       } else {
5328         var callbackEntry = this.callbackEntries_.splice(childIndex, 1)[0];
5329         this.executeCallback_(callbackEntry, goog.Promise.State_.REJECTED, err);
5330       }
5331     }
5332   }
5334 goog.Promise.prototype.addCallbackEntry_ = function(callbackEntry) {
5335   this.callbackEntries_ && this.callbackEntries_.length || this.state_ != goog.Promise.State_.FULFILLED && this.state_ != goog.Promise.State_.REJECTED || this.scheduleCallbacks_();
5336   this.callbackEntries_ || (this.callbackEntries_ = []);
5337   this.callbackEntries_.push(callbackEntry);
5339 goog.Promise.prototype.addChildPromise_ = function(onFulfilled, onRejected, opt_context) {
5340   var callbackEntry = {child:null, onFulfilled:null, onRejected:null};
5341   callbackEntry.child = new goog.Promise(function(resolve, reject) {
5342     callbackEntry.onFulfilled = onFulfilled ? function(value) {
5343       try {
5344         var result = onFulfilled.call(opt_context, value);
5345         resolve(result);
5346       } catch (err) {
5347         reject(err);
5348       }
5349     } : resolve;
5350     callbackEntry.onRejected = onRejected ? function(reason) {
5351       try {
5352         var result = onRejected.call(opt_context, reason);
5353         !goog.isDef(result) && reason instanceof goog.Promise.CancellationError ? reject(reason) : resolve(result);
5354       } catch (err) {
5355         reject(err);
5356       }
5357     } : reject;
5358   });
5359   callbackEntry.child.parent_ = this;
5360   this.addCallbackEntry_(callbackEntry);
5361   return callbackEntry.child;
5363 goog.Promise.prototype.unblockAndFulfill_ = function(value) {
5364   goog.asserts.assert(this.state_ == goog.Promise.State_.BLOCKED);
5365   this.state_ = goog.Promise.State_.PENDING;
5366   this.resolve_(goog.Promise.State_.FULFILLED, value);
5368 goog.Promise.prototype.unblockAndReject_ = function(reason) {
5369   goog.asserts.assert(this.state_ == goog.Promise.State_.BLOCKED);
5370   this.state_ = goog.Promise.State_.PENDING;
5371   this.resolve_(goog.Promise.State_.REJECTED, reason);
5373 goog.Promise.prototype.resolve_ = function(state, x) {
5374   if (this.state_ == goog.Promise.State_.PENDING) {
5375     if (this == x) {
5376       state = goog.Promise.State_.REJECTED, x = new TypeError("Promise cannot resolve to itself");
5377     } else {
5378       if (goog.Thenable.isImplementedBy(x)) {
5379         this.state_ = goog.Promise.State_.BLOCKED;
5380         x.then(this.unblockAndFulfill_, this.unblockAndReject_, this);
5381         return;
5382       }
5383       if (goog.isObject(x)) {
5384         try {
5385           var then = x.then;
5386           if (goog.isFunction(then)) {
5387             this.tryThen_(x, then);
5388             return;
5389           }
5390         } catch (e) {
5391           state = goog.Promise.State_.REJECTED, x = e;
5392         }
5393       }
5394     }
5395     this.result_ = x;
5396     this.state_ = state;
5397     this.scheduleCallbacks_();
5398     state != goog.Promise.State_.REJECTED || x instanceof goog.Promise.CancellationError || goog.Promise.addUnhandledRejection_(this, x);
5399   }
5401 goog.Promise.prototype.tryThen_ = function(thenable, then) {
5402   this.state_ = goog.Promise.State_.BLOCKED;
5403   var promise = this, called = !1, resolve = function(value) {
5404     called || (called = !0, promise.unblockAndFulfill_(value));
5405   }, reject = function(reason) {
5406     called || (called = !0, promise.unblockAndReject_(reason));
5407   };
5408   try {
5409     then.call(thenable, resolve, reject);
5410   } catch (e) {
5411     reject(e);
5412   }
5414 goog.Promise.prototype.scheduleCallbacks_ = function() {
5415   this.executing_ || (this.executing_ = !0, goog.async.run(this.executeCallbacks_, this));
5417 goog.Promise.prototype.executeCallbacks_ = function() {
5418   for (;this.callbackEntries_ && this.callbackEntries_.length;) {
5419     var entries = this.callbackEntries_;
5420     this.callbackEntries_ = [];
5421     for (var i = 0;i < entries.length;i++) {
5422       goog.Promise.LONG_STACK_TRACES && this.currentStep_++, this.executeCallback_(entries[i], this.state_, this.result_);
5423     }
5424   }
5425   this.executing_ = !1;
5427 goog.Promise.prototype.executeCallback_ = function(callbackEntry, state, result) {
5428   if (state == goog.Promise.State_.FULFILLED) {
5429     callbackEntry.onFulfilled(result);
5430   } else {
5431     this.removeUnhandledRejection_(), callbackEntry.onRejected(result);
5432   }
5434 goog.Promise.prototype.addStackTrace_ = function(err) {
5435   if (goog.Promise.LONG_STACK_TRACES && goog.isString(err.stack)) {
5436     var trace = err.stack.split("\n", 4)[3], message = err.message, message = message + Array(11 - message.length).join(" ");
5437     this.stack_.push(message + trace);
5438   }
5440 goog.Promise.prototype.appendLongStack_ = function(err) {
5441   if (goog.Promise.LONG_STACK_TRACES && err && goog.isString(err.stack) && this.stack_.length) {
5442     for (var longTrace = ["Promise trace:"], promise = this;promise;promise = promise.parent_) {
5443       for (var i = this.currentStep_;0 <= i;i--) {
5444         longTrace.push(promise.stack_[i]);
5445       }
5446       longTrace.push("Value: [" + (promise.state_ == goog.Promise.State_.REJECTED ? "REJECTED" : "FULFILLED") + "] <" + String(promise.result_) + ">");
5447     }
5448     err.stack += "\n\n" + longTrace.join("\n");
5449   }
5451 goog.Promise.prototype.removeUnhandledRejection_ = function() {
5452   if (0 < goog.Promise.UNHANDLED_REJECTION_DELAY) {
5453     for (var p = this;p && p.unhandledRejectionId_;p = p.parent_) {
5454       goog.global.clearTimeout(p.unhandledRejectionId_), p.unhandledRejectionId_ = 0;
5455     }
5456   } else {
5457     if (0 == goog.Promise.UNHANDLED_REJECTION_DELAY) {
5458       for (p = this;p && p.hadUnhandledRejection_;p = p.parent_) {
5459         p.hadUnhandledRejection_ = !1;
5460       }
5461     }
5462   }
5464 goog.Promise.addUnhandledRejection_ = function(promise, reason) {
5465   0 < goog.Promise.UNHANDLED_REJECTION_DELAY ? promise.unhandledRejectionId_ = goog.global.setTimeout(function() {
5466     promise.appendLongStack_(reason);
5467     goog.Promise.handleRejection_.call(null, reason);
5468   }, goog.Promise.UNHANDLED_REJECTION_DELAY) : 0 == goog.Promise.UNHANDLED_REJECTION_DELAY && (promise.hadUnhandledRejection_ = !0, goog.async.run(function() {
5469     promise.hadUnhandledRejection_ && (promise.appendLongStack_(reason), goog.Promise.handleRejection_.call(null, reason));
5470   }));
5472 goog.Promise.handleRejection_ = goog.async.throwException;
5473 goog.Promise.setUnhandledRejectionHandler = function(handler) {
5474   goog.Promise.handleRejection_ = handler;
5476 goog.Promise.CancellationError = function(opt_message) {
5477   goog.debug.Error.call(this, opt_message);
5479 goog.inherits(goog.Promise.CancellationError, goog.debug.Error);
5480 goog.Promise.CancellationError.prototype.name = "cancel";
5481 goog.Promise.Resolver_ = function(promise, resolve, reject) {
5482   this.promise = promise;
5483   this.resolve = resolve;
5484   this.reject = reject;
5486 goog.Timer = function(opt_interval, opt_timerObject) {
5487   goog.events.EventTarget.call(this);
5488   this.interval_ = opt_interval || 1;
5489   this.timerObject_ = opt_timerObject || goog.Timer.defaultTimerObject;
5490   this.boundTick_ = goog.bind(this.tick_, this);
5491   this.last_ = goog.now();
5493 goog.inherits(goog.Timer, goog.events.EventTarget);
5494 goog.Timer.MAX_TIMEOUT_ = 2147483647;
5495 goog.Timer.INVALID_TIMEOUT_ID_ = -1;
5496 goog.Timer.prototype.enabled = !1;
5497 goog.Timer.defaultTimerObject = goog.global;
5498 goog.Timer.intervalScale = .8;
5499 goog.Timer.prototype.timer_ = null;
5500 goog.Timer.prototype.setInterval = function(interval) {
5501   this.interval_ = interval;
5502   this.timer_ && this.enabled ? (this.stop(), this.start()) : this.timer_ && this.stop();
5504 goog.Timer.prototype.tick_ = function() {
5505   if (this.enabled) {
5506     var elapsed = goog.now() - this.last_;
5507     0 < elapsed && elapsed < this.interval_ * goog.Timer.intervalScale ? this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_ - elapsed) : (this.timer_ && (this.timerObject_.clearTimeout(this.timer_), this.timer_ = null), this.dispatchTick(), this.enabled && (this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_), this.last_ = goog.now()));
5508   }
5510 goog.Timer.prototype.dispatchTick = function() {
5511   this.dispatchEvent(goog.Timer.TICK);
5513 goog.Timer.prototype.start = function() {
5514   this.enabled = !0;
5515   this.timer_ || (this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_), this.last_ = goog.now());
5517 goog.Timer.prototype.stop = function() {
5518   this.enabled = !1;
5519   this.timer_ && (this.timerObject_.clearTimeout(this.timer_), this.timer_ = null);
5521 goog.Timer.prototype.disposeInternal = function() {
5522   goog.Timer.superClass_.disposeInternal.call(this);
5523   this.stop();
5524   delete this.timerObject_;
5526 goog.Timer.TICK = "tick";
5527 goog.Timer.callOnce = function(listener, opt_delay, opt_handler) {
5528   if (goog.isFunction(listener)) {
5529     opt_handler && (listener = goog.bind(listener, opt_handler));
5530   } else {
5531     if (listener && "function" == typeof listener.handleEvent) {
5532       listener = goog.bind(listener.handleEvent, listener);
5533     } else {
5534       throw Error("Invalid listener argument");
5535     }
5536   }
5537   return opt_delay > goog.Timer.MAX_TIMEOUT_ ? goog.Timer.INVALID_TIMEOUT_ID_ : goog.Timer.defaultTimerObject.setTimeout(listener, opt_delay || 0);
5539 goog.Timer.clear = function(timerId) {
5540   goog.Timer.defaultTimerObject.clearTimeout(timerId);
5542 goog.Timer.promise = function(delay, opt_result) {
5543   var timerKey = null;
5544   return(new goog.Promise(function(resolve, reject) {
5545     timerKey = goog.Timer.callOnce(function() {
5546       resolve(opt_result);
5547     }, delay);
5548     timerKey == goog.Timer.INVALID_TIMEOUT_ID_ && reject(Error("Failed to schedule timer."));
5549   })).thenCatch(function(error) {
5550     goog.Timer.clear(timerKey);
5551     throw error;
5552   });
5554 goog.uri = {};
5555 goog.uri.utils = {};
5556 goog.uri.utils.CharCode_ = {AMPERSAND:38, EQUAL:61, HASH:35, QUESTION:63};
5557 goog.uri.utils.buildFromEncodedParts = function(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) {
5558   var out = "";
5559   opt_scheme && (out += opt_scheme + ":");
5560   opt_domain && (out += "//", opt_userInfo && (out += opt_userInfo + "@"), out += opt_domain, opt_port && (out += ":" + opt_port));
5561   opt_path && (out += opt_path);
5562   opt_queryData && (out += "?" + opt_queryData);
5563   opt_fragment && (out += "#" + opt_fragment);
5564   return out;
5566 goog.uri.utils.splitRe_ = /^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#(.*))?$/;
5567 goog.uri.utils.ComponentIndex = {SCHEME:1, USER_INFO:2, DOMAIN:3, PORT:4, PATH:5, QUERY_DATA:6, FRAGMENT:7};
5568 goog.uri.utils.split = function(uri) {
5569   goog.uri.utils.phishingProtection_();
5570   return uri.match(goog.uri.utils.splitRe_);
5572 goog.uri.utils.needsPhishingProtection_ = goog.userAgent.WEBKIT;
5573 goog.uri.utils.phishingProtection_ = function() {
5574   if (goog.uri.utils.needsPhishingProtection_) {
5575     goog.uri.utils.needsPhishingProtection_ = !1;
5576     var location = goog.global.location;
5577     if (location) {
5578       var href = location.href;
5579       if (href) {
5580         var domain = goog.uri.utils.getDomain(href);
5581         if (domain && domain != location.hostname) {
5582           throw goog.uri.utils.needsPhishingProtection_ = !0, Error();
5583         }
5584       }
5585     }
5586   }
5588 goog.uri.utils.decodeIfPossible_ = function(uri, opt_preserveReserved) {
5589   return uri ? opt_preserveReserved ? decodeURI(uri) : decodeURIComponent(uri) : uri;
5591 goog.uri.utils.getComponentByIndex_ = function(componentIndex, uri) {
5592   return goog.uri.utils.split(uri)[componentIndex] || null;
5594 goog.uri.utils.getScheme = function(uri) {
5595   return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.SCHEME, uri);
5597 goog.uri.utils.getEffectiveScheme = function(uri) {
5598   var scheme = goog.uri.utils.getScheme(uri);
5599   if (!scheme && self.location) {
5600     var protocol = self.location.protocol, scheme = protocol.substr(0, protocol.length - 1)
5601   }
5602   return scheme ? scheme.toLowerCase() : "";
5604 goog.uri.utils.getUserInfoEncoded = function(uri) {
5605   return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.USER_INFO, uri);
5607 goog.uri.utils.getUserInfo = function(uri) {
5608   return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getUserInfoEncoded(uri));
5610 goog.uri.utils.getDomainEncoded = function(uri) {
5611   return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.DOMAIN, uri);
5613 goog.uri.utils.getDomain = function(uri) {
5614   return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getDomainEncoded(uri), !0);
5616 goog.uri.utils.getPort = function(uri) {
5617   return Number(goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PORT, uri)) || null;
5619 goog.uri.utils.getPathEncoded = function(uri) {
5620   return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PATH, uri);
5622 goog.uri.utils.getPath = function(uri) {
5623   return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getPathEncoded(uri), !0);
5625 goog.uri.utils.getQueryData = function(uri) {
5626   return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.QUERY_DATA, uri);
5628 goog.uri.utils.getFragmentEncoded = function(uri) {
5629   var hashIndex = uri.indexOf("#");
5630   return 0 > hashIndex ? null : uri.substr(hashIndex + 1);
5632 goog.uri.utils.setFragmentEncoded = function(uri, fragment) {
5633   return goog.uri.utils.removeFragment(uri) + (fragment ? "#" + fragment : "");
5635 goog.uri.utils.getFragment = function(uri) {
5636   return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getFragmentEncoded(uri));
5638 goog.uri.utils.getHost = function(uri) {
5639   var pieces = goog.uri.utils.split(uri);
5640   return goog.uri.utils.buildFromEncodedParts(pieces[goog.uri.utils.ComponentIndex.SCHEME], pieces[goog.uri.utils.ComponentIndex.USER_INFO], pieces[goog.uri.utils.ComponentIndex.DOMAIN], pieces[goog.uri.utils.ComponentIndex.PORT]);
5642 goog.uri.utils.getPathAndAfter = function(uri) {
5643   var pieces = goog.uri.utils.split(uri);
5644   return goog.uri.utils.buildFromEncodedParts(null, null, null, null, pieces[goog.uri.utils.ComponentIndex.PATH], pieces[goog.uri.utils.ComponentIndex.QUERY_DATA], pieces[goog.uri.utils.ComponentIndex.FRAGMENT]);
5646 goog.uri.utils.removeFragment = function(uri) {
5647   var hashIndex = uri.indexOf("#");
5648   return 0 > hashIndex ? uri : uri.substr(0, hashIndex);
5650 goog.uri.utils.haveSameDomain = function(uri1, uri2) {
5651   var pieces1 = goog.uri.utils.split(uri1), pieces2 = goog.uri.utils.split(uri2);
5652   return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] == pieces2[goog.uri.utils.ComponentIndex.DOMAIN] && pieces1[goog.uri.utils.ComponentIndex.SCHEME] == pieces2[goog.uri.utils.ComponentIndex.SCHEME] && pieces1[goog.uri.utils.ComponentIndex.PORT] == pieces2[goog.uri.utils.ComponentIndex.PORT];
5654 goog.uri.utils.assertNoFragmentsOrQueries_ = function(uri) {
5655   if (goog.DEBUG && (0 <= uri.indexOf("#") || 0 <= uri.indexOf("?"))) {
5656     throw Error("goog.uri.utils: Fragment or query identifiers are not supported: [" + uri + "]");
5657   }
5659 goog.uri.utils.appendQueryData_ = function(buffer) {
5660   if (buffer[1]) {
5661     var baseUri = buffer[0], hashIndex = baseUri.indexOf("#");
5662     0 <= hashIndex && (buffer.push(baseUri.substr(hashIndex)), buffer[0] = baseUri = baseUri.substr(0, hashIndex));
5663     var questionIndex = baseUri.indexOf("?");
5664     0 > questionIndex ? buffer[1] = "?" : questionIndex == baseUri.length - 1 && (buffer[1] = void 0);
5665   }
5666   return buffer.join("");
5668 goog.uri.utils.appendKeyValuePairs_ = function(key, value, pairs) {
5669   if (goog.isArray(value)) {
5670     goog.asserts.assertArray(value);
5671     for (var j = 0;j < value.length;j++) {
5672       goog.uri.utils.appendKeyValuePairs_(key, String(value[j]), pairs);
5673     }
5674   } else {
5675     null != value && pairs.push("&", key, "" === value ? "" : "=", goog.string.urlEncode(value));
5676   }
5678 goog.uri.utils.buildQueryDataBuffer_ = function(buffer, keysAndValues, opt_startIndex) {
5679   goog.asserts.assert(0 == Math.max(keysAndValues.length - (opt_startIndex || 0), 0) % 2, "goog.uri.utils: Key/value lists must be even in length.");
5680   for (var i = opt_startIndex || 0;i < keysAndValues.length;i += 2) {
5681     goog.uri.utils.appendKeyValuePairs_(keysAndValues[i], keysAndValues[i + 1], buffer);
5682   }
5683   return buffer;
5685 goog.uri.utils.buildQueryData = function(keysAndValues, opt_startIndex) {
5686   var buffer = goog.uri.utils.buildQueryDataBuffer_([], keysAndValues, opt_startIndex);
5687   buffer[0] = "";
5688   return buffer.join("");
5690 goog.uri.utils.buildQueryDataBufferFromMap_ = function(buffer, map) {
5691   for (var key in map) {
5692     goog.uri.utils.appendKeyValuePairs_(key, map[key], buffer);
5693   }
5694   return buffer;
5696 goog.uri.utils.buildQueryDataFromMap = function(map) {
5697   var buffer = goog.uri.utils.buildQueryDataBufferFromMap_([], map);
5698   buffer[0] = "";
5699   return buffer.join("");
5701 goog.uri.utils.appendParams = function(uri, var_args) {
5702   return goog.uri.utils.appendQueryData_(2 == arguments.length ? goog.uri.utils.buildQueryDataBuffer_([uri], arguments[1], 0) : goog.uri.utils.buildQueryDataBuffer_([uri], arguments, 1));
5704 goog.uri.utils.appendParamsFromMap = function(uri, map) {
5705   return goog.uri.utils.appendQueryData_(goog.uri.utils.buildQueryDataBufferFromMap_([uri], map));
5707 goog.uri.utils.appendParam = function(uri, key, opt_value) {
5708   var paramArr = [uri, "&", key];
5709   goog.isDefAndNotNull(opt_value) && paramArr.push("=", goog.string.urlEncode(opt_value));
5710   return goog.uri.utils.appendQueryData_(paramArr);
5712 goog.uri.utils.findParam_ = function(uri, startIndex, keyEncoded, hashOrEndIndex) {
5713   for (var index = startIndex, keyLength = keyEncoded.length;0 <= (index = uri.indexOf(keyEncoded, index)) && index < hashOrEndIndex;) {
5714     var precedingChar = uri.charCodeAt(index - 1);
5715     if (precedingChar == goog.uri.utils.CharCode_.AMPERSAND || precedingChar == goog.uri.utils.CharCode_.QUESTION) {
5716       var followingChar = uri.charCodeAt(index + keyLength);
5717       if (!followingChar || followingChar == goog.uri.utils.CharCode_.EQUAL || followingChar == goog.uri.utils.CharCode_.AMPERSAND || followingChar == goog.uri.utils.CharCode_.HASH) {
5718         return index;
5719       }
5720     }
5721     index += keyLength + 1;
5722   }
5723   return-1;
5725 goog.uri.utils.hashOrEndRe_ = /#|$/;
5726 goog.uri.utils.hasParam = function(uri, keyEncoded) {
5727   return 0 <= goog.uri.utils.findParam_(uri, 0, keyEncoded, uri.search(goog.uri.utils.hashOrEndRe_));
5729 goog.uri.utils.getParamValue = function(uri, keyEncoded) {
5730   var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_), foundIndex = goog.uri.utils.findParam_(uri, 0, keyEncoded, hashOrEndIndex);
5731   if (0 > foundIndex) {
5732     return null;
5733   }
5734   var endPosition = uri.indexOf("&", foundIndex);
5735   if (0 > endPosition || endPosition > hashOrEndIndex) {
5736     endPosition = hashOrEndIndex;
5737   }
5738   foundIndex += keyEncoded.length + 1;
5739   return goog.string.urlDecode(uri.substr(foundIndex, endPosition - foundIndex));
5741 goog.uri.utils.getParamValues = function(uri, keyEncoded) {
5742   for (var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_), position = 0, foundIndex, result = [];0 <= (foundIndex = goog.uri.utils.findParam_(uri, position, keyEncoded, hashOrEndIndex));) {
5743     position = uri.indexOf("&", foundIndex);
5744     if (0 > position || position > hashOrEndIndex) {
5745       position = hashOrEndIndex;
5746     }
5747     foundIndex += keyEncoded.length + 1;
5748     result.push(goog.string.urlDecode(uri.substr(foundIndex, position - foundIndex)));
5749   }
5750   return result;
5752 goog.uri.utils.trailingQueryPunctuationRe_ = /[?&]($|#)/;
5753 goog.uri.utils.removeParam = function(uri, keyEncoded) {
5754   for (var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_), position = 0, foundIndex, buffer = [];0 <= (foundIndex = goog.uri.utils.findParam_(uri, position, keyEncoded, hashOrEndIndex));) {
5755     buffer.push(uri.substring(position, foundIndex)), position = Math.min(uri.indexOf("&", foundIndex) + 1 || hashOrEndIndex, hashOrEndIndex);
5756   }
5757   buffer.push(uri.substr(position));
5758   return buffer.join("").replace(goog.uri.utils.trailingQueryPunctuationRe_, "$1");
5760 goog.uri.utils.setParam = function(uri, keyEncoded, value) {
5761   return goog.uri.utils.appendParam(goog.uri.utils.removeParam(uri, keyEncoded), keyEncoded, value);
5763 goog.uri.utils.appendPath = function(baseUri, path) {
5764   goog.uri.utils.assertNoFragmentsOrQueries_(baseUri);
5765   goog.string.endsWith(baseUri, "/") && (baseUri = baseUri.substr(0, baseUri.length - 1));
5766   goog.string.startsWith(path, "/") && (path = path.substr(1));
5767   return goog.string.buildString(baseUri, "/", path);
5769 goog.uri.utils.setPath = function(uri, path) {
5770   goog.string.startsWith(path, "/") || (path = "/" + path);
5771   var parts = goog.uri.utils.split(uri);
5772   return goog.uri.utils.buildFromEncodedParts(parts[goog.uri.utils.ComponentIndex.SCHEME], parts[goog.uri.utils.ComponentIndex.USER_INFO], parts[goog.uri.utils.ComponentIndex.DOMAIN], parts[goog.uri.utils.ComponentIndex.PORT], path, parts[goog.uri.utils.ComponentIndex.QUERY_DATA], parts[goog.uri.utils.ComponentIndex.FRAGMENT]);
5774 goog.uri.utils.StandardQueryParam = {RANDOM:"zx"};
5775 goog.uri.utils.makeUnique = function(uri) {
5776   return goog.uri.utils.setParam(uri, goog.uri.utils.StandardQueryParam.RANDOM, goog.string.getRandomString());
5778 goog.net = {};
5779 goog.net.ErrorCode = {NO_ERROR:0, ACCESS_DENIED:1, FILE_NOT_FOUND:2, FF_SILENT_ERROR:3, CUSTOM_ERROR:4, EXCEPTION:5, HTTP_ERROR:6, ABORT:7, TIMEOUT:8, OFFLINE:9};
5780 goog.net.ErrorCode.getDebugMessage = function(errorCode) {
5781   switch(errorCode) {
5782     case goog.net.ErrorCode.NO_ERROR:
5783       return "No Error";
5784     case goog.net.ErrorCode.ACCESS_DENIED:
5785       return "Access denied to content document";
5786     case goog.net.ErrorCode.FILE_NOT_FOUND:
5787       return "File not found";
5788     case goog.net.ErrorCode.FF_SILENT_ERROR:
5789       return "Firefox silently errored";
5790     case goog.net.ErrorCode.CUSTOM_ERROR:
5791       return "Application custom error";
5792     case goog.net.ErrorCode.EXCEPTION:
5793       return "An exception occurred";
5794     case goog.net.ErrorCode.HTTP_ERROR:
5795       return "Http response at 400 or 500 level";
5796     case goog.net.ErrorCode.ABORT:
5797       return "Request was aborted";
5798     case goog.net.ErrorCode.TIMEOUT:
5799       return "Request timed out";
5800     case goog.net.ErrorCode.OFFLINE:
5801       return "The resource is not available offline";
5802     default:
5803       return "Unrecognized error code";
5804   }
5806 goog.net.EventType = {COMPLETE:"complete", SUCCESS:"success", ERROR:"error", ABORT:"abort", READY:"ready", READY_STATE_CHANGE:"readystatechange", TIMEOUT:"timeout", INCREMENTAL_DATA:"incrementaldata", PROGRESS:"progress"};
5807 goog.net.HttpStatus = {CONTINUE:100, SWITCHING_PROTOCOLS:101, OK:200, CREATED:201, ACCEPTED:202, NON_AUTHORITATIVE_INFORMATION:203, NO_CONTENT:204, RESET_CONTENT:205, PARTIAL_CONTENT:206, MULTIPLE_CHOICES:300, MOVED_PERMANENTLY:301, FOUND:302, SEE_OTHER:303, NOT_MODIFIED:304, USE_PROXY:305, TEMPORARY_REDIRECT:307, BAD_REQUEST:400, UNAUTHORIZED:401, PAYMENT_REQUIRED:402, FORBIDDEN:403, NOT_FOUND:404, METHOD_NOT_ALLOWED:405, NOT_ACCEPTABLE:406, PROXY_AUTHENTICATION_REQUIRED:407, REQUEST_TIMEOUT:408, 
5808 CONFLICT:409, GONE:410, LENGTH_REQUIRED:411, PRECONDITION_FAILED:412, REQUEST_ENTITY_TOO_LARGE:413, REQUEST_URI_TOO_LONG:414, UNSUPPORTED_MEDIA_TYPE:415, REQUEST_RANGE_NOT_SATISFIABLE:416, EXPECTATION_FAILED:417, PRECONDITION_REQUIRED:428, TOO_MANY_REQUESTS:429, REQUEST_HEADER_FIELDS_TOO_LARGE:431, INTERNAL_SERVER_ERROR:500, NOT_IMPLEMENTED:501, BAD_GATEWAY:502, SERVICE_UNAVAILABLE:503, GATEWAY_TIMEOUT:504, HTTP_VERSION_NOT_SUPPORTED:505, NETWORK_AUTHENTICATION_REQUIRED:511, QUIRK_IE_NO_CONTENT:1223};
5809 goog.net.HttpStatus.isSuccess = function(status) {
5810   switch(status) {
5811     case goog.net.HttpStatus.OK:
5812     ;
5813     case goog.net.HttpStatus.CREATED:
5814     ;
5815     case goog.net.HttpStatus.ACCEPTED:
5816     ;
5817     case goog.net.HttpStatus.NO_CONTENT:
5818     ;
5819     case goog.net.HttpStatus.PARTIAL_CONTENT:
5820     ;
5821     case goog.net.HttpStatus.NOT_MODIFIED:
5822     ;
5823     case goog.net.HttpStatus.QUIRK_IE_NO_CONTENT:
5824       return!0;
5825     default:
5826       return!1;
5827   }
5829 goog.net.XhrLike = function() {
5831 goog.net.XhrLike.prototype.open = function() {
5833 goog.net.XhrLike.prototype.send = function() {
5835 goog.net.XhrLike.prototype.abort = function() {
5837 goog.net.XhrLike.prototype.setRequestHeader = function() {
5839 goog.net.XhrLike.prototype.getResponseHeader = function() {
5841 goog.net.XhrLike.prototype.getAllResponseHeaders = function() {
5843 goog.net.XmlHttpFactory = function() {
5845 goog.net.XmlHttpFactory.prototype.cachedOptions_ = null;
5846 goog.net.XmlHttpFactory.prototype.getOptions = function() {
5847   return this.cachedOptions_ || (this.cachedOptions_ = this.internalGetOptions());
5849 goog.net.WrapperXmlHttpFactory = function(xhrFactory, optionsFactory) {
5850   this.xhrFactory_ = xhrFactory;
5851   this.optionsFactory_ = optionsFactory;
5853 goog.inherits(goog.net.WrapperXmlHttpFactory, goog.net.XmlHttpFactory);
5854 goog.net.WrapperXmlHttpFactory.prototype.createInstance = function() {
5855   return this.xhrFactory_();
5857 goog.net.WrapperXmlHttpFactory.prototype.getOptions = function() {
5858   return this.optionsFactory_();
5860 goog.net.XmlHttp = function() {
5861   return goog.net.XmlHttp.factory_.createInstance();
5863 goog.net.XmlHttp.ASSUME_NATIVE_XHR = !1;
5864 goog.net.XmlHttpDefines = {};
5865 goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR = !1;
5866 goog.net.XmlHttp.getOptions = function() {
5867   return goog.net.XmlHttp.factory_.getOptions();
5869 goog.net.XmlHttp.OptionType = {USE_NULL_FUNCTION:0, LOCAL_REQUEST_ERROR:1};
5870 goog.net.XmlHttp.ReadyState = {UNINITIALIZED:0, LOADING:1, LOADED:2, INTERACTIVE:3, COMPLETE:4};
5871 goog.net.XmlHttp.setFactory = function(factory, optionsFactory) {
5872   goog.net.XmlHttp.setGlobalFactory(new goog.net.WrapperXmlHttpFactory(goog.asserts.assert(factory), goog.asserts.assert(optionsFactory)));
5874 goog.net.XmlHttp.setGlobalFactory = function(factory) {
5875   goog.net.XmlHttp.factory_ = factory;
5877 goog.net.DefaultXmlHttpFactory = function() {
5879 goog.inherits(goog.net.DefaultXmlHttpFactory, goog.net.XmlHttpFactory);
5880 goog.net.DefaultXmlHttpFactory.prototype.createInstance = function() {
5881   var progId = this.getProgId_();
5882   return progId ? new ActiveXObject(progId) : new XMLHttpRequest;
5884 goog.net.DefaultXmlHttpFactory.prototype.internalGetOptions = function() {
5885   var progId = this.getProgId_(), options = {};
5886   progId && (options[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] = !0, options[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] = !0);
5887   return options;
5889 goog.net.DefaultXmlHttpFactory.prototype.getProgId_ = function() {
5890   if (goog.net.XmlHttp.ASSUME_NATIVE_XHR || goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR) {
5891     return "";
5892   }
5893   if (!this.ieProgId_ && "undefined" == typeof XMLHttpRequest && "undefined" != typeof ActiveXObject) {
5894     for (var ACTIVE_X_IDENTS = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"], i = 0;i < ACTIVE_X_IDENTS.length;i++) {
5895       var candidate = ACTIVE_X_IDENTS[i];
5896       try {
5897         return new ActiveXObject(candidate), this.ieProgId_ = candidate;
5898       } catch (e) {
5899       }
5900     }
5901     throw Error("Could not create ActiveXObject. ActiveX might be disabled, or MSXML might not be installed");
5902   }
5903   return this.ieProgId_;
5905 goog.net.XmlHttp.setGlobalFactory(new goog.net.DefaultXmlHttpFactory);
5906 goog.net.XhrIo = function(opt_xmlHttpFactory) {
5907   goog.events.EventTarget.call(this);
5908   this.headers = new goog.structs.Map;
5909   this.xmlHttpFactory_ = opt_xmlHttpFactory || null;
5910   this.active_ = !1;
5911   this.xhrOptions_ = this.xhr_ = null;
5912   this.lastError_ = this.lastMethod_ = this.lastUri_ = "";
5913   this.inAbort_ = this.inOpen_ = this.inSend_ = this.errorDispatched_ = !1;
5914   this.timeoutInterval_ = 0;
5915   this.timeoutId_ = null;
5916   this.responseType_ = goog.net.XhrIo.ResponseType.DEFAULT;
5917   this.useXhr2Timeout_ = this.withCredentials_ = !1;
5919 goog.inherits(goog.net.XhrIo, goog.events.EventTarget);
5920 goog.net.XhrIo.ResponseType = {DEFAULT:"", TEXT:"text", DOCUMENT:"document", BLOB:"blob", ARRAY_BUFFER:"arraybuffer"};
5921 goog.net.XhrIo.prototype.logger_ = goog.log.getLogger("goog.net.XhrIo");
5922 goog.net.XhrIo.CONTENT_TYPE_HEADER = "Content-Type";
5923 goog.net.XhrIo.HTTP_SCHEME_PATTERN = /^https?$/i;
5924 goog.net.XhrIo.METHODS_WITH_FORM_DATA = ["POST", "PUT"];
5925 goog.net.XhrIo.FORM_CONTENT_TYPE = "application/x-www-form-urlencoded;charset=utf-8";
5926 goog.net.XhrIo.XHR2_TIMEOUT_ = "timeout";
5927 goog.net.XhrIo.XHR2_ON_TIMEOUT_ = "ontimeout";
5928 goog.net.XhrIo.sendInstances_ = [];
5929 goog.net.XhrIo.send = function(url, opt_callback, opt_method, opt_content, opt_headers, opt_timeoutInterval, opt_withCredentials) {
5930   var x = new goog.net.XhrIo;
5931   goog.net.XhrIo.sendInstances_.push(x);
5932   opt_callback && x.listen(goog.net.EventType.COMPLETE, opt_callback);
5933   x.listenOnce(goog.net.EventType.READY, x.cleanupSend_);
5934   opt_timeoutInterval && x.setTimeoutInterval(opt_timeoutInterval);
5935   opt_withCredentials && x.setWithCredentials(opt_withCredentials);
5936   x.send(url, opt_method, opt_content, opt_headers);
5937   return x;
5939 goog.net.XhrIo.cleanup = function() {
5940   for (var instances = goog.net.XhrIo.sendInstances_;instances.length;) {
5941     instances.pop().dispose();
5942   }
5944 goog.net.XhrIo.protectEntryPoints = function(errorHandler) {
5945   goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = errorHandler.protectEntryPoint(goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_);
5947 goog.net.XhrIo.prototype.cleanupSend_ = function() {
5948   this.dispose();
5949   goog.array.remove(goog.net.XhrIo.sendInstances_, this);
5951 goog.net.XhrIo.prototype.setTimeoutInterval = function(ms) {
5952   this.timeoutInterval_ = Math.max(0, ms);
5954 goog.net.XhrIo.prototype.setWithCredentials = function(withCredentials) {
5955   this.withCredentials_ = withCredentials;
5957 goog.net.XhrIo.prototype.send = function(url, opt_method, opt_content, opt_headers) {
5958   if (this.xhr_) {
5959     throw Error("[goog.net.XhrIo] Object is active with another request=" + this.lastUri_ + "; newUri=" + url);
5960   }
5961   var method = opt_method ? opt_method.toUpperCase() : "GET";
5962   this.lastUri_ = url;
5963   this.lastError_ = "";
5964   this.lastMethod_ = method;
5965   this.errorDispatched_ = !1;
5966   this.active_ = !0;
5967   this.xhr_ = this.createXhr();
5968   this.xhrOptions_ = this.xmlHttpFactory_ ? this.xmlHttpFactory_.getOptions() : goog.net.XmlHttp.getOptions();
5969   this.xhr_.onreadystatechange = goog.bind(this.onReadyStateChange_, this);
5970   try {
5971     goog.log.fine(this.logger_, this.formatMsg_("Opening Xhr")), this.inOpen_ = !0, this.xhr_.open(method, String(url), !0), this.inOpen_ = !1;
5972   } catch (err) {
5973     goog.log.fine(this.logger_, this.formatMsg_("Error opening Xhr: " + err.message));
5974     this.error_(goog.net.ErrorCode.EXCEPTION, err);
5975     return;
5976   }
5977   var content = opt_content || "", headers = this.headers.clone();
5978   opt_headers && goog.structs.forEach(opt_headers, function(value, key) {
5979     headers.set(key, value);
5980   });
5981   var contentTypeKey = goog.array.find(headers.getKeys(), goog.net.XhrIo.isContentTypeHeader_), contentIsFormData = goog.global.FormData && content instanceof goog.global.FormData;
5982   !goog.array.contains(goog.net.XhrIo.METHODS_WITH_FORM_DATA, method) || contentTypeKey || contentIsFormData || headers.set(goog.net.XhrIo.CONTENT_TYPE_HEADER, goog.net.XhrIo.FORM_CONTENT_TYPE);
5983   headers.forEach(function(value, key) {
5984     this.xhr_.setRequestHeader(key, value);
5985   }, this);
5986   this.responseType_ && (this.xhr_.responseType = this.responseType_);
5987   goog.object.containsKey(this.xhr_, "withCredentials") && (this.xhr_.withCredentials = this.withCredentials_);
5988   try {
5989     this.cleanUpTimeoutTimer_(), 0 < this.timeoutInterval_ && (this.useXhr2Timeout_ = goog.net.XhrIo.shouldUseXhr2Timeout_(this.xhr_), goog.log.fine(this.logger_, this.formatMsg_("Will abort after " + this.timeoutInterval_ + "ms if incomplete, xhr2 " + this.useXhr2Timeout_)), this.useXhr2Timeout_ ? (this.xhr_[goog.net.XhrIo.XHR2_TIMEOUT_] = this.timeoutInterval_, this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] = goog.bind(this.timeout_, this)) : this.timeoutId_ = goog.Timer.callOnce(this.timeout_, this.timeoutInterval_, 
5990     this)), goog.log.fine(this.logger_, this.formatMsg_("Sending request")), this.inSend_ = !0, this.xhr_.send(content), this.inSend_ = !1;
5991   } catch (err$$0) {
5992     goog.log.fine(this.logger_, this.formatMsg_("Send error: " + err$$0.message)), this.error_(goog.net.ErrorCode.EXCEPTION, err$$0);
5993   }
5995 goog.net.XhrIo.shouldUseXhr2Timeout_ = function(xhr) {
5996   return goog.userAgent.IE && goog.userAgent.isVersionOrHigher(9) && goog.isNumber(xhr[goog.net.XhrIo.XHR2_TIMEOUT_]) && goog.isDef(xhr[goog.net.XhrIo.XHR2_ON_TIMEOUT_]);
5998 goog.net.XhrIo.isContentTypeHeader_ = function(header) {
5999   return goog.string.caseInsensitiveEquals(goog.net.XhrIo.CONTENT_TYPE_HEADER, header);
6001 goog.net.XhrIo.prototype.createXhr = function() {
6002   return this.xmlHttpFactory_ ? this.xmlHttpFactory_.createInstance() : goog.net.XmlHttp();
6004 goog.net.XhrIo.prototype.timeout_ = function() {
6005   "undefined" != typeof goog && this.xhr_ && (this.lastError_ = "Timed out after " + this.timeoutInterval_ + "ms, aborting", goog.log.fine(this.logger_, this.formatMsg_(this.lastError_)), this.dispatchEvent(goog.net.EventType.TIMEOUT), this.abort(goog.net.ErrorCode.TIMEOUT));
6007 goog.net.XhrIo.prototype.error_ = function(errorCode, err) {
6008   this.active_ = !1;
6009   this.xhr_ && (this.inAbort_ = !0, this.xhr_.abort(), this.inAbort_ = !1);
6010   this.lastError_ = err;
6011   this.dispatchErrors_();
6012   this.cleanUpXhr_();
6014 goog.net.XhrIo.prototype.dispatchErrors_ = function() {
6015   this.errorDispatched_ || (this.errorDispatched_ = !0, this.dispatchEvent(goog.net.EventType.COMPLETE), this.dispatchEvent(goog.net.EventType.ERROR));
6017 goog.net.XhrIo.prototype.abort = function() {
6018   this.xhr_ && this.active_ && (goog.log.fine(this.logger_, this.formatMsg_("Aborting")), this.active_ = !1, this.inAbort_ = !0, this.xhr_.abort(), this.inAbort_ = !1, this.dispatchEvent(goog.net.EventType.COMPLETE), this.dispatchEvent(goog.net.EventType.ABORT), this.cleanUpXhr_());
6020 goog.net.XhrIo.prototype.disposeInternal = function() {
6021   this.xhr_ && (this.active_ && (this.active_ = !1, this.inAbort_ = !0, this.xhr_.abort(), this.inAbort_ = !1), this.cleanUpXhr_(!0));
6022   goog.net.XhrIo.superClass_.disposeInternal.call(this);
6024 goog.net.XhrIo.prototype.onReadyStateChange_ = function() {
6025   if (!this.isDisposed()) {
6026     if (this.inOpen_ || this.inSend_ || this.inAbort_) {
6027       this.onReadyStateChangeHelper_();
6028     } else {
6029       this.onReadyStateChangeEntryPoint_();
6030     }
6031   }
6033 goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = function() {
6034   this.onReadyStateChangeHelper_();
6036 goog.net.XhrIo.prototype.onReadyStateChangeHelper_ = function() {
6037   if (this.active_ && "undefined" != typeof goog) {
6038     if (this.xhrOptions_[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] && this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE && 2 == this.getStatus()) {
6039       goog.log.fine(this.logger_, this.formatMsg_("Local request error detected and ignored"));
6040     } else {
6041       if (this.inSend_ && this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE) {
6042         goog.Timer.callOnce(this.onReadyStateChange_, 0, this);
6043       } else {
6044         if (this.dispatchEvent(goog.net.EventType.READY_STATE_CHANGE), this.isComplete()) {
6045           goog.log.fine(this.logger_, this.formatMsg_("Request complete"));
6046           this.active_ = !1;
6047           try {
6048             this.isSuccess() ? (this.dispatchEvent(goog.net.EventType.COMPLETE), this.dispatchEvent(goog.net.EventType.SUCCESS)) : (this.lastError_ = this.getStatusText() + " [" + this.getStatus() + "]", this.dispatchErrors_());
6049           } finally {
6050             this.cleanUpXhr_();
6051           }
6052         }
6053       }
6054     }
6055   }
6057 goog.net.XhrIo.prototype.cleanUpXhr_ = function(opt_fromDispose) {
6058   if (this.xhr_) {
6059     this.cleanUpTimeoutTimer_();
6060     var xhr = this.xhr_, clearedOnReadyStateChange = this.xhrOptions_[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] ? goog.nullFunction : null;
6061     this.xhrOptions_ = this.xhr_ = null;
6062     opt_fromDispose || this.dispatchEvent(goog.net.EventType.READY);
6063     try {
6064       xhr.onreadystatechange = clearedOnReadyStateChange;
6065     } catch (e) {
6066       goog.log.error(this.logger_, "Problem encountered resetting onreadystatechange: " + e.message);
6067     }
6068   }
6070 goog.net.XhrIo.prototype.cleanUpTimeoutTimer_ = function() {
6071   this.xhr_ && this.useXhr2Timeout_ && (this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] = null);
6072   goog.isNumber(this.timeoutId_) && (goog.Timer.clear(this.timeoutId_), this.timeoutId_ = null);
6074 goog.net.XhrIo.prototype.isComplete = function() {
6075   return this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE;
6077 goog.net.XhrIo.prototype.isSuccess = function() {
6078   var status = this.getStatus();
6079   return goog.net.HttpStatus.isSuccess(status) || 0 === status && !this.isLastUriEffectiveSchemeHttp_();
6081 goog.net.XhrIo.prototype.isLastUriEffectiveSchemeHttp_ = function() {
6082   var scheme = goog.uri.utils.getEffectiveScheme(String(this.lastUri_));
6083   return goog.net.XhrIo.HTTP_SCHEME_PATTERN.test(scheme);
6085 goog.net.XhrIo.prototype.getReadyState = function() {
6086   return this.xhr_ ? this.xhr_.readyState : goog.net.XmlHttp.ReadyState.UNINITIALIZED;
6088 goog.net.XhrIo.prototype.getStatus = function() {
6089   try {
6090     return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ? this.xhr_.status : -1;
6091   } catch (e) {
6092     return-1;
6093   }
6095 goog.net.XhrIo.prototype.getStatusText = function() {
6096   try {
6097     return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ? this.xhr_.statusText : "";
6098   } catch (e) {
6099     return goog.log.fine(this.logger_, "Can not get status: " + e.message), "";
6100   }
6102 goog.net.XhrIo.prototype.getResponseText = function() {
6103   try {
6104     return this.xhr_ ? this.xhr_.responseText : "";
6105   } catch (e) {
6106     return goog.log.fine(this.logger_, "Can not get responseText: " + e.message), "";
6107   }
6109 goog.net.XhrIo.prototype.getResponseHeader = function(key) {
6110   return this.xhr_ && this.isComplete() ? this.xhr_.getResponseHeader(key) : void 0;
6112 goog.net.XhrIo.prototype.getAllResponseHeaders = function() {
6113   return this.xhr_ && this.isComplete() ? this.xhr_.getAllResponseHeaders() : "";
6115 goog.net.XhrIo.prototype.formatMsg_ = function(msg) {
6116   return msg + " [" + this.lastMethod_ + " " + this.lastUri_ + " " + this.getStatus() + "]";
6118 goog.debug.entryPointRegistry.register(function(transformer) {
6119   goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = transformer(goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_);
6121 goog.Uri = function(opt_uri, opt_ignoreCase) {
6122   var m;
6123   opt_uri instanceof goog.Uri ? (this.ignoreCase_ = goog.isDef(opt_ignoreCase) ? opt_ignoreCase : opt_uri.getIgnoreCase(), this.setScheme(opt_uri.getScheme()), this.setUserInfo(opt_uri.getUserInfo()), this.setDomain(opt_uri.getDomain()), this.setPort(opt_uri.getPort()), this.setPath(opt_uri.getPath()), this.setQueryData(opt_uri.getQueryData().clone()), this.setFragment(opt_uri.getFragment())) : opt_uri && (m = goog.uri.utils.split(String(opt_uri))) ? (this.ignoreCase_ = !!opt_ignoreCase, this.setScheme(m[goog.uri.utils.ComponentIndex.SCHEME] || 
6124   "", !0), this.setUserInfo(m[goog.uri.utils.ComponentIndex.USER_INFO] || "", !0), this.setDomain(m[goog.uri.utils.ComponentIndex.DOMAIN] || "", !0), this.setPort(m[goog.uri.utils.ComponentIndex.PORT]), this.setPath(m[goog.uri.utils.ComponentIndex.PATH] || "", !0), this.setQueryData(m[goog.uri.utils.ComponentIndex.QUERY_DATA] || "", !0), this.setFragment(m[goog.uri.utils.ComponentIndex.FRAGMENT] || "", !0)) : (this.ignoreCase_ = !!opt_ignoreCase, this.queryData_ = new goog.Uri.QueryData(null, null, 
6125   this.ignoreCase_));
6127 goog.Uri.preserveParameterTypesCompatibilityFlag = !1;
6128 goog.Uri.RANDOM_PARAM = goog.uri.utils.StandardQueryParam.RANDOM;
6129 goog.Uri.prototype.scheme_ = "";
6130 goog.Uri.prototype.userInfo_ = "";
6131 goog.Uri.prototype.domain_ = "";
6132 goog.Uri.prototype.port_ = null;
6133 goog.Uri.prototype.path_ = "";
6134 goog.Uri.prototype.fragment_ = "";
6135 goog.Uri.prototype.isReadOnly_ = !1;
6136 goog.Uri.prototype.ignoreCase_ = !1;
6137 goog.Uri.prototype.toString = function() {
6138   var out = [], scheme = this.getScheme();
6139   scheme && out.push(goog.Uri.encodeSpecialChars_(scheme, goog.Uri.reDisallowedInSchemeOrUserInfo_, !0), ":");
6140   var domain = this.getDomain();
6141   if (domain) {
6142     out.push("//");
6143     var userInfo = this.getUserInfo();
6144     userInfo && out.push(goog.Uri.encodeSpecialChars_(userInfo, goog.Uri.reDisallowedInSchemeOrUserInfo_, !0), "@");
6145     out.push(goog.Uri.removeDoubleEncoding_(goog.string.urlEncode(domain)));
6146     var port = this.getPort();
6147     null != port && out.push(":", String(port));
6148   }
6149   var path = this.getPath();
6150   path && (this.hasDomain() && "/" != path.charAt(0) && out.push("/"), out.push(goog.Uri.encodeSpecialChars_(path, "/" == path.charAt(0) ? goog.Uri.reDisallowedInAbsolutePath_ : goog.Uri.reDisallowedInRelativePath_, !0)));
6151   var query = this.getEncodedQuery();
6152   query && out.push("?", query);
6153   var fragment = this.getFragment();
6154   fragment && out.push("#", goog.Uri.encodeSpecialChars_(fragment, goog.Uri.reDisallowedInFragment_));
6155   return out.join("");
6157 goog.Uri.prototype.resolve = function(relativeUri) {
6158   var absoluteUri = this.clone(), overridden = relativeUri.hasScheme();
6159   overridden ? absoluteUri.setScheme(relativeUri.getScheme()) : overridden = relativeUri.hasUserInfo();
6160   overridden ? absoluteUri.setUserInfo(relativeUri.getUserInfo()) : overridden = relativeUri.hasDomain();
6161   overridden ? absoluteUri.setDomain(relativeUri.getDomain()) : overridden = relativeUri.hasPort();
6162   var path = relativeUri.getPath();
6163   if (overridden) {
6164     absoluteUri.setPort(relativeUri.getPort());
6165   } else {
6166     if (overridden = relativeUri.hasPath()) {
6167       if ("/" != path.charAt(0)) {
6168         if (this.hasDomain() && !this.hasPath()) {
6169           path = "/" + path;
6170         } else {
6171           var lastSlashIndex = absoluteUri.getPath().lastIndexOf("/");
6172           -1 != lastSlashIndex && (path = absoluteUri.getPath().substr(0, lastSlashIndex + 1) + path);
6173         }
6174       }
6175       path = goog.Uri.removeDotSegments(path);
6176     }
6177   }
6178   overridden ? absoluteUri.setPath(path) : overridden = relativeUri.hasQuery();
6179   overridden ? absoluteUri.setQueryData(relativeUri.getDecodedQuery()) : overridden = relativeUri.hasFragment();
6180   overridden && absoluteUri.setFragment(relativeUri.getFragment());
6181   return absoluteUri;
6183 goog.Uri.prototype.clone = function() {
6184   return new goog.Uri(this);
6186 goog.Uri.prototype.getScheme = function() {
6187   return this.scheme_;
6189 goog.Uri.prototype.setScheme = function(newScheme, opt_decode) {
6190   this.enforceReadOnly();
6191   if (this.scheme_ = opt_decode ? goog.Uri.decodeOrEmpty_(newScheme, !0) : newScheme) {
6192     this.scheme_ = this.scheme_.replace(/:$/, "");
6193   }
6194   return this;
6196 goog.Uri.prototype.hasScheme = function() {
6197   return!!this.scheme_;
6199 goog.Uri.prototype.getUserInfo = function() {
6200   return this.userInfo_;
6202 goog.Uri.prototype.setUserInfo = function(newUserInfo, opt_decode) {
6203   this.enforceReadOnly();
6204   this.userInfo_ = opt_decode ? goog.Uri.decodeOrEmpty_(newUserInfo) : newUserInfo;
6205   return this;
6207 goog.Uri.prototype.hasUserInfo = function() {
6208   return!!this.userInfo_;
6210 goog.Uri.prototype.getDomain = function() {
6211   return this.domain_;
6213 goog.Uri.prototype.setDomain = function(newDomain, opt_decode) {
6214   this.enforceReadOnly();
6215   this.domain_ = opt_decode ? goog.Uri.decodeOrEmpty_(newDomain, !0) : newDomain;
6216   return this;
6218 goog.Uri.prototype.hasDomain = function() {
6219   return!!this.domain_;
6221 goog.Uri.prototype.getPort = function() {
6222   return this.port_;
6224 goog.Uri.prototype.setPort = function(newPort) {
6225   this.enforceReadOnly();
6226   if (newPort) {
6227     newPort = Number(newPort);
6228     if (isNaN(newPort) || 0 > newPort) {
6229       throw Error("Bad port number " + newPort);
6230     }
6231     this.port_ = newPort;
6232   } else {
6233     this.port_ = null;
6234   }
6235   return this;
6237 goog.Uri.prototype.hasPort = function() {
6238   return null != this.port_;
6240 goog.Uri.prototype.getPath = function() {
6241   return this.path_;
6243 goog.Uri.prototype.setPath = function(newPath, opt_decode) {
6244   this.enforceReadOnly();
6245   this.path_ = opt_decode ? goog.Uri.decodeOrEmpty_(newPath, !0) : newPath;
6246   return this;
6248 goog.Uri.prototype.hasPath = function() {
6249   return!!this.path_;
6251 goog.Uri.prototype.hasQuery = function() {
6252   return "" !== this.queryData_.toString();
6254 goog.Uri.prototype.setQueryData = function(queryData, opt_decode) {
6255   this.enforceReadOnly();
6256   queryData instanceof goog.Uri.QueryData ? (this.queryData_ = queryData, this.queryData_.setIgnoreCase(this.ignoreCase_)) : (opt_decode || (queryData = goog.Uri.encodeSpecialChars_(queryData, goog.Uri.reDisallowedInQuery_)), this.queryData_ = new goog.Uri.QueryData(queryData, null, this.ignoreCase_));
6257   return this;
6259 goog.Uri.prototype.getEncodedQuery = function() {
6260   return this.queryData_.toString();
6262 goog.Uri.prototype.getDecodedQuery = function() {
6263   return this.queryData_.toDecodedString();
6265 goog.Uri.prototype.getQueryData = function() {
6266   return this.queryData_;
6268 goog.Uri.prototype.setParameterValue = function(key, value) {
6269   this.enforceReadOnly();
6270   this.queryData_.set(key, value);
6271   return this;
6273 goog.Uri.prototype.getFragment = function() {
6274   return this.fragment_;
6276 goog.Uri.prototype.setFragment = function(newFragment, opt_decode) {
6277   this.enforceReadOnly();
6278   this.fragment_ = opt_decode ? goog.Uri.decodeOrEmpty_(newFragment) : newFragment;
6279   return this;
6281 goog.Uri.prototype.hasFragment = function() {
6282   return!!this.fragment_;
6284 goog.Uri.prototype.makeUnique = function() {
6285   this.enforceReadOnly();
6286   this.setParameterValue(goog.Uri.RANDOM_PARAM, goog.string.getRandomString());
6287   return this;
6289 goog.Uri.prototype.enforceReadOnly = function() {
6290   if (this.isReadOnly_) {
6291     throw Error("Tried to modify a read-only Uri");
6292   }
6294 goog.Uri.prototype.setIgnoreCase = function(ignoreCase) {
6295   this.ignoreCase_ = ignoreCase;
6296   this.queryData_ && this.queryData_.setIgnoreCase(ignoreCase);
6297   return this;
6299 goog.Uri.prototype.getIgnoreCase = function() {
6300   return this.ignoreCase_;
6302 goog.Uri.parse = function(uri, opt_ignoreCase) {
6303   return uri instanceof goog.Uri ? uri.clone() : new goog.Uri(uri, opt_ignoreCase);
6305 goog.Uri.create = function(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_query, opt_fragment, opt_ignoreCase) {
6306   var uri = new goog.Uri(null, opt_ignoreCase);
6307   opt_scheme && uri.setScheme(opt_scheme);
6308   opt_userInfo && uri.setUserInfo(opt_userInfo);
6309   opt_domain && uri.setDomain(opt_domain);
6310   opt_port && uri.setPort(opt_port);
6311   opt_path && uri.setPath(opt_path);
6312   opt_query && uri.setQueryData(opt_query);
6313   opt_fragment && uri.setFragment(opt_fragment);
6314   return uri;
6316 goog.Uri.resolve = function(base, rel) {
6317   base instanceof goog.Uri || (base = goog.Uri.parse(base));
6318   rel instanceof goog.Uri || (rel = goog.Uri.parse(rel));
6319   return base.resolve(rel);
6321 goog.Uri.removeDotSegments = function(path) {
6322   if (".." == path || "." == path) {
6323     return "";
6324   }
6325   if (goog.string.contains(path, "./") || goog.string.contains(path, "/.")) {
6326     for (var leadingSlash = goog.string.startsWith(path, "/"), segments = path.split("/"), out = [], pos = 0;pos < segments.length;) {
6327       var segment = segments[pos++];
6328       "." == segment ? leadingSlash && pos == segments.length && out.push("") : ".." == segment ? ((1 < out.length || 1 == out.length && "" != out[0]) && out.pop(), leadingSlash && pos == segments.length && out.push("")) : (out.push(segment), leadingSlash = !0);
6329     }
6330     return out.join("/");
6331   }
6332   return path;
6334 goog.Uri.decodeOrEmpty_ = function(val, opt_preserveReserved) {
6335   return val ? opt_preserveReserved ? decodeURI(val) : decodeURIComponent(val) : "";
6337 goog.Uri.encodeSpecialChars_ = function(unescapedPart, extra, opt_removeDoubleEncoding) {
6338   if (goog.isString(unescapedPart)) {
6339     var encoded = encodeURI(unescapedPart).replace(extra, goog.Uri.encodeChar_);
6340     opt_removeDoubleEncoding && (encoded = goog.Uri.removeDoubleEncoding_(encoded));
6341     return encoded;
6342   }
6343   return null;
6345 goog.Uri.encodeChar_ = function(ch) {
6346   var n = ch.charCodeAt(0);
6347   return "%" + (n >> 4 & 15).toString(16) + (n & 15).toString(16);
6349 goog.Uri.removeDoubleEncoding_ = function(doubleEncodedString) {
6350   return doubleEncodedString.replace(/%25([0-9a-fA-F]{2})/g, "%$1");
6352 goog.Uri.reDisallowedInSchemeOrUserInfo_ = /[#\/\?@]/g;
6353 goog.Uri.reDisallowedInRelativePath_ = /[\#\?:]/g;
6354 goog.Uri.reDisallowedInAbsolutePath_ = /[\#\?]/g;
6355 goog.Uri.reDisallowedInQuery_ = /[\#\?@]/g;
6356 goog.Uri.reDisallowedInFragment_ = /#/g;
6357 goog.Uri.haveSameDomain = function(uri1String, uri2String) {
6358   var pieces1 = goog.uri.utils.split(uri1String), pieces2 = goog.uri.utils.split(uri2String);
6359   return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] == pieces2[goog.uri.utils.ComponentIndex.DOMAIN] && pieces1[goog.uri.utils.ComponentIndex.PORT] == pieces2[goog.uri.utils.ComponentIndex.PORT];
6361 goog.Uri.QueryData = function(opt_query, opt_uri, opt_ignoreCase) {
6362   this.encodedQuery_ = opt_query || null;
6363   this.ignoreCase_ = !!opt_ignoreCase;
6365 goog.Uri.QueryData.prototype.ensureKeyMapInitialized_ = function() {
6366   if (!this.keyMap_ && (this.keyMap_ = new goog.structs.Map, this.count_ = 0, this.encodedQuery_)) {
6367     for (var pairs = this.encodedQuery_.split("&"), i = 0;i < pairs.length;i++) {
6368       var indexOfEquals = pairs[i].indexOf("="), name = null, value = null;
6369       0 <= indexOfEquals ? (name = pairs[i].substring(0, indexOfEquals), value = pairs[i].substring(indexOfEquals + 1)) : name = pairs[i];
6370       name = goog.string.urlDecode(name);
6371       name = this.getKeyName_(name);
6372       this.add(name, value ? goog.string.urlDecode(value) : "");
6373     }
6374   }
6376 goog.Uri.QueryData.createFromMap = function(map, opt_uri, opt_ignoreCase) {
6377   var keys = goog.structs.getKeys(map);
6378   if ("undefined" == typeof keys) {
6379     throw Error("Keys are undefined");
6380   }
6381   for (var queryData = new goog.Uri.QueryData(null, null, opt_ignoreCase), values = goog.structs.getValues(map), i = 0;i < keys.length;i++) {
6382     var key = keys[i], value = values[i];
6383     goog.isArray(value) ? queryData.setValues(key, value) : queryData.add(key, value);
6384   }
6385   return queryData;
6387 goog.Uri.QueryData.createFromKeysValues = function(keys, values, opt_uri, opt_ignoreCase) {
6388   if (keys.length != values.length) {
6389     throw Error("Mismatched lengths for keys/values");
6390   }
6391   for (var queryData = new goog.Uri.QueryData(null, null, opt_ignoreCase), i = 0;i < keys.length;i++) {
6392     queryData.add(keys[i], values[i]);
6393   }
6394   return queryData;
6396 goog.Uri.QueryData.prototype.keyMap_ = null;
6397 goog.Uri.QueryData.prototype.count_ = null;
6398 goog.Uri.QueryData.prototype.getCount = function() {
6399   this.ensureKeyMapInitialized_();
6400   return this.count_;
6402 goog.Uri.QueryData.prototype.add = function(key, value) {
6403   this.ensureKeyMapInitialized_();
6404   this.invalidateCache_();
6405   key = this.getKeyName_(key);
6406   var values = this.keyMap_.get(key);
6407   values || this.keyMap_.set(key, values = []);
6408   values.push(value);
6409   this.count_++;
6410   return this;
6412 goog.Uri.QueryData.prototype.remove = function(key) {
6413   this.ensureKeyMapInitialized_();
6414   key = this.getKeyName_(key);
6415   return this.keyMap_.containsKey(key) ? (this.invalidateCache_(), this.count_ -= this.keyMap_.get(key).length, this.keyMap_.remove(key)) : !1;
6417 goog.Uri.QueryData.prototype.clear = function() {
6418   this.invalidateCache_();
6419   this.keyMap_ = null;
6420   this.count_ = 0;
6422 goog.Uri.QueryData.prototype.isEmpty = function() {
6423   this.ensureKeyMapInitialized_();
6424   return 0 == this.count_;
6426 goog.Uri.QueryData.prototype.containsKey = function(key) {
6427   this.ensureKeyMapInitialized_();
6428   key = this.getKeyName_(key);
6429   return this.keyMap_.containsKey(key);
6431 goog.Uri.QueryData.prototype.containsValue = function(value) {
6432   var vals = this.getValues();
6433   return goog.array.contains(vals, value);
6435 goog.Uri.QueryData.prototype.getKeys = function() {
6436   this.ensureKeyMapInitialized_();
6437   for (var vals = this.keyMap_.getValues(), keys = this.keyMap_.getKeys(), rv = [], i = 0;i < keys.length;i++) {
6438     for (var val = vals[i], j = 0;j < val.length;j++) {
6439       rv.push(keys[i]);
6440     }
6441   }
6442   return rv;
6444 goog.Uri.QueryData.prototype.getValues = function(opt_key) {
6445   this.ensureKeyMapInitialized_();
6446   var rv = [];
6447   if (goog.isString(opt_key)) {
6448     this.containsKey(opt_key) && (rv = goog.array.concat(rv, this.keyMap_.get(this.getKeyName_(opt_key))));
6449   } else {
6450     for (var values = this.keyMap_.getValues(), i = 0;i < values.length;i++) {
6451       rv = goog.array.concat(rv, values[i]);
6452     }
6453   }
6454   return rv;
6456 goog.Uri.QueryData.prototype.set = function(key, value) {
6457   this.ensureKeyMapInitialized_();
6458   this.invalidateCache_();
6459   key = this.getKeyName_(key);
6460   this.containsKey(key) && (this.count_ -= this.keyMap_.get(key).length);
6461   this.keyMap_.set(key, [value]);
6462   this.count_++;
6463   return this;
6465 goog.Uri.QueryData.prototype.get = function(key, opt_default) {
6466   var values = key ? this.getValues(key) : [];
6467   return goog.Uri.preserveParameterTypesCompatibilityFlag ? 0 < values.length ? values[0] : opt_default : 0 < values.length ? String(values[0]) : opt_default;
6469 goog.Uri.QueryData.prototype.setValues = function(key, values) {
6470   this.remove(key);
6471   0 < values.length && (this.invalidateCache_(), this.keyMap_.set(this.getKeyName_(key), goog.array.clone(values)), this.count_ += values.length);
6473 goog.Uri.QueryData.prototype.toString = function() {
6474   if (this.encodedQuery_) {
6475     return this.encodedQuery_;
6476   }
6477   if (!this.keyMap_) {
6478     return "";
6479   }
6480   for (var sb = [], keys = this.keyMap_.getKeys(), i = 0;i < keys.length;i++) {
6481     for (var key = keys[i], encodedKey = goog.string.urlEncode(key), val = this.getValues(key), j = 0;j < val.length;j++) {
6482       var param = encodedKey;
6483       "" !== val[j] && (param += "=" + goog.string.urlEncode(val[j]));
6484       sb.push(param);
6485     }
6486   }
6487   return this.encodedQuery_ = sb.join("&");
6489 goog.Uri.QueryData.prototype.toDecodedString = function() {
6490   return goog.Uri.decodeOrEmpty_(this.toString());
6492 goog.Uri.QueryData.prototype.invalidateCache_ = function() {
6493   this.encodedQuery_ = null;
6495 goog.Uri.QueryData.prototype.clone = function() {
6496   var rv = new goog.Uri.QueryData;
6497   rv.encodedQuery_ = this.encodedQuery_;
6498   this.keyMap_ && (rv.keyMap_ = this.keyMap_.clone(), rv.count_ = this.count_);
6499   return rv;
6501 goog.Uri.QueryData.prototype.getKeyName_ = function(arg) {
6502   var keyName = String(arg);
6503   this.ignoreCase_ && (keyName = keyName.toLowerCase());
6504   return keyName;
6506 goog.Uri.QueryData.prototype.setIgnoreCase = function(ignoreCase) {
6507   var resetKeys = ignoreCase && !this.ignoreCase_;
6508   resetKeys && (this.ensureKeyMapInitialized_(), this.invalidateCache_(), this.keyMap_.forEach(function(value, key) {
6509     var lowerCase = key.toLowerCase();
6510     key != lowerCase && (this.remove(key), this.setValues(lowerCase, value));
6511   }, this));
6512   this.ignoreCase_ = ignoreCase;
6514 goog.Uri.QueryData.prototype.extend = function(var_args) {
6515   for (var i = 0;i < arguments.length;i++) {
6516     var data = arguments[i];
6517     goog.structs.forEach(data, function(value, key) {
6518       this.add(key, value);
6519     }, this);
6520   }
6522 goog.appengine = {};
6523 goog.appengine.DevChannel = function(token) {
6524   this.token_ = token;
6526 goog.appengine.DevChannel.prototype.open = function(opt_handler) {
6527   opt_handler = opt_handler || new goog.appengine.DevSocket.Handler;
6528   return new goog.appengine.DevSocket(this.token_, opt_handler);
6530 goog.appengine.DevSocket = function(token, handler) {
6531   this.readyState = goog.appengine.DevSocket.ReadyState.CONNECTING;
6532   this.token_ = token;
6533   this.applicationKey_ = token.substring(token.lastIndexOf("-") + 1);
6534   this.clientId_ = null;
6535   this.onopen = handler.onopen;
6536   this.onmessage = handler.onmessage;
6537   this.onerror = handler.onerror;
6538   this.onclose = handler.onclose;
6539   this.win_ = goog.dom.getWindow();
6540   this.pollingTimer_ = null;
6541   goog.net.XhrIo.send(this.getUrl_("connect"), goog.bind(this.connect_, this));
6542   goog.events.listen(this.win_, "beforeunload", goog.bind(this.beforeunload_, this));
6543   if (!document.body) {
6544     throw "document.body is not defined -- do not create socket from script in <head>.";
6545   }
6547 goog.appengine.DevSocket.POLLING_TIMEOUT_MS = 500;
6548 goog.appengine.DevSocket.BASE_URL = "/_ah/channel/";
6549 goog.appengine.DevSocket.ReadyState = {CONNECTING:0, OPEN:1, CLOSING:2, CLOSED:3};
6550 goog.appengine.DevSocket.prototype.getUrl_ = function(command) {
6551   var url = goog.appengine.DevSocket.BASE_URL + "dev?command=" + command + "&channel=" + this.token_;
6552   this.clientId_ && (url += "&client=" + this.clientId_);
6553   return url;
6555 goog.appengine.DevSocket.prototype.connect_ = function(e) {
6556   var xhr = e.target;
6557   if (xhr.isSuccess()) {
6558     this.clientId_ = xhr.getResponseText(), this.readyState = goog.appengine.DevSocket.ReadyState.OPEN, this.onopen(), this.pollingTimer_ = this.win_.setTimeout(goog.bind(this.poll_, this), goog.appengine.DevSocket.POLLING_TIMEOUT_MS);
6559   } else {
6560     this.readyState = goog.appengine.DevSocket.ReadyState.CLOSING;
6561     var evt = {};
6562     evt.description = xhr.getStatusText();
6563     evt.code = xhr.getStatus();
6564     this.onerror(evt);
6565     this.readyState = goog.appengine.DevSocket.ReadyState.CLOSED;
6566     this.onclose();
6567   }
6569 goog.appengine.DevSocket.prototype.disconnect_ = function() {
6570   this.readyState = goog.appengine.DevSocket.ReadyState.CLOSED;
6571   this.onclose();
6573 goog.appengine.DevSocket.prototype.forwardMessage_ = function(e) {
6574   var xhr = e.target;
6575   if (xhr.isSuccess()) {
6576     var evt = {};
6577     evt.data = xhr.getResponseText();
6578     if (evt.data.length) {
6579       this.onmessage(evt);
6580     }
6581     this.readyState == goog.appengine.DevSocket.ReadyState.OPEN && (this.pollingTimer_ = this.win_.setTimeout(goog.bind(this.poll_, this), goog.appengine.DevSocket.POLLING_TIMEOUT_MS));
6582   } else {
6583     evt = {}, evt.description = xhr.getStatusText(), evt.code = xhr.getStatus(), this.onerror(evt), this.readyState = goog.appengine.DevSocket.ReadyState.CLOSED, this.onclose();
6584   }
6586 goog.appengine.DevSocket.prototype.poll_ = function() {
6587   goog.net.XhrIo.send(this.getUrl_("poll"), goog.bind(this.forwardMessage_, this));
6589 goog.appengine.DevSocket.prototype.beforeunload_ = function() {
6590   var xhr = goog.net.XmlHttp();
6591   xhr.open("GET", this.getUrl_("disconnect"), !1);
6592   xhr.send();
6594 goog.appengine.DevSocket.prototype.forwardSendComplete_ = function(e) {
6595   var xhr = e.target;
6596   if (!xhr.isSuccess()) {
6597     var evt = {};
6598     evt.description = xhr.getStatusText();
6599     evt.code = xhr.getStatus();
6600     this.onerror(evt);
6601   }
6603 goog.appengine.DevSocket.prototype.send = function(data) {
6604   if (this.readyState != goog.appengine.DevSocket.ReadyState.OPEN) {
6605     return!1;
6606   }
6607   var url = goog.appengine.DevSocket.BASE_URL + "receive", sendData = new goog.Uri.QueryData;
6608   sendData.set("key", this.applicationKey_);
6609   sendData.set("msg", data);
6610   goog.net.XhrIo.send(url, goog.bind(this.forwardSendComplete_, this), "POST", sendData.toString());
6611   return!0;
6613 goog.appengine.DevSocket.prototype.close = function() {
6614   this.readyState = goog.appengine.DevSocket.ReadyState.CLOSING;
6615   this.pollingTimer_ && this.win_.clearTimeout(this.pollingTimer_);
6616   goog.net.XhrIo.send(this.getUrl_("disconnect"), goog.bind(this.disconnect_, this));
6618 goog.appengine.DevSocket.Handler = function() {
6620 goog.appengine.DevSocket.Handler.prototype.onopen = function() {
6622 goog.appengine.DevSocket.Handler.prototype.onmessage = function() {
6624 goog.appengine.DevSocket.Handler.prototype.onerror = function() {
6626 goog.appengine.DevSocket.Handler.prototype.onclose = function() {
6628 goog.exportSymbol("goog.appengine.Channel", goog.appengine.DevChannel);
6629 goog.exportSymbol("goog.appengine.Channel.prototype.open", goog.appengine.DevChannel.prototype.open);
6630 goog.exportSymbol("goog.appengine.Socket.Handler", goog.appengine.DevSocket.Handler);
6631 goog.exportSymbol("goog.appengine.Socket.Handler.prototype.onopen", goog.appengine.DevChannel.prototype.onopen);
6632 goog.exportSymbol("goog.appengine.Socket.Handler.prototype.onmessage", goog.appengine.DevSocket.Handler.prototype.onmessage);
6633 goog.exportSymbol("goog.appengine.Socket.Handler.prototype.onerror", goog.appengine.DevSocket.Handler.prototype.onerror);
6634 goog.exportSymbol("goog.appengine.Socket.Handler.prototype.onclose", goog.appengine.DevSocket.Handler.prototype.onclose);
6635 goog.exportSymbol("goog.appengine.Socket", goog.appengine.DevSocket);
6636 goog.exportSymbol("goog.appengine.Socket.ReadyState", goog.appengine.DevSocket.ReadyState);
6637 goog.exportSymbol("goog.appengine.Socket.prototype.send", goog.appengine.DevSocket.prototype.send);
6638 goog.exportSymbol("goog.appengine.Socket.prototype.close", goog.appengine.DevSocket.prototype.close);
6639  })()