1/** 2 * @license 3 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 4 * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 * Code distributed by Google as part of the polymer project is also 8 * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 */ 10// @version 0.7.24 11(function() { 12 window.WebComponents = window.WebComponents || { 13 flags: {} 14 }; 15 var file = "webcomponents-lite.js"; 16 var script = document.querySelector('script[src*="' + file + '"]'); 17 var flags = {}; 18 if (!flags.noOpts) { 19 location.search.slice(1).split("&").forEach(function(option) { 20 var parts = option.split("="); 21 var match; 22 if (parts[0] && (match = parts[0].match(/wc-(.+)/))) { 23 flags[match[1]] = parts[1] || true; 24 } 25 }); 26 if (script) { 27 for (var i = 0, a; a = script.attributes[i]; i++) { 28 if (a.name !== "src") { 29 flags[a.name] = a.value || true; 30 } 31 } 32 } 33 if (flags.log && flags.log.split) { 34 var parts = flags.log.split(","); 35 flags.log = {}; 36 parts.forEach(function(f) { 37 flags.log[f] = true; 38 }); 39 } else { 40 flags.log = {}; 41 } 42 } 43 if (flags.register) { 44 window.CustomElements = window.CustomElements || { 45 flags: {} 46 }; 47 window.CustomElements.flags.register = flags.register; 48 } 49 WebComponents.flags = flags; 50})(); 51 52(function(scope) { 53 "use strict"; 54 var hasWorkingUrl = false; 55 if (!scope.forceJURL) { 56 try { 57 var u = new URL("b", "http://a"); 58 u.pathname = "c%20d"; 59 hasWorkingUrl = u.href === "http://a/c%20d"; 60 } catch (e) {} 61 } 62 if (hasWorkingUrl) return; 63 var relative = Object.create(null); 64 relative["ftp"] = 21; 65 relative["file"] = 0; 66 relative["gopher"] = 70; 67 relative["http"] = 80; 68 relative["https"] = 443; 69 relative["ws"] = 80; 70 relative["wss"] = 443; 71 var relativePathDotMapping = Object.create(null); 72 relativePathDotMapping["%2e"] = "."; 73 relativePathDotMapping[".%2e"] = ".."; 74 relativePathDotMapping["%2e."] = ".."; 75 relativePathDotMapping["%2e%2e"] = ".."; 76 function isRelativeScheme(scheme) { 77 return relative[scheme] !== undefined; 78 } 79 function invalid() { 80 clear.call(this); 81 this._isInvalid = true; 82 } 83 function IDNAToASCII(h) { 84 if ("" == h) { 85 invalid.call(this); 86 } 87 return h.toLowerCase(); 88 } 89 function percentEscape(c) { 90 var unicode = c.charCodeAt(0); 91 if (unicode > 32 && unicode < 127 && [ 34, 35, 60, 62, 63, 96 ].indexOf(unicode) == -1) { 92 return c; 93 } 94 return encodeURIComponent(c); 95 } 96 function percentEscapeQuery(c) { 97 var unicode = c.charCodeAt(0); 98 if (unicode > 32 && unicode < 127 && [ 34, 35, 60, 62, 96 ].indexOf(unicode) == -1) { 99 return c; 100 } 101 return encodeURIComponent(c); 102 } 103 var EOF = undefined, ALPHA = /[a-zA-Z]/, ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; 104 function parse(input, stateOverride, base) { 105 function err(message) { 106 errors.push(message); 107 } 108 var state = stateOverride || "scheme start", cursor = 0, buffer = "", seenAt = false, seenBracket = false, errors = []; 109 loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { 110 var c = input[cursor]; 111 switch (state) { 112 case "scheme start": 113 if (c && ALPHA.test(c)) { 114 buffer += c.toLowerCase(); 115 state = "scheme"; 116 } else if (!stateOverride) { 117 buffer = ""; 118 state = "no scheme"; 119 continue; 120 } else { 121 err("Invalid scheme."); 122 break loop; 123 } 124 break; 125 126 case "scheme": 127 if (c && ALPHANUMERIC.test(c)) { 128 buffer += c.toLowerCase(); 129 } else if (":" == c) { 130 this._scheme = buffer; 131 buffer = ""; 132 if (stateOverride) { 133 break loop; 134 } 135 if (isRelativeScheme(this._scheme)) { 136 this._isRelative = true; 137 } 138 if ("file" == this._scheme) { 139 state = "relative"; 140 } else if (this._isRelative && base && base._scheme == this._scheme) { 141 state = "relative or authority"; 142 } else if (this._isRelative) { 143 state = "authority first slash"; 144 } else { 145 state = "scheme data"; 146 } 147 } else if (!stateOverride) { 148 buffer = ""; 149 cursor = 0; 150 state = "no scheme"; 151 continue; 152 } else if (EOF == c) { 153 break loop; 154 } else { 155 err("Code point not allowed in scheme: " + c); 156 break loop; 157 } 158 break; 159 160 case "scheme data": 161 if ("?" == c) { 162 this._query = "?"; 163 state = "query"; 164 } else if ("#" == c) { 165 this._fragment = "#"; 166 state = "fragment"; 167 } else { 168 if (EOF != c && "\t" != c && "\n" != c && "\r" != c) { 169 this._schemeData += percentEscape(c); 170 } 171 } 172 break; 173 174 case "no scheme": 175 if (!base || !isRelativeScheme(base._scheme)) { 176 err("Missing scheme."); 177 invalid.call(this); 178 } else { 179 state = "relative"; 180 continue; 181 } 182 break; 183 184 case "relative or authority": 185 if ("/" == c && "/" == input[cursor + 1]) { 186 state = "authority ignore slashes"; 187 } else { 188 err("Expected /, got: " + c); 189 state = "relative"; 190 continue; 191 } 192 break; 193 194 case "relative": 195 this._isRelative = true; 196 if ("file" != this._scheme) this._scheme = base._scheme; 197 if (EOF == c) { 198 this._host = base._host; 199 this._port = base._port; 200 this._path = base._path.slice(); 201 this._query = base._query; 202 this._username = base._username; 203 this._password = base._password; 204 break loop; 205 } else if ("/" == c || "\\" == c) { 206 if ("\\" == c) err("\\ is an invalid code point."); 207 state = "relative slash"; 208 } else if ("?" == c) { 209 this._host = base._host; 210 this._port = base._port; 211 this._path = base._path.slice(); 212 this._query = "?"; 213 this._username = base._username; 214 this._password = base._password; 215 state = "query"; 216 } else if ("#" == c) { 217 this._host = base._host; 218 this._port = base._port; 219 this._path = base._path.slice(); 220 this._query = base._query; 221 this._fragment = "#"; 222 this._username = base._username; 223 this._password = base._password; 224 state = "fragment"; 225 } else { 226 var nextC = input[cursor + 1]; 227 var nextNextC = input[cursor + 2]; 228 if ("file" != this._scheme || !ALPHA.test(c) || nextC != ":" && nextC != "|" || EOF != nextNextC && "/" != nextNextC && "\\" != nextNextC && "?" != nextNextC && "#" != nextNextC) { 229 this._host = base._host; 230 this._port = base._port; 231 this._username = base._username; 232 this._password = base._password; 233 this._path = base._path.slice(); 234 this._path.pop(); 235 } 236 state = "relative path"; 237 continue; 238 } 239 break; 240 241 case "relative slash": 242 if ("/" == c || "\\" == c) { 243 if ("\\" == c) { 244 err("\\ is an invalid code point."); 245 } 246 if ("file" == this._scheme) { 247 state = "file host"; 248 } else { 249 state = "authority ignore slashes"; 250 } 251 } else { 252 if ("file" != this._scheme) { 253 this._host = base._host; 254 this._port = base._port; 255 this._username = base._username; 256 this._password = base._password; 257 } 258 state = "relative path"; 259 continue; 260 } 261 break; 262 263 case "authority first slash": 264 if ("/" == c) { 265 state = "authority second slash"; 266 } else { 267 err("Expected '/', got: " + c); 268 state = "authority ignore slashes"; 269 continue; 270 } 271 break; 272 273 case "authority second slash": 274 state = "authority ignore slashes"; 275 if ("/" != c) { 276 err("Expected '/', got: " + c); 277 continue; 278 } 279 break; 280 281 case "authority ignore slashes": 282 if ("/" != c && "\\" != c) { 283 state = "authority"; 284 continue; 285 } else { 286 err("Expected authority, got: " + c); 287 } 288 break; 289 290 case "authority": 291 if ("@" == c) { 292 if (seenAt) { 293 err("@ already seen."); 294 buffer += "%40"; 295 } 296 seenAt = true; 297 for (var i = 0; i < buffer.length; i++) { 298 var cp = buffer[i]; 299 if ("\t" == cp || "\n" == cp || "\r" == cp) { 300 err("Invalid whitespace in authority."); 301 continue; 302 } 303 if (":" == cp && null === this._password) { 304 this._password = ""; 305 continue; 306 } 307 var tempC = percentEscape(cp); 308 null !== this._password ? this._password += tempC : this._username += tempC; 309 } 310 buffer = ""; 311 } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) { 312 cursor -= buffer.length; 313 buffer = ""; 314 state = "host"; 315 continue; 316 } else { 317 buffer += c; 318 } 319 break; 320 321 case "file host": 322 if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) { 323 if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ":" || buffer[1] == "|")) { 324 state = "relative path"; 325 } else if (buffer.length == 0) { 326 state = "relative path start"; 327 } else { 328 this._host = IDNAToASCII.call(this, buffer); 329 buffer = ""; 330 state = "relative path start"; 331 } 332 continue; 333 } else if ("\t" == c || "\n" == c || "\r" == c) { 334 err("Invalid whitespace in file host."); 335 } else { 336 buffer += c; 337 } 338 break; 339 340 case "host": 341 case "hostname": 342 if (":" == c && !seenBracket) { 343 this._host = IDNAToASCII.call(this, buffer); 344 buffer = ""; 345 state = "port"; 346 if ("hostname" == stateOverride) { 347 break loop; 348 } 349 } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) { 350 this._host = IDNAToASCII.call(this, buffer); 351 buffer = ""; 352 state = "relative path start"; 353 if (stateOverride) { 354 break loop; 355 } 356 continue; 357 } else if ("\t" != c && "\n" != c && "\r" != c) { 358 if ("[" == c) { 359 seenBracket = true; 360 } else if ("]" == c) { 361 seenBracket = false; 362 } 363 buffer += c; 364 } else { 365 err("Invalid code point in host/hostname: " + c); 366 } 367 break; 368 369 case "port": 370 if (/[0-9]/.test(c)) { 371 buffer += c; 372 } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c || stateOverride) { 373 if ("" != buffer) { 374 var temp = parseInt(buffer, 10); 375 if (temp != relative[this._scheme]) { 376 this._port = temp + ""; 377 } 378 buffer = ""; 379 } 380 if (stateOverride) { 381 break loop; 382 } 383 state = "relative path start"; 384 continue; 385 } else if ("\t" == c || "\n" == c || "\r" == c) { 386 err("Invalid code point in port: " + c); 387 } else { 388 invalid.call(this); 389 } 390 break; 391 392 case "relative path start": 393 if ("\\" == c) err("'\\' not allowed in path."); 394 state = "relative path"; 395 if ("/" != c && "\\" != c) { 396 continue; 397 } 398 break; 399 400 case "relative path": 401 if (EOF == c || "/" == c || "\\" == c || !stateOverride && ("?" == c || "#" == c)) { 402 if ("\\" == c) { 403 err("\\ not allowed in relative path."); 404 } 405 var tmp; 406 if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { 407 buffer = tmp; 408 } 409 if (".." == buffer) { 410 this._path.pop(); 411 if ("/" != c && "\\" != c) { 412 this._path.push(""); 413 } 414 } else if ("." == buffer && "/" != c && "\\" != c) { 415 this._path.push(""); 416 } else if ("." != buffer) { 417 if ("file" == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == "|") { 418 buffer = buffer[0] + ":"; 419 } 420 this._path.push(buffer); 421 } 422 buffer = ""; 423 if ("?" == c) { 424 this._query = "?"; 425 state = "query"; 426 } else if ("#" == c) { 427 this._fragment = "#"; 428 state = "fragment"; 429 } 430 } else if ("\t" != c && "\n" != c && "\r" != c) { 431 buffer += percentEscape(c); 432 } 433 break; 434 435 case "query": 436 if (!stateOverride && "#" == c) { 437 this._fragment = "#"; 438 state = "fragment"; 439 } else if (EOF != c && "\t" != c && "\n" != c && "\r" != c) { 440 this._query += percentEscapeQuery(c); 441 } 442 break; 443 444 case "fragment": 445 if (EOF != c && "\t" != c && "\n" != c && "\r" != c) { 446 this._fragment += c; 447 } 448 break; 449 } 450 cursor++; 451 } 452 } 453 function clear() { 454 this._scheme = ""; 455 this._schemeData = ""; 456 this._username = ""; 457 this._password = null; 458 this._host = ""; 459 this._port = ""; 460 this._path = []; 461 this._query = ""; 462 this._fragment = ""; 463 this._isInvalid = false; 464 this._isRelative = false; 465 } 466 function jURL(url, base) { 467 if (base !== undefined && !(base instanceof jURL)) base = new jURL(String(base)); 468 this._url = url; 469 clear.call(this); 470 var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ""); 471 parse.call(this, input, null, base); 472 } 473 jURL.prototype = { 474 toString: function() { 475 return this.href; 476 }, 477 get href() { 478 if (this._isInvalid) return this._url; 479 var authority = ""; 480 if ("" != this._username || null != this._password) { 481 authority = this._username + (null != this._password ? ":" + this._password : "") + "@"; 482 } 483 return this.protocol + (this._isRelative ? "//" + authority + this.host : "") + this.pathname + this._query + this._fragment; 484 }, 485 set href(href) { 486 clear.call(this); 487 parse.call(this, href); 488 }, 489 get protocol() { 490 return this._scheme + ":"; 491 }, 492 set protocol(protocol) { 493 if (this._isInvalid) return; 494 parse.call(this, protocol + ":", "scheme start"); 495 }, 496 get host() { 497 return this._isInvalid ? "" : this._port ? this._host + ":" + this._port : this._host; 498 }, 499 set host(host) { 500 if (this._isInvalid || !this._isRelative) return; 501 parse.call(this, host, "host"); 502 }, 503 get hostname() { 504 return this._host; 505 }, 506 set hostname(hostname) { 507 if (this._isInvalid || !this._isRelative) return; 508 parse.call(this, hostname, "hostname"); 509 }, 510 get port() { 511 return this._port; 512 }, 513 set port(port) { 514 if (this._isInvalid || !this._isRelative) return; 515 parse.call(this, port, "port"); 516 }, 517 get pathname() { 518 return this._isInvalid ? "" : this._isRelative ? "/" + this._path.join("/") : this._schemeData; 519 }, 520 set pathname(pathname) { 521 if (this._isInvalid || !this._isRelative) return; 522 this._path = []; 523 parse.call(this, pathname, "relative path start"); 524 }, 525 get search() { 526 return this._isInvalid || !this._query || "?" == this._query ? "" : this._query; 527 }, 528 set search(search) { 529 if (this._isInvalid || !this._isRelative) return; 530 this._query = "?"; 531 if ("?" == search[0]) search = search.slice(1); 532 parse.call(this, search, "query"); 533 }, 534 get hash() { 535 return this._isInvalid || !this._fragment || "#" == this._fragment ? "" : this._fragment; 536 }, 537 set hash(hash) { 538 if (this._isInvalid) return; 539 this._fragment = "#"; 540 if ("#" == hash[0]) hash = hash.slice(1); 541 parse.call(this, hash, "fragment"); 542 }, 543 get origin() { 544 var host; 545 if (this._isInvalid || !this._scheme) { 546 return ""; 547 } 548 switch (this._scheme) { 549 case "data": 550 case "file": 551 case "javascript": 552 case "mailto": 553 return "null"; 554 } 555 host = this.host; 556 if (!host) { 557 return ""; 558 } 559 return this._scheme + "://" + host; 560 } 561 }; 562 var OriginalURL = scope.URL; 563 if (OriginalURL) { 564 jURL.createObjectURL = function(blob) { 565 return OriginalURL.createObjectURL.apply(OriginalURL, arguments); 566 }; 567 jURL.revokeObjectURL = function(url) { 568 OriginalURL.revokeObjectURL(url); 569 }; 570 } 571 scope.URL = jURL; 572})(self); 573 574if (typeof WeakMap === "undefined") { 575 (function() { 576 var defineProperty = Object.defineProperty; 577 var counter = Date.now() % 1e9; 578 var WeakMap = function() { 579 this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__"); 580 }; 581 WeakMap.prototype = { 582 set: function(key, value) { 583 var entry = key[this.name]; 584 if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, { 585 value: [ key, value ], 586 writable: true 587 }); 588 return this; 589 }, 590 get: function(key) { 591 var entry; 592 return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; 593 }, 594 "delete": function(key) { 595 var entry = key[this.name]; 596 if (!entry || entry[0] !== key) return false; 597 entry[0] = entry[1] = undefined; 598 return true; 599 }, 600 has: function(key) { 601 var entry = key[this.name]; 602 if (!entry) return false; 603 return entry[0] === key; 604 } 605 }; 606 window.WeakMap = WeakMap; 607 })(); 608} 609 610(function(global) { 611 if (global.JsMutationObserver) { 612 return; 613 } 614 var registrationsTable = new WeakMap(); 615 var setImmediate; 616 if (/Trident|Edge/.test(navigator.userAgent)) { 617 setImmediate = setTimeout; 618 } else if (window.setImmediate) { 619 setImmediate = window.setImmediate; 620 } else { 621 var setImmediateQueue = []; 622 var sentinel = String(Math.random()); 623 window.addEventListener("message", function(e) { 624 if (e.data === sentinel) { 625 var queue = setImmediateQueue; 626 setImmediateQueue = []; 627 queue.forEach(function(func) { 628 func(); 629 }); 630 } 631 }); 632 setImmediate = function(func) { 633 setImmediateQueue.push(func); 634 window.postMessage(sentinel, "*"); 635 }; 636 } 637 var isScheduled = false; 638 var scheduledObservers = []; 639 function scheduleCallback(observer) { 640 scheduledObservers.push(observer); 641 if (!isScheduled) { 642 isScheduled = true; 643 setImmediate(dispatchCallbacks); 644 } 645 } 646 function wrapIfNeeded(node) { 647 return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node; 648 } 649 function dispatchCallbacks() { 650 isScheduled = false; 651 var observers = scheduledObservers; 652 scheduledObservers = []; 653 observers.sort(function(o1, o2) { 654 return o1.uid_ - o2.uid_; 655 }); 656 var anyNonEmpty = false; 657 observers.forEach(function(observer) { 658 var queue = observer.takeRecords(); 659 removeTransientObserversFor(observer); 660 if (queue.length) { 661 observer.callback_(queue, observer); 662 anyNonEmpty = true; 663 } 664 }); 665 if (anyNonEmpty) dispatchCallbacks(); 666 } 667 function removeTransientObserversFor(observer) { 668 observer.nodes_.forEach(function(node) { 669 var registrations = registrationsTable.get(node); 670 if (!registrations) return; 671 registrations.forEach(function(registration) { 672 if (registration.observer === observer) registration.removeTransientObservers(); 673 }); 674 }); 675 } 676 function forEachAncestorAndObserverEnqueueRecord(target, callback) { 677 for (var node = target; node; node = node.parentNode) { 678 var registrations = registrationsTable.get(node); 679 if (registrations) { 680 for (var j = 0; j < registrations.length; j++) { 681 var registration = registrations[j]; 682 var options = registration.options; 683 if (node !== target && !options.subtree) continue; 684 var record = callback(options); 685 if (record) registration.enqueue(record); 686 } 687 } 688 } 689 } 690 var uidCounter = 0; 691 function JsMutationObserver(callback) { 692 this.callback_ = callback; 693 this.nodes_ = []; 694 this.records_ = []; 695 this.uid_ = ++uidCounter; 696 } 697 JsMutationObserver.prototype = { 698 observe: function(target, options) { 699 target = wrapIfNeeded(target); 700 if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) { 701 throw new SyntaxError(); 702 } 703 var registrations = registrationsTable.get(target); 704 if (!registrations) registrationsTable.set(target, registrations = []); 705 var registration; 706 for (var i = 0; i < registrations.length; i++) { 707 if (registrations[i].observer === this) { 708 registration = registrations[i]; 709 registration.removeListeners(); 710 registration.options = options; 711 break; 712 } 713 } 714 if (!registration) { 715 registration = new Registration(this, target, options); 716 registrations.push(registration); 717 this.nodes_.push(target); 718 } 719 registration.addListeners(); 720 }, 721 disconnect: function() { 722 this.nodes_.forEach(function(node) { 723 var registrations = registrationsTable.get(node); 724 for (var i = 0; i < registrations.length; i++) { 725 var registration = registrations[i]; 726 if (registration.observer === this) { 727 registration.removeListeners(); 728 registrations.splice(i, 1); 729 break; 730 } 731 } 732 }, this); 733 this.records_ = []; 734 }, 735 takeRecords: function() { 736 var copyOfRecords = this.records_; 737 this.records_ = []; 738 return copyOfRecords; 739 } 740 }; 741 function MutationRecord(type, target) { 742 this.type = type; 743 this.target = target; 744 this.addedNodes = []; 745 this.removedNodes = []; 746 this.previousSibling = null; 747 this.nextSibling = null; 748 this.attributeName = null; 749 this.attributeNamespace = null; 750 this.oldValue = null; 751 } 752 function copyMutationRecord(original) { 753 var record = new MutationRecord(original.type, original.target); 754 record.addedNodes = original.addedNodes.slice(); 755 record.removedNodes = original.removedNodes.slice(); 756 record.previousSibling = original.previousSibling; 757 record.nextSibling = original.nextSibling; 758 record.attributeName = original.attributeName; 759 record.attributeNamespace = original.attributeNamespace; 760 record.oldValue = original.oldValue; 761 return record; 762 } 763 var currentRecord, recordWithOldValue; 764 function getRecord(type, target) { 765 return currentRecord = new MutationRecord(type, target); 766 } 767 function getRecordWithOldValue(oldValue) { 768 if (recordWithOldValue) return recordWithOldValue; 769 recordWithOldValue = copyMutationRecord(currentRecord); 770 recordWithOldValue.oldValue = oldValue; 771 return recordWithOldValue; 772 } 773 function clearRecords() { 774 currentRecord = recordWithOldValue = undefined; 775 } 776 function recordRepresentsCurrentMutation(record) { 777 return record === recordWithOldValue || record === currentRecord; 778 } 779 function selectRecord(lastRecord, newRecord) { 780 if (lastRecord === newRecord) return lastRecord; 781 if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue; 782 return null; 783 } 784 function Registration(observer, target, options) { 785 this.observer = observer; 786 this.target = target; 787 this.options = options; 788 this.transientObservedNodes = []; 789 } 790 Registration.prototype = { 791 enqueue: function(record) { 792 var records = this.observer.records_; 793 var length = records.length; 794 if (records.length > 0) { 795 var lastRecord = records[length - 1]; 796 var recordToReplaceLast = selectRecord(lastRecord, record); 797 if (recordToReplaceLast) { 798 records[length - 1] = recordToReplaceLast; 799 return; 800 } 801 } else { 802 scheduleCallback(this.observer); 803 } 804 records[length] = record; 805 }, 806 addListeners: function() { 807 this.addListeners_(this.target); 808 }, 809 addListeners_: function(node) { 810 var options = this.options; 811 if (options.attributes) node.addEventListener("DOMAttrModified", this, true); 812 if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true); 813 if (options.childList) node.addEventListener("DOMNodeInserted", this, true); 814 if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true); 815 }, 816 removeListeners: function() { 817 this.removeListeners_(this.target); 818 }, 819 removeListeners_: function(node) { 820 var options = this.options; 821 if (options.attributes) node.removeEventListener("DOMAttrModified", this, true); 822 if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true); 823 if (options.childList) node.removeEventListener("DOMNodeInserted", this, true); 824 if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true); 825 }, 826 addTransientObserver: function(node) { 827 if (node === this.target) return; 828 this.addListeners_(node); 829 this.transientObservedNodes.push(node); 830 var registrations = registrationsTable.get(node); 831 if (!registrations) registrationsTable.set(node, registrations = []); 832 registrations.push(this); 833 }, 834 removeTransientObservers: function() { 835 var transientObservedNodes = this.transientObservedNodes; 836 this.transientObservedNodes = []; 837 transientObservedNodes.forEach(function(node) { 838 this.removeListeners_(node); 839 var registrations = registrationsTable.get(node); 840 for (var i = 0; i < registrations.length; i++) { 841 if (registrations[i] === this) { 842 registrations.splice(i, 1); 843 break; 844 } 845 } 846 }, this); 847 }, 848 handleEvent: function(e) { 849 e.stopImmediatePropagation(); 850 switch (e.type) { 851 case "DOMAttrModified": 852 var name = e.attrName; 853 var namespace = e.relatedNode.namespaceURI; 854 var target = e.target; 855 var record = new getRecord("attributes", target); 856 record.attributeName = name; 857 record.attributeNamespace = namespace; 858 var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue; 859 forEachAncestorAndObserverEnqueueRecord(target, function(options) { 860 if (!options.attributes) return; 861 if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) { 862 return; 863 } 864 if (options.attributeOldValue) return getRecordWithOldValue(oldValue); 865 return record; 866 }); 867 break; 868 869 case "DOMCharacterDataModified": 870 var target = e.target; 871 var record = getRecord("characterData", target); 872 var oldValue = e.prevValue; 873 forEachAncestorAndObserverEnqueueRecord(target, function(options) { 874 if (!options.characterData) return; 875 if (options.characterDataOldValue) return getRecordWithOldValue(oldValue); 876 return record; 877 }); 878 break; 879 880 case "DOMNodeRemoved": 881 this.addTransientObserver(e.target); 882 883 case "DOMNodeInserted": 884 var changedNode = e.target; 885 var addedNodes, removedNodes; 886 if (e.type === "DOMNodeInserted") { 887 addedNodes = [ changedNode ]; 888 removedNodes = []; 889 } else { 890 addedNodes = []; 891 removedNodes = [ changedNode ]; 892 } 893 var previousSibling = changedNode.previousSibling; 894 var nextSibling = changedNode.nextSibling; 895 var record = getRecord("childList", e.target.parentNode); 896 record.addedNodes = addedNodes; 897 record.removedNodes = removedNodes; 898 record.previousSibling = previousSibling; 899 record.nextSibling = nextSibling; 900 forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) { 901 if (!options.childList) return; 902 return record; 903 }); 904 } 905 clearRecords(); 906 } 907 }; 908 global.JsMutationObserver = JsMutationObserver; 909 if (!global.MutationObserver) { 910 global.MutationObserver = JsMutationObserver; 911 JsMutationObserver._isPolyfilled = true; 912 } 913})(self); 914 915(function() { 916 var needsTemplate = typeof HTMLTemplateElement === "undefined"; 917 if (/Trident/.test(navigator.userAgent)) { 918 (function() { 919 var importNode = document.importNode; 920 document.importNode = function() { 921 var n = importNode.apply(document, arguments); 922 if (n.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { 923 var f = document.createDocumentFragment(); 924 f.appendChild(n); 925 return f; 926 } else { 927 return n; 928 } 929 }; 930 })(); 931 } 932 var needsCloning = function() { 933 if (!needsTemplate) { 934 var t = document.createElement("template"); 935 var t2 = document.createElement("template"); 936 t2.content.appendChild(document.createElement("div")); 937 t.content.appendChild(t2); 938 var clone = t.cloneNode(true); 939 return clone.content.childNodes.length === 0 || clone.content.firstChild.content.childNodes.length === 0; 940 } 941 }(); 942 var TEMPLATE_TAG = "template"; 943 var TemplateImpl = function() {}; 944 if (needsTemplate) { 945 var contentDoc = document.implementation.createHTMLDocument("template"); 946 var canDecorate = true; 947 var templateStyle = document.createElement("style"); 948 templateStyle.textContent = TEMPLATE_TAG + "{display:none;}"; 949 var head = document.head; 950 head.insertBefore(templateStyle, head.firstElementChild); 951 TemplateImpl.prototype = Object.create(HTMLElement.prototype); 952 TemplateImpl.decorate = function(template) { 953 if (template.content) { 954 return; 955 } 956 template.content = contentDoc.createDocumentFragment(); 957 var child; 958 while (child = template.firstChild) { 959 template.content.appendChild(child); 960 } 961 template.cloneNode = function(deep) { 962 return TemplateImpl.cloneNode(this, deep); 963 }; 964 if (canDecorate) { 965 try { 966 Object.defineProperty(template, "innerHTML", { 967 get: function() { 968 var o = ""; 969 for (var e = this.content.firstChild; e; e = e.nextSibling) { 970 o += e.outerHTML || escapeData(e.data); 971 } 972 return o; 973 }, 974 set: function(text) { 975 contentDoc.body.innerHTML = text; 976 TemplateImpl.bootstrap(contentDoc); 977 while (this.content.firstChild) { 978 this.content.removeChild(this.content.firstChild); 979 } 980 while (contentDoc.body.firstChild) { 981 this.content.appendChild(contentDoc.body.firstChild); 982 } 983 }, 984 configurable: true 985 }); 986 } catch (err) { 987 canDecorate = false; 988 } 989 } 990 TemplateImpl.bootstrap(template.content); 991 }; 992 TemplateImpl.bootstrap = function(doc) { 993 var templates = doc.querySelectorAll(TEMPLATE_TAG); 994 for (var i = 0, l = templates.length, t; i < l && (t = templates[i]); i++) { 995 TemplateImpl.decorate(t); 996 } 997 }; 998 document.addEventListener("DOMContentLoaded", function() { 999 TemplateImpl.bootstrap(document); 1000 }); 1001 var createElement = document.createElement; 1002 document.createElement = function() { 1003 "use strict"; 1004 var el = createElement.apply(document, arguments); 1005 if (el.localName === "template") { 1006 TemplateImpl.decorate(el); 1007 } 1008 return el; 1009 }; 1010 var escapeDataRegExp = /[&\u00A0<>]/g; 1011 function escapeReplace(c) { 1012 switch (c) { 1013 case "&": 1014 return "&"; 1015 1016 case "<": 1017 return "<"; 1018 1019 case ">": 1020 return ">"; 1021 1022 case " ": 1023 return " "; 1024 } 1025 } 1026 function escapeData(s) { 1027 return s.replace(escapeDataRegExp, escapeReplace); 1028 } 1029 } 1030 if (needsTemplate || needsCloning) { 1031 var nativeCloneNode = Node.prototype.cloneNode; 1032 TemplateImpl.cloneNode = function(template, deep) { 1033 var clone = nativeCloneNode.call(template, false); 1034 if (this.decorate) { 1035 this.decorate(clone); 1036 } 1037 if (deep) { 1038 clone.content.appendChild(nativeCloneNode.call(template.content, true)); 1039 this.fixClonedDom(clone.content, template.content); 1040 } 1041 return clone; 1042 }; 1043 TemplateImpl.fixClonedDom = function(clone, source) { 1044 if (!source.querySelectorAll) return; 1045 var s$ = source.querySelectorAll(TEMPLATE_TAG); 1046 var t$ = clone.querySelectorAll(TEMPLATE_TAG); 1047 for (var i = 0, l = t$.length, t, s; i < l; i++) { 1048 s = s$[i]; 1049 t = t$[i]; 1050 if (this.decorate) { 1051 this.decorate(s); 1052 } 1053 t.parentNode.replaceChild(s.cloneNode(true), t); 1054 } 1055 }; 1056 var originalImportNode = document.importNode; 1057 Node.prototype.cloneNode = function(deep) { 1058 var dom = nativeCloneNode.call(this, deep); 1059 if (deep) { 1060 TemplateImpl.fixClonedDom(dom, this); 1061 } 1062 return dom; 1063 }; 1064 document.importNode = function(element, deep) { 1065 if (element.localName === TEMPLATE_TAG) { 1066 return TemplateImpl.cloneNode(element, deep); 1067 } else { 1068 var dom = originalImportNode.call(document, element, deep); 1069 if (deep) { 1070 TemplateImpl.fixClonedDom(dom, element); 1071 } 1072 return dom; 1073 } 1074 }; 1075 if (needsCloning) { 1076 HTMLTemplateElement.prototype.cloneNode = function(deep) { 1077 return TemplateImpl.cloneNode(this, deep); 1078 }; 1079 } 1080 } 1081 if (needsTemplate) { 1082 window.HTMLTemplateElement = TemplateImpl; 1083 } 1084})(); 1085 1086(function(scope) { 1087 "use strict"; 1088 if (!(window.performance && window.performance.now)) { 1089 var start = Date.now(); 1090 window.performance = { 1091 now: function() { 1092 return Date.now() - start; 1093 } 1094 }; 1095 } 1096 if (!window.requestAnimationFrame) { 1097 window.requestAnimationFrame = function() { 1098 var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; 1099 return nativeRaf ? function(callback) { 1100 return nativeRaf(function() { 1101 callback(performance.now()); 1102 }); 1103 } : function(callback) { 1104 return window.setTimeout(callback, 1e3 / 60); 1105 }; 1106 }(); 1107 } 1108 if (!window.cancelAnimationFrame) { 1109 window.cancelAnimationFrame = function() { 1110 return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) { 1111 clearTimeout(id); 1112 }; 1113 }(); 1114 } 1115 var workingDefaultPrevented = function() { 1116 var e = document.createEvent("Event"); 1117 e.initEvent("foo", true, true); 1118 e.preventDefault(); 1119 return e.defaultPrevented; 1120 }(); 1121 if (!workingDefaultPrevented) { 1122 var origPreventDefault = Event.prototype.preventDefault; 1123 Event.prototype.preventDefault = function() { 1124 if (!this.cancelable) { 1125 return; 1126 } 1127 origPreventDefault.call(this); 1128 Object.defineProperty(this, "defaultPrevented", { 1129 get: function() { 1130 return true; 1131 }, 1132 configurable: true 1133 }); 1134 }; 1135 } 1136 var isIE = /Trident/.test(navigator.userAgent); 1137 if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") { 1138 window.CustomEvent = function(inType, params) { 1139 params = params || {}; 1140 var e = document.createEvent("CustomEvent"); 1141 e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail); 1142 return e; 1143 }; 1144 window.CustomEvent.prototype = window.Event.prototype; 1145 } 1146 if (!window.Event || isIE && typeof window.Event !== "function") { 1147 var origEvent = window.Event; 1148 window.Event = function(inType, params) { 1149 params = params || {}; 1150 var e = document.createEvent("Event"); 1151 e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable)); 1152 return e; 1153 }; 1154 window.Event.prototype = origEvent.prototype; 1155 } 1156})(window.WebComponents); 1157 1158window.HTMLImports = window.HTMLImports || { 1159 flags: {} 1160}; 1161 1162(function(scope) { 1163 var IMPORT_LINK_TYPE = "import"; 1164 var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link")); 1165 var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill); 1166 var wrap = function(node) { 1167 return hasShadowDOMPolyfill ? window.ShadowDOMPolyfill.wrapIfNeeded(node) : node; 1168 }; 1169 var rootDocument = wrap(document); 1170 var currentScriptDescriptor = { 1171 get: function() { 1172 var script = window.HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null); 1173 return wrap(script); 1174 }, 1175 configurable: true 1176 }; 1177 Object.defineProperty(document, "_currentScript", currentScriptDescriptor); 1178 Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor); 1179 var isIE = /Trident/.test(navigator.userAgent); 1180 function whenReady(callback, doc) { 1181 doc = doc || rootDocument; 1182 whenDocumentReady(function() { 1183 watchImportsLoad(callback, doc); 1184 }, doc); 1185 } 1186 var requiredReadyState = isIE ? "complete" : "interactive"; 1187 var READY_EVENT = "readystatechange"; 1188 function isDocumentReady(doc) { 1189 return doc.readyState === "complete" || doc.readyState === requiredReadyState; 1190 } 1191 function whenDocumentReady(callback, doc) { 1192 if (!isDocumentReady(doc)) { 1193 var checkReady = function() { 1194 if (doc.readyState === "complete" || doc.readyState === requiredReadyState) { 1195 doc.removeEventListener(READY_EVENT, checkReady); 1196 whenDocumentReady(callback, doc); 1197 } 1198 }; 1199 doc.addEventListener(READY_EVENT, checkReady); 1200 } else if (callback) { 1201 callback(); 1202 } 1203 } 1204 function markTargetLoaded(event) { 1205 event.target.__loaded = true; 1206 } 1207 function watchImportsLoad(callback, doc) { 1208 var imports = doc.querySelectorAll("link[rel=import]"); 1209 var parsedCount = 0, importCount = imports.length, newImports = [], errorImports = []; 1210 function checkDone() { 1211 if (parsedCount == importCount && callback) { 1212 callback({ 1213 allImports: imports, 1214 loadedImports: newImports, 1215 errorImports: errorImports 1216 }); 1217 } 1218 } 1219 function loadedImport(e) { 1220 markTargetLoaded(e); 1221 newImports.push(this); 1222 parsedCount++; 1223 checkDone(); 1224 } 1225 function errorLoadingImport(e) { 1226 errorImports.push(this); 1227 parsedCount++; 1228 checkDone(); 1229 } 1230 if (importCount) { 1231 for (var i = 0, imp; i < importCount && (imp = imports[i]); i++) { 1232 if (isImportLoaded(imp)) { 1233 newImports.push(this); 1234 parsedCount++; 1235 checkDone(); 1236 } else { 1237 imp.addEventListener("load", loadedImport); 1238 imp.addEventListener("error", errorLoadingImport); 1239 } 1240 } 1241 } else { 1242 checkDone(); 1243 } 1244 } 1245 function isImportLoaded(link) { 1246 return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed; 1247 } 1248 if (useNative) { 1249 new MutationObserver(function(mxns) { 1250 for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) { 1251 if (m.addedNodes) { 1252 handleImports(m.addedNodes); 1253 } 1254 } 1255 }).observe(document.head, { 1256 childList: true 1257 }); 1258 function handleImports(nodes) { 1259 for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { 1260 if (isImport(n)) { 1261 handleImport(n); 1262 } 1263 } 1264 } 1265 function isImport(element) { 1266 return element.localName === "link" && element.rel === "import"; 1267 } 1268 function handleImport(element) { 1269 var loaded = element.import; 1270 if (loaded) { 1271 markTargetLoaded({ 1272 target: element 1273 }); 1274 } else { 1275 element.addEventListener("load", markTargetLoaded); 1276 element.addEventListener("error", markTargetLoaded); 1277 } 1278 } 1279 (function() { 1280 if (document.readyState === "loading") { 1281 var imports = document.querySelectorAll("link[rel=import]"); 1282 for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) { 1283 handleImport(imp); 1284 } 1285 } 1286 })(); 1287 } 1288 whenReady(function(detail) { 1289 window.HTMLImports.ready = true; 1290 window.HTMLImports.readyTime = new Date().getTime(); 1291 var evt = rootDocument.createEvent("CustomEvent"); 1292 evt.initCustomEvent("HTMLImportsLoaded", true, true, detail); 1293 rootDocument.dispatchEvent(evt); 1294 }); 1295 scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE; 1296 scope.useNative = useNative; 1297 scope.rootDocument = rootDocument; 1298 scope.whenReady = whenReady; 1299 scope.isIE = isIE; 1300})(window.HTMLImports); 1301 1302(function(scope) { 1303 var modules = []; 1304 var addModule = function(module) { 1305 modules.push(module); 1306 }; 1307 var initializeModules = function() { 1308 modules.forEach(function(module) { 1309 module(scope); 1310 }); 1311 }; 1312 scope.addModule = addModule; 1313 scope.initializeModules = initializeModules; 1314})(window.HTMLImports); 1315 1316window.HTMLImports.addModule(function(scope) { 1317 var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g; 1318 var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g; 1319 var path = { 1320 resolveUrlsInStyle: function(style, linkUrl) { 1321 var doc = style.ownerDocument; 1322 var resolver = doc.createElement("a"); 1323 style.textContent = this.resolveUrlsInCssText(style.textContent, linkUrl, resolver); 1324 return style; 1325 }, 1326 resolveUrlsInCssText: function(cssText, linkUrl, urlObj) { 1327 var r = this.replaceUrls(cssText, urlObj, linkUrl, CSS_URL_REGEXP); 1328 r = this.replaceUrls(r, urlObj, linkUrl, CSS_IMPORT_REGEXP); 1329 return r; 1330 }, 1331 replaceUrls: function(text, urlObj, linkUrl, regexp) { 1332 return text.replace(regexp, function(m, pre, url, post) { 1333 var urlPath = url.replace(/["']/g, ""); 1334 if (linkUrl) { 1335 urlPath = new URL(urlPath, linkUrl).href; 1336 } 1337 urlObj.href = urlPath; 1338 urlPath = urlObj.href; 1339 return pre + "'" + urlPath + "'" + post; 1340 }); 1341 } 1342 }; 1343 scope.path = path; 1344}); 1345 1346window.HTMLImports.addModule(function(scope) { 1347 var xhr = { 1348 async: true, 1349 ok: function(request) { 1350 return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0; 1351 }, 1352 load: function(url, next, nextContext) { 1353 var request = new XMLHttpRequest(); 1354 if (scope.flags.debug || scope.flags.bust) { 1355 url += "?" + Math.random(); 1356 } 1357 request.open("GET", url, xhr.async); 1358 request.addEventListener("readystatechange", function(e) { 1359 if (request.readyState === 4) { 1360 var redirectedUrl = null; 1361 try { 1362 var locationHeader = request.getResponseHeader("Location"); 1363 if (locationHeader) { 1364 redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader; 1365 } 1366 } catch (e) { 1367 console.error(e.message); 1368 } 1369 next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl); 1370 } 1371 }); 1372 request.send(); 1373 return request; 1374 }, 1375 loadDocument: function(url, next, nextContext) { 1376 this.load(url, next, nextContext).responseType = "document"; 1377 } 1378 }; 1379 scope.xhr = xhr; 1380}); 1381 1382window.HTMLImports.addModule(function(scope) { 1383 var xhr = scope.xhr; 1384 var flags = scope.flags; 1385 var Loader = function(onLoad, onComplete) { 1386 this.cache = {}; 1387 this.onload = onLoad; 1388 this.oncomplete = onComplete; 1389 this.inflight = 0; 1390 this.pending = {}; 1391 }; 1392 Loader.prototype = { 1393 addNodes: function(nodes) { 1394 this.inflight += nodes.length; 1395 for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { 1396 this.require(n); 1397 } 1398 this.checkDone(); 1399 }, 1400 addNode: function(node) { 1401 this.inflight++; 1402 this.require(node); 1403 this.checkDone(); 1404 }, 1405 require: function(elt) { 1406 var url = elt.src || elt.href; 1407 elt.__nodeUrl = url; 1408 if (!this.dedupe(url, elt)) { 1409 this.fetch(url, elt); 1410 } 1411 }, 1412 dedupe: function(url, elt) { 1413 if (this.pending[url]) { 1414 this.pending[url].push(elt); 1415 return true; 1416 } 1417 var resource; 1418 if (this.cache[url]) { 1419 this.onload(url, elt, this.cache[url]); 1420 this.tail(); 1421 return true; 1422 } 1423 this.pending[url] = [ elt ]; 1424 return false; 1425 }, 1426 fetch: function(url, elt) { 1427 flags.load && console.log("fetch", url, elt); 1428 if (!url) { 1429 setTimeout(function() { 1430 this.receive(url, elt, { 1431 error: "href must be specified" 1432 }, null); 1433 }.bind(this), 0); 1434 } else if (url.match(/^data:/)) { 1435 var pieces = url.split(","); 1436 var header = pieces[0]; 1437 var body = pieces[1]; 1438 if (header.indexOf(";base64") > -1) { 1439 body = atob(body); 1440 } else { 1441 body = decodeURIComponent(body); 1442 } 1443 setTimeout(function() { 1444 this.receive(url, elt, null, body); 1445 }.bind(this), 0); 1446 } else { 1447 var receiveXhr = function(err, resource, redirectedUrl) { 1448 this.receive(url, elt, err, resource, redirectedUrl); 1449 }.bind(this); 1450 xhr.load(url, receiveXhr); 1451 } 1452 }, 1453 receive: function(url, elt, err, resource, redirectedUrl) { 1454 this.cache[url] = resource; 1455 var $p = this.pending[url]; 1456 for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) { 1457 this.onload(url, p, resource, err, redirectedUrl); 1458 this.tail(); 1459 } 1460 this.pending[url] = null; 1461 }, 1462 tail: function() { 1463 --this.inflight; 1464 this.checkDone(); 1465 }, 1466 checkDone: function() { 1467 if (!this.inflight) { 1468 this.oncomplete(); 1469 } 1470 } 1471 }; 1472 scope.Loader = Loader; 1473}); 1474 1475window.HTMLImports.addModule(function(scope) { 1476 var Observer = function(addCallback) { 1477 this.addCallback = addCallback; 1478 this.mo = new MutationObserver(this.handler.bind(this)); 1479 }; 1480 Observer.prototype = { 1481 handler: function(mutations) { 1482 for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) { 1483 if (m.type === "childList" && m.addedNodes.length) { 1484 this.addedNodes(m.addedNodes); 1485 } 1486 } 1487 }, 1488 addedNodes: function(nodes) { 1489 if (this.addCallback) { 1490 this.addCallback(nodes); 1491 } 1492 for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) { 1493 if (n.children && n.children.length) { 1494 this.addedNodes(n.children); 1495 } 1496 } 1497 }, 1498 observe: function(root) { 1499 this.mo.observe(root, { 1500 childList: true, 1501 subtree: true 1502 }); 1503 } 1504 }; 1505 scope.Observer = Observer; 1506}); 1507 1508window.HTMLImports.addModule(function(scope) { 1509 var path = scope.path; 1510 var rootDocument = scope.rootDocument; 1511 var flags = scope.flags; 1512 var isIE = scope.isIE; 1513 var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; 1514 var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]"; 1515 var importParser = { 1516 documentSelectors: IMPORT_SELECTOR, 1517 importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]:not([type])", "style:not([type])", "script:not([type])", 'script[type="application/javascript"]', 'script[type="text/javascript"]' ].join(","), 1518 map: { 1519 link: "parseLink", 1520 script: "parseScript", 1521 style: "parseStyle" 1522 }, 1523 dynamicElements: [], 1524 parseNext: function() { 1525 var next = this.nextToParse(); 1526 if (next) { 1527 this.parse(next); 1528 } 1529 }, 1530 parse: function(elt) { 1531 if (this.isParsed(elt)) { 1532 flags.parse && console.log("[%s] is already parsed", elt.localName); 1533 return; 1534 } 1535 var fn = this[this.map[elt.localName]]; 1536 if (fn) { 1537 this.markParsing(elt); 1538 fn.call(this, elt); 1539 } 1540 }, 1541 parseDynamic: function(elt, quiet) { 1542 this.dynamicElements.push(elt); 1543 if (!quiet) { 1544 this.parseNext(); 1545 } 1546 }, 1547 markParsing: function(elt) { 1548 flags.parse && console.log("parsing", elt); 1549 this.parsingElement = elt; 1550 }, 1551 markParsingComplete: function(elt) { 1552 elt.__importParsed = true; 1553 this.markDynamicParsingComplete(elt); 1554 if (elt.__importElement) { 1555 elt.__importElement.__importParsed = true; 1556 this.markDynamicParsingComplete(elt.__importElement); 1557 } 1558 this.parsingElement = null; 1559 flags.parse && console.log("completed", elt); 1560 }, 1561 markDynamicParsingComplete: function(elt) { 1562 var i = this.dynamicElements.indexOf(elt); 1563 if (i >= 0) { 1564 this.dynamicElements.splice(i, 1); 1565 } 1566 }, 1567 parseImport: function(elt) { 1568 elt.import = elt.__doc; 1569 if (window.HTMLImports.__importsParsingHook) { 1570 window.HTMLImports.__importsParsingHook(elt); 1571 } 1572 if (elt.import) { 1573 elt.import.__importParsed = true; 1574 } 1575 this.markParsingComplete(elt); 1576 if (elt.__resource && !elt.__error) { 1577 elt.dispatchEvent(new CustomEvent("load", { 1578 bubbles: false 1579 })); 1580 } else { 1581 elt.dispatchEvent(new CustomEvent("error", { 1582 bubbles: false 1583 })); 1584 } 1585 if (elt.__pending) { 1586 var fn; 1587 while (elt.__pending.length) { 1588 fn = elt.__pending.shift(); 1589 if (fn) { 1590 fn({ 1591 target: elt 1592 }); 1593 } 1594 } 1595 } 1596 this.parseNext(); 1597 }, 1598 parseLink: function(linkElt) { 1599 if (nodeIsImport(linkElt)) { 1600 this.parseImport(linkElt); 1601 } else { 1602 linkElt.href = linkElt.href; 1603 this.parseGeneric(linkElt); 1604 } 1605 }, 1606 parseStyle: function(elt) { 1607 var src = elt; 1608 elt = cloneStyle(elt); 1609 src.__appliedElement = elt; 1610 elt.__importElement = src; 1611 this.parseGeneric(elt); 1612 }, 1613 parseGeneric: function(elt) { 1614 this.trackElement(elt); 1615 this.addElementToDocument(elt); 1616 }, 1617 rootImportForElement: function(elt) { 1618 var n = elt; 1619 while (n.ownerDocument.__importLink) { 1620 n = n.ownerDocument.__importLink; 1621 } 1622 return n; 1623 }, 1624 addElementToDocument: function(elt) { 1625 var port = this.rootImportForElement(elt.__importElement || elt); 1626 port.parentNode.insertBefore(elt, port); 1627 }, 1628 trackElement: function(elt, callback) { 1629 var self = this; 1630 var done = function(e) { 1631 elt.removeEventListener("load", done); 1632 elt.removeEventListener("error", done); 1633 if (callback) { 1634 callback(e); 1635 } 1636 self.markParsingComplete(elt); 1637 self.parseNext(); 1638 }; 1639 elt.addEventListener("load", done); 1640 elt.addEventListener("error", done); 1641 if (isIE && elt.localName === "style") { 1642 var fakeLoad = false; 1643 if (elt.textContent.indexOf("@import") == -1) { 1644 fakeLoad = true; 1645 } else if (elt.sheet) { 1646 fakeLoad = true; 1647 var csr = elt.sheet.cssRules; 1648 var len = csr ? csr.length : 0; 1649 for (var i = 0, r; i < len && (r = csr[i]); i++) { 1650 if (r.type === CSSRule.IMPORT_RULE) { 1651 fakeLoad = fakeLoad && Boolean(r.styleSheet); 1652 } 1653 } 1654 } 1655 if (fakeLoad) { 1656 setTimeout(function() { 1657 elt.dispatchEvent(new CustomEvent("load", { 1658 bubbles: false 1659 })); 1660 }); 1661 } 1662 } 1663 }, 1664 parseScript: function(scriptElt) { 1665 var script = document.createElement("script"); 1666 script.__importElement = scriptElt; 1667 script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt); 1668 scope.currentScript = scriptElt; 1669 this.trackElement(script, function(e) { 1670 if (script.parentNode) { 1671 script.parentNode.removeChild(script); 1672 } 1673 scope.currentScript = null; 1674 }); 1675 this.addElementToDocument(script); 1676 }, 1677 nextToParse: function() { 1678 this._mayParse = []; 1679 return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic()); 1680 }, 1681 nextToParseInDoc: function(doc, link) { 1682 if (doc && this._mayParse.indexOf(doc) < 0) { 1683 this._mayParse.push(doc); 1684 var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc)); 1685 for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { 1686 if (!this.isParsed(n)) { 1687 if (this.hasResource(n)) { 1688 return nodeIsImport(n) ? this.nextToParseInDoc(n.__doc, n) : n; 1689 } else { 1690 return; 1691 } 1692 } 1693 } 1694 } 1695 return link; 1696 }, 1697 nextToParseDynamic: function() { 1698 return this.dynamicElements[0]; 1699 }, 1700 parseSelectorsForNode: function(node) { 1701 var doc = node.ownerDocument || node; 1702 return doc === rootDocument ? this.documentSelectors : this.importsSelectors; 1703 }, 1704 isParsed: function(node) { 1705 return node.__importParsed; 1706 }, 1707 needsDynamicParsing: function(elt) { 1708 return this.dynamicElements.indexOf(elt) >= 0; 1709 }, 1710 hasResource: function(node) { 1711 if (nodeIsImport(node) && node.__doc === undefined) { 1712 return false; 1713 } 1714 return true; 1715 } 1716 }; 1717 function nodeIsImport(elt) { 1718 return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE; 1719 } 1720 function generateScriptDataUrl(script) { 1721 var scriptContent = generateScriptContent(script); 1722 return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent); 1723 } 1724 function generateScriptContent(script) { 1725 return script.textContent + generateSourceMapHint(script); 1726 } 1727 function generateSourceMapHint(script) { 1728 var owner = script.ownerDocument; 1729 owner.__importedScripts = owner.__importedScripts || 0; 1730 var moniker = script.ownerDocument.baseURI; 1731 var num = owner.__importedScripts ? "-" + owner.__importedScripts : ""; 1732 owner.__importedScripts++; 1733 return "\n//# sourceURL=" + moniker + num + ".js\n"; 1734 } 1735 function cloneStyle(style) { 1736 var clone = style.ownerDocument.createElement("style"); 1737 clone.textContent = style.textContent; 1738 path.resolveUrlsInStyle(clone); 1739 return clone; 1740 } 1741 scope.parser = importParser; 1742 scope.IMPORT_SELECTOR = IMPORT_SELECTOR; 1743}); 1744 1745window.HTMLImports.addModule(function(scope) { 1746 var flags = scope.flags; 1747 var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; 1748 var IMPORT_SELECTOR = scope.IMPORT_SELECTOR; 1749 var rootDocument = scope.rootDocument; 1750 var Loader = scope.Loader; 1751 var Observer = scope.Observer; 1752 var parser = scope.parser; 1753 var importer = { 1754 documents: {}, 1755 documentPreloadSelectors: IMPORT_SELECTOR, 1756 importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","), 1757 loadNode: function(node) { 1758 importLoader.addNode(node); 1759 }, 1760 loadSubtree: function(parent) { 1761 var nodes = this.marshalNodes(parent); 1762 importLoader.addNodes(nodes); 1763 }, 1764 marshalNodes: function(parent) { 1765 return parent.querySelectorAll(this.loadSelectorsForNode(parent)); 1766 }, 1767 loadSelectorsForNode: function(node) { 1768 var doc = node.ownerDocument || node; 1769 return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors; 1770 }, 1771 loaded: function(url, elt, resource, err, redirectedUrl) { 1772 flags.load && console.log("loaded", url, elt); 1773 elt.__resource = resource; 1774 elt.__error = err; 1775 if (isImportLink(elt)) { 1776 var doc = this.documents[url]; 1777 if (doc === undefined) { 1778 doc = err ? null : makeDocument(resource, redirectedUrl || url); 1779 if (doc) { 1780 doc.__importLink = elt; 1781 this.bootDocument(doc); 1782 } 1783 this.documents[url] = doc; 1784 } 1785 elt.__doc = doc; 1786 } 1787 parser.parseNext(); 1788 }, 1789 bootDocument: function(doc) { 1790 this.loadSubtree(doc); 1791 this.observer.observe(doc); 1792 parser.parseNext(); 1793 }, 1794 loadedAll: function() { 1795 parser.parseNext(); 1796 } 1797 }; 1798 var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer)); 1799 importer.observer = new Observer(); 1800 function isImportLink(elt) { 1801 return isLinkRel(elt, IMPORT_LINK_TYPE); 1802 } 1803 function isLinkRel(elt, rel) { 1804 return elt.localName === "link" && elt.getAttribute("rel") === rel; 1805 } 1806 function hasBaseURIAccessor(doc) { 1807 return !!Object.getOwnPropertyDescriptor(doc, "baseURI"); 1808 } 1809 function makeDocument(resource, url) { 1810 var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE); 1811 doc._URL = url; 1812 var base = doc.createElement("base"); 1813 base.setAttribute("href", url); 1814 if (!doc.baseURI && !hasBaseURIAccessor(doc)) { 1815 Object.defineProperty(doc, "baseURI", { 1816 value: url 1817 }); 1818 } 1819 var meta = doc.createElement("meta"); 1820 meta.setAttribute("charset", "utf-8"); 1821 doc.head.appendChild(meta); 1822 doc.head.appendChild(base); 1823 doc.body.innerHTML = resource; 1824 if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) { 1825 HTMLTemplateElement.bootstrap(doc); 1826 } 1827 return doc; 1828 } 1829 if (!document.baseURI) { 1830 var baseURIDescriptor = { 1831 get: function() { 1832 var base = document.querySelector("base"); 1833 return base ? base.href : window.location.href; 1834 }, 1835 configurable: true 1836 }; 1837 Object.defineProperty(document, "baseURI", baseURIDescriptor); 1838 Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor); 1839 } 1840 scope.importer = importer; 1841 scope.importLoader = importLoader; 1842}); 1843 1844window.HTMLImports.addModule(function(scope) { 1845 var parser = scope.parser; 1846 var importer = scope.importer; 1847 var dynamic = { 1848 added: function(nodes) { 1849 var owner, parsed, loading; 1850 for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { 1851 if (!owner) { 1852 owner = n.ownerDocument; 1853 parsed = parser.isParsed(owner); 1854 } 1855 loading = this.shouldLoadNode(n); 1856 if (loading) { 1857 importer.loadNode(n); 1858 } 1859 if (this.shouldParseNode(n) && parsed) { 1860 parser.parseDynamic(n, loading); 1861 } 1862 } 1863 }, 1864 shouldLoadNode: function(node) { 1865 return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node)); 1866 }, 1867 shouldParseNode: function(node) { 1868 return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node)); 1869 } 1870 }; 1871 importer.observer.addCallback = dynamic.added.bind(dynamic); 1872 var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector; 1873}); 1874 1875(function(scope) { 1876 var initializeModules = scope.initializeModules; 1877 var isIE = scope.isIE; 1878 if (scope.useNative) { 1879 return; 1880 } 1881 initializeModules(); 1882 var rootDocument = scope.rootDocument; 1883 function bootstrap() { 1884 window.HTMLImports.importer.bootDocument(rootDocument); 1885 } 1886 if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) { 1887 bootstrap(); 1888 } else { 1889 document.addEventListener("DOMContentLoaded", bootstrap); 1890 } 1891})(window.HTMLImports); 1892 1893window.CustomElements = window.CustomElements || { 1894 flags: {} 1895}; 1896 1897(function(scope) { 1898 var flags = scope.flags; 1899 var modules = []; 1900 var addModule = function(module) { 1901 modules.push(module); 1902 }; 1903 var initializeModules = function() { 1904 modules.forEach(function(module) { 1905 module(scope); 1906 }); 1907 }; 1908 scope.addModule = addModule; 1909 scope.initializeModules = initializeModules; 1910 scope.hasNative = Boolean(document.registerElement); 1911 scope.isIE = /Trident/.test(navigator.userAgent); 1912 scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || window.HTMLImports.useNative); 1913})(window.CustomElements); 1914 1915window.CustomElements.addModule(function(scope) { 1916 var IMPORT_LINK_TYPE = window.HTMLImports ? window.HTMLImports.IMPORT_LINK_TYPE : "none"; 1917 function forSubtree(node, cb) { 1918 findAllElements(node, function(e) { 1919 if (cb(e)) { 1920 return true; 1921 } 1922 forRoots(e, cb); 1923 }); 1924 forRoots(node, cb); 1925 } 1926 function findAllElements(node, find, data) { 1927 var e = node.firstElementChild; 1928 if (!e) { 1929 e = node.firstChild; 1930 while (e && e.nodeType !== Node.ELEMENT_NODE) { 1931 e = e.nextSibling; 1932 } 1933 } 1934 while (e) { 1935 if (find(e, data) !== true) { 1936 findAllElements(e, find, data); 1937 } 1938 e = e.nextElementSibling; 1939 } 1940 return null; 1941 } 1942 function forRoots(node, cb) { 1943 var root = node.shadowRoot; 1944 while (root) { 1945 forSubtree(root, cb); 1946 root = root.olderShadowRoot; 1947 } 1948 } 1949 function forDocumentTree(doc, cb) { 1950 _forDocumentTree(doc, cb, []); 1951 } 1952 function _forDocumentTree(doc, cb, processingDocuments) { 1953 doc = window.wrap(doc); 1954 if (processingDocuments.indexOf(doc) >= 0) { 1955 return; 1956 } 1957 processingDocuments.push(doc); 1958 var imports = doc.querySelectorAll("link[rel=" + IMPORT_LINK_TYPE + "]"); 1959 for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) { 1960 if (n.import) { 1961 _forDocumentTree(n.import, cb, processingDocuments); 1962 } 1963 } 1964 cb(doc); 1965 } 1966 scope.forDocumentTree = forDocumentTree; 1967 scope.forSubtree = forSubtree; 1968}); 1969 1970window.CustomElements.addModule(function(scope) { 1971 var flags = scope.flags; 1972 var forSubtree = scope.forSubtree; 1973 var forDocumentTree = scope.forDocumentTree; 1974 function addedNode(node, isAttached) { 1975 return added(node, isAttached) || addedSubtree(node, isAttached); 1976 } 1977 function added(node, isAttached) { 1978 if (scope.upgrade(node, isAttached)) { 1979 return true; 1980 } 1981 if (isAttached) { 1982 attached(node); 1983 } 1984 } 1985 function addedSubtree(node, isAttached) { 1986 forSubtree(node, function(e) { 1987 if (added(e, isAttached)) { 1988 return true; 1989 } 1990 }); 1991 } 1992 var hasThrottledAttached = window.MutationObserver._isPolyfilled && flags["throttle-attached"]; 1993 scope.hasPolyfillMutations = hasThrottledAttached; 1994 scope.hasThrottledAttached = hasThrottledAttached; 1995 var isPendingMutations = false; 1996 var pendingMutations = []; 1997 function deferMutation(fn) { 1998 pendingMutations.push(fn); 1999 if (!isPendingMutations) { 2000 isPendingMutations = true; 2001 setTimeout(takeMutations); 2002 } 2003 } 2004 function takeMutations() { 2005 isPendingMutations = false; 2006 var $p = pendingMutations; 2007 for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) { 2008 p(); 2009 } 2010 pendingMutations = []; 2011 } 2012 function attached(element) { 2013 if (hasThrottledAttached) { 2014 deferMutation(function() { 2015 _attached(element); 2016 }); 2017 } else { 2018 _attached(element); 2019 } 2020 } 2021 function _attached(element) { 2022 if (element.__upgraded__ && !element.__attached) { 2023 element.__attached = true; 2024 if (element.attachedCallback) { 2025 element.attachedCallback(); 2026 } 2027 } 2028 } 2029 function detachedNode(node) { 2030 detached(node); 2031 forSubtree(node, function(e) { 2032 detached(e); 2033 }); 2034 } 2035 function detached(element) { 2036 if (hasThrottledAttached) { 2037 deferMutation(function() { 2038 _detached(element); 2039 }); 2040 } else { 2041 _detached(element); 2042 } 2043 } 2044 function _detached(element) { 2045 if (element.__upgraded__ && element.__attached) { 2046 element.__attached = false; 2047 if (element.detachedCallback) { 2048 element.detachedCallback(); 2049 } 2050 } 2051 } 2052 function inDocument(element) { 2053 var p = element; 2054 var doc = window.wrap(document); 2055 while (p) { 2056 if (p == doc) { 2057 return true; 2058 } 2059 p = p.parentNode || p.nodeType === Node.DOCUMENT_FRAGMENT_NODE && p.host; 2060 } 2061 } 2062 function watchShadow(node) { 2063 if (node.shadowRoot && !node.shadowRoot.__watched) { 2064 flags.dom && console.log("watching shadow-root for: ", node.localName); 2065 var root = node.shadowRoot; 2066 while (root) { 2067 observe(root); 2068 root = root.olderShadowRoot; 2069 } 2070 } 2071 } 2072 function handler(root, mutations) { 2073 if (flags.dom) { 2074 var mx = mutations[0]; 2075 if (mx && mx.type === "childList" && mx.addedNodes) { 2076 if (mx.addedNodes) { 2077 var d = mx.addedNodes[0]; 2078 while (d && d !== document && !d.host) { 2079 d = d.parentNode; 2080 } 2081 var u = d && (d.URL || d._URL || d.host && d.host.localName) || ""; 2082 u = u.split("/?").shift().split("/").pop(); 2083 } 2084 } 2085 console.group("mutations (%d) [%s]", mutations.length, u || ""); 2086 } 2087 var isAttached = inDocument(root); 2088 mutations.forEach(function(mx) { 2089 if (mx.type === "childList") { 2090 forEach(mx.addedNodes, function(n) { 2091 if (!n.localName) { 2092 return; 2093 } 2094 addedNode(n, isAttached); 2095 }); 2096 forEach(mx.removedNodes, function(n) { 2097 if (!n.localName) { 2098 return; 2099 } 2100 detachedNode(n); 2101 }); 2102 } 2103 }); 2104 flags.dom && console.groupEnd(); 2105 } 2106 function takeRecords(node) { 2107 node = window.wrap(node); 2108 if (!node) { 2109 node = window.wrap(document); 2110 } 2111 while (node.parentNode) { 2112 node = node.parentNode; 2113 } 2114 var observer = node.__observer; 2115 if (observer) { 2116 handler(node, observer.takeRecords()); 2117 takeMutations(); 2118 } 2119 } 2120 var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach); 2121 function observe(inRoot) { 2122 if (inRoot.__observer) { 2123 return; 2124 } 2125 var observer = new MutationObserver(handler.bind(this, inRoot)); 2126 observer.observe(inRoot, { 2127 childList: true, 2128 subtree: true 2129 }); 2130 inRoot.__observer = observer; 2131 } 2132 function upgradeDocument(doc) { 2133 doc = window.wrap(doc); 2134 flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop()); 2135 var isMainDocument = doc === window.wrap(document); 2136 addedNode(doc, isMainDocument); 2137 observe(doc); 2138 flags.dom && console.groupEnd(); 2139 } 2140 function upgradeDocumentTree(doc) { 2141 forDocumentTree(doc, upgradeDocument); 2142 } 2143 var originalCreateShadowRoot = Element.prototype.createShadowRoot; 2144 if (originalCreateShadowRoot) { 2145 Element.prototype.createShadowRoot = function() { 2146 var root = originalCreateShadowRoot.call(this); 2147 window.CustomElements.watchShadow(this); 2148 return root; 2149 }; 2150 } 2151 scope.watchShadow = watchShadow; 2152 scope.upgradeDocumentTree = upgradeDocumentTree; 2153 scope.upgradeDocument = upgradeDocument; 2154 scope.upgradeSubtree = addedSubtree; 2155 scope.upgradeAll = addedNode; 2156 scope.attached = attached; 2157 scope.takeRecords = takeRecords; 2158}); 2159 2160window.CustomElements.addModule(function(scope) { 2161 var flags = scope.flags; 2162 function upgrade(node, isAttached) { 2163 if (node.localName === "template") { 2164 if (window.HTMLTemplateElement && HTMLTemplateElement.decorate) { 2165 HTMLTemplateElement.decorate(node); 2166 } 2167 } 2168 if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) { 2169 var is = node.getAttribute("is"); 2170 var definition = scope.getRegisteredDefinition(node.localName) || scope.getRegisteredDefinition(is); 2171 if (definition) { 2172 if (is && definition.tag == node.localName || !is && !definition.extends) { 2173 return upgradeWithDefinition(node, definition, isAttached); 2174 } 2175 } 2176 } 2177 } 2178 function upgradeWithDefinition(element, definition, isAttached) { 2179 flags.upgrade && console.group("upgrade:", element.localName); 2180 if (definition.is) { 2181 element.setAttribute("is", definition.is); 2182 } 2183 implementPrototype(element, definition); 2184 element.__upgraded__ = true; 2185 created(element); 2186 if (isAttached) { 2187 scope.attached(element); 2188 } 2189 scope.upgradeSubtree(element, isAttached); 2190 flags.upgrade && console.groupEnd(); 2191 return element; 2192 } 2193 function implementPrototype(element, definition) { 2194 if (Object.__proto__) { 2195 element.__proto__ = definition.prototype; 2196 } else { 2197 customMixin(element, definition.prototype, definition.native); 2198 element.__proto__ = definition.prototype; 2199 } 2200 } 2201 function customMixin(inTarget, inSrc, inNative) { 2202 var used = {}; 2203 var p = inSrc; 2204 while (p !== inNative && p !== HTMLElement.prototype) { 2205 var keys = Object.getOwnPropertyNames(p); 2206 for (var i = 0, k; k = keys[i]; i++) { 2207 if (!used[k]) { 2208 Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k)); 2209 used[k] = 1; 2210 } 2211 } 2212 p = Object.getPrototypeOf(p); 2213 } 2214 } 2215 function created(element) { 2216 if (element.createdCallback) { 2217 element.createdCallback(); 2218 } 2219 } 2220 scope.upgrade = upgrade; 2221 scope.upgradeWithDefinition = upgradeWithDefinition; 2222 scope.implementPrototype = implementPrototype; 2223}); 2224 2225window.CustomElements.addModule(function(scope) { 2226 var isIE = scope.isIE; 2227 var upgradeDocumentTree = scope.upgradeDocumentTree; 2228 var upgradeAll = scope.upgradeAll; 2229 var upgradeWithDefinition = scope.upgradeWithDefinition; 2230 var implementPrototype = scope.implementPrototype; 2231 var useNative = scope.useNative; 2232 function register(name, options) { 2233 var definition = options || {}; 2234 if (!name) { 2235 throw new Error("document.registerElement: first argument `name` must not be empty"); 2236 } 2237 if (name.indexOf("-") < 0) { 2238 throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'."); 2239 } 2240 if (isReservedTag(name)) { 2241 throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid."); 2242 } 2243 if (getRegisteredDefinition(name)) { 2244 throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered"); 2245 } 2246 if (!definition.prototype) { 2247 definition.prototype = Object.create(HTMLElement.prototype); 2248 } 2249 definition.__name = name.toLowerCase(); 2250 if (definition.extends) { 2251 definition.extends = definition.extends.toLowerCase(); 2252 } 2253 definition.lifecycle = definition.lifecycle || {}; 2254 definition.ancestry = ancestry(definition.extends); 2255 resolveTagName(definition); 2256 resolvePrototypeChain(definition); 2257 overrideAttributeApi(definition.prototype); 2258 registerDefinition(definition.__name, definition); 2259 definition.ctor = generateConstructor(definition); 2260 definition.ctor.prototype = definition.prototype; 2261 definition.prototype.constructor = definition.ctor; 2262 if (scope.ready) { 2263 upgradeDocumentTree(document); 2264 } 2265 return definition.ctor; 2266 } 2267 function overrideAttributeApi(prototype) { 2268 if (prototype.setAttribute._polyfilled) { 2269 return; 2270 } 2271 var setAttribute = prototype.setAttribute; 2272 prototype.setAttribute = function(name, value) { 2273 changeAttribute.call(this, name, value, setAttribute); 2274 }; 2275 var removeAttribute = prototype.removeAttribute; 2276 prototype.removeAttribute = function(name) { 2277 changeAttribute.call(this, name, null, removeAttribute); 2278 }; 2279 prototype.setAttribute._polyfilled = true; 2280 } 2281 function changeAttribute(name, value, operation) { 2282 name = name.toLowerCase(); 2283 var oldValue = this.getAttribute(name); 2284 operation.apply(this, arguments); 2285 var newValue = this.getAttribute(name); 2286 if (this.attributeChangedCallback && newValue !== oldValue) { 2287 this.attributeChangedCallback(name, oldValue, newValue); 2288 } 2289 } 2290 function isReservedTag(name) { 2291 for (var i = 0; i < reservedTagList.length; i++) { 2292 if (name === reservedTagList[i]) { 2293 return true; 2294 } 2295 } 2296 } 2297 var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ]; 2298 function ancestry(extnds) { 2299 var extendee = getRegisteredDefinition(extnds); 2300 if (extendee) { 2301 return ancestry(extendee.extends).concat([ extendee ]); 2302 } 2303 return []; 2304 } 2305 function resolveTagName(definition) { 2306 var baseTag = definition.extends; 2307 for (var i = 0, a; a = definition.ancestry[i]; i++) { 2308 baseTag = a.is && a.tag; 2309 } 2310 definition.tag = baseTag || definition.__name; 2311 if (baseTag) { 2312 definition.is = definition.__name; 2313 } 2314 } 2315 function resolvePrototypeChain(definition) { 2316 if (!Object.__proto__) { 2317 var nativePrototype = HTMLElement.prototype; 2318 if (definition.is) { 2319 var inst = document.createElement(definition.tag); 2320 nativePrototype = Object.getPrototypeOf(inst); 2321 } 2322 var proto = definition.prototype, ancestor; 2323 var foundPrototype = false; 2324 while (proto) { 2325 if (proto == nativePrototype) { 2326 foundPrototype = true; 2327 } 2328 ancestor = Object.getPrototypeOf(proto); 2329 if (ancestor) { 2330 proto.__proto__ = ancestor; 2331 } 2332 proto = ancestor; 2333 } 2334 if (!foundPrototype) { 2335 console.warn(definition.tag + " prototype not found in prototype chain for " + definition.is); 2336 } 2337 definition.native = nativePrototype; 2338 } 2339 } 2340 function instantiate(definition) { 2341 return upgradeWithDefinition(domCreateElement(definition.tag), definition); 2342 } 2343 var registry = {}; 2344 function getRegisteredDefinition(name) { 2345 if (name) { 2346 return registry[name.toLowerCase()]; 2347 } 2348 } 2349 function registerDefinition(name, definition) { 2350 registry[name] = definition; 2351 } 2352 function generateConstructor(definition) { 2353 return function() { 2354 return instantiate(definition); 2355 }; 2356 } 2357 var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; 2358 function createElementNS(namespace, tag, typeExtension) { 2359 if (namespace === HTML_NAMESPACE) { 2360 return createElement(tag, typeExtension); 2361 } else { 2362 return domCreateElementNS(namespace, tag); 2363 } 2364 } 2365 function createElement(tag, typeExtension) { 2366 if (tag) { 2367 tag = tag.toLowerCase(); 2368 } 2369 if (typeExtension) { 2370 typeExtension = typeExtension.toLowerCase(); 2371 } 2372 var definition = getRegisteredDefinition(typeExtension || tag); 2373 if (definition) { 2374 if (tag == definition.tag && typeExtension == definition.is) { 2375 return new definition.ctor(); 2376 } 2377 if (!typeExtension && !definition.is) { 2378 return new definition.ctor(); 2379 } 2380 } 2381 var element; 2382 if (typeExtension) { 2383 element = createElement(tag); 2384 element.setAttribute("is", typeExtension); 2385 return element; 2386 } 2387 element = domCreateElement(tag); 2388 if (tag.indexOf("-") >= 0) { 2389 implementPrototype(element, HTMLElement); 2390 } 2391 return element; 2392 } 2393 var domCreateElement = document.createElement.bind(document); 2394 var domCreateElementNS = document.createElementNS.bind(document); 2395 var isInstance; 2396 if (!Object.__proto__ && !useNative) { 2397 isInstance = function(obj, ctor) { 2398 if (obj instanceof ctor) { 2399 return true; 2400 } 2401 var p = obj; 2402 while (p) { 2403 if (p === ctor.prototype) { 2404 return true; 2405 } 2406 p = p.__proto__; 2407 } 2408 return false; 2409 }; 2410 } else { 2411 isInstance = function(obj, base) { 2412 return obj instanceof base; 2413 }; 2414 } 2415 function wrapDomMethodToForceUpgrade(obj, methodName) { 2416 var orig = obj[methodName]; 2417 obj[methodName] = function() { 2418 var n = orig.apply(this, arguments); 2419 upgradeAll(n); 2420 return n; 2421 }; 2422 } 2423 wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode"); 2424 wrapDomMethodToForceUpgrade(document, "importNode"); 2425 document.registerElement = register; 2426 document.createElement = createElement; 2427 document.createElementNS = createElementNS; 2428 scope.registry = registry; 2429 scope.instanceof = isInstance; 2430 scope.reservedTagList = reservedTagList; 2431 scope.getRegisteredDefinition = getRegisteredDefinition; 2432 document.register = document.registerElement; 2433}); 2434 2435(function(scope) { 2436 var useNative = scope.useNative; 2437 var initializeModules = scope.initializeModules; 2438 var isIE = scope.isIE; 2439 if (useNative) { 2440 var nop = function() {}; 2441 scope.watchShadow = nop; 2442 scope.upgrade = nop; 2443 scope.upgradeAll = nop; 2444 scope.upgradeDocumentTree = nop; 2445 scope.upgradeSubtree = nop; 2446 scope.takeRecords = nop; 2447 scope.instanceof = function(obj, base) { 2448 return obj instanceof base; 2449 }; 2450 } else { 2451 initializeModules(); 2452 } 2453 var upgradeDocumentTree = scope.upgradeDocumentTree; 2454 var upgradeDocument = scope.upgradeDocument; 2455 if (!window.wrap) { 2456 if (window.ShadowDOMPolyfill) { 2457 window.wrap = window.ShadowDOMPolyfill.wrapIfNeeded; 2458 window.unwrap = window.ShadowDOMPolyfill.unwrapIfNeeded; 2459 } else { 2460 window.wrap = window.unwrap = function(node) { 2461 return node; 2462 }; 2463 } 2464 } 2465 if (window.HTMLImports) { 2466 window.HTMLImports.__importsParsingHook = function(elt) { 2467 if (elt.import) { 2468 upgradeDocument(wrap(elt.import)); 2469 } 2470 }; 2471 } 2472 function bootstrap() { 2473 upgradeDocumentTree(window.wrap(document)); 2474 window.CustomElements.ready = true; 2475 var requestAnimationFrame = window.requestAnimationFrame || function(f) { 2476 setTimeout(f, 16); 2477 }; 2478 requestAnimationFrame(function() { 2479 setTimeout(function() { 2480 window.CustomElements.readyTime = Date.now(); 2481 if (window.HTMLImports) { 2482 window.CustomElements.elapsed = window.CustomElements.readyTime - window.HTMLImports.readyTime; 2483 } 2484 document.dispatchEvent(new CustomEvent("WebComponentsReady", { 2485 bubbles: true 2486 })); 2487 }); 2488 }); 2489 } 2490 if (document.readyState === "complete" || scope.flags.eager) { 2491 bootstrap(); 2492 } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) { 2493 bootstrap(); 2494 } else { 2495 var loadEvent = window.HTMLImports && !window.HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded"; 2496 window.addEventListener(loadEvent, bootstrap); 2497 } 2498})(window.CustomElements); 2499 2500(function(scope) { 2501 var style = document.createElement("style"); 2502 style.textContent = "" + "body {" + "transition: opacity ease-in 0.2s;" + " } \n" + "body[unresolved] {" + "opacity: 0; display: block; overflow: hidden; position: relative;" + " } \n"; 2503 var head = document.querySelector("head"); 2504 head.insertBefore(style, head.firstChild); 2505})(window.WebComponents);