App Engine Python SDK version 1.9.3
[gae.git] / python / google / appengine / tools / dev-channel-js.js
blobaad5b17d420441d1f6941c90a5fba9b933868c00
1 (function() { var goog = goog || {};
2 goog.global = this;
3 goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) {
4   var parts = name.split("."), cur = opt_objectToExportTo || goog.global;
5   parts[0] in cur || !cur.execScript || cur.execScript("var " + parts[0]);
6   for (var part;parts.length && (part = parts.shift());) {
7     parts.length || void 0 === opt_object ? cur = cur[part] ? cur[part] : cur[part] = {} : cur[part] = opt_object;
8   }
9 };
10 goog.define = function(name, defaultValue) {
11   var value = defaultValue;
12   goog.exportPath_(name, value);
14 goog.DEBUG = !0;
15 goog.LOCALE = "en";
16 goog.TRUSTED_SITE = !0;
17 goog.STRICT_MODE_COMPATIBLE = !1;
18 goog.provide = function(name) {
19   goog.exportPath_(name);
21 goog.setTestOnly = function(opt_message) {
22   if (!goog.DEBUG) {
23     throw opt_message = opt_message || "", Error("Importing test-only code into non-debug environment" + opt_message ? ": " + opt_message : ".");
24   }
26 goog.forwardDeclare = function() {
28 goog.getObjectByName = function(name, opt_obj) {
29   for (var parts = name.split("."), cur = opt_obj || goog.global, part;part = parts.shift();) {
30     if (goog.isDefAndNotNull(cur[part])) {
31       cur = cur[part];
32     } else {
33       return null;
34     }
35   }
36   return cur;
38 goog.globalize = function(obj, opt_global) {
39   var global = opt_global || goog.global, x;
40   for (x in obj) {
41     global[x] = obj[x];
42   }
44 goog.addDependency = function(relPath, provides, requires) {
45   if (goog.DEPENDENCIES_ENABLED) {
46     for (var provide, require, path = relPath.replace(/\\/g, "/"), deps = goog.dependencies_, i = 0;provide = provides[i];i++) {
47       deps.nameToPath[provide] = path, path in deps.pathToNames || (deps.pathToNames[path] = {}), deps.pathToNames[path][provide] = !0;
48     }
49     for (var j = 0;require = requires[j];j++) {
50       path in deps.requires || (deps.requires[path] = {}), deps.requires[path][require] = !0;
51     }
52   }
54 goog.useStrictRequires = !1;
55 goog.ENABLE_DEBUG_LOADER = !0;
56 goog.require = function() {
58 goog.basePath = "";
59 goog.nullFunction = function() {
61 goog.identityFunction = function(opt_returnValue) {
62   return opt_returnValue;
64 goog.abstractMethod = function() {
65   throw Error("unimplemented abstract method");
67 goog.addSingletonGetter = function(ctor) {
68   ctor.getInstance = function() {
69     if (ctor.instance_) {
70       return ctor.instance_;
71     }
72     goog.DEBUG && (goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor);
73     return ctor.instance_ = new ctor;
74   };
76 goog.instantiatedSingletons_ = [];
77 goog.DEPENDENCIES_ENABLED = !1;
78 goog.DEPENDENCIES_ENABLED && (goog.included_ = {}, goog.dependencies_ = {pathToNames:{}, nameToPath:{}, requires:{}, visited:{}, written:{}}, goog.inHtmlDocument_ = function() {
79   var doc = goog.global.document;
80   return "undefined" != typeof doc && "write" in doc;
81 }, goog.findBasePath_ = function() {
82   if (goog.global.CLOSURE_BASE_PATH) {
83     goog.basePath = goog.global.CLOSURE_BASE_PATH;
84   } else {
85     if (goog.inHtmlDocument_()) {
86       for (var doc = goog.global.document, scripts = doc.getElementsByTagName("script"), i = scripts.length - 1;0 <= i;--i) {
87         var src = scripts[i].src, qmark = src.lastIndexOf("?"), l = -1 == qmark ? src.length : qmark;
88         if ("base.js" == src.substr(l - 7, 7)) {
89           goog.basePath = src.substr(0, l - 7);
90           break;
91         }
92       }
93     }
94   }
95 }, goog.importScript_ = function(src) {
96   var importScript = goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_;
97   !goog.dependencies_.written[src] && importScript(src) && (goog.dependencies_.written[src] = !0);
98 }, goog.writeScriptTag_ = function(src) {
99   if (goog.inHtmlDocument_()) {
100     var doc = goog.global.document;
101     if ("complete" == doc.readyState) {
102       var isDeps = /\bdeps.js$/.test(src);
103       if (isDeps) {
104         return!1;
105       }
106       throw Error('Cannot write "' + src + '" after document load');
107     }
108     doc.write('<script type="text/javascript" src="' + src + '">\x3c/script>');
109     return!0;
110   }
111   return!1;
112 }, goog.writeScripts_ = function() {
113   function visitNode(path) {
114     if (!(path in deps.written)) {
115       if (!(path in deps.visited) && (deps.visited[path] = !0, path in deps.requires)) {
116         for (var requireName in deps.requires[path]) {
117           if (!goog.isProvided_(requireName)) {
118             if (requireName in deps.nameToPath) {
119               visitNode(deps.nameToPath[requireName]);
120             } else {
121               throw Error("Undefined nameToPath for " + requireName);
122             }
123           }
124         }
125       }
126       path in seenScript || (seenScript[path] = !0, scripts.push(path));
127     }
128   }
129   var scripts = [], seenScript = {}, deps = goog.dependencies_, path$$0;
130   for (path$$0 in goog.included_) {
131     deps.written[path$$0] || visitNode(path$$0);
132   }
133   for (var i = 0;i < scripts.length;i++) {
134     if (scripts[i]) {
135       goog.importScript_(goog.basePath + scripts[i]);
136     } else {
137       throw Error("Undefined script input");
138     }
139   }
140 }, goog.getPathFromDeps_ = function(rule) {
141   return rule in goog.dependencies_.nameToPath ? goog.dependencies_.nameToPath[rule] : null;
142 }, goog.findBasePath_(), goog.global.CLOSURE_NO_DEPS || goog.importScript_(goog.basePath + "deps.js"));
143 goog.typeOf = function(value) {
144   var s = typeof value;
145   if ("object" == s) {
146     if (value) {
147       if (value instanceof Array) {
148         return "array";
149       }
150       if (value instanceof Object) {
151         return s;
152       }
153       var className = Object.prototype.toString.call(value);
154       if ("[object Window]" == className) {
155         return "object";
156       }
157       if ("[object Array]" == className || "number" == typeof value.length && "undefined" != typeof value.splice && "undefined" != typeof value.propertyIsEnumerable && !value.propertyIsEnumerable("splice")) {
158         return "array";
159       }
160       if ("[object Function]" == className || "undefined" != typeof value.call && "undefined" != typeof value.propertyIsEnumerable && !value.propertyIsEnumerable("call")) {
161         return "function";
162       }
163     } else {
164       return "null";
165     }
166   } else {
167     if ("function" == s && "undefined" == typeof value.call) {
168       return "object";
169     }
170   }
171   return s;
173 goog.isDef = function(val) {
174   return void 0 !== val;
176 goog.isNull = function(val) {
177   return null === val;
179 goog.isDefAndNotNull = function(val) {
180   return null != val;
182 goog.isArray = function(val) {
183   return "array" == goog.typeOf(val);
185 goog.isArrayLike = function(val) {
186   var type = goog.typeOf(val);
187   return "array" == type || "object" == type && "number" == typeof val.length;
189 goog.isDateLike = function(val) {
190   return goog.isObject(val) && "function" == typeof val.getFullYear;
192 goog.isString = function(val) {
193   return "string" == typeof val;
195 goog.isBoolean = function(val) {
196   return "boolean" == typeof val;
198 goog.isNumber = function(val) {
199   return "number" == typeof val;
201 goog.isFunction = function(val) {
202   return "function" == goog.typeOf(val);
204 goog.isObject = function(val) {
205   var type = typeof val;
206   return "object" == type && null != val || "function" == type;
208 goog.getUid = function(obj) {
209   return obj[goog.UID_PROPERTY_] || (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_);
211 goog.hasUid = function(obj) {
212   return!!obj[goog.UID_PROPERTY_];
214 goog.removeUid = function(obj) {
215   "removeAttribute" in obj && obj.removeAttribute(goog.UID_PROPERTY_);
216   try {
217     delete obj[goog.UID_PROPERTY_];
218   } catch (ex) {
219   }
221 goog.UID_PROPERTY_ = "closure_uid_" + (1E9 * Math.random() >>> 0);
222 goog.uidCounter_ = 0;
223 goog.getHashCode = goog.getUid;
224 goog.removeHashCode = goog.removeUid;
225 goog.cloneObject = function(obj) {
226   var type = goog.typeOf(obj);
227   if ("object" == type || "array" == type) {
228     if (obj.clone) {
229       return obj.clone();
230     }
231     var clone = "array" == type ? [] : {}, key;
232     for (key in obj) {
233       clone[key] = goog.cloneObject(obj[key]);
234     }
235     return clone;
236   }
237   return obj;
239 goog.bindNative_ = function(fn, selfObj, var_args) {
240   return fn.call.apply(fn.bind, arguments);
242 goog.bindJs_ = function(fn, selfObj, var_args) {
243   if (!fn) {
244     throw Error();
245   }
246   if (2 < arguments.length) {
247     var boundArgs = Array.prototype.slice.call(arguments, 2);
248     return function() {
249       var newArgs = Array.prototype.slice.call(arguments);
250       Array.prototype.unshift.apply(newArgs, boundArgs);
251       return fn.apply(selfObj, newArgs);
252     };
253   }
254   return function() {
255     return fn.apply(selfObj, arguments);
256   };
258 goog.bind = function(fn, selfObj, var_args) {
259   Function.prototype.bind && -1 != Function.prototype.bind.toString().indexOf("native code") ? goog.bind = goog.bindNative_ : goog.bind = goog.bindJs_;
260   return goog.bind.apply(null, arguments);
262 goog.partial = function(fn, var_args) {
263   var args = Array.prototype.slice.call(arguments, 1);
264   return function() {
265     var newArgs = args.slice();
266     newArgs.push.apply(newArgs, arguments);
267     return fn.apply(this, newArgs);
268   };
270 goog.mixin = function(target, source) {
271   for (var x in source) {
272     target[x] = source[x];
273   }
275 goog.now = goog.TRUSTED_SITE && Date.now || function() {
276   return+new Date;
278 goog.globalEval = function(script) {
279   if (goog.global.execScript) {
280     goog.global.execScript(script, "JavaScript");
281   } else {
282     if (goog.global.eval) {
283       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_) {
284         goog.global.eval(script);
285       } else {
286         var doc = goog.global.document, scriptElt = doc.createElement("script");
287         scriptElt.type = "text/javascript";
288         scriptElt.defer = !1;
289         scriptElt.appendChild(doc.createTextNode(script));
290         doc.body.appendChild(scriptElt);
291         doc.body.removeChild(scriptElt);
292       }
293     } else {
294       throw Error("goog.globalEval not available");
295     }
296   }
298 goog.evalWorksForGlobals_ = null;
299 goog.getCssName = function(className, opt_modifier) {
300   var getMapping = function(cssName) {
301     return goog.cssNameMapping_[cssName] || cssName;
302   }, renameByParts = function(cssName) {
303     for (var parts = cssName.split("-"), mapped = [], i = 0;i < parts.length;i++) {
304       mapped.push(getMapping(parts[i]));
305     }
306     return mapped.join("-");
307   }, rename;
308   rename = goog.cssNameMapping_ ? "BY_WHOLE" == goog.cssNameMappingStyle_ ? getMapping : renameByParts : function(a) {
309     return a;
310   };
311   return opt_modifier ? className + "-" + rename(opt_modifier) : rename(className);
313 goog.setCssNameMapping = function(mapping, opt_style) {
314   goog.cssNameMapping_ = mapping;
315   goog.cssNameMappingStyle_ = opt_style;
317 goog.getMsg = function(str, opt_values) {
318   var values = opt_values || {}, key;
319   for (key in values) {
320     var value = ("" + values[key]).replace(/\$/g, "$$$$");
321     str = str.replace(RegExp("\\{\\$" + key + "\\}", "gi"), value);
322   }
323   return str;
325 goog.getMsgWithFallback = function(a) {
326   return a;
328 goog.exportSymbol = function(publicPath, object, opt_objectToExportTo) {
329   goog.exportPath_(publicPath, object, opt_objectToExportTo);
331 goog.exportProperty = function(object, publicName, symbol) {
332   object[publicName] = symbol;
334 goog.inherits = function(childCtor, parentCtor) {
335   function tempCtor() {
336   }
337   tempCtor.prototype = parentCtor.prototype;
338   childCtor.superClass_ = parentCtor.prototype;
339   childCtor.prototype = new tempCtor;
340   childCtor.prototype.constructor = childCtor;
341   childCtor.base = function(me, methodName, var_args) {
342     var args = Array.prototype.slice.call(arguments, 2);
343     return parentCtor.prototype[methodName].apply(me, args);
344   };
346 goog.base = function(me, opt_methodName, var_args) {
347   var caller = arguments.callee.caller;
348   if (goog.STRICT_MODE_COMPATIBLE || goog.DEBUG && !caller) {
349     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");
350   }
351   if (caller.superClass_) {
352     return caller.superClass_.constructor.apply(me, Array.prototype.slice.call(arguments, 1));
353   }
354   for (var args = Array.prototype.slice.call(arguments, 2), foundCaller = !1, ctor = me.constructor;ctor;ctor = ctor.superClass_ && ctor.superClass_.constructor) {
355     if (ctor.prototype[opt_methodName] === caller) {
356       foundCaller = !0;
357     } else {
358       if (foundCaller) {
359         return ctor.prototype[opt_methodName].apply(me, args);
360       }
361     }
362   }
363   if (me[opt_methodName] === caller) {
364     return me.constructor.prototype[opt_methodName].apply(me, args);
365   }
366   throw Error("goog.base called from a method of one name to a method of a different name");
368 goog.scope = function(fn) {
369   fn.call(goog.global);
371 goog.MODIFY_FUNCTION_PROTOTYPES = !0;
372 goog.MODIFY_FUNCTION_PROTOTYPES && (Function.prototype.bind = Function.prototype.bind || function(selfObj, var_args) {
373   if (1 < arguments.length) {
374     var args = Array.prototype.slice.call(arguments, 1);
375     args.unshift(this, selfObj);
376     return goog.bind.apply(null, args);
377   }
378   return goog.bind(this, selfObj);
379 }, Function.prototype.partial = function(var_args) {
380   var args = Array.prototype.slice.call(arguments);
381   args.unshift(this, null);
382   return goog.bind.apply(null, args);
383 }, Function.prototype.inherits = function(parentCtor) {
384   goog.inherits(this, parentCtor);
385 }, Function.prototype.mixin = function(source) {
386   goog.mixin(this.prototype, source);
388 goog.debug = {};
389 goog.debug.Error = function(opt_msg) {
390   if (Error.captureStackTrace) {
391     Error.captureStackTrace(this, goog.debug.Error);
392   } else {
393     var stack = Error().stack;
394     stack && (this.stack = stack);
395   }
396   opt_msg && (this.message = String(opt_msg));
398 goog.inherits(goog.debug.Error, Error);
399 goog.debug.Error.prototype.name = "CustomError";
400 goog.dom = {};
401 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};
402 goog.string = {};
403 goog.string.Unicode = {NBSP:"\u00a0"};
404 goog.string.startsWith = function(str, prefix) {
405   return 0 == str.lastIndexOf(prefix, 0);
407 goog.string.endsWith = function(str, suffix) {
408   var l = str.length - suffix.length;
409   return 0 <= l && str.indexOf(suffix, l) == l;
411 goog.string.caseInsensitiveStartsWith = function(str, prefix) {
412   return 0 == goog.string.caseInsensitiveCompare(prefix, str.substr(0, prefix.length));
414 goog.string.caseInsensitiveEndsWith = function(str, suffix) {
415   return 0 == goog.string.caseInsensitiveCompare(suffix, str.substr(str.length - suffix.length, suffix.length));
417 goog.string.caseInsensitiveEquals = function(str1, str2) {
418   return str1.toLowerCase() == str2.toLowerCase();
420 goog.string.subs = function(str, var_args) {
421   for (var splitParts = str.split("%s"), returnString = "", subsArguments = Array.prototype.slice.call(arguments, 1);subsArguments.length && 1 < splitParts.length;) {
422     returnString += splitParts.shift() + subsArguments.shift();
423   }
424   return returnString + splitParts.join("%s");
426 goog.string.collapseWhitespace = function(str) {
427   return str.replace(/[\s\xa0]+/g, " ").replace(/^\s+|\s+$/g, "");
429 goog.string.isEmpty = function(str) {
430   return/^[\s\xa0]*$/.test(str);
432 goog.string.isEmptySafe = function(str) {
433   return goog.string.isEmpty(goog.string.makeSafe(str));
435 goog.string.isBreakingWhitespace = function(str) {
436   return!/[^\t\n\r ]/.test(str);
438 goog.string.isAlpha = function(str) {
439   return!/[^a-zA-Z]/.test(str);
441 goog.string.isNumeric = function(str) {
442   return!/[^0-9]/.test(str);
444 goog.string.isAlphaNumeric = function(str) {
445   return!/[^a-zA-Z0-9]/.test(str);
447 goog.string.isSpace = function(ch) {
448   return " " == ch;
450 goog.string.isUnicodeChar = function(ch) {
451   return 1 == ch.length && " " <= ch && "~" >= ch || "\u0080" <= ch && "\ufffd" >= ch;
453 goog.string.stripNewlines = function(str) {
454   return str.replace(/(\r\n|\r|\n)+/g, " ");
456 goog.string.canonicalizeNewlines = function(str) {
457   return str.replace(/(\r\n|\r|\n)/g, "\n");
459 goog.string.normalizeWhitespace = function(str) {
460   return str.replace(/\xa0|\s/g, " ");
462 goog.string.normalizeSpaces = function(str) {
463   return str.replace(/\xa0|[ \t]+/g, " ");
465 goog.string.collapseBreakingSpaces = function(str) {
466   return str.replace(/[\t\r\n ]+/g, " ").replace(/^[\t\r\n ]+|[\t\r\n ]+$/g, "");
468 goog.string.trim = function(str) {
469   return str.replace(/^[\s\xa0]+|[\s\xa0]+$/g, "");
471 goog.string.trimLeft = function(str) {
472   return str.replace(/^[\s\xa0]+/, "");
474 goog.string.trimRight = function(str) {
475   return str.replace(/[\s\xa0]+$/, "");
477 goog.string.caseInsensitiveCompare = function(str1, str2) {
478   var test1 = String(str1).toLowerCase(), test2 = String(str2).toLowerCase();
479   return test1 < test2 ? -1 : test1 == test2 ? 0 : 1;
481 goog.string.numerateCompareRegExp_ = /(\.\d+)|(\d+)|(\D+)/g;
482 goog.string.numerateCompare = function(str1, str2) {
483   if (str1 == str2) {
484     return 0;
485   }
486   if (!str1) {
487     return-1;
488   }
489   if (!str2) {
490     return 1;
491   }
492   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++) {
493     var a = tokens1[i], b = tokens2[i];
494     if (a != b) {
495       var num1 = parseInt(a, 10);
496       if (!isNaN(num1)) {
497         var num2 = parseInt(b, 10);
498         if (!isNaN(num2) && num1 - num2) {
499           return num1 - num2;
500         }
501       }
502       return a < b ? -1 : 1;
503     }
504   }
505   return tokens1.length != tokens2.length ? tokens1.length - tokens2.length : str1 < str2 ? -1 : 1;
507 goog.string.urlEncode = function(str) {
508   return encodeURIComponent(String(str));
510 goog.string.urlDecode = function(str) {
511   return decodeURIComponent(str.replace(/\+/g, " "));
513 goog.string.newLineToBr = function(str, opt_xml) {
514   return str.replace(/(\r\n|\r|\n)/g, opt_xml ? "<br />" : "<br>");
516 goog.string.htmlEscape = function(str, opt_isLikelyToContainHtmlChars) {
517   if (opt_isLikelyToContainHtmlChars) {
518     return str.replace(goog.string.amperRe_, "&amp;").replace(goog.string.ltRe_, "&lt;").replace(goog.string.gtRe_, "&gt;").replace(goog.string.quotRe_, "&quot;").replace(goog.string.singleQuoteRe_, "&#39;");
519   }
520   if (!goog.string.allRe_.test(str)) {
521     return str;
522   }
523   -1 != str.indexOf("&") && (str = str.replace(goog.string.amperRe_, "&amp;"));
524   -1 != str.indexOf("<") && (str = str.replace(goog.string.ltRe_, "&lt;"));
525   -1 != str.indexOf(">") && (str = str.replace(goog.string.gtRe_, "&gt;"));
526   -1 != str.indexOf('"') && (str = str.replace(goog.string.quotRe_, "&quot;"));
527   -1 != str.indexOf("'") && (str = str.replace(goog.string.singleQuoteRe_, "&#39;"));
528   return str;
530 goog.string.amperRe_ = /&/g;
531 goog.string.ltRe_ = /</g;
532 goog.string.gtRe_ = />/g;
533 goog.string.quotRe_ = /"/g;
534 goog.string.singleQuoteRe_ = /'/g;
535 goog.string.allRe_ = /[&<>"']/;
536 goog.string.unescapeEntities = function(str) {
537   return goog.string.contains(str, "&") ? "document" in goog.global ? goog.string.unescapeEntitiesUsingDom_(str) : goog.string.unescapePureXmlEntities_(str) : str;
539 goog.string.unescapeEntitiesWithDocument = function(str, document) {
540   return goog.string.contains(str, "&") ? goog.string.unescapeEntitiesUsingDom_(str, document) : str;
542 goog.string.unescapeEntitiesUsingDom_ = function(str, opt_document) {
543   var seen = {"&amp;":"&", "&lt;":"<", "&gt;":">", "&quot;":'"'}, div;
544   div = opt_document ? opt_document.createElement("div") : document.createElement("div");
545   return str.replace(goog.string.HTML_ENTITY_PATTERN_, function(s, entity) {
546     var value = seen[s];
547     if (value) {
548       return value;
549     }
550     if ("#" == entity.charAt(0)) {
551       var n = Number("0" + entity.substr(1));
552       isNaN(n) || (value = String.fromCharCode(n));
553     }
554     value || (div.innerHTML = s + " ", value = div.firstChild.nodeValue.slice(0, -1));
555     return seen[s] = value;
556   });
558 goog.string.unescapePureXmlEntities_ = function(str) {
559   return str.replace(/&([^;]+);/g, function(s, entity) {
560     switch(entity) {
561       case "amp":
562         return "&";
563       case "lt":
564         return "<";
565       case "gt":
566         return ">";
567       case "quot":
568         return'"';
569       default:
570         if ("#" == entity.charAt(0)) {
571           var n = Number("0" + entity.substr(1));
572           if (!isNaN(n)) {
573             return String.fromCharCode(n);
574           }
575         }
576         return s;
577     }
578   });
580 goog.string.HTML_ENTITY_PATTERN_ = /&([^;\s<&]+);?/g;
581 goog.string.whitespaceEscape = function(str, opt_xml) {
582   return goog.string.newLineToBr(str.replace(/  /g, " &#160;"), opt_xml);
584 goog.string.stripQuotes = function(str, quoteChars) {
585   for (var length = quoteChars.length, i = 0;i < length;i++) {
586     var quoteChar = 1 == length ? quoteChars : quoteChars.charAt(i);
587     if (str.charAt(0) == quoteChar && str.charAt(str.length - 1) == quoteChar) {
588       return str.substring(1, str.length - 1);
589     }
590   }
591   return str;
593 goog.string.truncate = function(str, chars, opt_protectEscapedCharacters) {
594   opt_protectEscapedCharacters && (str = goog.string.unescapeEntities(str));
595   str.length > chars && (str = str.substring(0, chars - 3) + "...");
596   opt_protectEscapedCharacters && (str = goog.string.htmlEscape(str));
597   return str;
599 goog.string.truncateMiddle = function(str, chars, opt_protectEscapedCharacters, opt_trailingChars) {
600   opt_protectEscapedCharacters && (str = goog.string.unescapeEntities(str));
601   if (opt_trailingChars && str.length > chars) {
602     opt_trailingChars > chars && (opt_trailingChars = chars);
603     var endPoint = str.length - opt_trailingChars, startPoint = chars - opt_trailingChars;
604     str = str.substring(0, startPoint) + "..." + str.substring(endPoint);
605   } else {
606     if (str.length > chars) {
607       var half = Math.floor(chars / 2), endPos = str.length - half, half = half + chars % 2;
608       str = str.substring(0, half) + "..." + str.substring(endPos);
609     }
610   }
611   opt_protectEscapedCharacters && (str = goog.string.htmlEscape(str));
612   return str;
614 goog.string.specialEscapeChars_ = {"\x00":"\\0", "\b":"\\b", "\f":"\\f", "\n":"\\n", "\r":"\\r", "\t":"\\t", "\x0B":"\\x0B", '"':'\\"', "\\":"\\\\"};
615 goog.string.jsEscapeCache_ = {"'":"\\'"};
616 goog.string.quote = function(s) {
617   s = String(s);
618   if (s.quote) {
619     return s.quote();
620   }
621   for (var sb = ['"'], i = 0;i < s.length;i++) {
622     var ch = s.charAt(i), cc = ch.charCodeAt(0);
623     sb[i + 1] = goog.string.specialEscapeChars_[ch] || (31 < cc && 127 > cc ? ch : goog.string.escapeChar(ch));
624   }
625   sb.push('"');
626   return sb.join("");
628 goog.string.escapeString = function(str) {
629   for (var sb = [], i = 0;i < str.length;i++) {
630     sb[i] = goog.string.escapeChar(str.charAt(i));
631   }
632   return sb.join("");
634 goog.string.escapeChar = function(c) {
635   if (c in goog.string.jsEscapeCache_) {
636     return goog.string.jsEscapeCache_[c];
637   }
638   if (c in goog.string.specialEscapeChars_) {
639     return goog.string.jsEscapeCache_[c] = goog.string.specialEscapeChars_[c];
640   }
641   var rv = c, cc = c.charCodeAt(0);
642   if (31 < cc && 127 > cc) {
643     rv = c;
644   } else {
645     if (256 > cc) {
646       if (rv = "\\x", 16 > cc || 256 < cc) {
647         rv += "0";
648       }
649     } else {
650       rv = "\\u", 4096 > cc && (rv += "0");
651     }
652     rv += cc.toString(16).toUpperCase();
653   }
654   return goog.string.jsEscapeCache_[c] = rv;
656 goog.string.toMap = function(s) {
657   for (var rv = {}, i = 0;i < s.length;i++) {
658     rv[s.charAt(i)] = !0;
659   }
660   return rv;
662 goog.string.contains = function(str, subString) {
663   return-1 != str.indexOf(subString);
665 goog.string.caseInsensitiveContains = function(str, subString) {
666   return goog.string.contains(str.toLowerCase(), subString.toLowerCase());
668 goog.string.countOf = function(s, ss) {
669   return s && ss ? s.split(ss).length - 1 : 0;
671 goog.string.removeAt = function(s, index, stringLength) {
672   var resultStr = s;
673   0 <= index && index < s.length && 0 < stringLength && (resultStr = s.substr(0, index) + s.substr(index + stringLength, s.length - index - stringLength));
674   return resultStr;
676 goog.string.remove = function(s, ss) {
677   var re = RegExp(goog.string.regExpEscape(ss), "");
678   return s.replace(re, "");
680 goog.string.removeAll = function(s, ss) {
681   var re = RegExp(goog.string.regExpEscape(ss), "g");
682   return s.replace(re, "");
684 goog.string.regExpEscape = function(s) {
685   return String(s).replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, "\\$1").replace(/\x08/g, "\\x08");
687 goog.string.repeat = function(string, length) {
688   return Array(length + 1).join(string);
690 goog.string.padNumber = function(num, length, opt_precision) {
691   var s = goog.isDef(opt_precision) ? num.toFixed(opt_precision) : String(num), index = s.indexOf(".");
692   -1 == index && (index = s.length);
693   return goog.string.repeat("0", Math.max(0, length - index)) + s;
695 goog.string.makeSafe = function(obj) {
696   return null == obj ? "" : String(obj);
698 goog.string.buildString = function(var_args) {
699   return Array.prototype.join.call(arguments, "");
701 goog.string.getRandomString = function() {
702   var x = 2147483648;
703   return Math.floor(Math.random() * x).toString(36) + Math.abs(Math.floor(Math.random() * x) ^ goog.now()).toString(36);
705 goog.string.compareVersions = function(version1, version2) {
706   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++) {
707     var v1Sub = v1Subs[subIdx] || "", v2Sub = v2Subs[subIdx] || "", v1CompParser = RegExp("(\\d*)(\\D*)", "g"), v2CompParser = RegExp("(\\d*)(\\D*)", "g");
708     do {
709       var v1Comp = v1CompParser.exec(v1Sub) || ["", "", ""], v2Comp = v2CompParser.exec(v2Sub) || ["", "", ""];
710       if (0 == v1Comp[0].length && 0 == v2Comp[0].length) {
711         break;
712       }
713       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]);
714     } while (0 == order);
715   }
716   return order;
718 goog.string.compareElements_ = function(left, right) {
719   return left < right ? -1 : left > right ? 1 : 0;
721 goog.string.HASHCODE_MAX_ = 4294967296;
722 goog.string.hashCode = function(str) {
723   for (var result = 0, i = 0;i < str.length;++i) {
724     result = 31 * result + str.charCodeAt(i), result %= goog.string.HASHCODE_MAX_;
725   }
726   return result;
728 goog.string.uniqueStringCounter_ = 2147483648 * Math.random() | 0;
729 goog.string.createUniqueString = function() {
730   return "goog_" + goog.string.uniqueStringCounter_++;
732 goog.string.toNumber = function(str) {
733   var num = Number(str);
734   return 0 == num && goog.string.isEmpty(str) ? NaN : num;
736 goog.string.isLowerCamelCase = function(str) {
737   return/^[a-z]+([A-Z][a-z]*)*$/.test(str);
739 goog.string.isUpperCamelCase = function(str) {
740   return/^([A-Z][a-z]*)+$/.test(str);
742 goog.string.toCamelCase = function(str) {
743   return String(str).replace(/\-([a-z])/g, function(all, match) {
744     return match.toUpperCase();
745   });
747 goog.string.toSelectorCase = function(str) {
748   return String(str).replace(/([A-Z])/g, "-$1").toLowerCase();
750 goog.string.toTitleCase = function(str, opt_delimiters) {
751   var delimiters = goog.isString(opt_delimiters) ? goog.string.regExpEscape(opt_delimiters) : "\\s", delimiters = delimiters ? "|[" + delimiters + "]+" : "", regexp = RegExp("(^" + delimiters + ")([a-z])", "g");
752   return str.replace(regexp, function(all, p1, p2) {
753     return p1 + p2.toUpperCase();
754   });
756 goog.string.parseInt = function(value) {
757   isFinite(value) && (value = String(value));
758   return goog.isString(value) ? /^\s*-?0x/i.test(value) ? parseInt(value, 16) : parseInt(value, 10) : NaN;
760 goog.string.splitLimit = function(str, separator, limit) {
761   for (var parts = str.split(separator), returnVal = [];0 < limit && parts.length;) {
762     returnVal.push(parts.shift()), limit--;
763   }
764   parts.length && returnVal.push(parts.join(separator));
765   return returnVal;
767 goog.asserts = {};
768 goog.asserts.ENABLE_ASSERTS = goog.DEBUG;
769 goog.asserts.AssertionError = function(messagePattern, messageArgs) {
770   messageArgs.unshift(messagePattern);
771   goog.debug.Error.call(this, goog.string.subs.apply(null, messageArgs));
772   messageArgs.shift();
774 goog.inherits(goog.asserts.AssertionError, goog.debug.Error);
775 goog.asserts.AssertionError.prototype.name = "AssertionError";
776 goog.asserts.doAssertFailure_ = function(defaultMessage, defaultArgs, givenMessage, givenArgs) {
777   var message = "Assertion failed";
778   if (givenMessage) {
779     var message = message + (": " + givenMessage), args = givenArgs
780   } else {
781     defaultMessage && (message += ": " + defaultMessage, args = defaultArgs);
782   }
783   throw new goog.asserts.AssertionError("" + message, args || []);
785 goog.asserts.assert = function(condition, opt_message, var_args) {
786   goog.asserts.ENABLE_ASSERTS && !condition && goog.asserts.doAssertFailure_("", null, opt_message, Array.prototype.slice.call(arguments, 2));
787   return condition;
789 goog.asserts.fail = function(opt_message, var_args) {
790   if (goog.asserts.ENABLE_ASSERTS) {
791     throw new goog.asserts.AssertionError("Failure" + (opt_message ? ": " + opt_message : ""), Array.prototype.slice.call(arguments, 1));
792   }
794 goog.asserts.assertNumber = function(value, opt_message, var_args) {
795   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));
796   return value;
798 goog.asserts.assertString = function(value, opt_message, var_args) {
799   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));
800   return value;
802 goog.asserts.assertFunction = function(value, opt_message, var_args) {
803   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));
804   return value;
806 goog.asserts.assertObject = function(value, opt_message, var_args) {
807   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));
808   return value;
810 goog.asserts.assertArray = function(value, opt_message, var_args) {
811   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));
812   return value;
814 goog.asserts.assertBoolean = function(value, opt_message, var_args) {
815   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));
816   return value;
818 goog.asserts.assertElement = function(value, opt_message, var_args) {
819   !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));
820   return value;
822 goog.asserts.assertInstanceof = function(value, type, opt_message, var_args) {
823   !goog.asserts.ENABLE_ASSERTS || value instanceof type || goog.asserts.doAssertFailure_("instanceof check failed.", null, opt_message, Array.prototype.slice.call(arguments, 3));
824   return value;
826 goog.asserts.assertObjectPrototypeIsIntact = function() {
827   for (var key in Object.prototype) {
828     goog.asserts.fail(key + " should not be enumerable in Object.prototype.");
829   }
831 goog.array = {};
832 goog.NATIVE_ARRAY_PROTOTYPES = goog.TRUSTED_SITE;
833 goog.array.ASSUME_NATIVE_FUNCTIONS = !1;
834 goog.array.peek = function(array) {
835   return array[array.length - 1];
837 goog.array.ARRAY_PROTOTYPE_ = Array.prototype;
838 goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.indexOf) ? function(arr, obj, opt_fromIndex) {
839   goog.asserts.assert(null != arr.length);
840   return goog.array.ARRAY_PROTOTYPE_.indexOf.call(arr, obj, opt_fromIndex);
841 } : function(arr, obj, opt_fromIndex) {
842   var fromIndex = null == opt_fromIndex ? 0 : 0 > opt_fromIndex ? Math.max(0, arr.length + opt_fromIndex) : opt_fromIndex;
843   if (goog.isString(arr)) {
844     return goog.isString(obj) && 1 == obj.length ? arr.indexOf(obj, fromIndex) : -1;
845   }
846   for (var i = fromIndex;i < arr.length;i++) {
847     if (i in arr && arr[i] === obj) {
848       return i;
849     }
850   }
851   return-1;
853 goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.lastIndexOf) ? function(arr, obj, opt_fromIndex) {
854   goog.asserts.assert(null != arr.length);
855   var fromIndex = null == opt_fromIndex ? arr.length - 1 : opt_fromIndex;
856   return goog.array.ARRAY_PROTOTYPE_.lastIndexOf.call(arr, obj, fromIndex);
857 } : function(arr, obj, opt_fromIndex) {
858   var fromIndex = null == opt_fromIndex ? arr.length - 1 : opt_fromIndex;
859   0 > fromIndex && (fromIndex = Math.max(0, arr.length + fromIndex));
860   if (goog.isString(arr)) {
861     return goog.isString(obj) && 1 == obj.length ? arr.lastIndexOf(obj, fromIndex) : -1;
862   }
863   for (var i = fromIndex;0 <= i;i--) {
864     if (i in arr && arr[i] === obj) {
865       return i;
866     }
867   }
868   return-1;
870 goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.forEach) ? function(arr, f, opt_obj) {
871   goog.asserts.assert(null != arr.length);
872   goog.array.ARRAY_PROTOTYPE_.forEach.call(arr, f, opt_obj);
873 } : function(arr, f, opt_obj) {
874   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
875     i in arr2 && f.call(opt_obj, arr2[i], i, arr);
876   }
878 goog.array.forEachRight = function(arr, f, opt_obj) {
879   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = l - 1;0 <= i;--i) {
880     i in arr2 && f.call(opt_obj, arr2[i], i, arr);
881   }
883 goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.filter) ? function(arr, f, opt_obj) {
884   goog.asserts.assert(null != arr.length);
885   return goog.array.ARRAY_PROTOTYPE_.filter.call(arr, f, opt_obj);
886 } : function(arr, f, opt_obj) {
887   for (var l = arr.length, res = [], resLength = 0, arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
888     if (i in arr2) {
889       var val = arr2[i];
890       f.call(opt_obj, val, i, arr) && (res[resLength++] = val);
891     }
892   }
893   return res;
895 goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.map) ? function(arr, f, opt_obj) {
896   goog.asserts.assert(null != arr.length);
897   return goog.array.ARRAY_PROTOTYPE_.map.call(arr, f, opt_obj);
898 } : function(arr, f, opt_obj) {
899   for (var l = arr.length, res = Array(l), arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
900     i in arr2 && (res[i] = f.call(opt_obj, arr2[i], i, arr));
901   }
902   return res;
904 goog.array.reduce = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.reduce) ? function(arr, f, val, opt_obj) {
905   goog.asserts.assert(null != arr.length);
906   opt_obj && (f = goog.bind(f, opt_obj));
907   return goog.array.ARRAY_PROTOTYPE_.reduce.call(arr, f, val);
908 } : function(arr, f, val$$0, opt_obj) {
909   var rval = val$$0;
910   goog.array.forEach(arr, function(val, index) {
911     rval = f.call(opt_obj, rval, val, index, arr);
912   });
913   return rval;
915 goog.array.reduceRight = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.reduceRight) ? function(arr, f, val, opt_obj) {
916   goog.asserts.assert(null != arr.length);
917   opt_obj && (f = goog.bind(f, opt_obj));
918   return goog.array.ARRAY_PROTOTYPE_.reduceRight.call(arr, f, val);
919 } : function(arr, f, val$$0, opt_obj) {
920   var rval = val$$0;
921   goog.array.forEachRight(arr, function(val, index) {
922     rval = f.call(opt_obj, rval, val, index, arr);
923   });
924   return rval;
926 goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.some) ? function(arr, f, opt_obj) {
927   goog.asserts.assert(null != arr.length);
928   return goog.array.ARRAY_PROTOTYPE_.some.call(arr, f, opt_obj);
929 } : function(arr, f, opt_obj) {
930   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
931     if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) {
932       return!0;
933     }
934   }
935   return!1;
937 goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.every) ? function(arr, f, opt_obj) {
938   goog.asserts.assert(null != arr.length);
939   return goog.array.ARRAY_PROTOTYPE_.every.call(arr, f, opt_obj);
940 } : function(arr, f, opt_obj) {
941   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
942     if (i in arr2 && !f.call(opt_obj, arr2[i], i, arr)) {
943       return!1;
944     }
945   }
946   return!0;
948 goog.array.count = function(arr$$0, f, opt_obj) {
949   var count = 0;
950   goog.array.forEach(arr$$0, function(element, index, arr) {
951     f.call(opt_obj, element, index, arr) && ++count;
952   }, opt_obj);
953   return count;
955 goog.array.find = function(arr, f, opt_obj) {
956   var i = goog.array.findIndex(arr, f, opt_obj);
957   return 0 > i ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];
959 goog.array.findIndex = function(arr, f, opt_obj) {
960   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = 0;i < l;i++) {
961     if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) {
962       return i;
963     }
964   }
965   return-1;
967 goog.array.findRight = function(arr, f, opt_obj) {
968   var i = goog.array.findIndexRight(arr, f, opt_obj);
969   return 0 > i ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];
971 goog.array.findIndexRight = function(arr, f, opt_obj) {
972   for (var l = arr.length, arr2 = goog.isString(arr) ? arr.split("") : arr, i = l - 1;0 <= i;i--) {
973     if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) {
974       return i;
975     }
976   }
977   return-1;
979 goog.array.contains = function(arr, obj) {
980   return 0 <= goog.array.indexOf(arr, obj);
982 goog.array.isEmpty = function(arr) {
983   return 0 == arr.length;
985 goog.array.clear = function(arr) {
986   if (!goog.isArray(arr)) {
987     for (var i = arr.length - 1;0 <= i;i--) {
988       delete arr[i];
989     }
990   }
991   arr.length = 0;
993 goog.array.insert = function(arr, obj) {
994   goog.array.contains(arr, obj) || arr.push(obj);
996 goog.array.insertAt = function(arr, obj, opt_i) {
997   goog.array.splice(arr, opt_i, 0, obj);
999 goog.array.insertArrayAt = function(arr, elementsToAdd, opt_i) {
1000   goog.partial(goog.array.splice, arr, opt_i, 0).apply(null, elementsToAdd);
1002 goog.array.insertBefore = function(arr, obj, opt_obj2) {
1003   var i;
1004   2 == arguments.length || 0 > (i = goog.array.indexOf(arr, opt_obj2)) ? arr.push(obj) : goog.array.insertAt(arr, obj, i);
1006 goog.array.remove = function(arr, obj) {
1007   var i = goog.array.indexOf(arr, obj), rv;
1008   (rv = 0 <= i) && goog.array.removeAt(arr, i);
1009   return rv;
1011 goog.array.removeAt = function(arr, i) {
1012   goog.asserts.assert(null != arr.length);
1013   return 1 == goog.array.ARRAY_PROTOTYPE_.splice.call(arr, i, 1).length;
1015 goog.array.removeIf = function(arr, f, opt_obj) {
1016   var i = goog.array.findIndex(arr, f, opt_obj);
1017   return 0 <= i ? (goog.array.removeAt(arr, i), !0) : !1;
1019 goog.array.concat = function(var_args) {
1020   return goog.array.ARRAY_PROTOTYPE_.concat.apply(goog.array.ARRAY_PROTOTYPE_, arguments);
1022 goog.array.join = function(var_args) {
1023   return goog.array.ARRAY_PROTOTYPE_.concat.apply(goog.array.ARRAY_PROTOTYPE_, arguments);
1025 goog.array.toArray = function(object) {
1026   var length = object.length;
1027   if (0 < length) {
1028     for (var rv = Array(length), i = 0;i < length;i++) {
1029       rv[i] = object[i];
1030     }
1031     return rv;
1032   }
1033   return[];
1035 goog.array.clone = goog.array.toArray;
1036 goog.array.extend = function(arr1, var_args) {
1037   for (var i = 1;i < arguments.length;i++) {
1038     var arr2 = arguments[i], isArrayLike;
1039     if (goog.isArray(arr2) || (isArrayLike = goog.isArrayLike(arr2)) && Object.prototype.hasOwnProperty.call(arr2, "callee")) {
1040       arr1.push.apply(arr1, arr2);
1041     } else {
1042       if (isArrayLike) {
1043         for (var len1 = arr1.length, len2 = arr2.length, j = 0;j < len2;j++) {
1044           arr1[len1 + j] = arr2[j];
1045         }
1046       } else {
1047         arr1.push(arr2);
1048       }
1049     }
1050   }
1052 goog.array.splice = function(arr, index, howMany, var_args) {
1053   goog.asserts.assert(null != arr.length);
1054   return goog.array.ARRAY_PROTOTYPE_.splice.apply(arr, goog.array.slice(arguments, 1));
1056 goog.array.slice = function(arr, start, opt_end) {
1057   goog.asserts.assert(null != arr.length);
1058   return 2 >= arguments.length ? goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start) : goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start, opt_end);
1060 goog.array.removeDuplicates = function(arr, opt_rv, opt_hashFn) {
1061   for (var returnArray = opt_rv || arr, defaultHashFn = function() {
1062     return goog.isObject(current) ? "o" + goog.getUid(current) : (typeof current).charAt(0) + current;
1063   }, hashFn = opt_hashFn || defaultHashFn, seen = {}, cursorInsert = 0, cursorRead = 0;cursorRead < arr.length;) {
1064     var current = arr[cursorRead++], key = hashFn(current);
1065     Object.prototype.hasOwnProperty.call(seen, key) || (seen[key] = !0, returnArray[cursorInsert++] = current);
1066   }
1067   returnArray.length = cursorInsert;
1069 goog.array.binarySearch = function(arr, target, opt_compareFn) {
1070   return goog.array.binarySearch_(arr, opt_compareFn || goog.array.defaultCompare, !1, target);
1072 goog.array.binarySelect = function(arr, evaluator, opt_obj) {
1073   return goog.array.binarySearch_(arr, evaluator, !0, void 0, opt_obj);
1075 goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target, opt_selfObj) {
1076   for (var left = 0, right = arr.length, found;left < right;) {
1077     var middle = left + right >> 1, compareResult;
1078     compareResult = isEvaluator ? compareFn.call(opt_selfObj, arr[middle], middle, arr) : compareFn(opt_target, arr[middle]);
1079     0 < compareResult ? left = middle + 1 : (right = middle, found = !compareResult);
1080   }
1081   return found ? left : ~left;
1083 goog.array.sort = function(arr, opt_compareFn) {
1084   arr.sort(opt_compareFn || goog.array.defaultCompare);
1086 goog.array.stableSort = function(arr, opt_compareFn) {
1087   function stableCompareFn(obj1, obj2) {
1088     return valueCompareFn(obj1.value, obj2.value) || obj1.index - obj2.index;
1089   }
1090   for (var i = 0;i < arr.length;i++) {
1091     arr[i] = {index:i, value:arr[i]};
1092   }
1093   var valueCompareFn = opt_compareFn || goog.array.defaultCompare;
1094   goog.array.sort(arr, stableCompareFn);
1095   for (i = 0;i < arr.length;i++) {
1096     arr[i] = arr[i].value;
1097   }
1099 goog.array.sortObjectsByKey = function(arr, key, opt_compareFn) {
1100   var compare = opt_compareFn || goog.array.defaultCompare;
1101   goog.array.sort(arr, function(a, b) {
1102     return compare(a[key], b[key]);
1103   });
1105 goog.array.isSorted = function(arr, opt_compareFn, opt_strict) {
1106   for (var compare = opt_compareFn || goog.array.defaultCompare, i = 1;i < arr.length;i++) {
1107     var compareResult = compare(arr[i - 1], arr[i]);
1108     if (0 < compareResult || 0 == compareResult && opt_strict) {
1109       return!1;
1110     }
1111   }
1112   return!0;
1114 goog.array.equals = function(arr1, arr2, opt_equalsFn) {
1115   if (!goog.isArrayLike(arr1) || !goog.isArrayLike(arr2) || arr1.length != arr2.length) {
1116     return!1;
1117   }
1118   for (var l = arr1.length, equalsFn = opt_equalsFn || goog.array.defaultCompareEquality, i = 0;i < l;i++) {
1119     if (!equalsFn(arr1[i], arr2[i])) {
1120       return!1;
1121     }
1122   }
1123   return!0;
1125 goog.array.compare3 = function(arr1, arr2, opt_compareFn) {
1126   for (var compare = opt_compareFn || goog.array.defaultCompare, l = Math.min(arr1.length, arr2.length), i = 0;i < l;i++) {
1127     var result = compare(arr1[i], arr2[i]);
1128     if (0 != result) {
1129       return result;
1130     }
1131   }
1132   return goog.array.defaultCompare(arr1.length, arr2.length);
1134 goog.array.defaultCompare = function(a, b) {
1135   return a > b ? 1 : a < b ? -1 : 0;
1137 goog.array.defaultCompareEquality = function(a, b) {
1138   return a === b;
1140 goog.array.binaryInsert = function(array, value, opt_compareFn) {
1141   var index = goog.array.binarySearch(array, value, opt_compareFn);
1142   return 0 > index ? (goog.array.insertAt(array, value, -(index + 1)), !0) : !1;
1144 goog.array.binaryRemove = function(array, value, opt_compareFn) {
1145   var index = goog.array.binarySearch(array, value, opt_compareFn);
1146   return 0 <= index ? goog.array.removeAt(array, index) : !1;
1148 goog.array.bucket = function(array, sorter, opt_obj) {
1149   for (var buckets = {}, i = 0;i < array.length;i++) {
1150     var value = array[i], key = sorter.call(opt_obj, value, i, array);
1151     if (goog.isDef(key)) {
1152       var bucket = buckets[key] || (buckets[key] = []);
1153       bucket.push(value);
1154     }
1155   }
1156   return buckets;
1158 goog.array.toObject = function(arr, keyFunc, opt_obj) {
1159   var ret = {};
1160   goog.array.forEach(arr, function(element, index) {
1161     ret[keyFunc.call(opt_obj, element, index, arr)] = element;
1162   });
1163   return ret;
1165 goog.array.range = function(startOrEnd, opt_end, opt_step) {
1166   var array = [], start = 0, end = startOrEnd, step = opt_step || 1;
1167   void 0 !== opt_end && (start = startOrEnd, end = opt_end);
1168   if (0 > step * (end - start)) {
1169     return[];
1170   }
1171   if (0 < step) {
1172     for (var i = start;i < end;i += step) {
1173       array.push(i);
1174     }
1175   } else {
1176     for (i = start;i > end;i += step) {
1177       array.push(i);
1178     }
1179   }
1180   return array;
1182 goog.array.repeat = function(value, n) {
1183   for (var array = [], i = 0;i < n;i++) {
1184     array[i] = value;
1185   }
1186   return array;
1188 goog.array.flatten = function(var_args) {
1189   for (var result = [], i = 0;i < arguments.length;i++) {
1190     var element = arguments[i];
1191     goog.isArray(element) ? result.push.apply(result, goog.array.flatten.apply(null, element)) : result.push(element);
1192   }
1193   return result;
1195 goog.array.rotate = function(array, n) {
1196   goog.asserts.assert(null != array.length);
1197   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)));
1198   return array;
1200 goog.array.moveItem = function(arr, fromIndex, toIndex) {
1201   goog.asserts.assert(0 <= fromIndex && fromIndex < arr.length);
1202   goog.asserts.assert(0 <= toIndex && toIndex < arr.length);
1203   var removedItems = goog.array.ARRAY_PROTOTYPE_.splice.call(arr, fromIndex, 1);
1204   goog.array.ARRAY_PROTOTYPE_.splice.call(arr, toIndex, 0, removedItems[0]);
1206 goog.array.zip = function(var_args) {
1207   if (!arguments.length) {
1208     return[];
1209   }
1210   for (var result = [], i = 0;;i++) {
1211     for (var value = [], j = 0;j < arguments.length;j++) {
1212       var arr = arguments[j];
1213       if (i >= arr.length) {
1214         return result;
1215       }
1216       value.push(arr[i]);
1217     }
1218     result.push(value);
1219   }
1221 goog.array.shuffle = function(arr, opt_randFn) {
1222   for (var randFn = opt_randFn || Math.random, i = arr.length - 1;0 < i;i--) {
1223     var j = Math.floor(randFn() * (i + 1)), tmp = arr[i];
1224     arr[i] = arr[j];
1225     arr[j] = tmp;
1226   }
1228 goog.functions = {};
1229 goog.functions.constant = function(retValue) {
1230   return function() {
1231     return retValue;
1232   };
1234 goog.functions.FALSE = goog.functions.constant(!1);
1235 goog.functions.TRUE = goog.functions.constant(!0);
1236 goog.functions.NULL = goog.functions.constant(null);
1237 goog.functions.identity = function(opt_returnValue) {
1238   return opt_returnValue;
1240 goog.functions.error = function(message) {
1241   return function() {
1242     throw Error(message);
1243   };
1245 goog.functions.fail = function(err) {
1246   return function() {
1247     throw err;
1248   };
1250 goog.functions.lock = function(f, opt_numArgs) {
1251   opt_numArgs = opt_numArgs || 0;
1252   return function() {
1253     return f.apply(this, Array.prototype.slice.call(arguments, 0, opt_numArgs));
1254   };
1256 goog.functions.nth = function(n) {
1257   return function() {
1258     return arguments[n];
1259   };
1261 goog.functions.withReturnValue = function(f, retValue) {
1262   return goog.functions.sequence(f, goog.functions.constant(retValue));
1264 goog.functions.compose = function(fn, var_args) {
1265   var functions = arguments, length = functions.length;
1266   return function() {
1267     var result;
1268     length && (result = functions[length - 1].apply(this, arguments));
1269     for (var i = length - 2;0 <= i;i--) {
1270       result = functions[i].call(this, result);
1271     }
1272     return result;
1273   };
1275 goog.functions.sequence = function(var_args) {
1276   var functions = arguments, length = functions.length;
1277   return function() {
1278     for (var result, i = 0;i < length;i++) {
1279       result = functions[i].apply(this, arguments);
1280     }
1281     return result;
1282   };
1284 goog.functions.and = function(var_args) {
1285   var functions = arguments, length = functions.length;
1286   return function() {
1287     for (var i = 0;i < length;i++) {
1288       if (!functions[i].apply(this, arguments)) {
1289         return!1;
1290       }
1291     }
1292     return!0;
1293   };
1295 goog.functions.or = function(var_args) {
1296   var functions = arguments, length = functions.length;
1297   return function() {
1298     for (var i = 0;i < length;i++) {
1299       if (functions[i].apply(this, arguments)) {
1300         return!0;
1301       }
1302     }
1303     return!1;
1304   };
1306 goog.functions.not = function(f) {
1307   return function() {
1308     return!f.apply(this, arguments);
1309   };
1311 goog.functions.create = function(constructor, var_args) {
1312   var temp = function() {
1313   };
1314   temp.prototype = constructor.prototype;
1315   var obj = new temp;
1316   constructor.apply(obj, Array.prototype.slice.call(arguments, 1));
1317   return obj;
1319 goog.functions.CACHE_RETURN_VALUE = !0;
1320 goog.functions.cacheReturnValue = function(fn) {
1321   var called = !1, value;
1322   return function() {
1323     if (!goog.functions.CACHE_RETURN_VALUE) {
1324       return fn();
1325     }
1326     called || (value = fn(), called = !0);
1327     return value;
1328   };
1330 goog.math = {};
1331 goog.math.randomInt = function(a) {
1332   return Math.floor(Math.random() * a);
1334 goog.math.uniformRandom = function(a, b) {
1335   return a + Math.random() * (b - a);
1337 goog.math.clamp = function(value, min, max) {
1338   return Math.min(Math.max(value, min), max);
1340 goog.math.modulo = function(a, b) {
1341   var r = a % b;
1342   return 0 > r * b ? r + b : r;
1344 goog.math.lerp = function(a, b, x) {
1345   return a + x * (b - a);
1347 goog.math.nearlyEquals = function(a, b, opt_tolerance) {
1348   return Math.abs(a - b) <= (opt_tolerance || 1E-6);
1350 goog.math.standardAngle = function(angle) {
1351   return goog.math.modulo(angle, 360);
1353 goog.math.standardAngleInRadians = function(angle) {
1354   return goog.math.modulo(angle, 2 * Math.PI);
1356 goog.math.toRadians = function(angleDegrees) {
1357   return angleDegrees * Math.PI / 180;
1359 goog.math.toDegrees = function(angleRadians) {
1360   return 180 * angleRadians / Math.PI;
1362 goog.math.angleDx = function(degrees, radius) {
1363   return radius * Math.cos(goog.math.toRadians(degrees));
1365 goog.math.angleDy = function(degrees, radius) {
1366   return radius * Math.sin(goog.math.toRadians(degrees));
1368 goog.math.angle = function(x1, y1, x2, y2) {
1369   return goog.math.standardAngle(goog.math.toDegrees(Math.atan2(y2 - y1, x2 - x1)));
1371 goog.math.angleDifference = function(startAngle, endAngle) {
1372   var d = goog.math.standardAngle(endAngle) - goog.math.standardAngle(startAngle);
1373   180 < d ? d -= 360 : -180 >= d && (d = 360 + d);
1374   return d;
1376 goog.math.sign = function(x) {
1377   return 0 == x ? 0 : 0 > x ? -1 : 1;
1379 goog.math.longestCommonSubsequence = function(array1, array2, opt_compareFn, opt_collectorFn) {
1380   for (var compare = opt_compareFn || function(a, b) {
1381     return a == b;
1382   }, collect = opt_collectorFn || function(i1) {
1383     return array1[i1];
1384   }, length1 = array1.length, length2 = array2.length, arr = [], i = 0;i < length1 + 1;i++) {
1385     arr[i] = [], arr[i][0] = 0;
1386   }
1387   for (var j = 0;j < length2 + 1;j++) {
1388     arr[0][j] = 0;
1389   }
1390   for (i = 1;i <= length1;i++) {
1391     for (j = 1;j <= length2;j++) {
1392       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]);
1393     }
1394   }
1395   for (var result = [], i = length1, j = length2;0 < i && 0 < j;) {
1396     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--;
1397   }
1398   return result;
1400 goog.math.sum = function(var_args) {
1401   return goog.array.reduce(arguments, function(sum, value) {
1402     return sum + value;
1403   }, 0);
1405 goog.math.average = function(var_args) {
1406   return goog.math.sum.apply(null, arguments) / arguments.length;
1408 goog.math.sampleVariance = function(var_args) {
1409   var sampleSize = arguments.length;
1410   if (2 > sampleSize) {
1411     return 0;
1412   }
1413   var mean = goog.math.average.apply(null, arguments), variance = goog.math.sum.apply(null, goog.array.map(arguments, function(val) {
1414     return Math.pow(val - mean, 2);
1415   })) / (sampleSize - 1);
1416   return variance;
1418 goog.math.standardDeviation = function(var_args) {
1419   return Math.sqrt(goog.math.sampleVariance.apply(null, arguments));
1421 goog.math.isInt = function(num) {
1422   return isFinite(num) && 0 == num % 1;
1424 goog.math.isFiniteNumber = function(num) {
1425   return isFinite(num) && !isNaN(num);
1427 goog.math.log10Floor = function(num) {
1428   if (0 < num) {
1429     var x = Math.round(Math.log(num) * Math.LOG10E);
1430     return x - (Math.pow(10, x) > num);
1431   }
1432   return 0 == num ? -Infinity : NaN;
1434 goog.math.safeFloor = function(num, opt_epsilon) {
1435   goog.asserts.assert(!goog.isDef(opt_epsilon) || 0 < opt_epsilon);
1436   return Math.floor(num + (opt_epsilon || 2E-15));
1438 goog.math.safeCeil = function(num, opt_epsilon) {
1439   goog.asserts.assert(!goog.isDef(opt_epsilon) || 0 < opt_epsilon);
1440   return Math.ceil(num - (opt_epsilon || 2E-15));
1442 goog.math.Coordinate = function(opt_x, opt_y) {
1443   this.x = goog.isDef(opt_x) ? opt_x : 0;
1444   this.y = goog.isDef(opt_y) ? opt_y : 0;
1446 goog.math.Coordinate.prototype.clone = function() {
1447   return new goog.math.Coordinate(this.x, this.y);
1449 goog.DEBUG && (goog.math.Coordinate.prototype.toString = function() {
1450   return "(" + this.x + ", " + this.y + ")";
1452 goog.math.Coordinate.equals = function(a, b) {
1453   return a == b ? !0 : a && b ? a.x == b.x && a.y == b.y : !1;
1455 goog.math.Coordinate.distance = function(a, b) {
1456   var dx = a.x - b.x, dy = a.y - b.y;
1457   return Math.sqrt(dx * dx + dy * dy);
1459 goog.math.Coordinate.magnitude = function(a) {
1460   return Math.sqrt(a.x * a.x + a.y * a.y);
1462 goog.math.Coordinate.azimuth = function(a) {
1463   return goog.math.angle(0, 0, a.x, a.y);
1465 goog.math.Coordinate.squaredDistance = function(a, b) {
1466   var dx = a.x - b.x, dy = a.y - b.y;
1467   return dx * dx + dy * dy;
1469 goog.math.Coordinate.difference = function(a, b) {
1470   return new goog.math.Coordinate(a.x - b.x, a.y - b.y);
1472 goog.math.Coordinate.sum = function(a, b) {
1473   return new goog.math.Coordinate(a.x + b.x, a.y + b.y);
1475 goog.math.Coordinate.prototype.ceil = function() {
1476   this.x = Math.ceil(this.x);
1477   this.y = Math.ceil(this.y);
1478   return this;
1480 goog.math.Coordinate.prototype.floor = function() {
1481   this.x = Math.floor(this.x);
1482   this.y = Math.floor(this.y);
1483   return this;
1485 goog.math.Coordinate.prototype.round = function() {
1486   this.x = Math.round(this.x);
1487   this.y = Math.round(this.y);
1488   return this;
1490 goog.math.Coordinate.prototype.translate = function(tx, opt_ty) {
1491   tx instanceof goog.math.Coordinate ? (this.x += tx.x, this.y += tx.y) : (this.x += tx, goog.isNumber(opt_ty) && (this.y += opt_ty));
1492   return this;
1494 goog.math.Coordinate.prototype.scale = function(sx, opt_sy) {
1495   var sy = goog.isNumber(opt_sy) ? opt_sy : sx;
1496   this.x *= sx;
1497   this.y *= sy;
1498   return this;
1500 goog.math.Size = function(width, height) {
1501   this.width = width;
1502   this.height = height;
1504 goog.math.Size.equals = function(a, b) {
1505   return a == b ? !0 : a && b ? a.width == b.width && a.height == b.height : !1;
1507 goog.math.Size.prototype.clone = function() {
1508   return new goog.math.Size(this.width, this.height);
1510 goog.DEBUG && (goog.math.Size.prototype.toString = function() {
1511   return "(" + this.width + " x " + this.height + ")";
1513 goog.math.Size.prototype.area = function() {
1514   return this.width * this.height;
1516 goog.math.Size.prototype.isEmpty = function() {
1517   return!this.area();
1519 goog.math.Size.prototype.ceil = function() {
1520   this.width = Math.ceil(this.width);
1521   this.height = Math.ceil(this.height);
1522   return this;
1524 goog.math.Size.prototype.floor = function() {
1525   this.width = Math.floor(this.width);
1526   this.height = Math.floor(this.height);
1527   return this;
1529 goog.math.Size.prototype.round = function() {
1530   this.width = Math.round(this.width);
1531   this.height = Math.round(this.height);
1532   return this;
1534 goog.math.Size.prototype.scale = function(sx, opt_sy) {
1535   var sy = goog.isNumber(opt_sy) ? opt_sy : sx;
1536   this.width *= sx;
1537   this.height *= sy;
1538   return this;
1540 goog.object = {};
1541 goog.object.forEach = function(obj, f, opt_obj) {
1542   for (var key in obj) {
1543     f.call(opt_obj, obj[key], key, obj);
1544   }
1546 goog.object.filter = function(obj, f, opt_obj) {
1547   var res = {}, key;
1548   for (key in obj) {
1549     f.call(opt_obj, obj[key], key, obj) && (res[key] = obj[key]);
1550   }
1551   return res;
1553 goog.object.map = function(obj, f, opt_obj) {
1554   var res = {}, key;
1555   for (key in obj) {
1556     res[key] = f.call(opt_obj, obj[key], key, obj);
1557   }
1558   return res;
1560 goog.object.some = function(obj, f, opt_obj) {
1561   for (var key in obj) {
1562     if (f.call(opt_obj, obj[key], key, obj)) {
1563       return!0;
1564     }
1565   }
1566   return!1;
1568 goog.object.every = function(obj, f, opt_obj) {
1569   for (var key in obj) {
1570     if (!f.call(opt_obj, obj[key], key, obj)) {
1571       return!1;
1572     }
1573   }
1574   return!0;
1576 goog.object.getCount = function(obj) {
1577   var rv = 0, key;
1578   for (key in obj) {
1579     rv++;
1580   }
1581   return rv;
1583 goog.object.getAnyKey = function(obj) {
1584   for (var key in obj) {
1585     return key;
1586   }
1588 goog.object.getAnyValue = function(obj) {
1589   for (var key in obj) {
1590     return obj[key];
1591   }
1593 goog.object.contains = function(obj, val) {
1594   return goog.object.containsValue(obj, val);
1596 goog.object.getValues = function(obj) {
1597   var res = [], i = 0, key;
1598   for (key in obj) {
1599     res[i++] = obj[key];
1600   }
1601   return res;
1603 goog.object.getKeys = function(obj) {
1604   var res = [], i = 0, key;
1605   for (key in obj) {
1606     res[i++] = key;
1607   }
1608   return res;
1610 goog.object.getValueByKeys = function(obj, var_args) {
1611   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++) {
1612   }
1613   return obj;
1615 goog.object.containsKey = function(obj, key) {
1616   return key in obj;
1618 goog.object.containsValue = function(obj, val) {
1619   for (var key in obj) {
1620     if (obj[key] == val) {
1621       return!0;
1622     }
1623   }
1624   return!1;
1626 goog.object.findKey = function(obj, f, opt_this) {
1627   for (var key in obj) {
1628     if (f.call(opt_this, obj[key], key, obj)) {
1629       return key;
1630     }
1631   }
1633 goog.object.findValue = function(obj, f, opt_this) {
1634   var key = goog.object.findKey(obj, f, opt_this);
1635   return key && obj[key];
1637 goog.object.isEmpty = function(obj) {
1638   for (var key in obj) {
1639     return!1;
1640   }
1641   return!0;
1643 goog.object.clear = function(obj) {
1644   for (var i in obj) {
1645     delete obj[i];
1646   }
1648 goog.object.remove = function(obj, key) {
1649   var rv;
1650   (rv = key in obj) && delete obj[key];
1651   return rv;
1653 goog.object.add = function(obj, key, val) {
1654   if (key in obj) {
1655     throw Error('The object already contains the key "' + key + '"');
1656   }
1657   goog.object.set(obj, key, val);
1659 goog.object.get = function(obj, key, opt_val) {
1660   return key in obj ? obj[key] : opt_val;
1662 goog.object.set = function(obj, key, value) {
1663   obj[key] = value;
1665 goog.object.setIfUndefined = function(obj, key, value) {
1666   return key in obj ? obj[key] : obj[key] = value;
1668 goog.object.clone = function(obj) {
1669   var res = {}, key;
1670   for (key in obj) {
1671     res[key] = obj[key];
1672   }
1673   return res;
1675 goog.object.unsafeClone = function(obj) {
1676   var type = goog.typeOf(obj);
1677   if ("object" == type || "array" == type) {
1678     if (obj.clone) {
1679       return obj.clone();
1680     }
1681     var clone = "array" == type ? [] : {}, key;
1682     for (key in obj) {
1683       clone[key] = goog.object.unsafeClone(obj[key]);
1684     }
1685     return clone;
1686   }
1687   return obj;
1689 goog.object.transpose = function(obj) {
1690   var transposed = {}, key;
1691   for (key in obj) {
1692     transposed[obj[key]] = key;
1693   }
1694   return transposed;
1696 goog.object.PROTOTYPE_FIELDS_ = "constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");
1697 goog.object.extend = function(target, var_args) {
1698   for (var key, source, i = 1;i < arguments.length;i++) {
1699     source = arguments[i];
1700     for (key in source) {
1701       target[key] = source[key];
1702     }
1703     for (var j = 0;j < goog.object.PROTOTYPE_FIELDS_.length;j++) {
1704       key = goog.object.PROTOTYPE_FIELDS_[j], Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
1705     }
1706   }
1708 goog.object.create = function(var_args) {
1709   var argLength = arguments.length;
1710   if (1 == argLength && goog.isArray(arguments[0])) {
1711     return goog.object.create.apply(null, arguments[0]);
1712   }
1713   if (argLength % 2) {
1714     throw Error("Uneven number of arguments");
1715   }
1716   for (var rv = {}, i = 0;i < argLength;i += 2) {
1717     rv[arguments[i]] = arguments[i + 1];
1718   }
1719   return rv;
1721 goog.object.createSet = function(var_args) {
1722   var argLength = arguments.length;
1723   if (1 == argLength && goog.isArray(arguments[0])) {
1724     return goog.object.createSet.apply(null, arguments[0]);
1725   }
1726   for (var rv = {}, i = 0;i < argLength;i++) {
1727     rv[arguments[i]] = !0;
1728   }
1729   return rv;
1731 goog.object.createImmutableView = function(obj) {
1732   var result = obj;
1733   Object.isFrozen && !Object.isFrozen(obj) && (result = Object.create(obj), Object.freeze(result));
1734   return result;
1736 goog.object.isImmutableView = function(obj) {
1737   return!!Object.isFrozen && Object.isFrozen(obj);
1739 goog.labs = {};
1740 goog.labs.userAgent = {};
1741 goog.labs.userAgent.util = {};
1742 goog.labs.userAgent.util.getNativeUserAgentString_ = function() {
1743   var navigator = goog.labs.userAgent.util.getNavigator_();
1744   if (navigator) {
1745     var userAgent = navigator.userAgent;
1746     if (userAgent) {
1747       return userAgent;
1748     }
1749   }
1750   return "";
1752 goog.labs.userAgent.util.getNavigator_ = function() {
1753   return goog.global.navigator;
1755 goog.labs.userAgent.util.userAgent_ = goog.labs.userAgent.util.getNativeUserAgentString_();
1756 goog.labs.userAgent.util.setUserAgent = function(opt_userAgent) {
1757   goog.labs.userAgent.util.userAgent_ = opt_userAgent || goog.labs.userAgent.util.getNativeUserAgentString_();
1759 goog.labs.userAgent.util.getUserAgent = function() {
1760   return goog.labs.userAgent.util.userAgent_;
1762 goog.labs.userAgent.util.matchUserAgent = function(str) {
1763   var userAgent = goog.labs.userAgent.util.getUserAgent();
1764   return goog.string.contains(userAgent, str);
1766 goog.labs.userAgent.util.matchUserAgentIgnoreCase = function(str) {
1767   var userAgent = goog.labs.userAgent.util.getUserAgent();
1768   return goog.string.caseInsensitiveContains(userAgent, str);
1770 goog.labs.userAgent.util.extractVersionTuples = function(userAgent) {
1771   for (var versionRegExp = RegExp("(\\w[\\w ]+)/([^\\s]+)\\s*(?:\\((.*?)\\))?", "g"), data = [], match;match = versionRegExp.exec(userAgent);) {
1772     data.push([match[1], match[2], match[3] || void 0]);
1773   }
1774   return data;
1776 goog.labs.userAgent.browser = {};
1777 goog.labs.userAgent.browser.matchOpera_ = function() {
1778   return goog.labs.userAgent.util.matchUserAgent("Opera") || goog.labs.userAgent.util.matchUserAgent("OPR");
1780 goog.labs.userAgent.browser.matchIE_ = function() {
1781   return goog.labs.userAgent.util.matchUserAgent("Trident") || goog.labs.userAgent.util.matchUserAgent("MSIE");
1783 goog.labs.userAgent.browser.matchFirefox_ = function() {
1784   return goog.labs.userAgent.util.matchUserAgent("Firefox");
1786 goog.labs.userAgent.browser.matchSafari_ = function() {
1787   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");
1789 goog.labs.userAgent.browser.matchChrome_ = function() {
1790   return goog.labs.userAgent.util.matchUserAgent("Chrome") || goog.labs.userAgent.util.matchUserAgent("CriOS");
1792 goog.labs.userAgent.browser.matchAndroidBrowser_ = function() {
1793   return goog.labs.userAgent.util.matchUserAgent("Android") && !goog.labs.userAgent.util.matchUserAgent("Chrome") && !goog.labs.userAgent.util.matchUserAgent("CriOS");
1795 goog.labs.userAgent.browser.isOpera = goog.labs.userAgent.browser.matchOpera_;
1796 goog.labs.userAgent.browser.isIE = goog.labs.userAgent.browser.matchIE_;
1797 goog.labs.userAgent.browser.isFirefox = goog.labs.userAgent.browser.matchFirefox_;
1798 goog.labs.userAgent.browser.isSafari = goog.labs.userAgent.browser.matchSafari_;
1799 goog.labs.userAgent.browser.isChrome = goog.labs.userAgent.browser.matchChrome_;
1800 goog.labs.userAgent.browser.isAndroidBrowser = goog.labs.userAgent.browser.matchAndroidBrowser_;
1801 goog.labs.userAgent.browser.isSilk = function() {
1802   return goog.labs.userAgent.util.matchUserAgent("Silk");
1804 goog.labs.userAgent.browser.getVersion = function() {
1805   var userAgentString = goog.labs.userAgent.util.getUserAgent();
1806   if (goog.labs.userAgent.browser.isIE()) {
1807     return goog.labs.userAgent.browser.getIEVersion_(userAgentString);
1808   }
1809   if (goog.labs.userAgent.browser.isOpera()) {
1810     return goog.labs.userAgent.browser.getOperaVersion_(userAgentString);
1811   }
1812   var versionTuples = goog.labs.userAgent.util.extractVersionTuples(userAgentString);
1813   return goog.labs.userAgent.browser.getVersionFromTuples_(versionTuples);
1815 goog.labs.userAgent.browser.isVersionOrHigher = function(version) {
1816   return 0 <= goog.string.compareVersions(goog.labs.userAgent.browser.getVersion(), version);
1818 goog.labs.userAgent.browser.getIEVersion_ = function(userAgent) {
1819   var rv = /rv: *([\d\.]*)/.exec(userAgent);
1820   if (rv && rv[1]) {
1821     return rv[1];
1822   }
1823   var version = "", msie = /MSIE +([\d\.]+)/.exec(userAgent);
1824   if (msie && msie[1]) {
1825     var tridentVersion = /Trident\/(\d.\d)/.exec(userAgent);
1826     if ("7.0" == msie[1]) {
1827       if (tridentVersion && tridentVersion[1]) {
1828         switch(tridentVersion[1]) {
1829           case "4.0":
1830             version = "8.0";
1831             break;
1832           case "5.0":
1833             version = "9.0";
1834             break;
1835           case "6.0":
1836             version = "10.0";
1837             break;
1838           case "7.0":
1839             version = "11.0";
1840         }
1841       } else {
1842         version = "7.0";
1843       }
1844     } else {
1845       version = msie[1];
1846     }
1847   }
1848   return version;
1850 goog.labs.userAgent.browser.getOperaVersion_ = function(userAgent) {
1851   var versionTuples = goog.labs.userAgent.util.extractVersionTuples(userAgent), lastTuple = goog.array.peek(versionTuples);
1852   return "OPR" == lastTuple[0] && lastTuple[1] ? lastTuple[1] : goog.labs.userAgent.browser.getVersionFromTuples_(versionTuples);
1854 goog.labs.userAgent.browser.getVersionFromTuples_ = function(versionTuples) {
1855   goog.asserts.assert(2 < versionTuples.length, "Couldn't extract version tuple from user agent string");
1856   return versionTuples[2] && versionTuples[2][1] ? versionTuples[2][1] : "";
1858 goog.labs.userAgent.engine = {};
1859 goog.labs.userAgent.engine.isPresto = function() {
1860   return goog.labs.userAgent.util.matchUserAgent("Presto");
1862 goog.labs.userAgent.engine.isTrident = function() {
1863   return goog.labs.userAgent.util.matchUserAgent("Trident") || goog.labs.userAgent.util.matchUserAgent("MSIE");
1865 goog.labs.userAgent.engine.isWebKit = function() {
1866   return goog.labs.userAgent.util.matchUserAgentIgnoreCase("WebKit");
1868 goog.labs.userAgent.engine.isGecko = function() {
1869   return goog.labs.userAgent.util.matchUserAgent("Gecko") && !goog.labs.userAgent.engine.isWebKit() && !goog.labs.userAgent.engine.isTrident();
1871 goog.labs.userAgent.engine.getVersion = function() {
1872   var userAgentString = goog.labs.userAgent.util.getUserAgent();
1873   if (userAgentString) {
1874     var tuples = goog.labs.userAgent.util.extractVersionTuples(userAgentString), engineTuple = tuples[1];
1875     if (engineTuple) {
1876       return "Gecko" == engineTuple[0] ? goog.labs.userAgent.engine.getVersionForKey_(tuples, "Firefox") : engineTuple[1];
1877     }
1878     var browserTuple = tuples[0], info;
1879     if (browserTuple && (info = browserTuple[2])) {
1880       var match = /Trident\/([^\s;]+)/.exec(info);
1881       if (match) {
1882         return match[1];
1883       }
1884     }
1885   }
1886   return "";
1888 goog.labs.userAgent.engine.isVersionOrHigher = function(version) {
1889   return 0 <= goog.string.compareVersions(goog.labs.userAgent.engine.getVersion(), version);
1891 goog.labs.userAgent.engine.getVersionForKey_ = function(tuples, key) {
1892   var pair = goog.array.find(tuples, function(pair) {
1893     return key == pair[0];
1894   });
1895   return pair && pair[1] || "";
1897 goog.userAgent = {};
1898 goog.userAgent.ASSUME_IE = !1;
1899 goog.userAgent.ASSUME_GECKO = !1;
1900 goog.userAgent.ASSUME_WEBKIT = !1;
1901 goog.userAgent.ASSUME_MOBILE_WEBKIT = !1;
1902 goog.userAgent.ASSUME_OPERA = !1;
1903 goog.userAgent.ASSUME_ANY_VERSION = !1;
1904 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;
1905 goog.userAgent.getUserAgentString = function() {
1906   return goog.labs.userAgent.util.getUserAgent();
1908 goog.userAgent.getNavigator = function() {
1909   return goog.global.navigator || null;
1911 goog.userAgent.OPERA = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_OPERA : goog.labs.userAgent.browser.isOpera();
1912 goog.userAgent.IE = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_IE : goog.labs.userAgent.browser.isIE();
1913 goog.userAgent.GECKO = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_GECKO : goog.labs.userAgent.engine.isGecko();
1914 goog.userAgent.WEBKIT = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_MOBILE_WEBKIT : goog.labs.userAgent.engine.isWebKit();
1915 goog.userAgent.isMobile_ = function() {
1916   return goog.userAgent.WEBKIT && goog.labs.userAgent.util.matchUserAgent("Mobile");
1918 goog.userAgent.MOBILE = goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.isMobile_();
1919 goog.userAgent.SAFARI = goog.userAgent.WEBKIT;
1920 goog.userAgent.determinePlatform_ = function() {
1921   var navigator = goog.userAgent.getNavigator();
1922   return navigator && navigator.platform || "";
1924 goog.userAgent.PLATFORM = goog.userAgent.determinePlatform_();
1925 goog.userAgent.ASSUME_MAC = !1;
1926 goog.userAgent.ASSUME_WINDOWS = !1;
1927 goog.userAgent.ASSUME_LINUX = !1;
1928 goog.userAgent.ASSUME_X11 = !1;
1929 goog.userAgent.ASSUME_ANDROID = !1;
1930 goog.userAgent.ASSUME_IPHONE = !1;
1931 goog.userAgent.ASSUME_IPAD = !1;
1932 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;
1933 goog.userAgent.initPlatform_ = function() {
1934   goog.userAgent.detectedMac_ = goog.string.contains(goog.userAgent.PLATFORM, "Mac");
1935   goog.userAgent.detectedWindows_ = goog.string.contains(goog.userAgent.PLATFORM, "Win");
1936   goog.userAgent.detectedLinux_ = goog.string.contains(goog.userAgent.PLATFORM, "Linux");
1937   goog.userAgent.detectedX11_ = !!goog.userAgent.getNavigator() && goog.string.contains(goog.userAgent.getNavigator().appVersion || "", "X11");
1938   var ua = goog.userAgent.getUserAgentString();
1939   goog.userAgent.detectedAndroid_ = !!ua && goog.string.contains(ua, "Android");
1940   goog.userAgent.detectedIPhone_ = !!ua && goog.string.contains(ua, "iPhone");
1941   goog.userAgent.detectedIPad_ = !!ua && goog.string.contains(ua, "iPad");
1943 goog.userAgent.PLATFORM_KNOWN_ || goog.userAgent.initPlatform_();
1944 goog.userAgent.MAC = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_MAC : goog.userAgent.detectedMac_;
1945 goog.userAgent.WINDOWS = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_WINDOWS : goog.userAgent.detectedWindows_;
1946 goog.userAgent.LINUX = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_LINUX : goog.userAgent.detectedLinux_;
1947 goog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_X11 : goog.userAgent.detectedX11_;
1948 goog.userAgent.ANDROID = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_ANDROID : goog.userAgent.detectedAndroid_;
1949 goog.userAgent.IPHONE = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPHONE : goog.userAgent.detectedIPhone_;
1950 goog.userAgent.IPAD = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPAD : goog.userAgent.detectedIPad_;
1951 goog.userAgent.determineVersion_ = function() {
1952   var version = "", re;
1953   if (goog.userAgent.OPERA && goog.global.opera) {
1954     var operaVersion = goog.global.opera.version;
1955     return goog.isFunction(operaVersion) ? operaVersion() : operaVersion;
1956   }
1957   goog.userAgent.GECKO ? re = /rv\:([^\);]+)(\)|;)/ : goog.userAgent.IE ? re = /\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/ : goog.userAgent.WEBKIT && (re = /WebKit\/(\S+)/);
1958   if (re) {
1959     var arr = re.exec(goog.userAgent.getUserAgentString()), version = arr ? arr[1] : ""
1960   }
1961   if (goog.userAgent.IE) {
1962     var docMode = goog.userAgent.getDocumentMode_();
1963     if (docMode > parseFloat(version)) {
1964       return String(docMode);
1965     }
1966   }
1967   return version;
1969 goog.userAgent.getDocumentMode_ = function() {
1970   var doc = goog.global.document;
1971   return doc ? doc.documentMode : void 0;
1973 goog.userAgent.VERSION = goog.userAgent.determineVersion_();
1974 goog.userAgent.compare = function(v1, v2) {
1975   return goog.string.compareVersions(v1, v2);
1977 goog.userAgent.isVersionOrHigherCache_ = {};
1978 goog.userAgent.isVersionOrHigher = function(version) {
1979   return goog.userAgent.ASSUME_ANY_VERSION || goog.userAgent.isVersionOrHigherCache_[version] || (goog.userAgent.isVersionOrHigherCache_[version] = 0 <= goog.string.compareVersions(goog.userAgent.VERSION, version));
1981 goog.userAgent.isVersion = goog.userAgent.isVersionOrHigher;
1982 goog.userAgent.isDocumentModeOrHigher = function(documentMode) {
1983   return goog.userAgent.IE && goog.userAgent.DOCUMENT_MODE >= documentMode;
1985 goog.userAgent.isDocumentMode = goog.userAgent.isDocumentModeOrHigher;
1986 var JSCompiler_inline_result$$0;
1987 var doc$$inline_1 = goog.global.document;
1988 if (doc$$inline_1 && goog.userAgent.IE) {
1989   var mode$$inline_2 = goog.userAgent.getDocumentMode_();
1990   JSCompiler_inline_result$$0 = mode$$inline_2 || ("CSS1Compat" == doc$$inline_1.compatMode ? parseInt(goog.userAgent.VERSION, 10) : 5);
1991 } else {
1992   JSCompiler_inline_result$$0 = void 0;
1994 goog.userAgent.DOCUMENT_MODE = JSCompiler_inline_result$$0;
1995 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, 
1996 INNER_HTML_NEEDS_SCOPED_ELEMENT:goog.userAgent.IE};
1997 goog.dom.classes = {};
1998 goog.dom.classes.set = function(element, className) {
1999   element.className = className;
2001 goog.dom.classes.get = function(element) {
2002   var className = element.className;
2003   return goog.isString(className) && className.match(/\S+/g) || [];
2005 goog.dom.classes.add = function(element, var_args) {
2006   var classes = goog.dom.classes.get(element), args = goog.array.slice(arguments, 1), expectedCount = classes.length + args.length;
2007   goog.dom.classes.add_(classes, args);
2008   goog.dom.classes.set(element, classes.join(" "));
2009   return classes.length == expectedCount;
2011 goog.dom.classes.remove = function(element, var_args) {
2012   var classes = goog.dom.classes.get(element), args = goog.array.slice(arguments, 1), newClasses = goog.dom.classes.getDifference_(classes, args);
2013   goog.dom.classes.set(element, newClasses.join(" "));
2014   return newClasses.length == classes.length - args.length;
2016 goog.dom.classes.add_ = function(classes, args) {
2017   for (var i = 0;i < args.length;i++) {
2018     goog.array.contains(classes, args[i]) || classes.push(args[i]);
2019   }
2021 goog.dom.classes.getDifference_ = function(arr1, arr2) {
2022   return goog.array.filter(arr1, function(item) {
2023     return!goog.array.contains(arr2, item);
2024   });
2026 goog.dom.classes.swap = function(element, fromClass, toClass) {
2027   for (var classes = goog.dom.classes.get(element), removed = !1, i = 0;i < classes.length;i++) {
2028     classes[i] == fromClass && (goog.array.splice(classes, i--, 1), removed = !0);
2029   }
2030   removed && (classes.push(toClass), goog.dom.classes.set(element, classes.join(" ")));
2031   return removed;
2033 goog.dom.classes.addRemove = function(element, classesToRemove, classesToAdd) {
2034   var classes = goog.dom.classes.get(element);
2035   goog.isString(classesToRemove) ? goog.array.remove(classes, classesToRemove) : goog.isArray(classesToRemove) && (classes = goog.dom.classes.getDifference_(classes, classesToRemove));
2036   goog.isString(classesToAdd) && !goog.array.contains(classes, classesToAdd) ? classes.push(classesToAdd) : goog.isArray(classesToAdd) && goog.dom.classes.add_(classes, classesToAdd);
2037   goog.dom.classes.set(element, classes.join(" "));
2039 goog.dom.classes.has = function(element, className) {
2040   return goog.array.contains(goog.dom.classes.get(element), className);
2042 goog.dom.classes.enable = function(element, className, enabled) {
2043   enabled ? goog.dom.classes.add(element, className) : goog.dom.classes.remove(element, className);
2045 goog.dom.classes.toggle = function(element, className) {
2046   var add = !goog.dom.classes.has(element, className);
2047   goog.dom.classes.enable(element, className, add);
2048   return add;
2050 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", 
2051 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", 
2052 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", 
2053 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"};
2054 goog.dom.ASSUME_QUIRKS_MODE = !1;
2055 goog.dom.ASSUME_STANDARDS_MODE = !1;
2056 goog.dom.COMPAT_MODE_KNOWN_ = goog.dom.ASSUME_QUIRKS_MODE || goog.dom.ASSUME_STANDARDS_MODE;
2057 goog.dom.getDomHelper = function(opt_element) {
2058   return opt_element ? new goog.dom.DomHelper(goog.dom.getOwnerDocument(opt_element)) : goog.dom.defaultDomHelper_ || (goog.dom.defaultDomHelper_ = new goog.dom.DomHelper);
2060 goog.dom.getDocument = function() {
2061   return document;
2063 goog.dom.getElement = function(element) {
2064   return goog.dom.getElementHelper_(document, element);
2066 goog.dom.getElementHelper_ = function(doc, element) {
2067   return goog.isString(element) ? doc.getElementById(element) : element;
2069 goog.dom.getRequiredElement = function(id) {
2070   return goog.dom.getRequiredElementHelper_(document, id);
2072 goog.dom.getRequiredElementHelper_ = function(doc, id) {
2073   goog.asserts.assertString(id);
2074   var element = goog.dom.getElementHelper_(doc, id);
2075   return element = goog.asserts.assertElement(element, "No element found with id: " + id);
2077 goog.dom.$ = goog.dom.getElement;
2078 goog.dom.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) {
2079   return goog.dom.getElementsByTagNameAndClass_(document, opt_tag, opt_class, opt_el);
2081 goog.dom.getElementsByClass = function(className, opt_el) {
2082   var parent = opt_el || document;
2083   return goog.dom.canUseQuerySelector_(parent) ? parent.querySelectorAll("." + className) : goog.dom.getElementsByTagNameAndClass_(document, "*", className, opt_el);
2085 goog.dom.getElementByClass = function(className, opt_el) {
2086   var parent = opt_el || document, retVal = null;
2087   return(retVal = goog.dom.canUseQuerySelector_(parent) ? parent.querySelector("." + className) : goog.dom.getElementsByTagNameAndClass_(document, "*", className, opt_el)[0]) || null;
2089 goog.dom.getRequiredElementByClass = function(className, opt_root) {
2090   var retValue = goog.dom.getElementByClass(className, opt_root);
2091   return goog.asserts.assert(retValue, "No element found with className: " + className);
2093 goog.dom.canUseQuerySelector_ = function(parent) {
2094   return!(!parent.querySelectorAll || !parent.querySelector);
2096 goog.dom.getElementsByTagNameAndClass_ = function(doc, opt_tag, opt_class, opt_el) {
2097   var parent = opt_el || doc, tagName = opt_tag && "*" != opt_tag ? opt_tag.toUpperCase() : "";
2098   if (goog.dom.canUseQuerySelector_(parent) && (tagName || opt_class)) {
2099     var query = tagName + (opt_class ? "." + opt_class : "");
2100     return parent.querySelectorAll(query);
2101   }
2102   if (opt_class && parent.getElementsByClassName) {
2103     var els = parent.getElementsByClassName(opt_class);
2104     if (tagName) {
2105       for (var arrayLike = {}, len = 0, i = 0, el;el = els[i];i++) {
2106         tagName == el.nodeName && (arrayLike[len++] = el);
2107       }
2108       arrayLike.length = len;
2109       return arrayLike;
2110     }
2111     return els;
2112   }
2113   els = parent.getElementsByTagName(tagName || "*");
2114   if (opt_class) {
2115     arrayLike = {};
2116     for (i = len = 0;el = els[i];i++) {
2117       var className = el.className;
2118       "function" == typeof className.split && goog.array.contains(className.split(/\s+/), opt_class) && (arrayLike[len++] = el);
2119     }
2120     arrayLike.length = len;
2121     return arrayLike;
2122   }
2123   return els;
2125 goog.dom.$$ = goog.dom.getElementsByTagNameAndClass;
2126 goog.dom.setProperties = function(element, properties) {
2127   goog.object.forEach(properties, function(val, key) {
2128     "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;
2129   });
2131 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"};
2132 goog.dom.getViewportSize = function(opt_window) {
2133   return goog.dom.getViewportSize_(opt_window || window);
2135 goog.dom.getViewportSize_ = function(win) {
2136   var doc = win.document, el = goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body;
2137   return new goog.math.Size(el.clientWidth, el.clientHeight);
2139 goog.dom.getDocumentHeight = function() {
2140   return goog.dom.getDocumentHeight_(window);
2142 goog.dom.getDocumentHeight_ = function(win) {
2143   var doc = win.document, height = 0;
2144   if (doc) {
2145     var vh = goog.dom.getViewportSize_(win).height, body = doc.body, docEl = doc.documentElement;
2146     if (goog.dom.isCss1CompatMode_(doc) && docEl.scrollHeight) {
2147       height = docEl.scrollHeight != vh ? docEl.scrollHeight : docEl.offsetHeight;
2148     } else {
2149       var sh = docEl.scrollHeight, oh = docEl.offsetHeight;
2150       docEl.clientHeight != oh && (sh = body.scrollHeight, oh = body.offsetHeight);
2151       height = sh > vh ? sh > oh ? sh : oh : sh < oh ? sh : oh;
2152     }
2153   }
2154   return height;
2156 goog.dom.getPageScroll = function(opt_window) {
2157   var win = opt_window || goog.global || window;
2158   return goog.dom.getDomHelper(win.document).getDocumentScroll();
2160 goog.dom.getDocumentScroll = function() {
2161   return goog.dom.getDocumentScroll_(document);
2163 goog.dom.getDocumentScroll_ = function(doc) {
2164   var el = goog.dom.getDocumentScrollElement_(doc), win = goog.dom.getWindow_(doc);
2165   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);
2167 goog.dom.getDocumentScrollElement = function() {
2168   return goog.dom.getDocumentScrollElement_(document);
2170 goog.dom.getDocumentScrollElement_ = function(doc) {
2171   return!goog.userAgent.WEBKIT && goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body || doc.documentElement;
2173 goog.dom.getWindow = function(opt_doc) {
2174   return opt_doc ? goog.dom.getWindow_(opt_doc) : window;
2176 goog.dom.getWindow_ = function(doc) {
2177   return doc.parentWindow || doc.defaultView;
2179 goog.dom.createDom = function(tagName, opt_attributes, var_args) {
2180   return goog.dom.createDom_(document, arguments);
2182 goog.dom.createDom_ = function(doc, args) {
2183   var tagName = args[0], attributes = args[1];
2184   if (!goog.dom.BrowserFeature.CAN_ADD_NAME_OR_TYPE_ATTRIBUTES && attributes && (attributes.name || attributes.type)) {
2185     var tagNameArr = ["<", tagName];
2186     attributes.name && tagNameArr.push(' name="', goog.string.htmlEscape(attributes.name), '"');
2187     if (attributes.type) {
2188       tagNameArr.push(' type="', goog.string.htmlEscape(attributes.type), '"');
2189       var clone = {};
2190       goog.object.extend(clone, attributes);
2191       delete clone.type;
2192       attributes = clone;
2193     }
2194     tagNameArr.push(">");
2195     tagName = tagNameArr.join("");
2196   }
2197   var element = doc.createElement(tagName);
2198   attributes && (goog.isString(attributes) ? element.className = attributes : goog.isArray(attributes) ? goog.dom.classes.add.apply(null, [element].concat(attributes)) : goog.dom.setProperties(element, attributes));
2199   2 < args.length && goog.dom.append_(doc, element, args, 2);
2200   return element;
2202 goog.dom.append_ = function(doc, parent, args, startIndex) {
2203   function childHandler(child) {
2204     child && parent.appendChild(goog.isString(child) ? doc.createTextNode(child) : child);
2205   }
2206   for (var i = startIndex;i < args.length;i++) {
2207     var arg = args[i];
2208     goog.isArrayLike(arg) && !goog.dom.isNodeLike(arg) ? goog.array.forEach(goog.dom.isNodeList(arg) ? goog.array.toArray(arg) : arg, childHandler) : childHandler(arg);
2209   }
2211 goog.dom.$dom = goog.dom.createDom;
2212 goog.dom.createElement = function(name) {
2213   return document.createElement(name);
2215 goog.dom.createTextNode = function(content) {
2216   return document.createTextNode(String(content));
2218 goog.dom.createTable = function(rows, columns, opt_fillWithNbsp) {
2219   return goog.dom.createTable_(document, rows, columns, !!opt_fillWithNbsp);
2221 goog.dom.createTable_ = function(doc, rows, columns, fillWithNbsp) {
2222   for (var rowHtml = ["<tr>"], i = 0;i < columns;i++) {
2223     rowHtml.push(fillWithNbsp ? "<td>&nbsp;</td>" : "<td></td>");
2224   }
2225   rowHtml.push("</tr>");
2226   for (var rowHtml = rowHtml.join(""), totalHtml = ["<table>"], i = 0;i < rows;i++) {
2227     totalHtml.push(rowHtml);
2228   }
2229   totalHtml.push("</table>");
2230   var elem = doc.createElement(goog.dom.TagName.DIV);
2231   elem.innerHTML = totalHtml.join("");
2232   return elem.removeChild(elem.firstChild);
2234 goog.dom.htmlToDocumentFragment = function(htmlString) {
2235   return goog.dom.htmlToDocumentFragment_(document, htmlString);
2237 goog.dom.htmlToDocumentFragment_ = function(doc, htmlString) {
2238   var tempDiv = doc.createElement("div");
2239   goog.dom.BrowserFeature.INNER_HTML_NEEDS_SCOPED_ELEMENT ? (tempDiv.innerHTML = "<br>" + htmlString, tempDiv.removeChild(tempDiv.firstChild)) : tempDiv.innerHTML = htmlString;
2240   if (1 == tempDiv.childNodes.length) {
2241     return tempDiv.removeChild(tempDiv.firstChild);
2242   }
2243   for (var fragment = doc.createDocumentFragment();tempDiv.firstChild;) {
2244     fragment.appendChild(tempDiv.firstChild);
2245   }
2246   return fragment;
2248 goog.dom.isCss1CompatMode = function() {
2249   return goog.dom.isCss1CompatMode_(document);
2251 goog.dom.isCss1CompatMode_ = function(doc) {
2252   return goog.dom.COMPAT_MODE_KNOWN_ ? goog.dom.ASSUME_STANDARDS_MODE : "CSS1Compat" == doc.compatMode;
2254 goog.dom.canHaveChildren = function(node) {
2255   if (node.nodeType != goog.dom.NodeType.ELEMENT) {
2256     return!1;
2257   }
2258   switch(node.tagName) {
2259     case goog.dom.TagName.APPLET:
2260     ;
2261     case goog.dom.TagName.AREA:
2262     ;
2263     case goog.dom.TagName.BASE:
2264     ;
2265     case goog.dom.TagName.BR:
2266     ;
2267     case goog.dom.TagName.COL:
2268     ;
2269     case goog.dom.TagName.COMMAND:
2270     ;
2271     case goog.dom.TagName.EMBED:
2272     ;
2273     case goog.dom.TagName.FRAME:
2274     ;
2275     case goog.dom.TagName.HR:
2276     ;
2277     case goog.dom.TagName.IMG:
2278     ;
2279     case goog.dom.TagName.INPUT:
2280     ;
2281     case goog.dom.TagName.IFRAME:
2282     ;
2283     case goog.dom.TagName.ISINDEX:
2284     ;
2285     case goog.dom.TagName.KEYGEN:
2286     ;
2287     case goog.dom.TagName.LINK:
2288     ;
2289     case goog.dom.TagName.NOFRAMES:
2290     ;
2291     case goog.dom.TagName.NOSCRIPT:
2292     ;
2293     case goog.dom.TagName.META:
2294     ;
2295     case goog.dom.TagName.OBJECT:
2296     ;
2297     case goog.dom.TagName.PARAM:
2298     ;
2299     case goog.dom.TagName.SCRIPT:
2300     ;
2301     case goog.dom.TagName.SOURCE:
2302     ;
2303     case goog.dom.TagName.STYLE:
2304     ;
2305     case goog.dom.TagName.TRACK:
2306     ;
2307     case goog.dom.TagName.WBR:
2308       return!1;
2309   }
2310   return!0;
2312 goog.dom.appendChild = function(parent, child) {
2313   parent.appendChild(child);
2315 goog.dom.append = function(parent, var_args) {
2316   goog.dom.append_(goog.dom.getOwnerDocument(parent), parent, arguments, 1);
2318 goog.dom.removeChildren = function(node) {
2319   for (var child;child = node.firstChild;) {
2320     node.removeChild(child);
2321   }
2323 goog.dom.insertSiblingBefore = function(newNode, refNode) {
2324   refNode.parentNode && refNode.parentNode.insertBefore(newNode, refNode);
2326 goog.dom.insertSiblingAfter = function(newNode, refNode) {
2327   refNode.parentNode && refNode.parentNode.insertBefore(newNode, refNode.nextSibling);
2329 goog.dom.insertChildAt = function(parent, child, index) {
2330   parent.insertBefore(child, parent.childNodes[index] || null);
2332 goog.dom.removeNode = function(node) {
2333   return node && node.parentNode ? node.parentNode.removeChild(node) : null;
2335 goog.dom.replaceNode = function(newNode, oldNode) {
2336   var parent = oldNode.parentNode;
2337   parent && parent.replaceChild(newNode, oldNode);
2339 goog.dom.flattenElement = function(element) {
2340   var child, parent = element.parentNode;
2341   if (parent && parent.nodeType != goog.dom.NodeType.DOCUMENT_FRAGMENT) {
2342     if (element.removeNode) {
2343       return element.removeNode(!1);
2344     }
2345     for (;child = element.firstChild;) {
2346       parent.insertBefore(child, element);
2347     }
2348     return goog.dom.removeNode(element);
2349   }
2351 goog.dom.getChildren = function(element) {
2352   return goog.dom.BrowserFeature.CAN_USE_CHILDREN_ATTRIBUTE && void 0 != element.children ? element.children : goog.array.filter(element.childNodes, function(node) {
2353     return node.nodeType == goog.dom.NodeType.ELEMENT;
2354   });
2356 goog.dom.getFirstElementChild = function(node) {
2357   return void 0 != node.firstElementChild ? node.firstElementChild : goog.dom.getNextElementNode_(node.firstChild, !0);
2359 goog.dom.getLastElementChild = function(node) {
2360   return void 0 != node.lastElementChild ? node.lastElementChild : goog.dom.getNextElementNode_(node.lastChild, !1);
2362 goog.dom.getNextElementSibling = function(node) {
2363   return void 0 != node.nextElementSibling ? node.nextElementSibling : goog.dom.getNextElementNode_(node.nextSibling, !0);
2365 goog.dom.getPreviousElementSibling = function(node) {
2366   return void 0 != node.previousElementSibling ? node.previousElementSibling : goog.dom.getNextElementNode_(node.previousSibling, !1);
2368 goog.dom.getNextElementNode_ = function(node, forward) {
2369   for (;node && node.nodeType != goog.dom.NodeType.ELEMENT;) {
2370     node = forward ? node.nextSibling : node.previousSibling;
2371   }
2372   return node;
2374 goog.dom.getNextNode = function(node) {
2375   if (!node) {
2376     return null;
2377   }
2378   if (node.firstChild) {
2379     return node.firstChild;
2380   }
2381   for (;node && !node.nextSibling;) {
2382     node = node.parentNode;
2383   }
2384   return node ? node.nextSibling : null;
2386 goog.dom.getPreviousNode = function(node) {
2387   if (!node) {
2388     return null;
2389   }
2390   if (!node.previousSibling) {
2391     return node.parentNode;
2392   }
2393   for (node = node.previousSibling;node && node.lastChild;) {
2394     node = node.lastChild;
2395   }
2396   return node;
2398 goog.dom.isNodeLike = function(obj) {
2399   return goog.isObject(obj) && 0 < obj.nodeType;
2401 goog.dom.isElement = function(obj) {
2402   return goog.isObject(obj) && obj.nodeType == goog.dom.NodeType.ELEMENT;
2404 goog.dom.isWindow = function(obj) {
2405   return goog.isObject(obj) && obj.window == obj;
2407 goog.dom.getParentElement = function(element) {
2408   if (goog.dom.BrowserFeature.CAN_USE_PARENT_ELEMENT_PROPERTY) {
2409     var isIe9 = goog.userAgent.IE && goog.userAgent.isVersionOrHigher("9") && !goog.userAgent.isVersionOrHigher("10");
2410     if (!(isIe9 && goog.global.SVGElement && element instanceof goog.global.SVGElement)) {
2411       return element.parentElement;
2412     }
2413   }
2414   var parent = element.parentNode;
2415   return goog.dom.isElement(parent) ? parent : null;
2417 goog.dom.contains = function(parent, descendant) {
2418   if (parent.contains && descendant.nodeType == goog.dom.NodeType.ELEMENT) {
2419     return parent == descendant || parent.contains(descendant);
2420   }
2421   if ("undefined" != typeof parent.compareDocumentPosition) {
2422     return parent == descendant || Boolean(parent.compareDocumentPosition(descendant) & 16);
2423   }
2424   for (;descendant && parent != descendant;) {
2425     descendant = descendant.parentNode;
2426   }
2427   return descendant == parent;
2429 goog.dom.compareNodeOrder = function(node1, node2) {
2430   if (node1 == node2) {
2431     return 0;
2432   }
2433   if (node1.compareDocumentPosition) {
2434     return node1.compareDocumentPosition(node2) & 2 ? 1 : -1;
2435   }
2436   if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {
2437     if (node1.nodeType == goog.dom.NodeType.DOCUMENT) {
2438       return-1;
2439     }
2440     if (node2.nodeType == goog.dom.NodeType.DOCUMENT) {
2441       return 1;
2442     }
2443   }
2444   if ("sourceIndex" in node1 || node1.parentNode && "sourceIndex" in node1.parentNode) {
2445     var isElement1 = node1.nodeType == goog.dom.NodeType.ELEMENT, isElement2 = node2.nodeType == goog.dom.NodeType.ELEMENT;
2446     if (isElement1 && isElement2) {
2447       return node1.sourceIndex - node2.sourceIndex;
2448     }
2449     var parent1 = node1.parentNode, parent2 = node2.parentNode;
2450     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);
2451   }
2452   var doc = goog.dom.getOwnerDocument(node1), range1, range2;
2453   range1 = doc.createRange();
2454   range1.selectNode(node1);
2455   range1.collapse(!0);
2456   range2 = doc.createRange();
2457   range2.selectNode(node2);
2458   range2.collapse(!0);
2459   return range1.compareBoundaryPoints(goog.global.Range.START_TO_END, range2);
2461 goog.dom.compareParentsDescendantNodeIe_ = function(textNode, node) {
2462   var parent = textNode.parentNode;
2463   if (parent == node) {
2464     return-1;
2465   }
2466   for (var sibling = node;sibling.parentNode != parent;) {
2467     sibling = sibling.parentNode;
2468   }
2469   return goog.dom.compareSiblingOrder_(sibling, textNode);
2471 goog.dom.compareSiblingOrder_ = function(node1, node2) {
2472   for (var s = node2;s = s.previousSibling;) {
2473     if (s == node1) {
2474       return-1;
2475     }
2476   }
2477   return 1;
2479 goog.dom.findCommonAncestor = function(var_args) {
2480   var i, count = arguments.length;
2481   if (!count) {
2482     return null;
2483   }
2484   if (1 == count) {
2485     return arguments[0];
2486   }
2487   var paths = [], minLength = Infinity;
2488   for (i = 0;i < count;i++) {
2489     for (var ancestors = [], node = arguments[i];node;) {
2490       ancestors.unshift(node), node = node.parentNode;
2491     }
2492     paths.push(ancestors);
2493     minLength = Math.min(minLength, ancestors.length);
2494   }
2495   var output = null;
2496   for (i = 0;i < minLength;i++) {
2497     for (var first = paths[0][i], j = 1;j < count;j++) {
2498       if (first != paths[j][i]) {
2499         return output;
2500       }
2501     }
2502     output = first;
2503   }
2504   return output;
2506 goog.dom.getOwnerDocument = function(node) {
2507   return node.nodeType == goog.dom.NodeType.DOCUMENT ? node : node.ownerDocument || node.document;
2509 goog.dom.getFrameContentDocument = function(frame) {
2510   var doc = frame.contentDocument || frame.contentWindow.document;
2511   return doc;
2513 goog.dom.getFrameContentWindow = function(frame) {
2514   return frame.contentWindow || goog.dom.getWindow(goog.dom.getFrameContentDocument(frame));
2516 goog.dom.setTextContent = function(node, text) {
2517   goog.asserts.assert(null != node, "goog.dom.setTextContent expects a non-null value for node");
2518   if ("textContent" in node) {
2519     node.textContent = text;
2520   } else {
2521     if (node.nodeType == goog.dom.NodeType.TEXT) {
2522       node.data = text;
2523     } else {
2524       if (node.firstChild && node.firstChild.nodeType == goog.dom.NodeType.TEXT) {
2525         for (;node.lastChild != node.firstChild;) {
2526           node.removeChild(node.lastChild);
2527         }
2528         node.firstChild.data = text;
2529       } else {
2530         goog.dom.removeChildren(node);
2531         var doc = goog.dom.getOwnerDocument(node);
2532         node.appendChild(doc.createTextNode(String(text)));
2533       }
2534     }
2535   }
2537 goog.dom.getOuterHtml = function(element) {
2538   if ("outerHTML" in element) {
2539     return element.outerHTML;
2540   }
2541   var doc = goog.dom.getOwnerDocument(element), div = doc.createElement("div");
2542   div.appendChild(element.cloneNode(!0));
2543   return div.innerHTML;
2545 goog.dom.findNode = function(root, p) {
2546   var rv = [], found = goog.dom.findNodes_(root, p, rv, !0);
2547   return found ? rv[0] : void 0;
2549 goog.dom.findNodes = function(root, p) {
2550   var rv = [];
2551   goog.dom.findNodes_(root, p, rv, !1);
2552   return rv;
2554 goog.dom.findNodes_ = function(root, p, rv, findOne) {
2555   if (null != root) {
2556     for (var child = root.firstChild;child;) {
2557       if (p(child) && (rv.push(child), findOne) || goog.dom.findNodes_(child, p, rv, findOne)) {
2558         return!0;
2559       }
2560       child = child.nextSibling;
2561     }
2562   }
2563   return!1;
2565 goog.dom.TAGS_TO_IGNORE_ = {SCRIPT:1, STYLE:1, HEAD:1, IFRAME:1, OBJECT:1};
2566 goog.dom.PREDEFINED_TAG_VALUES_ = {IMG:" ", BR:"\n"};
2567 goog.dom.isFocusableTabIndex = function(element) {
2568   return goog.dom.hasSpecifiedTabIndex_(element) && goog.dom.isTabIndexFocusable_(element);
2570 goog.dom.setFocusableTabIndex = function(element, enable) {
2571   enable ? element.tabIndex = 0 : (element.tabIndex = -1, element.removeAttribute("tabIndex"));
2573 goog.dom.isFocusable = function(element) {
2574   var focusable;
2575   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;
2577 goog.dom.hasSpecifiedTabIndex_ = function(element) {
2578   var attrNode = element.getAttributeNode("tabindex");
2579   return goog.isDefAndNotNull(attrNode) && attrNode.specified;
2581 goog.dom.isTabIndexFocusable_ = function(element) {
2582   var index = element.tabIndex;
2583   return goog.isNumber(index) && 0 <= index && 32768 > index;
2585 goog.dom.nativelySupportsFocus_ = function(element) {
2586   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;
2588 goog.dom.hasNonZeroBoundingRect_ = function(element) {
2589   var rect = goog.isFunction(element.getBoundingClientRect) ? element.getBoundingClientRect() : {height:element.offsetHeight, width:element.offsetWidth};
2590   return goog.isDefAndNotNull(rect) && 0 < rect.height && 0 < rect.width;
2592 goog.dom.getTextContent = function(node) {
2593   var textContent;
2594   if (goog.dom.BrowserFeature.CAN_USE_INNER_TEXT && "innerText" in node) {
2595     textContent = goog.string.canonicalizeNewlines(node.innerText);
2596   } else {
2597     var buf = [];
2598     goog.dom.getTextContent_(node, buf, !0);
2599     textContent = buf.join("");
2600   }
2601   textContent = textContent.replace(/ \xAD /g, " ").replace(/\xAD/g, "");
2602   textContent = textContent.replace(/\u200B/g, "");
2603   goog.dom.BrowserFeature.CAN_USE_INNER_TEXT || (textContent = textContent.replace(/ +/g, " "));
2604   " " != textContent && (textContent = textContent.replace(/^\s*/, ""));
2605   return textContent;
2607 goog.dom.getRawTextContent = function(node) {
2608   var buf = [];
2609   goog.dom.getTextContent_(node, buf, !1);
2610   return buf.join("");
2612 goog.dom.getTextContent_ = function(node, buf, normalizeWhitespace) {
2613   if (!(node.nodeName in goog.dom.TAGS_TO_IGNORE_)) {
2614     if (node.nodeType == goog.dom.NodeType.TEXT) {
2615       normalizeWhitespace ? buf.push(String(node.nodeValue).replace(/(\r\n|\r|\n)/g, "")) : buf.push(node.nodeValue);
2616     } else {
2617       if (node.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {
2618         buf.push(goog.dom.PREDEFINED_TAG_VALUES_[node.nodeName]);
2619       } else {
2620         for (var child = node.firstChild;child;) {
2621           goog.dom.getTextContent_(child, buf, normalizeWhitespace), child = child.nextSibling;
2622         }
2623       }
2624     }
2625   }
2627 goog.dom.getNodeTextLength = function(node) {
2628   return goog.dom.getTextContent(node).length;
2630 goog.dom.getNodeTextOffset = function(node, opt_offsetParent) {
2631   for (var root = opt_offsetParent || goog.dom.getOwnerDocument(node).body, buf = [];node && node != root;) {
2632     for (var cur = node;cur = cur.previousSibling;) {
2633       buf.unshift(goog.dom.getTextContent(cur));
2634     }
2635     node = node.parentNode;
2636   }
2637   return goog.string.trimLeft(buf.join("")).replace(/ +/g, " ").length;
2639 goog.dom.getNodeAtOffset = function(parent, offset, opt_result) {
2640   for (var stack = [parent], pos = 0, cur = null;0 < stack.length && pos < offset;) {
2641     if (cur = stack.pop(), !(cur.nodeName in goog.dom.TAGS_TO_IGNORE_)) {
2642       if (cur.nodeType == goog.dom.NodeType.TEXT) {
2643         var text = cur.nodeValue.replace(/(\r\n|\r|\n)/g, "").replace(/ +/g, " "), pos = pos + text.length
2644       } else {
2645         if (cur.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {
2646           pos += goog.dom.PREDEFINED_TAG_VALUES_[cur.nodeName].length;
2647         } else {
2648           for (var i = cur.childNodes.length - 1;0 <= i;i--) {
2649             stack.push(cur.childNodes[i]);
2650           }
2651         }
2652       }
2653     }
2654   }
2655   goog.isObject(opt_result) && (opt_result.remainder = cur ? cur.nodeValue.length + offset - pos - 1 : 0, opt_result.node = cur);
2656   return cur;
2658 goog.dom.isNodeList = function(val) {
2659   if (val && "number" == typeof val.length) {
2660     if (goog.isObject(val)) {
2661       return "function" == typeof val.item || "string" == typeof val.item;
2662     }
2663     if (goog.isFunction(val)) {
2664       return "function" == typeof val.item;
2665     }
2666   }
2667   return!1;
2669 goog.dom.getAncestorByTagNameAndClass = function(element, opt_tag, opt_class) {
2670   if (!opt_tag && !opt_class) {
2671     return null;
2672   }
2673   var tagName = opt_tag ? opt_tag.toUpperCase() : null;
2674   return goog.dom.getAncestor(element, function(node) {
2675     return(!tagName || node.nodeName == tagName) && (!opt_class || goog.dom.classes.has(node, opt_class));
2676   }, !0);
2678 goog.dom.getAncestorByClass = function(element, className) {
2679   return goog.dom.getAncestorByTagNameAndClass(element, null, className);
2681 goog.dom.getAncestor = function(element, matcher, opt_includeNode, opt_maxSearchSteps) {
2682   opt_includeNode || (element = element.parentNode);
2683   for (var ignoreSearchSteps = null == opt_maxSearchSteps, steps = 0;element && (ignoreSearchSteps || steps <= opt_maxSearchSteps);) {
2684     if (matcher(element)) {
2685       return element;
2686     }
2687     element = element.parentNode;
2688     steps++;
2689   }
2690   return null;
2692 goog.dom.getActiveElement = function(doc) {
2693   try {
2694     return doc && doc.activeElement;
2695   } catch (e) {
2696   }
2697   return null;
2699 goog.dom.getPixelRatio = goog.functions.cacheReturnValue(function() {
2700   var win = goog.dom.getWindow(), isFirefoxMobile = goog.userAgent.GECKO && goog.userAgent.MOBILE;
2701   return goog.isDef(win.devicePixelRatio) && !isFirefoxMobile ? win.devicePixelRatio : win.matchMedia ? goog.dom.matchesPixelRatio_(0.75) || goog.dom.matchesPixelRatio_(1.5) || goog.dom.matchesPixelRatio_(2) || goog.dom.matchesPixelRatio_(3) || 1 : 1;
2703 goog.dom.matchesPixelRatio_ = function(pixelRatio) {
2704   var win = goog.dom.getWindow(), query = "(-webkit-min-device-pixel-ratio: " + pixelRatio + "),(min--moz-device-pixel-ratio: " + pixelRatio + "),(min-resolution: " + pixelRatio + "dppx)";
2705   return win.matchMedia(query).matches ? pixelRatio : 0;
2707 goog.dom.DomHelper = function(opt_document) {
2708   this.document_ = opt_document || goog.global.document || document;
2710 goog.dom.DomHelper.prototype.getDomHelper = goog.dom.getDomHelper;
2711 goog.dom.DomHelper.prototype.getDocument = function() {
2712   return this.document_;
2714 goog.dom.DomHelper.prototype.getElement = function(element) {
2715   return goog.dom.getElementHelper_(this.document_, element);
2717 goog.dom.DomHelper.prototype.getRequiredElement = function(id) {
2718   return goog.dom.getRequiredElementHelper_(this.document_, id);
2720 goog.dom.DomHelper.prototype.$ = goog.dom.DomHelper.prototype.getElement;
2721 goog.dom.DomHelper.prototype.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) {
2722   return goog.dom.getElementsByTagNameAndClass_(this.document_, opt_tag, opt_class, opt_el);
2724 goog.dom.DomHelper.prototype.getElementsByClass = function(className, opt_el) {
2725   var doc = opt_el || this.document_;
2726   return goog.dom.getElementsByClass(className, doc);
2728 goog.dom.DomHelper.prototype.getElementByClass = function(className, opt_el) {
2729   var doc = opt_el || this.document_;
2730   return goog.dom.getElementByClass(className, doc);
2732 goog.dom.DomHelper.prototype.getRequiredElementByClass = function(className, opt_root) {
2733   var root = opt_root || this.document_;
2734   return goog.dom.getRequiredElementByClass(className, root);
2736 goog.dom.DomHelper.prototype.$$ = goog.dom.DomHelper.prototype.getElementsByTagNameAndClass;
2737 goog.dom.DomHelper.prototype.setProperties = goog.dom.setProperties;
2738 goog.dom.DomHelper.prototype.getViewportSize = function(opt_window) {
2739   return goog.dom.getViewportSize(opt_window || this.getWindow());
2741 goog.dom.DomHelper.prototype.getDocumentHeight = function() {
2742   return goog.dom.getDocumentHeight_(this.getWindow());
2744 goog.dom.DomHelper.prototype.createDom = function(tagName, opt_attributes, var_args) {
2745   return goog.dom.createDom_(this.document_, arguments);
2747 goog.dom.DomHelper.prototype.$dom = goog.dom.DomHelper.prototype.createDom;
2748 goog.dom.DomHelper.prototype.createElement = function(name) {
2749   return this.document_.createElement(name);
2751 goog.dom.DomHelper.prototype.createTextNode = function(content) {
2752   return this.document_.createTextNode(String(content));
2754 goog.dom.DomHelper.prototype.createTable = function(rows, columns, opt_fillWithNbsp) {
2755   return goog.dom.createTable_(this.document_, rows, columns, !!opt_fillWithNbsp);
2757 goog.dom.DomHelper.prototype.htmlToDocumentFragment = function(htmlString) {
2758   return goog.dom.htmlToDocumentFragment_(this.document_, htmlString);
2760 goog.dom.DomHelper.prototype.isCss1CompatMode = function() {
2761   return goog.dom.isCss1CompatMode_(this.document_);
2763 goog.dom.DomHelper.prototype.getWindow = function() {
2764   return goog.dom.getWindow_(this.document_);
2766 goog.dom.DomHelper.prototype.getDocumentScrollElement = function() {
2767   return goog.dom.getDocumentScrollElement_(this.document_);
2769 goog.dom.DomHelper.prototype.getDocumentScroll = function() {
2770   return goog.dom.getDocumentScroll_(this.document_);
2772 goog.dom.DomHelper.prototype.getActiveElement = function(opt_doc) {
2773   return goog.dom.getActiveElement(opt_doc || this.document_);
2775 goog.dom.DomHelper.prototype.appendChild = goog.dom.appendChild;
2776 goog.dom.DomHelper.prototype.append = goog.dom.append;
2777 goog.dom.DomHelper.prototype.canHaveChildren = goog.dom.canHaveChildren;
2778 goog.dom.DomHelper.prototype.removeChildren = goog.dom.removeChildren;
2779 goog.dom.DomHelper.prototype.insertSiblingBefore = goog.dom.insertSiblingBefore;
2780 goog.dom.DomHelper.prototype.insertSiblingAfter = goog.dom.insertSiblingAfter;
2781 goog.dom.DomHelper.prototype.insertChildAt = goog.dom.insertChildAt;
2782 goog.dom.DomHelper.prototype.removeNode = goog.dom.removeNode;
2783 goog.dom.DomHelper.prototype.replaceNode = goog.dom.replaceNode;
2784 goog.dom.DomHelper.prototype.flattenElement = goog.dom.flattenElement;
2785 goog.dom.DomHelper.prototype.getChildren = goog.dom.getChildren;
2786 goog.dom.DomHelper.prototype.getFirstElementChild = goog.dom.getFirstElementChild;
2787 goog.dom.DomHelper.prototype.getLastElementChild = goog.dom.getLastElementChild;
2788 goog.dom.DomHelper.prototype.getNextElementSibling = goog.dom.getNextElementSibling;
2789 goog.dom.DomHelper.prototype.getPreviousElementSibling = goog.dom.getPreviousElementSibling;
2790 goog.dom.DomHelper.prototype.getNextNode = goog.dom.getNextNode;
2791 goog.dom.DomHelper.prototype.getPreviousNode = goog.dom.getPreviousNode;
2792 goog.dom.DomHelper.prototype.isNodeLike = goog.dom.isNodeLike;
2793 goog.dom.DomHelper.prototype.isElement = goog.dom.isElement;
2794 goog.dom.DomHelper.prototype.isWindow = goog.dom.isWindow;
2795 goog.dom.DomHelper.prototype.getParentElement = goog.dom.getParentElement;
2796 goog.dom.DomHelper.prototype.contains = goog.dom.contains;
2797 goog.dom.DomHelper.prototype.compareNodeOrder = goog.dom.compareNodeOrder;
2798 goog.dom.DomHelper.prototype.findCommonAncestor = goog.dom.findCommonAncestor;
2799 goog.dom.DomHelper.prototype.getOwnerDocument = goog.dom.getOwnerDocument;
2800 goog.dom.DomHelper.prototype.getFrameContentDocument = goog.dom.getFrameContentDocument;
2801 goog.dom.DomHelper.prototype.getFrameContentWindow = goog.dom.getFrameContentWindow;
2802 goog.dom.DomHelper.prototype.setTextContent = goog.dom.setTextContent;
2803 goog.dom.DomHelper.prototype.getOuterHtml = goog.dom.getOuterHtml;
2804 goog.dom.DomHelper.prototype.findNode = goog.dom.findNode;
2805 goog.dom.DomHelper.prototype.findNodes = goog.dom.findNodes;
2806 goog.dom.DomHelper.prototype.isFocusableTabIndex = goog.dom.isFocusableTabIndex;
2807 goog.dom.DomHelper.prototype.setFocusableTabIndex = goog.dom.setFocusableTabIndex;
2808 goog.dom.DomHelper.prototype.isFocusable = goog.dom.isFocusable;
2809 goog.dom.DomHelper.prototype.getTextContent = goog.dom.getTextContent;
2810 goog.dom.DomHelper.prototype.getNodeTextLength = goog.dom.getNodeTextLength;
2811 goog.dom.DomHelper.prototype.getNodeTextOffset = goog.dom.getNodeTextOffset;
2812 goog.dom.DomHelper.prototype.getNodeAtOffset = goog.dom.getNodeAtOffset;
2813 goog.dom.DomHelper.prototype.isNodeList = goog.dom.isNodeList;
2814 goog.dom.DomHelper.prototype.getAncestorByTagNameAndClass = goog.dom.getAncestorByTagNameAndClass;
2815 goog.dom.DomHelper.prototype.getAncestorByClass = goog.dom.getAncestorByClass;
2816 goog.dom.DomHelper.prototype.getAncestor = goog.dom.getAncestor;
2817 goog.debug.entryPointRegistry = {};
2818 goog.debug.EntryPointMonitor = function() {
2820 goog.debug.entryPointRegistry.refList_ = [];
2821 goog.debug.entryPointRegistry.monitors_ = [];
2822 goog.debug.entryPointRegistry.monitorsMayExist_ = !1;
2823 goog.debug.entryPointRegistry.register = function(callback) {
2824   goog.debug.entryPointRegistry.refList_[goog.debug.entryPointRegistry.refList_.length] = callback;
2825   if (goog.debug.entryPointRegistry.monitorsMayExist_) {
2826     for (var monitors = goog.debug.entryPointRegistry.monitors_, i = 0;i < monitors.length;i++) {
2827       callback(goog.bind(monitors[i].wrap, monitors[i]));
2828     }
2829   }
2831 goog.debug.entryPointRegistry.monitorAll = function(monitor) {
2832   goog.debug.entryPointRegistry.monitorsMayExist_ = !0;
2833   for (var transformer = goog.bind(monitor.wrap, monitor), i = 0;i < goog.debug.entryPointRegistry.refList_.length;i++) {
2834     goog.debug.entryPointRegistry.refList_[i](transformer);
2835   }
2836   goog.debug.entryPointRegistry.monitors_.push(monitor);
2838 goog.debug.entryPointRegistry.unmonitorAllIfPossible = function(monitor) {
2839   var monitors = goog.debug.entryPointRegistry.monitors_;
2840   goog.asserts.assert(monitor == monitors[monitors.length - 1], "Only the most recent monitor can be unwrapped.");
2841   for (var transformer = goog.bind(monitor.unwrap, monitor), i = 0;i < goog.debug.entryPointRegistry.refList_.length;i++) {
2842     goog.debug.entryPointRegistry.refList_[i](transformer);
2843   }
2844   monitors.length--;
2846 goog.disposable = {};
2847 goog.disposable.IDisposable = function() {
2849 goog.Disposable = function() {
2850   goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF && (goog.Disposable.instances_[goog.getUid(this)] = this);
2852 goog.Disposable.MonitoringMode = {OFF:0, PERMANENT:1, INTERACTIVE:2};
2853 goog.Disposable.MONITORING_MODE = 0;
2854 goog.Disposable.INCLUDE_STACK_ON_CREATION = !0;
2855 goog.Disposable.instances_ = {};
2856 goog.Disposable.getUndisposedObjects = function() {
2857   var ret = [], id;
2858   for (id in goog.Disposable.instances_) {
2859     goog.Disposable.instances_.hasOwnProperty(id) && ret.push(goog.Disposable.instances_[Number(id)]);
2860   }
2861   return ret;
2863 goog.Disposable.clearUndisposedObjects = function() {
2864   goog.Disposable.instances_ = {};
2866 goog.Disposable.prototype.disposed_ = !1;
2867 goog.Disposable.prototype.isDisposed = function() {
2868   return this.disposed_;
2870 goog.Disposable.prototype.dispose = function() {
2871   if (!this.disposed_ && (this.disposed_ = !0, this.disposeInternal(), goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF)) {
2872     var uid = goog.getUid(this);
2873     if (goog.Disposable.MONITORING_MODE == goog.Disposable.MonitoringMode.PERMANENT && !goog.Disposable.instances_.hasOwnProperty(uid)) {
2874       throw Error(this + " did not call the goog.Disposable base constructor or was disposed of after a clearUndisposedObjects call");
2875     }
2876     delete goog.Disposable.instances_[uid];
2877   }
2879 goog.Disposable.prototype.disposeInternal = function() {
2880   if (this.onDisposeCallbacks_) {
2881     for (;this.onDisposeCallbacks_.length;) {
2882       this.onDisposeCallbacks_.shift()();
2883     }
2884   }
2886 goog.Disposable.isDisposed = function(obj) {
2887   return obj && "function" == typeof obj.isDisposed ? obj.isDisposed() : !1;
2889 goog.dispose = function(obj) {
2890   obj && "function" == typeof obj.dispose && obj.dispose();
2892 goog.disposeAll = function(var_args) {
2893   for (var i = 0, len = arguments.length;i < len;++i) {
2894     var disposable = arguments[i];
2895     goog.isArrayLike(disposable) ? goog.disposeAll.apply(null, disposable) : goog.dispose(disposable);
2896   }
2898 goog.events = {};
2899 goog.events.EventId = function(eventId) {
2900   this.id = eventId;
2902 goog.events.EventId.prototype.toString = function() {
2903   return this.id;
2905 goog.events.Event = function(type, opt_target) {
2906   this.type = type instanceof goog.events.EventId ? String(type) : type;
2907   this.currentTarget = this.target = opt_target;
2908   this.defaultPrevented = this.propagationStopped_ = !1;
2909   this.returnValue_ = !0;
2911 goog.events.Event.prototype.disposeInternal = function() {
2913 goog.events.Event.prototype.dispose = function() {
2915 goog.events.Event.prototype.stopPropagation = function() {
2916   this.propagationStopped_ = !0;
2918 goog.events.Event.prototype.preventDefault = function() {
2919   this.defaultPrevented = !0;
2920   this.returnValue_ = !1;
2922 goog.events.Event.stopPropagation = function(e) {
2923   e.stopPropagation();
2925 goog.events.Event.preventDefault = function(e) {
2926   e.preventDefault();
2928 goog.reflect = {};
2929 goog.reflect.object = function(type, object) {
2930   return object;
2932 goog.reflect.sinkValue = function(x) {
2933   goog.reflect.sinkValue[" "](x);
2934   return x;
2936 goog.reflect.sinkValue[" "] = goog.nullFunction;
2937 goog.reflect.canAccessProperty = function(obj, prop) {
2938   try {
2939     return goog.reflect.sinkValue(obj[prop]), !0;
2940   } catch (e) {
2941   }
2942   return!1;
2944 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 && 
2945 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 || 
2946 !goog.global.navigator.msMaxTouchPoints)};
2947 goog.events.getVendorPrefixedName_ = function(eventName) {
2948   return goog.userAgent.WEBKIT ? "webkit" + eventName : goog.userAgent.OPERA ? "o" + eventName.toLowerCase() : eventName.toLowerCase();
2950 goog.events.EventType = {CLICK:"click", DBLCLICK:"dblclick", MOUSEDOWN:"mousedown", MOUSEUP:"mouseup", MOUSEOVER:"mouseover", MOUSEOUT:"mouseout", MOUSEMOVE:"mousemove", MOUSEENTER:"mouseenter", MOUSELEAVE:"mouseleave", SELECTSTART:"selectstart", KEYPRESS:"keypress", KEYDOWN:"keydown", KEYUP:"keyup", BLUR:"blur", FOCUS:"focus", DEACTIVATE:"deactivate", FOCUSIN:goog.userAgent.IE ? "focusin" : "DOMFocusIn", FOCUSOUT:goog.userAgent.IE ? "focusout" : "DOMFocusOut", CHANGE:"change", SELECT:"select", SUBMIT:"submit", 
2951 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", ORIENTATIONCHANGE:"orientationchange", 
2952 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"), ANIMATIONITERATION:goog.events.getVendorPrefixedName_("AnimationIteration"), 
2953 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", MSGESTUREHOLD:"MSGestureHold", MSGESTURESTART:"MSGestureStart", MSGESTURETAP:"MSGestureTap", 
2954 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", COMPOSITIONSTART:"compositionstart", COMPOSITIONUPDATE:"compositionupdate", 
2955 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", DOMNODEINSERTEDINTODOCUMENT:"DOMNodeInsertedIntoDocument", 
2956 DOMATTRMODIFIED:"DOMAttrModified", DOMCHARACTERDATAMODIFIED:"DOMCharacterDataModified"};
2957 goog.events.BrowserEvent = function(opt_e, opt_currentTarget) {
2958   goog.events.Event.call(this, opt_e ? opt_e.type : "");
2959   this.relatedTarget = this.currentTarget = this.target = null;
2960   this.charCode = this.keyCode = this.button = this.screenY = this.screenX = this.clientY = this.clientX = this.offsetY = this.offsetX = 0;
2961   this.metaKey = this.shiftKey = this.altKey = this.ctrlKey = !1;
2962   this.event_ = this.state = null;
2963   opt_e && this.init(opt_e, opt_currentTarget);
2965 goog.inherits(goog.events.BrowserEvent, goog.events.Event);
2966 goog.events.BrowserEvent.MouseButton = {LEFT:0, MIDDLE:1, RIGHT:2};
2967 goog.events.BrowserEvent.IEButtonMap = [1, 4, 2];
2968 goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) {
2969   var type = this.type = e.type;
2970   this.target = e.target || e.srcElement;
2971   this.currentTarget = opt_currentTarget;
2972   var relatedTarget = e.relatedTarget;
2973   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);
2974   this.relatedTarget = relatedTarget;
2975   this.offsetX = goog.userAgent.WEBKIT || void 0 !== e.offsetX ? e.offsetX : e.layerX;
2976   this.offsetY = goog.userAgent.WEBKIT || void 0 !== e.offsetY ? e.offsetY : e.layerY;
2977   this.clientX = void 0 !== e.clientX ? e.clientX : e.pageX;
2978   this.clientY = void 0 !== e.clientY ? e.clientY : e.pageY;
2979   this.screenX = e.screenX || 0;
2980   this.screenY = e.screenY || 0;
2981   this.button = e.button;
2982   this.keyCode = e.keyCode || 0;
2983   this.charCode = e.charCode || ("keypress" == type ? e.keyCode : 0);
2984   this.ctrlKey = e.ctrlKey;
2985   this.altKey = e.altKey;
2986   this.shiftKey = e.shiftKey;
2987   this.metaKey = e.metaKey;
2988   this.state = e.state;
2989   this.event_ = e;
2990   e.defaultPrevented && this.preventDefault();
2992 goog.events.BrowserEvent.prototype.stopPropagation = function() {
2993   goog.events.BrowserEvent.superClass_.stopPropagation.call(this);
2994   this.event_.stopPropagation ? this.event_.stopPropagation() : this.event_.cancelBubble = !0;
2996 goog.events.BrowserEvent.prototype.preventDefault = function() {
2997   goog.events.BrowserEvent.superClass_.preventDefault.call(this);
2998   var be = this.event_;
2999   if (be.preventDefault) {
3000     be.preventDefault();
3001   } else {
3002     if (be.returnValue = !1, goog.events.BrowserFeature.SET_KEY_CODE_TO_PREVENT_DEFAULT) {
3003       try {
3004         if (be.ctrlKey || 112 <= be.keyCode && 123 >= be.keyCode) {
3005           be.keyCode = -1;
3006         }
3007       } catch (ex) {
3008       }
3009     }
3010   }
3012 goog.events.BrowserEvent.prototype.disposeInternal = function() {
3014 goog.events.Listenable = function() {
3016 goog.events.Listenable.IMPLEMENTED_BY_PROP = "closure_listenable_" + (1E6 * Math.random() | 0);
3017 goog.events.Listenable.addImplementation = function(cls) {
3018   cls.prototype[goog.events.Listenable.IMPLEMENTED_BY_PROP] = !0;
3020 goog.events.Listenable.isImplementedBy = function(obj) {
3021   try {
3022     return!(!obj || !obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]);
3023   } catch (e) {
3024     return!1;
3025   }
3027 goog.events.ListenableKey = function() {
3029 goog.events.ListenableKey.counter_ = 0;
3030 goog.events.ListenableKey.reserveKey = function() {
3031   return++goog.events.ListenableKey.counter_;
3033 goog.events.Listener = function(listener, proxy, src, type, capture, opt_handler) {
3034   this.listener = listener;
3035   this.proxy = proxy;
3036   this.src = src;
3037   this.type = type;
3038   this.capture = !!capture;
3039   this.handler = opt_handler;
3040   this.key = goog.events.ListenableKey.reserveKey();
3041   this.removed = this.callOnce = !1;
3043 goog.events.Listener.ENABLE_MONITORING = !1;
3044 goog.events.Listener.prototype.markAsRemoved = function() {
3045   this.removed = !0;
3046   this.handler = this.src = this.proxy = this.listener = null;
3048 goog.events.ListenerMap = function(src) {
3049   this.src = src;
3050   this.listeners = {};
3051   this.typeCount_ = 0;
3053 goog.events.ListenerMap.prototype.getTypeCount = function() {
3054   return this.typeCount_;
3056 goog.events.ListenerMap.prototype.add = function(type, listener, callOnce, opt_useCapture, opt_listenerScope) {
3057   var typeStr = type.toString(), listenerArray = this.listeners[typeStr];
3058   listenerArray || (listenerArray = this.listeners[typeStr] = [], this.typeCount_++);
3059   var listenerObj, index = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, opt_useCapture, opt_listenerScope);
3060   -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));
3061   return listenerObj;
3063 goog.events.ListenerMap.prototype.remove = function(type, listener, opt_useCapture, opt_listenerScope) {
3064   var typeStr = type.toString();
3065   if (!(typeStr in this.listeners)) {
3066     return!1;
3067   }
3068   var listenerArray = this.listeners[typeStr], index = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, opt_useCapture, opt_listenerScope);
3069   if (-1 < index) {
3070     var listenerObj = listenerArray[index];
3071     listenerObj.markAsRemoved();
3072     goog.array.removeAt(listenerArray, index);
3073     0 == listenerArray.length && (delete this.listeners[typeStr], this.typeCount_--);
3074     return!0;
3075   }
3076   return!1;
3078 goog.events.ListenerMap.prototype.removeByKey = function(listener) {
3079   var type = listener.type;
3080   if (!(type in this.listeners)) {
3081     return!1;
3082   }
3083   var removed = goog.array.remove(this.listeners[type], listener);
3084   removed && (listener.markAsRemoved(), 0 == this.listeners[type].length && (delete this.listeners[type], this.typeCount_--));
3085   return removed;
3087 goog.events.ListenerMap.prototype.removeAll = function(opt_type) {
3088   var typeStr = opt_type && opt_type.toString(), count = 0, type;
3089   for (type in this.listeners) {
3090     if (!typeStr || type == typeStr) {
3091       for (var listenerArray = this.listeners[type], i = 0;i < listenerArray.length;i++) {
3092         ++count, listenerArray[i].markAsRemoved();
3093       }
3094       delete this.listeners[type];
3095       this.typeCount_--;
3096     }
3097   }
3098   return count;
3100 goog.events.ListenerMap.prototype.getListeners = function(type, capture) {
3101   var listenerArray = this.listeners[type.toString()], rv = [];
3102   if (listenerArray) {
3103     for (var i = 0;i < listenerArray.length;++i) {
3104       var listenerObj = listenerArray[i];
3105       listenerObj.capture == capture && rv.push(listenerObj);
3106     }
3107   }
3108   return rv;
3110 goog.events.ListenerMap.prototype.getListener = function(type, listener, capture, opt_listenerScope) {
3111   var listenerArray = this.listeners[type.toString()], i = -1;
3112   listenerArray && (i = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, capture, opt_listenerScope));
3113   return-1 < i ? listenerArray[i] : null;
3115 goog.events.ListenerMap.prototype.hasListener = function(opt_type, opt_capture) {
3116   var hasType = goog.isDef(opt_type), typeStr = hasType ? opt_type.toString() : "", hasCapture = goog.isDef(opt_capture);
3117   return goog.object.some(this.listeners, function(listenerArray) {
3118     for (var i = 0;i < listenerArray.length;++i) {
3119       if (!(hasType && listenerArray[i].type != typeStr || hasCapture && listenerArray[i].capture != opt_capture)) {
3120         return!0;
3121       }
3122     }
3123     return!1;
3124   });
3126 goog.events.ListenerMap.findListenerIndex_ = function(listenerArray, listener, opt_useCapture, opt_listenerScope) {
3127   for (var i = 0;i < listenerArray.length;++i) {
3128     var listenerObj = listenerArray[i];
3129     if (!listenerObj.removed && listenerObj.listener == listener && listenerObj.capture == !!opt_useCapture && listenerObj.handler == opt_listenerScope) {
3130       return i;
3131     }
3132   }
3133   return-1;
3135 goog.events.listeners_ = {};
3136 goog.events.LISTENER_MAP_PROP_ = "closure_lm_" + (1E6 * Math.random() | 0);
3137 goog.events.onString_ = "on";
3138 goog.events.onStringMap_ = {};
3139 goog.events.CaptureSimulationMode = {OFF_AND_FAIL:0, OFF_AND_SILENT:1, ON:2};
3140 goog.events.CAPTURE_SIMULATION_MODE = 2;
3141 goog.events.listenerCountEstimate_ = 0;
3142 goog.events.listen = function(src, type, listener, opt_capt, opt_handler) {
3143   if (goog.isArray(type)) {
3144     for (var i = 0;i < type.length;i++) {
3145       goog.events.listen(src, type[i], listener, opt_capt, opt_handler);
3146     }
3147     return null;
3148   }
3149   listener = goog.events.wrapListener(listener);
3150   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);
3152 goog.events.listen_ = function(src, type, listener, callOnce, opt_capt, opt_handler) {
3153   if (!type) {
3154     throw Error("Invalid event type");
3155   }
3156   var capture = !!opt_capt;
3157   if (capture && !goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {
3158     if (goog.events.CAPTURE_SIMULATION_MODE == goog.events.CaptureSimulationMode.OFF_AND_FAIL) {
3159       return goog.asserts.fail("Can not register capture listener in IE8-."), null;
3160     }
3161     if (goog.events.CAPTURE_SIMULATION_MODE == goog.events.CaptureSimulationMode.OFF_AND_SILENT) {
3162       return null;
3163     }
3164   }
3165   var listenerMap = goog.events.getListenerMap_(src);
3166   listenerMap || (src[goog.events.LISTENER_MAP_PROP_] = listenerMap = new goog.events.ListenerMap(src));
3167   var listenerObj = listenerMap.add(type, listener, callOnce, opt_capt, opt_handler);
3168   if (listenerObj.proxy) {
3169     return listenerObj;
3170   }
3171   var proxy = goog.events.getProxy();
3172   listenerObj.proxy = proxy;
3173   proxy.src = src;
3174   proxy.listener = listenerObj;
3175   src.addEventListener ? src.addEventListener(type.toString(), proxy, capture) : src.attachEvent(goog.events.getOnString_(type.toString()), proxy);
3176   goog.events.listenerCountEstimate_++;
3177   return listenerObj;
3179 goog.events.getProxy = function() {
3180   var proxyCallbackFunction = goog.events.handleBrowserEvent_, f = goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT ? function(eventObject) {
3181     return proxyCallbackFunction.call(f.src, f.listener, eventObject);
3182   } : function(eventObject) {
3183     var v = proxyCallbackFunction.call(f.src, f.listener, eventObject);
3184     if (!v) {
3185       return v;
3186     }
3187   };
3188   return f;
3190 goog.events.listenOnce = function(src, type, listener, opt_capt, opt_handler) {
3191   if (goog.isArray(type)) {
3192     for (var i = 0;i < type.length;i++) {
3193       goog.events.listenOnce(src, type[i], listener, opt_capt, opt_handler);
3194     }
3195     return null;
3196   }
3197   listener = goog.events.wrapListener(listener);
3198   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);
3200 goog.events.listenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) {
3201   wrapper.listen(src, listener, opt_capt, opt_handler);
3203 goog.events.unlisten = function(src, type, listener, opt_capt, opt_handler) {
3204   if (goog.isArray(type)) {
3205     for (var i = 0;i < type.length;i++) {
3206       goog.events.unlisten(src, type[i], listener, opt_capt, opt_handler);
3207     }
3208     return null;
3209   }
3210   listener = goog.events.wrapListener(listener);
3211   if (goog.events.Listenable.isImplementedBy(src)) {
3212     return src.unlisten(type, listener, opt_capt, opt_handler);
3213   }
3214   if (!src) {
3215     return!1;
3216   }
3217   var capture = !!opt_capt, listenerMap = goog.events.getListenerMap_(src);
3218   if (listenerMap) {
3219     var listenerObj = listenerMap.getListener(type, listener, capture, opt_handler);
3220     if (listenerObj) {
3221       return goog.events.unlistenByKey(listenerObj);
3222     }
3223   }
3224   return!1;
3226 goog.events.unlistenByKey = function(key) {
3227   if (goog.isNumber(key)) {
3228     return!1;
3229   }
3230   var listener = key;
3231   if (!listener || listener.removed) {
3232     return!1;
3233   }
3234   var src = listener.src;
3235   if (goog.events.Listenable.isImplementedBy(src)) {
3236     return src.unlistenByKey(listener);
3237   }
3238   var type = listener.type, proxy = listener.proxy;
3239   src.removeEventListener ? src.removeEventListener(type, proxy, listener.capture) : src.detachEvent && src.detachEvent(goog.events.getOnString_(type), proxy);
3240   goog.events.listenerCountEstimate_--;
3241   var listenerMap = goog.events.getListenerMap_(src);
3242   listenerMap ? (listenerMap.removeByKey(listener), 0 == listenerMap.getTypeCount() && (listenerMap.src = null, src[goog.events.LISTENER_MAP_PROP_] = null)) : listener.markAsRemoved();
3243   return!0;
3245 goog.events.unlistenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) {
3246   wrapper.unlisten(src, listener, opt_capt, opt_handler);
3248 goog.events.removeAll = function(opt_obj, opt_type) {
3249   if (!opt_obj) {
3250     return 0;
3251   }
3252   if (goog.events.Listenable.isImplementedBy(opt_obj)) {
3253     return opt_obj.removeAllListeners(opt_type);
3254   }
3255   var listenerMap = goog.events.getListenerMap_(opt_obj);
3256   if (!listenerMap) {
3257     return 0;
3258   }
3259   var count = 0, typeStr = opt_type && opt_type.toString(), type;
3260   for (type in listenerMap.listeners) {
3261     if (!typeStr || type == typeStr) {
3262       for (var listeners = goog.array.clone(listenerMap.listeners[type]), i = 0;i < listeners.length;++i) {
3263         goog.events.unlistenByKey(listeners[i]) && ++count;
3264       }
3265     }
3266   }
3267   return count;
3269 goog.events.removeAllNativeListeners = function() {
3270   return goog.events.listenerCountEstimate_ = 0;
3272 goog.events.getListeners = function(obj, type, capture) {
3273   if (goog.events.Listenable.isImplementedBy(obj)) {
3274     return obj.getListeners(type, capture);
3275   }
3276   if (!obj) {
3277     return[];
3278   }
3279   var listenerMap = goog.events.getListenerMap_(obj);
3280   return listenerMap ? listenerMap.getListeners(type, capture) : [];
3282 goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) {
3283   listener = goog.events.wrapListener(listener);
3284   var capture = !!opt_capt;
3285   if (goog.events.Listenable.isImplementedBy(src)) {
3286     return src.getListener(type, listener, capture, opt_handler);
3287   }
3288   if (!src) {
3289     return null;
3290   }
3291   var listenerMap = goog.events.getListenerMap_(src);
3292   return listenerMap ? listenerMap.getListener(type, listener, capture, opt_handler) : null;
3294 goog.events.hasListener = function(obj, opt_type, opt_capture) {
3295   if (goog.events.Listenable.isImplementedBy(obj)) {
3296     return obj.hasListener(opt_type, opt_capture);
3297   }
3298   var listenerMap = goog.events.getListenerMap_(obj);
3299   return!!listenerMap && listenerMap.hasListener(opt_type, opt_capture);
3301 goog.events.expose = function(e) {
3302   var str = [], key;
3303   for (key in e) {
3304     e[key] && e[key].id ? str.push(key + " = " + e[key] + " (" + e[key].id + ")") : str.push(key + " = " + e[key]);
3305   }
3306   return str.join("\n");
3308 goog.events.getOnString_ = function(type) {
3309   return type in goog.events.onStringMap_ ? goog.events.onStringMap_[type] : goog.events.onStringMap_[type] = goog.events.onString_ + type;
3311 goog.events.fireListeners = function(obj, type, capture, eventObject) {
3312   return goog.events.Listenable.isImplementedBy(obj) ? obj.fireListeners(type, capture, eventObject) : goog.events.fireListeners_(obj, type, capture, eventObject);
3314 goog.events.fireListeners_ = function(obj, type, capture, eventObject) {
3315   var retval = 1, listenerMap = goog.events.getListenerMap_(obj);
3316   if (listenerMap) {
3317     var listenerArray = listenerMap.listeners[type.toString()];
3318     if (listenerArray) {
3319       for (var listenerArray = goog.array.clone(listenerArray), i = 0;i < listenerArray.length;i++) {
3320         var listener = listenerArray[i];
3321         listener && listener.capture == capture && !listener.removed && (retval &= !1 !== goog.events.fireListener(listener, eventObject));
3322       }
3323     }
3324   }
3325   return Boolean(retval);
3327 goog.events.fireListener = function(listener, eventObject) {
3328   var listenerFn = listener.listener, listenerHandler = listener.handler || listener.src;
3329   listener.callOnce && goog.events.unlistenByKey(listener);
3330   return listenerFn.call(listenerHandler, eventObject);
3332 goog.events.getTotalListenerCount = function() {
3333   return goog.events.listenerCountEstimate_;
3335 goog.events.dispatchEvent = function(src, e) {
3336   goog.asserts.assert(goog.events.Listenable.isImplementedBy(src), "Can not use goog.events.dispatchEvent with non-goog.events.Listenable instance.");
3337   return src.dispatchEvent(e);
3339 goog.events.protectBrowserEventEntryPoint = function(errorHandler) {
3340   goog.events.handleBrowserEvent_ = errorHandler.protectEntryPoint(goog.events.handleBrowserEvent_);
3342 goog.events.handleBrowserEvent_ = function(listener, opt_evt) {
3343   if (listener.removed) {
3344     return!0;
3345   }
3346   if (!goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {
3347     var ieEvent = opt_evt || goog.getObjectByName("window.event"), evt = new goog.events.BrowserEvent(ieEvent, this), retval = !0;
3348     if (goog.events.CAPTURE_SIMULATION_MODE == goog.events.CaptureSimulationMode.ON) {
3349       if (!goog.events.isMarkedIeEvent_(ieEvent)) {
3350         goog.events.markIeEvent_(ieEvent);
3351         for (var ancestors = [], parent = evt.currentTarget;parent;parent = parent.parentNode) {
3352           ancestors.push(parent);
3353         }
3354         for (var type = listener.type, i = ancestors.length - 1;!evt.propagationStopped_ && 0 <= i;i--) {
3355           evt.currentTarget = ancestors[i], retval &= goog.events.fireListeners_(ancestors[i], type, !0, evt);
3356         }
3357         for (i = 0;!evt.propagationStopped_ && i < ancestors.length;i++) {
3358           evt.currentTarget = ancestors[i], retval &= goog.events.fireListeners_(ancestors[i], type, !1, evt);
3359         }
3360       }
3361     } else {
3362       retval = goog.events.fireListener(listener, evt);
3363     }
3364     return retval;
3365   }
3366   return goog.events.fireListener(listener, new goog.events.BrowserEvent(opt_evt, this));
3368 goog.events.markIeEvent_ = function(e) {
3369   var useReturnValue = !1;
3370   if (0 == e.keyCode) {
3371     try {
3372       e.keyCode = -1;
3373       return;
3374     } catch (ex) {
3375       useReturnValue = !0;
3376     }
3377   }
3378   if (useReturnValue || void 0 == e.returnValue) {
3379     e.returnValue = !0;
3380   }
3382 goog.events.isMarkedIeEvent_ = function(e) {
3383   return 0 > e.keyCode || void 0 != e.returnValue;
3385 goog.events.uniqueIdCounter_ = 0;
3386 goog.events.getUniqueId = function(identifier) {
3387   return identifier + "_" + goog.events.uniqueIdCounter_++;
3389 goog.events.getListenerMap_ = function(src) {
3390   var listenerMap = src[goog.events.LISTENER_MAP_PROP_];
3391   return listenerMap instanceof goog.events.ListenerMap ? listenerMap : null;
3393 goog.events.LISTENER_WRAPPER_PROP_ = "__closure_events_fn_" + (1E9 * Math.random() >>> 0);
3394 goog.events.wrapListener = function(listener) {
3395   goog.asserts.assert(listener, "Listener can not be null.");
3396   if (goog.isFunction(listener)) {
3397     return listener;
3398   }
3399   goog.asserts.assert(listener.handleEvent, "An object listener must have handleEvent method.");
3400   return listener[goog.events.LISTENER_WRAPPER_PROP_] || (listener[goog.events.LISTENER_WRAPPER_PROP_] = function(e) {
3401     return listener.handleEvent(e);
3402   });
3404 goog.debug.entryPointRegistry.register(function(transformer) {
3405   goog.events.handleBrowserEvent_ = transformer(goog.events.handleBrowserEvent_);
3407 goog.events.EventTarget = function() {
3408   goog.Disposable.call(this);
3409   this.eventTargetListeners_ = new goog.events.ListenerMap(this);
3410   this.actualEventTarget_ = this;
3412 goog.inherits(goog.events.EventTarget, goog.Disposable);
3413 goog.events.Listenable.addImplementation(goog.events.EventTarget);
3414 goog.events.EventTarget.MAX_ANCESTORS_ = 1E3;
3415 goog.events.EventTarget.prototype.parentEventTarget_ = null;
3416 goog.events.EventTarget.prototype.getParentEventTarget = function() {
3417   return this.parentEventTarget_;
3419 goog.events.EventTarget.prototype.addEventListener = function(type, handler, opt_capture, opt_handlerScope) {
3420   goog.events.listen(this, type, handler, opt_capture, opt_handlerScope);
3422 goog.events.EventTarget.prototype.removeEventListener = function(type, handler, opt_capture, opt_handlerScope) {
3423   goog.events.unlisten(this, type, handler, opt_capture, opt_handlerScope);
3425 goog.events.EventTarget.prototype.dispatchEvent = function(e) {
3426   this.assertInitialized_();
3427   var ancestorsTree, ancestor = this.getParentEventTarget();
3428   if (ancestor) {
3429     ancestorsTree = [];
3430     for (var ancestorCount = 1;ancestor;ancestor = ancestor.getParentEventTarget()) {
3431       ancestorsTree.push(ancestor), goog.asserts.assert(++ancestorCount < goog.events.EventTarget.MAX_ANCESTORS_, "infinite loop");
3432     }
3433   }
3434   return goog.events.EventTarget.dispatchEventInternal_(this.actualEventTarget_, e, ancestorsTree);
3436 goog.events.EventTarget.prototype.disposeInternal = function() {
3437   goog.events.EventTarget.superClass_.disposeInternal.call(this);
3438   this.removeAllListeners();
3439   this.parentEventTarget_ = null;
3441 goog.events.EventTarget.prototype.listen = function(type, listener, opt_useCapture, opt_listenerScope) {
3442   this.assertInitialized_();
3443   return this.eventTargetListeners_.add(String(type), listener, !1, opt_useCapture, opt_listenerScope);
3445 goog.events.EventTarget.prototype.listenOnce = function(type, listener, opt_useCapture, opt_listenerScope) {
3446   return this.eventTargetListeners_.add(String(type), listener, !0, opt_useCapture, opt_listenerScope);
3448 goog.events.EventTarget.prototype.unlisten = function(type, listener, opt_useCapture, opt_listenerScope) {
3449   return this.eventTargetListeners_.remove(String(type), listener, opt_useCapture, opt_listenerScope);
3451 goog.events.EventTarget.prototype.unlistenByKey = function(key) {
3452   return this.eventTargetListeners_.removeByKey(key);
3454 goog.events.EventTarget.prototype.removeAllListeners = function(opt_type) {
3455   return this.eventTargetListeners_ ? this.eventTargetListeners_.removeAll(opt_type) : 0;
3457 goog.events.EventTarget.prototype.fireListeners = function(type, capture, eventObject) {
3458   var listenerArray = this.eventTargetListeners_.listeners[String(type)];
3459   if (!listenerArray) {
3460     return!0;
3461   }
3462   for (var listenerArray = goog.array.clone(listenerArray), rv = !0, i = 0;i < listenerArray.length;++i) {
3463     var listener = listenerArray[i];
3464     if (listener && !listener.removed && listener.capture == capture) {
3465       var listenerFn = listener.listener, listenerHandler = listener.handler || listener.src;
3466       listener.callOnce && this.unlistenByKey(listener);
3467       rv = !1 !== listenerFn.call(listenerHandler, eventObject) && rv;
3468     }
3469   }
3470   return rv && !1 != eventObject.returnValue_;
3472 goog.events.EventTarget.prototype.getListeners = function(type, capture) {
3473   return this.eventTargetListeners_.getListeners(String(type), capture);
3475 goog.events.EventTarget.prototype.getListener = function(type, listener, capture, opt_listenerScope) {
3476   return this.eventTargetListeners_.getListener(String(type), listener, capture, opt_listenerScope);
3478 goog.events.EventTarget.prototype.hasListener = function(opt_type, opt_capture) {
3479   var id = goog.isDef(opt_type) ? String(opt_type) : void 0;
3480   return this.eventTargetListeners_.hasListener(id, opt_capture);
3482 goog.events.EventTarget.prototype.assertInitialized_ = function() {
3483   goog.asserts.assert(this.eventTargetListeners_, "Event target is not initialized. Did you call the superclass (goog.events.EventTarget) constructor?");
3485 goog.events.EventTarget.dispatchEventInternal_ = function(target, e, opt_ancestorsTree) {
3486   var type = e.type || e;
3487   if (goog.isString(e)) {
3488     e = new goog.events.Event(e, target);
3489   } else {
3490     if (e instanceof goog.events.Event) {
3491       e.target = e.target || target;
3492     } else {
3493       var oldEvent = e;
3494       e = new goog.events.Event(type, target);
3495       goog.object.extend(e, oldEvent);
3496     }
3497   }
3498   var rv = !0, currentTarget;
3499   if (opt_ancestorsTree) {
3500     for (var i = opt_ancestorsTree.length - 1;!e.propagationStopped_ && 0 <= i;i--) {
3501       currentTarget = e.currentTarget = opt_ancestorsTree[i], rv = currentTarget.fireListeners(type, !0, e) && rv;
3502     }
3503   }
3504   e.propagationStopped_ || (currentTarget = e.currentTarget = target, rv = currentTarget.fireListeners(type, !0, e) && rv, e.propagationStopped_ || (rv = currentTarget.fireListeners(type, !1, e) && rv));
3505   if (opt_ancestorsTree) {
3506     for (i = 0;!e.propagationStopped_ && i < opt_ancestorsTree.length;i++) {
3507       currentTarget = e.currentTarget = opt_ancestorsTree[i], rv = currentTarget.fireListeners(type, !1, e) && rv;
3508     }
3509   }
3510   return rv;
3512 goog.json = {};
3513 goog.json.USE_NATIVE_JSON = !1;
3514 goog.json.isValid_ = function(s) {
3515   if (/^\s*$/.test(s)) {
3516     return!1;
3517   }
3518   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]*$/;
3519   return remainderRe.test(s.replace(backslashesRe, "@").replace(simpleValuesRe, "]").replace(openBracketsRe, ""));
3521 goog.json.parse = goog.json.USE_NATIVE_JSON ? goog.global.JSON.parse : function(s) {
3522   var o = String(s);
3523   if (goog.json.isValid_(o)) {
3524     try {
3525       return eval("(" + o + ")");
3526     } catch (ex) {
3527     }
3528   }
3529   throw Error("Invalid JSON string: " + o);
3531 goog.json.unsafeParse = goog.json.USE_NATIVE_JSON ? goog.global.JSON.parse : function(s) {
3532   return eval("(" + s + ")");
3534 goog.json.serialize = goog.json.USE_NATIVE_JSON ? goog.global.JSON.stringify : function(object, opt_replacer) {
3535   return(new goog.json.Serializer(opt_replacer)).serialize(object);
3537 goog.json.Serializer = function(opt_replacer) {
3538   this.replacer_ = opt_replacer;
3540 goog.json.Serializer.prototype.serialize = function(object) {
3541   var sb = [];
3542   this.serializeInternal(object, sb);
3543   return sb.join("");
3545 goog.json.Serializer.prototype.serializeInternal = function(object, sb) {
3546   switch(typeof object) {
3547     case "string":
3548       this.serializeString_(object, sb);
3549       break;
3550     case "number":
3551       this.serializeNumber_(object, sb);
3552       break;
3553     case "boolean":
3554       sb.push(object);
3555       break;
3556     case "undefined":
3557       sb.push("null");
3558       break;
3559     case "object":
3560       if (null == object) {
3561         sb.push("null");
3562         break;
3563       }
3564       if (goog.isArray(object)) {
3565         this.serializeArray(object, sb);
3566         break;
3567       }
3568       this.serializeObject_(object, sb);
3569       break;
3570     case "function":
3571       break;
3572     default:
3573       throw Error("Unknown type: " + typeof object);;
3574   }
3576 goog.json.Serializer.charToJsonCharCache_ = {'"':'\\"', "\\":"\\\\", "/":"\\/", "\b":"\\b", "\f":"\\f", "\n":"\\n", "\r":"\\r", "\t":"\\t", "\x0B":"\\u000b"};
3577 goog.json.Serializer.charsToReplace_ = /\uffff/.test("\uffff") ? /[\\\"\x00-\x1f\x7f-\uffff]/g : /[\\\"\x00-\x1f\x7f-\xff]/g;
3578 goog.json.Serializer.prototype.serializeString_ = function(s, sb) {
3579   sb.push('"', s.replace(goog.json.Serializer.charsToReplace_, function(c) {
3580     if (c in goog.json.Serializer.charToJsonCharCache_) {
3581       return goog.json.Serializer.charToJsonCharCache_[c];
3582     }
3583     var cc = c.charCodeAt(0), rv = "\\u";
3584     16 > cc ? rv += "000" : 256 > cc ? rv += "00" : 4096 > cc && (rv += "0");
3585     return goog.json.Serializer.charToJsonCharCache_[c] = rv + cc.toString(16);
3586   }), '"');
3588 goog.json.Serializer.prototype.serializeNumber_ = function(n, sb) {
3589   sb.push(isFinite(n) && !isNaN(n) ? n : "null");
3591 goog.json.Serializer.prototype.serializeArray = function(arr, sb) {
3592   var l = arr.length;
3593   sb.push("[");
3594   for (var sep = "", i = 0;i < l;i++) {
3595     sb.push(sep);
3596     var value = arr[i];
3597     this.serializeInternal(this.replacer_ ? this.replacer_.call(arr, String(i), value) : value, sb);
3598     sep = ",";
3599   }
3600   sb.push("]");
3602 goog.json.Serializer.prototype.serializeObject_ = function(obj, sb) {
3603   sb.push("{");
3604   var sep = "", key;
3605   for (key in obj) {
3606     if (Object.prototype.hasOwnProperty.call(obj, key)) {
3607       var value = obj[key];
3608       "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 = ",");
3609     }
3610   }
3611   sb.push("}");
3613 goog.structs = {};
3614 goog.structs.Collection = function() {
3616 goog.iter = {};
3617 goog.iter.StopIteration = "StopIteration" in goog.global ? goog.global.StopIteration : Error("StopIteration");
3618 goog.iter.Iterator = function() {
3620 goog.iter.Iterator.prototype.next = function() {
3621   throw goog.iter.StopIteration;
3623 goog.iter.Iterator.prototype.__iterator__ = function() {
3624   return this;
3626 goog.iter.toIterator = function(iterable) {
3627   if (iterable instanceof goog.iter.Iterator) {
3628     return iterable;
3629   }
3630   if ("function" == typeof iterable.__iterator__) {
3631     return iterable.__iterator__(!1);
3632   }
3633   if (goog.isArrayLike(iterable)) {
3634     var i = 0, newIter = new goog.iter.Iterator;
3635     newIter.next = function() {
3636       for (;;) {
3637         if (i >= iterable.length) {
3638           throw goog.iter.StopIteration;
3639         }
3640         if (i in iterable) {
3641           return iterable[i++];
3642         }
3643         i++;
3644       }
3645     };
3646     return newIter;
3647   }
3648   throw Error("Not implemented");
3650 goog.iter.forEach = function(iterable, f, opt_obj) {
3651   if (goog.isArrayLike(iterable)) {
3652     try {
3653       goog.array.forEach(iterable, f, opt_obj);
3654     } catch (ex) {
3655       if (ex !== goog.iter.StopIteration) {
3656         throw ex;
3657       }
3658     }
3659   } else {
3660     iterable = goog.iter.toIterator(iterable);
3661     try {
3662       for (;;) {
3663         f.call(opt_obj, iterable.next(), void 0, iterable);
3664       }
3665     } catch (ex$$0) {
3666       if (ex$$0 !== goog.iter.StopIteration) {
3667         throw ex$$0;
3668       }
3669     }
3670   }
3672 goog.iter.filter = function(iterable, f, opt_obj) {
3673   var iterator = goog.iter.toIterator(iterable), newIter = new goog.iter.Iterator;
3674   newIter.next = function() {
3675     for (;;) {
3676       var val = iterator.next();
3677       if (f.call(opt_obj, val, void 0, iterator)) {
3678         return val;
3679       }
3680     }
3681   };
3682   return newIter;
3684 goog.iter.filterFalse = function(iterable, f, opt_obj) {
3685   return goog.iter.filter(iterable, goog.functions.not(f), opt_obj);
3687 goog.iter.range = function(startOrStop, opt_stop, opt_step) {
3688   var start = 0, stop = startOrStop, step = opt_step || 1;
3689   1 < arguments.length && (start = startOrStop, stop = opt_stop);
3690   if (0 == step) {
3691     throw Error("Range step argument must not be zero");
3692   }
3693   var newIter = new goog.iter.Iterator;
3694   newIter.next = function() {
3695     if (0 < step && start >= stop || 0 > step && start <= stop) {
3696       throw goog.iter.StopIteration;
3697     }
3698     var rv = start;
3699     start += step;
3700     return rv;
3701   };
3702   return newIter;
3704 goog.iter.join = function(iterable, deliminator) {
3705   return goog.iter.toArray(iterable).join(deliminator);
3707 goog.iter.map = function(iterable, f, opt_obj) {
3708   var iterator = goog.iter.toIterator(iterable), newIter = new goog.iter.Iterator;
3709   newIter.next = function() {
3710     var val = iterator.next();
3711     return f.call(opt_obj, val, void 0, iterator);
3712   };
3713   return newIter;
3715 goog.iter.reduce = function(iterable, f, val$$0, opt_obj) {
3716   var rval = val$$0;
3717   goog.iter.forEach(iterable, function(val) {
3718     rval = f.call(opt_obj, rval, val);
3719   });
3720   return rval;
3722 goog.iter.some = function(iterable, f, opt_obj) {
3723   iterable = goog.iter.toIterator(iterable);
3724   try {
3725     for (;;) {
3726       if (f.call(opt_obj, iterable.next(), void 0, iterable)) {
3727         return!0;
3728       }
3729     }
3730   } catch (ex) {
3731     if (ex !== goog.iter.StopIteration) {
3732       throw ex;
3733     }
3734   }
3735   return!1;
3737 goog.iter.every = function(iterable, f, opt_obj) {
3738   iterable = goog.iter.toIterator(iterable);
3739   try {
3740     for (;;) {
3741       if (!f.call(opt_obj, iterable.next(), void 0, iterable)) {
3742         return!1;
3743       }
3744     }
3745   } catch (ex) {
3746     if (ex !== goog.iter.StopIteration) {
3747       throw ex;
3748     }
3749   }
3750   return!0;
3752 goog.iter.chain = function(var_args) {
3753   var iterator = goog.iter.toIterator(arguments), iter = new goog.iter.Iterator, current = null;
3754   iter.next = function() {
3755     for (;;) {
3756       if (null == current) {
3757         var it = iterator.next();
3758         current = goog.iter.toIterator(it);
3759       }
3760       try {
3761         return current.next();
3762       } catch (ex) {
3763         if (ex !== goog.iter.StopIteration) {
3764           throw ex;
3765         }
3766         current = null;
3767       }
3768     }
3769   };
3770   return iter;
3772 goog.iter.chainFromIterable = function(iterable) {
3773   return goog.iter.chain.apply(void 0, iterable);
3775 goog.iter.dropWhile = function(iterable, f, opt_obj) {
3776   var iterator = goog.iter.toIterator(iterable), newIter = new goog.iter.Iterator, dropping = !0;
3777   newIter.next = function() {
3778     for (;;) {
3779       var val = iterator.next();
3780       if (!dropping || !f.call(opt_obj, val, void 0, iterator)) {
3781         return dropping = !1, val;
3782       }
3783     }
3784   };
3785   return newIter;
3787 goog.iter.takeWhile = function(iterable, f, opt_obj) {
3788   var iterator = goog.iter.toIterator(iterable), newIter = new goog.iter.Iterator, taking = !0;
3789   newIter.next = function() {
3790     for (;;) {
3791       if (taking) {
3792         var val = iterator.next();
3793         if (f.call(opt_obj, val, void 0, iterator)) {
3794           return val;
3795         }
3796         taking = !1;
3797       } else {
3798         throw goog.iter.StopIteration;
3799       }
3800     }
3801   };
3802   return newIter;
3804 goog.iter.toArray = function(iterable) {
3805   if (goog.isArrayLike(iterable)) {
3806     return goog.array.toArray(iterable);
3807   }
3808   iterable = goog.iter.toIterator(iterable);
3809   var array = [];
3810   goog.iter.forEach(iterable, function(val) {
3811     array.push(val);
3812   });
3813   return array;
3815 goog.iter.equals = function(iterable1, iterable2) {
3816   var fillValue = {}, pairs = goog.iter.zipLongest(fillValue, iterable1, iterable2);
3817   return goog.iter.every(pairs, function(pair) {
3818     return pair[0] == pair[1];
3819   });
3821 goog.iter.nextOrValue = function(iterable, defaultValue) {
3822   try {
3823     return goog.iter.toIterator(iterable).next();
3824   } catch (e) {
3825     if (e != goog.iter.StopIteration) {
3826       throw e;
3827     }
3828     return defaultValue;
3829   }
3831 goog.iter.product = function(var_args) {
3832   var someArrayEmpty = goog.array.some(arguments, function(arr) {
3833     return!arr.length;
3834   });
3835   if (someArrayEmpty || !arguments.length) {
3836     return new goog.iter.Iterator;
3837   }
3838   var iter = new goog.iter.Iterator, arrays = arguments, indicies = goog.array.repeat(0, arrays.length);
3839   iter.next = function() {
3840     if (indicies) {
3841       for (var retVal = goog.array.map(indicies, function(valueIndex, arrayIndex) {
3842         return arrays[arrayIndex][valueIndex];
3843       }), i = indicies.length - 1;0 <= i;i--) {
3844         goog.asserts.assert(indicies);
3845         if (indicies[i] < arrays[i].length - 1) {
3846           indicies[i]++;
3847           break;
3848         }
3849         if (0 == i) {
3850           indicies = null;
3851           break;
3852         }
3853         indicies[i] = 0;
3854       }
3855       return retVal;
3856     }
3857     throw goog.iter.StopIteration;
3858   };
3859   return iter;
3861 goog.iter.cycle = function(iterable) {
3862   var baseIterator = goog.iter.toIterator(iterable), cache = [], cacheIndex = 0, iter = new goog.iter.Iterator, useCache = !1;
3863   iter.next = function() {
3864     var returnElement = null;
3865     if (!useCache) {
3866       try {
3867         return returnElement = baseIterator.next(), cache.push(returnElement), returnElement;
3868       } catch (e) {
3869         if (e != goog.iter.StopIteration || goog.array.isEmpty(cache)) {
3870           throw e;
3871         }
3872         useCache = !0;
3873       }
3874     }
3875     returnElement = cache[cacheIndex];
3876     cacheIndex = (cacheIndex + 1) % cache.length;
3877     return returnElement;
3878   };
3879   return iter;
3881 goog.iter.count = function(opt_start, opt_step) {
3882   var counter = opt_start || 0, step = goog.isDef(opt_step) ? opt_step : 1, iter = new goog.iter.Iterator;
3883   iter.next = function() {
3884     var returnValue = counter;
3885     counter += step;
3886     return returnValue;
3887   };
3888   return iter;
3890 goog.iter.repeat = function(value) {
3891   var iter = new goog.iter.Iterator;
3892   iter.next = goog.functions.constant(value);
3893   return iter;
3895 goog.iter.accumulate = function(iterable) {
3896   var iterator = goog.iter.toIterator(iterable), total = 0, iter = new goog.iter.Iterator;
3897   iter.next = function() {
3898     return total += iterator.next();
3899   };
3900   return iter;
3902 goog.iter.zip = function(var_args) {
3903   var args = arguments, iter = new goog.iter.Iterator;
3904   if (0 < args.length) {
3905     var iterators = goog.array.map(args, goog.iter.toIterator);
3906     iter.next = function() {
3907       var arr = goog.array.map(iterators, function(it) {
3908         return it.next();
3909       });
3910       return arr;
3911     };
3912   }
3913   return iter;
3915 goog.iter.zipLongest = function(fillValue, var_args) {
3916   var args = goog.array.slice(arguments, 1), iter = new goog.iter.Iterator;
3917   if (0 < args.length) {
3918     var iterators = goog.array.map(args, goog.iter.toIterator);
3919     iter.next = function() {
3920       var iteratorsHaveValues = !1, arr = goog.array.map(iterators, function(it) {
3921         var returnValue;
3922         try {
3923           returnValue = it.next(), iteratorsHaveValues = !0;
3924         } catch (ex) {
3925           if (ex !== goog.iter.StopIteration) {
3926             throw ex;
3927           }
3928           returnValue = fillValue;
3929         }
3930         return returnValue;
3931       });
3932       if (!iteratorsHaveValues) {
3933         throw goog.iter.StopIteration;
3934       }
3935       return arr;
3936     };
3937   }
3938   return iter;
3940 goog.iter.compress = function(iterable, selectors) {
3941   var selectorIterator = goog.iter.toIterator(selectors);
3942   return goog.iter.filter(iterable, function() {
3943     return!!selectorIterator.next();
3944   });
3946 goog.iter.GroupByIterator_ = function(iterable, opt_keyFunc) {
3947   this.iterator = goog.iter.toIterator(iterable);
3948   this.keyFunc = opt_keyFunc || goog.functions.identity;
3950 goog.inherits(goog.iter.GroupByIterator_, goog.iter.Iterator);
3951 goog.iter.GroupByIterator_.prototype.next = function() {
3952   for (;this.currentKey == this.targetKey;) {
3953     this.currentValue = this.iterator.next(), this.currentKey = this.keyFunc(this.currentValue);
3954   }
3955   this.targetKey = this.currentKey;
3956   return[this.currentKey, this.groupItems_(this.targetKey)];
3958 goog.iter.GroupByIterator_.prototype.groupItems_ = function(targetKey) {
3959   for (var arr = [];this.currentKey == targetKey;) {
3960     arr.push(this.currentValue);
3961     try {
3962       this.currentValue = this.iterator.next();
3963     } catch (ex) {
3964       if (ex !== goog.iter.StopIteration) {
3965         throw ex;
3966       }
3967       break;
3968     }
3969     this.currentKey = this.keyFunc(this.currentValue);
3970   }
3971   return arr;
3973 goog.iter.groupBy = function(iterable, opt_keyFunc) {
3974   return new goog.iter.GroupByIterator_(iterable, opt_keyFunc);
3976 goog.iter.starMap = function(iterable, f, opt_obj) {
3977   var iterator = goog.iter.toIterator(iterable), iter = new goog.iter.Iterator;
3978   iter.next = function() {
3979     var args = goog.iter.toArray(iterator.next());
3980     return f.apply(opt_obj, goog.array.concat(args, void 0, iterator));
3981   };
3982   return iter;
3984 goog.iter.tee = function(iterable, opt_num) {
3985   var iterator = goog.iter.toIterator(iterable), num = goog.isNumber(opt_num) ? opt_num : 2, buffers = goog.array.map(goog.array.range(num), function() {
3986     return[];
3987   }), addNextIteratorValueToBuffers = function() {
3988     var val = iterator.next();
3989     goog.array.forEach(buffers, function(buffer) {
3990       buffer.push(val);
3991     });
3992   }, createIterator = function(buffer) {
3993     var iter = new goog.iter.Iterator;
3994     iter.next = function() {
3995       goog.array.isEmpty(buffer) && addNextIteratorValueToBuffers();
3996       goog.asserts.assert(!goog.array.isEmpty(buffer));
3997       return buffer.shift();
3998     };
3999     return iter;
4000   };
4001   return goog.array.map(buffers, createIterator);
4003 goog.iter.enumerate = function(iterable, opt_start) {
4004   return goog.iter.zip(goog.iter.count(opt_start), iterable);
4006 goog.iter.limit = function(iterable, limitSize) {
4007   goog.asserts.assert(goog.math.isInt(limitSize) && 0 <= limitSize);
4008   var iterator = goog.iter.toIterator(iterable), iter = new goog.iter.Iterator, remaining = limitSize;
4009   iter.next = function() {
4010     if (0 < remaining--) {
4011       return iterator.next();
4012     }
4013     throw goog.iter.StopIteration;
4014   };
4015   return iter;
4017 goog.iter.consume = function(iterable, count) {
4018   goog.asserts.assert(goog.math.isInt(count) && 0 <= count);
4019   for (var iterator = goog.iter.toIterator(iterable);0 < count--;) {
4020     goog.iter.nextOrValue(iterator, null);
4021   }
4022   return iterator;
4024 goog.iter.slice = function(iterable, start, opt_end) {
4025   goog.asserts.assert(goog.math.isInt(start) && 0 <= start);
4026   var iterator = goog.iter.consume(iterable, start);
4027   goog.isNumber(opt_end) && (goog.asserts.assert(goog.math.isInt(opt_end) && opt_end >= start), iterator = goog.iter.limit(iterator, opt_end - start));
4028   return iterator;
4030 goog.iter.hasDuplicates_ = function(arr) {
4031   var deduped = [];
4032   goog.array.removeDuplicates(arr, deduped);
4033   return arr.length != deduped.length;
4035 goog.iter.permutations = function(iterable, opt_length) {
4036   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);
4037   return goog.iter.filter(product, function(arr) {
4038     return!goog.iter.hasDuplicates_(arr);
4039   });
4041 goog.iter.combinations = function(iterable, length) {
4042   function getIndexFromElements(index) {
4043     return elements[index];
4044   }
4045   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) {
4046     return goog.array.isSorted(arr);
4047   }), iter = new goog.iter.Iterator;
4048   iter.next = function() {
4049     return goog.array.map(sortedIndexIterator.next(), getIndexFromElements);
4050   };
4051   return iter;
4053 goog.iter.combinationsWithReplacement = function(iterable, length) {
4054   function getIndexFromElements(index) {
4055     return elements[index];
4056   }
4057   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) {
4058     return goog.array.isSorted(arr);
4059   }), iter = new goog.iter.Iterator;
4060   iter.next = function() {
4061     return goog.array.map(sortedIndexIterator.next(), getIndexFromElements);
4062   };
4063   return iter;
4065 goog.structs.Map = function(opt_map, var_args) {
4066   this.map_ = {};
4067   this.keys_ = [];
4068   this.version_ = this.count_ = 0;
4069   var argLength = arguments.length;
4070   if (1 < argLength) {
4071     if (argLength % 2) {
4072       throw Error("Uneven number of arguments");
4073     }
4074     for (var i = 0;i < argLength;i += 2) {
4075       this.set(arguments[i], arguments[i + 1]);
4076     }
4077   } else {
4078     opt_map && this.addAll(opt_map);
4079   }
4081 goog.structs.Map.prototype.getCount = function() {
4082   return this.count_;
4084 goog.structs.Map.prototype.getValues = function() {
4085   this.cleanupKeysArray_();
4086   for (var rv = [], i = 0;i < this.keys_.length;i++) {
4087     var key = this.keys_[i];
4088     rv.push(this.map_[key]);
4089   }
4090   return rv;
4092 goog.structs.Map.prototype.getKeys = function() {
4093   this.cleanupKeysArray_();
4094   return this.keys_.concat();
4096 goog.structs.Map.prototype.containsKey = function(key) {
4097   return goog.structs.Map.hasKey_(this.map_, key);
4099 goog.structs.Map.prototype.containsValue = function(val) {
4100   for (var i = 0;i < this.keys_.length;i++) {
4101     var key = this.keys_[i];
4102     if (goog.structs.Map.hasKey_(this.map_, key) && this.map_[key] == val) {
4103       return!0;
4104     }
4105   }
4106   return!1;
4108 goog.structs.Map.prototype.equals = function(otherMap, opt_equalityFn) {
4109   if (this === otherMap) {
4110     return!0;
4111   }
4112   if (this.count_ != otherMap.getCount()) {
4113     return!1;
4114   }
4115   var equalityFn = opt_equalityFn || goog.structs.Map.defaultEquals;
4116   this.cleanupKeysArray_();
4117   for (var key, i = 0;key = this.keys_[i];i++) {
4118     if (!equalityFn(this.get(key), otherMap.get(key))) {
4119       return!1;
4120     }
4121   }
4122   return!0;
4124 goog.structs.Map.defaultEquals = function(a, b) {
4125   return a === b;
4127 goog.structs.Map.prototype.isEmpty = function() {
4128   return 0 == this.count_;
4130 goog.structs.Map.prototype.clear = function() {
4131   this.map_ = {};
4132   this.version_ = this.count_ = this.keys_.length = 0;
4134 goog.structs.Map.prototype.remove = function(key) {
4135   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;
4137 goog.structs.Map.prototype.cleanupKeysArray_ = function() {
4138   if (this.count_ != this.keys_.length) {
4139     for (var srcIndex = 0, destIndex = 0;srcIndex < this.keys_.length;) {
4140       var key = this.keys_[srcIndex];
4141       goog.structs.Map.hasKey_(this.map_, key) && (this.keys_[destIndex++] = key);
4142       srcIndex++;
4143     }
4144     this.keys_.length = destIndex;
4145   }
4146   if (this.count_ != this.keys_.length) {
4147     for (var seen = {}, destIndex = srcIndex = 0;srcIndex < this.keys_.length;) {
4148       key = this.keys_[srcIndex], goog.structs.Map.hasKey_(seen, key) || (this.keys_[destIndex++] = key, seen[key] = 1), srcIndex++;
4149     }
4150     this.keys_.length = destIndex;
4151   }
4153 goog.structs.Map.prototype.get = function(key, opt_val) {
4154   return goog.structs.Map.hasKey_(this.map_, key) ? this.map_[key] : opt_val;
4156 goog.structs.Map.prototype.set = function(key, value) {
4157   goog.structs.Map.hasKey_(this.map_, key) || (this.count_++, this.keys_.push(key), this.version_++);
4158   this.map_[key] = value;
4160 goog.structs.Map.prototype.addAll = function(map) {
4161   var keys, values;
4162   map instanceof goog.structs.Map ? (keys = map.getKeys(), values = map.getValues()) : (keys = goog.object.getKeys(map), values = goog.object.getValues(map));
4163   for (var i = 0;i < keys.length;i++) {
4164     this.set(keys[i], values[i]);
4165   }
4167 goog.structs.Map.prototype.forEach = function(f, opt_obj) {
4168   for (var keys = this.getKeys(), i = 0;i < keys.length;i++) {
4169     var key = keys[i], value = this.get(key);
4170     f.call(opt_obj, value, key, this);
4171   }
4173 goog.structs.Map.prototype.clone = function() {
4174   return new goog.structs.Map(this);
4176 goog.structs.Map.prototype.transpose = function() {
4177   for (var transposed = new goog.structs.Map, i = 0;i < this.keys_.length;i++) {
4178     var key = this.keys_[i], value = this.map_[key];
4179     transposed.set(value, key);
4180   }
4181   return transposed;
4183 goog.structs.Map.prototype.toObject = function() {
4184   this.cleanupKeysArray_();
4185   for (var obj = {}, i = 0;i < this.keys_.length;i++) {
4186     var key = this.keys_[i];
4187     obj[key] = this.map_[key];
4188   }
4189   return obj;
4191 goog.structs.Map.prototype.__iterator__ = function(opt_keys) {
4192   this.cleanupKeysArray_();
4193   var i = 0, keys = this.keys_, map = this.map_, version = this.version_, selfObj = this, newIter = new goog.iter.Iterator;
4194   newIter.next = function() {
4195     for (;;) {
4196       if (version != selfObj.version_) {
4197         throw Error("The map has changed since the iterator was created");
4198       }
4199       if (i >= keys.length) {
4200         throw goog.iter.StopIteration;
4201       }
4202       var key = keys[i++];
4203       return opt_keys ? key : map[key];
4204     }
4205   };
4206   return newIter;
4208 goog.structs.Map.hasKey_ = function(obj, key) {
4209   return Object.prototype.hasOwnProperty.call(obj, key);
4211 goog.structs.getCount = function(col) {
4212   return "function" == typeof col.getCount ? col.getCount() : goog.isArrayLike(col) || goog.isString(col) ? col.length : goog.object.getCount(col);
4214 goog.structs.getValues = function(col) {
4215   if ("function" == typeof col.getValues) {
4216     return col.getValues();
4217   }
4218   if (goog.isString(col)) {
4219     return col.split("");
4220   }
4221   if (goog.isArrayLike(col)) {
4222     for (var rv = [], l = col.length, i = 0;i < l;i++) {
4223       rv.push(col[i]);
4224     }
4225     return rv;
4226   }
4227   return goog.object.getValues(col);
4229 goog.structs.getKeys = function(col) {
4230   if ("function" == typeof col.getKeys) {
4231     return col.getKeys();
4232   }
4233   if ("function" != typeof col.getValues) {
4234     if (goog.isArrayLike(col) || goog.isString(col)) {
4235       for (var rv = [], l = col.length, i = 0;i < l;i++) {
4236         rv.push(i);
4237       }
4238       return rv;
4239     }
4240     return goog.object.getKeys(col);
4241   }
4243 goog.structs.contains = function(col, val) {
4244   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);
4246 goog.structs.isEmpty = function(col) {
4247   return "function" == typeof col.isEmpty ? col.isEmpty() : goog.isArrayLike(col) || goog.isString(col) ? goog.array.isEmpty(col) : goog.object.isEmpty(col);
4249 goog.structs.clear = function(col) {
4250   "function" == typeof col.clear ? col.clear() : goog.isArrayLike(col) ? goog.array.clear(col) : goog.object.clear(col);
4252 goog.structs.forEach = function(col, f, opt_obj) {
4253   if ("function" == typeof col.forEach) {
4254     col.forEach(f, opt_obj);
4255   } else {
4256     if (goog.isArrayLike(col) || goog.isString(col)) {
4257       goog.array.forEach(col, f, opt_obj);
4258     } else {
4259       for (var keys = goog.structs.getKeys(col), values = goog.structs.getValues(col), l = values.length, i = 0;i < l;i++) {
4260         f.call(opt_obj, values[i], keys && keys[i], col);
4261       }
4262     }
4263   }
4265 goog.structs.filter = function(col, f, opt_obj) {
4266   if ("function" == typeof col.filter) {
4267     return col.filter(f, opt_obj);
4268   }
4269   if (goog.isArrayLike(col) || goog.isString(col)) {
4270     return goog.array.filter(col, f, opt_obj);
4271   }
4272   var rv, keys = goog.structs.getKeys(col), values = goog.structs.getValues(col), l = values.length;
4273   if (keys) {
4274     rv = {};
4275     for (var i = 0;i < l;i++) {
4276       f.call(opt_obj, values[i], keys[i], col) && (rv[keys[i]] = values[i]);
4277     }
4278   } else {
4279     for (rv = [], i = 0;i < l;i++) {
4280       f.call(opt_obj, values[i], void 0, col) && rv.push(values[i]);
4281     }
4282   }
4283   return rv;
4285 goog.structs.map = function(col, f, opt_obj) {
4286   if ("function" == typeof col.map) {
4287     return col.map(f, opt_obj);
4288   }
4289   if (goog.isArrayLike(col) || goog.isString(col)) {
4290     return goog.array.map(col, f, opt_obj);
4291   }
4292   var rv, keys = goog.structs.getKeys(col), values = goog.structs.getValues(col), l = values.length;
4293   if (keys) {
4294     rv = {};
4295     for (var i = 0;i < l;i++) {
4296       rv[keys[i]] = f.call(opt_obj, values[i], keys[i], col);
4297     }
4298   } else {
4299     for (rv = [], i = 0;i < l;i++) {
4300       rv[i] = f.call(opt_obj, values[i], void 0, col);
4301     }
4302   }
4303   return rv;
4305 goog.structs.some = function(col, f, opt_obj) {
4306   if ("function" == typeof col.some) {
4307     return col.some(f, opt_obj);
4308   }
4309   if (goog.isArrayLike(col) || goog.isString(col)) {
4310     return goog.array.some(col, f, opt_obj);
4311   }
4312   for (var keys = goog.structs.getKeys(col), values = goog.structs.getValues(col), l = values.length, i = 0;i < l;i++) {
4313     if (f.call(opt_obj, values[i], keys && keys[i], col)) {
4314       return!0;
4315     }
4316   }
4317   return!1;
4319 goog.structs.every = function(col, f, opt_obj) {
4320   if ("function" == typeof col.every) {
4321     return col.every(f, opt_obj);
4322   }
4323   if (goog.isArrayLike(col) || goog.isString(col)) {
4324     return goog.array.every(col, f, opt_obj);
4325   }
4326   for (var keys = goog.structs.getKeys(col), values = goog.structs.getValues(col), l = values.length, i = 0;i < l;i++) {
4327     if (!f.call(opt_obj, values[i], keys && keys[i], col)) {
4328       return!1;
4329     }
4330   }
4331   return!0;
4333 goog.structs.Set = function(opt_values) {
4334   this.map_ = new goog.structs.Map;
4335   opt_values && this.addAll(opt_values);
4337 goog.structs.Set.getKey_ = function(val) {
4338   var type = typeof val;
4339   return "object" == type && val || "function" == type ? "o" + goog.getUid(val) : type.substr(0, 1) + val;
4341 goog.structs.Set.prototype.getCount = function() {
4342   return this.map_.getCount();
4344 goog.structs.Set.prototype.add = function(element) {
4345   this.map_.set(goog.structs.Set.getKey_(element), element);
4347 goog.structs.Set.prototype.addAll = function(col) {
4348   for (var values = goog.structs.getValues(col), l = values.length, i = 0;i < l;i++) {
4349     this.add(values[i]);
4350   }
4352 goog.structs.Set.prototype.removeAll = function(col) {
4353   for (var values = goog.structs.getValues(col), l = values.length, i = 0;i < l;i++) {
4354     this.remove(values[i]);
4355   }
4357 goog.structs.Set.prototype.remove = function(element) {
4358   return this.map_.remove(goog.structs.Set.getKey_(element));
4360 goog.structs.Set.prototype.clear = function() {
4361   this.map_.clear();
4363 goog.structs.Set.prototype.isEmpty = function() {
4364   return this.map_.isEmpty();
4366 goog.structs.Set.prototype.contains = function(element) {
4367   return this.map_.containsKey(goog.structs.Set.getKey_(element));
4369 goog.structs.Set.prototype.difference = function(col) {
4370   var result = this.clone();
4371   result.removeAll(col);
4372   return result;
4374 goog.structs.Set.prototype.getValues = function() {
4375   return this.map_.getValues();
4377 goog.structs.Set.prototype.clone = function() {
4378   return new goog.structs.Set(this);
4380 goog.structs.Set.prototype.equals = function(col) {
4381   return this.getCount() == goog.structs.getCount(col) && this.isSubsetOf(col);
4383 goog.structs.Set.prototype.isSubsetOf = function(col) {
4384   var colCount = goog.structs.getCount(col);
4385   if (this.getCount() > colCount) {
4386     return!1;
4387   }
4388   !(col instanceof goog.structs.Set) && 5 < colCount && (col = new goog.structs.Set(col));
4389   return goog.structs.every(this, function(value) {
4390     return goog.structs.contains(col, value);
4391   });
4393 goog.structs.Set.prototype.__iterator__ = function() {
4394   return this.map_.__iterator__(!1);
4396 goog.debug.LOGGING_ENABLED = goog.DEBUG;
4397 goog.debug.catchErrors = function(logFunc, opt_cancel, opt_target) {
4398   var target = opt_target || goog.global, oldErrorHandler = target.onerror, retVal = !!opt_cancel;
4399   goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher("535.3") && (retVal = !retVal);
4400   target.onerror = function(message, url, line, opt_col, opt_error) {
4401     oldErrorHandler && oldErrorHandler(message, url, line, opt_col, opt_error);
4402     logFunc({message:message, fileName:url, line:line, col:opt_col, error:opt_error});
4403     return retVal;
4404   };
4406 goog.debug.expose = function(obj, opt_showFn) {
4407   if ("undefined" == typeof obj) {
4408     return "undefined";
4409   }
4410   if (null == obj) {
4411     return "NULL";
4412   }
4413   var str = [], x;
4414   for (x in obj) {
4415     if (opt_showFn || !goog.isFunction(obj[x])) {
4416       var s = x + " = ";
4417       try {
4418         s += obj[x];
4419       } catch (e) {
4420         s += "*** " + e + " ***";
4421       }
4422       str.push(s);
4423     }
4424   }
4425   return str.join("\n");
4427 goog.debug.deepExpose = function(obj$$0, opt_showFn) {
4428   var str = [], helper = function(obj, space, parentSeen) {
4429     var nestspace = space + "  ", seen = new goog.structs.Set(parentSeen);
4430     try {
4431       if (goog.isDef(obj)) {
4432         if (goog.isNull(obj)) {
4433           str.push("NULL");
4434         } else {
4435           if (goog.isString(obj)) {
4436             str.push('"' + obj.replace(/\n/g, "\n" + space) + '"');
4437           } else {
4438             if (goog.isFunction(obj)) {
4439               str.push(String(obj).replace(/\n/g, "\n" + space));
4440             } else {
4441               if (goog.isObject(obj)) {
4442                 if (seen.contains(obj)) {
4443                   str.push("*** reference loop detected ***");
4444                 } else {
4445                   seen.add(obj);
4446                   str.push("{");
4447                   for (var x in obj) {
4448                     if (opt_showFn || !goog.isFunction(obj[x])) {
4449                       str.push("\n"), str.push(nestspace), str.push(x + " = "), helper(obj[x], nestspace, seen);
4450                     }
4451                   }
4452                   str.push("\n" + space + "}");
4453                 }
4454               } else {
4455                 str.push(obj);
4456               }
4457             }
4458           }
4459         }
4460       } else {
4461         str.push("undefined");
4462       }
4463     } catch (e) {
4464       str.push("*** " + e + " ***");
4465     }
4466   };
4467   helper(obj$$0, "", new goog.structs.Set);
4468   return str.join("");
4470 goog.debug.exposeArray = function(arr) {
4471   for (var str = [], i = 0;i < arr.length;i++) {
4472     goog.isArray(arr[i]) ? str.push(goog.debug.exposeArray(arr[i])) : str.push(arr[i]);
4473   }
4474   return "[ " + str.join(", ") + " ]";
4476 goog.debug.exposeException = function(err, opt_fn) {
4477   try {
4478     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) + "-> ");
4479     return error;
4480   } catch (e2) {
4481     return "Exception trying to expose exception! You win, we lose. " + e2;
4482   }
4484 goog.debug.normalizeErrorObject = function(err) {
4485   var href = goog.getObjectByName("window.location.href");
4486   if (goog.isString(err)) {
4487     return{message:err, name:"Unknown error", lineNumber:"Not available", fileName:href, stack:"Not available"};
4488   }
4489   var lineNumber, fileName, threwError = !1;
4490   try {
4491     lineNumber = err.lineNumber || err.line || "Not available";
4492   } catch (e) {
4493     lineNumber = "Not available", threwError = !0;
4494   }
4495   try {
4496     fileName = err.fileName || err.filename || err.sourceURL || goog.global.$googDebugFname || href;
4497   } catch (e$$0) {
4498     fileName = "Not available", threwError = !0;
4499   }
4500   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"};
4502 goog.debug.enhanceError = function(err, opt_message) {
4503   var error;
4504   "string" == typeof err ? (error = Error(err), Error.captureStackTrace && Error.captureStackTrace(error, goog.debug.enhanceError)) : error = err;
4505   error.stack || (error.stack = goog.debug.getStacktrace(goog.debug.enhanceError));
4506   if (opt_message) {
4507     for (var x = 0;error["message" + x];) {
4508       ++x;
4509     }
4510     error["message" + x] = String(opt_message);
4511   }
4512   return error;
4514 goog.debug.getStacktraceSimple = function(opt_depth) {
4515   if (goog.STRICT_MODE_COMPATIBLE) {
4516     var stack = goog.debug.getNativeStackTrace_(goog.debug.getStacktraceSimple);
4517     if (stack) {
4518       return stack;
4519     }
4520   }
4521   for (var sb = [], fn = arguments.callee.caller, depth = 0;fn && (!opt_depth || depth < opt_depth);) {
4522     sb.push(goog.debug.getFunctionName(fn));
4523     sb.push("()\n");
4524     try {
4525       fn = fn.caller;
4526     } catch (e) {
4527       sb.push("[exception trying to get caller]\n");
4528       break;
4529     }
4530     depth++;
4531     if (depth >= goog.debug.MAX_STACK_DEPTH) {
4532       sb.push("[...long stack...]");
4533       break;
4534     }
4535   }
4536   opt_depth && depth >= opt_depth ? sb.push("[...reached max depth limit...]") : sb.push("[end]");
4537   return sb.join("");
4539 goog.debug.MAX_STACK_DEPTH = 50;
4540 goog.debug.getNativeStackTrace_ = function(fn) {
4541   var tempErr = Error();
4542   if (Error.captureStackTrace) {
4543     return Error.captureStackTrace(tempErr, fn), String(tempErr.stack);
4544   }
4545   try {
4546     throw tempErr;
4547   } catch (e) {
4548     tempErr = e;
4549   }
4550   var stack = tempErr.stack;
4551   return stack ? String(stack) : null;
4553 goog.debug.getStacktrace = function(opt_fn) {
4554   var stack;
4555   if (goog.STRICT_MODE_COMPATIBLE) {
4556     var contextFn = opt_fn || goog.debug.getStacktrace;
4557     stack = goog.debug.getNativeStackTrace_(contextFn);
4558   }
4559   stack || (stack = goog.debug.getStacktraceHelper_(opt_fn || arguments.callee.caller, []));
4560   return stack;
4562 goog.debug.getStacktraceHelper_ = function(fn, visited) {
4563   var sb = [];
4564   if (goog.array.contains(visited, fn)) {
4565     sb.push("[...circular reference...]");
4566   } else {
4567     if (fn && visited.length < goog.debug.MAX_STACK_DEPTH) {
4568       sb.push(goog.debug.getFunctionName(fn) + "(");
4569       for (var args = fn.arguments, i = 0;args && i < args.length;i++) {
4570         0 < i && sb.push(", ");
4571         var argDesc, arg = args[i];
4572         switch(typeof arg) {
4573           case "object":
4574             argDesc = arg ? "object" : "null";
4575             break;
4576           case "string":
4577             argDesc = arg;
4578             break;
4579           case "number":
4580             argDesc = String(arg);
4581             break;
4582           case "boolean":
4583             argDesc = arg ? "true" : "false";
4584             break;
4585           case "function":
4586             argDesc = (argDesc = goog.debug.getFunctionName(arg)) ? argDesc : "[fn]";
4587             break;
4588           default:
4589             argDesc = typeof arg;
4590         }
4591         40 < argDesc.length && (argDesc = argDesc.substr(0, 40) + "...");
4592         sb.push(argDesc);
4593       }
4594       visited.push(fn);
4595       sb.push(")\n");
4596       try {
4597         sb.push(goog.debug.getStacktraceHelper_(fn.caller, visited));
4598       } catch (e) {
4599         sb.push("[exception trying to get caller]\n");
4600       }
4601     } else {
4602       fn ? sb.push("[...long stack...]") : sb.push("[end]");
4603     }
4604   }
4605   return sb.join("");
4607 goog.debug.setFunctionResolver = function(resolver) {
4608   goog.debug.fnNameResolver_ = resolver;
4610 goog.debug.getFunctionName = function(fn) {
4611   if (goog.debug.fnNameCache_[fn]) {
4612     return goog.debug.fnNameCache_[fn];
4613   }
4614   if (goog.debug.fnNameResolver_) {
4615     var name = goog.debug.fnNameResolver_(fn);
4616     if (name) {
4617       return goog.debug.fnNameCache_[fn] = name;
4618     }
4619   }
4620   var functionSource = String(fn);
4621   if (!goog.debug.fnNameCache_[functionSource]) {
4622     var matches = /function ([^\(]+)/.exec(functionSource);
4623     if (matches) {
4624       var method = matches[1];
4625       goog.debug.fnNameCache_[functionSource] = method;
4626     } else {
4627       goog.debug.fnNameCache_[functionSource] = "[Anonymous]";
4628     }
4629   }
4630   return goog.debug.fnNameCache_[functionSource];
4632 goog.debug.makeWhitespaceVisible = function(string) {
4633   return string.replace(/ /g, "[_]").replace(/\f/g, "[f]").replace(/\n/g, "[n]\n").replace(/\r/g, "[r]").replace(/\t/g, "[t]");
4635 goog.debug.fnNameCache_ = {};
4636 goog.debug.LogRecord = function(level, msg, loggerName, opt_time, opt_sequenceNumber) {
4637   this.reset(level, msg, loggerName, opt_time, opt_sequenceNumber);
4639 goog.debug.LogRecord.prototype.exception_ = null;
4640 goog.debug.LogRecord.prototype.exceptionText_ = null;
4641 goog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS = !0;
4642 goog.debug.LogRecord.nextSequenceNumber_ = 0;
4643 goog.debug.LogRecord.prototype.reset = function(level, msg, loggerName, opt_time, opt_sequenceNumber) {
4644   goog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS && ("number" == typeof opt_sequenceNumber || goog.debug.LogRecord.nextSequenceNumber_++);
4645   opt_time || goog.now();
4646   this.level_ = level;
4647   this.msg_ = msg;
4648   delete this.exception_;
4649   delete this.exceptionText_;
4651 goog.debug.LogRecord.prototype.setException = function(exception) {
4652   this.exception_ = exception;
4654 goog.debug.LogRecord.prototype.setExceptionText = function(text) {
4655   this.exceptionText_ = text;
4657 goog.debug.LogRecord.prototype.setLevel = function(level) {
4658   this.level_ = level;
4660 goog.debug.LogRecord.prototype.getMessage = function() {
4661   return this.msg_;
4663 goog.debug.LogBuffer = function() {
4664   goog.asserts.assert(goog.debug.LogBuffer.isBufferingEnabled(), "Cannot use goog.debug.LogBuffer without defining goog.debug.LogBuffer.CAPACITY.");
4665   this.clear();
4667 goog.debug.LogBuffer.getInstance = function() {
4668   goog.debug.LogBuffer.instance_ || (goog.debug.LogBuffer.instance_ = new goog.debug.LogBuffer);
4669   return goog.debug.LogBuffer.instance_;
4671 goog.debug.LogBuffer.CAPACITY = 0;
4672 goog.debug.LogBuffer.prototype.addRecord = function(level, msg, loggerName) {
4673   var curIndex = (this.curIndex_ + 1) % goog.debug.LogBuffer.CAPACITY;
4674   this.curIndex_ = curIndex;
4675   if (this.isFull_) {
4676     var ret = this.buffer_[curIndex];
4677     ret.reset(level, msg, loggerName);
4678     return ret;
4679   }
4680   this.isFull_ = curIndex == goog.debug.LogBuffer.CAPACITY - 1;
4681   return this.buffer_[curIndex] = new goog.debug.LogRecord(level, msg, loggerName);
4683 goog.debug.LogBuffer.isBufferingEnabled = function() {
4684   return 0 < goog.debug.LogBuffer.CAPACITY;
4686 goog.debug.LogBuffer.prototype.clear = function() {
4687   this.buffer_ = Array(goog.debug.LogBuffer.CAPACITY);
4688   this.curIndex_ = -1;
4689   this.isFull_ = !1;
4691 goog.debug.Logger = function(name) {
4692   this.name_ = name;
4693   this.handlers_ = this.children_ = this.level_ = this.parent_ = null;
4695 goog.debug.Logger.ENABLE_HIERARCHY = !0;
4696 goog.debug.Logger.ENABLE_HIERARCHY || (goog.debug.Logger.rootHandlers_ = []);
4697 goog.debug.Logger.Level = function(name, value) {
4698   this.name = name;
4699   this.value = value;
4701 goog.debug.Logger.Level.prototype.toString = function() {
4702   return this.name;
4704 goog.debug.Logger.Level.OFF = new goog.debug.Logger.Level("OFF", Infinity);
4705 goog.debug.Logger.Level.SHOUT = new goog.debug.Logger.Level("SHOUT", 1200);
4706 goog.debug.Logger.Level.SEVERE = new goog.debug.Logger.Level("SEVERE", 1E3);
4707 goog.debug.Logger.Level.WARNING = new goog.debug.Logger.Level("WARNING", 900);
4708 goog.debug.Logger.Level.INFO = new goog.debug.Logger.Level("INFO", 800);
4709 goog.debug.Logger.Level.CONFIG = new goog.debug.Logger.Level("CONFIG", 700);
4710 goog.debug.Logger.Level.FINE = new goog.debug.Logger.Level("FINE", 500);
4711 goog.debug.Logger.Level.FINER = new goog.debug.Logger.Level("FINER", 400);
4712 goog.debug.Logger.Level.FINEST = new goog.debug.Logger.Level("FINEST", 300);
4713 goog.debug.Logger.Level.ALL = new goog.debug.Logger.Level("ALL", 0);
4714 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];
4715 goog.debug.Logger.Level.predefinedLevelsCache_ = null;
4716 goog.debug.Logger.Level.createPredefinedLevelsCache_ = function() {
4717   goog.debug.Logger.Level.predefinedLevelsCache_ = {};
4718   for (var i = 0, level;level = goog.debug.Logger.Level.PREDEFINED_LEVELS[i];i++) {
4719     goog.debug.Logger.Level.predefinedLevelsCache_[level.value] = level, goog.debug.Logger.Level.predefinedLevelsCache_[level.name] = level;
4720   }
4722 goog.debug.Logger.Level.getPredefinedLevel = function(name) {
4723   goog.debug.Logger.Level.predefinedLevelsCache_ || goog.debug.Logger.Level.createPredefinedLevelsCache_();
4724   return goog.debug.Logger.Level.predefinedLevelsCache_[name] || null;
4726 goog.debug.Logger.Level.getPredefinedLevelByValue = function(value) {
4727   goog.debug.Logger.Level.predefinedLevelsCache_ || goog.debug.Logger.Level.createPredefinedLevelsCache_();
4728   if (value in goog.debug.Logger.Level.predefinedLevelsCache_) {
4729     return goog.debug.Logger.Level.predefinedLevelsCache_[value];
4730   }
4731   for (var i = 0;i < goog.debug.Logger.Level.PREDEFINED_LEVELS.length;++i) {
4732     var level = goog.debug.Logger.Level.PREDEFINED_LEVELS[i];
4733     if (level.value <= value) {
4734       return level;
4735     }
4736   }
4737   return null;
4739 goog.debug.Logger.getLogger = function(name) {
4740   return goog.debug.LogManager.getLogger(name);
4742 goog.debug.Logger.logToProfilers = function(msg) {
4743   goog.global.console && (goog.global.console.timeStamp ? goog.global.console.timeStamp(msg) : goog.global.console.markTimeline && goog.global.console.markTimeline(msg));
4744   goog.global.msWriteProfilerMark && goog.global.msWriteProfilerMark(msg);
4746 goog.debug.Logger.prototype.getName = function() {
4747   return this.name_;
4749 goog.debug.Logger.prototype.addHandler = function(handler) {
4750   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)));
4752 goog.debug.Logger.prototype.removeHandler = function(handler) {
4753   if (goog.debug.LOGGING_ENABLED) {
4754     var handlers = goog.debug.Logger.ENABLE_HIERARCHY ? this.handlers_ : goog.debug.Logger.rootHandlers_;
4755     return!!handlers && goog.array.remove(handlers, handler);
4756   }
4757   return!1;
4759 goog.debug.Logger.prototype.getParent = function() {
4760   return this.parent_;
4762 goog.debug.Logger.prototype.getChildren = function() {
4763   this.children_ || (this.children_ = {});
4764   return this.children_;
4766 goog.debug.Logger.prototype.setLevel = function(level) {
4767   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));
4769 goog.debug.Logger.prototype.getEffectiveLevel = function() {
4770   if (!goog.debug.LOGGING_ENABLED) {
4771     return goog.debug.Logger.Level.OFF;
4772   }
4773   if (!goog.debug.Logger.ENABLE_HIERARCHY) {
4774     return goog.debug.Logger.rootLevel_;
4775   }
4776   if (this.level_) {
4777     return this.level_;
4778   }
4779   if (this.parent_) {
4780     return this.parent_.getEffectiveLevel();
4781   }
4782   goog.asserts.fail("Root logger has no level set.");
4783   return null;
4785 goog.debug.Logger.prototype.isLoggable = function(level) {
4786   return goog.debug.LOGGING_ENABLED && level.value >= this.getEffectiveLevel().value;
4788 goog.debug.Logger.prototype.log = function(level, msg, opt_exception) {
4789   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)));
4791 goog.debug.Logger.prototype.getLogRecord = function(level, msg, opt_exception, opt_fnStackContext) {
4792   var logRecord = goog.debug.LogBuffer.isBufferingEnabled() ? goog.debug.LogBuffer.getInstance().addRecord(level, msg, this.name_) : new goog.debug.LogRecord(level, String(msg), this.name_);
4793   opt_exception && (logRecord.setException(opt_exception), logRecord.setExceptionText(goog.debug.exposeException(opt_exception, opt_fnStackContext || goog.debug.Logger.prototype.getLogRecord)));
4794   return logRecord;
4796 goog.debug.Logger.prototype.severe = function(msg, opt_exception) {
4797   goog.debug.LOGGING_ENABLED && this.log(goog.debug.Logger.Level.SEVERE, msg, opt_exception);
4799 goog.debug.Logger.prototype.warning = function(msg, opt_exception) {
4800   goog.debug.LOGGING_ENABLED && this.log(goog.debug.Logger.Level.WARNING, msg, opt_exception);
4802 goog.debug.Logger.prototype.info = function(msg, opt_exception) {
4803   goog.debug.LOGGING_ENABLED && this.log(goog.debug.Logger.Level.INFO, msg, opt_exception);
4805 goog.debug.Logger.prototype.fine = function(msg, opt_exception) {
4806   goog.debug.LOGGING_ENABLED && this.log(goog.debug.Logger.Level.FINE, msg, opt_exception);
4808 goog.debug.Logger.prototype.doLogRecord_ = function(logRecord) {
4809   goog.debug.Logger.logToProfilers("log:" + logRecord.getMessage());
4810   if (goog.debug.Logger.ENABLE_HIERARCHY) {
4811     for (var target = this;target;) {
4812       target.callPublish_(logRecord), target = target.getParent();
4813     }
4814   } else {
4815     for (var i = 0, handler;handler = goog.debug.Logger.rootHandlers_[i++];) {
4816       handler(logRecord);
4817     }
4818   }
4820 goog.debug.Logger.prototype.callPublish_ = function(logRecord) {
4821   if (this.handlers_) {
4822     for (var i = 0, handler;handler = this.handlers_[i];i++) {
4823       handler(logRecord);
4824     }
4825   }
4827 goog.debug.Logger.prototype.setParent_ = function(parent) {
4828   this.parent_ = parent;
4830 goog.debug.Logger.prototype.addChild_ = function(name, logger) {
4831   this.getChildren()[name] = logger;
4833 goog.debug.LogManager = {};
4834 goog.debug.LogManager.loggers_ = {};
4835 goog.debug.LogManager.rootLogger_ = null;
4836 goog.debug.LogManager.initialize = function() {
4837   goog.debug.LogManager.rootLogger_ || (goog.debug.LogManager.rootLogger_ = new goog.debug.Logger(""), goog.debug.LogManager.loggers_[""] = goog.debug.LogManager.rootLogger_, goog.debug.LogManager.rootLogger_.setLevel(goog.debug.Logger.Level.CONFIG));
4839 goog.debug.LogManager.getLoggers = function() {
4840   return goog.debug.LogManager.loggers_;
4842 goog.debug.LogManager.getRoot = function() {
4843   goog.debug.LogManager.initialize();
4844   return goog.debug.LogManager.rootLogger_;
4846 goog.debug.LogManager.getLogger = function(name) {
4847   goog.debug.LogManager.initialize();
4848   var ret = goog.debug.LogManager.loggers_[name];
4849   return ret || goog.debug.LogManager.createLogger_(name);
4851 goog.debug.LogManager.createFunctionForCatchErrors = function(opt_logger) {
4852   return function(info) {
4853     var logger = opt_logger || goog.debug.LogManager.getRoot();
4854     logger.severe("Error: " + info.message + " (" + info.fileName + " @ Line: " + info.line + ")");
4855   };
4857 goog.debug.LogManager.createLogger_ = function(name) {
4858   var logger = new goog.debug.Logger(name);
4859   if (goog.debug.Logger.ENABLE_HIERARCHY) {
4860     var lastDotIndex = name.lastIndexOf("."), parentName = name.substr(0, lastDotIndex), leafName = name.substr(lastDotIndex + 1), parentLogger = goog.debug.LogManager.getLogger(parentName);
4861     parentLogger.addChild_(leafName, logger);
4862     logger.setParent_(parentLogger);
4863   }
4864   return goog.debug.LogManager.loggers_[name] = logger;
4866 goog.log = {};
4867 goog.log.ENABLED = goog.debug.LOGGING_ENABLED;
4868 goog.log.Logger = goog.debug.Logger;
4869 goog.log.Level = goog.debug.Logger.Level;
4870 goog.log.LogRecord = goog.debug.LogRecord;
4871 goog.log.getLogger = function(name, opt_level) {
4872   if (goog.log.ENABLED) {
4873     var logger = goog.debug.LogManager.getLogger(name);
4874     opt_level && logger && logger.setLevel(opt_level);
4875     return logger;
4876   }
4877   return null;
4879 goog.log.addHandler = function(logger, handler) {
4880   goog.log.ENABLED && logger && logger.addHandler(handler);
4882 goog.log.removeHandler = function(logger, handler) {
4883   return goog.log.ENABLED && logger ? logger.removeHandler(handler) : !1;
4885 goog.log.log = function(logger, level, msg, opt_exception) {
4886   goog.log.ENABLED && logger && logger.log(level, msg, opt_exception);
4888 goog.log.error = function(logger, msg, opt_exception) {
4889   goog.log.ENABLED && logger && logger.severe(msg, opt_exception);
4891 goog.log.warning = function(logger, msg, opt_exception) {
4892   goog.log.ENABLED && logger && logger.warning(msg, opt_exception);
4894 goog.log.info = function(logger, msg, opt_exception) {
4895   goog.log.ENABLED && logger && logger.info(msg, opt_exception);
4897 goog.log.fine = function(logger, msg, opt_exception) {
4898   goog.log.ENABLED && logger && logger.fine(msg, opt_exception);
4900 goog.Timer = function(opt_interval, opt_timerObject) {
4901   goog.events.EventTarget.call(this);
4902   this.interval_ = opt_interval || 1;
4903   this.timerObject_ = opt_timerObject || goog.Timer.defaultTimerObject;
4904   this.boundTick_ = goog.bind(this.tick_, this);
4905   this.last_ = goog.now();
4907 goog.inherits(goog.Timer, goog.events.EventTarget);
4908 goog.Timer.MAX_TIMEOUT_ = 2147483647;
4909 goog.Timer.prototype.enabled = !1;
4910 goog.Timer.defaultTimerObject = goog.global;
4911 goog.Timer.intervalScale = 0.8;
4912 goog.Timer.prototype.timer_ = null;
4913 goog.Timer.prototype.setInterval = function(interval) {
4914   this.interval_ = interval;
4915   this.timer_ && this.enabled ? (this.stop(), this.start()) : this.timer_ && this.stop();
4917 goog.Timer.prototype.tick_ = function() {
4918   if (this.enabled) {
4919     var elapsed = goog.now() - this.last_;
4920     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()));
4921   }
4923 goog.Timer.prototype.dispatchTick = function() {
4924   this.dispatchEvent(goog.Timer.TICK);
4926 goog.Timer.prototype.start = function() {
4927   this.enabled = !0;
4928   this.timer_ || (this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_), this.last_ = goog.now());
4930 goog.Timer.prototype.stop = function() {
4931   this.enabled = !1;
4932   this.timer_ && (this.timerObject_.clearTimeout(this.timer_), this.timer_ = null);
4934 goog.Timer.prototype.disposeInternal = function() {
4935   goog.Timer.superClass_.disposeInternal.call(this);
4936   this.stop();
4937   delete this.timerObject_;
4939 goog.Timer.TICK = "tick";
4940 goog.Timer.callOnce = function(listener, opt_delay, opt_handler) {
4941   if (goog.isFunction(listener)) {
4942     opt_handler && (listener = goog.bind(listener, opt_handler));
4943   } else {
4944     if (listener && "function" == typeof listener.handleEvent) {
4945       listener = goog.bind(listener.handleEvent, listener);
4946     } else {
4947       throw Error("Invalid listener argument");
4948     }
4949   }
4950   return opt_delay > goog.Timer.MAX_TIMEOUT_ ? -1 : goog.Timer.defaultTimerObject.setTimeout(listener, opt_delay || 0);
4952 goog.Timer.clear = function(timerId) {
4953   goog.Timer.defaultTimerObject.clearTimeout(timerId);
4955 goog.uri = {};
4956 goog.uri.utils = {};
4957 goog.uri.utils.CharCode_ = {AMPERSAND:38, EQUAL:61, HASH:35, QUESTION:63};
4958 goog.uri.utils.buildFromEncodedParts = function(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) {
4959   var out = "";
4960   opt_scheme && (out += opt_scheme + ":");
4961   opt_domain && (out += "//", opt_userInfo && (out += opt_userInfo + "@"), out += opt_domain, opt_port && (out += ":" + opt_port));
4962   opt_path && (out += opt_path);
4963   opt_queryData && (out += "?" + opt_queryData);
4964   opt_fragment && (out += "#" + opt_fragment);
4965   return out;
4967 goog.uri.utils.splitRe_ = RegExp("^(?:([^:/?#.]+):)?(?://(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#(.*))?$");
4968 goog.uri.utils.ComponentIndex = {SCHEME:1, USER_INFO:2, DOMAIN:3, PORT:4, PATH:5, QUERY_DATA:6, FRAGMENT:7};
4969 goog.uri.utils.split = function(uri) {
4970   goog.uri.utils.phishingProtection_();
4971   return uri.match(goog.uri.utils.splitRe_);
4973 goog.uri.utils.needsPhishingProtection_ = goog.userAgent.WEBKIT;
4974 goog.uri.utils.phishingProtection_ = function() {
4975   if (goog.uri.utils.needsPhishingProtection_) {
4976     goog.uri.utils.needsPhishingProtection_ = !1;
4977     var location = goog.global.location;
4978     if (location) {
4979       var href = location.href;
4980       if (href) {
4981         var domain = goog.uri.utils.getDomain(href);
4982         if (domain && domain != location.hostname) {
4983           throw goog.uri.utils.needsPhishingProtection_ = !0, Error();
4984         }
4985       }
4986     }
4987   }
4989 goog.uri.utils.decodeIfPossible_ = function(uri) {
4990   return uri && decodeURIComponent(uri);
4992 goog.uri.utils.getComponentByIndex_ = function(componentIndex, uri) {
4993   return goog.uri.utils.split(uri)[componentIndex] || null;
4995 goog.uri.utils.getScheme = function(uri) {
4996   return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.SCHEME, uri);
4998 goog.uri.utils.getEffectiveScheme = function(uri) {
4999   var scheme = goog.uri.utils.getScheme(uri);
5000   if (!scheme && self.location) {
5001     var protocol = self.location.protocol, scheme = protocol.substr(0, protocol.length - 1)
5002   }
5003   return scheme ? scheme.toLowerCase() : "";
5005 goog.uri.utils.getUserInfoEncoded = function(uri) {
5006   return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.USER_INFO, uri);
5008 goog.uri.utils.getUserInfo = function(uri) {
5009   return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getUserInfoEncoded(uri));
5011 goog.uri.utils.getDomainEncoded = function(uri) {
5012   return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.DOMAIN, uri);
5014 goog.uri.utils.getDomain = function(uri) {
5015   return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getDomainEncoded(uri));
5017 goog.uri.utils.getPort = function(uri) {
5018   return Number(goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PORT, uri)) || null;
5020 goog.uri.utils.getPathEncoded = function(uri) {
5021   return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PATH, uri);
5023 goog.uri.utils.getPath = function(uri) {
5024   return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getPathEncoded(uri));
5026 goog.uri.utils.getQueryData = function(uri) {
5027   return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.QUERY_DATA, uri);
5029 goog.uri.utils.getFragmentEncoded = function(uri) {
5030   var hashIndex = uri.indexOf("#");
5031   return 0 > hashIndex ? null : uri.substr(hashIndex + 1);
5033 goog.uri.utils.setFragmentEncoded = function(uri, fragment) {
5034   return goog.uri.utils.removeFragment(uri) + (fragment ? "#" + fragment : "");
5036 goog.uri.utils.getFragment = function(uri) {
5037   return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getFragmentEncoded(uri));
5039 goog.uri.utils.getHost = function(uri) {
5040   var pieces = goog.uri.utils.split(uri);
5041   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]);
5043 goog.uri.utils.getPathAndAfter = function(uri) {
5044   var pieces = goog.uri.utils.split(uri);
5045   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]);
5047 goog.uri.utils.removeFragment = function(uri) {
5048   var hashIndex = uri.indexOf("#");
5049   return 0 > hashIndex ? uri : uri.substr(0, hashIndex);
5051 goog.uri.utils.haveSameDomain = function(uri1, uri2) {
5052   var pieces1 = goog.uri.utils.split(uri1), pieces2 = goog.uri.utils.split(uri2);
5053   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];
5055 goog.uri.utils.assertNoFragmentsOrQueries_ = function(uri) {
5056   if (goog.DEBUG && (0 <= uri.indexOf("#") || 0 <= uri.indexOf("?"))) {
5057     throw Error("goog.uri.utils: Fragment or query identifiers are not supported: [" + uri + "]");
5058   }
5060 goog.uri.utils.appendQueryData_ = function(buffer) {
5061   if (buffer[1]) {
5062     var baseUri = buffer[0], hashIndex = baseUri.indexOf("#");
5063     0 <= hashIndex && (buffer.push(baseUri.substr(hashIndex)), buffer[0] = baseUri = baseUri.substr(0, hashIndex));
5064     var questionIndex = baseUri.indexOf("?");
5065     0 > questionIndex ? buffer[1] = "?" : questionIndex == baseUri.length - 1 && (buffer[1] = void 0);
5066   }
5067   return buffer.join("");
5069 goog.uri.utils.appendKeyValuePairs_ = function(key, value, pairs) {
5070   if (goog.isArray(value)) {
5071     goog.asserts.assertArray(value);
5072     for (var j = 0;j < value.length;j++) {
5073       goog.uri.utils.appendKeyValuePairs_(key, String(value[j]), pairs);
5074     }
5075   } else {
5076     null != value && pairs.push("&", key, "" === value ? "" : "=", goog.string.urlEncode(value));
5077   }
5079 goog.uri.utils.buildQueryDataBuffer_ = function(buffer, keysAndValues, opt_startIndex) {
5080   goog.asserts.assert(0 == Math.max(keysAndValues.length - (opt_startIndex || 0), 0) % 2, "goog.uri.utils: Key/value lists must be even in length.");
5081   for (var i = opt_startIndex || 0;i < keysAndValues.length;i += 2) {
5082     goog.uri.utils.appendKeyValuePairs_(keysAndValues[i], keysAndValues[i + 1], buffer);
5083   }
5084   return buffer;
5086 goog.uri.utils.buildQueryData = function(keysAndValues, opt_startIndex) {
5087   var buffer = goog.uri.utils.buildQueryDataBuffer_([], keysAndValues, opt_startIndex);
5088   buffer[0] = "";
5089   return buffer.join("");
5091 goog.uri.utils.buildQueryDataBufferFromMap_ = function(buffer, map) {
5092   for (var key in map) {
5093     goog.uri.utils.appendKeyValuePairs_(key, map[key], buffer);
5094   }
5095   return buffer;
5097 goog.uri.utils.buildQueryDataFromMap = function(map) {
5098   var buffer = goog.uri.utils.buildQueryDataBufferFromMap_([], map);
5099   buffer[0] = "";
5100   return buffer.join("");
5102 goog.uri.utils.appendParams = function(uri, var_args) {
5103   return goog.uri.utils.appendQueryData_(2 == arguments.length ? goog.uri.utils.buildQueryDataBuffer_([uri], arguments[1], 0) : goog.uri.utils.buildQueryDataBuffer_([uri], arguments, 1));
5105 goog.uri.utils.appendParamsFromMap = function(uri, map) {
5106   return goog.uri.utils.appendQueryData_(goog.uri.utils.buildQueryDataBufferFromMap_([uri], map));
5108 goog.uri.utils.appendParam = function(uri, key, opt_value) {
5109   var paramArr = [uri, "&", key];
5110   goog.isDefAndNotNull(opt_value) && paramArr.push("=", goog.string.urlEncode(opt_value));
5111   return goog.uri.utils.appendQueryData_(paramArr);
5113 goog.uri.utils.findParam_ = function(uri, startIndex, keyEncoded, hashOrEndIndex) {
5114   for (var index = startIndex, keyLength = keyEncoded.length;0 <= (index = uri.indexOf(keyEncoded, index)) && index < hashOrEndIndex;) {
5115     var precedingChar = uri.charCodeAt(index - 1);
5116     if (precedingChar == goog.uri.utils.CharCode_.AMPERSAND || precedingChar == goog.uri.utils.CharCode_.QUESTION) {
5117       var followingChar = uri.charCodeAt(index + keyLength);
5118       if (!followingChar || followingChar == goog.uri.utils.CharCode_.EQUAL || followingChar == goog.uri.utils.CharCode_.AMPERSAND || followingChar == goog.uri.utils.CharCode_.HASH) {
5119         return index;
5120       }
5121     }
5122     index += keyLength + 1;
5123   }
5124   return-1;
5126 goog.uri.utils.hashOrEndRe_ = /#|$/;
5127 goog.uri.utils.hasParam = function(uri, keyEncoded) {
5128   return 0 <= goog.uri.utils.findParam_(uri, 0, keyEncoded, uri.search(goog.uri.utils.hashOrEndRe_));
5130 goog.uri.utils.getParamValue = function(uri, keyEncoded) {
5131   var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_), foundIndex = goog.uri.utils.findParam_(uri, 0, keyEncoded, hashOrEndIndex);
5132   if (0 > foundIndex) {
5133     return null;
5134   }
5135   var endPosition = uri.indexOf("&", foundIndex);
5136   if (0 > endPosition || endPosition > hashOrEndIndex) {
5137     endPosition = hashOrEndIndex;
5138   }
5139   foundIndex += keyEncoded.length + 1;
5140   return goog.string.urlDecode(uri.substr(foundIndex, endPosition - foundIndex));
5142 goog.uri.utils.getParamValues = function(uri, keyEncoded) {
5143   for (var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_), position = 0, foundIndex, result = [];0 <= (foundIndex = goog.uri.utils.findParam_(uri, position, keyEncoded, hashOrEndIndex));) {
5144     position = uri.indexOf("&", foundIndex);
5145     if (0 > position || position > hashOrEndIndex) {
5146       position = hashOrEndIndex;
5147     }
5148     foundIndex += keyEncoded.length + 1;
5149     result.push(goog.string.urlDecode(uri.substr(foundIndex, position - foundIndex)));
5150   }
5151   return result;
5153 goog.uri.utils.trailingQueryPunctuationRe_ = /[?&]($|#)/;
5154 goog.uri.utils.removeParam = function(uri, keyEncoded) {
5155   for (var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_), position = 0, foundIndex, buffer = [];0 <= (foundIndex = goog.uri.utils.findParam_(uri, position, keyEncoded, hashOrEndIndex));) {
5156     buffer.push(uri.substring(position, foundIndex)), position = Math.min(uri.indexOf("&", foundIndex) + 1 || hashOrEndIndex, hashOrEndIndex);
5157   }
5158   buffer.push(uri.substr(position));
5159   return buffer.join("").replace(goog.uri.utils.trailingQueryPunctuationRe_, "$1");
5161 goog.uri.utils.setParam = function(uri, keyEncoded, value) {
5162   return goog.uri.utils.appendParam(goog.uri.utils.removeParam(uri, keyEncoded), keyEncoded, value);
5164 goog.uri.utils.appendPath = function(baseUri, path) {
5165   goog.uri.utils.assertNoFragmentsOrQueries_(baseUri);
5166   goog.string.endsWith(baseUri, "/") && (baseUri = baseUri.substr(0, baseUri.length - 1));
5167   goog.string.startsWith(path, "/") && (path = path.substr(1));
5168   return goog.string.buildString(baseUri, "/", path);
5170 goog.uri.utils.setPath = function(uri, path) {
5171   goog.string.startsWith(path, "/") || (path = "/" + path);
5172   var parts = goog.uri.utils.split(uri);
5173   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]);
5175 goog.uri.utils.StandardQueryParam = {RANDOM:"zx"};
5176 goog.uri.utils.makeUnique = function(uri) {
5177   return goog.uri.utils.setParam(uri, goog.uri.utils.StandardQueryParam.RANDOM, goog.string.getRandomString());
5179 goog.net = {};
5180 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};
5181 goog.net.ErrorCode.getDebugMessage = function(errorCode) {
5182   switch(errorCode) {
5183     case goog.net.ErrorCode.NO_ERROR:
5184       return "No Error";
5185     case goog.net.ErrorCode.ACCESS_DENIED:
5186       return "Access denied to content document";
5187     case goog.net.ErrorCode.FILE_NOT_FOUND:
5188       return "File not found";
5189     case goog.net.ErrorCode.FF_SILENT_ERROR:
5190       return "Firefox silently errored";
5191     case goog.net.ErrorCode.CUSTOM_ERROR:
5192       return "Application custom error";
5193     case goog.net.ErrorCode.EXCEPTION:
5194       return "An exception occurred";
5195     case goog.net.ErrorCode.HTTP_ERROR:
5196       return "Http response at 400 or 500 level";
5197     case goog.net.ErrorCode.ABORT:
5198       return "Request was aborted";
5199     case goog.net.ErrorCode.TIMEOUT:
5200       return "Request timed out";
5201     case goog.net.ErrorCode.OFFLINE:
5202       return "The resource is not available offline";
5203     default:
5204       return "Unrecognized error code";
5205   }
5207 goog.net.EventType = {COMPLETE:"complete", SUCCESS:"success", ERROR:"error", ABORT:"abort", READY:"ready", READY_STATE_CHANGE:"readystatechange", TIMEOUT:"timeout", INCREMENTAL_DATA:"incrementaldata", PROGRESS:"progress"};
5208 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, 
5209 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, INTERNAL_SERVER_ERROR:500, NOT_IMPLEMENTED:501, BAD_GATEWAY:502, SERVICE_UNAVAILABLE:503, GATEWAY_TIMEOUT:504, HTTP_VERSION_NOT_SUPPORTED:505, QUIRK_IE_NO_CONTENT:1223};
5210 goog.net.HttpStatus.isSuccess = function(status) {
5211   switch(status) {
5212     case goog.net.HttpStatus.OK:
5213     ;
5214     case goog.net.HttpStatus.CREATED:
5215     ;
5216     case goog.net.HttpStatus.ACCEPTED:
5217     ;
5218     case goog.net.HttpStatus.NO_CONTENT:
5219     ;
5220     case goog.net.HttpStatus.PARTIAL_CONTENT:
5221     ;
5222     case goog.net.HttpStatus.NOT_MODIFIED:
5223     ;
5224     case goog.net.HttpStatus.QUIRK_IE_NO_CONTENT:
5225       return!0;
5226     default:
5227       return!1;
5228   }
5230 goog.net.XhrLike = function() {
5232 goog.net.XhrLike.prototype.open = function() {
5234 goog.net.XhrLike.prototype.send = function() {
5236 goog.net.XhrLike.prototype.abort = function() {
5238 goog.net.XhrLike.prototype.setRequestHeader = function() {
5240 goog.net.XhrLike.prototype.getResponseHeader = function() {
5242 goog.net.XhrLike.prototype.getAllResponseHeaders = function() {
5244 goog.net.XmlHttpFactory = function() {
5246 goog.net.XmlHttpFactory.prototype.cachedOptions_ = null;
5247 goog.net.XmlHttpFactory.prototype.getOptions = function() {
5248   return this.cachedOptions_ || (this.cachedOptions_ = this.internalGetOptions());
5250 goog.net.WrapperXmlHttpFactory = function(xhrFactory, optionsFactory) {
5251   this.xhrFactory_ = xhrFactory;
5252   this.optionsFactory_ = optionsFactory;
5254 goog.inherits(goog.net.WrapperXmlHttpFactory, goog.net.XmlHttpFactory);
5255 goog.net.WrapperXmlHttpFactory.prototype.createInstance = function() {
5256   return this.xhrFactory_();
5258 goog.net.WrapperXmlHttpFactory.prototype.getOptions = function() {
5259   return this.optionsFactory_();
5261 goog.net.XmlHttp = function() {
5262   return goog.net.XmlHttp.factory_.createInstance();
5264 goog.net.XmlHttp.ASSUME_NATIVE_XHR = !1;
5265 goog.net.XmlHttpDefines = {};
5266 goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR = !1;
5267 goog.net.XmlHttp.getOptions = function() {
5268   return goog.net.XmlHttp.factory_.getOptions();
5270 goog.net.XmlHttp.OptionType = {USE_NULL_FUNCTION:0, LOCAL_REQUEST_ERROR:1};
5271 goog.net.XmlHttp.ReadyState = {UNINITIALIZED:0, LOADING:1, LOADED:2, INTERACTIVE:3, COMPLETE:4};
5272 goog.net.XmlHttp.setFactory = function(factory, optionsFactory) {
5273   goog.net.XmlHttp.setGlobalFactory(new goog.net.WrapperXmlHttpFactory(goog.asserts.assert(factory), goog.asserts.assert(optionsFactory)));
5275 goog.net.XmlHttp.setGlobalFactory = function(factory) {
5276   goog.net.XmlHttp.factory_ = factory;
5278 goog.net.DefaultXmlHttpFactory = function() {
5280 goog.inherits(goog.net.DefaultXmlHttpFactory, goog.net.XmlHttpFactory);
5281 goog.net.DefaultXmlHttpFactory.prototype.createInstance = function() {
5282   var progId = this.getProgId_();
5283   return progId ? new ActiveXObject(progId) : new XMLHttpRequest;
5285 goog.net.DefaultXmlHttpFactory.prototype.internalGetOptions = function() {
5286   var progId = this.getProgId_(), options = {};
5287   progId && (options[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] = !0, options[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] = !0);
5288   return options;
5290 goog.net.DefaultXmlHttpFactory.prototype.getProgId_ = function() {
5291   if (goog.net.XmlHttp.ASSUME_NATIVE_XHR || goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR) {
5292     return "";
5293   }
5294   if (!this.ieProgId_ && "undefined" == typeof XMLHttpRequest && "undefined" != typeof ActiveXObject) {
5295     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++) {
5296       var candidate = ACTIVE_X_IDENTS[i];
5297       try {
5298         return new ActiveXObject(candidate), this.ieProgId_ = candidate;
5299       } catch (e) {
5300       }
5301     }
5302     throw Error("Could not create ActiveXObject. ActiveX might be disabled, or MSXML might not be installed");
5303   }
5304   return this.ieProgId_;
5306 goog.net.XmlHttp.setGlobalFactory(new goog.net.DefaultXmlHttpFactory);
5307 goog.net.XhrIo = function(opt_xmlHttpFactory) {
5308   goog.events.EventTarget.call(this);
5309   this.headers = new goog.structs.Map;
5310   this.xmlHttpFactory_ = opt_xmlHttpFactory || null;
5311   this.active_ = !1;
5312   this.xhrOptions_ = this.xhr_ = null;
5313   this.lastError_ = this.lastMethod_ = this.lastUri_ = "";
5314   this.inAbort_ = this.inOpen_ = this.inSend_ = this.errorDispatched_ = !1;
5315   this.timeoutInterval_ = 0;
5316   this.timeoutId_ = null;
5317   this.responseType_ = goog.net.XhrIo.ResponseType.DEFAULT;
5318   this.useXhr2Timeout_ = this.withCredentials_ = !1;
5320 goog.inherits(goog.net.XhrIo, goog.events.EventTarget);
5321 goog.net.XhrIo.ResponseType = {DEFAULT:"", TEXT:"text", DOCUMENT:"document", BLOB:"blob", ARRAY_BUFFER:"arraybuffer"};
5322 goog.net.XhrIo.prototype.logger_ = goog.log.getLogger("goog.net.XhrIo");
5323 goog.net.XhrIo.CONTENT_TYPE_HEADER = "Content-Type";
5324 goog.net.XhrIo.HTTP_SCHEME_PATTERN = /^https?$/i;
5325 goog.net.XhrIo.METHODS_WITH_FORM_DATA = ["POST", "PUT"];
5326 goog.net.XhrIo.FORM_CONTENT_TYPE = "application/x-www-form-urlencoded;charset=utf-8";
5327 goog.net.XhrIo.XHR2_TIMEOUT_ = "timeout";
5328 goog.net.XhrIo.XHR2_ON_TIMEOUT_ = "ontimeout";
5329 goog.net.XhrIo.sendInstances_ = [];
5330 goog.net.XhrIo.send = function(url, opt_callback, opt_method, opt_content, opt_headers, opt_timeoutInterval, opt_withCredentials) {
5331   var x = new goog.net.XhrIo;
5332   goog.net.XhrIo.sendInstances_.push(x);
5333   opt_callback && x.listen(goog.net.EventType.COMPLETE, opt_callback);
5334   x.listenOnce(goog.net.EventType.READY, x.cleanupSend_);
5335   opt_timeoutInterval && x.setTimeoutInterval(opt_timeoutInterval);
5336   opt_withCredentials && x.setWithCredentials(opt_withCredentials);
5337   x.send(url, opt_method, opt_content, opt_headers);
5339 goog.net.XhrIo.cleanup = function() {
5340   for (var instances = goog.net.XhrIo.sendInstances_;instances.length;) {
5341     instances.pop().dispose();
5342   }
5344 goog.net.XhrIo.protectEntryPoints = function(errorHandler) {
5345   goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = errorHandler.protectEntryPoint(goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_);
5347 goog.net.XhrIo.prototype.cleanupSend_ = function() {
5348   this.dispose();
5349   goog.array.remove(goog.net.XhrIo.sendInstances_, this);
5351 goog.net.XhrIo.prototype.setTimeoutInterval = function(ms) {
5352   this.timeoutInterval_ = Math.max(0, ms);
5354 goog.net.XhrIo.prototype.setWithCredentials = function(withCredentials) {
5355   this.withCredentials_ = withCredentials;
5357 goog.net.XhrIo.prototype.send = function(url, opt_method, opt_content, opt_headers) {
5358   if (this.xhr_) {
5359     throw Error("[goog.net.XhrIo] Object is active with another request=" + this.lastUri_ + "; newUri=" + url);
5360   }
5361   var method = opt_method ? opt_method.toUpperCase() : "GET";
5362   this.lastUri_ = url;
5363   this.lastError_ = "";
5364   this.lastMethod_ = method;
5365   this.errorDispatched_ = !1;
5366   this.active_ = !0;
5367   this.xhr_ = this.createXhr();
5368   this.xhrOptions_ = this.xmlHttpFactory_ ? this.xmlHttpFactory_.getOptions() : goog.net.XmlHttp.getOptions();
5369   this.xhr_.onreadystatechange = goog.bind(this.onReadyStateChange_, this);
5370   try {
5371     goog.log.fine(this.logger_, this.formatMsg_("Opening Xhr")), this.inOpen_ = !0, this.xhr_.open(method, String(url), !0), this.inOpen_ = !1;
5372   } catch (err) {
5373     goog.log.fine(this.logger_, this.formatMsg_("Error opening Xhr: " + err.message));
5374     this.error_(goog.net.ErrorCode.EXCEPTION, err);
5375     return;
5376   }
5377   var content = opt_content || "", headers = this.headers.clone();
5378   opt_headers && goog.structs.forEach(opt_headers, function(value, key) {
5379     headers.set(key, value);
5380   });
5381   var contentTypeKey = goog.array.find(headers.getKeys(), goog.net.XhrIo.isContentTypeHeader_), contentIsFormData = goog.global.FormData && content instanceof goog.global.FormData;
5382   !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);
5383   headers.forEach(function(value, key) {
5384     this.xhr_.setRequestHeader(key, value);
5385   }, this);
5386   this.responseType_ && (this.xhr_.responseType = this.responseType_);
5387   goog.object.containsKey(this.xhr_, "withCredentials") && (this.xhr_.withCredentials = this.withCredentials_);
5388   try {
5389     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_, 
5390     this)), goog.log.fine(this.logger_, this.formatMsg_("Sending request")), this.inSend_ = !0, this.xhr_.send(content), this.inSend_ = !1;
5391   } catch (err$$0) {
5392     goog.log.fine(this.logger_, this.formatMsg_("Send error: " + err$$0.message)), this.error_(goog.net.ErrorCode.EXCEPTION, err$$0);
5393   }
5395 goog.net.XhrIo.shouldUseXhr2Timeout_ = function(xhr) {
5396   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_]);
5398 goog.net.XhrIo.isContentTypeHeader_ = function(header) {
5399   return goog.string.caseInsensitiveEquals(goog.net.XhrIo.CONTENT_TYPE_HEADER, header);
5401 goog.net.XhrIo.prototype.createXhr = function() {
5402   return this.xmlHttpFactory_ ? this.xmlHttpFactory_.createInstance() : goog.net.XmlHttp();
5404 goog.net.XhrIo.prototype.timeout_ = function() {
5405   "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));
5407 goog.net.XhrIo.prototype.error_ = function(errorCode, err) {
5408   this.active_ = !1;
5409   this.xhr_ && (this.inAbort_ = !0, this.xhr_.abort(), this.inAbort_ = !1);
5410   this.lastError_ = err;
5411   this.dispatchErrors_();
5412   this.cleanUpXhr_();
5414 goog.net.XhrIo.prototype.dispatchErrors_ = function() {
5415   this.errorDispatched_ || (this.errorDispatched_ = !0, this.dispatchEvent(goog.net.EventType.COMPLETE), this.dispatchEvent(goog.net.EventType.ERROR));
5417 goog.net.XhrIo.prototype.abort = function() {
5418   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_());
5420 goog.net.XhrIo.prototype.disposeInternal = function() {
5421   this.xhr_ && (this.active_ && (this.active_ = !1, this.inAbort_ = !0, this.xhr_.abort(), this.inAbort_ = !1), this.cleanUpXhr_(!0));
5422   goog.net.XhrIo.superClass_.disposeInternal.call(this);
5424 goog.net.XhrIo.prototype.onReadyStateChange_ = function() {
5425   if (!this.isDisposed()) {
5426     if (this.inOpen_ || this.inSend_ || this.inAbort_) {
5427       this.onReadyStateChangeHelper_();
5428     } else {
5429       this.onReadyStateChangeEntryPoint_();
5430     }
5431   }
5433 goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = function() {
5434   this.onReadyStateChangeHelper_();
5436 goog.net.XhrIo.prototype.onReadyStateChangeHelper_ = function() {
5437   if (this.active_ && "undefined" != typeof goog) {
5438     if (this.xhrOptions_[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] && this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE && 2 == this.getStatus()) {
5439       goog.log.fine(this.logger_, this.formatMsg_("Local request error detected and ignored"));
5440     } else {
5441       if (this.inSend_ && this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE) {
5442         goog.Timer.callOnce(this.onReadyStateChange_, 0, this);
5443       } else {
5444         if (this.dispatchEvent(goog.net.EventType.READY_STATE_CHANGE), this.isComplete()) {
5445           goog.log.fine(this.logger_, this.formatMsg_("Request complete"));
5446           this.active_ = !1;
5447           try {
5448             this.isSuccess() ? (this.dispatchEvent(goog.net.EventType.COMPLETE), this.dispatchEvent(goog.net.EventType.SUCCESS)) : (this.lastError_ = this.getStatusText() + " [" + this.getStatus() + "]", this.dispatchErrors_());
5449           } finally {
5450             this.cleanUpXhr_();
5451           }
5452         }
5453       }
5454     }
5455   }
5457 goog.net.XhrIo.prototype.cleanUpXhr_ = function(opt_fromDispose) {
5458   if (this.xhr_) {
5459     this.cleanUpTimeoutTimer_();
5460     var xhr = this.xhr_, clearedOnReadyStateChange = this.xhrOptions_[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] ? goog.nullFunction : null;
5461     this.xhrOptions_ = this.xhr_ = null;
5462     opt_fromDispose || this.dispatchEvent(goog.net.EventType.READY);
5463     try {
5464       xhr.onreadystatechange = clearedOnReadyStateChange;
5465     } catch (e) {
5466       goog.log.error(this.logger_, "Problem encountered resetting onreadystatechange: " + e.message);
5467     }
5468   }
5470 goog.net.XhrIo.prototype.cleanUpTimeoutTimer_ = function() {
5471   this.xhr_ && this.useXhr2Timeout_ && (this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] = null);
5472   goog.isNumber(this.timeoutId_) && (goog.Timer.clear(this.timeoutId_), this.timeoutId_ = null);
5474 goog.net.XhrIo.prototype.isComplete = function() {
5475   return this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE;
5477 goog.net.XhrIo.prototype.isSuccess = function() {
5478   var status = this.getStatus();
5479   return goog.net.HttpStatus.isSuccess(status) || 0 === status && !this.isLastUriEffectiveSchemeHttp_();
5481 goog.net.XhrIo.prototype.isLastUriEffectiveSchemeHttp_ = function() {
5482   var scheme = goog.uri.utils.getEffectiveScheme(String(this.lastUri_));
5483   return goog.net.XhrIo.HTTP_SCHEME_PATTERN.test(scheme);
5485 goog.net.XhrIo.prototype.getReadyState = function() {
5486   return this.xhr_ ? this.xhr_.readyState : goog.net.XmlHttp.ReadyState.UNINITIALIZED;
5488 goog.net.XhrIo.prototype.getStatus = function() {
5489   try {
5490     return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ? this.xhr_.status : -1;
5491   } catch (e) {
5492     return-1;
5493   }
5495 goog.net.XhrIo.prototype.getStatusText = function() {
5496   try {
5497     return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ? this.xhr_.statusText : "";
5498   } catch (e) {
5499     return goog.log.fine(this.logger_, "Can not get status: " + e.message), "";
5500   }
5502 goog.net.XhrIo.prototype.getResponseText = function() {
5503   try {
5504     return this.xhr_ ? this.xhr_.responseText : "";
5505   } catch (e) {
5506     return goog.log.fine(this.logger_, "Can not get responseText: " + e.message), "";
5507   }
5509 goog.net.XhrIo.prototype.getResponseHeader = function(key) {
5510   return this.xhr_ && this.isComplete() ? this.xhr_.getResponseHeader(key) : void 0;
5512 goog.net.XhrIo.prototype.getAllResponseHeaders = function() {
5513   return this.xhr_ && this.isComplete() ? this.xhr_.getAllResponseHeaders() : "";
5515 goog.net.XhrIo.prototype.formatMsg_ = function(msg) {
5516   return msg + " [" + this.lastMethod_ + " " + this.lastUri_ + " " + this.getStatus() + "]";
5518 goog.debug.entryPointRegistry.register(function(transformer) {
5519   goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = transformer(goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_);
5521 goog.Uri = function(opt_uri, opt_ignoreCase) {
5522   var m;
5523   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] || 
5524   "", !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, 
5525   this.ignoreCase_));
5527 goog.Uri.preserveParameterTypesCompatibilityFlag = !1;
5528 goog.Uri.RANDOM_PARAM = goog.uri.utils.StandardQueryParam.RANDOM;
5529 goog.Uri.prototype.scheme_ = "";
5530 goog.Uri.prototype.userInfo_ = "";
5531 goog.Uri.prototype.domain_ = "";
5532 goog.Uri.prototype.port_ = null;
5533 goog.Uri.prototype.path_ = "";
5534 goog.Uri.prototype.fragment_ = "";
5535 goog.Uri.prototype.isReadOnly_ = !1;
5536 goog.Uri.prototype.ignoreCase_ = !1;
5537 goog.Uri.prototype.toString = function() {
5538   var out = [], scheme = this.getScheme();
5539   scheme && out.push(goog.Uri.encodeSpecialChars_(scheme, goog.Uri.reDisallowedInSchemeOrUserInfo_), ":");
5540   var domain = this.getDomain();
5541   if (domain) {
5542     out.push("//");
5543     var userInfo = this.getUserInfo();
5544     userInfo && out.push(goog.Uri.encodeSpecialChars_(userInfo, goog.Uri.reDisallowedInSchemeOrUserInfo_), "@");
5545     out.push(goog.string.urlEncode(domain));
5546     var port = this.getPort();
5547     null != port && out.push(":", String(port));
5548   }
5549   var path = this.getPath();
5550   path && (this.hasDomain() && "/" != path.charAt(0) && out.push("/"), out.push(goog.Uri.encodeSpecialChars_(path, "/" == path.charAt(0) ? goog.Uri.reDisallowedInAbsolutePath_ : goog.Uri.reDisallowedInRelativePath_)));
5551   var query = this.getEncodedQuery();
5552   query && out.push("?", query);
5553   var fragment = this.getFragment();
5554   fragment && out.push("#", goog.Uri.encodeSpecialChars_(fragment, goog.Uri.reDisallowedInFragment_));
5555   return out.join("");
5557 goog.Uri.prototype.resolve = function(relativeUri) {
5558   var absoluteUri = this.clone(), overridden = relativeUri.hasScheme();
5559   overridden ? absoluteUri.setScheme(relativeUri.getScheme()) : overridden = relativeUri.hasUserInfo();
5560   overridden ? absoluteUri.setUserInfo(relativeUri.getUserInfo()) : overridden = relativeUri.hasDomain();
5561   overridden ? absoluteUri.setDomain(relativeUri.getDomain()) : overridden = relativeUri.hasPort();
5562   var path = relativeUri.getPath();
5563   if (overridden) {
5564     absoluteUri.setPort(relativeUri.getPort());
5565   } else {
5566     if (overridden = relativeUri.hasPath()) {
5567       if ("/" != path.charAt(0)) {
5568         if (this.hasDomain() && !this.hasPath()) {
5569           path = "/" + path;
5570         } else {
5571           var lastSlashIndex = absoluteUri.getPath().lastIndexOf("/");
5572           -1 != lastSlashIndex && (path = absoluteUri.getPath().substr(0, lastSlashIndex + 1) + path);
5573         }
5574       }
5575       path = goog.Uri.removeDotSegments(path);
5576     }
5577   }
5578   overridden ? absoluteUri.setPath(path) : overridden = relativeUri.hasQuery();
5579   overridden ? absoluteUri.setQueryData(relativeUri.getDecodedQuery()) : overridden = relativeUri.hasFragment();
5580   overridden && absoluteUri.setFragment(relativeUri.getFragment());
5581   return absoluteUri;
5583 goog.Uri.prototype.clone = function() {
5584   return new goog.Uri(this);
5586 goog.Uri.prototype.getScheme = function() {
5587   return this.scheme_;
5589 goog.Uri.prototype.setScheme = function(newScheme, opt_decode) {
5590   this.enforceReadOnly();
5591   if (this.scheme_ = opt_decode ? goog.Uri.decodeOrEmpty_(newScheme) : newScheme) {
5592     this.scheme_ = this.scheme_.replace(/:$/, "");
5593   }
5594   return this;
5596 goog.Uri.prototype.hasScheme = function() {
5597   return!!this.scheme_;
5599 goog.Uri.prototype.getUserInfo = function() {
5600   return this.userInfo_;
5602 goog.Uri.prototype.setUserInfo = function(newUserInfo, opt_decode) {
5603   this.enforceReadOnly();
5604   this.userInfo_ = opt_decode ? goog.Uri.decodeOrEmpty_(newUserInfo) : newUserInfo;
5605   return this;
5607 goog.Uri.prototype.hasUserInfo = function() {
5608   return!!this.userInfo_;
5610 goog.Uri.prototype.getDomain = function() {
5611   return this.domain_;
5613 goog.Uri.prototype.setDomain = function(newDomain, opt_decode) {
5614   this.enforceReadOnly();
5615   this.domain_ = opt_decode ? goog.Uri.decodeOrEmpty_(newDomain) : newDomain;
5616   return this;
5618 goog.Uri.prototype.hasDomain = function() {
5619   return!!this.domain_;
5621 goog.Uri.prototype.getPort = function() {
5622   return this.port_;
5624 goog.Uri.prototype.setPort = function(newPort) {
5625   this.enforceReadOnly();
5626   if (newPort) {
5627     newPort = Number(newPort);
5628     if (isNaN(newPort) || 0 > newPort) {
5629       throw Error("Bad port number " + newPort);
5630     }
5631     this.port_ = newPort;
5632   } else {
5633     this.port_ = null;
5634   }
5635   return this;
5637 goog.Uri.prototype.hasPort = function() {
5638   return null != this.port_;
5640 goog.Uri.prototype.getPath = function() {
5641   return this.path_;
5643 goog.Uri.prototype.setPath = function(newPath, opt_decode) {
5644   this.enforceReadOnly();
5645   this.path_ = opt_decode ? goog.Uri.decodeOrEmpty_(newPath) : newPath;
5646   return this;
5648 goog.Uri.prototype.hasPath = function() {
5649   return!!this.path_;
5651 goog.Uri.prototype.hasQuery = function() {
5652   return "" !== this.queryData_.toString();
5654 goog.Uri.prototype.setQueryData = function(queryData, opt_decode) {
5655   this.enforceReadOnly();
5656   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_));
5657   return this;
5659 goog.Uri.prototype.getEncodedQuery = function() {
5660   return this.queryData_.toString();
5662 goog.Uri.prototype.getDecodedQuery = function() {
5663   return this.queryData_.toDecodedString();
5665 goog.Uri.prototype.getQueryData = function() {
5666   return this.queryData_;
5668 goog.Uri.prototype.setParameterValue = function(key, value) {
5669   this.enforceReadOnly();
5670   this.queryData_.set(key, value);
5671   return this;
5673 goog.Uri.prototype.getFragment = function() {
5674   return this.fragment_;
5676 goog.Uri.prototype.setFragment = function(newFragment, opt_decode) {
5677   this.enforceReadOnly();
5678   this.fragment_ = opt_decode ? goog.Uri.decodeOrEmpty_(newFragment) : newFragment;
5679   return this;
5681 goog.Uri.prototype.hasFragment = function() {
5682   return!!this.fragment_;
5684 goog.Uri.prototype.makeUnique = function() {
5685   this.enforceReadOnly();
5686   this.setParameterValue(goog.Uri.RANDOM_PARAM, goog.string.getRandomString());
5687   return this;
5689 goog.Uri.prototype.enforceReadOnly = function() {
5690   if (this.isReadOnly_) {
5691     throw Error("Tried to modify a read-only Uri");
5692   }
5694 goog.Uri.prototype.setIgnoreCase = function(ignoreCase) {
5695   this.ignoreCase_ = ignoreCase;
5696   this.queryData_ && this.queryData_.setIgnoreCase(ignoreCase);
5697   return this;
5699 goog.Uri.prototype.getIgnoreCase = function() {
5700   return this.ignoreCase_;
5702 goog.Uri.parse = function(uri, opt_ignoreCase) {
5703   return uri instanceof goog.Uri ? uri.clone() : new goog.Uri(uri, opt_ignoreCase);
5705 goog.Uri.create = function(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_query, opt_fragment, opt_ignoreCase) {
5706   var uri = new goog.Uri(null, opt_ignoreCase);
5707   opt_scheme && uri.setScheme(opt_scheme);
5708   opt_userInfo && uri.setUserInfo(opt_userInfo);
5709   opt_domain && uri.setDomain(opt_domain);
5710   opt_port && uri.setPort(opt_port);
5711   opt_path && uri.setPath(opt_path);
5712   opt_query && uri.setQueryData(opt_query);
5713   opt_fragment && uri.setFragment(opt_fragment);
5714   return uri;
5716 goog.Uri.resolve = function(base, rel) {
5717   base instanceof goog.Uri || (base = goog.Uri.parse(base));
5718   rel instanceof goog.Uri || (rel = goog.Uri.parse(rel));
5719   return base.resolve(rel);
5721 goog.Uri.removeDotSegments = function(path) {
5722   if (".." == path || "." == path) {
5723     return "";
5724   }
5725   if (goog.string.contains(path, "./") || goog.string.contains(path, "/.")) {
5726     for (var leadingSlash = goog.string.startsWith(path, "/"), segments = path.split("/"), out = [], pos = 0;pos < segments.length;) {
5727       var segment = segments[pos++];
5728       "." == 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);
5729     }
5730     return out.join("/");
5731   }
5732   return path;
5734 goog.Uri.decodeOrEmpty_ = function(val) {
5735   return val ? decodeURIComponent(val) : "";
5737 goog.Uri.encodeSpecialChars_ = function(unescapedPart, extra) {
5738   return goog.isString(unescapedPart) ? encodeURI(unescapedPart).replace(extra, goog.Uri.encodeChar_) : null;
5740 goog.Uri.encodeChar_ = function(ch) {
5741   var n = ch.charCodeAt(0);
5742   return "%" + (n >> 4 & 15).toString(16) + (n & 15).toString(16);
5744 goog.Uri.reDisallowedInSchemeOrUserInfo_ = /[#\/\?@]/g;
5745 goog.Uri.reDisallowedInRelativePath_ = /[\#\?:]/g;
5746 goog.Uri.reDisallowedInAbsolutePath_ = /[\#\?]/g;
5747 goog.Uri.reDisallowedInQuery_ = /[\#\?@]/g;
5748 goog.Uri.reDisallowedInFragment_ = /#/g;
5749 goog.Uri.haveSameDomain = function(uri1String, uri2String) {
5750   var pieces1 = goog.uri.utils.split(uri1String), pieces2 = goog.uri.utils.split(uri2String);
5751   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];
5753 goog.Uri.QueryData = function(opt_query, opt_uri, opt_ignoreCase) {
5754   this.encodedQuery_ = opt_query || null;
5755   this.ignoreCase_ = !!opt_ignoreCase;
5757 goog.Uri.QueryData.prototype.ensureKeyMapInitialized_ = function() {
5758   if (!this.keyMap_ && (this.keyMap_ = new goog.structs.Map, this.count_ = 0, this.encodedQuery_)) {
5759     for (var pairs = this.encodedQuery_.split("&"), i = 0;i < pairs.length;i++) {
5760       var indexOfEquals = pairs[i].indexOf("="), name = null, value = null;
5761       0 <= indexOfEquals ? (name = pairs[i].substring(0, indexOfEquals), value = pairs[i].substring(indexOfEquals + 1)) : name = pairs[i];
5762       name = goog.string.urlDecode(name);
5763       name = this.getKeyName_(name);
5764       this.add(name, value ? goog.string.urlDecode(value) : "");
5765     }
5766   }
5768 goog.Uri.QueryData.createFromMap = function(map, opt_uri, opt_ignoreCase) {
5769   var keys = goog.structs.getKeys(map);
5770   if ("undefined" == typeof keys) {
5771     throw Error("Keys are undefined");
5772   }
5773   for (var queryData = new goog.Uri.QueryData(null, null, opt_ignoreCase), values = goog.structs.getValues(map), i = 0;i < keys.length;i++) {
5774     var key = keys[i], value = values[i];
5775     goog.isArray(value) ? queryData.setValues(key, value) : queryData.add(key, value);
5776   }
5777   return queryData;
5779 goog.Uri.QueryData.createFromKeysValues = function(keys, values, opt_uri, opt_ignoreCase) {
5780   if (keys.length != values.length) {
5781     throw Error("Mismatched lengths for keys/values");
5782   }
5783   for (var queryData = new goog.Uri.QueryData(null, null, opt_ignoreCase), i = 0;i < keys.length;i++) {
5784     queryData.add(keys[i], values[i]);
5785   }
5786   return queryData;
5788 goog.Uri.QueryData.prototype.keyMap_ = null;
5789 goog.Uri.QueryData.prototype.count_ = null;
5790 goog.Uri.QueryData.prototype.getCount = function() {
5791   this.ensureKeyMapInitialized_();
5792   return this.count_;
5794 goog.Uri.QueryData.prototype.add = function(key, value) {
5795   this.ensureKeyMapInitialized_();
5796   this.invalidateCache_();
5797   key = this.getKeyName_(key);
5798   var values = this.keyMap_.get(key);
5799   values || this.keyMap_.set(key, values = []);
5800   values.push(value);
5801   this.count_++;
5802   return this;
5804 goog.Uri.QueryData.prototype.remove = function(key) {
5805   this.ensureKeyMapInitialized_();
5806   key = this.getKeyName_(key);
5807   return this.keyMap_.containsKey(key) ? (this.invalidateCache_(), this.count_ -= this.keyMap_.get(key).length, this.keyMap_.remove(key)) : !1;
5809 goog.Uri.QueryData.prototype.clear = function() {
5810   this.invalidateCache_();
5811   this.keyMap_ = null;
5812   this.count_ = 0;
5814 goog.Uri.QueryData.prototype.isEmpty = function() {
5815   this.ensureKeyMapInitialized_();
5816   return 0 == this.count_;
5818 goog.Uri.QueryData.prototype.containsKey = function(key) {
5819   this.ensureKeyMapInitialized_();
5820   key = this.getKeyName_(key);
5821   return this.keyMap_.containsKey(key);
5823 goog.Uri.QueryData.prototype.containsValue = function(value) {
5824   var vals = this.getValues();
5825   return goog.array.contains(vals, value);
5827 goog.Uri.QueryData.prototype.getKeys = function() {
5828   this.ensureKeyMapInitialized_();
5829   for (var vals = this.keyMap_.getValues(), keys = this.keyMap_.getKeys(), rv = [], i = 0;i < keys.length;i++) {
5830     for (var val = vals[i], j = 0;j < val.length;j++) {
5831       rv.push(keys[i]);
5832     }
5833   }
5834   return rv;
5836 goog.Uri.QueryData.prototype.getValues = function(opt_key) {
5837   this.ensureKeyMapInitialized_();
5838   var rv = [];
5839   if (goog.isString(opt_key)) {
5840     this.containsKey(opt_key) && (rv = goog.array.concat(rv, this.keyMap_.get(this.getKeyName_(opt_key))));
5841   } else {
5842     for (var values = this.keyMap_.getValues(), i = 0;i < values.length;i++) {
5843       rv = goog.array.concat(rv, values[i]);
5844     }
5845   }
5846   return rv;
5848 goog.Uri.QueryData.prototype.set = function(key, value) {
5849   this.ensureKeyMapInitialized_();
5850   this.invalidateCache_();
5851   key = this.getKeyName_(key);
5852   this.containsKey(key) && (this.count_ -= this.keyMap_.get(key).length);
5853   this.keyMap_.set(key, [value]);
5854   this.count_++;
5855   return this;
5857 goog.Uri.QueryData.prototype.get = function(key, opt_default) {
5858   var values = key ? this.getValues(key) : [];
5859   return goog.Uri.preserveParameterTypesCompatibilityFlag ? 0 < values.length ? values[0] : opt_default : 0 < values.length ? String(values[0]) : opt_default;
5861 goog.Uri.QueryData.prototype.setValues = function(key, values) {
5862   this.remove(key);
5863   0 < values.length && (this.invalidateCache_(), this.keyMap_.set(this.getKeyName_(key), goog.array.clone(values)), this.count_ += values.length);
5865 goog.Uri.QueryData.prototype.toString = function() {
5866   if (this.encodedQuery_) {
5867     return this.encodedQuery_;
5868   }
5869   if (!this.keyMap_) {
5870     return "";
5871   }
5872   for (var sb = [], keys = this.keyMap_.getKeys(), i = 0;i < keys.length;i++) {
5873     for (var key = keys[i], encodedKey = goog.string.urlEncode(key), val = this.getValues(key), j = 0;j < val.length;j++) {
5874       var param = encodedKey;
5875       "" !== val[j] && (param += "=" + goog.string.urlEncode(val[j]));
5876       sb.push(param);
5877     }
5878   }
5879   return this.encodedQuery_ = sb.join("&");
5881 goog.Uri.QueryData.prototype.toDecodedString = function() {
5882   return goog.Uri.decodeOrEmpty_(this.toString());
5884 goog.Uri.QueryData.prototype.invalidateCache_ = function() {
5885   this.encodedQuery_ = null;
5887 goog.Uri.QueryData.prototype.clone = function() {
5888   var rv = new goog.Uri.QueryData;
5889   rv.encodedQuery_ = this.encodedQuery_;
5890   this.keyMap_ && (rv.keyMap_ = this.keyMap_.clone(), rv.count_ = this.count_);
5891   return rv;
5893 goog.Uri.QueryData.prototype.getKeyName_ = function(arg) {
5894   var keyName = String(arg);
5895   this.ignoreCase_ && (keyName = keyName.toLowerCase());
5896   return keyName;
5898 goog.Uri.QueryData.prototype.setIgnoreCase = function(ignoreCase) {
5899   var resetKeys = ignoreCase && !this.ignoreCase_;
5900   resetKeys && (this.ensureKeyMapInitialized_(), this.invalidateCache_(), this.keyMap_.forEach(function(value, key) {
5901     var lowerCase = key.toLowerCase();
5902     key != lowerCase && (this.remove(key), this.setValues(lowerCase, value));
5903   }, this));
5904   this.ignoreCase_ = ignoreCase;
5906 goog.Uri.QueryData.prototype.extend = function(var_args) {
5907   for (var i = 0;i < arguments.length;i++) {
5908     var data = arguments[i];
5909     goog.structs.forEach(data, function(value, key) {
5910       this.add(key, value);
5911     }, this);
5912   }
5914 goog.appengine = {};
5915 goog.appengine.DevChannel = function(token) {
5916   this.token_ = token;
5918 goog.appengine.DevChannel.prototype.open = function(opt_handler) {
5919   opt_handler = opt_handler || new goog.appengine.DevSocket.Handler;
5920   return new goog.appengine.DevSocket(this.token_, opt_handler);
5922 goog.appengine.DevSocket = function(token, handler) {
5923   this.readyState = goog.appengine.DevSocket.ReadyState.CONNECTING;
5924   this.token_ = token;
5925   this.applicationKey_ = token.substring(token.lastIndexOf("-") + 1);
5926   this.clientId_ = null;
5927   this.onopen = handler.onopen;
5928   this.onmessage = handler.onmessage;
5929   this.onerror = handler.onerror;
5930   this.onclose = handler.onclose;
5931   this.win_ = goog.dom.getWindow();
5932   this.pollingTimer_ = null;
5933   goog.net.XhrIo.send(this.getUrl_("connect"), goog.bind(this.connect_, this));
5934   goog.events.listen(this.win_, "beforeunload", goog.bind(this.beforeunload_, this));
5935   if (!document.body) {
5936     throw "document.body is not defined -- do not create socket from script in <head>.";
5937   }
5939 goog.appengine.DevSocket.POLLING_TIMEOUT_MS = 500;
5940 goog.appengine.DevSocket.BASE_URL = "/_ah/channel/";
5941 goog.appengine.DevSocket.ReadyState = {CONNECTING:0, OPEN:1, CLOSING:2, CLOSED:3};
5942 goog.appengine.DevSocket.prototype.getUrl_ = function(command) {
5943   var url = goog.appengine.DevSocket.BASE_URL + "dev?command=" + command + "&channel=" + this.token_;
5944   this.clientId_ && (url += "&client=" + this.clientId_);
5945   return url;
5947 goog.appengine.DevSocket.prototype.connect_ = function(e) {
5948   var xhr = e.target;
5949   if (xhr.isSuccess()) {
5950     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);
5951   } else {
5952     this.readyState = goog.appengine.DevSocket.ReadyState.CLOSING;
5953     var evt = {};
5954     evt.description = xhr.getStatusText();
5955     evt.code = xhr.getStatus();
5956     this.onerror(evt);
5957     this.readyState = goog.appengine.DevSocket.ReadyState.CLOSED;
5958     this.onclose();
5959   }
5961 goog.appengine.DevSocket.prototype.disconnect_ = function() {
5962   this.readyState = goog.appengine.DevSocket.ReadyState.CLOSED;
5963   this.onclose();
5965 goog.appengine.DevSocket.prototype.forwardMessage_ = function(e) {
5966   var xhr = e.target;
5967   if (xhr.isSuccess()) {
5968     var evt = {};
5969     evt.data = xhr.getResponseText();
5970     if (evt.data.length) {
5971       this.onmessage(evt);
5972     }
5973     this.readyState == goog.appengine.DevSocket.ReadyState.OPEN && (this.pollingTimer_ = this.win_.setTimeout(goog.bind(this.poll_, this), goog.appengine.DevSocket.POLLING_TIMEOUT_MS));
5974   } else {
5975     evt = {}, evt.description = xhr.getStatusText(), evt.code = xhr.getStatus(), this.onerror(evt), this.readyState = goog.appengine.DevSocket.ReadyState.CLOSED, this.onclose();
5976   }
5978 goog.appengine.DevSocket.prototype.poll_ = function() {
5979   goog.net.XhrIo.send(this.getUrl_("poll"), goog.bind(this.forwardMessage_, this));
5981 goog.appengine.DevSocket.prototype.beforeunload_ = function() {
5982   var xhr = goog.net.XmlHttp();
5983   xhr.open("GET", this.getUrl_("disconnect"), !1);
5984   xhr.send();
5986 goog.appengine.DevSocket.prototype.forwardSendComplete_ = function(e) {
5987   var xhr = e.target;
5988   if (!xhr.isSuccess()) {
5989     var evt = {};
5990     evt.description = xhr.getStatusText();
5991     evt.code = xhr.getStatus();
5992     this.onerror(evt);
5993   }
5995 goog.appengine.DevSocket.prototype.send = function(data) {
5996   if (this.readyState != goog.appengine.DevSocket.ReadyState.OPEN) {
5997     return!1;
5998   }
5999   var url = goog.appengine.DevSocket.BASE_URL + "receive", sendData = new goog.Uri.QueryData;
6000   sendData.set("key", this.applicationKey_);
6001   sendData.set("msg", data);
6002   goog.net.XhrIo.send(url, goog.bind(this.forwardSendComplete_, this), "POST", sendData.toString());
6003   return!0;
6005 goog.appengine.DevSocket.prototype.close = function() {
6006   this.readyState = goog.appengine.DevSocket.ReadyState.CLOSING;
6007   this.pollingTimer_ && this.win_.clearTimeout(this.pollingTimer_);
6008   goog.net.XhrIo.send(this.getUrl_("disconnect"), goog.bind(this.disconnect_, this));
6010 goog.appengine.DevSocket.Handler = function() {
6012 goog.appengine.DevSocket.Handler.prototype.onopen = function() {
6014 goog.appengine.DevSocket.Handler.prototype.onmessage = function() {
6016 goog.appengine.DevSocket.Handler.prototype.onerror = function() {
6018 goog.appengine.DevSocket.Handler.prototype.onclose = function() {
6020 goog.exportSymbol("goog.appengine.Channel", goog.appengine.DevChannel);
6021 goog.exportSymbol("goog.appengine.Channel.prototype.open", goog.appengine.DevChannel.prototype.open);
6022 goog.exportSymbol("goog.appengine.Socket.Handler", goog.appengine.DevSocket.Handler);
6023 goog.exportSymbol("goog.appengine.Socket.Handler.prototype.onopen", goog.appengine.DevChannel.prototype.onopen);
6024 goog.exportSymbol("goog.appengine.Socket.Handler.prototype.onmessage", goog.appengine.DevSocket.Handler.prototype.onmessage);
6025 goog.exportSymbol("goog.appengine.Socket.Handler.prototype.onerror", goog.appengine.DevSocket.Handler.prototype.onerror);
6026 goog.exportSymbol("goog.appengine.Socket.Handler.prototype.onclose", goog.appengine.DevSocket.Handler.prototype.onclose);
6027 goog.exportSymbol("goog.appengine.Socket", goog.appengine.DevSocket);
6028 goog.exportSymbol("goog.appengine.Socket.ReadyState", goog.appengine.DevSocket.ReadyState);
6029 goog.exportSymbol("goog.appengine.Socket.prototype.send", goog.appengine.DevSocket.prototype.send);
6030 goog.exportSymbol("goog.appengine.Socket.prototype.close", goog.appengine.DevSocket.prototype.close);
6031  })()