Home | History | Annotate | Download | only in webcomponentsjs
      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.5.5
     11 window.WebComponents = window.WebComponents || {};
     12 
     13 (function(scope) {
     14   var flags = scope.flags || {};
     15   var file = "webcomponents.js";
     16   var script = document.querySelector('script[src*="' + file + '"]');
     17   if (!flags.noOpts) {
     18     location.search.slice(1).split("&").forEach(function(o) {
     19       o = o.split("=");
     20       o[0] && (flags[o[0]] = o[1] || true);
     21     });
     22     if (script) {
     23       for (var i = 0, a; a = script.attributes[i]; i++) {
     24         if (a.name !== "src") {
     25           flags[a.name] = a.value || true;
     26         }
     27       }
     28     }
     29     if (flags.log) {
     30       var parts = flags.log.split(",");
     31       flags.log = {};
     32       parts.forEach(function(f) {
     33         flags.log[f] = true;
     34       });
     35     } else {
     36       flags.log = {};
     37     }
     38   }
     39   flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;
     40   if (flags.shadow === "native") {
     41     flags.shadow = false;
     42   } else {
     43     flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;
     44   }
     45   if (flags.register) {
     46     window.CustomElements = window.CustomElements || {
     47       flags: {}
     48     };
     49     window.CustomElements.flags.register = flags.register;
     50   }
     51   scope.flags = flags;
     52 })(WebComponents);
     53 
     54 (function(global) {
     55   var registrationsTable = new WeakMap();
     56   var setImmediate;
     57   if (/Trident|Edge/.test(navigator.userAgent)) {
     58     setImmediate = setTimeout;
     59   } else if (window.setImmediate) {
     60     setImmediate = window.setImmediate;
     61   } else {
     62     var setImmediateQueue = [];
     63     var sentinel = String(Math.random());
     64     window.addEventListener("message", function(e) {
     65       if (e.data === sentinel) {
     66         var queue = setImmediateQueue;
     67         setImmediateQueue = [];
     68         queue.forEach(function(func) {
     69           func();
     70         });
     71       }
     72     });
     73     setImmediate = function(func) {
     74       setImmediateQueue.push(func);
     75       window.postMessage(sentinel, "*");
     76     };
     77   }
     78   var isScheduled = false;
     79   var scheduledObservers = [];
     80   function scheduleCallback(observer) {
     81     scheduledObservers.push(observer);
     82     if (!isScheduled) {
     83       isScheduled = true;
     84       setImmediate(dispatchCallbacks);
     85     }
     86   }
     87   function wrapIfNeeded(node) {
     88     return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
     89   }
     90   function dispatchCallbacks() {
     91     isScheduled = false;
     92     var observers = scheduledObservers;
     93     scheduledObservers = [];
     94     observers.sort(function(o1, o2) {
     95       return o1.uid_ - o2.uid_;
     96     });
     97     var anyNonEmpty = false;
     98     observers.forEach(function(observer) {
     99       var queue = observer.takeRecords();
    100       removeTransientObserversFor(observer);
    101       if (queue.length) {
    102         observer.callback_(queue, observer);
    103         anyNonEmpty = true;
    104       }
    105     });
    106     if (anyNonEmpty) dispatchCallbacks();
    107   }
    108   function removeTransientObserversFor(observer) {
    109     observer.nodes_.forEach(function(node) {
    110       var registrations = registrationsTable.get(node);
    111       if (!registrations) return;
    112       registrations.forEach(function(registration) {
    113         if (registration.observer === observer) registration.removeTransientObservers();
    114       });
    115     });
    116   }
    117   function forEachAncestorAndObserverEnqueueRecord(target, callback) {
    118     for (var node = target; node; node = node.parentNode) {
    119       var registrations = registrationsTable.get(node);
    120       if (registrations) {
    121         for (var j = 0; j < registrations.length; j++) {
    122           var registration = registrations[j];
    123           var options = registration.options;
    124           if (node !== target && !options.subtree) continue;
    125           var record = callback(options);
    126           if (record) registration.enqueue(record);
    127         }
    128       }
    129     }
    130   }
    131   var uidCounter = 0;
    132   function JsMutationObserver(callback) {
    133     this.callback_ = callback;
    134     this.nodes_ = [];
    135     this.records_ = [];
    136     this.uid_ = ++uidCounter;
    137   }
    138   JsMutationObserver.prototype = {
    139     observe: function(target, options) {
    140       target = wrapIfNeeded(target);
    141       if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
    142         throw new SyntaxError();
    143       }
    144       var registrations = registrationsTable.get(target);
    145       if (!registrations) registrationsTable.set(target, registrations = []);
    146       var registration;
    147       for (var i = 0; i < registrations.length; i++) {
    148         if (registrations[i].observer === this) {
    149           registration = registrations[i];
    150           registration.removeListeners();
    151           registration.options = options;
    152           break;
    153         }
    154       }
    155       if (!registration) {
    156         registration = new Registration(this, target, options);
    157         registrations.push(registration);
    158         this.nodes_.push(target);
    159       }
    160       registration.addListeners();
    161     },
    162     disconnect: function() {
    163       this.nodes_.forEach(function(node) {
    164         var registrations = registrationsTable.get(node);
    165         for (var i = 0; i < registrations.length; i++) {
    166           var registration = registrations[i];
    167           if (registration.observer === this) {
    168             registration.removeListeners();
    169             registrations.splice(i, 1);
    170             break;
    171           }
    172         }
    173       }, this);
    174       this.records_ = [];
    175     },
    176     takeRecords: function() {
    177       var copyOfRecords = this.records_;
    178       this.records_ = [];
    179       return copyOfRecords;
    180     }
    181   };
    182   function MutationRecord(type, target) {
    183     this.type = type;
    184     this.target = target;
    185     this.addedNodes = [];
    186     this.removedNodes = [];
    187     this.previousSibling = null;
    188     this.nextSibling = null;
    189     this.attributeName = null;
    190     this.attributeNamespace = null;
    191     this.oldValue = null;
    192   }
    193   function copyMutationRecord(original) {
    194     var record = new MutationRecord(original.type, original.target);
    195     record.addedNodes = original.addedNodes.slice();
    196     record.removedNodes = original.removedNodes.slice();
    197     record.previousSibling = original.previousSibling;
    198     record.nextSibling = original.nextSibling;
    199     record.attributeName = original.attributeName;
    200     record.attributeNamespace = original.attributeNamespace;
    201     record.oldValue = original.oldValue;
    202     return record;
    203   }
    204   var currentRecord, recordWithOldValue;
    205   function getRecord(type, target) {
    206     return currentRecord = new MutationRecord(type, target);
    207   }
    208   function getRecordWithOldValue(oldValue) {
    209     if (recordWithOldValue) return recordWithOldValue;
    210     recordWithOldValue = copyMutationRecord(currentRecord);
    211     recordWithOldValue.oldValue = oldValue;
    212     return recordWithOldValue;
    213   }
    214   function clearRecords() {
    215     currentRecord = recordWithOldValue = undefined;
    216   }
    217   function recordRepresentsCurrentMutation(record) {
    218     return record === recordWithOldValue || record === currentRecord;
    219   }
    220   function selectRecord(lastRecord, newRecord) {
    221     if (lastRecord === newRecord) return lastRecord;
    222     if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
    223     return null;
    224   }
    225   function Registration(observer, target, options) {
    226     this.observer = observer;
    227     this.target = target;
    228     this.options = options;
    229     this.transientObservedNodes = [];
    230   }
    231   Registration.prototype = {
    232     enqueue: function(record) {
    233       var records = this.observer.records_;
    234       var length = records.length;
    235       if (records.length > 0) {
    236         var lastRecord = records[length - 1];
    237         var recordToReplaceLast = selectRecord(lastRecord, record);
    238         if (recordToReplaceLast) {
    239           records[length - 1] = recordToReplaceLast;
    240           return;
    241         }
    242       } else {
    243         scheduleCallback(this.observer);
    244       }
    245       records[length] = record;
    246     },
    247     addListeners: function() {
    248       this.addListeners_(this.target);
    249     },
    250     addListeners_: function(node) {
    251       var options = this.options;
    252       if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
    253       if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
    254       if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
    255       if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
    256     },
    257     removeListeners: function() {
    258       this.removeListeners_(this.target);
    259     },
    260     removeListeners_: function(node) {
    261       var options = this.options;
    262       if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
    263       if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
    264       if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
    265       if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
    266     },
    267     addTransientObserver: function(node) {
    268       if (node === this.target) return;
    269       this.addListeners_(node);
    270       this.transientObservedNodes.push(node);
    271       var registrations = registrationsTable.get(node);
    272       if (!registrations) registrationsTable.set(node, registrations = []);
    273       registrations.push(this);
    274     },
    275     removeTransientObservers: function() {
    276       var transientObservedNodes = this.transientObservedNodes;
    277       this.transientObservedNodes = [];
    278       transientObservedNodes.forEach(function(node) {
    279         this.removeListeners_(node);
    280         var registrations = registrationsTable.get(node);
    281         for (var i = 0; i < registrations.length; i++) {
    282           if (registrations[i] === this) {
    283             registrations.splice(i, 1);
    284             break;
    285           }
    286         }
    287       }, this);
    288     },
    289     handleEvent: function(e) {
    290       e.stopImmediatePropagation();
    291       switch (e.type) {
    292        case "DOMAttrModified":
    293         var name = e.attrName;
    294         var namespace = e.relatedNode.namespaceURI;
    295         var target = e.target;
    296         var record = new getRecord("attributes", target);
    297         record.attributeName = name;
    298         record.attributeNamespace = namespace;
    299         var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
    300         forEachAncestorAndObserverEnqueueRecord(target, function(options) {
    301           if (!options.attributes) return;
    302           if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
    303             return;
    304           }
    305           if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
    306           return record;
    307         });
    308         break;
    309 
    310        case "DOMCharacterDataModified":
    311         var target = e.target;
    312         var record = getRecord("characterData", target);
    313         var oldValue = e.prevValue;
    314         forEachAncestorAndObserverEnqueueRecord(target, function(options) {
    315           if (!options.characterData) return;
    316           if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
    317           return record;
    318         });
    319         break;
    320 
    321        case "DOMNodeRemoved":
    322         this.addTransientObserver(e.target);
    323 
    324        case "DOMNodeInserted":
    325         var changedNode = e.target;
    326         var addedNodes, removedNodes;
    327         if (e.type === "DOMNodeInserted") {
    328           addedNodes = [ changedNode ];
    329           removedNodes = [];
    330         } else {
    331           addedNodes = [];
    332           removedNodes = [ changedNode ];
    333         }
    334         var previousSibling = changedNode.previousSibling;
    335         var nextSibling = changedNode.nextSibling;
    336         var record = getRecord("childList", e.target.parentNode);
    337         record.addedNodes = addedNodes;
    338         record.removedNodes = removedNodes;
    339         record.previousSibling = previousSibling;
    340         record.nextSibling = nextSibling;
    341         forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) {
    342           if (!options.childList) return;
    343           return record;
    344         });
    345       }
    346       clearRecords();
    347     }
    348   };
    349   global.JsMutationObserver = JsMutationObserver;
    350   if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;
    351 })(this);
    352 
    353 if (typeof WeakMap === "undefined") {
    354   (function() {
    355     var defineProperty = Object.defineProperty;
    356     var counter = Date.now() % 1e9;
    357     var WeakMap = function() {
    358       this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
    359     };
    360     WeakMap.prototype = {
    361       set: function(key, value) {
    362         var entry = key[this.name];
    363         if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
    364           value: [ key, value ],
    365           writable: true
    366         });
    367         return this;
    368       },
    369       get: function(key) {
    370         var entry;
    371         return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
    372       },
    373       "delete": function(key) {
    374         var entry = key[this.name];
    375         if (!entry || entry[0] !== key) return false;
    376         entry[0] = entry[1] = undefined;
    377         return true;
    378       },
    379       has: function(key) {
    380         var entry = key[this.name];
    381         if (!entry) return false;
    382         return entry[0] === key;
    383       }
    384     };
    385     window.WeakMap = WeakMap;
    386   })();
    387 }
    388 
    389 window.HTMLImports = window.HTMLImports || {
    390   flags: {}
    391 };
    392 
    393 (function(scope) {
    394   var IMPORT_LINK_TYPE = "import";
    395   var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link"));
    396   var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
    397   var wrap = function(node) {
    398     return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;
    399   };
    400   var rootDocument = wrap(document);
    401   var currentScriptDescriptor = {
    402     get: function() {
    403       var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null);
    404       return wrap(script);
    405     },
    406     configurable: true
    407   };
    408   Object.defineProperty(document, "_currentScript", currentScriptDescriptor);
    409   Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor);
    410   var isIE = /Trident|Edge/.test(navigator.userAgent);
    411   function whenReady(callback, doc) {
    412     doc = doc || rootDocument;
    413     whenDocumentReady(function() {
    414       watchImportsLoad(callback, doc);
    415     }, doc);
    416   }
    417   var requiredReadyState = isIE ? "complete" : "interactive";
    418   var READY_EVENT = "readystatechange";
    419   function isDocumentReady(doc) {
    420     return doc.readyState === "complete" || doc.readyState === requiredReadyState;
    421   }
    422   function whenDocumentReady(callback, doc) {
    423     if (!isDocumentReady(doc)) {
    424       var checkReady = function() {
    425         if (doc.readyState === "complete" || doc.readyState === requiredReadyState) {
    426           doc.removeEventListener(READY_EVENT, checkReady);
    427           whenDocumentReady(callback, doc);
    428         }
    429       };
    430       doc.addEventListener(READY_EVENT, checkReady);
    431     } else if (callback) {
    432       callback();
    433     }
    434   }
    435   function markTargetLoaded(event) {
    436     event.target.__loaded = true;
    437   }
    438   function watchImportsLoad(callback, doc) {
    439     var imports = doc.querySelectorAll("link[rel=import]");
    440     var loaded = 0, l = imports.length;
    441     function checkDone(d) {
    442       if (loaded == l && callback) {
    443         callback();
    444       }
    445     }
    446     function loadedImport(e) {
    447       markTargetLoaded(e);
    448       loaded++;
    449       checkDone();
    450     }
    451     if (l) {
    452       for (var i = 0, imp; i < l && (imp = imports[i]); i++) {
    453         if (isImportLoaded(imp)) {
    454           loadedImport.call(imp, {
    455             target: imp
    456           });
    457         } else {
    458           imp.addEventListener("load", loadedImport);
    459           imp.addEventListener("error", loadedImport);
    460         }
    461       }
    462     } else {
    463       checkDone();
    464     }
    465   }
    466   function isImportLoaded(link) {
    467     return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed;
    468   }
    469   if (useNative) {
    470     new MutationObserver(function(mxns) {
    471       for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) {
    472         if (m.addedNodes) {
    473           handleImports(m.addedNodes);
    474         }
    475       }
    476     }).observe(document.head, {
    477       childList: true
    478     });
    479     function handleImports(nodes) {
    480       for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
    481         if (isImport(n)) {
    482           handleImport(n);
    483         }
    484       }
    485     }
    486     function isImport(element) {
    487       return element.localName === "link" && element.rel === "import";
    488     }
    489     function handleImport(element) {
    490       var loaded = element.import;
    491       if (loaded) {
    492         markTargetLoaded({
    493           target: element
    494         });
    495       } else {
    496         element.addEventListener("load", markTargetLoaded);
    497         element.addEventListener("error", markTargetLoaded);
    498       }
    499     }
    500     (function() {
    501       if (document.readyState === "loading") {
    502         var imports = document.querySelectorAll("link[rel=import]");
    503         for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {
    504           handleImport(imp);
    505         }
    506       }
    507     })();
    508   }
    509   whenReady(function() {
    510     HTMLImports.ready = true;
    511     HTMLImports.readyTime = new Date().getTime();
    512     var evt = rootDocument.createEvent("CustomEvent");
    513     evt.initCustomEvent("HTMLImportsLoaded", true, true, {});
    514     rootDocument.dispatchEvent(evt);
    515   });
    516   scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
    517   scope.useNative = useNative;
    518   scope.rootDocument = rootDocument;
    519   scope.whenReady = whenReady;
    520   scope.isIE = isIE;
    521 })(HTMLImports);
    522 
    523 (function(scope) {
    524   var modules = [];
    525   var addModule = function(module) {
    526     modules.push(module);
    527   };
    528   var initializeModules = function() {
    529     modules.forEach(function(module) {
    530       module(scope);
    531     });
    532   };
    533   scope.addModule = addModule;
    534   scope.initializeModules = initializeModules;
    535 })(HTMLImports);
    536 
    537 HTMLImports.addModule(function(scope) {
    538   var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
    539   var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
    540   var path = {
    541     resolveUrlsInStyle: function(style) {
    542       var doc = style.ownerDocument;
    543       var resolver = doc.createElement("a");
    544       style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);
    545       return style;
    546     },
    547     resolveUrlsInCssText: function(cssText, urlObj) {
    548       var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);
    549       r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);
    550       return r;
    551     },
    552     replaceUrls: function(text, urlObj, regexp) {
    553       return text.replace(regexp, function(m, pre, url, post) {
    554         var urlPath = url.replace(/["']/g, "");
    555         urlObj.href = urlPath;
    556         urlPath = urlObj.href;
    557         return pre + "'" + urlPath + "'" + post;
    558       });
    559     }
    560   };
    561   scope.path = path;
    562 });
    563 
    564 HTMLImports.addModule(function(scope) {
    565   var xhr = {
    566     async: true,
    567     ok: function(request) {
    568       return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0;
    569     },
    570     load: function(url, next, nextContext) {
    571       var request = new XMLHttpRequest();
    572       if (scope.flags.debug || scope.flags.bust) {
    573         url += "?" + Math.random();
    574       }
    575       request.open("GET", url, xhr.async);
    576       request.addEventListener("readystatechange", function(e) {
    577         if (request.readyState === 4) {
    578           var locationHeader = request.getResponseHeader("Location");
    579           var redirectedUrl = null;
    580           if (locationHeader) {
    581             var redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader;
    582           }
    583           next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl);
    584         }
    585       });
    586       request.send();
    587       return request;
    588     },
    589     loadDocument: function(url, next, nextContext) {
    590       this.load(url, next, nextContext).responseType = "document";
    591     }
    592   };
    593   scope.xhr = xhr;
    594 });
    595 
    596 HTMLImports.addModule(function(scope) {
    597   var xhr = scope.xhr;
    598   var flags = scope.flags;
    599   var Loader = function(onLoad, onComplete) {
    600     this.cache = {};
    601     this.onload = onLoad;
    602     this.oncomplete = onComplete;
    603     this.inflight = 0;
    604     this.pending = {};
    605   };
    606   Loader.prototype = {
    607     addNodes: function(nodes) {
    608       this.inflight += nodes.length;
    609       for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
    610         this.require(n);
    611       }
    612       this.checkDone();
    613     },
    614     addNode: function(node) {
    615       this.inflight++;
    616       this.require(node);
    617       this.checkDone();
    618     },
    619     require: function(elt) {
    620       var url = elt.src || elt.href;
    621       elt.__nodeUrl = url;
    622       if (!this.dedupe(url, elt)) {
    623         this.fetch(url, elt);
    624       }
    625     },
    626     dedupe: function(url, elt) {
    627       if (this.pending[url]) {
    628         this.pending[url].push(elt);
    629         return true;
    630       }
    631       var resource;
    632       if (this.cache[url]) {
    633         this.onload(url, elt, this.cache[url]);
    634         this.tail();
    635         return true;
    636       }
    637       this.pending[url] = [ elt ];
    638       return false;
    639     },
    640     fetch: function(url, elt) {
    641       flags.load && console.log("fetch", url, elt);
    642       if (!url) {
    643         setTimeout(function() {
    644           this.receive(url, elt, {
    645             error: "href must be specified"
    646           }, null);
    647         }.bind(this), 0);
    648       } else if (url.match(/^data:/)) {
    649         var pieces = url.split(",");
    650         var header = pieces[0];
    651         var body = pieces[1];
    652         if (header.indexOf(";base64") > -1) {
    653           body = atob(body);
    654         } else {
    655           body = decodeURIComponent(body);
    656         }
    657         setTimeout(function() {
    658           this.receive(url, elt, null, body);
    659         }.bind(this), 0);
    660       } else {
    661         var receiveXhr = function(err, resource, redirectedUrl) {
    662           this.receive(url, elt, err, resource, redirectedUrl);
    663         }.bind(this);
    664         xhr.load(url, receiveXhr);
    665       }
    666     },
    667     receive: function(url, elt, err, resource, redirectedUrl) {
    668       this.cache[url] = resource;
    669       var $p = this.pending[url];
    670       for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
    671         this.onload(url, p, resource, err, redirectedUrl);
    672         this.tail();
    673       }
    674       this.pending[url] = null;
    675     },
    676     tail: function() {
    677       --this.inflight;
    678       this.checkDone();
    679     },
    680     checkDone: function() {
    681       if (!this.inflight) {
    682         this.oncomplete();
    683       }
    684     }
    685   };
    686   scope.Loader = Loader;
    687 });
    688 
    689 HTMLImports.addModule(function(scope) {
    690   var Observer = function(addCallback) {
    691     this.addCallback = addCallback;
    692     this.mo = new MutationObserver(this.handler.bind(this));
    693   };
    694   Observer.prototype = {
    695     handler: function(mutations) {
    696       for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) {
    697         if (m.type === "childList" && m.addedNodes.length) {
    698           this.addedNodes(m.addedNodes);
    699         }
    700       }
    701     },
    702     addedNodes: function(nodes) {
    703       if (this.addCallback) {
    704         this.addCallback(nodes);
    705       }
    706       for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {
    707         if (n.children && n.children.length) {
    708           this.addedNodes(n.children);
    709         }
    710       }
    711     },
    712     observe: function(root) {
    713       this.mo.observe(root, {
    714         childList: true,
    715         subtree: true
    716       });
    717     }
    718   };
    719   scope.Observer = Observer;
    720 });
    721 
    722 HTMLImports.addModule(function(scope) {
    723   var path = scope.path;
    724   var rootDocument = scope.rootDocument;
    725   var flags = scope.flags;
    726   var isIE = scope.isIE;
    727   var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
    728   var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]";
    729   var importParser = {
    730     documentSelectors: IMPORT_SELECTOR,
    731     importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]", "style", "script:not([type])", 'script[type="text/javascript"]' ].join(","),
    732     map: {
    733       link: "parseLink",
    734       script: "parseScript",
    735       style: "parseStyle"
    736     },
    737     dynamicElements: [],
    738     parseNext: function() {
    739       var next = this.nextToParse();
    740       if (next) {
    741         this.parse(next);
    742       }
    743     },
    744     parse: function(elt) {
    745       if (this.isParsed(elt)) {
    746         flags.parse && console.log("[%s] is already parsed", elt.localName);
    747         return;
    748       }
    749       var fn = this[this.map[elt.localName]];
    750       if (fn) {
    751         this.markParsing(elt);
    752         fn.call(this, elt);
    753       }
    754     },
    755     parseDynamic: function(elt, quiet) {
    756       this.dynamicElements.push(elt);
    757       if (!quiet) {
    758         this.parseNext();
    759       }
    760     },
    761     markParsing: function(elt) {
    762       flags.parse && console.log("parsing", elt);
    763       this.parsingElement = elt;
    764     },
    765     markParsingComplete: function(elt) {
    766       elt.__importParsed = true;
    767       this.markDynamicParsingComplete(elt);
    768       if (elt.__importElement) {
    769         elt.__importElement.__importParsed = true;
    770         this.markDynamicParsingComplete(elt.__importElement);
    771       }
    772       this.parsingElement = null;
    773       flags.parse && console.log("completed", elt);
    774     },
    775     markDynamicParsingComplete: function(elt) {
    776       var i = this.dynamicElements.indexOf(elt);
    777       if (i >= 0) {
    778         this.dynamicElements.splice(i, 1);
    779       }
    780     },
    781     parseImport: function(elt) {
    782       if (HTMLImports.__importsParsingHook) {
    783         HTMLImports.__importsParsingHook(elt);
    784       }
    785       if (elt.import) {
    786         elt.import.__importParsed = true;
    787       }
    788       this.markParsingComplete(elt);
    789       if (elt.__resource && !elt.__error) {
    790         elt.dispatchEvent(new CustomEvent("load", {
    791           bubbles: false
    792         }));
    793       } else {
    794         elt.dispatchEvent(new CustomEvent("error", {
    795           bubbles: false
    796         }));
    797       }
    798       if (elt.__pending) {
    799         var fn;
    800         while (elt.__pending.length) {
    801           fn = elt.__pending.shift();
    802           if (fn) {
    803             fn({
    804               target: elt
    805             });
    806           }
    807         }
    808       }
    809       this.parseNext();
    810     },
    811     parseLink: function(linkElt) {
    812       if (nodeIsImport(linkElt)) {
    813         this.parseImport(linkElt);
    814       } else {
    815         linkElt.href = linkElt.href;
    816         this.parseGeneric(linkElt);
    817       }
    818     },
    819     parseStyle: function(elt) {
    820       var src = elt;
    821       elt = cloneStyle(elt);
    822       elt.__importElement = src;
    823       this.parseGeneric(elt);
    824     },
    825     parseGeneric: function(elt) {
    826       this.trackElement(elt);
    827       this.addElementToDocument(elt);
    828     },
    829     rootImportForElement: function(elt) {
    830       var n = elt;
    831       while (n.ownerDocument.__importLink) {
    832         n = n.ownerDocument.__importLink;
    833       }
    834       return n;
    835     },
    836     addElementToDocument: function(elt) {
    837       var port = this.rootImportForElement(elt.__importElement || elt);
    838       port.parentNode.insertBefore(elt, port);
    839     },
    840     trackElement: function(elt, callback) {
    841       var self = this;
    842       var done = function(e) {
    843         if (callback) {
    844           callback(e);
    845         }
    846         self.markParsingComplete(elt);
    847         self.parseNext();
    848       };
    849       elt.addEventListener("load", done);
    850       elt.addEventListener("error", done);
    851       if (isIE && elt.localName === "style") {
    852         var fakeLoad = false;
    853         if (elt.textContent.indexOf("@import") == -1) {
    854           fakeLoad = true;
    855         } else if (elt.sheet) {
    856           fakeLoad = true;
    857           var csr = elt.sheet.cssRules;
    858           var len = csr ? csr.length : 0;
    859           for (var i = 0, r; i < len && (r = csr[i]); i++) {
    860             if (r.type === CSSRule.IMPORT_RULE) {
    861               fakeLoad = fakeLoad && Boolean(r.styleSheet);
    862             }
    863           }
    864         }
    865         if (fakeLoad) {
    866           elt.dispatchEvent(new CustomEvent("load", {
    867             bubbles: false
    868           }));
    869         }
    870       }
    871     },
    872     parseScript: function(scriptElt) {
    873       var script = document.createElement("script");
    874       script.__importElement = scriptElt;
    875       script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt);
    876       scope.currentScript = scriptElt;
    877       this.trackElement(script, function(e) {
    878         script.parentNode.removeChild(script);
    879         scope.currentScript = null;
    880       });
    881       this.addElementToDocument(script);
    882     },
    883     nextToParse: function() {
    884       this._mayParse = [];
    885       return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());
    886     },
    887     nextToParseInDoc: function(doc, link) {
    888       if (doc && this._mayParse.indexOf(doc) < 0) {
    889         this._mayParse.push(doc);
    890         var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
    891         for (var i = 0, l = nodes.length, p = 0, n; i < l && (n = nodes[i]); i++) {
    892           if (!this.isParsed(n)) {
    893             if (this.hasResource(n)) {
    894               return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;
    895             } else {
    896               return;
    897             }
    898           }
    899         }
    900       }
    901       return link;
    902     },
    903     nextToParseDynamic: function() {
    904       return this.dynamicElements[0];
    905     },
    906     parseSelectorsForNode: function(node) {
    907       var doc = node.ownerDocument || node;
    908       return doc === rootDocument ? this.documentSelectors : this.importsSelectors;
    909     },
    910     isParsed: function(node) {
    911       return node.__importParsed;
    912     },
    913     needsDynamicParsing: function(elt) {
    914       return this.dynamicElements.indexOf(elt) >= 0;
    915     },
    916     hasResource: function(node) {
    917       if (nodeIsImport(node) && node.import === undefined) {
    918         return false;
    919       }
    920       return true;
    921     }
    922   };
    923   function nodeIsImport(elt) {
    924     return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE;
    925   }
    926   function generateScriptDataUrl(script) {
    927     var scriptContent = generateScriptContent(script);
    928     return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent);
    929   }
    930   function generateScriptContent(script) {
    931     return script.textContent + generateSourceMapHint(script);
    932   }
    933   function generateSourceMapHint(script) {
    934     var owner = script.ownerDocument;
    935     owner.__importedScripts = owner.__importedScripts || 0;
    936     var moniker = script.ownerDocument.baseURI;
    937     var num = owner.__importedScripts ? "-" + owner.__importedScripts : "";
    938     owner.__importedScripts++;
    939     return "\n//# sourceURL=" + moniker + num + ".js\n";
    940   }
    941   function cloneStyle(style) {
    942     var clone = style.ownerDocument.createElement("style");
    943     clone.textContent = style.textContent;
    944     path.resolveUrlsInStyle(clone);
    945     return clone;
    946   }
    947   scope.parser = importParser;
    948   scope.IMPORT_SELECTOR = IMPORT_SELECTOR;
    949 });
    950 
    951 HTMLImports.addModule(function(scope) {
    952   var flags = scope.flags;
    953   var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
    954   var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;
    955   var rootDocument = scope.rootDocument;
    956   var Loader = scope.Loader;
    957   var Observer = scope.Observer;
    958   var parser = scope.parser;
    959   var importer = {
    960     documents: {},
    961     documentPreloadSelectors: IMPORT_SELECTOR,
    962     importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","),
    963     loadNode: function(node) {
    964       importLoader.addNode(node);
    965     },
    966     loadSubtree: function(parent) {
    967       var nodes = this.marshalNodes(parent);
    968       importLoader.addNodes(nodes);
    969     },
    970     marshalNodes: function(parent) {
    971       return parent.querySelectorAll(this.loadSelectorsForNode(parent));
    972     },
    973     loadSelectorsForNode: function(node) {
    974       var doc = node.ownerDocument || node;
    975       return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;
    976     },
    977     loaded: function(url, elt, resource, err, redirectedUrl) {
    978       flags.load && console.log("loaded", url, elt);
    979       elt.__resource = resource;
    980       elt.__error = err;
    981       if (isImportLink(elt)) {
    982         var doc = this.documents[url];
    983         if (doc === undefined) {
    984           doc = err ? null : makeDocument(resource, redirectedUrl || url);
    985           if (doc) {
    986             doc.__importLink = elt;
    987             this.bootDocument(doc);
    988           }
    989           this.documents[url] = doc;
    990         }
    991         elt.import = doc;
    992       }
    993       parser.parseNext();
    994     },
    995     bootDocument: function(doc) {
    996       this.loadSubtree(doc);
    997       this.observer.observe(doc);
    998       parser.parseNext();
    999     },
   1000     loadedAll: function() {
   1001       parser.parseNext();
   1002     }
   1003   };
   1004   var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));
   1005   importer.observer = new Observer();
   1006   function isImportLink(elt) {
   1007     return isLinkRel(elt, IMPORT_LINK_TYPE);
   1008   }
   1009   function isLinkRel(elt, rel) {
   1010     return elt.localName === "link" && elt.getAttribute("rel") === rel;
   1011   }
   1012   function hasBaseURIAccessor(doc) {
   1013     return !!Object.getOwnPropertyDescriptor(doc, "baseURI");
   1014   }
   1015   function makeDocument(resource, url) {
   1016     var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
   1017     doc._URL = url;
   1018     var base = doc.createElement("base");
   1019     base.setAttribute("href", url);
   1020     if (!doc.baseURI && !hasBaseURIAccessor(doc)) {
   1021       Object.defineProperty(doc, "baseURI", {
   1022         value: url
   1023       });
   1024     }
   1025     var meta = doc.createElement("meta");
   1026     meta.setAttribute("charset", "utf-8");
   1027     doc.head.appendChild(meta);
   1028     doc.head.appendChild(base);
   1029     doc.body.innerHTML = resource;
   1030     if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
   1031       HTMLTemplateElement.bootstrap(doc);
   1032     }
   1033     return doc;
   1034   }
   1035   if (!document.baseURI) {
   1036     var baseURIDescriptor = {
   1037       get: function() {
   1038         var base = document.querySelector("base");
   1039         return base ? base.href : window.location.href;
   1040       },
   1041       configurable: true
   1042     };
   1043     Object.defineProperty(document, "baseURI", baseURIDescriptor);
   1044     Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor);
   1045   }
   1046   scope.importer = importer;
   1047   scope.importLoader = importLoader;
   1048 });
   1049 
   1050 HTMLImports.addModule(function(scope) {
   1051   var parser = scope.parser;
   1052   var importer = scope.importer;
   1053   var dynamic = {
   1054     added: function(nodes) {
   1055       var owner, parsed, loading;
   1056       for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
   1057         if (!owner) {
   1058           owner = n.ownerDocument;
   1059           parsed = parser.isParsed(owner);
   1060         }
   1061         loading = this.shouldLoadNode(n);
   1062         if (loading) {
   1063           importer.loadNode(n);
   1064         }
   1065         if (this.shouldParseNode(n) && parsed) {
   1066           parser.parseDynamic(n, loading);
   1067         }
   1068       }
   1069     },
   1070     shouldLoadNode: function(node) {
   1071       return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));
   1072     },
   1073     shouldParseNode: function(node) {
   1074       return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));
   1075     }
   1076   };
   1077   importer.observer.addCallback = dynamic.added.bind(dynamic);
   1078   var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;
   1079 });
   1080 
   1081 (function(scope) {
   1082   var initializeModules = scope.initializeModules;
   1083   var isIE = scope.isIE;
   1084   if (scope.useNative) {
   1085     return;
   1086   }
   1087   if (isIE && typeof window.CustomEvent !== "function") {
   1088     window.CustomEvent = function(inType, params) {
   1089       params = params || {};
   1090       var e = document.createEvent("CustomEvent");
   1091       e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
   1092       return e;
   1093     };
   1094     window.CustomEvent.prototype = window.Event.prototype;
   1095   }
   1096   initializeModules();
   1097   var rootDocument = scope.rootDocument;
   1098   function bootstrap() {
   1099     HTMLImports.importer.bootDocument(rootDocument);
   1100   }
   1101   if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) {
   1102     bootstrap();
   1103   } else {
   1104     document.addEventListener("DOMContentLoaded", bootstrap);
   1105   }
   1106 })(HTMLImports);
   1107 
   1108 window.CustomElements = window.CustomElements || {
   1109   flags: {}
   1110 };
   1111 
   1112 (function(scope) {
   1113   var flags = scope.flags;
   1114   var modules = [];
   1115   var addModule = function(module) {
   1116     modules.push(module);
   1117   };
   1118   var initializeModules = function() {
   1119     modules.forEach(function(module) {
   1120       module(scope);
   1121     });
   1122   };
   1123   scope.addModule = addModule;
   1124   scope.initializeModules = initializeModules;
   1125   scope.hasNative = Boolean(document.registerElement);
   1126   scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);
   1127 })(CustomElements);
   1128 
   1129 CustomElements.addModule(function(scope) {
   1130   var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : "none";
   1131   function forSubtree(node, cb) {
   1132     findAllElements(node, function(e) {
   1133       if (cb(e)) {
   1134         return true;
   1135       }
   1136       forRoots(e, cb);
   1137     });
   1138     forRoots(node, cb);
   1139   }
   1140   function findAllElements(node, find, data) {
   1141     var e = node.firstElementChild;
   1142     if (!e) {
   1143       e = node.firstChild;
   1144       while (e && e.nodeType !== Node.ELEMENT_NODE) {
   1145         e = e.nextSibling;
   1146       }
   1147     }
   1148     while (e) {
   1149       if (find(e, data) !== true) {
   1150         findAllElements(e, find, data);
   1151       }
   1152       e = e.nextElementSibling;
   1153     }
   1154     return null;
   1155   }
   1156   function forRoots(node, cb) {
   1157     var root = node.shadowRoot;
   1158     while (root) {
   1159       forSubtree(root, cb);
   1160       root = root.olderShadowRoot;
   1161     }
   1162   }
   1163   var processingDocuments;
   1164   function forDocumentTree(doc, cb) {
   1165     processingDocuments = [];
   1166     _forDocumentTree(doc, cb);
   1167     processingDocuments = null;
   1168   }
   1169   function _forDocumentTree(doc, cb) {
   1170     doc = wrap(doc);
   1171     if (processingDocuments.indexOf(doc) >= 0) {
   1172       return;
   1173     }
   1174     processingDocuments.push(doc);
   1175     var imports = doc.querySelectorAll("link[rel=" + IMPORT_LINK_TYPE + "]");
   1176     for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {
   1177       if (n.import) {
   1178         _forDocumentTree(n.import, cb);
   1179       }
   1180     }
   1181     cb(doc);
   1182   }
   1183   scope.forDocumentTree = forDocumentTree;
   1184   scope.forSubtree = forSubtree;
   1185 });
   1186 
   1187 CustomElements.addModule(function(scope) {
   1188   var flags = scope.flags;
   1189   var forSubtree = scope.forSubtree;
   1190   var forDocumentTree = scope.forDocumentTree;
   1191   function addedNode(node) {
   1192     return added(node) || addedSubtree(node);
   1193   }
   1194   function added(node) {
   1195     if (scope.upgrade(node)) {
   1196       return true;
   1197     }
   1198     attached(node);
   1199   }
   1200   function addedSubtree(node) {
   1201     forSubtree(node, function(e) {
   1202       if (added(e)) {
   1203         return true;
   1204       }
   1205     });
   1206   }
   1207   function attachedNode(node) {
   1208     attached(node);
   1209     if (inDocument(node)) {
   1210       forSubtree(node, function(e) {
   1211         attached(e);
   1212       });
   1213     }
   1214   }
   1215   var hasPolyfillMutations = !window.MutationObserver || window.MutationObserver === window.JsMutationObserver;
   1216   scope.hasPolyfillMutations = hasPolyfillMutations;
   1217   var isPendingMutations = false;
   1218   var pendingMutations = [];
   1219   function deferMutation(fn) {
   1220     pendingMutations.push(fn);
   1221     if (!isPendingMutations) {
   1222       isPendingMutations = true;
   1223       setTimeout(takeMutations);
   1224     }
   1225   }
   1226   function takeMutations() {
   1227     isPendingMutations = false;
   1228     var $p = pendingMutations;
   1229     for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
   1230       p();
   1231     }
   1232     pendingMutations = [];
   1233   }
   1234   function attached(element) {
   1235     if (hasPolyfillMutations) {
   1236       deferMutation(function() {
   1237         _attached(element);
   1238       });
   1239     } else {
   1240       _attached(element);
   1241     }
   1242   }
   1243   function _attached(element) {
   1244     if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {
   1245       if (!element.__attached && inDocument(element)) {
   1246         element.__attached = true;
   1247         if (element.attachedCallback) {
   1248           element.attachedCallback();
   1249         }
   1250       }
   1251     }
   1252   }
   1253   function detachedNode(node) {
   1254     detached(node);
   1255     forSubtree(node, function(e) {
   1256       detached(e);
   1257     });
   1258   }
   1259   function detached(element) {
   1260     if (hasPolyfillMutations) {
   1261       deferMutation(function() {
   1262         _detached(element);
   1263       });
   1264     } else {
   1265       _detached(element);
   1266     }
   1267   }
   1268   function _detached(element) {
   1269     if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {
   1270       if (element.__attached && !inDocument(element)) {
   1271         element.__attached = false;
   1272         if (element.detachedCallback) {
   1273           element.detachedCallback();
   1274         }
   1275       }
   1276     }
   1277   }
   1278   function inDocument(element) {
   1279     var p = element;
   1280     var doc = wrap(document);
   1281     while (p) {
   1282       if (p == doc) {
   1283         return true;
   1284       }
   1285       p = p.parentNode || p.host;
   1286     }
   1287   }
   1288   function watchShadow(node) {
   1289     if (node.shadowRoot && !node.shadowRoot.__watched) {
   1290       flags.dom && console.log("watching shadow-root for: ", node.localName);
   1291       var root = node.shadowRoot;
   1292       while (root) {
   1293         observe(root);
   1294         root = root.olderShadowRoot;
   1295       }
   1296     }
   1297   }
   1298   function handler(mutations) {
   1299     if (flags.dom) {
   1300       var mx = mutations[0];
   1301       if (mx && mx.type === "childList" && mx.addedNodes) {
   1302         if (mx.addedNodes) {
   1303           var d = mx.addedNodes[0];
   1304           while (d && d !== document && !d.host) {
   1305             d = d.parentNode;
   1306           }
   1307           var u = d && (d.URL || d._URL || d.host && d.host.localName) || "";
   1308           u = u.split("/?").shift().split("/").pop();
   1309         }
   1310       }
   1311       console.group("mutations (%d) [%s]", mutations.length, u || "");
   1312     }
   1313     mutations.forEach(function(mx) {
   1314       if (mx.type === "childList") {
   1315         forEach(mx.addedNodes, function(n) {
   1316           if (!n.localName) {
   1317             return;
   1318           }
   1319           addedNode(n);
   1320         });
   1321         forEach(mx.removedNodes, function(n) {
   1322           if (!n.localName) {
   1323             return;
   1324           }
   1325           detachedNode(n);
   1326         });
   1327       }
   1328     });
   1329     flags.dom && console.groupEnd();
   1330   }
   1331   function takeRecords(node) {
   1332     node = wrap(node);
   1333     if (!node) {
   1334       node = wrap(document);
   1335     }
   1336     while (node.parentNode) {
   1337       node = node.parentNode;
   1338     }
   1339     var observer = node.__observer;
   1340     if (observer) {
   1341       handler(observer.takeRecords());
   1342       takeMutations();
   1343     }
   1344   }
   1345   var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
   1346   function observe(inRoot) {
   1347     if (inRoot.__observer) {
   1348       return;
   1349     }
   1350     var observer = new MutationObserver(handler);
   1351     observer.observe(inRoot, {
   1352       childList: true,
   1353       subtree: true
   1354     });
   1355     inRoot.__observer = observer;
   1356   }
   1357   function upgradeDocument(doc) {
   1358     doc = wrap(doc);
   1359     flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop());
   1360     addedNode(doc);
   1361     observe(doc);
   1362     flags.dom && console.groupEnd();
   1363   }
   1364   function upgradeDocumentTree(doc) {
   1365     forDocumentTree(doc, upgradeDocument);
   1366   }
   1367   var originalCreateShadowRoot = Element.prototype.createShadowRoot;
   1368   if (originalCreateShadowRoot) {
   1369     Element.prototype.createShadowRoot = function() {
   1370       var root = originalCreateShadowRoot.call(this);
   1371       CustomElements.watchShadow(this);
   1372       return root;
   1373     };
   1374   }
   1375   scope.watchShadow = watchShadow;
   1376   scope.upgradeDocumentTree = upgradeDocumentTree;
   1377   scope.upgradeSubtree = addedSubtree;
   1378   scope.upgradeAll = addedNode;
   1379   scope.attachedNode = attachedNode;
   1380   scope.takeRecords = takeRecords;
   1381 });
   1382 
   1383 CustomElements.addModule(function(scope) {
   1384   var flags = scope.flags;
   1385   function upgrade(node) {
   1386     if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {
   1387       var is = node.getAttribute("is");
   1388       var definition = scope.getRegisteredDefinition(is || node.localName);
   1389       if (definition) {
   1390         if (is && definition.tag == node.localName) {
   1391           return upgradeWithDefinition(node, definition);
   1392         } else if (!is && !definition.extends) {
   1393           return upgradeWithDefinition(node, definition);
   1394         }
   1395       }
   1396     }
   1397   }
   1398   function upgradeWithDefinition(element, definition) {
   1399     flags.upgrade && console.group("upgrade:", element.localName);
   1400     if (definition.is) {
   1401       element.setAttribute("is", definition.is);
   1402     }
   1403     implementPrototype(element, definition);
   1404     element.__upgraded__ = true;
   1405     created(element);
   1406     scope.attachedNode(element);
   1407     scope.upgradeSubtree(element);
   1408     flags.upgrade && console.groupEnd();
   1409     return element;
   1410   }
   1411   function implementPrototype(element, definition) {
   1412     if (Object.__proto__) {
   1413       element.__proto__ = definition.prototype;
   1414     } else {
   1415       customMixin(element, definition.prototype, definition.native);
   1416       element.__proto__ = definition.prototype;
   1417     }
   1418   }
   1419   function customMixin(inTarget, inSrc, inNative) {
   1420     var used = {};
   1421     var p = inSrc;
   1422     while (p !== inNative && p !== HTMLElement.prototype) {
   1423       var keys = Object.getOwnPropertyNames(p);
   1424       for (var i = 0, k; k = keys[i]; i++) {
   1425         if (!used[k]) {
   1426           Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k));
   1427           used[k] = 1;
   1428         }
   1429       }
   1430       p = Object.getPrototypeOf(p);
   1431     }
   1432   }
   1433   function created(element) {
   1434     if (element.createdCallback) {
   1435       element.createdCallback();
   1436     }
   1437   }
   1438   scope.upgrade = upgrade;
   1439   scope.upgradeWithDefinition = upgradeWithDefinition;
   1440   scope.implementPrototype = implementPrototype;
   1441 });
   1442 
   1443 CustomElements.addModule(function(scope) {
   1444   var upgradeDocumentTree = scope.upgradeDocumentTree;
   1445   var upgrade = scope.upgrade;
   1446   var upgradeWithDefinition = scope.upgradeWithDefinition;
   1447   var implementPrototype = scope.implementPrototype;
   1448   var useNative = scope.useNative;
   1449   function register(name, options) {
   1450     var definition = options || {};
   1451     if (!name) {
   1452       throw new Error("document.registerElement: first argument `name` must not be empty");
   1453     }
   1454     if (name.indexOf("-") < 0) {
   1455       throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'.");
   1456     }
   1457     if (isReservedTag(name)) {
   1458       throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid.");
   1459     }
   1460     if (getRegisteredDefinition(name)) {
   1461       throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered");
   1462     }
   1463     if (!definition.prototype) {
   1464       definition.prototype = Object.create(HTMLElement.prototype);
   1465     }
   1466     definition.__name = name.toLowerCase();
   1467     definition.lifecycle = definition.lifecycle || {};
   1468     definition.ancestry = ancestry(definition.extends);
   1469     resolveTagName(definition);
   1470     resolvePrototypeChain(definition);
   1471     overrideAttributeApi(definition.prototype);
   1472     registerDefinition(definition.__name, definition);
   1473     definition.ctor = generateConstructor(definition);
   1474     definition.ctor.prototype = definition.prototype;
   1475     definition.prototype.constructor = definition.ctor;
   1476     if (scope.ready) {
   1477       upgradeDocumentTree(document);
   1478     }
   1479     return definition.ctor;
   1480   }
   1481   function overrideAttributeApi(prototype) {
   1482     if (prototype.setAttribute._polyfilled) {
   1483       return;
   1484     }
   1485     var setAttribute = prototype.setAttribute;
   1486     prototype.setAttribute = function(name, value) {
   1487       changeAttribute.call(this, name, value, setAttribute);
   1488     };
   1489     var removeAttribute = prototype.removeAttribute;
   1490     prototype.removeAttribute = function(name) {
   1491       changeAttribute.call(this, name, null, removeAttribute);
   1492     };
   1493     prototype.setAttribute._polyfilled = true;
   1494   }
   1495   function changeAttribute(name, value, operation) {
   1496     name = name.toLowerCase();
   1497     var oldValue = this.getAttribute(name);
   1498     operation.apply(this, arguments);
   1499     var newValue = this.getAttribute(name);
   1500     if (this.attributeChangedCallback && newValue !== oldValue) {
   1501       this.attributeChangedCallback(name, oldValue, newValue);
   1502     }
   1503   }
   1504   function isReservedTag(name) {
   1505     for (var i = 0; i < reservedTagList.length; i++) {
   1506       if (name === reservedTagList[i]) {
   1507         return true;
   1508       }
   1509     }
   1510   }
   1511   var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ];
   1512   function ancestry(extnds) {
   1513     var extendee = getRegisteredDefinition(extnds);
   1514     if (extendee) {
   1515       return ancestry(extendee.extends).concat([ extendee ]);
   1516     }
   1517     return [];
   1518   }
   1519   function resolveTagName(definition) {
   1520     var baseTag = definition.extends;
   1521     for (var i = 0, a; a = definition.ancestry[i]; i++) {
   1522       baseTag = a.is && a.tag;
   1523     }
   1524     definition.tag = baseTag || definition.__name;
   1525     if (baseTag) {
   1526       definition.is = definition.__name;
   1527     }
   1528   }
   1529   function resolvePrototypeChain(definition) {
   1530     if (!Object.__proto__) {
   1531       var nativePrototype = HTMLElement.prototype;
   1532       if (definition.is) {
   1533         var inst = document.createElement(definition.tag);
   1534         var expectedPrototype = Object.getPrototypeOf(inst);
   1535         if (expectedPrototype === definition.prototype) {
   1536           nativePrototype = expectedPrototype;
   1537         }
   1538       }
   1539       var proto = definition.prototype, ancestor;
   1540       while (proto && proto !== nativePrototype) {
   1541         ancestor = Object.getPrototypeOf(proto);
   1542         proto.__proto__ = ancestor;
   1543         proto = ancestor;
   1544       }
   1545       definition.native = nativePrototype;
   1546     }
   1547   }
   1548   function instantiate(definition) {
   1549     return upgradeWithDefinition(domCreateElement(definition.tag), definition);
   1550   }
   1551   var registry = {};
   1552   function getRegisteredDefinition(name) {
   1553     if (name) {
   1554       return registry[name.toLowerCase()];
   1555     }
   1556   }
   1557   function registerDefinition(name, definition) {
   1558     registry[name] = definition;
   1559   }
   1560   function generateConstructor(definition) {
   1561     return function() {
   1562       return instantiate(definition);
   1563     };
   1564   }
   1565   var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
   1566   function createElementNS(namespace, tag, typeExtension) {
   1567     if (namespace === HTML_NAMESPACE) {
   1568       return createElement(tag, typeExtension);
   1569     } else {
   1570       return domCreateElementNS(namespace, tag);
   1571     }
   1572   }
   1573   function createElement(tag, typeExtension) {
   1574     var definition = getRegisteredDefinition(typeExtension || tag);
   1575     if (definition) {
   1576       if (tag == definition.tag && typeExtension == definition.is) {
   1577         return new definition.ctor();
   1578       }
   1579       if (!typeExtension && !definition.is) {
   1580         return new definition.ctor();
   1581       }
   1582     }
   1583     var element;
   1584     if (typeExtension) {
   1585       element = createElement(tag);
   1586       element.setAttribute("is", typeExtension);
   1587       return element;
   1588     }
   1589     element = domCreateElement(tag);
   1590     if (tag.indexOf("-") >= 0) {
   1591       implementPrototype(element, HTMLElement);
   1592     }
   1593     return element;
   1594   }
   1595   function cloneNode(deep) {
   1596     var n = domCloneNode.call(this, deep);
   1597     upgrade(n);
   1598     return n;
   1599   }
   1600   var domCreateElement = document.createElement.bind(document);
   1601   var domCreateElementNS = document.createElementNS.bind(document);
   1602   var domCloneNode = Node.prototype.cloneNode;
   1603   var isInstance;
   1604   if (!Object.__proto__ && !useNative) {
   1605     isInstance = function(obj, ctor) {
   1606       var p = obj;
   1607       while (p) {
   1608         if (p === ctor.prototype) {
   1609           return true;
   1610         }
   1611         p = p.__proto__;
   1612       }
   1613       return false;
   1614     };
   1615   } else {
   1616     isInstance = function(obj, base) {
   1617       return obj instanceof base;
   1618     };
   1619   }
   1620   document.registerElement = register;
   1621   document.createElement = createElement;
   1622   document.createElementNS = createElementNS;
   1623   Node.prototype.cloneNode = cloneNode;
   1624   scope.registry = registry;
   1625   scope.instanceof = isInstance;
   1626   scope.reservedTagList = reservedTagList;
   1627   scope.getRegisteredDefinition = getRegisteredDefinition;
   1628   document.register = document.registerElement;
   1629 });
   1630 
   1631 (function(scope) {
   1632   var useNative = scope.useNative;
   1633   var initializeModules = scope.initializeModules;
   1634   var isIE11OrOlder = /Trident/.test(navigator.userAgent);
   1635   if (useNative) {
   1636     var nop = function() {};
   1637     scope.watchShadow = nop;
   1638     scope.upgrade = nop;
   1639     scope.upgradeAll = nop;
   1640     scope.upgradeDocumentTree = nop;
   1641     scope.upgradeSubtree = nop;
   1642     scope.takeRecords = nop;
   1643     scope.instanceof = function(obj, base) {
   1644       return obj instanceof base;
   1645     };
   1646   } else {
   1647     initializeModules();
   1648   }
   1649   var upgradeDocumentTree = scope.upgradeDocumentTree;
   1650   if (!window.wrap) {
   1651     if (window.ShadowDOMPolyfill) {
   1652       window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
   1653       window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;
   1654     } else {
   1655       window.wrap = window.unwrap = function(node) {
   1656         return node;
   1657       };
   1658     }
   1659   }
   1660   function bootstrap() {
   1661     upgradeDocumentTree(wrap(document));
   1662     if (window.HTMLImports) {
   1663       HTMLImports.__importsParsingHook = function(elt) {
   1664         upgradeDocumentTree(wrap(elt.import));
   1665       };
   1666     }
   1667     CustomElements.ready = true;
   1668     setTimeout(function() {
   1669       CustomElements.readyTime = Date.now();
   1670       if (window.HTMLImports) {
   1671         CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;
   1672       }
   1673       document.dispatchEvent(new CustomEvent("WebComponentsReady", {
   1674         bubbles: true
   1675       }));
   1676     });
   1677   }
   1678   if (isIE11OrOlder && typeof window.CustomEvent !== "function") {
   1679     window.CustomEvent = function(inType, params) {
   1680       params = params || {};
   1681       var e = document.createEvent("CustomEvent");
   1682       e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
   1683       return e;
   1684     };
   1685     window.CustomEvent.prototype = window.Event.prototype;
   1686   }
   1687   if (document.readyState === "complete" || scope.flags.eager) {
   1688     bootstrap();
   1689   } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {
   1690     bootstrap();
   1691   } else {
   1692     var loadEvent = window.HTMLImports && !HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded";
   1693     window.addEventListener(loadEvent, bootstrap);
   1694   }
   1695 })(window.CustomElements);
   1696 
   1697 if (typeof HTMLTemplateElement === "undefined") {
   1698   (function() {
   1699     var TEMPLATE_TAG = "template";
   1700     HTMLTemplateElement = function() {};
   1701     HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
   1702     HTMLTemplateElement.decorate = function(template) {
   1703       if (!template.content) {
   1704         template.content = template.ownerDocument.createDocumentFragment();
   1705         var child;
   1706         while (child = template.firstChild) {
   1707           template.content.appendChild(child);
   1708         }
   1709       }
   1710     };
   1711     HTMLTemplateElement.bootstrap = function(doc) {
   1712       var templates = doc.querySelectorAll(TEMPLATE_TAG);
   1713       for (var i = 0, l = templates.length, t; i < l && (t = templates[i]); i++) {
   1714         HTMLTemplateElement.decorate(t);
   1715       }
   1716     };
   1717     addEventListener("DOMContentLoaded", function() {
   1718       HTMLTemplateElement.bootstrap(document);
   1719     });
   1720   })();
   1721 }
   1722 
   1723 (function(scope) {
   1724   var style = document.createElement("style");
   1725   style.textContent = "" + "body {" + "transition: opacity ease-in 0.2s;" + " } \n" + "body[unresolved] {" + "opacity: 0; display: block; overflow: hidden; position: relative;" + " } \n";
   1726   var head = document.querySelector("head");
   1727   head.insertBefore(style, head.firstChild);
   1728 })(window.WebComponents);