Version 1.6.0-dev.2.0

svn merge -r 37934:38082 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@38083 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index e8dcfbb..9cbebf7 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -5610,7 +5610,7 @@
 
 % ensure that Object  and dynamic may be assign dot a function type
 A function is always an instance of some class that implements the class \code{Function} and implements a \CALL{} method with the same signature as the function. All function types are subtypes of \code{Function}.
-If a type $I$ includes an instance method named \CALL{}, and the type of \CALL{} is the function type $F$, then $I$ is considered to be a subtype of $F$.  It is a static warning if a concrete class implements \cd{Function} and does not have a concrete method named \CALL{} unless that class declares its own implementation of \cd{noSuchMethod()}.
+If a type $I$ includes an instance method named \CALL{}, and the type of \CALL{} is the function type $F$, then $I$ is considered to be more specific than $F$.  It is a static warning if a concrete class implements \cd{Function} and does not have a concrete method named \CALL{} unless that class declares its own implementation of \cd{noSuchMethod()}.
 
 
 
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index d608c6a..ad93085 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 import 'dart:collection';
 
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analysis_server/src/analysis_logger.dart';
 import 'package:analysis_server/src/channel.dart';
 import 'package:analysis_server/src/constants.dart';
@@ -18,7 +19,6 @@
 import 'package:analysis_server/src/package_map_provider.dart';
 import 'package:analysis_server/src/package_uri_resolver.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
@@ -27,7 +27,7 @@
 import 'package:analyzer/src/generated/sdk_io.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analyzer/src/generated/index.dart';
+import 'package:analysis_services/index/index.dart';
 
 
 /**
@@ -226,7 +226,7 @@
         new HashMap<AnalysisContext, List<Source>>();
     List<String> unanalyzed = new List<String>();
     files.forEach((file) {
-      AnalysisContext analysisContext = _getAnalysisContext(file);
+      AnalysisContext analysisContext = getAnalysisContext(file);
       if (analysisContext == null) {
         unanalyzed.add(file);
       } else {
@@ -235,7 +235,7 @@
           sourceList = <Source>[];
           sourceMap[analysisContext] = sourceList;
         }
-        sourceList.add(_getSource(file));
+        sourceList.add(getSource(file));
       }
     });
     if (unanalyzed.isNotEmpty) {
@@ -434,13 +434,13 @@
    */
   void updateContent(Map<String, ContentChange> changes) {
     changes.forEach((file, change) {
-      AnalysisContext analysisContext = _getAnalysisContext(file);
+      AnalysisContext analysisContext = getAnalysisContext(file);
       // TODO(paulberry): handle the case where a file is referred to by more
       // than one context (e.g package A depends on package B using a local
       // path, user has both packages open for editing in separate contexts,
       // and user modifies a file in package B).
       if (analysisContext != null) {
-        Source source = _getSource(file);
+        Source source = getSource(file);
         if (change.offset == null) {
           analysisContext.setContents(source, change.content);
         } else {
@@ -461,8 +461,8 @@
       Set<String> oldFiles = analysisServices[service];
       Set<String> todoFiles = oldFiles != null ? newFiles.difference(oldFiles) : newFiles;
       for (String file in todoFiles) {
-        Source source = _getSource(file);
-        AnalysisContext context = _getAnalysisContext(file);
+        Source source = getSource(file);
+        AnalysisContext context = getAnalysisContext(file);
         // errors
         if (service == AnalysisService.ERRORS) {
           LineInfo lineInfo = context.getLineInfo(source);
@@ -481,9 +481,15 @@
                 // TODO(scheglov) consider support for one unit in 2+ libraries
                 sendAnalysisNotificationNavigation(this, file, dartUnit);
                 break;
+              case AnalysisService.OCCURRENCES:
+                sendAnalysisNotificationOccurrences(this, file, dartUnit);
+                break;
               case AnalysisService.OUTLINE:
                 sendAnalysisNotificationOutline(this, context, source, dartUnit);
                 break;
+              case AnalysisService.OVERRIDES:
+                sendAnalysisNotificationOverrides(this, file, dartUnit);
+                break;
             }
           }
         }
@@ -497,7 +503,7 @@
    * Return the [AnalysisContext] that is used to analyze the given [path].
    * Return `null` if there is no such context.
    */
-  AnalysisContext _getAnalysisContext(String path) {
+  AnalysisContext getAnalysisContext(String path) {
     for (Folder folder in folderMap.keys) {
       if (path.startsWith(folder.path)) {
         return folderMap[folder];
@@ -509,7 +515,7 @@
   /**
    * Return the [Source] of the Dart file with the given [path].
    */
-  Source _getSource(String path) {
+  Source getSource(String path) {
     File file = contextDirectoryManager.resourceProvider.getResource(path);
     return file.createSource(UriKind.FILE_URI);
   }
@@ -522,12 +528,12 @@
    */
   CompilationUnit getResolvedCompilationUnitToResendNotification(String path) {
     // prepare AnalysisContext
-    AnalysisContext context = _getAnalysisContext(path);
+    AnalysisContext context = getAnalysisContext(path);
     if (context == null) {
       return null;
     }
     // prepare sources
-    Source unitSource = _getSource(path);
+    Source unitSource = getSource(path);
     List<Source> librarySources = context.getLibrariesContaining(unitSource);
     if (librarySources.isEmpty) {
       return null;
@@ -547,12 +553,12 @@
    */
   CompilationUnit test_getResolvedCompilationUnit(String path) {
     // prepare AnalysisContext
-    AnalysisContext context = _getAnalysisContext(path);
+    AnalysisContext context = getAnalysisContext(path);
     if (context == null) {
       return null;
     }
     // prepare sources
-    Source unitSource = _getSource(path);
+    Source unitSource = getSource(path);
     List<Source> librarySources = context.getLibrariesContaining(unitSource);
     if (librarySources.isEmpty) {
       return null;
@@ -581,13 +587,15 @@
  * An enumeration of the services provided by the analysis domain.
  */
 class AnalysisService extends Enum2<AnalysisService> {
-  static const AnalysisService ERRORS = const AnalysisService('ERRORS', 0);
-  static const AnalysisService HIGHLIGHTS = const AnalysisService('HIGHLIGHTS', 1);
-  static const AnalysisService NAVIGATION = const AnalysisService('NAVIGATION', 2);
-  static const AnalysisService OUTLINE = const AnalysisService('OUTLINE', 3);
+  static const ERRORS = const AnalysisService('ERRORS', 0);
+  static const HIGHLIGHTS = const AnalysisService('HIGHLIGHTS', 1);
+  static const NAVIGATION = const AnalysisService('NAVIGATION', 2);
+  static const OCCURRENCES = const AnalysisService('OCCURRENCES', 3);
+  static const OUTLINE = const AnalysisService('OUTLINE', 4);
+  static const OVERRIDES = const AnalysisService('OVERRIDES', 5);
 
   static const List<AnalysisService> VALUES =
-      const [ERRORS, HIGHLIGHTS, NAVIGATION, OUTLINE];
+      const [ERRORS, HIGHLIGHTS, NAVIGATION, OCCURRENCES, OUTLINE, OVERRIDES];
 
   const AnalysisService(String name, int ordinal) : super(name, ordinal);
 }
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 483ce20..2c11d1d 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -4,8 +4,6 @@
 
 library computer.highlights;
 
-import 'dart:collection';
-
 import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
@@ -18,7 +16,7 @@
 class DartUnitHighlightsComputer {
   final CompilationUnit _unit;
 
-  final List<Map<String, Object>> _regions = <HashMap<String, Object>>[];
+  final List<HighlightRegion> _regions = <HighlightRegion>[];
 
   DartUnitHighlightsComputer(this._unit);
 
@@ -27,7 +25,33 @@
    */
   List<Map<String, Object>> compute() {
     _unit.accept(new _DartUnitHighlightsComputerVisitor(this));
-    return _regions;
+    _addCommentRanges();
+    return _regions.map((region) => region.toJson()).toList();
+  }
+
+  void _addCommentRanges() {
+    Token token = _unit.beginToken;
+    while (token != null && token.type != TokenType.EOF) {
+      Token commentToken = token.precedingComments;
+      while (commentToken != null) {
+        HighlightType highlightType = null;
+        if (commentToken.type == TokenType.MULTI_LINE_COMMENT) {
+          if (commentToken.lexeme.startsWith('/**')) {
+            highlightType = HighlightType.COMMENT_DOCUMENTATION;
+          } else {
+            highlightType = HighlightType.COMMENT_BLOCK;
+          }
+        }
+        if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) {
+          highlightType = HighlightType.COMMENT_END_OF_LINE;
+        }
+        if (highlightType != null) {
+          _addRegion_token(commentToken, highlightType);
+        }
+        commentToken = commentToken.next;
+      }
+      token = token.next;
+    }
   }
 
   void _addIdentifierRegion(SimpleIdentifier node) {
@@ -81,7 +105,8 @@
     if (arguments == null) {
       _addRegion_node(node, HighlightType.ANNOTATION);
     } else {
-      _addRegion_nodeStart_tokenEnd(node, arguments.beginToken, HighlightType.ANNOTATION);
+      _addRegion_nodeStart_tokenEnd(node, arguments.beginToken,
+          HighlightType.ANNOTATION);
       _addRegion_token(arguments.endToken, HighlightType.ANNOTATION);
     }
   }
@@ -177,7 +202,8 @@
       return false;
     }
     // getter or setter
-    PropertyAccessorElement propertyAccessorElement = element as PropertyAccessorElement;
+    PropertyAccessorElement propertyAccessorElement = element as
+        PropertyAccessorElement;
     if (propertyAccessorElement.isGetter) {
       return _addRegion_node(node, HighlightType.GETTER_DECLARATION);
     } else {
@@ -266,7 +292,7 @@
   }
 
   void _addRegion(int offset, int length, HighlightType type) {
-    _regions.add({OFFSET: offset, LENGTH: length, TYPE: type.name});
+    _regions.add(new HighlightRegion(offset, length, type));
   }
 
   bool _addRegion_node(AstNode node, HighlightType type) {
@@ -298,6 +324,142 @@
 }
 
 
+class HighlightRegion {
+  final int offset;
+  final int length;
+  final HighlightType type;
+
+  HighlightRegion(this.offset, this.length, this.type);
+
+  factory HighlightRegion.fromJson(Map<String, Object> map) {
+    HighlightType type = HighlightType.valueOf(map[TYPE]);
+    return new HighlightRegion(map[OFFSET], map[LENGTH], type);
+  }
+
+  Map<String, Object> toJson() {
+    Map<String, Object> json = <String, Object>{};
+    json[OFFSET] = offset;
+    json[LENGTH] = length;
+    json[TYPE] = type.name;
+    return json;
+  }
+
+  @override
+  String toString() => toJson().toString();
+}
+
+
+/**
+ * Highlighting kinds constants.
+ */
+class HighlightType {
+  static const HighlightType ANNOTATION = const HighlightType('ANNOTATION');
+  static const HighlightType BUILT_IN = const HighlightType('BUILT_IN');
+  static const HighlightType CLASS = const HighlightType('CLASS');
+  static const HighlightType COMMENT_BLOCK = const HighlightType(
+      'COMMENT_BLOCK');
+  static const HighlightType COMMENT_DOCUMENTATION = const HighlightType(
+      'COMMENT_DOCUMENTATION');
+  static const HighlightType COMMENT_END_OF_LINE = const HighlightType(
+      'COMMENT_END_OF_LINE');
+  static const HighlightType CONSTRUCTOR = const HighlightType('CONSTRUCTOR');
+  static const HighlightType DIRECTIVE = const HighlightType('DIRECTIVE');
+  static const HighlightType DYNAMIC_TYPE = const HighlightType('DYNAMIC_TYPE');
+  static const HighlightType FIELD = const HighlightType('FIELD');
+  static const HighlightType FIELD_STATIC = const HighlightType('FIELD_STATIC');
+  static const HighlightType FUNCTION_DECLARATION = const HighlightType(
+      'FUNCTION_DECLARATION');
+  static const HighlightType FUNCTION = const HighlightType('FUNCTION');
+  static const HighlightType FUNCTION_TYPE_ALIAS = const HighlightType(
+      'FUNCTION_TYPE_ALIAS');
+  static const HighlightType GETTER_DECLARATION = const HighlightType(
+      'GETTER_DECLARATION');
+  static const HighlightType KEYWORD = const HighlightType('KEYWORD');
+  static const HighlightType IDENTIFIER_DEFAULT = const HighlightType(
+      'IDENTIFIER_DEFAULT');
+  static const HighlightType IMPORT_PREFIX = const HighlightType(
+      'IMPORT_PREFIX');
+  static const HighlightType LITERAL_BOOLEAN = const HighlightType(
+      'LITERAL_BOOLEAN');
+  static const HighlightType LITERAL_DOUBLE = const HighlightType(
+      'LITERAL_DOUBLE');
+  static const HighlightType LITERAL_INTEGER = const HighlightType(
+      'LITERAL_INTEGER');
+  static const HighlightType LITERAL_LIST = const HighlightType('LITERAL_LIST');
+  static const HighlightType LITERAL_MAP = const HighlightType('LITERAL_MAP');
+  static const HighlightType LITERAL_STRING = const HighlightType(
+      'LITERAL_STRING');
+  static const HighlightType LOCAL_VARIABLE_DECLARATION = const HighlightType(
+      'LOCAL_VARIABLE_DECLARATION');
+  static const HighlightType LOCAL_VARIABLE = const HighlightType(
+      'LOCAL_VARIABLE');
+  static const HighlightType METHOD_DECLARATION = const HighlightType(
+      'METHOD_DECLARATION');
+  static const HighlightType METHOD_DECLARATION_STATIC = const HighlightType(
+      'METHOD_DECLARATION_STATIC');
+  static const HighlightType METHOD = const HighlightType('METHOD');
+  static const HighlightType METHOD_STATIC = const HighlightType(
+      'METHOD_STATIC');
+  static const HighlightType PARAMETER = const HighlightType('PARAMETER');
+  static const HighlightType SETTER_DECLARATION = const HighlightType(
+      'SETTER_DECLARATION');
+  static const HighlightType TOP_LEVEL_VARIABLE = const HighlightType(
+      'TOP_LEVEL_VARIABLE');
+  static const HighlightType TYPE_NAME_DYNAMIC = const HighlightType(
+      'TYPE_NAME_DYNAMIC');
+  static const HighlightType TYPE_PARAMETER = const HighlightType(
+      'TYPE_PARAMETER');
+
+  final String name;
+
+  const HighlightType(this.name);
+
+  @override
+  String toString() => name;
+
+  static HighlightType valueOf(String name) {
+    if (ANNOTATION.name == name) return ANNOTATION;
+    if (BUILT_IN.name == name) return BUILT_IN;
+    if (CLASS.name == name) return CLASS;
+    if (COMMENT_BLOCK.name == name) return COMMENT_BLOCK;
+    if (COMMENT_DOCUMENTATION.name == name) return COMMENT_DOCUMENTATION;
+    if (COMMENT_END_OF_LINE.name == name) return COMMENT_END_OF_LINE;
+    if (CONSTRUCTOR.name == name) return CONSTRUCTOR;
+    if (DIRECTIVE.name == name) return DIRECTIVE;
+    if (DYNAMIC_TYPE.name == name) return DYNAMIC_TYPE;
+    if (FIELD.name == name) return FIELD;
+    if (FIELD_STATIC.name == name) return FIELD_STATIC;
+    if (FUNCTION_DECLARATION.name == name) return FUNCTION_DECLARATION;
+    if (FUNCTION.name == name) return FUNCTION;
+    if (FUNCTION_TYPE_ALIAS.name == name) return FUNCTION_TYPE_ALIAS;
+    if (GETTER_DECLARATION.name == name) return GETTER_DECLARATION;
+    if (KEYWORD.name == name) return KEYWORD;
+    if (IDENTIFIER_DEFAULT.name == name) return IDENTIFIER_DEFAULT;
+    if (IMPORT_PREFIX.name == name) return IMPORT_PREFIX;
+    if (LITERAL_BOOLEAN.name == name) return LITERAL_BOOLEAN;
+    if (LITERAL_DOUBLE.name == name) return LITERAL_DOUBLE;
+    if (LITERAL_INTEGER.name == name) return LITERAL_INTEGER;
+    if (LITERAL_LIST.name == name) return LITERAL_LIST;
+    if (LITERAL_MAP.name == name) return LITERAL_MAP;
+    if (LITERAL_STRING.name == name) return LITERAL_STRING;
+    if (LOCAL_VARIABLE_DECLARATION.name == name) return
+        LOCAL_VARIABLE_DECLARATION;
+    if (LOCAL_VARIABLE.name == name) return LOCAL_VARIABLE;
+    if (METHOD_DECLARATION.name == name) return METHOD_DECLARATION;
+    if (METHOD_DECLARATION_STATIC.name == name) return
+        METHOD_DECLARATION_STATIC;
+    if (METHOD.name == name) return METHOD;
+    if (METHOD_STATIC.name == name) return METHOD_STATIC;
+    if (PARAMETER.name == name) return PARAMETER;
+    if (SETTER_DECLARATION.name == name) return SETTER_DECLARATION;
+    if (TOP_LEVEL_VARIABLE.name == name) return TOP_LEVEL_VARIABLE;
+    if (TYPE_NAME_DYNAMIC.name == name) return TYPE_NAME_DYNAMIC;
+    if (TYPE_PARAMETER.name == name) return TYPE_PARAMETER;
+    throw new ArgumentError('Unknown HighlightType: $name');
+  }
+}
+
+
 /**
  * An AST visitor for [DartUnitHighlightsComputer].
  */
@@ -435,7 +597,8 @@
 
   @override
   Object visitPartOfDirective(PartOfDirective node) {
-    computer._addRegion_tokenStart_tokenEnd(node.partToken, node.ofToken, HighlightType.BUILT_IN);
+    computer._addRegion_tokenStart_tokenEnd(node.partToken, node.ofToken,
+        HighlightType.BUILT_IN);
     return super.visitPartOfDirective(node);
   }
 
@@ -469,49 +632,3 @@
     return super.visitTypeName(node);
   }
 }
-
-
-/**
- * Highlighting kinds constants.
- */
-class HighlightType {
-  static const HighlightType ANNOTATION = const HighlightType('ANNOTATION');
-  static const HighlightType BUILT_IN = const HighlightType('BUILT_IN');
-  static const HighlightType CLASS = const HighlightType('CLASS');
-  static const HighlightType COMMENT_BLOCK = const HighlightType('COMMENT_BLOCK');
-  static const HighlightType COMMENT_DOCUMENTATION = const HighlightType('COMMENT_DOCUMENTATION');
-  static const HighlightType COMMENT_END_OF_LINE = const HighlightType('COMMENT_END_OF_LINE');
-  static const HighlightType CONSTRUCTOR = const HighlightType('CONSTRUCTOR');
-  static const HighlightType DIRECTIVE = const HighlightType('DIRECTIVE');
-  static const HighlightType DYNAMIC_TYPE = const HighlightType('DYNAMIC_TYPE');
-  static const HighlightType FIELD = const HighlightType('FIELD');
-  static const HighlightType FIELD_STATIC = const HighlightType('FIELD_STATIC');
-  static const HighlightType FUNCTION_DECLARATION = const HighlightType('FUNCTION_DECLARATION');
-  static const HighlightType FUNCTION = const HighlightType('FUNCTION');
-  static const HighlightType FUNCTION_TYPE_ALIAS = const HighlightType('FUNCTION_TYPE_ALIAS');
-  static const HighlightType GETTER_DECLARATION = const HighlightType('GETTER_DECLARATION');
-  static const HighlightType KEYWORD = const HighlightType('KEYWORD');
-  static const HighlightType IDENTIFIER_DEFAULT = const HighlightType('IDENTIFIER_DEFAULT');
-  static const HighlightType IMPORT_PREFIX = const HighlightType('IMPORT_PREFIX');
-  static const HighlightType LITERAL_BOOLEAN = const HighlightType('LITERAL_BOOLEAN');
-  static const HighlightType LITERAL_DOUBLE = const HighlightType('LITERAL_DOUBLE');
-  static const HighlightType LITERAL_INTEGER = const HighlightType('LITERAL_INTEGER');
-  static const HighlightType LITERAL_LIST = const HighlightType('LITERAL_LIST');
-  static const HighlightType LITERAL_MAP = const HighlightType('LITERAL_MAP');
-  static const HighlightType LITERAL_STRING = const HighlightType('LITERAL_STRING');
-  static const HighlightType LOCAL_VARIABLE_DECLARATION = const HighlightType('LOCAL_VARIABLE_DECLARATION');
-  static const HighlightType LOCAL_VARIABLE = const HighlightType('LOCAL_VARIABLE');
-  static const HighlightType METHOD_DECLARATION = const HighlightType('METHOD_DECLARATION');
-  static const HighlightType METHOD_DECLARATION_STATIC = const HighlightType('METHOD_DECLARATION_STATIC');
-  static const HighlightType METHOD = const HighlightType('METHOD');
-  static const HighlightType METHOD_STATIC = const HighlightType('METHOD_STATIC');
-  static const HighlightType PARAMETER = const HighlightType('PARAMETER');
-  static const HighlightType SETTER_DECLARATION = const HighlightType('SETTER_DECLARATION');
-  static const HighlightType TOP_LEVEL_VARIABLE = const HighlightType('TOP_LEVEL_VARIABLE');
-  static const HighlightType TYPE_NAME_DYNAMIC = const HighlightType('TYPE_NAME_DYNAMIC');
-  static const HighlightType TYPE_PARAMETER = const HighlightType('TYPE_PARAMETER');
-
-  final String name;
-
-  const HighlightType(this.name);
-}
diff --git a/pkg/analysis_server/lib/src/computer/computer_hover.dart b/pkg/analysis_server/lib/src/computer/computer_hover.dart
new file mode 100644
index 0000000..1150480
--- /dev/null
+++ b/pkg/analysis_server/lib/src/computer/computer_hover.dart
@@ -0,0 +1,174 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library computer.hover;
+
+import 'dart:collection';
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+
+/**
+ * Converts [str] from a Dart Doc string with slashes and stars to a plain text
+ * representation of the comment.
+ */
+String _removeDartDocDelimiters(String str) {
+  if (str == null) {
+    return null;
+  }
+  // remove /** */
+  if (str.startsWith('/**')) {
+    str = str.substring(3);
+  }
+  if (str.endsWith("*/")) {
+    str = str.substring(0, str.length - 2);
+  }
+  str = str.trim();
+  // remove leading '* '
+  List<String> lines = str.split('\n');
+  StringBuffer sb = new StringBuffer();
+  bool firstLine = true;
+  for (String line in lines) {
+    line = line.trim();
+    if (line.startsWith("*")) {
+      line = line.substring(1);
+      if (line.startsWith(" ")) {
+        line = line.substring(1);
+      }
+    } else if (line.startsWith("///")) {
+      line = line.substring(3);
+      if (line.startsWith(" ")) {
+        line = line.substring(1);
+      }
+    }
+    if (!firstLine) {
+      sb.write('\n');
+    }
+    firstLine = false;
+    sb.write(line);
+  }
+  str = sb.toString();
+  // done
+  return str;
+}
+
+
+/**
+ * A computer for the hover at the specified offset of a Dart [CompilationUnit].
+ */
+class DartUnitHoverComputer {
+  final CompilationUnit _unit;
+  final int _offset;
+
+  DartUnitHoverComputer(this._unit, this._offset);
+
+  /**
+   * Returns the computed hover, maybe `null`.
+   */
+  Map<String, Object> compute() {
+    AstNode node = new NodeLocator.con1(_offset).searchWithin(_unit);
+    if (node is Expression) {
+      Hover hover = new Hover(node.offset, node.length);
+      // element
+      Element element = ElementLocator.locateWithOffset(node, _offset);
+      if (element != null) {
+        // variable, if synthetic accessor
+        if (element is PropertyAccessorElement) {
+          PropertyAccessorElement accessor = element;
+          if (accessor.isSynthetic) {
+            element = accessor.variable;
+          }
+        }
+        // description
+        hover.elementDescription = element.toString();
+        hover.elementKind = element.kind.displayName;
+        // library
+        LibraryElement library = element.library;
+        if (library != null) {
+          hover.containingLibraryName = library.name;
+          hover.containingLibraryPath = library.source.fullName;
+        }
+        // documentation
+        String dartDoc = element.computeDocumentationComment();
+        dartDoc = _removeDartDocDelimiters(dartDoc);
+        hover.dartDoc = dartDoc;
+      }
+      // parameter
+      hover.parameter = _safeToString(node.bestParameterElement);
+      // types
+      hover.staticType = _safeToString(node.staticType);
+      hover.propagatedType = _safeToString(node.propagatedType);
+      // done
+      return hover.toJson();
+    }
+    // not an expression
+    return null;
+  }
+
+  static _safeToString(obj) => obj != null ? obj.toString() : null;
+}
+
+
+class Hover {
+  final int offset;
+  final int length;
+  String containingLibraryName;
+  String containingLibraryPath;
+  String dartDoc;
+  String elementDescription;
+  String elementKind;
+  String parameter;
+  String propagatedType;
+  String staticType;
+
+  Hover(this.offset, this.length);
+
+  factory Hover.fromJson(Map<String, Object> map) {
+    int offset = map[OFFSET];
+    int length = map[LENGTH];
+    Hover hover = new Hover(offset, length);
+    hover.containingLibraryName = map[CONTAINING_LIBRARY_NAME];
+    hover.containingLibraryPath = map[CONTAINING_LIBRARY_PATH];
+    hover.dartDoc = map[DART_DOC];
+    hover.elementDescription = map[ELEMENT_DESCRIPTION];
+    hover.elementKind = map[ELEMENT_KIND];
+    hover.parameter = map[PARAMETER];
+    hover.propagatedType = map[PROPAGATED_TYPE];
+    hover.staticType = map[STATIC_TYPE];
+    return hover;
+  }
+
+  Map<String, Object> toJson() {
+    Map<String, Object> json = new HashMap<String, Object>();
+    json[OFFSET] = offset;
+    json[LENGTH] = length;
+    if (containingLibraryName != null) {
+      json[CONTAINING_LIBRARY_NAME] = containingLibraryName;
+    }
+    if (containingLibraryName != null) {
+      json[CONTAINING_LIBRARY_PATH] = containingLibraryPath;
+    }
+    if (dartDoc != null) {
+      json[DART_DOC] = dartDoc;
+    }
+    if (elementDescription != null) {
+      json[ELEMENT_DESCRIPTION] = elementDescription;
+    }
+    if (elementKind != null) {
+      json[ELEMENT_KIND] = elementKind;
+    }
+    if (parameter != null) {
+      json[PARAMETER] = parameter;
+    }
+    if (propagatedType != null) {
+      json[PROPAGATED_TYPE] = propagatedType;
+    }
+    if (staticType != null) {
+      json[STATIC_TYPE] = staticType;
+    }
+    return json;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/computer/computer_navigation.dart b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
index dedf75c..768622b 100644
--- a/pkg/analysis_server/lib/src/computer/computer_navigation.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
@@ -77,7 +77,6 @@
 }
 
 
-
 class _DartUnitNavigationComputerVisitor extends RecursiveAstVisitor {
   final DartUnitNavigationComputer computer;
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_occurrences.dart b/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
new file mode 100644
index 0000000..4e36665
--- /dev/null
+++ b/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library computer.occurrences;
+
+import 'dart:collection';
+
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart' as engine;
+
+
+/**
+ * A computer for elements occurrences in a Dart [CompilationUnit].
+ */
+class DartUnitOccurrencesComputer {
+  final CompilationUnit _unit;
+
+  final Map<engine.Element, List<int>> _elementsOffsets =
+      new HashMap<engine.Element, List<int>>();
+
+  DartUnitOccurrencesComputer(this._unit);
+
+  /**
+   * Returns the computed occurrences, not `null`.
+   */
+  List<Map<String, Object>> compute() {
+    _unit.accept(new _DartUnitOccurrencesComputerVisitor(this));
+    List<Occurrences> occurrences = <Occurrences>[];
+    _elementsOffsets.forEach((engineElement, offsets) {
+      Element serverElement = new Element.fromEngine(engineElement);
+      int length = engineElement.displayName.length;
+      occurrences.add(new Occurrences(serverElement, offsets, length));
+    });
+    return occurrences.map((occurrences) => occurrences.toJson()).toList();
+  }
+
+  void _addOccurrence(engine.Element element, int offset) {
+    List<int> offsets = _elementsOffsets[element];
+    if (offsets == null) {
+      offsets = <int>[];
+      _elementsOffsets[element] = offsets;
+    }
+    offsets.add(offset);
+  }
+}
+
+
+class Occurrences {
+  final Element element;
+  final List<int> offsets;
+  final int length;
+
+  Occurrences(this.element, this.offsets, this.length);
+
+  factory Occurrences.fromJson(Map<String, Object> map) {
+    Element element = new Element.fromJson(map[ELEMENT]);
+    List<int> offsets = map[OFFSETS];
+    int length = map[LENGTH];
+    return new Occurrences(element, offsets, length);
+  }
+
+  Map<String, Object> toJson() {
+    Map<String, Object> json = new HashMap<String, Object>();
+    json[ELEMENT] = element.toJson();
+    json[OFFSETS] = offsets;
+    json[LENGTH] = length;
+    return json;
+  }
+
+  @override
+  String toString() => toJson().toString();
+}
+
+
+class _DartUnitOccurrencesComputerVisitor extends RecursiveAstVisitor {
+  final DartUnitOccurrencesComputer computer;
+
+  _DartUnitOccurrencesComputerVisitor(this.computer);
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    engine.Element element = node.bestElement;
+    if (element != null) {
+      computer._addOccurrence(element, node.offset);
+    }
+    return super.visitSimpleIdentifier(node);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
new file mode 100644
index 0000000..832fa7e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -0,0 +1,159 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library computer.overrides;
+
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart' as engine;
+
+
+/**
+ * A computer for class member overrides in a Dart [CompilationUnit].
+ */
+class DartUnitOverridesComputer {
+  final CompilationUnit _unit;
+
+  final List<Override> _overrides = <Override>[];
+  engine.ClassElement _currentClass;
+
+  DartUnitOverridesComputer(this._unit);
+
+  /**
+   * Returns the computed occurrences, not `null`.
+   */
+  List<Map<String, Object>> compute() {
+    for (CompilationUnitMember unitMember in _unit.declarations) {
+      if (unitMember is ClassDeclaration) {
+        _currentClass = unitMember.element;
+        for (ClassMember classMember in unitMember.members) {
+          if (classMember is MethodDeclaration) {
+            SimpleIdentifier nameNode = classMember.name;
+            _addOverride(nameNode.offset, nameNode.length, nameNode.name);
+          }
+          if (classMember is FieldDeclaration) {
+            List<VariableDeclaration> fields = classMember.fields.variables;
+            for (VariableDeclaration field in fields) {
+              SimpleIdentifier nameNode = field.name;
+              _addOverride(nameNode.offset, nameNode.length, nameNode.name);
+            }
+          }
+        }
+      }
+    }
+    return _overrides.map((override) => override.toJson()).toList();
+  }
+
+  void _addOverride(int offset, int length, String name) {
+    // super
+    engine.Element superEngineElement;
+    {
+      engine.InterfaceType superType = _currentClass.supertype;
+      if (superType != null) {
+        superEngineElement = _lookupMember(superType.element, name);
+      }
+    }
+    // interfaces
+    List<engine.Element> interfaceEngineElements = <engine.Element>[];
+    for (engine.InterfaceType interfaceType in _currentClass.interfaces) {
+      engine.ClassElement interfaceElement = interfaceType.element;
+      engine.Element interfaceMember = _lookupMember(interfaceElement, name);
+      if (interfaceMember != null) {
+        interfaceEngineElements.add(interfaceMember);
+      }
+    }
+    // is there any override?
+    if (superEngineElement != null || interfaceEngineElements.isNotEmpty) {
+      Element superElement = superEngineElement != null ?
+          new Element.fromEngine(superEngineElement) : null;
+      List<Element> interfaceElements = interfaceEngineElements.map(
+          (engineElement) {
+        return new Element.fromEngine(engineElement);
+      }).toList();
+      _overrides.add(new Override(offset, length, superElement,
+          interfaceElements));
+    }
+  }
+
+  static engine.Element _lookupMember(engine.ClassElement classElement,
+      String name) {
+    if (classElement == null) {
+      return null;
+    }
+    engine.LibraryElement library = classElement.library;
+    // method
+    engine.Element member = classElement.lookUpMethod(name, library);
+    if (member != null) {
+      return member;
+    }
+    // getter
+    member = classElement.lookUpGetter(name, library);
+    if (member != null) {
+      return member;
+    }
+    // setter
+    member = classElement.lookUpSetter(name + '=', library);
+    if (member != null) {
+      return member;
+    }
+    // not found
+    return null;
+  }
+}
+
+
+class Override {
+  final int offset;
+  final int length;
+  final Element superclassElement;
+  final List<Element> interfaceElements;
+
+  Override(this.offset, this.length, this.superclassElement,
+      this.interfaceElements);
+
+  factory Override.fromJson(Map<String, Object> map) {
+    int offset = map[OFFSET];
+    int length = map[LENGTH];
+    // super
+    Element superclassElement = null;
+    {
+      Map<String, Object> superJson = map[SUPER_CLASS_ELEMENT];
+      if (superJson != null) {
+        superclassElement = new Element.fromJson(superJson);
+      }
+    }
+    // interfaces
+    List<Element> interfaceElements = null;
+    {
+      List<Map<String, Object>> jsonList = map[INTERFACE_ELEMENTS];
+      if (jsonList != null) {
+        interfaceElements = <Element>[];
+        for (Map<String, Object> json in jsonList) {
+          interfaceElements.add(new Element.fromJson(json));
+        }
+      }
+    }
+    // done
+    return new Override(offset, length, superclassElement, interfaceElements);
+  }
+
+  Map<String, Object> toJson() {
+    Map<String, Object> json = <String, Object>{};
+    json[OFFSET] = offset;
+    json[LENGTH] = length;
+    if (superclassElement != null) {
+      json[SUPER_CLASS_ELEMENT] = superclassElement.toJson();
+    }
+    if (interfaceElements != null && interfaceElements.isNotEmpty) {
+      json[INTERFACE_ELEMENTS] = interfaceElements.map((element) {
+        return element.toJson();
+      }).toList();
+    }
+    return json;
+  }
+
+  @override
+  String toString() => toJson().toString();
+}
diff --git a/pkg/analysis_server/lib/src/computer/element.dart b/pkg/analysis_server/lib/src/computer/element.dart
index ca223e0..56ede07 100644
--- a/pkg/analysis_server/lib/src/computer/element.dart
+++ b/pkg/analysis_server/lib/src/computer/element.dart
@@ -111,6 +111,9 @@
     return json;
   }
 
+  @override
+  String toString() => toJson().toString();
+
   static String _getParametersString(engine.Element element) {
     // TODO(scheglov) expose the corresponding feature from ExecutableElement
     if (element is engine.ExecutableElement) {
@@ -208,6 +211,7 @@
   static const FUNCTION_TYPE_ALIAS = const ElementKind('FUNCTION_TYPE_ALIAS');
   static const GETTER = const ElementKind('GETTER');
   static const LIBRARY = const ElementKind('LIBRARY');
+  static const LOCAL_VARIABLE = const ElementKind('LOCAL_VARIABLE');
   static const METHOD = const ElementKind('METHOD');
   static const SETTER = const ElementKind('SETTER');
   static const TOP_LEVEL_VARIABLE = const ElementKind('TOP_LEVEL_VARIABLE');
@@ -232,6 +236,7 @@
     if (FUNCTION_TYPE_ALIAS.name == name) return FUNCTION_TYPE_ALIAS;
     if (GETTER.name == name) return GETTER;
     if (LIBRARY.name == name) return LIBRARY;
+    if (LOCAL_VARIABLE.name == name) return LOCAL_VARIABLE;
     if (METHOD.name == name) return METHOD;
     if (SETTER.name == name) return SETTER;
     if (TOP_LEVEL_VARIABLE.name == name) return TOP_LEVEL_VARIABLE;
@@ -266,6 +271,9 @@
     if (kind == engine.ElementKind.LIBRARY) {
       return LIBRARY;
     }
+    if (kind == engine.ElementKind.LOCAL_VARIABLE) {
+      return LOCAL_VARIABLE;
+    }
     if (kind == engine.ElementKind.METHOD) {
       return METHOD;
     }
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index 54486f4..b71b245 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -21,6 +21,7 @@
 //
 // Analysis methods
 //
+const String ANALYSIS_GET_HOVER = 'analysis.getHover';
 const String ANALYSIS_SET_ANALYSIS_ROOTS = 'analysis.setAnalysisRoots';
 const String ANALYSIS_SET_PRIORITY_FILES = 'analysis.setPriorityFiles';
 const String ANALYSIS_SET_SUBSCRIPTIONS = 'analysis.setSubscriptions';
@@ -34,7 +35,9 @@
 const String ANALYSIS_ERRORS = 'analysis.errors';
 const String ANALYSIS_HIGHLIGHTS = 'analysis.highlights';
 const String ANALYSIS_NAVIGATION = 'analysis.navigation';
+const String ANALYSIS_OCCURRENCES = 'analysis.occurrences';
 const String ANALYSIS_OUTLINE = 'analysis.outline';
+const String ANALYSIS_OVERRIDES = 'analysis.overrides';
 
 //
 // Code Completion methods
@@ -76,10 +79,15 @@
 //
 const String ADDED = 'added';
 const String CHILDREN = 'children';
+const String CONTAINING_LIBRARY_NAME = 'containingLibraryName';
+const String CONTAINING_LIBRARY_PATH = 'containingLibraryPath';
 const String CONTENT = 'content';
 const String CORRECTION = 'correction';
+const String DART_DOC = 'dartdoc';
 const String DEFAULT = 'default';
 const String ELEMENT = 'element';
+const String ELEMENT_DESCRIPTION = 'elementDescription';
+const String ELEMENT_KIND = 'elementKind';
 const String EXCLUDED = 'excluded';
 const String ERROR_CODE = 'errorCode';
 const String ERRORS = 'errors';
@@ -87,8 +95,10 @@
 const String FILES = 'files';
 const String FIXES = 'fixes';
 const String FLAGS = 'flags';
+const String HOVERS = 'hovers';
 const String ID = 'id';
 const String INCLUDED = 'included';
+const String INTERFACE_ELEMENTS = 'interfaceElements';
 const String IS_ABSTRACT = 'isAbstract';
 const String IS_STATIC = 'isStatic';
 const String KIND = 'kind';
@@ -97,12 +107,17 @@
 const String MESSAGE = 'message';
 const String NAME = 'name';
 const String NEW_LENGTH = 'newLength';
+const String OCCURRENCES = 'occurrences';
 const String OFFSET = 'offset';
+const String OFFSETS = 'offsets';
 const String OLD_LENGTH = 'oldLength';
 const String OPTIONS = 'options';
 const String OUTLINE = 'outline';
+const String OVERRIDES = 'overrides';
+const String PARAMETER = 'parameter';
 const String PARAMETERS = 'parameters';
 const String PATTERN = 'pattern';
+const String PROPAGATED_TYPE = 'propagatedType';
 const String REFACTORINGS = 'refactorings';
 const String REGIONS = 'regions';
 const String REMOVED = 'removed';
@@ -110,7 +125,9 @@
 const String SEVERITY = 'severity';
 const String START_COLUMN = 'startColumn';
 const String START_LINE = 'startLine';
+const String STATIC_TYPE = 'staticType';
 const String SUBSCRIPTIONS = 'subscriptions';
+const String SUPER_CLASS_ELEMENT = 'superclassElement';
 const String TARGETS = 'targets';
 const String TYPE = 'type';
 const String VERSION = 'version';
diff --git a/pkg/analysis_server/lib/src/context_directory_manager.dart b/pkg/analysis_server/lib/src/context_directory_manager.dart
index 6c93f2c..fa1970c 100644
--- a/pkg/analysis_server/lib/src/context_directory_manager.dart
+++ b/pkg/analysis_server/lib/src/context_directory_manager.dart
@@ -7,8 +7,8 @@
 import 'dart:async';
 import 'dart:collection';
 
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analysis_server/src/package_map_provider.dart';
-import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:watcher/watcher.dart';
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index c153735..db34aa7 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -6,10 +6,13 @@
 
 import 'dart:collection';
 
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analysis_server/src/computer/computer_hover.dart';
 
 /**
  * Instances of the class [AnalysisDomainHandler] implement a [RequestHandler]
@@ -26,11 +29,38 @@
    */
   AnalysisDomainHandler(this.server);
 
+  /**
+   * Implement the `analysis.getHover` request.
+   */
+  Response getAnalysisHover(Request request) {
+    // prepare parameters
+    String file = request.getRequiredParameter(FILE).asString();
+    int offset = request.getRequiredParameter(OFFSET).asInt();
+    // prepare hovers
+    List<Map<String, Object>> hovers = <Map<String, Object>>[];
+    {
+      Source source = server.getSource(file);
+      AnalysisContext context = server.getAnalysisContext(file);
+      List<Source> librarySources = context.getLibrariesContaining(source);
+      for (Source librarySource in librarySources) {
+        CompilationUnit unit = context.resolveCompilationUnit2(source,
+            librarySource);
+        hovers.add(new DartUnitHoverComputer(unit, offset).compute());
+      }
+    }
+    // send response
+    Response response = new Response(request.id);
+    response.setResult(HOVERS, hovers);
+    return response;
+  }
+
   @override
   Response handleRequest(Request request) {
     try {
       String requestName = request.method;
-      if (requestName == ANALYSIS_SET_ANALYSIS_ROOTS) {
+      if (requestName == ANALYSIS_GET_HOVER) {
+        return getAnalysisHover(request);
+      } else if (requestName == ANALYSIS_SET_ANALYSIS_ROOTS) {
         return setAnalysisRoots(request);
       } else if (requestName == ANALYSIS_SET_PRIORITY_FILES) {
         return setPriorityFiles(request);
diff --git a/pkg/analysis_server/lib/src/index/b_plus_tree.dart b/pkg/analysis_server/lib/src/index/b_plus_tree.dart
deleted file mode 100644
index f4b52d7..0000000
--- a/pkg/analysis_server/lib/src/index/b_plus_tree.dart
+++ /dev/null
@@ -1,774 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library index.b_plus_tree;
-
-import 'dart:collection';
-
-
-/**
- * A simple B+ tree (http://en.wikipedia.org/wiki/B+_tree) implementation.
- *
- * [K] is the keys type.
- * [V] is the values type.
- * [N] is the type of node identifiers using by the [NodeManager].
- */
-class BPlusTree<K, V, N> {
-  /**
-   * The [Comparator] to compare keys.
-   */
-  final Comparator<K> _comparator;
-
-  /**
-   * The [NodeManager] to manage nodes.
-   */
-  final NodeManager<K, V, N> _manager;
-
-  /**
-   * The maximum number of keys in an index node.
-   */
-  final int _maxIndexKeys;
-
-  /**
-   * The maximum number of keys in a leaf node.
-   */
-  final int _maxLeafKeys;
-
-  /**
-   * The root node.
-   */
-  _Node<K, V, N> _root;
-
-  /**
-   * Creates a new [BPlusTree] instance.
-   */
-  BPlusTree(this._comparator, NodeManager<K, V, N> manager)
-      : _manager = manager,
-        _maxIndexKeys = manager.maxIndexKeys,
-        _maxLeafKeys = manager.maxLeafKeys {
-    _root = _newLeafNode();
-    _writeLeafNode(_root);
-  }
-
-  /**
-   * Returns the value for [key] or `null` if [key] is not in the tree.
-   */
-  V find(K key) {
-    return _root.find(key);
-  }
-
-  /**
-   * Associates the [key] with the given [value].
-   *
-   * If the key was already in the tree, its associated value is changed.
-   * Otherwise the key-value pair is added to the tree.
-   */
-  void insert(K key, V value) {
-    _Split<K, N> result = _root.insert(key, value);
-    if (result != null) {
-      _IndexNode<K, V, N> newRoot = _newIndexNode();
-      newRoot.keys.add(result.key);
-      newRoot.children.add(result.left);
-      newRoot.children.add(result.right);
-      _root = newRoot;
-      _writeIndexNode(_root);
-    }
-  }
-
-  /**
-   * Removes the association for the given [key].
-   *
-   * Returns the value associated with [key] in the tree or `null` if [key] is
-   * not in the tree.
-   */
-  V remove(K key) {
-    _Remove<K, V> result = _root.remove(key, null, null, null);
-    if (_root is _IndexNode<K, V, N>) {
-      List<N> children = (_root as _IndexNode<K, V, N>).children;
-      if (children.length == 1) {
-        _manager.delete(_root.id);
-        _root = _readNode(children[0]);
-      }
-    }
-    return result.value;
-  }
-
-  /**
-   * Writes a textual presentation of the tree into [buffer].
-   */
-  void writeOn(StringBuffer buffer) {
-    _root.writeOn(buffer, '');
-  }
-
-  /**
-   * Creates a new [_IndexNode] instance.
-   */
-  _IndexNode<K, V, N> _newIndexNode() {
-    N id = _manager.createIndex();
-    return new _IndexNode<K, V, N>(this, id, _maxIndexKeys);
-  }
-
-  /**
-   * Creates a new [_LeafNode] instance.
-   */
-  _LeafNode<K, V, N> _newLeafNode() {
-    N id = _manager.createLeaf();
-    return new _LeafNode<K, V, N>(this, id, _maxLeafKeys);
-  }
-
-  /**
-   * Reads the [_IndexNode] with [id] from the manager.
-   */
-  _IndexNode<K, V, N> _readIndexNode(N id) {
-    IndexNodeData<K, N> data = _manager.readIndex(id);
-    _IndexNode<K, V, N> node = new _IndexNode<K, V, N>(this, id, _maxIndexKeys);
-    node.keys = data.keys;
-    node.children = data.children;
-    return node;
-  }
-
-  /**
-   * Reads the [_LeafNode] with [id] from the manager.
-   */
-  _LeafNode<K, V, N> _readLeafNode(N id) {
-    _LeafNode<K, V, N> node = new _LeafNode<K, V, N>(this, id, _maxLeafKeys);
-    LeafNodeData<K, V> data = _manager.readLeaf(id);
-    node.keys = data.keys;
-    node.values = data.values;
-    return node;
-  }
-
-  /**
-   * Reads the [_IndexNode] or [_LeafNode] with [id] from the manager.
-   */
-  _Node<K, V, N> _readNode(N id) {
-    if (_manager.isIndex(id)) {
-      return _readIndexNode(id);
-    } else {
-      return _readLeafNode(id);
-    }
-  }
-
-  /**
-   * Writes [node] into the manager.
-   */
-  void _writeIndexNode(_IndexNode<K, V, N> node) {
-    _manager.writeIndex(node.id, new IndexNodeData<K, N>(node.keys, node.children));
-  }
-
-  /**
-   * Writes [node] into the manager.
-   */
-  void _writeLeafNode(_LeafNode<K, V, N> node) {
-    _manager.writeLeaf(node.id, new LeafNodeData<K, V>(node.keys, node.values));
-  }
-}
-
-
-/**
- * A container with information about an index node.
- */
-class IndexNodeData<K, N> {
-  final List<N> children;
-  final List<K> keys;
-  IndexNodeData(this.keys, this.children);
-}
-
-
-/**
- * A container with information about a leaf node.
- */
-class LeafNodeData<K, V> {
-  final List<K> keys;
-  final List<V> values;
-  LeafNodeData(this.keys, this.values);
-}
-
-
-/**
- * An implementation of [NodeManager] that keeps node information in memory.
- */
-class MemoryNodeManager<K, V> implements NodeManager<K, V, int> {
-  final int maxIndexKeys;
-  final int maxLeafKeys;
-  Map<int, IndexNodeData> _indexDataMap = new HashMap<int, IndexNodeData>();
-  Map<int, LeafNodeData> _leafDataMap = new HashMap<int, LeafNodeData>();
-
-  int _nextPageIndexId = 0;
-  int _nextPageLeafId = 1;
-
-  MemoryNodeManager(this.maxIndexKeys, this.maxLeafKeys);
-
-  @override
-  int createIndex() {
-    int id = _nextPageIndexId;
-    _nextPageIndexId += 2;
-    return id;
-  }
-
-  @override
-  int createLeaf() {
-    int id = _nextPageLeafId;
-    _nextPageLeafId += 2;
-    return id;
-  }
-
-  @override
-  void delete(int id) {
-    if (isIndex(id)) {
-      _indexDataMap.remove(id);
-    } else {
-      _leafDataMap.remove(id);
-    }
-  }
-
-  @override
-  bool isIndex(int id) {
-    return id.isEven;
-  }
-
-  @override
-  IndexNodeData<K, int> readIndex(int id) {
-    return _indexDataMap[id];
-  }
-
-  @override
-  LeafNodeData<K, V> readLeaf(int id) {
-    return _leafDataMap[id];
-  }
-
-  @override
-  void writeIndex(int id, IndexNodeData<K, int> data) {
-    _indexDataMap[id] = data;
-  }
-
-  @override
-  void writeLeaf(int id, LeafNodeData<K, V> data) {
-    _leafDataMap[id] = data;
-  }
-}
-
-
-/**
- * A manager that manages nodes.
- */
-abstract class NodeManager<K, V, N> {
-  /**
-   * The maximum number of keys in an index node.
-   */
-  int get maxIndexKeys;
-
-  /**
-   * The maximum number of keys in a leaf node.
-   */
-  int get maxLeafKeys;
-
-  /**
-   * Generates an identifier for a new index node.
-   */
-  N createIndex();
-
-  /**
-   * Generates an identifier for a new leaf node.
-   */
-  N createLeaf();
-
-  /**
-   * Deletes the node with the given identifier.
-   */
-  void delete(N id);
-
-  /**
-   * Checks if the node with the given identifier is an index or a leaf node.
-   */
-  bool isIndex(N id);
-
-  /**
-   * Reads information about the index node with the given identifier.
-   */
-  IndexNodeData<K, N> readIndex(N id);
-
-  /**
-   * Reads information about the leaf node with the given identifier.
-   */
-  LeafNodeData<K, V> readLeaf(N id);
-
-  /**
-   * Writes information about the index node with the given identifier.
-   */
-  void writeIndex(N id, IndexNodeData<K, N> data);
-
-  /**
-   * Writes information about the leaf node with the given identifier.
-   */
-  void writeLeaf(N id, LeafNodeData<K, V> data);
-}
-
-
-/**
- * An index node with keys and children references.
- */
-class _IndexNode<K, V, N> extends _Node<K, V, N> {
-  List<N> children = new List<N>();
-  final int maxKeys;
-  final int minKeys;
-
-  _IndexNode(BPlusTree<K, V, N> tree, N id, int maxKeys)
-      : super(tree, id),
-        maxKeys = maxKeys,
-        minKeys = maxKeys ~/ 2;
-
-  @override
-  V find(K key) {
-    int index = _findChildIndex(key);
-    _Node<K, V, N> child = tree._readNode(children[index]);
-    return child.find(key);
-  }
-
-  _Split<K, N> insert(K key, V value) {
-    // Early split.
-    if (keys.length == maxKeys) {
-      int middle = (maxKeys + 1) ~/ 2;
-      K splitKey = keys[middle];
-      // Overflow into a new sibling.
-      _IndexNode<K, V, N> sibling = tree._newIndexNode();
-      sibling.keys.addAll(keys.getRange(middle + 1, keys.length));
-      sibling.children.addAll(children.getRange(middle + 1, children.length));
-      keys.length = middle;
-      children.length = middle + 1;
-      // Insert into this node or sibling.
-      if (comparator(key, splitKey) < 0) {
-        _insertNotFull(key, value);
-      } else {
-        sibling._insertNotFull(key, value);
-      }
-      // Prepare split.
-      tree._writeIndexNode(this);
-      tree._writeIndexNode(sibling);
-      return new _Split<K, N>(splitKey, id, sibling.id);
-    }
-    // No split.
-    _insertNotFull(key, value);
-    return null;
-  }
-
-  @override
-  _Remove<K, V> remove(K key, _Node<K, V, N> left, K anchor, _Node<K, V,
-      N> right) {
-    int index = _findChildIndex(key);
-    K thisAnchor = index == 0 ? keys[0] : keys[index - 1];
-    // Prepare children.
-    _Node<K, V, N> child = tree._readNode(children[index]);
-    _Node<K, V, N> leftChild;
-    _Node<K, V, N> rightChild;
-    if (index != 0) {
-      leftChild = tree._readNode(children[index - 1]);
-    } else {
-      leftChild = null;
-    }
-    if (index < children.length - 1) {
-      rightChild = tree._readNode(children[index + 1]);
-    } else {
-      rightChild = null;
-    }
-    // Ask child to remove.
-    _Remove<K, V> result = child.remove(key, leftChild, thisAnchor, rightChild);
-    V value = result.value;
-    if (value == null) {
-      return new _Remove<K, V>(value);
-    }
-    // Do keys / children updates
-    bool hasUpdates = false;
-    {
-      // Update anchor if borrowed.
-      if (result.leftAnchor != null) {
-        keys[index - 1] = result.leftAnchor;
-        hasUpdates = true;
-      }
-      if (result.rightAnchor != null) {
-        keys[index] = result.rightAnchor;
-        hasUpdates = true;
-      }
-      // Update keys / children if merged.
-      if (result.mergedLeft) {
-        keys.removeAt(index - 1);
-        N child = children.removeAt(index);
-        manager.delete(child);
-        hasUpdates = true;
-      }
-      if (result.mergedRight) {
-        keys.removeAt(index);
-        N child = children.removeAt(index);
-        manager.delete(child);
-        hasUpdates = true;
-      }
-    }
-    // Write if updated.
-    if (!hasUpdates) {
-      return new _Remove<K, V>(value);
-    }
-    tree._writeIndexNode(this);
-    // Perform balancing.
-    if (keys.length < minKeys) {
-      // Try left sibling.
-      if (left is _IndexNode<K, V, N>) {
-        // Try to redistribute.
-        int leftLength = left.keys.length;
-        if (leftLength > minKeys) {
-          int halfExcess = (leftLength - minKeys + 1) ~/ 2;
-          int newLeftLength = leftLength - halfExcess;
-          keys.insert(0, anchor);
-          keys.insertAll(0, left.keys.getRange(newLeftLength, leftLength));
-          children.insertAll(0, left.children.getRange(newLeftLength, leftLength
-              + 1));
-          K newAnchor = left.keys[newLeftLength - 1];
-          left.keys.length = newLeftLength - 1;
-          left.children.length = newLeftLength;
-          tree._writeIndexNode(this);
-          tree._writeIndexNode(left);
-          return new _Remove<K, V>.borrowLeft(value, newAnchor);
-        }
-        // Do merge.
-        left.keys.add(anchor);
-        left.keys.addAll(keys);
-        left.children.addAll(children);
-        tree._writeIndexNode(this);
-        tree._writeIndexNode(left);
-        return new _Remove<K, V>.mergeLeft(value);
-      }
-      // Try right sibling.
-      if (right is _IndexNode<K, V, N>) {
-        // Try to redistribute.
-        int rightLength = right.keys.length;
-        if (rightLength > minKeys) {
-          int halfExcess = (rightLength - minKeys + 1) ~/ 2;
-          keys.add(anchor);
-          keys.addAll(right.keys.getRange(0, halfExcess - 1));
-          children.addAll(right.children.getRange(0, halfExcess));
-          K newAnchor = right.keys[halfExcess - 1];
-          right.keys.removeRange(0, halfExcess);
-          right.children.removeRange(0, halfExcess);
-          tree._writeIndexNode(this);
-          tree._writeIndexNode(right);
-          return new _Remove<K, V>.borrowRight(value, newAnchor);
-        }
-        // Do merge.
-        right.keys.insert(0, anchor);
-        right.keys.insertAll(0, keys);
-        right.children.insertAll(0, children);
-        tree._writeIndexNode(this);
-        tree._writeIndexNode(right);
-        return new _Remove<K, V>.mergeRight(value);
-      }
-    }
-    // No balancing required.
-    return new _Remove<K, V>(value);
-  }
-
-  @override
-  void writeOn(StringBuffer buffer, String indent) {
-    buffer.write(indent);
-    buffer.write('INode {\n');
-    for (int i = 0; i < keys.length; i++) {
-      _Node<K, V, N> child = tree._readNode(children[i]);
-      child.writeOn(buffer, indent + '    ');
-      buffer.write(indent);
-      buffer.write('  ');
-      buffer.write(keys[i]);
-      buffer.write('\n');
-    }
-    _Node<K, V, N> child = tree._readNode(children[keys.length]);
-    child.writeOn(buffer, indent + '    ');
-    buffer.write(indent);
-    buffer.write('}\n');
-  }
-
-  /**
-   * Returns the index of the child into which [key] should be inserted.
-   */
-  int _findChildIndex(K key) {
-    int lo = 0;
-    int hi = keys.length - 1;
-    while (lo <= hi) {
-      int mid = lo + (hi - lo) ~/ 2;
-      int compare = comparator(key, keys[mid]);
-      if (compare < 0) {
-        hi = mid - 1;
-      } else if (compare > 0) {
-        lo = mid + 1;
-      } else {
-        return mid + 1;
-      }
-    }
-    return lo;
-  }
-
-  void _insertNotFull(K key, V value) {
-    int index = _findChildIndex(key);
-    _Node<K, V, N> child = tree._readNode(children[index]);
-    _Split<K, N> result = child.insert(key, value);
-    if (result != null) {
-      keys.insert(index, result.key);
-      children[index] = result.left;
-      children.insert(index + 1, result.right);
-      tree._writeIndexNode(this);
-    }
-  }
-}
-
-
-/**
- * A leaf node with keys and values.
- */
-class _LeafNode<K, V, N> extends _Node<K, V, N> {
-  final int maxKeys;
-  final int minKeys;
-  List<V> values = new List<V>();
-
-  _LeafNode(BPlusTree<K, V, N> tree, N id, int maxKeys)
-      : super(tree, id),
-        maxKeys = maxKeys,
-        minKeys = maxKeys ~/ 2;
-
-  @override
-  V find(K key) {
-    int index = _findKeyIndex(key);
-    if (index < 0) {
-      return null;
-    }
-    if (index >= keys.length) {
-      return null;
-    }
-    if (keys[index] != key) {
-      return null;
-    }
-    return values[index];
-  }
-
-  _Split<K, N> insert(K key, V value) {
-    int index = _findKeyIndex(key);
-    // The node is full.
-    if (keys.length == maxKeys) {
-      int middle = (maxKeys + 1) ~/ 2;
-      _LeafNode<K, V, N> sibling = tree._newLeafNode();
-      sibling.keys.addAll(keys.getRange(middle, keys.length));
-      sibling.values.addAll(values.getRange(middle, values.length));
-      keys.length = middle;
-      values.length = middle;
-      // Insert into the left / right sibling.
-      if (index < middle) {
-        _insertNotFull(key, value, index);
-      } else {
-        sibling._insertNotFull(key, value, index - middle);
-      }
-      // Notify the parent about the split.
-      tree._writeLeafNode(this);
-      tree._writeLeafNode(sibling);
-      return new _Split<K, N>(sibling.keys[0], id, sibling.id);
-    }
-    // The node was not full.
-    _insertNotFull(key, value, index);
-    return null;
-  }
-
-  @override
-  _Remove<K, V> remove(K key, _Node<K, V, N> left, K anchor, _Node<K, V,
-      N> right) {
-    // Find the key.
-    int index = keys.indexOf(key);
-    if (index == -1) {
-      return new _Remove<K, V>(null);
-    }
-    // Remove key / value.
-    keys.removeAt(index);
-    V value = values.removeAt(index);
-    tree._writeLeafNode(this);
-    // Perform balancing.
-    if (keys.length < minKeys) {
-      // Try left sibling.
-      if (left is _LeafNode<K, V, N>) {
-        // Try to redistribute.
-        int leftLength = left.keys.length;
-        if (leftLength > minKeys) {
-          int halfExcess = (leftLength - minKeys + 1) ~/ 2;
-          int newLeftLength = leftLength - halfExcess;
-          keys.insertAll(0, left.keys.getRange(newLeftLength, leftLength));
-          values.insertAll(0, left.values.getRange(newLeftLength, leftLength));
-          left.keys.length = newLeftLength;
-          left.values.length = newLeftLength;
-          tree._writeLeafNode(this);
-          tree._writeLeafNode(left);
-          return new _Remove<K, V>.borrowLeft(value, keys.first);
-        }
-        // Do merge.
-        left.keys.addAll(keys);
-        left.values.addAll(values);
-        tree._writeLeafNode(this);
-        tree._writeLeafNode(left);
-        return new _Remove<K, V>.mergeLeft(value);
-      }
-      // Try right sibling.
-      if (right is _LeafNode<K, V, N>) {
-        // Try to redistribute.
-        int rightLength = right.keys.length;
-        if (rightLength > minKeys) {
-          int halfExcess = (rightLength - minKeys + 1) ~/ 2;
-          keys.addAll(right.keys.getRange(0, halfExcess));
-          values.addAll(right.values.getRange(0, halfExcess));
-          right.keys.removeRange(0, halfExcess);
-          right.values.removeRange(0, halfExcess);
-          tree._writeLeafNode(this);
-          tree._writeLeafNode(right);
-          return new _Remove<K, V>.borrowRight(value, right.keys.first);
-        }
-        // Do merge.
-        right.keys.insertAll(0, keys);
-        right.values.insertAll(0, values);
-        tree._writeLeafNode(this);
-        tree._writeLeafNode(right);
-        return new _Remove<K, V>.mergeRight(value);
-      }
-    }
-    // No balancing required.
-    return new _Remove<K, V>(value);
-  }
-
-  @override
-  void writeOn(StringBuffer buffer, String indent) {
-    buffer.write(indent);
-    buffer.write('LNode {');
-    for (int i = 0; i < keys.length; i++) {
-      if (i != 0) {
-        buffer.write(', ');
-      }
-      buffer.write(keys[i]);
-      buffer.write(': ');
-      buffer.write(values[i]);
-    }
-    buffer.write('}\n');
-  }
-
-  /**
-   * Returns the index where [key] should be inserted.
-   */
-  int _findKeyIndex(K key) {
-    int lo = 0;
-    int hi = keys.length - 1;
-    while (lo <= hi) {
-      int mid = lo + (hi - lo) ~/ 2;
-      int compare = comparator(key, keys[mid]);
-      if (compare < 0) {
-        hi = mid - 1;
-      } else if (compare > 0) {
-        lo = mid + 1;
-      } else {
-        return mid;
-      }
-    }
-    return lo;
-  }
-
-  void _insertNotFull(K key, V value, int index) {
-    if (index < keys.length && comparator(keys[index], key) == 0) {
-      values[index] = value;
-    } else {
-      keys.insert(index, key);
-      values.insert(index, value);
-    }
-    tree._writeLeafNode(this);
-  }
-}
-
-
-/**
- * An internal or leaf node.
- */
-abstract class _Node<K, V, N> {
-  /**
-   * The [Comparator] to compare keys.
-   */
-  final Comparator<K> comparator;
-
-  /**
-   * The identifier of this node.
-   */
-  final N id;
-
-  /**
-   *  The list of keys.
-   */
-  List<K> keys = new List<K>();
-
-  /**
-   * The [NodeManager] for this tree.
-   */
-  final NodeManager<K, V, N> manager;
-
-  /**
-   * The [BPlusTree] this node belongs to.
-   */
-  final BPlusTree<K, V, N> tree;
-
-  _Node(BPlusTree<K, V, N> tree, this.id)
-      : tree = tree,
-        comparator = tree._comparator,
-        manager = tree._manager;
-
-  /**
-   * Looks for [key].
-   *
-   * Returns the associated value if found.
-   * Returns `null` if not found.
-   */
-  V find(K key);
-
-  /**
-   * Inserts the [key] / [value] pair into this [_Node].
-   *
-   * Returns a [_Split] object if split happens, or `null` otherwise.
-   */
-  _Split<K, N> insert(K key, V value);
-
-  /**
-   * Removes the association for the given [key].
-   *
-   * Returns the [_Remove] information about an operation performed.
-   * It may be restructuring or merging, with [left] or [left] siblings.
-   */
-  _Remove<K, V> remove(K key, _Node<K, V, N> left, K anchor, _Node<K, V,
-      N> right);
-
-  /**
-   * Writes a textual presentation of the tree into [buffer].
-   */
-  void writeOn(StringBuffer buffer, String indent);
-}
-
-
-/**
- * A container with information about redistribute / merge.
- */
-class _Remove<K, V> {
-  K leftAnchor;
-  bool mergedLeft = false;
-  bool mergedRight = false;
-  K rightAnchor;
-  final V value;
-  _Remove(this.value);
-  _Remove.borrowLeft(this.value, this.leftAnchor);
-  _Remove.borrowRight(this.value, this.rightAnchor);
-  _Remove.mergeLeft(this.value) : mergedLeft = true;
-  _Remove.mergeRight(this.value) : mergedRight = true;
-}
-
-
-/**
- * A container with information about split during insert.
- */
-class _Split<K, N> {
-  final K key;
-  final N left;
-  final N right;
-  _Split(this.key, this.left, this.right);
-}
diff --git a/pkg/analysis_server/lib/src/index/file_page_manager.dart b/pkg/analysis_server/lib/src/index/file_page_manager.dart
deleted file mode 100644
index 55c2c75..0000000
--- a/pkg/analysis_server/lib/src/index/file_page_manager.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library index.file_page_manager;
-
-import 'dart:io';
-import 'dart:typed_data';
-
-import 'package:analysis_server/src/index/page_node_manager.dart';
-
-
-/**
- * A [PageManager] that stores pages on disk.
- */
-class FilePageManager implements PageManager {
-  final int pageSizeInBytes;
-
-  RandomAccessFile _file;
-  File _fileRef;
-  List<int> _freePagesList = new List<int>();
-  Set<int> _freePagesSet = new Set<int>();
-  int _nextPage = 0;
-
-  FilePageManager(this.pageSizeInBytes, String path) {
-    _fileRef = new File(path);
-    _file = _fileRef.openSync(mode: FileMode.WRITE);
-  }
-
-  @override
-  int alloc() {
-    if (_freePagesList.isNotEmpty) {
-      int id = _freePagesList.removeLast();
-      _freePagesSet.remove(id);
-      return id;
-    }
-    int id = _nextPage++;
-    Uint8List page = new Uint8List(pageSizeInBytes);
-    _file.setPositionSync(id * pageSizeInBytes);
-    _file.writeFromSync(page);
-    return id;
-  }
-
-  /**
-   * Closes this [FilePageManager].
-   */
-  void close() {
-    _file.closeSync();
-  }
-
-  /**
-   * Deletes the underlaying file.
-   */
-  void delete() {
-    if (_fileRef.existsSync()) {
-      _fileRef.deleteSync();
-    }
-  }
-
-  @override
-  void free(int id) {
-    if (!_freePagesSet.add(id)) {
-      throw new StateError('Page $id has been already freed.');
-    }
-    _freePagesList.add(id);
-  }
-
-  @override
-  Uint8List read(int id) {
-    Uint8List page = new Uint8List(pageSizeInBytes);
-    _file.setPositionSync(id * pageSizeInBytes);
-    int actual = 0;
-    while (actual != page.length) {
-      actual += _file.readIntoSync(page, actual);
-    }
-    return page;
-  }
-
-  @override
-  void write(int id, Uint8List page) {
-    _file.setPositionSync(id * pageSizeInBytes);
-    _file.writeFromSync(page);
-  }
-}
diff --git a/pkg/analysis_server/lib/src/index/index.dart b/pkg/analysis_server/lib/src/index/index.dart
deleted file mode 100644
index 023cfc9..0000000
--- a/pkg/analysis_server/lib/src/index/index.dart
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library index;
-
-import 'dart:async';
-import 'dart:io';
-
-import 'package:analysis_server/src/index/store/codec.dart';
-import 'package:analysis_server/src/index/store/separate_file_manager.dart';
-import 'package:analysis_server/src/index/store/split_store.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/html.dart';
-import 'package:analyzer/src/generated/index.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-
-Index createLocalFileSplitIndex(Directory directory) {
-  var fileManager = new SeparateFileManager(directory);
-  var stringCodec = new StringCodec();
-  var nodeManager = new FileNodeManager(fileManager,
-      AnalysisEngine.instance.logger, stringCodec, new ContextCodec(),
-      new ElementCodec(stringCodec), new RelationshipCodec(stringCodec));
-  return new LocalIndex(nodeManager);
-}
-
-
-/**
- * A local implementation of [Index].
- */
-class LocalIndex extends Index {
-  SplitIndexStore _store;
-
-  LocalIndex(NodeManager nodeManager) {
-    _store = new SplitIndexStore(nodeManager);
-  }
-
-  @override
-  String get statistics => _store.statistics;
-
-  @override
-  void clear() {
-    _store.clear();
-  }
-
-  @override
-  void getRelationships(Element element, Relationship relationship,
-      RelationshipCallback callback) {
-    // TODO(scheglov) update Index API to use asynchronous interface
-    callback.hasRelationships(element, relationship, Location.EMPTY_ARRAY);
-  }
-
-  /**
-   * Returns a `Future<List<Location>>` that completes with the list of
-   * [Location]s of the given [relationship] with the given [element].
-   *
-   * For example, if the [element] represents a function and the [relationship]
-   * is the `is-invoked-by` relationship, then the locations will be all of the
-   * places where the function is invoked.
-   */
-  Future<List<Location>> getRelationshipsAsync(Element element,
-      Relationship relationship) {
-    return _store.getRelationshipsAsync(element, relationship);
-  }
-
-  @override
-  void indexHtmlUnit(AnalysisContext context, HtmlUnit unit) {
-    if (unit == null) {
-      return;
-    }
-    if (unit.element == null) {
-      return;
-    }
-    new IndexHtmlUnitOperation(_store, context, unit).performOperation();
-  }
-
-  @override
-  void indexUnit(AnalysisContext context, CompilationUnit unit) {
-    if (unit == null) {
-      return;
-    }
-    if (unit.element == null) {
-      return;
-    }
-    new IndexUnitOperation(_store, context, unit).performOperation();
-  }
-
-  @override
-  void removeContext(AnalysisContext context) {
-    _store.removeContext(context);
-  }
-
-  @override
-  void removeSource(AnalysisContext context, Source source) {
-    _store.removeSource(context, source);
-  }
-
-  @override
-  void removeSources(AnalysisContext context, SourceContainer container) {
-    _store.removeSources(context, container);
-  }
-
-  @override
-  void run() {
-    // NO-OP if in the same isolate
-  }
-
-  @override
-  void stop() {
-    // NO-OP if in the same isolate
-  }
-}
diff --git a/pkg/analysis_server/lib/src/index/lru_cache.dart b/pkg/analysis_server/lib/src/index/lru_cache.dart
deleted file mode 100644
index 82dfeb5..0000000
--- a/pkg/analysis_server/lib/src/index/lru_cache.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library index.lru_cache;
-
-import 'dart:collection';
-
-
-/**
- * This handler is notified when an item is evicted from the cache.
- */
-typedef EvictionHandler<K, V>(K key, V value);
-
-/**
- * A hash-table based cache implementation.
- *
- * When it reaches the specified number of items, the item that has not been
- * accessed (both get and put) recently is evicted.
- */
-class LRUCache<K, V> {
-  final LinkedHashSet<K> _lastKeys = new LinkedHashSet<K>();
-  final HashMap<K, V> _map = new HashMap<K, V>();
-  final int _maxSize;
-  final EvictionHandler _handler;
-
-  LRUCache(this._maxSize, [this._handler]);
-
-  /**
-   * Returns the value for the given [key] or null if [key] is not
-   * in the cache.
-   */
-  V get(K key) {
-    V value = _map[key];
-    if (value != null) {
-      _lastKeys.remove(key);
-      _lastKeys.add(key);
-    }
-    return value;
-  }
-
-  /**
-   * Removes the association for the given [key].
-   */
-  void remove(K key) {
-    _lastKeys.remove(key);
-    _map.remove(key);
-  }
-
-  /**
-   * Associates the [key] with the given [value].
-   *
-   * If the cache is full, an item that has not been accessed recently is
-   * evicted.
-   */
-  void put(K key, V value) {
-    _lastKeys.remove(key);
-    _lastKeys.add(key);
-    if (_lastKeys.length > _maxSize) {
-      K evictedKey = _lastKeys.first;
-      V evictedValue = _map.remove(evictedKey);
-      _lastKeys.remove(evictedKey);
-      if (_handler != null) {
-        _handler(evictedKey, evictedValue);
-      }
-    }
-    _map[key] = value;
-  }
-}
diff --git a/pkg/analysis_server/lib/src/index/page_node_manager.dart b/pkg/analysis_server/lib/src/index/page_node_manager.dart
deleted file mode 100644
index e03374a..0000000
--- a/pkg/analysis_server/lib/src/index/page_node_manager.dart
+++ /dev/null
@@ -1,461 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library index.page_node_manager;
-
-import 'dart:collection';
-import 'dart:typed_data';
-
-import 'package:analysis_server/src/index/b_plus_tree.dart';
-import 'package:analysis_server/src/index/lru_cache.dart';
-
-
-/**
- * A [NodeManager] that caches a specified number of index and leaf nodes.
- */
-class CachingNodeManager<K, V, N> implements NodeManager<K, V, N> {
-  final NodeManager<K, V, N> _delegate;
-  LRUCache<N, IndexNodeData<K, N>> _indexCache;
-  LRUCache<N, LeafNodeData<K, V>> _leafCache;
-
-  CachingNodeManager(this._delegate, int indexNodeCacheSize,
-      int leafNodeCacheSize) {
-    _indexCache = new LRUCache<N, IndexNodeData<K, N>>(indexNodeCacheSize,
-        _delegate.writeIndex);
-    _leafCache = new LRUCache<N, LeafNodeData<K, V>>(leafNodeCacheSize,
-        _delegate.writeLeaf);
-  }
-
-  @override
-  int get maxIndexKeys => _delegate.maxIndexKeys;
-
-  @override
-  int get maxLeafKeys => _delegate.maxLeafKeys;
-
-  @override
-  N createIndex() {
-    return _delegate.createIndex();
-  }
-
-  @override
-  N createLeaf() {
-    return _delegate.createLeaf();
-  }
-
-  @override
-  void delete(N id) {
-    _indexCache.remove(id);
-    _leafCache.remove(id);
-    _delegate.delete(id);
-  }
-
-  @override
-  bool isIndex(N id) {
-    return _delegate.isIndex(id);
-  }
-
-  @override
-  IndexNodeData<K, N> readIndex(N id) {
-    IndexNodeData<K, N> data = _indexCache.get(id);
-    if (data == null) {
-      data = _delegate.readIndex(id);
-      _indexCache.put(id, data);
-    }
-    return data;
-  }
-
-  @override
-  LeafNodeData<K, V> readLeaf(N id) {
-    LeafNodeData<K, V> data = _leafCache.get(id);
-    if (data == null) {
-      data = _delegate.readLeaf(id);
-      _leafCache.put(id, data);
-    }
-    return data;
-  }
-
-  @override
-  void writeIndex(N id, IndexNodeData<K, N> data) {
-    _indexCache.put(id, data);
-  }
-
-  @override
-  void writeLeaf(N id, LeafNodeData<K, V> data) {
-    _leafCache.put(id, data);
-  }
-}
-
-
-/**
- * A [Codec] encodes and decodes data.
- */
-abstract class Codec<E> {
-  /**
-   * The size of the value in bytes.
-   */
-  int get sizeInBytes;
-
-  /**
-   * Returns the value decoded from [buffer].
-   *
-   * The given [buffer] has exactly [sizeInBytes] bytes length.
-   */
-  E decode(ByteData buffer);
-
-  /**
-   * Encodes [value] into [buffer].
-   *
-   * The given [buffer] has exactly [sizeInBytes] bytes length.
-   */
-  void encode(ByteData buffer, E value);
-}
-
-
-/**
- * A [Codec] for strings with a predefined maximum length.
- */
-class FixedStringCodec implements Codec<String> {
-  final int maxLength;
-  final int sizeInBytes;
-
-  const FixedStringCodec(int maxLength)
-      : maxLength = maxLength,
-        sizeInBytes = 2 + 2 * maxLength;
-
-  @override
-  String decode(ByteData buffer) {
-    int length = buffer.getUint16(0);
-    int offset = 2;
-    List<int> codeUnits = new List<int>(length);
-    for (int i = 0; i < length; i++) {
-      codeUnits[i] = buffer.getUint16(offset);
-      offset += 2;
-    }
-    return new String.fromCharCodes(codeUnits);
-  }
-
-  @override
-  void encode(ByteData buffer, String value) {
-    int length = value.length;
-    if (length > maxLength) {
-      throw new ArgumentError(
-          'String $value length=$length is greater than allowed $maxLength');
-    }
-    buffer.setUint16(0, length);
-    int offset = 2;
-    List<int> codeUnits = value.codeUnits;
-    for (int i = 0; i < length; i++) {
-      buffer.setUint16(offset, codeUnits[i]);
-      offset += 2;
-    }
-  }
-}
-
-
-/**
- * A [PageManager] that keeps all [Uint8List] pages in memory.
- */
-class MemoryPageManager implements PageManager {
-  final int pageSizeInBytes;
-  int _nextPage = 0;
-  final Map<int, Uint8List> _pages = new HashMap<int, Uint8List>();
-
-  MemoryPageManager(this.pageSizeInBytes);
-
-  @override
-  int alloc() {
-    int id = _nextPage++;
-    Uint8List page = new Uint8List(pageSizeInBytes);
-    _pages[id] = page;
-    return id;
-  }
-
-  @override
-  void free(int id) {
-    Uint8List page = _pages.remove(id);
-    if (page == null) {
-      throw new StateError('Page $id has been already freed.');
-    }
-  }
-
-  @override
-  Uint8List read(int id) {
-    Uint8List page = _pages[id];
-    if (page == null) {
-      throw new StateError('Page $id does not exist.');
-    }
-    return page;
-  }
-
-  @override
-  void write(int id, Uint8List page) {
-    if (!_pages.containsKey(id)) {
-      throw new StateError('Page $id does not exist.');
-    }
-    if (page.length != pageSizeInBytes) {
-      throw new ArgumentError('Page $id has length ${page.length}, '
-          'but $pageSizeInBytes is expected.');
-    }
-    _pages[id] = page;
-  }
-}
-
-
-/**
- * [PageManager] allows to allocate, read, write and free [Uint8List] pages.
- */
-abstract class PageManager {
-  /**
-   * The size of pages provided by this [PageManager].
-   */
-  int get pageSizeInBytes;
-
-  /**
-   * Allocates a new page and returns its identifier.
-   */
-  int alloc();
-
-  /**
-   * Frees the page with the given identifier.
-   */
-  void free(int id);
-
-  /**
-   * Reads the page with the given identifier and returns its content.
-   *
-   * An internal representation of the page is returned, any changes made to it
-   * may be accessible to other clients reading the same page.
-   */
-  Uint8List read(int id);
-
-  /**
-   * Writes the given page.
-   */
-  void write(int id, Uint8List page);
-}
-
-
-/**
- * A [NodeManager] that keeps nodes in [PageManager].
- */
-class PageNodeManager<K, V> implements NodeManager<K, V, int> {
-  static const int _INDEX_OFFSET_DATA = 4;
-  static const int _INDEX_OFFSET_KEY_COUNT = 0;
-  static const int _LEAF_OFFSET_DATA = 4;
-  static const int _LEAF_OFFSET_KEY_COUNT = 0;
-
-  final Set<int> _indexPages = new HashSet<int>();
-  Codec<K> _keyCodec;
-  final Set<int> _leafPages = new HashSet<int>();
-  PageManager _pageManager;
-  Codec<V> _valueCodec;
-
-  PageNodeManager(this._pageManager, this._keyCodec, this._valueCodec);
-
-  @override
-  int get maxIndexKeys {
-    int keySize = _keyCodec.sizeInBytes;
-    int childSize = 4;
-    int dataSize = _pageManager.pageSizeInBytes - _INDEX_OFFSET_DATA;
-    return (dataSize - childSize) ~/ (keySize + childSize);
-  }
-
-  @override
-  int get maxLeafKeys {
-    int keySize = _keyCodec.sizeInBytes;
-    int valueSize = _valueCodec.sizeInBytes;
-    int dataSize = _pageManager.pageSizeInBytes - _INDEX_OFFSET_DATA;
-    return dataSize ~/ (keySize + valueSize);
-  }
-
-  @override
-  int createIndex() {
-    int id = _pageManager.alloc();
-    _indexPages.add(id);
-    return id;
-  }
-
-  @override
-  int createLeaf() {
-    int id = _pageManager.alloc();
-    _leafPages.add(id);
-    return id;
-  }
-
-  @override
-  void delete(int id) {
-    _pageManager.free(id);
-    _indexPages.remove(id);
-    _leafPages.remove(id);
-  }
-
-  @override
-  bool isIndex(int id) {
-    return _indexPages.contains(id);
-  }
-
-  @override
-  IndexNodeData<K, int> readIndex(int id) {
-    Uint8List page = _pageManager.read(id);
-    // read header
-    int keyCount;
-    {
-      ByteData data = new ByteData.view(page.buffer);
-      keyCount = data.getInt32(_INDEX_OFFSET_KEY_COUNT);
-    }
-    // read keys/children
-    List<K> keys = new List<K>();
-    List<int> children = new List<int>();
-    int keySize = _keyCodec.sizeInBytes;
-    int offset = _INDEX_OFFSET_DATA;
-    for (int i = 0; i < keyCount; i++) {
-      // read child
-      {
-        ByteData byteData = new ByteData.view(page.buffer, offset);
-        int childPage = byteData.getUint32(0);
-        children.add(childPage);
-        offset += 4;
-      }
-      // read key
-      {
-        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
-        K key = _keyCodec.decode(byteData);
-        keys.add(key);
-        offset += keySize;
-      }
-    }
-    // read last child
-    {
-      ByteData byteData = new ByteData.view(page.buffer, offset);
-      int childPage = byteData.getUint32(0);
-      children.add(childPage);
-    }
-    // done
-    return new IndexNodeData<K, int>(keys, children);
-  }
-
-  @override
-  LeafNodeData<K, V> readLeaf(int id) {
-    Uint8List page = _pageManager.read(id);
-    // read header
-    int keyCount;
-    {
-      ByteData data = new ByteData.view(page.buffer);
-      keyCount = data.getInt32(_LEAF_OFFSET_KEY_COUNT);
-    }
-    // read keys/children
-    List<K> keys = new List<K>();
-    List<V> values = new List<V>();
-    int keySize = _keyCodec.sizeInBytes;
-    int valueSize = _valueCodec.sizeInBytes;
-    int offset = _LEAF_OFFSET_DATA;
-    for (int i = 0; i < keyCount; i++) {
-      // read key
-      {
-        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
-        K key = _keyCodec.decode(byteData);
-        keys.add(key);
-        offset += keySize;
-      }
-      // read value
-      {
-        ByteData byteData = new ByteData.view(page.buffer, offset);
-        V value = _valueCodec.decode(byteData);
-        values.add(value);
-        offset += valueSize;
-      }
-    }
-    // done
-    return new LeafNodeData<K, V>(keys, values);
-  }
-
-  @override
-  void writeIndex(int id, IndexNodeData<K, int> data) {
-    Uint8List page = new Uint8List(_pageManager.pageSizeInBytes);
-    // write header
-    int keyCount = data.keys.length;
-    {
-      ByteData byteData = new ByteData.view(page.buffer);
-      byteData.setUint32(PageNodeManager._INDEX_OFFSET_KEY_COUNT, keyCount);
-    }
-    // write keys/children
-    int keySize = _keyCodec.sizeInBytes;
-    int offset = PageNodeManager._INDEX_OFFSET_DATA;
-    for (int i = 0; i < keyCount; i++) {
-      // write child
-      {
-        ByteData byteData = new ByteData.view(page.buffer, offset);
-        byteData.setUint32(0, data.children[i]);
-        offset += 4;
-      }
-      // write key
-      {
-        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
-        _keyCodec.encode(byteData, data.keys[i]);
-        offset += keySize;
-      }
-    }
-    // write last child
-    {
-      ByteData byteData = new ByteData.view(page.buffer, offset);
-      byteData.setUint32(0, data.children.last);
-    }
-    // write page
-    _pageManager.write(id, page);
-  }
-
-  @override
-  void writeLeaf(int id, LeafNodeData<K, V> data) {
-    Uint8List page = new Uint8List(_pageManager.pageSizeInBytes);
-    // write header
-    int keyCount = data.keys.length;
-    {
-      ByteData byteData = new ByteData.view(page.buffer);
-      byteData.setUint32(PageNodeManager._LEAF_OFFSET_KEY_COUNT, keyCount);
-    }
-    // write keys/values
-    int keySize = _keyCodec.sizeInBytes;
-    int valueSize = _valueCodec.sizeInBytes;
-    int offset = PageNodeManager._LEAF_OFFSET_DATA;
-    for (int i = 0; i < keyCount; i++) {
-      // write key
-      {
-        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
-        _keyCodec.encode(byteData, data.keys[i]);
-        offset += keySize;
-      }
-      // write value
-      {
-        ByteData byteData = new ByteData.view(page.buffer, offset);
-        _valueCodec.encode(byteData, data.values[i]);
-        offset += valueSize;
-      }
-    }
-    // write page
-    _pageManager.write(id, page);
-  }
-}
-
-
-/**
- * A [Codec] for unsigned 32-bit integers.
- */
-class Uint32Codec implements Codec<int> {
-  static const Uint32Codec INSTANCE = const Uint32Codec._();
-
-  const Uint32Codec._();
-
-  @override
-  int get sizeInBytes => 4;
-
-  @override
-  int decode(ByteData buffer) {
-    return buffer.getUint32(0);
-  }
-
-  @override
-  void encode(ByteData buffer, int element) {
-    buffer.setUint32(0, element);
-  }
-}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index ce9597f..96eb77a 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -7,15 +7,17 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/computer/computer_highlights.dart';
 import 'package:analysis_server/src/computer/computer_navigation.dart';
+import 'package:analysis_server/src/computer/computer_occurrences.dart';
 import 'package:analysis_server/src/computer/computer_outline.dart';
+import 'package:analysis_server/src/computer/computer_overrides.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_services/index/index.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/html.dart';
-import 'package:analyzer/src/generated/index.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -84,6 +86,16 @@
 }
 
 
+void sendAnalysisNotificationOccurrences(AnalysisServer server, String file,
+    CompilationUnit dartUnit) {
+  Notification notification = new Notification(ANALYSIS_OCCURRENCES);
+  notification.setParameter(FILE, file);
+  notification.setParameter(OCCURRENCES, new DartUnitOccurrencesComputer(
+      dartUnit).compute());
+  server.sendNotification(notification);
+}
+
+
 void sendAnalysisNotificationOutline(AnalysisServer server,
     AnalysisContext context, Source source, CompilationUnit dartUnit) {
   Notification notification = new Notification(ANALYSIS_OUTLINE);
@@ -94,6 +106,16 @@
 }
 
 
+void sendAnalysisNotificationOverrides(AnalysisServer server,
+    String file, CompilationUnit dartUnit) {
+  Notification notification = new Notification(ANALYSIS_OVERRIDES);
+  notification.setParameter(FILE, file);
+  notification.setParameter(OVERRIDES, new DartUnitOverridesComputer(
+      dartUnit).compute());
+  server.sendNotification(notification);
+}
+
+
 /**
  * Instances of [PerformAnalysisOperation] perform a single analysis task.
  */
@@ -152,9 +174,15 @@
         if (server.hasAnalysisSubscription(AnalysisService.NAVIGATION, file)) {
           sendAnalysisNotificationNavigation(server, file, dartUnit);
         }
+        if (server.hasAnalysisSubscription(AnalysisService.OCCURRENCES, file)) {
+          sendAnalysisNotificationOccurrences(server, file, dartUnit);
+        }
         if (server.hasAnalysisSubscription(AnalysisService.OUTLINE, file)) {
           sendAnalysisNotificationOutline(server, context, source, dartUnit);
         }
+        if (server.hasAnalysisSubscription(AnalysisService.OVERRIDES, file)) {
+          sendAnalysisNotificationOverrides(server, file, dartUnit);
+        }
       }
       // TODO(scheglov) use default subscriptions
       if (!source.isInSystemLibrary) {
diff --git a/pkg/analysis_server/lib/src/package_map_provider.dart b/pkg/analysis_server/lib/src/package_map_provider.dart
index 34b36a9..bf031c4 100644
--- a/pkg/analysis_server/lib/src/package_map_provider.dart
+++ b/pkg/analysis_server/lib/src/package_map_provider.dart
@@ -9,25 +9,11 @@
 import 'dart:io' as io;
 
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:path/path.dart';
 
 /**
- * A PackageMapProvider is an entity capable of determining the mapping from
- * package name to source directory for a given folder.
- */
-abstract class PackageMapProvider {
-  /**
-   * Compute a package map for the given folder, if possible.
-   *
-   * If a package map can't be computed (e.g. because an error occurred), a
-   * [PackageMapInfo] will still be returned, but its packageMap will be null.
-   */
-  PackageMapInfo computePackageMap(Folder folder);
-}
-
-/**
  * Data structure output by PackageMapProvider.  This contains both the package
  * map and dependency information.
  */
@@ -51,6 +37,20 @@
 }
 
 /**
+ * A PackageMapProvider is an entity capable of determining the mapping from
+ * package name to source directory for a given folder.
+ */
+abstract class PackageMapProvider {
+  /**
+   * Compute a package map for the given folder, if possible.
+   *
+   * If a package map can't be computed (e.g. because an error occurred), a
+   * [PackageMapInfo] will still be returned, but its packageMap will be null.
+   */
+  PackageMapInfo computePackageMap(Folder folder);
+}
+
+/**
  * Implementation of PackageMapProvider that operates by executing pub.
  */
 class PubPackageMapProvider implements PackageMapProvider {
@@ -100,18 +100,6 @@
   }
 
   /**
-   * Create a PackageMapInfo object representing an error condition.
-   */
-  PackageMapInfo _error(Folder folder) {
-    // Even if an error occurs, we still need to know the dependencies, so that
-    // we'll know when to try running "pub list-package-dirs" again.
-    // Unfortunately, "pub list-package-dirs" doesn't tell us dependencies when
-    // an error occurs, so just assume there is one dependency, "pubspec.lock".
-    List<String> dependencies = <String>[join(folder.path, PUBSPEC_LOCK_NAME)];
-    return new PackageMapInfo(null, dependencies.toSet());
-  }
-
-  /**
    * Decode the JSON output from pub into a package map.  Paths in the
    * output are considered relative to [folder].
    */
@@ -162,4 +150,16 @@
     }
     return new PackageMapInfo(packageMap, dependencies);
   }
+
+  /**
+   * Create a PackageMapInfo object representing an error condition.
+   */
+  PackageMapInfo _error(Folder folder) {
+    // Even if an error occurs, we still need to know the dependencies, so that
+    // we'll know when to try running "pub list-package-dirs" again.
+    // Unfortunately, "pub list-package-dirs" doesn't tell us dependencies when
+    // an error occurs, so just assume there is one dependency, "pubspec.lock".
+    List<String> dependencies = <String>[join(folder.path, PUBSPEC_LOCK_NAME)];
+    return new PackageMapInfo(null, dependencies.toSet());
+  }
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/package_uri_resolver.dart b/pkg/analysis_server/lib/src/package_uri_resolver.dart
index 2aaaca9..9f6d042 100644
--- a/pkg/analysis_server/lib/src/package_uri_resolver.dart
+++ b/pkg/analysis_server/lib/src/package_uri_resolver.dart
@@ -4,8 +4,8 @@
 
 library resolver.package;
 
-import 'package:analysis_server/src/resource.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
 
 
 /**
diff --git a/pkg/analysis_server/lib/src/resource.dart b/pkg/analysis_server/lib/src/resource.dart
deleted file mode 100644
index 8110ebf..0000000
--- a/pkg/analysis_server/lib/src/resource.dart
+++ /dev/null
@@ -1,596 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library resource;
-
-import 'dart:async';
-import 'dart:collection';
-import 'dart:io' as io;
-
-import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
-import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:path/path.dart';
-import 'package:watcher/watcher.dart';
-
-
-/**
- * [File]s are leaf [Resource]s which contain data.
- */
-abstract class File extends Resource {
-  /**
-   * Create a new [Source] instance that serves this file.
-   */
-  Source createSource(UriKind uriKind);
-}
-
-
-/**
- * [Folder]s are [Resource]s which may contain files and/or other folders.
- */
-abstract class Folder extends Resource {
-  /**
-   * Return an existing child [Resource] with the given [relPath].
-   * Return a not existing [File] if no such child exist.
-   */
-  Resource getChild(String relPath);
-
-  /**
-   * Return a list of existing direct children [Resource]s (folders and files)
-   * in this folder, in no particular order.
-   */
-  List<Resource> getChildren();
-
-  /**
-   * Watch for changes to the files inside this folder (and in any nested
-   * folders, including folders reachable via links).
-   */
-  Stream<WatchEvent> get changes;
-
-  /**
-   * If the path [path] is a relative path, convert it to an absolute path
-   * by interpreting it relative to this folder.  If it is already an aboslute
-   * path, then don't change it.
-   *
-   * However, regardless of whether [path] is relative or absolute, normalize
-   * it by removing path components of the form '.' or '..'.
-   */
-  String canonicalizePath(String path);
-}
-
-
-/**
- * The abstract class [Resource] is an abstraction of file or folder.
- */
-abstract class Resource {
-  /**
-   * Return `true` if this resource exists.
-   */
-  bool get exists;
-
-  /**
-   * Return the full path to this resource.
-   */
-  String get path;
-
-  /**
-   * Return a short version of the name that can be displayed to the user to
-   * denote this resource.
-   */
-  String get shortName;
-
-  /**
-   * Return the [Folder] that contains this resource, or `null` if this resource
-   * is a root folder.
-   */
-  Folder get parent;
-}
-
-
-/**
- * Instances of the class [ResourceProvider] convert [String] paths into
- * [Resource]s.
- */
-abstract class ResourceProvider {
-  /**
-   * Return the [Resource] that corresponds to the given [path].
-   */
-  Resource getResource(String path);
-
-  /**
-   * Get the path context used by this resource provider.
-   */
-  Context get pathContext;
-}
-
-
-/**
- * An in-memory implementation of [Resource].
- */
-abstract class _MemoryResource implements Resource {
-  final MemoryResourceProvider _provider;
-  final String path;
-
-  _MemoryResource(this._provider, this.path);
-
-  @override
-  bool operator ==(other) {
-    if (runtimeType != other.runtimeType) {
-      return false;
-    }
-    return path == other.path;
-  }
-
-  @override
-  bool get exists => _provider._pathToResource.containsKey(path);
-
-  @override
-  get hashCode => path.hashCode;
-
-  @override
-  String get shortName => posix.basename(path);
-
-  @override
-  String toString() => path;
-
-  @override
-  Folder get parent {
-    String parentPath = posix.dirname(path);
-    if (parentPath == path) {
-      return null;
-    }
-    return _provider.getResource(parentPath);
-  }
-}
-
-
-/**
- * An in-memory implementation of [File].
- */
-class _MemoryFile extends _MemoryResource implements File {
-  _MemoryFile(MemoryResourceProvider provider, String path) :
-      super(provider, path);
-
-  @override
-  Source createSource(UriKind uriKind) {
-    return new _MemoryFileSource(this, uriKind);
-  }
-
-  String get _content {
-    String content = _provider._pathToContent[path];
-    if (content == null) {
-      throw new MemoryResourceException(path, "File '$path' does not exist");
-    }
-    return content;
-  }
-
-  int get _timestamp => _provider._pathToTimestamp[path];
-}
-
-
-/**
- * Exception thrown when a memory [Resource] file operation fails.
- */
-class MemoryResourceException {
-  final path;
-  final message;
-
-  MemoryResourceException(this.path, this.message);
-
-  @override
-  String toString() {
-    return "MemoryResourceException(path=$path; message=$message)";
-  }
-}
-
-
-/**
- * An in-memory implementation of [File] which acts like a symbolic link to a
- * non-existent file.
- */
-class _MemoryDummyLink extends _MemoryResource implements File {
-  _MemoryDummyLink(MemoryResourceProvider provider, String path) :
-      super(provider, path);
-
-  @override
-  Source createSource(UriKind uriKind) {
-    throw new MemoryResourceException(path, "File '$path' could not be read");
-  }
-
-  String get _content {
-    throw new MemoryResourceException(path, "File '$path' could not be read");
-  }
-
-  int get _timestamp => _provider._pathToTimestamp[path];
-
-  @override
-  bool get exists => false;
-}
-
-
-/**
- * An in-memory implementation of [Source].
- */
-class _MemoryFileSource implements Source {
-  final _MemoryFile _file;
-
-  final UriKind uriKind;
-
-  _MemoryFileSource(this._file, this.uriKind);
-
-  @override
-  bool operator ==(other) {
-    if (other is _MemoryFileSource) {
-      return other._file == _file;
-    }
-    return false;
-  }
-
-  @override
-  TimestampedData<String> get contents {
-    return new TimestampedData<String>(modificationStamp, _file._content);
-  }
-
-  @override
-  String get encoding {
-    return '${new String.fromCharCode(uriKind.encoding)}${_file.path}';
-  }
-
-  @override
-  bool exists() => _file.exists;
-
-  @override
-  String get fullName => _file.path;
-
-  @override
-  int get hashCode => _file.hashCode;
-
-  @override
-  bool get isInSystemLibrary => false;
-
-  @override
-  int get modificationStamp => _file._timestamp;
-
-  @override
-  Source resolveRelative(Uri relativeUri) {
-    String relativePath = posix.fromUri(relativeUri);
-    String folderPath = posix.dirname(_file.path);
-    String path = posix.join(folderPath, relativePath);
-    path = posix.normalize(path);
-    _MemoryFile file = new _MemoryFile(_file._provider, path);
-    return new _MemoryFileSource(file, uriKind);
-  }
-
-  @override
-  String get shortName => _file.shortName;
-}
-
-
-/**
- * An in-memory implementation of [Folder].
- */
-class _MemoryFolder extends _MemoryResource implements Folder {
-  _MemoryFolder(MemoryResourceProvider provider, String path) :
-      super(provider, path);
-  @override
-  Resource getChild(String relPath) {
-    String childPath = canonicalizePath(relPath);
-    _MemoryResource resource = _provider._pathToResource[childPath];
-    if (resource == null) {
-      resource = new _MemoryFile(_provider, childPath);
-    }
-    return resource;
-  }
-
-  @override
-  List<Resource> getChildren() {
-    List<Resource> children = <Resource>[];
-    _provider._pathToResource.forEach((resourcePath, resource) {
-      if (posix.dirname(resourcePath) == path) {
-        children.add(resource);
-      }
-    });
-    return children;
-  }
-
-  @override
-  Stream<WatchEvent> get changes {
-    StreamController<WatchEvent> streamController = new StreamController<WatchEvent>();
-    if (!_provider._pathToWatchers.containsKey(path)) {
-      _provider._pathToWatchers[path] = <StreamController<WatchEvent>>[];
-    }
-    _provider._pathToWatchers[path].add(streamController);
-    streamController.done.then((_) {
-      _provider._pathToWatchers[path].remove(streamController);
-      if (_provider._pathToWatchers[path].isEmpty) {
-        _provider._pathToWatchers.remove(path);
-      }
-    });
-    return streamController.stream;
-  }
-
-  @override
-  String canonicalizePath(String relPath) {
-    relPath = posix.normalize(relPath);
-    String childPath = posix.join(path, relPath);
-    childPath = posix.normalize(childPath);
-    return childPath;
-  }
-}
-
-
-/**
- * An in-memory implementation of [ResourceProvider].
- * Use `/` as a path separator.
- */
-class MemoryResourceProvider implements ResourceProvider {
-  final Map<String, _MemoryResource> _pathToResource =
-      new HashMap<String, _MemoryResource>();
-  final Map<String, String> _pathToContent = new HashMap<String, String>();
-  final Map<String, int> _pathToTimestamp = new HashMap<String, int>();
-  final Map<String, List<StreamController<WatchEvent>>> _pathToWatchers =
-      new HashMap<String, List<StreamController<WatchEvent>>>();
-  int nextStamp = 0;
-
-  @override
-  Resource getResource(String path) {
-    path = posix.normalize(path);
-    Resource resource = _pathToResource[path];
-    if (resource == null) {
-      resource = new _MemoryFile(this, path);
-    }
-    return resource;
-  }
-
-  Folder newFolder(String path) {
-    path = posix.normalize(path);
-    if (!path.startsWith('/')) {
-      throw new ArgumentError("Path must start with '/'");
-    }
-    _MemoryResource resource = _pathToResource[path];
-    if (resource == null) {
-      String parentPath = posix.dirname(path);
-      if (parentPath != path) {
-        newFolder(parentPath);
-      }
-      _MemoryFolder folder = new _MemoryFolder(this, path);
-      _pathToResource[path] = folder;
-      _pathToTimestamp[path] = nextStamp++;
-      return folder;
-    } else if (resource is _MemoryFolder) {
-      return resource;
-    } else {
-      String message = 'Folder expected at '
-                       "'$path'"
-                       'but ${resource.runtimeType} found';
-      throw new ArgumentError(message);
-    }
-  }
-
-  File newFile(String path, String content) {
-    path = posix.normalize(path);
-    newFolder(posix.dirname(path));
-    _MemoryFile file = new _MemoryFile(this, path);
-    _pathToResource[path] = file;
-    _pathToContent[path] = content;
-    _pathToTimestamp[path] = nextStamp++;
-    _notifyWatchers(path, ChangeType.ADD);
-    return file;
-  }
-
-  /**
-   * Create a resource representing a dummy link (that is, a File object which
-   * appears in its parent directory, but whose `exists` property is false)
-   */
-  File newDummyLink(String path) {
-    path = posix.normalize(path);
-    newFolder(posix.dirname(path));
-    _MemoryDummyLink link = new _MemoryDummyLink(this, path);
-    _pathToResource[path] = link;
-    _pathToTimestamp[path] = nextStamp++;
-    _notifyWatchers(path, ChangeType.ADD);
-    return link;
-  }
-
-  void _notifyWatchers(String path, ChangeType changeType) {
-    _pathToWatchers.forEach((String watcherPath, List<StreamController<WatchEvent>> streamControllers) {
-      if (posix.isWithin(watcherPath, path)) {
-        for (StreamController<WatchEvent> streamController in streamControllers) {
-          streamController.add(new WatchEvent(changeType, path));
-        }
-      }
-    });
-  }
-
-  void modifyFile(String path, String content) {
-    _checkFileAtPath(path);
-    _pathToContent[path] = content;
-    _pathToTimestamp[path] = nextStamp++;
-    _notifyWatchers(path, ChangeType.MODIFY);
-  }
-
-  void _checkFileAtPath(String path) {
-    _MemoryResource resource = _pathToResource[path];
-    if (resource is! _MemoryFile) {
-      throw new ArgumentError(
-          'File expected at "$path" but ${resource.runtimeType} found');
-    }
-  }
-
-  void deleteFile(String path) {
-    _checkFileAtPath(path);
-    _pathToResource.remove(path);
-    _pathToContent.remove(path);
-    _pathToTimestamp.remove(path);
-    _notifyWatchers(path, ChangeType.REMOVE);
-  }
-
-  @override
-  Context get pathContext => posix;
-}
-
-
-/**
- * A `dart:io` based implementation of [File].
- */
-class _PhysicalFile extends _PhysicalResource implements File {
-  _PhysicalFile(io.File file) : super(file);
-
-  @override
-  Source createSource(UriKind uriKind) {
-    io.File file = _entry as io.File;
-    JavaFile javaFile = new JavaFile(file.absolute.path);
-    return new FileBasedSource.con2(javaFile, uriKind);
-  }
-}
-
-
-/**
- * A `dart:io` based implementation of [Folder].
- */
-class _PhysicalFolder extends _PhysicalResource implements Folder {
-  _PhysicalFolder(io.Directory directory) : super(directory);
-
-  @override
-  Resource getChild(String relPath) {
-    return PhysicalResourceProvider.INSTANCE.getResource(canonicalizePath(relPath));
-  }
-
-  @override
-  List<Resource> getChildren() {
-    List<Resource> children = <Resource>[];
-    io.Directory directory = _entry as io.Directory;
-    List<io.FileSystemEntity> entries = directory.listSync(recursive: false);
-    int numEntries = entries.length;
-    for (int i = 0; i < numEntries; i++) {
-      io.FileSystemEntity entity = entries[i];
-      if (entity is io.Directory) {
-        children.add(new _PhysicalFolder(entity));
-      } else if (entity is io.File) {
-        children.add(new _PhysicalFile(entity));
-      }
-    }
-    return children;
-  }
-
-  @override
-  Stream<WatchEvent> get changes => new DirectoryWatcher(_entry.path).events;
-
-  @override
-  String canonicalizePath(String relPath) {
-    return normalize(join(_entry.absolute.path, relPath));
-  }
-}
-
-
-/**
- * A `dart:io` based implementation of [Resource].
- */
-abstract class _PhysicalResource implements Resource {
-  final io.FileSystemEntity _entry;
-
-  _PhysicalResource(this._entry);
-
-  @override
-  bool get exists => _entry.existsSync();
-
-  @override
-  String get path => _entry.absolute.path;
-
-  @override
-  get hashCode => path.hashCode;
-
-  @override
-  bool operator==(other) {
-    if (runtimeType != other.runtimeType) {
-      return false;
-    }
-    return path == other.path;
-  }
-
-  @override
-  String get shortName => basename(path);
-
-  @override
-  String toString() => path;
-
-  @override
-  Folder get parent {
-    String parentPath = dirname(path);
-    if (parentPath == path) {
-      return null;
-    }
-    return new _PhysicalFolder(new io.Directory(parentPath));
-  }
-}
-
-
-/**
- * A `dart:io` based implementation of [ResourceProvider].
- */
-class PhysicalResourceProvider implements ResourceProvider {
-  static final PhysicalResourceProvider INSTANCE = new PhysicalResourceProvider._();
-
-  PhysicalResourceProvider._();
-
-  @override
-  Resource getResource(String path) {
-    if (io.FileSystemEntity.isDirectorySync(path)) {
-      io.Directory directory = new io.Directory(path);
-      return new _PhysicalFolder(directory);
-    } else {
-      io.File file = new io.File(path);
-      return new _PhysicalFile(file);
-    }
-  }
-
-  @override
-  Context get pathContext => io.Platform.isWindows ? windows : posix;
-}
-
-
-/**
- * A [UriResolver] for [Resource]s.
- */
-class ResourceUriResolver extends UriResolver {
-  /**
-   * The name of the `file` scheme.
-   */
-  static String _FILE_SCHEME = "file";
-
-  final ResourceProvider _provider;
-
-  ResourceUriResolver(this._provider);
-
-  @override
-  Source fromEncoding(UriKind kind, Uri uri) {
-    if (kind == UriKind.FILE_URI) {
-      Resource resource = _provider.getResource(uri.path);
-      if (resource is File) {
-        return resource.createSource(kind);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Source resolveAbsolute(Uri uri) {
-    if (!_isFileUri(uri)) {
-      return null;
-    }
-    Resource resource = _provider.getResource(uri.path);
-    if (resource is File) {
-      return resource.createSource(UriKind.FILE_URI);
-    }
-    return null;
-  }
-
-  /**
-   * Return `true` if the given URI is a `file` URI.
-   *
-   * @param uri the URI being tested
-   * @return `true` if the given URI is a `file` URI
-   */
-  static bool _isFileUri(Uri uri) => uri.scheme == _FILE_SCHEME;
-}
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index d6b7f1d..fca3162 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -13,12 +13,12 @@
 import 'package:analysis_server/src/domain_edit.dart';
 import 'package:analysis_server/src/domain_search.dart';
 import 'package:analysis_server/src/domain_server.dart';
-import 'package:analysis_server/src/index/index.dart';
 import 'package:analysis_server/src/package_map_provider.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/resource.dart';
-import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:path/path.dart' as pathos;
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/local_file_index.dart';
 
 
 /**
@@ -34,7 +34,7 @@
   if (!indexDirectory.existsSync()) {
     indexDirectory.createSync();
   }
-  Index index = createLocalFileSplitIndex(indexDirectory);
+  Index index = createLocalFileIndex(indexDirectory);
   index.run();
   return index;
 }
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 92b1c88..e29109a 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -6,12 +6,14 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: '>=0.17.3 <0.18.0'
+  analysis_services: '>=0.1.0 <1.0.0'
+  analyzer: '>=0.21.0 <1.0.0'
   args: any
   logging: any
   path: any
-  typed_mock: '>=0.0.4'
   watcher: any
 dev_dependencies:
+  analysis_testing: '>=0.2.0'
   mock: '>=0.10.0 <0.11.0'
+  typed_mock: '>=0.0.4 <1.0.0'
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 923129d..32f8e1e 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -7,15 +7,44 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/resource.dart';
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_testing/mock_sdk.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
-import 'package:analyzer/src/generated/index.dart';
+
+
+int findIdentifierLength(String search) {
+  int length = 0;
+  while (length < search.length) {
+    int c = search.codeUnitAt(length);
+    if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
+          c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
+          c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
+      break;
+    }
+    length++;
+  }
+  return length;
+}
+
+
+
+AnalysisError _jsonToAnalysisError(Map<String, Object> json) {
+  return new AnalysisError(
+      json['file'],
+      json['errorCode'],
+      json['offset'],
+      json['length'],
+      json['message'],
+      json['correction']);
+}
 
 
 /**
@@ -42,26 +71,6 @@
   AbstractAnalysisTest() {
   }
 
-  void setUp() {
-    serverChannel = new MockServerChannel();
-    resourceProvider = new MemoryResourceProvider();
-    packageMapProvider = new MockPackageMapProvider();
-    Index index = createIndex();
-    server = new AnalysisServer(
-        serverChannel, resourceProvider, packageMapProvider, index);
-    server.defaultSdk = new MockSdk();
-    handler = new AnalysisDomainHandler(server);
-    // listen for notifications
-    Stream<Notification> notificationStream = serverChannel.notificationController.stream;
-    notificationStream.listen((Notification notification) {
-      processNotification(notification);
-    });
-  }
-
-  Index createIndex() {
-    return null;
-  }
-
   void addAnalysisSubscription(AnalysisService service, String file) {
     // add file to subscription
     var files = analysisSubscriptions[service.name];
@@ -76,36 +85,30 @@
     handleSuccessfulRequest(request);
   }
 
-  void tearDown() {
-    server.done();
-    handler = null;
-    server = null;
-    resourceProvider = null;
-    serverChannel = null;
+  String addFile(String path, String content) {
+    resourceProvider.newFile(path, content);
+    return path;
   }
 
-  void processNotification(Notification notification) {
-//    if (notification.event == NOTIFICATION_ERRORS) {
-//      String file = notification.getParameter(FILE);
-//      List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
-//      filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList();
-//    }
-//    if (notification.event == NOTIFICATION_HIGHLIGHTS) {
-//      String file = notification.getParameter(FILE);
-//      filesHighlights[file] = notification.getParameter(REGIONS);
-//    }
-//    if (notification.event == NOTIFICATION_NAVIGATION) {
-//      String file = notification.getParameter(FILE);
-//      filesNavigation[file] = notification.getParameter(REGIONS);
-//    }
+  String addTestFile(String content) {
+    addFile(testFile, content);
+    this.testCode = content;
+    return testFile;
+  }
+
+  Index createIndex() {
+    return null;
   }
 
   /**
-   * Returns a [Future] that completes when the [AnalysisServer] finishes
-   * all its scheduled tasks.
+   * Creates a project `/project`.
    */
-  Future waitForTasksFinished() {
-    return waitForServerOperationsPerformed(server);
+  void createProject() {
+    resourceProvider.newFolder(projectPath);
+    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
+    request.setParameter(INCLUDED, [projectPath]);
+    request.setParameter(EXCLUDED, []);
+    handleSuccessfulRequest(request);
   }
 
   /**
@@ -130,6 +133,15 @@
     return offset;
   }
 
+  /**
+   * Validates that the given [request] is handled successfully.
+   */
+  Response handleSuccessfulRequest(Request request) {
+    Response response = handler.handleRequest(request);
+    expect(response, isResponseSuccess('0'));
+    return response;
+  }
+
 //  /**
 //   * Returns [AnalysisError]s recorded for the given [file].
 //   * May be empty, but not `null`.
@@ -190,15 +202,20 @@
 //    return getNavigation(testFile);
 //  }
 
-  /**
-   * Creates a project `/project`.
-   */
-  void createProject() {
-    resourceProvider.newFolder(projectPath);
-    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
-    request.setParameter(INCLUDED, [projectPath]);
-    request.setParameter(EXCLUDED, []);
-    handleSuccessfulRequest(request);
+  void processNotification(Notification notification) {
+//    if (notification.event == NOTIFICATION_ERRORS) {
+//      String file = notification.getParameter(FILE);
+//      List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
+//      filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList();
+//    }
+//    if (notification.event == NOTIFICATION_HIGHLIGHTS) {
+//      String file = notification.getParameter(FILE);
+//      filesHighlights[file] = notification.getParameter(REGIONS);
+//    }
+//    if (notification.event == NOTIFICATION_NAVIGATION) {
+//      String file = notification.getParameter(FILE);
+//      filesNavigation[file] = notification.getParameter(REGIONS);
+//    }
   }
 
 //  /**
@@ -215,23 +232,36 @@
 //    handleSuccessfulRequest(request);
 //  }
 
-  String addFile(String path, String content) {
-    resourceProvider.newFile(path, content);
-    return path;
+  void setUp() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    packageMapProvider = new MockPackageMapProvider();
+    Index index = createIndex();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, packageMapProvider, index);
+    server.defaultSdk = new MockSdk();
+    handler = new AnalysisDomainHandler(server);
+    // listen for notifications
+    Stream<Notification> notificationStream = serverChannel.notificationController.stream;
+    notificationStream.listen((Notification notification) {
+      processNotification(notification);
+    });
   }
 
-  String addTestFile(String content) {
-    addFile(testFile, content);
-    this.testCode = content;
-    return testFile;
+  void tearDown() {
+    server.done();
+    handler = null;
+    server = null;
+    resourceProvider = null;
+    serverChannel = null;
   }
 
   /**
-   * Validates that the given [request] is handled successfully.
+   * Returns a [Future] that completes when the [AnalysisServer] finishes
+   * all its scheduled tasks.
    */
-  void handleSuccessfulRequest(Request request) {
-    Response response = handler.handleRequest(request);
-    expect(response, isResponseSuccess('0'));
+  Future waitForTasksFinished() {
+    return waitForServerOperationsPerformed(server);
   }
 
   static String _getCodeString(code) {
@@ -243,7 +273,6 @@
 }
 
 
-
 class AnalysisError {
   final String file;
   final String errorCode;
@@ -260,29 +289,3 @@
         'offset=$offset; length=$length; message=$message)';
   }
 }
-
-
-AnalysisError _jsonToAnalysisError(Map<String, Object> json) {
-  return new AnalysisError(
-      json['file'],
-      json['errorCode'],
-      json['offset'],
-      json['length'],
-      json['message'],
-      json['correction']);
-}
-
-
-int findIdentifierLength(String search) {
-  int length = 0;
-  while (length < search.length) {
-    int c = search.codeUnitAt(length);
-    if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
-          c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
-          c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
-      break;
-    }
-    length++;
-  }
-  return length;
-}
diff --git a/pkg/analysis_server/test/analysis_hover_test.dart b/pkg/analysis_server/test/analysis_hover_test.dart
new file mode 100644
index 0000000..e07354e
--- /dev/null
+++ b/pkg/analysis_server/test/analysis_hover_test.dart
@@ -0,0 +1,224 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.analysis.hover;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/computer/computer_hover.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'analysis_abstract.dart';
+
+
+main() {
+  group('notification.hover', () {
+    runReflectiveTests(AnalysisHoverTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class AnalysisHoverTest extends AbstractAnalysisTest {
+  List<Hover> hovers;
+  Hover hover;
+
+  Future prepareHover(String search, then()) {
+    int offset = findOffset(search);
+    return prepareHoverAt(offset, then);
+  }
+
+  Future prepareHoverAt(int offset, then()) {
+    return waitForTasksFinished().then((_) {
+      Request request = new Request('0', ANALYSIS_GET_HOVER);
+      request.setParameter(FILE, testFile);
+      request.setParameter(OFFSET, offset);
+      Response response = handleSuccessfulRequest(request);
+      List<Map<String, Object>> hoverJsons = response.getResult(HOVERS);
+      hovers = hoverJsons.map((json) {
+        return new Hover.fromJson(json);
+      }).toList();
+      hover = hovers.isNotEmpty ? hovers.first : null;
+      then();
+    });
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+  }
+
+  test_dartDoc_clunky() {
+    addTestFile('''
+library my.library;
+/**
+ * doc aaa
+ * doc bbb
+ */
+main() {
+}
+''');
+    return prepareHover('main() {', () {
+      expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
+    });
+  }
+
+  test_dartDoc_elegant() {
+    addTestFile('''
+library my.library;
+/// doc aaa
+/// doc bbb
+main() {
+}
+''');
+    return prepareHover('main() {', () {
+      expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
+    });
+  }
+
+  test_expression_function() {
+    addTestFile('''
+library my.library;
+/// doc aaa
+/// doc bbb
+List<String> fff(int a, String b) {
+}
+''');
+    return prepareHover('fff(int a', () {
+      // element
+      expect(hover.containingLibraryName, 'my.library');
+      expect(hover.containingLibraryPath, testFile);
+      expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
+      expect(hover.elementDescription, 'fff(int a, String b) → List<String>');
+      expect(hover.elementKind, 'function');
+      // types
+      expect(hover.staticType, '(int, String) → List<String>');
+      expect(hover.propagatedType, isNull);
+      // no parameter
+      expect(hover.parameter, isNull);
+    });
+  }
+
+  test_expression_literal_noElement() {
+    addTestFile('''
+main() {
+  foo(123);
+}
+foo(Object myParameter) {}
+''');
+    return prepareHover('123', () {
+      // literal, no Element
+      expect(hover.elementDescription, isNull);
+      expect(hover.elementKind, isNull);
+      // types
+      expect(hover.staticType, 'int');
+      expect(hover.propagatedType, isNull);
+      // parameter
+      expect(hover.parameter, 'Object myParameter');
+    });
+  }
+
+  test_expression_method() {
+    addTestFile('''
+library my.library;
+class A {
+  /// doc aaa
+  /// doc bbb
+  List<String> mmm(int a, String b) {
+  }
+}
+''');
+    return prepareHover('mmm(int a', () {
+      // element
+      expect(hover.containingLibraryName, 'my.library');
+      expect(hover.containingLibraryPath, testFile);
+      expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
+      expect(hover.elementDescription, 'A.mmm(int a, String b) → List<String>');
+      expect(hover.elementKind, 'method');
+      // types
+      expect(hover.staticType, '(int, String) → List<String>');
+      expect(hover.propagatedType, isNull);
+      // no parameter
+      expect(hover.parameter, isNull);
+    });
+  }
+
+  test_expression_method_nvocation() {
+    addTestFile('''
+library my.library;
+class A {
+  List<String> mmm(int a, String b) {
+  }
+}
+main(A a) {
+  a.mmm(42, 'foo');
+}
+''');
+    return prepareHover('mm(42, ', () {
+      // range
+      expect(hover.offset, findOffset('mmm(42, '));
+      expect(hover.length, 'mmm'.length);
+      // element
+      expect(hover.containingLibraryName, 'my.library');
+      expect(hover.containingLibraryPath, testFile);
+      expect(hover.elementDescription, 'A.mmm(int a, String b) → List<String>');
+      expect(hover.elementKind, 'method');
+      // types
+      expect(hover.staticType, isNull);
+      expect(hover.propagatedType, isNull);
+      // no parameter
+      expect(hover.parameter, isNull);
+    });
+  }
+
+  test_expression_syntheticGetter() {
+    addTestFile('''
+library my.library;
+class A {
+  /// doc aaa
+  /// doc bbb
+  String fff;
+}
+main(A a) {
+  print(a.fff);
+}
+''');
+    return prepareHover('fff);', () {
+      // element
+      expect(hover.containingLibraryName, 'my.library');
+      expect(hover.containingLibraryPath, testFile);
+      expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
+      expect(hover.elementDescription, 'String fff');
+      expect(hover.elementKind, 'field');
+      // types
+      expect(hover.staticType, 'String');
+      expect(hover.propagatedType, isNull);
+    });
+  }
+
+  test_expression_variable_hasPropagatedType() {
+    addTestFile('''
+library my.library;
+main() {
+  var vvv = 123;
+  print(vvv);
+}
+''');
+    return prepareHover('vvv);', () {
+      // element
+      expect(hover.containingLibraryName, 'my.library');
+      expect(hover.containingLibraryPath, testFile);
+      expect(hover.dartDoc, isNull);
+      expect(hover.elementDescription, 'dynamic vvv');
+      expect(hover.elementKind, 'local variable');
+      // types
+      expect(hover.staticType, 'dynamic');
+      expect(hover.propagatedType, 'int');
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/analysis_notification_highlights_test.dart b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
index 012bb7d..496b941 100644
--- a/pkg/analysis_server/test/analysis_notification_highlights_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
@@ -10,27 +10,30 @@
 import 'package:analysis_server/src/computer/computer_highlights.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
 import 'analysis_abstract.dart';
-import 'reflective_tests.dart';
 
 
 main() {
   group('notification.highlights', () {
-    runReflectiveTests(_AnalysisNotificationHighlightsTest);
+    runReflectiveTests(AnalysisNotificationHighlightsTest);
+  });
+  group('HighlightType', () {
+    runReflectiveTests(HighlightTypeTest);
   });
 }
 
 
 @ReflectiveTestCase()
-class _AnalysisNotificationHighlightsTest extends AbstractAnalysisTest {
-  List<_HighlightRegion> regions;
+class AnalysisNotificationHighlightsTest extends AbstractAnalysisTest {
+  List<HighlightRegion> regions;
 
   void assertHasRawRegion(HighlightType type, int offset, int length) {
-    for (_HighlightRegion region in regions) {
+    for (HighlightRegion region in regions) {
       if (region.offset == offset && region.length == length && region.type ==
-          type.name) {
+          type) {
         return;
       }
     }
@@ -45,9 +48,9 @@
   }
 
   void assertNoRawRegion(HighlightType type, int offset, int length) {
-    for (_HighlightRegion region in regions) {
+    for (HighlightRegion region in regions) {
       if (region.offset == offset && region.length == length && region.type ==
-          type.name) {
+          type) {
         fail(
             'Not expected to find (offset=$offset; length=$length; type=$type) in\n'
             '${regions.join('\n')}');
@@ -97,7 +100,7 @@
         List<Map<String, Object>> regionsJson = notification.getParameter(
             REGIONS);
         for (Map<String, Object> regionJson in regionsJson) {
-          regions.add(new _HighlightRegion.fromJson(regionJson));
+          regions.add(new HighlightRegion.fromJson(regionJson));
         }
       }
     }
@@ -438,6 +441,27 @@
     });
   }
 
+  test_COMMENT() {
+    addTestFile('''
+/**
+ * documentation comment
+ */ 
+void main() {
+  // end-of-line comment
+  my_function(1);
+}
+
+void my_function(String a) {
+ /* block comment */
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.COMMENT_DOCUMENTATION, '/**', 32);
+      assertHasRegion(HighlightType.COMMENT_END_OF_LINE, '//', 22);
+      assertHasRegion(HighlightType.COMMENT_BLOCK, '/* b', 19);
+    });
+  }
+
   test_CONSTRUCTOR() {
     addTestFile('''
 class AAA {
@@ -756,14 +780,20 @@
 }
 
 
-class _HighlightRegion {
-  final int length;
-  final int offset;
-  final String type;
+@ReflectiveTestCase()
+class HighlightTypeTest {
+  void test_toString() {
+    expect(HighlightType.CLASS.toString(), HighlightType.CLASS.name);
+  }
 
-  _HighlightRegion(this.type, this.offset, this.length);
+  void test_valueOf() {
+    expect(HighlightType.CLASS, HighlightType.valueOf(
+        HighlightType.CLASS.name));
+  }
 
-  factory _HighlightRegion.fromJson(Map<String, Object> map) {
-    return new _HighlightRegion(map[TYPE], map[OFFSET], map[LENGTH]);
+  void test_valueOf_unknown() {
+    expect(() {
+      HighlightType.valueOf('no-such-type');
+    }, throws);
   }
 }
diff --git a/pkg/analysis_server/test/analysis_notification_navigation_test.dart b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
index f51041c..188cb39c 100644
--- a/pkg/analysis_server/test/analysis_notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
@@ -10,10 +10,10 @@
 import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
 import 'analysis_abstract.dart';
-import 'reflective_tests.dart';
 
 
 main() {
diff --git a/pkg/analysis_server/test/analysis_notification_occurrences_test.dart b/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
new file mode 100644
index 0000000..816effd
--- /dev/null
+++ b/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.analysis.notification.occurrences;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/computer/computer_occurrences.dart';
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'analysis_abstract.dart';
+
+
+main() {
+  group('notification.occurrences', () {
+    runReflectiveTests(AnalysisNotificationOccurrencesTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class AnalysisNotificationOccurrencesTest extends AbstractAnalysisTest {
+  List<Occurrences> occurrencesList;
+  Occurrences testOccurences;
+
+  /**
+   * Asserts that there is an offset of [search] in [testOccurences].
+   */
+  void assertHasOffset(String search) {
+    int offset = findOffset(search);
+    expect(testOccurences.offsets, contains(offset));
+  }
+
+  /**
+   * Validates that there is a region at the offset of [search] in [testFile].
+   * If [length] is not specified explicitly, then length of an identifier
+   * from [search] is used.
+   */
+  void assertHasRegion(String search, [int length = -1]) {
+    int offset = findOffset(search);
+    if (length == -1) {
+      length = findIdentifierLength(search);
+    }
+    findRegion(offset, length, true);
+  }
+
+  /**
+   * Finds an [Occurrences] with the given [offset] and [length].
+   *
+   * If [exists] is `true`, then fails if such [Occurrences] does not exist.
+   * Otherwise remembers this it into [testOccurences].
+   *
+   * If [exists] is `false`, then fails if such [Occurrences] exists.
+   */
+  void findRegion(int offset, int length, [bool exists]) {
+    for (Occurrences occurrences in occurrencesList) {
+      if (occurrences.length != length) {
+        continue;
+      }
+      for (int occurrenceOffset in occurrences.offsets) {
+        if (occurrenceOffset == offset) {
+          if (exists == false) {
+            fail('Not expected to find (offset=$offset; length=$length) in\n'
+                '${occurrencesList.join('\n')}');
+          }
+          testOccurences = occurrences;
+          return;
+        }
+      }
+    }
+    if (exists == true) {
+      fail('Expected to find (offset=$offset; length=$length) in\n'
+          '${occurrencesList.join('\n')}');
+    }
+  }
+
+  Future prepareOccurrences(then()) {
+    addAnalysisSubscription(AnalysisService.OCCURRENCES, testFile);
+    return waitForTasksFinished().then((_) {
+      then();
+    });
+  }
+
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_OCCURRENCES) {
+      String file = notification.getParameter(FILE);
+      if (file == testFile) {
+        occurrencesList = <Occurrences>[];
+        List<Map<String, Object>> jsonList = notification.getParameter(
+            OCCURRENCES);
+        for (Map<String, Object> json in jsonList) {
+          occurrencesList.add(new Occurrences.fromJson(json));
+        }
+      }
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+  }
+
+  test_afterAnalysis() {
+    addTestFile('''
+main() {
+  var vvv = 42;
+  print(vvv);
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return prepareOccurrences(() {
+        assertHasRegion('vvv =');
+        expect(testOccurences.element.kind, ElementKind.LOCAL_VARIABLE);
+        expect(testOccurences.element.name, 'vvv');
+        assertHasOffset('vvv = 42');
+        assertHasOffset('vvv);');
+      });
+    });
+  }
+
+  test_classType() {
+    addTestFile('''
+main() {
+  int a = 1;
+  int b = 2;
+  int c = 3;
+}
+int VVV = 4;
+''');
+    return prepareOccurrences(() {
+      assertHasRegion('int a');
+      expect(testOccurences.element.kind, ElementKind.CLASS);
+      expect(testOccurences.element.name, 'int');
+      assertHasOffset('int a');
+      assertHasOffset('int b');
+      assertHasOffset('int c');
+      assertHasOffset('int VVV');
+    });
+  }
+
+  test_localVariable() {
+    addTestFile('''
+main() {
+  var vvv = 42;
+  vvv += 5;
+  print(vvv);
+}
+''');
+    return prepareOccurrences(() {
+      assertHasRegion('vvv =');
+      expect(testOccurences.element.kind, ElementKind.LOCAL_VARIABLE);
+      expect(testOccurences.element.name, 'vvv');
+      assertHasOffset('vvv = 42');
+      assertHasOffset('vvv += 5');
+      assertHasOffset('vvv);');
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/analysis_notification_outline_test.dart b/pkg/analysis_server/test/analysis_notification_outline_test.dart
index eb4009b..caa3f12 100644
--- a/pkg/analysis_server/test/analysis_notification_outline_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_outline_test.dart
@@ -11,10 +11,10 @@
 import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
 import 'analysis_abstract.dart';
-import 'reflective_tests.dart';
 
 
 main() {
diff --git a/pkg/analysis_server/test/analysis_notification_overrides_test.dart b/pkg/analysis_server/test/analysis_notification_overrides_test.dart
new file mode 100644
index 0000000..34ca127
--- /dev/null
+++ b/pkg/analysis_server/test/analysis_notification_overrides_test.dart
@@ -0,0 +1,354 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.analysis.notification.overrides;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/computer/computer_overrides.dart';
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'analysis_abstract.dart';
+
+
+main() {
+  group('notification.overrides', () {
+    runReflectiveTests(AnalysisNotificationOverridesTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class AnalysisNotificationOverridesTest extends AbstractAnalysisTest {
+  List<Override> overridesList;
+  Override override;
+
+  /**
+   * Asserts that there is an overridden interface [Element] at the offset of
+   * [search] in [override].
+   */
+  void assertHasInterfaceElement(String search) {
+    int offset = findOffset(search);
+    for (Element element in override.interfaceElements) {
+      if (element.location.offset == offset) {
+        return;
+      }
+    }
+    fail('Expect to find an overridden interface elements at $offset in '
+        '${override.interfaceElements.join('\n')}');
+  }
+
+  /**
+   * Validates that there is an [Override] at the offset of [search].
+   *
+   * If [length] is not specified explicitly, then length of an identifier
+   * from [search] is used.
+   */
+  void assertHasOverride(String search, [int length = -1]) {
+    int offset = findOffset(search);
+    if (length == -1) {
+      length = findIdentifierLength(search);
+    }
+    findOverride(offset, length, true);
+  }
+
+  /**
+   * Asserts that there is an overridden superclass [Element] at the offset of
+   * [search] in [override].
+   */
+  void assertHasSuperElement(String search) {
+    int offset = findOffset(search);
+    Element element = override.superclassElement;
+    expect(element.location.offset, offset);
+  }
+
+  /**
+   * Asserts that there are no overridden elements from interfaces.
+   */
+  void assertNoInterfaceElements() {
+    expect(override.interfaceElements, isNull);
+  }
+
+  /**
+   * Asserts that there are no overridden elements from the superclass.
+   */
+  void assertNoSuperElement() {
+    expect(override.superclassElement, isNull);
+  }
+
+  /**
+   * Finds an [Override] with the given [offset] and [length].
+   *
+   * If [exists] is `true`, then fails if such [Override] does not exist.
+   * Otherwise remembers this it into [override].
+   *
+   * If [exists] is `false`, then fails if such [Override] exists.
+   */
+  void findOverride(int offset, int length, [bool exists]) {
+    for (Override override in overridesList) {
+      if (override.offset == offset && override.length == length) {
+        if (exists == false) {
+          fail('Not expected to find (offset=$offset; length=$length) in\n'
+              '${overridesList.join('\n')}');
+        }
+        this.override = override;
+        return;
+      }
+    }
+    if (exists == true) {
+      fail('Expected to find (offset=$offset; length=$length) in\n'
+          '${overridesList.join('\n')}');
+    }
+  }
+
+  Future prepareOverrides(then()) {
+    addAnalysisSubscription(AnalysisService.OVERRIDES, testFile);
+    return waitForTasksFinished().then((_) {
+      then();
+    });
+  }
+
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_OVERRIDES) {
+      String file = notification.getParameter(FILE);
+      if (file == testFile) {
+        overridesList = <Override>[];
+        List<Map<String, Object>> jsonList = notification.getParameter(
+            OVERRIDES);
+        for (Map<String, Object> json in jsonList) {
+          overridesList.add(new Override.fromJson(json));
+        }
+      }
+    }
+  }
+
+  void setUp() {
+    super.setUp();
+    createProject();
+  }
+
+  test_afterAnalysis() {
+    addTestFile('''
+class A {
+  m() {} // in A
+}
+class B implements A {
+  m() {} // in B
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return prepareOverrides(() {
+        assertHasOverride('m() {} // in B');
+        assertNoSuperElement();
+        assertHasInterfaceElement('m() {} // in A');
+      });
+    });
+  }
+
+  test_interface_method_direct_multiple() {
+    addTestFile('''
+class IA {
+  m() {} // in IA
+}
+class IB {
+  m() {} // in IB
+}
+class A implements IA, IB {
+  m() {} // in A
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('m() {} // in A');
+      assertNoSuperElement();
+      assertHasInterfaceElement('m() {} // in IA');
+      assertHasInterfaceElement('m() {} // in IB');
+    });
+  }
+
+  test_interface_method_direct_single() {
+    addTestFile('''
+class A {
+  m() {} // in A
+}
+class B implements A {
+  m() {} // in B
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('m() {} // in B');
+      assertNoSuperElement();
+      assertHasInterfaceElement('m() {} // in A');
+    });
+  }
+
+  test_interface_method_indirect_single() {
+    addTestFile('''
+class A {
+  m() {} // in A
+}
+class B extends A {
+}
+class C implements B {
+  m() {} // in C
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('m() {} // in C');
+      assertNoSuperElement();
+      assertHasInterfaceElement('m() {} // in A');
+    });
+  }
+
+  test_super_fieldByField() {
+    addTestFile('''
+class A {
+  int fff; // in A
+}
+class B extends A {
+  int fff; // in B
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('fff; // in B');
+      assertHasSuperElement('fff; // in A');
+      assertNoInterfaceElements();
+    });
+  }
+
+  test_super_fieldByGetter() {
+    addTestFile('''
+class A {
+  int fff; // in A
+}
+class B extends A {
+  get fff => 0; // in B
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('fff => 0; // in B');
+      assertHasSuperElement('fff; // in A');
+      assertNoInterfaceElements();
+    });
+  }
+
+  test_super_fieldByMethod() {
+    addTestFile('''
+class A {
+  int fff; // in A
+}
+class B extends A {
+  fff() {} // in B
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('fff() {} // in B');
+      assertHasSuperElement('fff; // in A');
+      assertNoInterfaceElements();
+    });
+  }
+
+  test_super_fieldBySetter() {
+    addTestFile('''
+class A {
+  int fff; // in A
+}
+class B extends A {
+  set fff(x) {} // in B
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('fff(x) {} // in B');
+      assertHasSuperElement('fff; // in A');
+      assertNoInterfaceElements();
+    });
+  }
+
+  test_super_getterByField() {
+    addTestFile('''
+class A {
+  get fff => 0; // in A
+  set fff(x) {} // in A
+}
+class B extends A {
+  int fff; // in B
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('fff; // in B');
+      assertHasSuperElement('fff => 0; // in A');
+      assertNoInterfaceElements();
+    });
+  }
+
+  test_super_getterByGetter() {
+    addTestFile('''
+class A {
+  get fff => 0; // in A
+}
+class B extends A {
+  get fff => 0; // in B
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('fff => 0; // in B');
+      assertHasSuperElement('fff => 0; // in A');
+      assertNoInterfaceElements();
+    });
+  }
+
+  test_super_method_direct() {
+    addTestFile('''
+class A {
+  m() {} // in A
+}
+class B extends A {
+  m() {} // in B
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('m() {} // in B');
+      assertHasSuperElement('m() {} // in A');
+      assertNoInterfaceElements();
+    });
+  }
+
+  test_super_method_indirect() {
+    addTestFile('''
+class A {
+  m() {} // in A
+}
+class B extends A {
+}
+class C extends B {
+  m() {} // in C
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('m() {} // in C');
+      assertHasSuperElement('m() {} // in A');
+      assertNoInterfaceElements();
+    });
+  }
+
+  test_super_setterBySetter() {
+    addTestFile('''
+class A {
+  set fff(x) {} // in A
+}
+class B extends A {
+  set fff(x) {} // in B
+}
+''');
+    return prepareOverrides(() {
+      assertHasOverride('fff(x) {} // in B');
+      assertHasSuperElement('fff(x) {} // in A');
+      assertNoInterfaceElements();
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 24a6306..57a2e1d 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -4,31 +4,19 @@
 
 library test.analysis_server;
 
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_server.dart';
+import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:mock/mock.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
-import 'package:analysis_server/src/operation/operation.dart';
-
-class AnalysisServerTestHelper {
-  MockServerChannel channel;
-  AnalysisServer server;
-
-  AnalysisServerTestHelper({bool rethrowExceptions: true}) {
-    channel = new MockServerChannel();
-    server = new AnalysisServer(channel, PhysicalResourceProvider.INSTANCE,
-        new MockPackageMapProvider(), null,
-        rethrowExceptions: rethrowExceptions);
-  }
-}
 
 main() {
   group('AnalysisServer', () {
@@ -115,6 +103,18 @@
   });
 }
 
+class AnalysisServerTestHelper {
+  MockServerChannel channel;
+  AnalysisServer server;
+
+  AnalysisServerTestHelper({bool rethrowExceptions: true}) {
+    channel = new MockServerChannel();
+    server = new AnalysisServer(channel, PhysicalResourceProvider.INSTANCE,
+        new MockPackageMapProvider(), null,
+        rethrowExceptions: rethrowExceptions);
+  }
+}
+
 class EchoHandler implements RequestHandler {
   @override
   Response handleRequest(Request request) {
diff --git a/pkg/analysis_server/test/computer/element_test.dart b/pkg/analysis_server/test/computer/element_test.dart
index 6e63b1b..09155eb 100644
--- a/pkg/analysis_server/test/computer/element_test.dart
+++ b/pkg/analysis_server/test/computer/element_test.dart
@@ -6,14 +6,14 @@
 
 import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_testing/abstract_context.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart' as engine;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
 import 'package:unittest/unittest.dart';
 
-import '../abstract_context.dart';
-import '../reflective_tests.dart';
 
 
 main() {
@@ -48,6 +48,8 @@
         ElementKind.FUNCTION_TYPE_ALIAS);
     expect(ElementKind.valueOf(ElementKind.GETTER.name), ElementKind.GETTER);
     expect(ElementKind.valueOf(ElementKind.LIBRARY.name), ElementKind.LIBRARY);
+    expect(ElementKind.valueOf(ElementKind.LOCAL_VARIABLE.name),
+        ElementKind.LOCAL_VARIABLE);
     expect(ElementKind.valueOf(ElementKind.METHOD.name), ElementKind.METHOD);
     expect(ElementKind.valueOf(ElementKind.SETTER.name), ElementKind.SETTER);
     expect(ElementKind.valueOf(ElementKind.TOP_LEVEL_VARIABLE.name),
@@ -79,6 +81,8 @@
         ElementKind.GETTER);
     expect(ElementKind.valueOfEngine(engine.ElementKind.LIBRARY),
         ElementKind.LIBRARY);
+    expect(ElementKind.valueOfEngine(engine.ElementKind.LOCAL_VARIABLE),
+        ElementKind.LOCAL_VARIABLE);
     expect(ElementKind.valueOfEngine(engine.ElementKind.METHOD),
         ElementKind.METHOD);
     expect(ElementKind.valueOfEngine(engine.ElementKind.SETTER),
@@ -93,6 +97,11 @@
 
 @ReflectiveTestCase()
 class ElementTest extends AbstractContextTest {
+  engine.Element findElementInUnit(CompilationUnit unit, String name,
+      [engine.ElementKind kind]) {
+    return findChildElement(unit.element, name, kind);
+  }
+
   void test_fromElement_CLASS() {
     Source source = addSource('/test.dart', '''
 @deprecated
@@ -121,7 +130,8 @@
   const A.myConstructor(int a, [String b]);
 }''');
     CompilationUnit unit = resolveLibraryUnit(source);
-    engine.ConstructorElement engineElement = findElementInUnit(unit, 'myConstructor');
+    engine.ConstructorElement engineElement = findElementInUnit(unit,
+        'myConstructor');
     // create notification Element
     Element element = new Element.fromEngine(engineElement);
     expect(element.kind, ElementKind.CONSTRUCTOR);
@@ -169,7 +179,8 @@
   String myGetter => 42;
 }''');
     CompilationUnit unit = resolveLibraryUnit(source);
-    engine.PropertyAccessorElement engineElement = findElementInUnit(unit, 'myGetter', engine.ElementKind.GETTER);
+    engine.PropertyAccessorElement engineElement = findElementInUnit(unit,
+        'myGetter', engine.ElementKind.GETTER);
     // create notification Element
     Element element = new Element.fromEngine(engineElement);
     expect(element.kind, ElementKind.GETTER);
diff --git a/pkg/analysis_server/test/context_directory_manager_test.dart b/pkg/analysis_server/test/context_directory_manager_test.dart
index 75fbf22..b640e01 100644
--- a/pkg/analysis_server/test/context_directory_manager_test.dart
+++ b/pkg/analysis_server/test/context_directory_manager_test.dart
@@ -5,9 +5,10 @@
 library test.context.directory.manager;
 
 import 'mocks.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analysis_server/src/context_directory_manager.dart';
 import 'package:analysis_server/src/package_map_provider.dart';
-import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:path/path.dart';
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 045c27d..f9ee43c 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -11,14 +11,25 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/resource.dart';
+import 'package:analysis_testing/mock_sdk.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 
-import 'mocks.dart';
 import 'analysis_abstract.dart';
-import 'reflective_tests.dart';
+import 'mocks.dart';
+
+
+AnalysisError jsonToAnalysisError(Map<String, Object> json) {
+  Map<String, Object> jsonLocation = json[LOCATION];
+  Location location = new Location(jsonLocation[FILE], _getSafeInt(jsonLocation,
+      OFFSET, -1), _getSafeInt(jsonLocation, LENGTH, -1), _getSafeInt(jsonLocation,
+      START_LINE, -1), _getSafeInt(jsonLocation, START_COLUMN, -1));
+  return new AnalysisError(json[ERROR_CODE], json[SEVERITY], json[TYPE], location,
+      json['message'], json['correction']);
+}
 
 
 main() {
@@ -157,253 +168,6 @@
 }
 
 
-class AnalysisError {
-  final String errorCode;
-  final String severity;
-  final String type;
-  final Location location;
-  final String message;
-  final String correction;
-  AnalysisError(this.errorCode, this.severity, this.type, this.location,
-      this.message, this.correction);
-
-  @override
-  String toString() {
-    return 'AnalysisError(location=$location message=$message); '
-        'errorCode=$errorCode; severity=$separator type=$type';
-  }
-}
-
-
-AnalysisError jsonToAnalysisError(Map<String, Object> json) {
-  Map<String, Object> jsonLocation = json[LOCATION];
-  Location location = new Location(jsonLocation[FILE], _getSafeInt(jsonLocation,
-      OFFSET, -1), _getSafeInt(jsonLocation, LENGTH, -1), _getSafeInt(jsonLocation,
-      START_LINE, -1), _getSafeInt(jsonLocation, START_COLUMN, -1));
-  return new AnalysisError(json[ERROR_CODE], json[SEVERITY], json[TYPE], location,
-      json['message'], json['correction']);
-}
-
-
-int _getSafeInt(Map<String, Object> json, String key, int defaultValue) {
-  Object value = json[key];
-  if (value is int) {
-    return value;
-  }
-  return defaultValue;
-}
-
-
-/**
- * A helper to test 'analysis.*' requests.
- */
-class AnalysisTestHelper {
-  MockServerChannel serverChannel;
-  MemoryResourceProvider resourceProvider;
-  AnalysisServer server;
-  AnalysisDomainHandler handler;
-
-  Map<String, List<String>> analysisSubscriptions = {};
-
-  Map<String, List<AnalysisError>> filesErrors = {};
-  Map<String, List<Map<String, Object>>> filesHighlights = {};
-  Map<String, List<Map<String, Object>>> filesNavigation = {};
-
-  String testFile = '/project/bin/test.dart';
-  String testCode;
-
-  AnalysisTestHelper() {
-    serverChannel = new MockServerChannel();
-    resourceProvider = new MemoryResourceProvider();
-    server = new AnalysisServer(serverChannel, resourceProvider,
-        new MockPackageMapProvider(), null);
-    server.defaultSdk = new MockSdk();
-    handler = new AnalysisDomainHandler(server);
-    // listen for notifications
-    Stream<Notification> notificationStream =
-        serverChannel.notificationController.stream;
-    notificationStream.listen((Notification notification) {
-      if (notification.event == ANALYSIS_ERRORS) {
-        String file = notification.getParameter(FILE);
-        List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
-        filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList();
-      }
-      if (notification.event == ANALYSIS_HIGHLIGHTS) {
-        String file = notification.getParameter(FILE);
-        filesHighlights[file] = notification.getParameter(REGIONS);
-      }
-      if (notification.event == ANALYSIS_NAVIGATION) {
-        String file = notification.getParameter(FILE);
-        filesNavigation[file] = notification.getParameter(REGIONS);
-      }
-    });
-  }
-
-  void addAnalysisSubscriptionHighlights(String file) {
-    addAnalysisSubscription(AnalysisService.HIGHLIGHTS, file);
-  }
-
-  void addAnalysisSubscriptionNavigation(String file) {
-    addAnalysisSubscription(AnalysisService.NAVIGATION, file);
-  }
-
-  void addAnalysisSubscription(AnalysisService service, String file) {
-    // add file to subscription
-    var files = analysisSubscriptions[service.name];
-    if (files == null) {
-      files = <String>[];
-      analysisSubscriptions[service.name] = files;
-    }
-    files.add(file);
-    // set subscriptions
-    Request request = new Request('0', ANALYSIS_SET_SUBSCRIPTIONS);
-    request.setParameter(SUBSCRIPTIONS, analysisSubscriptions);
-    handleSuccessfulRequest(request);
-  }
-
-  /**
-   * Returns a [Future] that completes when this this helper finished all its
-   * scheduled tasks.
-   */
-  Future waitForOperationsFinished() {
-    return waitForServerOperationsPerformed(server);
-  }
-
-  /**
-   * Returns the offset of [search] in [testCode].
-   * Fails if not found.
-   */
-  int findOffset(String search) {
-    int offset = testCode.indexOf(search);
-    expect(offset, isNot(-1));
-    return offset;
-  }
-
-  /**
-   * Returns [AnalysisError]s recorded for the given [file].
-   * May be empty, but not `null`.
-   */
-  List<AnalysisError> getErrors(String file) {
-    List<AnalysisError> errors = filesErrors[file];
-    if (errors != null) {
-      return errors;
-    }
-    return <AnalysisError>[];
-  }
-
-  /**
-   * Returns highlights recorded for the given [file].
-   * May be empty, but not `null`.
-   */
-  List<Map<String, Object>> getHighlights(String file) {
-    List<Map<String, Object>> highlights = filesHighlights[file];
-    if (highlights != null) {
-      return highlights;
-    }
-    return [];
-  }
-
-  /**
-   * Returns navigation regions recorded for the given [file].
-   * May be empty, but not `null`.
-   */
-  List<Map<String, Object>> getNavigation(String file) {
-    List<Map<String, Object>> navigation = filesNavigation[file];
-    if (navigation != null) {
-      return navigation;
-    }
-    return [];
-  }
-
-  /**
-   * Returns [AnalysisError]s recorded for the [testFile].
-   * May be empty, but not `null`.
-   */
-  List<AnalysisError> getTestErrors() {
-    return getErrors(testFile);
-  }
-
-  /**
-   * Returns highlights recorded for the given [testFile].
-   * May be empty, but not `null`.
-   */
-  List<Map<String, Object>> getTestHighlights() {
-    return getHighlights(testFile);
-  }
-
-  /**
-   * Returns navigation information recorded for the given [testFile].
-   * May be empty, but not `null`.
-   */
-  List<Map<String, Object>> getTestNavigation() {
-    return getNavigation(testFile);
-  }
-
-  /**
-   * Creates an empty project `/project`.
-   */
-  void createEmptyProject() {
-    resourceProvider.newFolder('/project');
-    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
-    request.setParameter(INCLUDED, ['/project']);
-    request.setParameter(EXCLUDED, []);
-    handleSuccessfulRequest(request);
-  }
-
-  /**
-   * Creates a project with a single Dart file `/project/bin/test.dart` with
-   * the given [code].
-   */
-  void createSingleFileProject(code) {
-    this.testCode = _getCodeString(code);
-    resourceProvider.newFolder('/project');
-    resourceProvider.newFile(testFile, testCode);
-    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
-    request.setParameter(INCLUDED, ['/project']);
-    request.setParameter(EXCLUDED, []);
-    handleSuccessfulRequest(request);
-  }
-
-  String setFileContent(String path, String content) {
-    resourceProvider.newFile(path, content);
-    return path;
-  }
-
-  /**
-   * Validates that the given [request] is handled successfully.
-   */
-  void handleSuccessfulRequest(Request request) {
-    Response response = handler.handleRequest(request);
-    expect(response, isResponseSuccess('0'));
-  }
-
-  /**
-   * Stops the associated server.
-   */
-  void stopServer() {
-    server.done();
-  }
-
-  /**
-   * Send an `updateContent` request for [testFile].
-   */
-  void sendContentChange(Map contentChange) {
-    Request request = new Request('0', ANALYSIS_UPDATE_CONTENT);
-    request.setParameter('files', {
-      testFile: contentChange
-    });
-    handleSuccessfulRequest(request);
-  }
-
-  static String _getCodeString(code) {
-    if (code is List<String>) {
-      code = code.join('\n');
-    }
-    return code as String;
-  }
-}
-
-
 testNotificationErrors() {
   AnalysisTestHelper helper;
 
@@ -529,6 +293,7 @@
   });
 }
 
+
 void test_setSubscriptions() {
   test('before analysis', () {
     AnalysisTestHelper helper = new AnalysisTestHelper();
@@ -563,6 +328,15 @@
 }
 
 
+int _getSafeInt(Map<String, Object> json, String key, int defaultValue) {
+  Object value = json[key];
+  if (value is int) {
+    return value;
+  }
+  return defaultValue;
+}
+
+
 @ReflectiveTestCase()
 class AnalysisDomainTest extends AbstractAnalysisTest {
   Map<String, List<AnalysisError>> filesErrors = {};
@@ -575,30 +349,6 @@
     }
   }
 
-  test_setRoots_packages() {
-    // prepare package
-    String pkgFile = '/packages/pkgA/libA.dart';
-    resourceProvider.newFile(pkgFile, '''
-library lib_a;
-class A {}
-''');
-    packageMapProvider.packageMap['pkgA'] = [resourceProvider.getResource(
-        '/packages/pkgA')];
-    addTestFile('''
-import 'package:pkgA/libA.dart';
-main(A a) {
-}
-''');
-    // create project and wait for analysis
-    createProject();
-    return waitForTasksFinished().then((_) {
-      // if 'package:pkgA/libA.dart' was resolved, then there are no errors
-      expect(filesErrors[testFile], isEmpty);
-      // packages file also was resolved
-      expect(filesErrors[pkgFile], isEmpty);
-    });
-  }
-
   test_packageMapDependencies() {
     // Prepare a source file that has errors because it refers to an unknown
     // package.
@@ -631,4 +381,255 @@
       });
     });
   }
+
+  test_setRoots_packages() {
+    // prepare package
+    String pkgFile = '/packages/pkgA/libA.dart';
+    resourceProvider.newFile(pkgFile, '''
+library lib_a;
+class A {}
+''');
+    packageMapProvider.packageMap['pkgA'] = [resourceProvider.getResource(
+        '/packages/pkgA')];
+    addTestFile('''
+import 'package:pkgA/libA.dart';
+main(A a) {
+}
+''');
+    // create project and wait for analysis
+    createProject();
+    return waitForTasksFinished().then((_) {
+      // if 'package:pkgA/libA.dart' was resolved, then there are no errors
+      expect(filesErrors[testFile], isEmpty);
+      // packages file also was resolved
+      expect(filesErrors[pkgFile], isEmpty);
+    });
+  }
+}
+
+class AnalysisError {
+  final String errorCode;
+  final String severity;
+  final String type;
+  final Location location;
+  final String message;
+  final String correction;
+  AnalysisError(this.errorCode, this.severity, this.type, this.location,
+      this.message, this.correction);
+
+  @override
+  String toString() {
+    return 'AnalysisError(location=$location message=$message); '
+        'errorCode=$errorCode; severity=$separator type=$type';
+  }
+}
+
+
+/**
+ * A helper to test 'analysis.*' requests.
+ */
+class AnalysisTestHelper {
+  MockServerChannel serverChannel;
+  MemoryResourceProvider resourceProvider;
+  AnalysisServer server;
+  AnalysisDomainHandler handler;
+
+  Map<String, List<String>> analysisSubscriptions = {};
+
+  Map<String, List<AnalysisError>> filesErrors = {};
+  Map<String, List<Map<String, Object>>> filesHighlights = {};
+  Map<String, List<Map<String, Object>>> filesNavigation = {};
+
+  String testFile = '/project/bin/test.dart';
+  String testCode;
+
+  AnalysisTestHelper() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(serverChannel, resourceProvider,
+        new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
+    handler = new AnalysisDomainHandler(server);
+    // listen for notifications
+    Stream<Notification> notificationStream =
+        serverChannel.notificationController.stream;
+    notificationStream.listen((Notification notification) {
+      if (notification.event == ANALYSIS_ERRORS) {
+        String file = notification.getParameter(FILE);
+        List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
+        filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList();
+      }
+      if (notification.event == ANALYSIS_HIGHLIGHTS) {
+        String file = notification.getParameter(FILE);
+        filesHighlights[file] = notification.getParameter(REGIONS);
+      }
+      if (notification.event == ANALYSIS_NAVIGATION) {
+        String file = notification.getParameter(FILE);
+        filesNavigation[file] = notification.getParameter(REGIONS);
+      }
+    });
+  }
+
+  void addAnalysisSubscription(AnalysisService service, String file) {
+    // add file to subscription
+    var files = analysisSubscriptions[service.name];
+    if (files == null) {
+      files = <String>[];
+      analysisSubscriptions[service.name] = files;
+    }
+    files.add(file);
+    // set subscriptions
+    Request request = new Request('0', ANALYSIS_SET_SUBSCRIPTIONS);
+    request.setParameter(SUBSCRIPTIONS, analysisSubscriptions);
+    handleSuccessfulRequest(request);
+  }
+
+  void addAnalysisSubscriptionHighlights(String file) {
+    addAnalysisSubscription(AnalysisService.HIGHLIGHTS, file);
+  }
+
+  void addAnalysisSubscriptionNavigation(String file) {
+    addAnalysisSubscription(AnalysisService.NAVIGATION, file);
+  }
+
+  /**
+   * Creates an empty project `/project`.
+   */
+  void createEmptyProject() {
+    resourceProvider.newFolder('/project');
+    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
+    request.setParameter(INCLUDED, ['/project']);
+    request.setParameter(EXCLUDED, []);
+    handleSuccessfulRequest(request);
+  }
+
+  /**
+   * Creates a project with a single Dart file `/project/bin/test.dart` with
+   * the given [code].
+   */
+  void createSingleFileProject(code) {
+    this.testCode = _getCodeString(code);
+    resourceProvider.newFolder('/project');
+    resourceProvider.newFile(testFile, testCode);
+    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
+    request.setParameter(INCLUDED, ['/project']);
+    request.setParameter(EXCLUDED, []);
+    handleSuccessfulRequest(request);
+  }
+
+  /**
+   * Returns the offset of [search] in [testCode].
+   * Fails if not found.
+   */
+  int findOffset(String search) {
+    int offset = testCode.indexOf(search);
+    expect(offset, isNot(-1));
+    return offset;
+  }
+
+  /**
+   * Returns [AnalysisError]s recorded for the given [file].
+   * May be empty, but not `null`.
+   */
+  List<AnalysisError> getErrors(String file) {
+    List<AnalysisError> errors = filesErrors[file];
+    if (errors != null) {
+      return errors;
+    }
+    return <AnalysisError>[];
+  }
+
+  /**
+   * Returns highlights recorded for the given [file].
+   * May be empty, but not `null`.
+   */
+  List<Map<String, Object>> getHighlights(String file) {
+    List<Map<String, Object>> highlights = filesHighlights[file];
+    if (highlights != null) {
+      return highlights;
+    }
+    return [];
+  }
+
+  /**
+   * Returns navigation regions recorded for the given [file].
+   * May be empty, but not `null`.
+   */
+  List<Map<String, Object>> getNavigation(String file) {
+    List<Map<String, Object>> navigation = filesNavigation[file];
+    if (navigation != null) {
+      return navigation;
+    }
+    return [];
+  }
+
+  /**
+   * Returns [AnalysisError]s recorded for the [testFile].
+   * May be empty, but not `null`.
+   */
+  List<AnalysisError> getTestErrors() {
+    return getErrors(testFile);
+  }
+
+  /**
+   * Returns highlights recorded for the given [testFile].
+   * May be empty, but not `null`.
+   */
+  List<Map<String, Object>> getTestHighlights() {
+    return getHighlights(testFile);
+  }
+
+  /**
+   * Returns navigation information recorded for the given [testFile].
+   * May be empty, but not `null`.
+   */
+  List<Map<String, Object>> getTestNavigation() {
+    return getNavigation(testFile);
+  }
+
+  /**
+   * Validates that the given [request] is handled successfully.
+   */
+  void handleSuccessfulRequest(Request request) {
+    Response response = handler.handleRequest(request);
+    expect(response, isResponseSuccess('0'));
+  }
+
+  /**
+   * Send an `updateContent` request for [testFile].
+   */
+  void sendContentChange(Map contentChange) {
+    Request request = new Request('0', ANALYSIS_UPDATE_CONTENT);
+    request.setParameter('files', {
+      testFile: contentChange
+    });
+    handleSuccessfulRequest(request);
+  }
+
+  String setFileContent(String path, String content) {
+    resourceProvider.newFile(path, content);
+    return path;
+  }
+
+  /**
+   * Stops the associated server.
+   */
+  void stopServer() {
+    server.done();
+  }
+
+  /**
+   * Returns a [Future] that completes when this this helper finished all its
+   * scheduled tasks.
+   */
+  Future waitForOperationsFinished() {
+    return waitForServerOperationsPerformed(server);
+  }
+
+  static String _getCodeString(code) {
+    if (code is List<String>) {
+      code = code.join('\n');
+    }
+    return code as String;
+  }
 }
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index cfe203b..c45db47 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -8,7 +8,8 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_completion.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/resource.dart';
+import 'package:analysis_testing/mock_sdk.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
diff --git a/pkg/analysis_server/test/domain_edit_test.dart b/pkg/analysis_server/test/domain_edit_test.dart
index 14f838b..d9dd424 100644
--- a/pkg/analysis_server/test/domain_edit_test.dart
+++ b/pkg/analysis_server/test/domain_edit_test.dart
@@ -8,7 +8,8 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_edit.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/resource.dart';
+import 'package:analysis_testing/mock_sdk.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
diff --git a/pkg/analysis_server/test/domain_search_test.dart b/pkg/analysis_server/test/domain_search_test.dart
index 46b8cfa..234d0da 100644
--- a/pkg/analysis_server/test/domain_search_test.dart
+++ b/pkg/analysis_server/test/domain_search_test.dart
@@ -9,16 +9,16 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_search.dart';
-import 'package:analysis_server/src/index/index.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/resource.dart';
-import 'package:analyzer/src/generated/index.dart';
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_testing/mock_sdk.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:unittest/unittest.dart';
 
 import 'analysis_abstract.dart';
-import 'index/store/memory_node_manager.dart';
 import 'mocks.dart';
-import 'reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
@@ -78,11 +78,11 @@
 
 @ReflectiveTestCase()
 class SearchDomainTest extends AbstractAnalysisTest {
-  LocalIndex index;
+  Index index;
 
   @override
   Index createIndex() {
-    return new LocalIndex(new MemoryNodeManager());
+    return createLocalMemoryIndex();
   }
 
   @override
@@ -101,7 +101,7 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return index.getRelationshipsAsync(UniverseElement.INSTANCE,
+      return index.getRelationships(UniverseElement.INSTANCE,
           IndexConstants.DEFINES_CLASS).then((List<Location> locations) {
         bool hasClassFunction = false;
         bool hasClassAAA = false;
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index a4a1012..90f36e6 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -4,11 +4,11 @@
 
 library test.domain.server;
 
+import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/resource.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
diff --git a/pkg/analysis_server/test/index/b_plus_tree_test.dart b/pkg/analysis_server/test/index/b_plus_tree_test.dart
deleted file mode 100644
index a3abcce..0000000
--- a/pkg/analysis_server/test/index/b_plus_tree_test.dart
+++ /dev/null
@@ -1,686 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.index.b_plus_tree;
-
-import 'dart:math';
-
-import 'package:analysis_server/src/index/b_plus_tree.dart';
-import 'package:unittest/unittest.dart';
-
-import '../reflective_tests.dart';
-
-
-main() {
-  groupSep = ' | ';
-  group('BTree', () {
-    runReflectiveTests(BPlusTreeTest);
-  });
-}
-
-
-void _assertDebugString(BPlusTree tree, String expected) {
-  String dump = _getDebugString(tree);
-  expect(dump, expected);
-}
-
-
-_TestBTree<int, String> _createTree(int maxIndexKeys, int maxLeafKeys) {
-  return new _TestBTree<int, String>(maxIndexKeys, maxLeafKeys, _intComparator);
-}
-
-
-String _getDebugString(BPlusTree tree) {
-  StringBuffer buffer = new StringBuffer();
-  tree.writeOn(buffer);
-  return buffer.toString();
-}
-
-
-int _intComparator(int a, int b) => a - b;
-
-
-@ReflectiveTestCase()
-class BPlusTreeTest {
-  BPlusTree<int, String, dynamic> tree = _createTree(4, 4);
-
-  test_NoSuchMethodError() {
-    expect(() {
-      (tree as dynamic).thereIsNoSuchMethod();
-    }, throwsA(new isInstanceOf<NoSuchMethodError>()));
-  }
-
-  void test_find() {
-    _insertValues(12);
-    expect(tree.find(-1), isNull);
-    expect(tree.find(1000), isNull);
-    for (int key = 0; key < 12; key++) {
-      expect(tree.find(key), 'V$key');
-    }
-  }
-
-  void test_insert_01() {
-    _insert(0, 'A');
-    _assertDebugString(tree, 'LNode {0: A}\n');
-  }
-
-  void test_insert_02() {
-    _insert(1, 'B');
-    _insert(0, 'A');
-    _assertDebugString(tree, 'LNode {0: A, 1: B}\n');
-  }
-
-  void test_insert_03() {
-    _insert(2, 'C');
-    _insert(0, 'A');
-    _insert(1, 'B');
-    _assertDebugString(tree, 'LNode {0: A, 1: B, 2: C}\n');
-  }
-
-  void test_insert_05() {
-    _insertValues(5);
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1}
-  2
-    LNode {2: V2, 3: V3, 4: V4}
-}
-''');
-  }
-
-  void test_insert_09() {
-    _insertValues(9);
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1}
-  2
-    LNode {2: V2, 3: V3}
-  4
-    LNode {4: V4, 5: V5}
-  6
-    LNode {6: V6, 7: V7, 8: V8}
-}
-''');
-  }
-
-  void test_insert_innerSplitLeft() {
-    // Prepare a tree with '0' key missing.
-    for (int i = 1; i < 12; i++) {
-      _insert(i, "V$i");
-    }
-    _assertDebugString(tree, '''
-INode {
-    LNode {1: V1, 2: V2}
-  3
-    LNode {3: V3, 4: V4}
-  5
-    LNode {5: V5, 6: V6}
-  7
-    LNode {7: V7, 8: V8}
-  9
-    LNode {9: V9, 10: V10, 11: V11}
-}
-''');
-    // Split and insert into the 'left' child.
-    _insert(0, 'V0');
-    _assertDebugString(tree, '''
-INode {
-    INode {
-        LNode {0: V0, 1: V1, 2: V2}
-      3
-        LNode {3: V3, 4: V4}
-      5
-        LNode {5: V5, 6: V6}
-    }
-  7
-    INode {
-        LNode {7: V7, 8: V8}
-      9
-        LNode {9: V9, 10: V10, 11: V11}
-    }
-}
-''');
-  }
-
-  void test_insert_innerSplitRight() {
-    _insertValues(12);
-    _assertDebugString(tree, '''
-INode {
-    INode {
-        LNode {0: V0, 1: V1}
-      2
-        LNode {2: V2, 3: V3}
-      4
-        LNode {4: V4, 5: V5}
-    }
-  6
-    INode {
-        LNode {6: V6, 7: V7}
-      8
-        LNode {8: V8, 9: V9, 10: V10, 11: V11}
-    }
-}
-''');
-  }
-
-  void test_insert_replace() {
-    _insert(0, 'A');
-    _insert(1, 'B');
-    _insert(2, 'C');
-    _assertDebugString(tree, 'LNode {0: A, 1: B, 2: C}\n');
-    _insert(2, 'C2');
-    _insert(1, 'B2');
-    _insert(0, 'A2');
-    _assertDebugString(tree, 'LNode {0: A2, 1: B2, 2: C2}\n');
-  }
-
-  void test_remove_inner_borrowLeft() {
-    tree = _createTree(10, 4);
-    for (int i = 100; i < 125; i++) {
-      _insert(i, 'V$i');
-    }
-    for (int i = 0; i < 10; i++) {
-      _insert(i, 'V$i');
-    }
-    _assertDebugString(tree, '''
-INode {
-    INode {
-        LNode {0: V0, 1: V1}
-      2
-        LNode {2: V2, 3: V3}
-      4
-        LNode {4: V4, 5: V5}
-      6
-        LNode {6: V6, 7: V7}
-      8
-        LNode {8: V8, 9: V9, 100: V100, 101: V101}
-      102
-        LNode {102: V102, 103: V103}
-      104
-        LNode {104: V104, 105: V105}
-      106
-        LNode {106: V106, 107: V107}
-      108
-        LNode {108: V108, 109: V109}
-      110
-        LNode {110: V110, 111: V111}
-    }
-  112
-    INode {
-        LNode {112: V112, 113: V113}
-      114
-        LNode {114: V114, 115: V115}
-      116
-        LNode {116: V116, 117: V117}
-      118
-        LNode {118: V118, 119: V119}
-      120
-        LNode {120: V120, 121: V121}
-      122
-        LNode {122: V122, 123: V123, 124: V124}
-    }
-}
-''');
-    expect(tree.remove(112), 'V112');
-    _assertDebugString(tree, '''
-INode {
-    INode {
-        LNode {0: V0, 1: V1}
-      2
-        LNode {2: V2, 3: V3}
-      4
-        LNode {4: V4, 5: V5}
-      6
-        LNode {6: V6, 7: V7}
-      8
-        LNode {8: V8, 9: V9, 100: V100, 101: V101}
-      102
-        LNode {102: V102, 103: V103}
-      104
-        LNode {104: V104, 105: V105}
-    }
-  106
-    INode {
-        LNode {106: V106, 107: V107}
-      108
-        LNode {108: V108, 109: V109}
-      110
-        LNode {110: V110, 111: V111}
-      112
-        LNode {113: V113, 114: V114, 115: V115}
-      116
-        LNode {116: V116, 117: V117}
-      118
-        LNode {118: V118, 119: V119}
-      120
-        LNode {120: V120, 121: V121}
-      122
-        LNode {122: V122, 123: V123, 124: V124}
-    }
-}
-''');
-  }
-
-  void test_remove_inner_borrowRight() {
-    tree = _createTree(10, 4);
-    for (int i = 100; i < 135; i++) {
-      _insert(i, 'V$i');
-    }
-    _assertDebugString(tree, '''
-INode {
-    INode {
-        LNode {100: V100, 101: V101}
-      102
-        LNode {102: V102, 103: V103}
-      104
-        LNode {104: V104, 105: V105}
-      106
-        LNode {106: V106, 107: V107}
-      108
-        LNode {108: V108, 109: V109}
-      110
-        LNode {110: V110, 111: V111}
-    }
-  112
-    INode {
-        LNode {112: V112, 113: V113}
-      114
-        LNode {114: V114, 115: V115}
-      116
-        LNode {116: V116, 117: V117}
-      118
-        LNode {118: V118, 119: V119}
-      120
-        LNode {120: V120, 121: V121}
-      122
-        LNode {122: V122, 123: V123}
-      124
-        LNode {124: V124, 125: V125}
-      126
-        LNode {126: V126, 127: V127}
-      128
-        LNode {128: V128, 129: V129}
-      130
-        LNode {130: V130, 131: V131}
-      132
-        LNode {132: V132, 133: V133, 134: V134}
-    }
-}
-''');
-    expect(tree.remove(100), 'V100');
-    _assertDebugString(tree, '''
-INode {
-    INode {
-        LNode {101: V101, 102: V102, 103: V103}
-      104
-        LNode {104: V104, 105: V105}
-      106
-        LNode {106: V106, 107: V107}
-      108
-        LNode {108: V108, 109: V109}
-      110
-        LNode {110: V110, 111: V111}
-      112
-        LNode {112: V112, 113: V113}
-      114
-        LNode {114: V114, 115: V115}
-      116
-        LNode {116: V116, 117: V117}
-    }
-  118
-    INode {
-        LNode {118: V118, 119: V119}
-      120
-        LNode {120: V120, 121: V121}
-      122
-        LNode {122: V122, 123: V123}
-      124
-        LNode {124: V124, 125: V125}
-      126
-        LNode {126: V126, 127: V127}
-      128
-        LNode {128: V128, 129: V129}
-      130
-        LNode {130: V130, 131: V131}
-      132
-        LNode {132: V132, 133: V133, 134: V134}
-    }
-}
-''');
-  }
-
-  void test_remove_inner_mergeLeft() {
-    _insertValues(15);
-    _assertDebugString(tree, '''
-INode {
-    INode {
-        LNode {0: V0, 1: V1}
-      2
-        LNode {2: V2, 3: V3}
-      4
-        LNode {4: V4, 5: V5}
-    }
-  6
-    INode {
-        LNode {6: V6, 7: V7}
-      8
-        LNode {8: V8, 9: V9}
-      10
-        LNode {10: V10, 11: V11}
-      12
-        LNode {12: V12, 13: V13, 14: V14}
-    }
-}
-''');
-    expect(tree.remove(12), 'V12');
-    expect(tree.remove(13), 'V13');
-    expect(tree.remove(14), 'V14');
-    _assertDebugString(tree, '''
-INode {
-    INode {
-        LNode {0: V0, 1: V1}
-      2
-        LNode {2: V2, 3: V3}
-      4
-        LNode {4: V4, 5: V5}
-    }
-  6
-    INode {
-        LNode {6: V6, 7: V7}
-      8
-        LNode {8: V8, 9: V9}
-      10
-        LNode {10: V10, 11: V11}
-    }
-}
-''');
-    expect(tree.remove(8), 'V8');
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1}
-  2
-    LNode {2: V2, 3: V3}
-  4
-    LNode {4: V4, 5: V5}
-  6
-    LNode {6: V6, 7: V7, 9: V9}
-  10
-    LNode {10: V10, 11: V11}
-}
-''');
-  }
-
-  void test_remove_inner_mergeRight() {
-    _insertValues(12);
-    _assertDebugString(tree, '''
-INode {
-    INode {
-        LNode {0: V0, 1: V1}
-      2
-        LNode {2: V2, 3: V3}
-      4
-        LNode {4: V4, 5: V5}
-    }
-  6
-    INode {
-        LNode {6: V6, 7: V7}
-      8
-        LNode {8: V8, 9: V9, 10: V10, 11: V11}
-    }
-}
-''');
-    expect(tree.remove(0), 'V0');
-    _assertDebugString(tree, '''
-INode {
-    LNode {1: V1, 2: V2, 3: V3}
-  4
-    LNode {4: V4, 5: V5}
-  6
-    LNode {6: V6, 7: V7}
-  8
-    LNode {8: V8, 9: V9, 10: V10, 11: V11}
-}
-''');
-  }
-
-  void test_remove_inner_notFound() {
-    _insertValues(20);
-    expect(tree.remove(100), isNull);
-  }
-
-  void test_remove_leafRoot_becomesEmpty() {
-    _insertValues(1);
-    _assertDebugString(tree, 'LNode {0: V0}\n');
-    expect(tree.remove(0), 'V0');
-    _assertDebugString(tree, 'LNode {}\n');
-  }
-
-  void test_remove_leafRoot_first() {
-    _insertValues(3);
-    _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
-    expect(tree.remove(0), 'V0');
-    _assertDebugString(tree, 'LNode {1: V1, 2: V2}\n');
-  }
-
-  void test_remove_leafRoot_last() {
-    _insertValues(3);
-    _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
-    expect(tree.remove(2), 'V2');
-    _assertDebugString(tree, 'LNode {0: V0, 1: V1}\n');
-  }
-
-  void test_remove_leafRoot_middle() {
-    _insertValues(3);
-    _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
-    expect(tree.remove(1), 'V1');
-    _assertDebugString(tree, 'LNode {0: V0, 2: V2}\n');
-  }
-
-  void test_remove_leafRoot_notFound() {
-    _insertValues(1);
-    _assertDebugString(tree, 'LNode {0: V0}\n');
-    expect(tree.remove(10), null);
-    _assertDebugString(tree, 'LNode {0: V0}\n');
-  }
-
-  void test_remove_leaf_borrowLeft() {
-    tree = _createTree(10, 10);
-    for (int i = 20; i < 40; i++) {
-      _insert(i, 'V$i');
-    }
-    for (int i = 0; i < 5; i++) {
-      _insert(i, 'V$i');
-    }
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4, 20: V20, 21: V21, 22: V22, 23: V23, 24: V24}
-  25
-    LNode {25: V25, 26: V26, 27: V27, 28: V28, 29: V29}
-  30
-    LNode {30: V30, 31: V31, 32: V32, 33: V33, 34: V34, 35: V35, 36: V36, 37: V37, 38: V38, 39: V39}
-}
-''');
-    expect(tree.remove(25), 'V25');
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4, 20: V20, 21: V21}
-  22
-    LNode {22: V22, 23: V23, 24: V24, 26: V26, 27: V27, 28: V28, 29: V29}
-  30
-    LNode {30: V30, 31: V31, 32: V32, 33: V33, 34: V34, 35: V35, 36: V36, 37: V37, 38: V38, 39: V39}
-}
-''');
-  }
-
-  void test_remove_leaf_borrowRight() {
-    tree = _createTree(10, 10);
-    _insertValues(15);
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4}
-  5
-    LNode {5: V5, 6: V6, 7: V7, 8: V8, 9: V9, 10: V10, 11: V11, 12: V12, 13: V13, 14: V14}
-}
-''');
-    expect(tree.remove(0), 'V0');
-    _assertDebugString(tree, '''
-INode {
-    LNode {1: V1, 2: V2, 3: V3, 4: V4, 5: V5, 6: V6, 7: V7}
-  8
-    LNode {8: V8, 9: V9, 10: V10, 11: V11, 12: V12, 13: V13, 14: V14}
-}
-''');
-  }
-
-  void test_remove_leaf_mergeLeft() {
-    _insertValues(9);
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1}
-  2
-    LNode {2: V2, 3: V3}
-  4
-    LNode {4: V4, 5: V5}
-  6
-    LNode {6: V6, 7: V7, 8: V8}
-}
-''');
-    expect(tree.remove(2), 'V2');
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1, 3: V3}
-  4
-    LNode {4: V4, 5: V5}
-  6
-    LNode {6: V6, 7: V7, 8: V8}
-}
-''');
-  }
-
-  void test_remove_leaf_mergeRight() {
-    _insertValues(9);
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1}
-  2
-    LNode {2: V2, 3: V3}
-  4
-    LNode {4: V4, 5: V5}
-  6
-    LNode {6: V6, 7: V7, 8: V8}
-}
-''');
-    expect(tree.remove(1), 'V1');
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 2: V2, 3: V3}
-  4
-    LNode {4: V4, 5: V5}
-  6
-    LNode {6: V6, 7: V7, 8: V8}
-}
-''');
-  }
-
-  void test_remove_leaf_noReorder() {
-    _insertValues(5);
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1}
-  2
-    LNode {2: V2, 3: V3, 4: V4}
-}
-''');
-    expect(tree.remove(3), 'V3');
-    _assertDebugString(tree, '''
-INode {
-    LNode {0: V0, 1: V1}
-  2
-    LNode {2: V2, 4: V4}
-}
-''');
-  }
-
-  void test_stress_evenOdd() {
-    int count = 1000;
-    // insert odd, forward
-    for (int i = 1; i < count; i += 2) {
-      _insert(i, 'V$i');
-    }
-    // insert even, backward
-    for (int i = count - 2; i >= 0; i -= 2) {
-      _insert(i, 'V$i');
-    }
-    // find every
-    for (int i = 0; i < count; i++) {
-      expect(tree.find(i), 'V$i');
-    }
-    // remove odd, backward
-    for (int i = count - 1; i >= 1; i -= 2) {
-      expect(tree.remove(i), 'V$i');
-    }
-    for (int i = 0; i < count; i++) {
-      if (i.isEven) {
-        expect(tree.find(i), 'V$i');
-      } else {
-        expect(tree.find(i), isNull);
-      }
-    }
-    // remove even, forward
-    for (int i = 0; i < count; i += 2) {
-      tree.remove(i);
-    }
-    for (int i = 0; i < count; i++) {
-      expect(tree.find(i), isNull);
-    }
-  }
-
-  void test_stress_random() {
-    tree = _createTree(10, 10);
-    int maxKey = 1000000;
-    int tryCount = 1000;
-    Set<int> keys = new Set<int>();
-    {
-      Random random = new Random(37);
-      for (int i = 0; i < tryCount; i++) {
-        int key = random.nextInt(maxKey);
-        keys.add(key);
-        _insert(key, 'V$key');
-      }
-    }
-    // find every
-    for (int key in keys) {
-      expect(tree.find(key), 'V$key');
-    }
-    // remove random keys
-    {
-      Random random = new Random(37);
-      for (int key in new Set<int>.from(keys)) {
-        if (random.nextBool()) {
-          keys.remove(key);
-          expect(tree.remove(key), 'V$key');
-        }
-      }
-    }
-    // find every remaining key
-    for (int key in keys) {
-      expect(tree.find(key), 'V$key');
-    }
-  }
-
-  void _insert(int key, String value) {
-    tree.insert(key, value);
-  }
-
-  void _insertValues(int count) {
-    for (int i = 0; i < count; i++) {
-      _insert(i, 'V$i');
-    }
-  }
-}
-
-class _TestBTree<K, V> extends BPlusTree<K, V, int> {
-  _TestBTree(int maxIndexKeys, int maxLeafKeys, Comparator<K> comparator) :
-      super(comparator, new MemoryNodeManager(maxIndexKeys, maxLeafKeys));
-}
diff --git a/pkg/analysis_server/test/index/file_page_manager_test.dart b/pkg/analysis_server/test/index/file_page_manager_test.dart
deleted file mode 100644
index 1c11942..0000000
--- a/pkg/analysis_server/test/index/file_page_manager_test.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.index.file_page_manager;
-
-import 'dart:collection';
-import 'dart:io';
-import 'dart:math';
-import 'dart:typed_data';
-
-import 'package:analysis_server/src/index/b_plus_tree.dart';
-import 'package:analysis_server/src/index/file_page_manager.dart';
-import 'package:analysis_server/src/index/page_node_manager.dart';
-import 'package:path/path.dart' as pathos;
-import 'package:unittest/unittest.dart';
-
-import '../reflective_tests.dart';
-
-
-main() {
-  groupSep = ' | ';
-  group('FixedStringCodecTest', () {
-    runReflectiveTests(_FilePageManagerTest);
-  });
-}
-
-
-int _intComparator(int a, int b) => a - b;
-
-
-@ReflectiveTestCase()
-class _FilePageManagerTest {
-  FilePageManager manager;
-  int pageSize = 1024;
-  Directory tempDir;
-
-  void setUp() {
-    tempDir = Directory.systemTemp.createTempSync('testIndex_');
-    String path = pathos.join(tempDir.path, 'my.index');
-    manager = new FilePageManager(pageSize, path);
-  }
-
-  void tearDown() {
-    manager.close();
-    manager.delete();
-    tempDir.deleteSync(recursive: true);
-  }
-
-  void test_alloc_reuseFree() {
-    int id = manager.alloc();
-    manager.free(id);
-    int newId = manager.alloc();
-    expect(newId, id);
-  }
-
-  void test_alloc_unique() {
-    int idA = manager.alloc();
-    int idB = manager.alloc();
-    expect(idB, isNot(idA));
-  }
-
-  void test_btree_stress_random() {
-    NodeManager<int, String, int> nodeManager = new PageNodeManager<int,
-        String>(manager, Uint32Codec.INSTANCE, new FixedStringCodec(7));
-    nodeManager = new CachingNodeManager(nodeManager, 32, 32);
-    BPlusTree<int, String, int> tree = new BPlusTree(_intComparator,
-        nodeManager);
-    // insert
-    int maxKey = 1000000;
-    int tryCount = 1000;
-    Set<int> keys = new Set<int>();
-    {
-      Random random = new Random(37);
-      for (int i = 0; i < tryCount; i++) {
-        int key = random.nextInt(maxKey);
-        keys.add(key);
-        tree.insert(key, 'V$key');
-      }
-    }
-    // find every
-    for (int key in keys) {
-      expect(tree.find(key), 'V$key');
-    }
-    // remove random keys
-    {
-      Random random = new Random(37);
-      Set<int> removedKeys = new HashSet<int>();
-      for (int key in new Set<int>.from(keys)) {
-        if (random.nextBool()) {
-          removedKeys.add(key);
-          keys.remove(key);
-          expect(tree.remove(key), 'V$key');
-        }
-      }
-      // check the removed keys are actually gone
-      for (int key in removedKeys) {
-        expect(tree.find(key), isNull);
-      }
-    }
-    // find every remaining key
-    for (int key in keys) {
-      expect(tree.find(key), 'V$key');
-    }
-  }
-
-  void test_free_double() {
-    int id = manager.alloc();
-    manager.free(id);
-    expect(() {
-      manager.free(id);
-    }, throws);
-  }
-
-  void test_writeRead() {
-    // write
-    int id1 = manager.alloc();
-    int id2 = manager.alloc();
-    manager.write(id1, new Uint8List.fromList(new List.filled(pageSize, 1)));
-    manager.write(id2, new Uint8List.fromList(new List.filled(pageSize, 2)));
-    // read
-    expect(manager.read(id1), everyElement(1));
-    expect(manager.read(id2), everyElement(2));
-  }
-}
diff --git a/pkg/analysis_server/test/index/lru_cache_test.dart b/pkg/analysis_server/test/index/lru_cache_test.dart
deleted file mode 100644
index 5874a77..0000000
--- a/pkg/analysis_server/test/index/lru_cache_test.dart
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.index.lru_cache;
-
-import 'package:analysis_server/src/index/lru_cache.dart';
-import 'package:unittest/unittest.dart';
-
-import '../reflective_tests.dart';
-
-
-main() {
-  groupSep = ' | ';
-  group('LRUCache', () {
-    runReflectiveTests(_LRUCacheTest);
-  });
-}
-
-
-@ReflectiveTestCase()
-class _LRUCacheTest {
-  LRUCache<int, String> cache = new LRUCache<int, String>(3);
-
-  void test_evict_notGet() {
-    List<int> evictedKeys = new List<int>();
-    List<String> evictedValues = new List<String>();
-    cache = new LRUCache<int, String>(3, (int key, String value) {
-      evictedKeys.add(key);
-      evictedValues.add(value);
-    });
-    // fill
-    cache.put(1, 'A');
-    cache.put(2, 'B');
-    cache.put(3, 'C');
-    // access '1' and '3'
-    cache.get(1);
-    cache.get(3);
-    // put '4', evict '2'
-    cache.put(4, 'D');
-    expect(cache.get(1), 'A');
-    expect(cache.get(2), isNull);
-    expect(cache.get(3), 'C');
-    expect(cache.get(4), 'D');
-    // check eviction listener
-    expect(evictedKeys, contains(2));
-    expect(evictedValues, contains('B'));
-  }
-
-  void test_evict_notPut() {
-    List<int> evictedKeys = new List<int>();
-    List<String> evictedValues = new List<String>();
-    cache = new LRUCache<int, String>(3, (int key, String value) {
-      evictedKeys.add(key);
-      evictedValues.add(value);
-    });
-    // fill
-    cache.put(1, 'A');
-    cache.put(2, 'B');
-    cache.put(3, 'C');
-    // put '1' and '3'
-    cache.put(1, 'AA');
-    cache.put(3, 'CC');
-    // put '4', evict '2'
-    cache.put(4, 'D');
-    expect(cache.get(1), 'AA');
-    expect(cache.get(2), isNull);
-    expect(cache.get(3), 'CC');
-    expect(cache.get(4), 'D');
-    // check eviction listener
-    expect(evictedKeys, contains(2));
-    expect(evictedValues, contains('B'));
-  }
-
-  void test_putGet() {
-    // fill
-    cache.put(1, 'A');
-    cache.put(2, 'B');
-    cache.put(3, 'C');
-    // check
-    expect(cache.get(1), 'A');
-    expect(cache.get(2), 'B');
-    expect(cache.get(3), 'C');
-    expect(cache.get(4), isNull);
-  }
-
-  void test_remove() {
-    cache.put(1, 'A');
-    cache.put(2, 'B');
-    cache.put(3, 'C');
-    // remove
-    cache.remove(1);
-    cache.remove(3);
-    // check
-    expect(cache.get(1), isNull);
-    expect(cache.get(2), 'B');
-    expect(cache.get(3), isNull);
-  }
-}
diff --git a/pkg/analysis_server/test/index/page_node_manager_test.dart b/pkg/analysis_server/test/index/page_node_manager_test.dart
deleted file mode 100644
index 56dab61..0000000
--- a/pkg/analysis_server/test/index/page_node_manager_test.dart
+++ /dev/null
@@ -1,434 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.index.page_node_manager;
-
-import 'dart:math';
-import 'dart:typed_data';
-
-import 'package:analysis_server/src/index/b_plus_tree.dart';
-import 'package:analysis_server/src/index/page_node_manager.dart';
-import 'package:typed_mock/typed_mock.dart';
-import 'package:unittest/unittest.dart';
-
-import '../reflective_tests.dart';
-
-
-main() {
-  groupSep = ' | ';
-  group('_CachingNodeManagerTest', () {
-    runReflectiveTests(_CachingNodeManagerTest);
-  });
-  group('FixedStringCodecTest', () {
-    runReflectiveTests(_FixedStringCodecTest);
-  });
-  group('MemoryPageManager', () {
-    runReflectiveTests(_MemoryPageManagerTest);
-  });
-  group('PageNodeManager', () {
-    runReflectiveTests(_PageNodeManagerTest);
-  });
-  group('Uint32CodecTest', () {
-    runReflectiveTests(_Uint32CodecTest);
-  });
-  test('B+ tree with PageNodeManager', _treeWithPageNodeManager);
-}
-
-
-int _intComparator(int a, int b) => a - b;
-
-
-/**
- * A stress test for [BPlusTree] using [PageNodeManager].
- */
-_treeWithPageNodeManager() {
-  int pageSize = 256;
-  MemoryPageManager pageManager = new MemoryPageManager(pageSize);
-  NodeManager<int, String, int> nodeManager = new PageNodeManager<int, String>(
-      pageManager, Uint32Codec.INSTANCE, new FixedStringCodec(7));
-//  NodeManager<int, String, int> nodeManager = new MemoryNodeManager();
-  BPlusTree<int, String, int> tree = new BPlusTree(_intComparator, nodeManager);
-  int maxKey = 1000000;
-  int tryCount = 1000;
-  Set<int> keys = new Set<int>();
-  {
-    Random random = new Random(37);
-    for (int i = 0; i < tryCount; i++) {
-      int key = random.nextInt(maxKey);
-      keys.add(key);
-      tree.insert(key, 'V$key');
-    }
-  }
-  // find every
-  for (int key in keys) {
-    expect(tree.find(key), 'V$key');
-  }
-  // remove random keys
-  {
-    Random random = new Random(37);
-    for (int key in new Set<int>.from(keys)) {
-      if (random.nextBool()) {
-        keys.remove(key);
-        expect(tree.remove(key), 'V$key');
-      }
-    }
-  }
-  // find every remaining key
-  for (int key in keys) {
-    expect(tree.find(key), 'V$key');
-  }
-}
-
-
-@ReflectiveTestCase()
-class _CachingNodeManagerTest {
-  _NodeManagerMock<int, String, int> delegate = new _NodeManagerMock<int,
-      String, int>();
-  NodeManager<int, String, int> manager;
-
-  void setUp() {
-    when(delegate.writeIndex).thenReturn((key, value) {
-      delegate.writeIndex(key, value);
-    });
-    when(delegate.writeLeaf).thenReturn((key, value) {
-      delegate.writeLeaf(key, value);
-    });
-    manager = new CachingNodeManager<int, String, int>(delegate, 4, 4);
-    resetInteractions(delegate);
-  }
-
-  void test_createIndex() {
-    when(delegate.createIndex()).thenReturn(77);
-    expect(manager.createIndex(), 77);
-  }
-
-  void test_createLeaf() {
-    when(delegate.createLeaf()).thenReturn(99);
-    expect(manager.createLeaf(), 99);
-  }
-
-  void test_delete() {
-    manager.delete(42);
-    verify(delegate.delete(42)).once();
-  }
-
-  void test_isIndex() {
-    when(delegate.isIndex(1)).thenReturn(true);
-    when(delegate.isIndex(2)).thenReturn(false);
-    expect(manager.isIndex(1), isTrue);
-    expect(manager.isIndex(2), isFalse);
-  }
-
-  void test_maxIndexKeys() {
-    when(delegate.maxIndexKeys).thenReturn(42);
-    expect(manager.maxIndexKeys, 42);
-  }
-
-  void test_maxLeafKeys() {
-    when(delegate.maxLeafKeys).thenReturn(42);
-    expect(manager.maxLeafKeys, 42);
-  }
-
-  void test_readIndex_cache_whenRead() {
-    var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]);
-    when(delegate.readIndex(2)).thenReturn(data);
-    expect(manager.readIndex(2), data);
-    verify(delegate.readIndex(2)).once();
-    resetInteractions(delegate);
-    // we just read "2", so it should be cached
-    manager.readIndex(2);
-    verify(delegate.readIndex(2)).never();
-  }
-
-  void test_readIndex_cache_whenWrite() {
-    var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]);
-    manager.writeIndex(2, data);
-    expect(manager.readIndex(2), data);
-    verify(delegate.readLeaf(2)).never();
-    // delete, forces request to the delegate
-    manager.delete(2);
-    manager.readIndex(2);
-    verify(delegate.readIndex(2)).once();
-  }
-
-  void test_readIndex_delegate() {
-    var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]);
-    when(delegate.readIndex(2)).thenReturn(data);
-    expect(manager.readIndex(2), data);
-  }
-
-  void test_readLeaf_cache_whenRead() {
-    var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']);
-    when(delegate.readLeaf(2)).thenReturn(data);
-    expect(manager.readLeaf(2), data);
-    verify(delegate.readLeaf(2)).once();
-    resetInteractions(delegate);
-    // we just read "2", so it should be cached
-    manager.readLeaf(2);
-    verify(delegate.readLeaf(2)).never();
-  }
-
-  void test_readLeaf_cache_whenWrite() {
-    var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']);
-    manager.writeLeaf(2, data);
-    expect(manager.readLeaf(2), data);
-    verify(delegate.readLeaf(2)).never();
-    // delete, forces request to the delegate
-    manager.delete(2);
-    manager.readLeaf(2);
-    verify(delegate.readLeaf(2)).once();
-  }
-
-  void test_readLeaf_delegate() {
-    var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']);
-    when(delegate.readLeaf(2)).thenReturn(data);
-    expect(manager.readLeaf(2), data);
-  }
-
-  void test_writeIndex() {
-    var data = new IndexNodeData<int, int>([1], [10, 20]);
-    manager.writeIndex(1, data);
-    manager.writeIndex(2, data);
-    manager.writeIndex(3, data);
-    manager.writeIndex(4, data);
-    manager.writeIndex(1, data);
-    verifyZeroInteractions(delegate);
-    // only 4 nodes can be cached, 5-th one cause write to the delegate
-    manager.writeIndex(5, data);
-    verify(delegate.writeIndex(2, data)).once();
-  }
-
-  void test_writeLeaf() {
-    var data = new LeafNodeData<int, String>([1, 2], ['A', 'B']);
-    manager.writeLeaf(1, data);
-    manager.writeLeaf(2, data);
-    manager.writeLeaf(3, data);
-    manager.writeLeaf(4, data);
-    manager.writeLeaf(1, data);
-    verifyZeroInteractions(delegate);
-    // only 4 nodes can be cached, 5-th one cause write to the delegate
-    manager.writeLeaf(5, data);
-    verify(delegate.writeLeaf(2, data)).once();
-  }
-}
-
-
-@ReflectiveTestCase()
-class _FixedStringCodecTest {
-  ByteData buffer;
-  Uint8List bytes = new Uint8List(2 + 2 * 4);
-  FixedStringCodec codec = new FixedStringCodec(4);
-
-  void setUp() {
-    buffer = new ByteData.view(bytes.buffer);
-  }
-
-  test_empty() {
-    // encode
-    codec.encode(buffer, '');
-    expect(bytes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
-    // decode
-    expect(codec.decode(buffer), '');
-  }
-
-  test_fourChars() {
-    // encode
-    codec.encode(buffer, 'ABCD');
-    expect(bytes, [0, 4, 0, 65, 0, 66, 0, 67, 0, 68]);
-    // decode
-    expect(codec.decode(buffer), 'ABCD');
-  }
-
-  test_russian() {
-    // encode
-    codec.encode(buffer, 'ЩУКА');
-    expect(bytes, [0, 4, 4, 41, 4, 35, 4, 26, 4, 16]);
-    // decode
-    expect(codec.decode(buffer), 'ЩУКА');
-  }
-
-  test_tooManyChars() {
-    expect(() {
-      codec.encode(buffer, 'ABCDE');
-    }, throws);
-  }
-
-  test_twoChars() {
-    // encode
-    codec.encode(buffer, 'AB');
-    expect(bytes, [0, 2, 0, 65, 0, 66, 0, 0, 0, 0]);
-    // decode
-    expect(codec.decode(buffer), 'AB');
-  }
-}
-
-
-@ReflectiveTestCase()
-class _MemoryPageManagerTest {
-  static const PAGE_SIZE = 8;
-  MemoryPageManager manager = new MemoryPageManager(PAGE_SIZE);
-
-  test_alloc() {
-    int idA = manager.alloc();
-    int idB = manager.alloc();
-    expect(idB, isNot(idA));
-  }
-
-  test_free() {
-    int id = manager.alloc();
-    manager.free(id);
-    // double free
-    expect(() {
-      manager.free(id);
-    }, throws);
-  }
-
-  test_read() {
-    int id = manager.alloc();
-    Uint8List page = manager.read(id);
-    expect(page.length, PAGE_SIZE);
-  }
-
-  test_read_doesNotExist() {
-    expect(() {
-      manager.read(0);
-    }, throws);
-  }
-
-  test_write() {
-    int id = manager.alloc();
-    // do write
-    {
-      Uint8List page = new Uint8List(PAGE_SIZE);
-      page[3] = 42;
-      manager.write(id, page);
-    }
-    // now read
-    {
-      Uint8List page = manager.read(id);
-      expect(page.length, PAGE_SIZE);
-      expect(page[3], 42);
-    }
-  }
-
-  test_write_doesNotExist() {
-    expect(() {
-      Uint8List page = new Uint8List(PAGE_SIZE);
-      manager.write(42, page);
-    }, throws);
-  }
-
-  test_write_invalidLength() {
-    int id = manager.alloc();
-    Uint8List page = new Uint8List(0);
-    expect(() {
-      manager.write(id, page);
-    }, throws);
-  }
-}
-
-
-
-class _NodeManagerMock<K, V, N> extends TypedMock implements NodeManager<K, V,
-    N> {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-
-@ReflectiveTestCase()
-class _PageNodeManagerTest {
-  static const Codec KEY_CODEC = Uint32Codec.INSTANCE;
-  static const int PAGE_SIZE = 128;
-  static const Codec VALUE_CODEC = const FixedStringCodec(4);
-
-  PageNodeManager<int, String> nodeManager;
-  MemoryPageManager pageManager = new MemoryPageManager(PAGE_SIZE);
-
-  setUp() {
-    nodeManager = new PageNodeManager<int, String>(pageManager, KEY_CODEC,
-        VALUE_CODEC);
-  }
-
-  test_index_createDelete() {
-    int id = nodeManager.createIndex();
-    expect(nodeManager.isIndex(id), isTrue);
-    // do delete
-    nodeManager.delete(id);
-    expect(nodeManager.isIndex(id), isFalse);
-  }
-
-  test_index_readWrite() {
-    int id = nodeManager.createIndex();
-    expect(nodeManager.isIndex(id), isTrue);
-    // write
-    {
-      var keys = [1, 2];
-      var children = [10, 20, 30];
-      nodeManager.writeIndex(id, new IndexNodeData<int, int>(keys, children));
-    }
-    // check the page
-    {
-      Uint8List page = pageManager.read(id);
-      expect(page, [0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0,
-          2, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-          0, 0]);
-    }
-    // read
-    {
-      IndexNodeData<int, int> data = nodeManager.readIndex(id);
-      expect(data.keys, [1, 2]);
-      expect(data.children, [10, 20, 30]);
-    }
-  }
-
-  test_leaf_readWrite() {
-    int id = nodeManager.createLeaf();
-    expect(nodeManager.isIndex(id), isFalse);
-    // write
-    {
-      var keys = [1, 2, 3];
-      var children = ['A', 'BB', 'CCC'];
-      nodeManager.writeLeaf(id, new LeafNodeData<int, String>(keys, children));
-    }
-    // check the page
-    {
-      Uint8List page = pageManager.read(id);
-      expect(page, [0, 0, 0, 3, 0, 0, 0, 1, 0, 1, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0,
-          0, 2, 0, 2, 0, 66, 0, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 67, 0, 67, 0, 67, 0,
-          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-          0, 0]);
-    }
-    // read
-    {
-      LeafNodeData<int, String> data = nodeManager.readLeaf(id);
-      expect(data.keys, [1, 2, 3]);
-      expect(data.values, ['A', 'BB', 'CCC']);
-    }
-  }
-}
-
-@ReflectiveTestCase()
-class _Uint32CodecTest {
-  ByteData buffer;
-  Uint8List bytes = new Uint8List(4);
-  Uint32Codec codec = Uint32Codec.INSTANCE;
-
-  void setUp() {
-    buffer = new ByteData.view(bytes.buffer);
-  }
-
-  test_all() {
-    // encode
-    codec.encode(buffer, 42);
-    expect(bytes, [0, 0, 0, 42]);
-    // decode
-    expect(codec.decode(buffer), 42);
-  }
-}
diff --git a/pkg/analysis_server/test/index/store/typed_mocks.dart b/pkg/analysis_server/test/index/store/typed_mocks.dart
deleted file mode 100644
index 2530304..0000000
--- a/pkg/analysis_server/test/index/store/typed_mocks.dart
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.index.store.typed_mocks;
-
-import 'package:analysis_server/src/index/store/codec.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/index.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:typed_mock/typed_mock.dart';
-
-
-class MockAnalysisContext extends TypedMock implements AnalysisContext {
-  String _name;
-  MockAnalysisContext(this._name);
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-  String toString() => _name;
-}
-
-
-class MockClassElement extends TypedMock implements ClassElement {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockCompilationUnitElement extends TypedMock implements
-    CompilationUnitElement {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockConstructorElement extends TypedMock implements ConstructorElement {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockContextCodec extends TypedMock implements ContextCodec {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockDartType extends StringTypedMock implements DartType {
-  MockDartType([String toString]) : super(toString);
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockElement extends TypedMock implements Element {
-  String _name;
-  MockElement([this._name = '<element>']);
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-  String toString() => _name;
-}
-
-
-class MockElementCodec extends TypedMock implements ElementCodec {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockFieldElement extends TypedMock implements FieldElement {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockHtmlElement extends TypedMock implements HtmlElement {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockInstrumentedAnalysisContextImpl extends TypedMock implements
-    InstrumentedAnalysisContextImpl {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockLibraryElement extends TypedMock implements LibraryElement {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockLocation extends TypedMock implements Location {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockLogger extends TypedMock implements Logger {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockMethodElement extends TypedMock implements MethodElement {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockParameterElement extends StringTypedMock implements ParameterElement {
-  MockParameterElement([String toString]) : super(toString);
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockPropertyAccessorElement extends TypedMock implements
-    PropertyAccessorElement {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockRelationshipCodec extends TypedMock implements RelationshipCodec {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockSource extends TypedMock implements Source {
-  String _name;
-  MockSource(this._name);
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-  String toString() => _name;
-}
-
-
-class SourceMock extends TypedMock implements Source {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class StringTypedMock extends TypedMock {
-  String _toString;
-
-  StringTypedMock(this._toString);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    if (_toString != null) {
-      return _toString;
-    }
-    return super.toString();
-  }
-}
diff --git a/pkg/analysis_server/test/index/test_all.dart b/pkg/analysis_server/test/index/test_all.dart
deleted file mode 100644
index bb601f9..0000000
--- a/pkg/analysis_server/test/index/test_all.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.index.all;
-
-import 'package:unittest/unittest.dart';
-
-import 'b_plus_tree_test.dart' as b_plus_tree_test;
-import 'file_page_manager_test.dart' as file_page_manager_test;
-import 'index_test.dart' as index_test;
-import 'lru_cache_test.dart' as lru_cache_test;
-import 'page_node_manager_test.dart' as page_node_manager_test;
-import 'store/test_all.dart' as store_test_all;
-
-
-/**
- * Utility for manually running all tests.
- */
-main() {
-  groupSep = ' | ';
-  group('index', () {
-    b_plus_tree_test.main();
-    page_node_manager_test.main();
-    file_page_manager_test.main();
-    index_test.main();
-    lru_cache_test.main();
-    store_test_all.main();
-  });
-}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 395c235..a27a3e2 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -10,20 +10,20 @@
 @MirrorsUsed(targets: 'mocks', override: '*')
 import 'dart:mirrors';
 
+import 'package:analysis_services/index/index.dart';
+import 'package:analyzer/file_system/file_system.dart' as resource;
+import 'package:analyzer/file_system/memory_file_system.dart' as resource;
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel.dart';
 import 'package:analysis_server/src/operation/operation_analysis.dart';
 import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/package_map_provider.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/resource.dart' as resource;
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:matcher/matcher.dart';
 import 'package:mock/mock.dart';
 import 'package:unittest/unittest.dart';
-import 'package:analyzer/src/generated/index.dart';
 
 /**
  * Answer the absolute path the the SDK relative to the currently running
@@ -303,121 +303,6 @@
   }
 }
 
-class MockSdk implements DartSdk {
-
-  final resource.MemoryResourceProvider provider = new resource.MemoryResourceProvider();
-
-  MockSdk() {
-    // TODO(paulberry): Add to this as needed.
-    const Map<String, String> pathToContent = const {
-      "/lib/core/core.dart": '''
-          library dart.core;
-          class Object {}
-          class Function {}
-          class StackTrace {}
-          class Symbol {}
-          class Type {}
-
-          class String extends Object {}
-          class bool extends Object {}
-          abstract class num extends Object {
-            num operator +(num other);
-            num operator -(num other);
-            num operator *(num other);
-            num operator /(num other);
-          }
-          abstract class int extends num {
-            int operator -();
-          }
-          class double extends num {}
-          class DateTime extends Object {}
-          class Null extends Object {}
-
-          class Deprecated extends Object {
-            final String expires;
-            const Deprecated(this.expires);
-          }
-          const Object deprecated = const Deprecated("next release");
-
-          abstract class List<E> extends Object {
-            void add(E value);
-            E operator [](int index);
-            void operator []=(int index, E value);
-          }
-          class Map<K, V> extends Object {}
-
-          void print(Object object) {}
-          ''',
-
-      "/lib/html/dartium/html_dartium.dart": '''
-          library dart.html;
-          class HtmlElement {}
-          ''',
-
-      "/lib/math/math.dart": '''
-          library dart.math;
-          '''
-    };
-
-    pathToContent.forEach((String path, String content) {
-      provider.newFile(path, content);
-    });
-  }
-
-  // Not used
-  @override
-  AnalysisContext get context => throw unimplemented;
-
-  @override
-  Source fromEncoding(UriKind kind, Uri uri) {
-    resource.Resource file = provider.getResource(uri.path);
-    if (file is resource.File) {
-      return file.createSource(kind);
-    }
-    return null;
-  }
-
-  UnimplementedError get unimplemented => new UnimplementedError();
-
-  @override
-  SdkLibrary getSdkLibrary(String dartUri) {
-    // getSdkLibrary() is only used to determine whether a library is internal
-    // to the SDK.  The mock SDK doesn't have any internals, so it's safe to
-    // return null.
-    return null;
-  }
-
-  @override
-  Source mapDartUri(String dartUri) {
-    const Map<String, String> uriToPath = const {
-      "dart:core": "/lib/core/core.dart",
-      "dart:html": "/lib/html/dartium/html_dartium.dart",
-      "dart:math": "/lib/math/math.dart"
-    };
-
-    String path = uriToPath[dartUri];
-    if (path != null) {
-      resource.File file = provider.getResource(path);
-      return file.createSource(UriKind.DART_URI);
-    }
-
-    // If we reach here then we tried to use a dartUri that's not in the
-    // table above.
-    throw unimplemented;
-  }
-
-  // Not used.
-  @override
-  List<SdkLibrary> get sdkLibraries => throw unimplemented;
-
-  // Not used.
-  @override
-  String get sdkVersion => throw unimplemented;
-
-  // Not used.
-  @override
-  List<String> get uris => throw unimplemented;
-}
 
 /**
  * A mock [PackageMapProvider].
diff --git a/pkg/analysis_server/test/operation/operation_analysis_test.dart b/pkg/analysis_server/test/operation/operation_analysis_test.dart
index 5c45482..c5f5378 100644
--- a/pkg/analysis_server/test/operation/operation_analysis_test.dart
+++ b/pkg/analysis_server/test/operation/operation_analysis_test.dart
@@ -6,13 +6,13 @@
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/operation/operation_analysis.dart';
+import 'package:analysis_testing/mocks.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
-import '../index/store/typed_mocks.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
@@ -30,7 +30,7 @@
 
 @ReflectiveTestCase()
 class Test_errorToJson {
-  Source source = new SourceMock();
+  Source source = new MockSource();
   LineInfo lineInfo;
   AnalysisError analysisError = new AnalysisErrorMock();
 
diff --git a/pkg/analysis_server/test/package_map_provider_test.dart b/pkg/analysis_server/test/package_map_provider_test.dart
index 3e62e29..52708c0 100644
--- a/pkg/analysis_server/test/package_map_provider_test.dart
+++ b/pkg/analysis_server/test/package_map_provider_test.dart
@@ -7,8 +7,9 @@
 import 'dart:convert';
 
 import 'package:analysis_server/src/package_map_provider.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:unittest/unittest.dart';
-import 'package:analysis_server/src/resource.dart';
 
 main() {
   groupSep = ' | ';
diff --git a/pkg/analysis_server/test/package_uri_resolver_test.dart b/pkg/analysis_server/test/package_uri_resolver_test.dart
index e9c6e28..d3ceebc 100644
--- a/pkg/analysis_server/test/package_uri_resolver_test.dart
+++ b/pkg/analysis_server/test/package_uri_resolver_test.dart
@@ -7,11 +7,12 @@
 import 'dart:collection';
 
 import 'package:analysis_server/src/package_uri_resolver.dart';
-import 'package:analysis_server/src/resource.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
-import 'reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
@@ -33,12 +34,6 @@
   tearDown() {
   }
 
-  void test_isPackageUri() {
-    Uri uri = Uri.parse('package:test/test.dart');
-    expect(uri.scheme, 'package');
-    expect(PackageMapUriResolver.isPackageUri(uri), isTrue);
-  }
-
   void test_fromEncoding_nonPackage() {
     UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
     Uri uri = Uri.parse('file:/does/not/exist.dart');
@@ -54,6 +49,12 @@
     expect(result.fullName, '/does/not/exist.dart');
   }
 
+  void test_isPackageUri() {
+    Uri uri = Uri.parse('package:test/test.dart');
+    expect(uri.scheme, 'package');
+    expect(PackageMapUriResolver.isPackageUri(uri), isTrue);
+  }
+
   void test_isPackageUri_null_scheme() {
     Uri uri = Uri.parse('foo.dart');
     expect(uri.scheme, '');
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index 985a8b3..9e6036b 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -7,10 +7,9 @@
 import 'dart:convert';
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
-import 'reflective_tests.dart';
-
 
 Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());
 
@@ -146,13 +145,6 @@
         equals(['foo', 'bar']));
   }
 
-  void test_isList() {
-    expect(makeDatum(3).isList, isFalse);
-    expect(makeDatum(null).isList, isTrue);
-    expect(makeDatum([]).isList, isTrue);
-    expect(makeDatum(['foo', 'bar']).isList, isTrue);
-  }
-
   void test_asList_nonList() {
     expect(() => makeDatum(3).asList((datum) => null), _throwsInvalidParameter);
   }
@@ -166,14 +158,6 @@
     expect(() => makeDatum(3).asString(), _throwsInvalidParameter);
   }
 
-  void test_isStringList() {
-    expect(makeDatum(['foo', 'bar']).isStringList, isTrue);
-    expect(makeDatum([]).isStringList, isTrue);
-    expect(makeDatum(null).isStringList, isTrue);
-    expect(makeDatum(['foo', 1]).isStringList, isFalse);
-    expect(makeDatum({}).isStringList, isFalse);
-  }
-
   void test_asStringList() {
     expect(makeDatum(['foo', 'bar']).asStringList(), equals(['foo', 'bar']));
     expect(makeDatum([]).asStringList(), equals([]));
@@ -182,24 +166,6 @@
     expect(() => makeDatum({}).asStringList(), _throwsInvalidParameter);
   }
 
-  void test_isStringListMap() {
-    expect(makeDatum({
-      'key1': ['value11', 'value12'],
-      'key2': ['value21', 'value22']
-    }).isStringListMap, isTrue);
-    expect(makeDatum({
-      'key1': 10,
-      'key2': 20
-    }).isStringListMap, isFalse);
-    expect(makeDatum({
-      'key1': [11, 12],
-      'key2': [21, 22]
-    }).isStringListMap, isFalse);
-    expect(makeDatum({}).isStringListMap, isTrue);
-    expect(makeDatum(null).isStringListMap, isTrue);
-    expect(makeDatum(3).isStringListMap, isFalse);
-  }
-
   void test_asStringListMap() {
     {
       var map = {
@@ -224,42 +190,6 @@
     }
   }
 
-  void test_isMap() {
-    expect(makeDatum({
-      'key1': 'value1',
-      'key2': 'value2'
-    }).isMap, isTrue);
-    expect(makeDatum({}).isMap, isTrue);
-    expect(makeDatum(null).isMap, isTrue);
-    expect(makeDatum({
-      'key1': 'value1',
-      'key2': 2
-    }).isMap, isTrue);
-    expect(makeDatum({
-      'key1': 1,
-      'key2': 2
-    }).isMap, isTrue);
-    expect(makeDatum([]).isMap, isFalse);
-  }
-
-  void test_isStringMap() {
-    expect(makeDatum({
-      'key1': 'value1',
-      'key2': 'value2'
-    }).isStringMap, isTrue);
-    expect(makeDatum({}).isStringMap, isTrue);
-    expect(makeDatum(null).isStringMap, isTrue);
-    expect(makeDatum({
-      'key1': 'value1',
-      'key2': 2
-    }).isStringMap, isFalse);
-    expect(makeDatum({
-      'key1': 1,
-      'key2': 2
-    }).isStringMap, isFalse);
-    expect(makeDatum([]).isMap, isFalse);
-  }
-
   void test_asStringMap() {
     expect(makeDatum({
       'key1': 'value1',
@@ -292,7 +222,7 @@
     }), _throwsInvalidParameter);
   }
 
-   void test_forEachMap_null() {
+  void test_forEachMap_null() {
     makeDatum(null).forEachMap((key, value) {
       fail('Empty map should not be iterated');
     });
@@ -340,7 +270,7 @@
     expect(makeDatum(null).hasKey('foo'), isFalse);
   }
 
-  void test_indexOperator_hasKey() {
+   void test_indexOperator_hasKey() {
     var indexResult = makeDatum({
       'foo': 'bar'
     })['foo'];
@@ -349,10 +279,6 @@
     expect(indexResult.path, equals('myPath.foo'));
   }
 
-  void test_indexOperator_null() {
-    expect(() => makeDatum(null)['foo'], _throwsInvalidParameter);
-  }
-
   void test_indexOperator_missingKey() {
     expect(() => makeDatum({
       'foo': 'bar'
@@ -363,6 +289,79 @@
     expect(() => makeDatum(1)['foo'], _throwsInvalidParameter);
   }
 
+  void test_indexOperator_null() {
+    expect(() => makeDatum(null)['foo'], _throwsInvalidParameter);
+  }
+
+  void test_isList() {
+    expect(makeDatum(3).isList, isFalse);
+    expect(makeDatum(null).isList, isTrue);
+    expect(makeDatum([]).isList, isTrue);
+    expect(makeDatum(['foo', 'bar']).isList, isTrue);
+  }
+
+  void test_isMap() {
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 'value2'
+    }).isMap, isTrue);
+    expect(makeDatum({}).isMap, isTrue);
+    expect(makeDatum(null).isMap, isTrue);
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 2
+    }).isMap, isTrue);
+    expect(makeDatum({
+      'key1': 1,
+      'key2': 2
+    }).isMap, isTrue);
+    expect(makeDatum([]).isMap, isFalse);
+  }
+
+  void test_isStringList() {
+    expect(makeDatum(['foo', 'bar']).isStringList, isTrue);
+    expect(makeDatum([]).isStringList, isTrue);
+    expect(makeDatum(null).isStringList, isTrue);
+    expect(makeDatum(['foo', 1]).isStringList, isFalse);
+    expect(makeDatum({}).isStringList, isFalse);
+  }
+
+  void test_isStringListMap() {
+    expect(makeDatum({
+      'key1': ['value11', 'value12'],
+      'key2': ['value21', 'value22']
+    }).isStringListMap, isTrue);
+    expect(makeDatum({
+      'key1': 10,
+      'key2': 20
+    }).isStringListMap, isFalse);
+    expect(makeDatum({
+      'key1': [11, 12],
+      'key2': [21, 22]
+    }).isStringListMap, isFalse);
+    expect(makeDatum({}).isStringListMap, isTrue);
+    expect(makeDatum(null).isStringListMap, isTrue);
+    expect(makeDatum(3).isStringListMap, isFalse);
+  }
+
+  void test_isStringMap() {
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 'value2'
+    }).isStringMap, isTrue);
+    expect(makeDatum({}).isStringMap, isTrue);
+    expect(makeDatum(null).isStringMap, isTrue);
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 2
+    }).isStringMap, isFalse);
+    expect(makeDatum({
+      'key1': 1,
+      'key2': 2
+    }).isStringMap, isFalse);
+    expect(makeDatum([]).isMap, isFalse);
+  }
+
   static RequestDatum makeDatum(dynamic datum) {
     return new RequestDatum(request, 'myPath', datum);
   }
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index c02772a..daaac12 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -4,9 +4,12 @@
 
 import 'package:unittest/unittest.dart';
 
+import 'analysis_hover_test.dart' as analysis_hover_test;
 import 'analysis_notification_highlights_test.dart' as analysis_notification_highlights_test;
 import 'analysis_notification_navigation_test.dart' as analysis_notification_navigation_test;
+import 'analysis_notification_occurrences_test.dart' as analysis_notification_occurrences_test;
 import 'analysis_notification_outline_test.dart' as analysis_notification_outline_test;
+import 'analysis_notification_overrides_test.dart' as analysis_notification_overrides_test;
 import 'analysis_server_test.dart' as analysis_server_test;
 import 'channel_test.dart' as channel_test;
 import 'computer/test_all.dart' as computer_test_all;
@@ -16,12 +19,10 @@
 import 'domain_edit_test.dart' as domain_edit_test;
 import 'domain_search_test.dart' as domain_search_test;
 import 'domain_server_test.dart' as domain_server_test;
-import 'index/test_all.dart' as index_test_all;
 import 'operation/test_all.dart' as operation_test_all;
 import 'package_map_provider_test.dart' as package_map_provider_test;
 import 'package_uri_resolver_test.dart' as package_uri_resolver_test;
 import 'protocol_test.dart' as protocol_test;
-import 'resource_test.dart' as resource_test;
 import 'socket_server_test.dart' as socket_server_test;
 
 /**
@@ -30,9 +31,12 @@
 main() {
   groupSep = ' | ';
   group('analysis_server', () {
+    analysis_hover_test.main();
     analysis_notification_highlights_test.main();
     analysis_notification_navigation_test.main();
+    analysis_notification_occurrences_test.main();
     analysis_notification_outline_test.main();
+    analysis_notification_overrides_test.main();
     analysis_server_test.main();
     channel_test.main();
     computer_test_all.main();
@@ -42,12 +46,10 @@
     domain_edit_test.main();
     domain_search_test.main();
     domain_server_test.main();
-    index_test_all.main();
     operation_test_all.main();
     package_map_provider_test.main();
     package_uri_resolver_test.main();
     protocol_test.main();
-    resource_test.main();
     socket_server_test.main();
   });
 }
\ No newline at end of file
diff --git a/pkg/analysis_services/lib/index/index.dart b/pkg/analysis_services/lib/index/index.dart
new file mode 100644
index 0000000..d8bb20d
--- /dev/null
+++ b/pkg/analysis_services/lib/index/index.dart
@@ -0,0 +1,482 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.index;
+
+import 'dart:async';
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/html.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * The interface [Index] defines the behavior of objects that maintain an index
+ * storing relations between [Element]s.
+ *
+ * Any modification operations are executed before any read operation.
+ * There is no guarantee about the order in which the [Future]s for read
+ * operations will complete.
+ */
+abstract class Index {
+  /**
+   * Answers index statistics.
+   */
+  String get statistics;
+
+  /**
+   * Removes from the index all the information.
+   */
+  void clear();
+
+  /**
+   * Asynchronously returns a list containing all of the locations of the
+   * elements that have the given [relationship] with the given [element].
+   *
+   * For example, if the element represents a function and the relationship is
+   * the `is-invoked-by` relationship, then the locations will be all of the
+   * places where the function is invoked.
+   *
+   * [element] - the element that has the relationship with the locations to be
+   * returned.
+   *
+   * [relationship] - the relationship between the given element and the
+   * locations to be returned.
+   */
+  Future<List<Location>> getRelationships(Element element,
+      Relationship relationship);
+
+  /**
+   * Processes the given [HtmlUnit] in order to record the relationships.
+   *
+   * [context] - the [AnalysisContext] in which [HtmlUnit] was resolved.
+   * [unit] - the [HtmlUnit] being indexed.
+   */
+  void indexHtmlUnit(AnalysisContext context, HtmlUnit unit);
+
+  /**
+   * Processes the given [CompilationUnit] in order to record the relationships.
+   *
+   * [context] - the [AnalysisContext] in which [CompilationUnit] was resolved.
+   * [unit] - the [CompilationUnit] being indexed.
+   */
+  void indexUnit(AnalysisContext context, CompilationUnit unit);
+
+  /**
+   * Removes from the index all of the information associated with [context].
+   *
+   * This method should be invoked when [context] is disposed.
+   */
+  void removeContext(AnalysisContext context);
+
+  /**
+   * Removes from the index all of the information associated with elements or
+   * locations in [source]. This includes relationships between an element in
+   * [source] and any other locations, relationships between any other elements
+   * and a location within [source].
+   *
+   * This method should be invoked when [source] is no longer part of the code
+   * base.
+   *
+   * [context] - the [AnalysisContext] in which [source] being removed
+   * [source] - the [Source] being removed
+   */
+  void removeSource(AnalysisContext context, Source source);
+
+  /**
+   * Removes from the index all of the information associated with elements or
+   * locations in the given sources. This includes relationships between an
+   * element in the given sources and any other locations, relationships between
+   * any other elements and a location within the given sources.
+   *
+   * This method should be invoked when multiple sources are no longer part of
+   * the code base.
+   *
+   * [context] - the [AnalysisContext] in which [Source]s being removed.
+   * [container] - the [SourceContainer] holding the sources being removed.
+   */
+  void removeSources(AnalysisContext context, SourceContainer container);
+
+  /**
+   * Starts the index.
+   * Should be called before any other method.
+   */
+  void run();
+
+  /**
+   * Stops the index.
+   * After calling this method operations may not be executed.
+   */
+  void stop();
+}
+
+
+/**
+ * Constants used when populating and accessing the index.
+ */
+class IndexConstants {
+  /**
+   * Reference to some closing tag of an XML element.
+   */
+  static final Relationship ANGULAR_CLOSING_TAG_REFERENCE =
+      Relationship.getRelationship("angular-closing-tag-reference");
+
+  /**
+   * Reference to some [AngularElement].
+   */
+  static final Relationship ANGULAR_REFERENCE = Relationship.getRelationship(
+      "angular-reference");
+
+  /**
+   * The relationship used to indicate that a container (the left-operand)
+   * contains the definition of a class at a specific location (the right
+   * operand).
+   */
+  static final Relationship DEFINES_CLASS = Relationship.getRelationship(
+      "defines-class");
+
+  /**
+   * The relationship used to indicate that a container (the left-operand)
+   * contains the definition of a class type alias at a specific location (the
+   * right operand).
+   */
+  static final Relationship DEFINES_CLASS_ALIAS = Relationship.getRelationship(
+      "defines-class-alias");
+
+  /**
+   * The relationship used to indicate that a container (the left-operand)
+   * contains the definition of a function at a specific location (the right
+   * operand).
+   */
+  static final Relationship DEFINES_FUNCTION = Relationship.getRelationship(
+      "defines-function");
+
+  /**
+   * The relationship used to indicate that a container (the left-operand)
+   * contains the definition of a function type at a specific location (the
+   * right operand).
+   */
+  static final Relationship DEFINES_FUNCTION_TYPE =
+      Relationship.getRelationship("defines-function-type");
+
+  /**
+   * The relationship used to indicate that a container (the left-operand)
+   * contains the definition of a method at a specific location (the right
+   * operand).
+   */
+  static final Relationship DEFINES_VARIABLE = Relationship.getRelationship(
+      "defines-variable");
+
+  /**
+   * The relationship used to indicate that a name (the left-operand) is defined
+   * at a specific location (the right operand).
+   */
+  static final Relationship IS_DEFINED_BY = Relationship.getRelationship(
+      "is-defined-by");
+
+  /**
+   * The relationship used to indicate that a type (the left-operand) is
+   * extended by a type at a specific location (the right operand).
+   */
+  static final Relationship IS_EXTENDED_BY = Relationship.getRelationship(
+      "is-extended-by");
+
+  /**
+   * The relationship used to indicate that a type (the left-operand) is
+   * implemented by a type at a specific location (the right operand).
+   */
+  static final Relationship IS_IMPLEMENTED_BY = Relationship.getRelationship(
+      "is-implemented-by");
+
+  /**
+   * The relationship used to indicate that an element (the left-operand) is
+   * invoked at a specific location (the right operand). This is used for
+   * functions.
+   */
+  static final Relationship IS_INVOKED_BY = Relationship.getRelationship(
+      "is-invoked-by");
+
+  /**
+   * The relationship used to indicate that an element (the left-operand) is
+   * invoked at a specific location (the right operand). This is used for
+   * methods.
+   */
+  static final Relationship IS_INVOKED_BY_QUALIFIED =
+      Relationship.getRelationship("is-invoked-by-qualified");
+
+  /**
+   * The relationship used to indicate that an element (the left-operand) is
+   * invoked at a specific location (the right operand). This is used for
+   * methods.
+   */
+  static final Relationship IS_INVOKED_BY_UNQUALIFIED =
+      Relationship.getRelationship("is-invoked-by-unqualified");
+
+  /**
+   * The relationship used to indicate that a type (the left-operand) is mixed
+   * into a type at a specific location (the right operand).
+   */
+  static final Relationship IS_MIXED_IN_BY = Relationship.getRelationship(
+      "is-mixed-in-by");
+
+  /**
+   * The relationship used to indicate that a parameter or variable (the
+   * left-operand) is read at a specific location (the right operand).
+   */
+  static final Relationship IS_READ_BY = Relationship.getRelationship(
+      "is-read-by");
+
+  /**
+   * The relationship used to indicate that a parameter or variable (the
+   * left-operand) is both read and modified at a specific location (the right
+   * operand).
+   */
+  static final Relationship IS_READ_WRITTEN_BY = Relationship.getRelationship(
+      "is-read-written-by");
+
+  /**
+   * The relationship used to indicate that an element (the left-operand) is
+   * referenced at a specific location (the right operand). This is used for
+   * everything except read/write operations for fields, parameters, and
+   * variables. Those use either [IS_REFERENCED_BY_QUALIFIED],
+   * [IS_REFERENCED_BY_UNQUALIFIED], [IS_READ_BY], [IS_WRITTEN_BY] or
+   * [IS_READ_WRITTEN_BY], as appropriate.
+   */
+  static final Relationship IS_REFERENCED_BY = Relationship.getRelationship(
+      "is-referenced-by");
+
+  /**
+   * The relationship used to indicate that an element (the left-operand) is
+   * referenced at a specific location (the right operand). This is used for
+   * field accessors and methods.
+   */
+  static final Relationship IS_REFERENCED_BY_QUALIFIED =
+      Relationship.getRelationship("is-referenced-by-qualified");
+
+  /**
+   * The relationship used to indicate that a [NameElement] (the left-operand)
+   * is referenced at a specific location (the right operand). This is used for
+   * qualified resolved references to methods and fields.
+   */
+  static final Relationship IS_REFERENCED_BY_QUALIFIED_RESOLVED =
+      Relationship.getRelationship("is-referenced-by-qualified-resolved");
+
+  /**
+   * The relationship used to indicate that an [NameElement] (the left-operand)
+   * is referenced at a specific location (the right operand). This is used for
+   * qualified unresolved references to methods and fields.
+   */
+  static final Relationship IS_REFERENCED_BY_QUALIFIED_UNRESOLVED =
+      Relationship.getRelationship("is-referenced-by-qualified-unresolved");
+
+  /**
+   * The relationship used to indicate that an element (the left-operand) is
+   * referenced at a specific location (the right operand). This is used for
+   * field accessors and methods.
+   */
+  static final Relationship IS_REFERENCED_BY_UNQUALIFIED =
+      Relationship.getRelationship("is-referenced-by-unqualified");
+
+  /**
+   * The relationship used to indicate that a parameter or variable (the
+   * left-operand) is modified (assigned to) at a specific location (the right
+   * operand).
+   */
+  static final Relationship IS_WRITTEN_BY = Relationship.getRelationship(
+      "is-written-by");
+
+  /**
+   * The relationship used to indicate that a [NameElement] (the left-operand)
+   * is invoked at a specific location (the right operand). This is used for
+   * resolved invocations.
+   */
+  static final Relationship NAME_IS_INVOKED_BY_RESOLVED =
+      Relationship.getRelationship("name-is-invoked-by-resolved");
+
+  /**
+   * The relationship used to indicate that a [NameElement] (the left-operand)
+   * is invoked at a specific location (the right operand). This is used for
+   * unresolved invocations.
+   */
+  static final Relationship NAME_IS_INVOKED_BY_UNRESOLVED =
+      Relationship.getRelationship("name-is-invoked-by-unresolved");
+
+  /**
+   * The relationship used to indicate that a [NameElement] (the left-operand)
+   * is read at a specific location (the right operand).
+   */
+  static final Relationship NAME_IS_READ_BY_RESOLVED =
+      Relationship.getRelationship("name-is-read-by-resolved");
+
+  /**
+   * The relationship used to indicate that a [NameElement] (the left-operand)
+   * is read at a specific location (the right operand).
+   */
+  static final Relationship NAME_IS_READ_BY_UNRESOLVED =
+      Relationship.getRelationship("name-is-read-by-unresolved");
+
+  /**
+   * The relationship used to indicate that a [NameElement] (the left-operand)
+   * is both read and written at a specific location (the right operand).
+   */
+  static final Relationship NAME_IS_READ_WRITTEN_BY_RESOLVED =
+      Relationship.getRelationship("name-is-read-written-by-resolved");
+
+  /**
+   * The relationship used to indicate that a [NameElement] (the left-operand)
+   * is both read and written at a specific location (the right operand).
+   */
+  static final Relationship NAME_IS_READ_WRITTEN_BY_UNRESOLVED =
+      Relationship.getRelationship("name-is-read-written-by-unresolved");
+
+  /**
+   * The relationship used to indicate that a [NameElement] (the left-operand)
+   * is written at a specific location (the right operand).
+   */
+  static final Relationship NAME_IS_WRITTEN_BY_RESOLVED =
+      Relationship.getRelationship("name-is-written-by-resolved");
+
+  /**
+   * The relationship used to indicate that a [NameElement] (the left-operand)
+   * is written at a specific location (the right operand).
+   */
+  static final Relationship NAME_IS_WRITTEN_BY_UNRESOLVED =
+      Relationship.getRelationship("name-is-written-by-unresolved");
+
+  /**
+   * An element used to represent the universe.
+   */
+  static final Element UNIVERSE = UniverseElement.INSTANCE;
+
+  IndexConstants._();
+}
+
+
+/**
+ * Instances of the class [Location] represent a location related to an element.
+ *
+ * The location is expressed as an offset and length, but the offset is relative
+ * to the resource containing the element rather than the start of the element
+ * within that resource.
+ */
+class Location {
+  /**
+   * An empty array of locations.
+   */
+  static const List<Location> EMPTY_ARRAY = const <Location>[];
+
+  /**
+   * The element containing this location.
+   */
+  final Element element;
+
+  /**
+   * The offset of this location within the resource containing the element.
+   */
+  final int offset;
+
+  /**
+   * The length of this location.
+   */
+  final int length;
+
+  /**
+   * Initializes a newly create location to be relative to the given element at
+   * the given [offset] with the given [length].
+   *
+   * [element] - the [Element] containing this location.
+   * [offset] - the offset within the resource containing the [element].
+   * [length] - the length of this location
+   */
+  Location(this.element, this.offset, this.length) {
+    if (element == null) {
+      throw new ArgumentError("element location cannot be null");
+    }
+  }
+
+  @override
+  String toString() => "[${offset} - ${(offset + length)}) in ${element}";
+}
+
+
+/**
+ * A [Location] with attached data.
+ */
+class LocationWithData<D> extends Location {
+  final D data;
+
+  LocationWithData(Location location, this.data) : super(location.element,
+      location.offset, location.length);
+}
+
+
+/**
+ * An [Element] which is used to index references to the name without specifying
+ * a concrete kind of this name - field, method or something else.
+ */
+class NameElement extends ElementImpl {
+  NameElement(String name) : super("name:${name}", -1);
+
+  @override
+  ElementKind get kind => ElementKind.NAME;
+
+  @override
+  accept(ElementVisitor visitor) => null;
+}
+
+
+/**
+ * Relationship between an element and a location. Relationships are identified
+ * by a globally unique identifier.
+ */
+class Relationship {
+  /**
+   * A table mapping relationship identifiers to relationships.
+   */
+  static Map<String, Relationship> _RELATIONSHIP_MAP = {};
+
+  /**
+   * The unique identifier for this relationship.
+   */
+  final String identifier;
+
+  /**
+   * Initialize a newly created relationship with the given unique identifier.
+   */
+  Relationship(this.identifier);
+
+  @override
+  String toString() => identifier;
+
+  /**
+   * Returns the relationship with the given unique [identifier].
+   */
+  static Relationship getRelationship(String identifier) {
+    Relationship relationship = _RELATIONSHIP_MAP[identifier];
+    if (relationship == null) {
+      relationship = new Relationship(identifier);
+      _RELATIONSHIP_MAP[identifier] = relationship;
+    }
+    return relationship;
+  }
+}
+
+
+/**
+ * An element to use when we want to request "defines" relations without
+ * specifying an exact library.
+ */
+class UniverseElement extends ElementImpl {
+  static final UniverseElement INSTANCE = new UniverseElement._();
+
+  UniverseElement._() : super("--universe--", -1);
+
+  @override
+  ElementKind get kind => ElementKind.UNIVERSE;
+
+  @override
+  accept(ElementVisitor visitor) => null;
+}
diff --git a/pkg/analysis_services/lib/index/index_store.dart b/pkg/analysis_services/lib/index/index_store.dart
new file mode 100644
index 0000000..cb678ac
--- /dev/null
+++ b/pkg/analysis_services/lib/index/index_store.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.index_store;
+
+import 'dart:async';
+
+import 'package:analysis_services/index/index.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * A container with information computed by an index - relations between
+ * elements.
+ */
+abstract class IndexStore {
+  /**
+   * Answers index statistics.
+   */
+  String get statistics;
+
+  /**
+   * Notifies the index store that we are going to index an unit with the given
+   * [unitElement].
+   *
+   * If the unit is a part of a library, then all its locations are removed.
+   *
+   * If it is a defining compilation unit of a library, then index store also
+   * checks if some previously indexed parts of the library are not parts of the
+   * library anymore, and clears their information.
+   *
+   * [context] - the [AnalysisContext] in which unit being indexed.
+   * [unitElement] - the element of the unit being indexed.
+   *
+   * Returns `true` if the given [unitElement] may be indexed, or `false` if
+   * belongs to a disposed [AnalysisContext], is not resolved completely, etc.
+   */
+  bool aboutToIndexDart(AnalysisContext context,
+      CompilationUnitElement unitElement);
+
+  /**
+   * Notifies the index store that we are going to index an unit with the given
+   * [htmlElement].
+   *
+   * [context] - the [AnalysisContext] in which unit being indexed.
+   * [htmlElement] - the [HtmlElement] being indexed.
+   *
+   * Returns `true` if the given [htmlElement] may be indexed, or `false` if
+   * belongs to a disposed [AnalysisContext], is not resolved completely, etc.
+   */
+  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement);
+
+  /**
+   * Removes all of the information.
+   */
+  void clear();
+
+  /**
+   * Notifies that index store that the current Dart or HTML unit indexing is
+   * done.
+   *
+   * If this method is not invoked after corresponding "aboutToIndex*"
+   * invocation, all recorded information may be lost.
+   */
+  void doneIndex();
+
+  /**
+   * Returns a [Future] that completes with locations of the elements that have
+   * the given [relationship] with the given [element].
+   *
+   * For example, if the [element] represents a function and the relationship is
+   * the `is-invoked-by` relationship, then the returned locations will be all
+   * of the places where the function is invoked.
+   *
+   * [element] - the the [Element] that has the relationship with the locations
+   *    to be returned.
+   * [relationship] - the [Relationship] between the given element and the
+   *    locations to be returned
+   */
+  Future<List<Location>> getRelationships(Element element,
+      Relationship relationship);
+
+  /**
+   * Records that the given [element] and [location] have the given
+   * [relationship].
+   *
+   * For example, if the [relationship] is the `is-invoked-by` relationship,
+   * then [element] would be the function being invoked and [location] would be
+   * the point at which it is referenced. Each element can have the same
+   * relationship with multiple locations. In other words, if the following code
+   * were executed
+   *
+   *     recordRelationship(element, isReferencedBy, location1);
+   *     recordRelationship(element, isReferencedBy, location2);
+   *
+   * then both relationships would be maintained in the index and the result of executing
+   *
+   *     getRelationship(element, isReferencedBy);
+   *
+   * would be a list containing both `location1` and `location2`.
+   *
+   * [element] - the [Element] that is related to the location.
+   * [relationship] - the [Relationship] between the element and the location.
+   * [location] the [Location] where relationship happens.
+   */
+  void recordRelationship(Element element, Relationship relationship,
+      Location location);
+
+  /**
+   * Removes from the index all of the information associated with [context].
+   *
+   * This method should be invoked when [context] is disposed.
+   *
+   * [context] - the [AnalysisContext] being removed.
+   */
+  void removeContext(AnalysisContext context);
+
+  /**
+   * Removes from the index all of the information associated with elements or
+   * locations in [source]. This includes relationships between an element in
+   * [source] and any other locations, relationships between any other elements
+   * and locations within [source].
+   *
+   * This method should be invoked when [source] is no longer part of the code
+   * base.
+   *
+   * [context] - the [AnalysisContext] in which [source] being removed.
+   * [source] - the [Source] being removed
+   */
+  void removeSource(AnalysisContext context, Source source);
+
+  /**
+   * Removes from the index all of the information associated with elements or
+   * locations in the given sources. This includes relationships between an
+   * element in the given sources and any other locations, relationships between
+   * any other elements and a location within the given sources.
+   *
+   * This method should be invoked when multiple sources are no longer part of
+   * the code base.
+   *
+   * [context] - the [AnalysisContext] in which [Source]s being removed.
+   * [container] - the [SourceContainer] holding the sources being removed.
+   */
+  void removeSources(AnalysisContext context, SourceContainer container);
+}
diff --git a/pkg/analysis_services/lib/index/local_file_index.dart b/pkg/analysis_services/lib/index/local_file_index.dart
new file mode 100644
index 0000000..3e202d9
--- /dev/null
+++ b/pkg/analysis_services/lib/index/local_file_index.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.index.local_file_index;
+
+import 'dart:io';
+
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/src/index/local_index.dart';
+import 'package:analysis_services/src/index/store/codec.dart';
+import 'package:analysis_services/src/index/store/separate_file_manager.dart';
+import 'package:analysis_services/src/index/store/split_store.dart';
+import 'package:analyzer/src/generated/engine.dart';
+
+
+Index createLocalFileIndex(Directory directory) {
+  var fileManager = new SeparateFileManager(directory);
+  var stringCodec = new StringCodec();
+  var nodeManager = new FileNodeManager(fileManager,
+      AnalysisEngine.instance.logger, stringCodec, new ContextCodec(),
+      new ElementCodec(stringCodec), new RelationshipCodec(stringCodec));
+  return new LocalIndex(nodeManager);
+}
diff --git a/pkg/analysis_services/lib/index/local_memory_index.dart b/pkg/analysis_services/lib/index/local_memory_index.dart
new file mode 100644
index 0000000..7f4c8fa
--- /dev/null
+++ b/pkg/analysis_services/lib/index/local_memory_index.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.index.memory_file_index;
+
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/src/index/local_index.dart';
+import 'package:analysis_services/src/index/store/memory_node_manager.dart';
+
+
+Index createLocalMemoryIndex() {
+  return new LocalIndex(new MemoryNodeManager());
+}
diff --git a/pkg/analysis_services/lib/search/search_engine.dart b/pkg/analysis_services/lib/search/search_engine.dart
new file mode 100644
index 0000000..a2579dd
--- /dev/null
+++ b/pkg/analysis_services/lib/search/search_engine.dart
@@ -0,0 +1,419 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library engine.search_engine;
+
+import 'dart:async';
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * A [Comparator] that can be used to sort the [SearchMatch]s based on the names
+ * of the matched elements.
+ */
+final Comparator<SearchMatch> SEARCH_MATCH_NAME_COMPARATOR =
+    (SearchMatch firstMatch, SearchMatch secondMatch) {
+  String firstName = firstMatch.element.displayName;
+  String secondName = secondMatch.element.displayName;
+  return firstName.compareTo(secondName);
+};
+
+
+/**
+ * Instances of the enum [MatchKind] represent the kind of reference that was
+ * found when a match represents a reference to an element.
+ */
+class MatchKind extends Enum<MatchKind> {
+  /**
+   * A reference to an Angular element.
+   */
+  static const MatchKind ANGULAR_REFERENCE = const MatchKind(
+      'ANGULAR_REFERENCE', 0);
+
+  /**
+   * A reference to an Angular element.
+   */
+  static const MatchKind ANGULAR_CLOSING_TAG_REFERENCE = const MatchKind(
+      'ANGULAR_CLOSING_TAG_REFERENCE', 1);
+
+  /**
+   * A declaration of a class.
+   */
+  static const MatchKind CLASS_DECLARATION = const MatchKind(
+      'CLASS_DECLARATION', 2);
+
+  /**
+   * A declaration of a class alias.
+   */
+  static const MatchKind CLASS_ALIAS_DECLARATION = const MatchKind(
+      'CLASS_ALIAS_DECLARATION', 3);
+
+  /**
+   * A declaration of a constructor.
+   */
+  static const MatchKind CONSTRUCTOR_DECLARATION = const MatchKind(
+      'CONSTRUCTOR_DECLARATION', 4);
+
+  /**
+   * A reference to a constructor in which the constructor is being referenced.
+   */
+  static const MatchKind CONSTRUCTOR_REFERENCE = const MatchKind(
+      'CONSTRUCTOR_REFERENCE', 5);
+
+  /**
+   * A reference to a type in which the type was extended.
+   */
+  static const MatchKind EXTENDS_REFERENCE = const MatchKind(
+      'EXTENDS_REFERENCE', 6);
+
+  /**
+   * A reference to a field in which the field's value is being invoked.
+   */
+  static const MatchKind FIELD_INVOCATION = const MatchKind('FIELD_INVOCATION',
+      7);
+
+  /**
+   * A reference to a field (from field formal parameter).
+   */
+  static const MatchKind FIELD_REFERENCE = const MatchKind('FIELD_REFERENCE',
+      8);
+
+  /**
+   * A reference to a field in which the field's value is being read.
+   */
+  static const MatchKind FIELD_READ = const MatchKind('FIELD_READ', 9);
+
+  /**
+   * A reference to a field in which the field's value is being written.
+   */
+  static const MatchKind FIELD_WRITE = const MatchKind('FIELD_WRITE', 10);
+
+  /**
+   * A declaration of a function.
+   */
+  static const MatchKind FUNCTION_DECLARATION = const MatchKind(
+      'FUNCTION_DECLARATION', 11);
+
+  /**
+   * A reference to a function in which the function is being executed.
+   */
+  static const MatchKind FUNCTION_EXECUTION = const MatchKind(
+      'FUNCTION_EXECUTION', 12);
+
+  /**
+   * A reference to a function in which the function is being referenced.
+   */
+  static const MatchKind FUNCTION_REFERENCE = const MatchKind(
+      'FUNCTION_REFERENCE', 13);
+
+  /**
+   * A declaration of a function type.
+   */
+  static const MatchKind FUNCTION_TYPE_DECLARATION = const MatchKind(
+      'FUNCTION_TYPE_DECLARATION', 14);
+
+  /**
+   * A reference to a function type.
+   */
+  static const MatchKind FUNCTION_TYPE_REFERENCE = const MatchKind(
+      'FUNCTION_TYPE_REFERENCE', 15);
+
+  /**
+   * A reference to a type in which the type was implemented.
+   */
+  static const MatchKind IMPLEMENTS_REFERENCE = const MatchKind(
+      'IMPLEMENTS_REFERENCE', 16);
+
+  /**
+   * A reference to a [ImportElement].
+   */
+  static const MatchKind IMPORT_REFERENCE = const MatchKind('IMPORT_REFERENCE',
+      17);
+
+  /**
+   * A reference to a class that is implementing a specified type.
+   */
+  static const MatchKind INTERFACE_IMPLEMENTED = const MatchKind(
+      'INTERFACE_IMPLEMENTED', 18);
+
+  /**
+   * A reference to a [LibraryElement].
+   */
+  static const MatchKind LIBRARY_REFERENCE = const MatchKind(
+      'LIBRARY_REFERENCE', 19);
+
+  /**
+   * A reference to a method in which the method is being invoked.
+   */
+  static const MatchKind METHOD_INVOCATION = const MatchKind(
+      'METHOD_INVOCATION', 20);
+
+  /**
+   * A reference to a method in which the method is being referenced.
+   */
+  static const MatchKind METHOD_REFERENCE = const MatchKind('METHOD_REFERENCE',
+      21);
+
+  /**
+   * A declaration of a name.
+   */
+  static const MatchKind NAME_DECLARATION = const MatchKind('NAME_DECLARATION',
+      22);
+
+  /**
+   * A reference to a name, resolved.
+   */
+  static const MatchKind NAME_REFERENCE_RESOLVED = const MatchKind(
+      'NAME_REFERENCE_RESOLVED', 23);
+
+  /**
+   * An invocation of a name, resolved.
+   */
+  static const MatchKind NAME_INVOCATION_RESOLVED = const MatchKind(
+      'NAME_INVOCATION_RESOLVED', 24);
+
+  /**
+   * A reference to a name in which the name's value is being read.
+   */
+  static const MatchKind NAME_READ_RESOLVED = const MatchKind(
+      'NAME_READ_RESOLVED', 25);
+
+  /**
+   * A reference to a name in which the name's value is being read and written.
+   */
+  static const MatchKind NAME_READ_WRITE_RESOLVED = const MatchKind(
+      'NAME_READ_WRITE_RESOLVED', 26);
+
+  /**
+   * A reference to a name in which the name's value is being written.
+   */
+  static const MatchKind NAME_WRITE_RESOLVED = const MatchKind(
+      'NAME_WRITE_RESOLVED', 27);
+
+  /**
+   * An invocation of a name, unresolved.
+   */
+  static const MatchKind NAME_INVOCATION_UNRESOLVED = const MatchKind(
+      'NAME_INVOCATION_UNRESOLVED', 28);
+
+  /**
+   * A reference to a name in which the name's value is being read.
+   */
+  static const MatchKind NAME_READ_UNRESOLVED = const MatchKind(
+      'NAME_READ_UNRESOLVED', 29);
+
+  /**
+   * A reference to a name in which the name's value is being read and written.
+   */
+  static const MatchKind NAME_READ_WRITE_UNRESOLVED = const MatchKind(
+      'NAME_READ_WRITE_UNRESOLVED', 30);
+
+  /**
+   * A reference to a name in which the name's value is being written.
+   */
+  static const MatchKind NAME_WRITE_UNRESOLVED = const MatchKind(
+      'NAME_WRITE_UNRESOLVED', 31);
+
+  /**
+   * A reference to a name, unresolved.
+   */
+  static const MatchKind NAME_REFERENCE_UNRESOLVED = const MatchKind(
+      'NAME_REFERENCE_UNRESOLVED', 32);
+
+  /**
+   * A reference to a named parameter in invocation.
+   */
+  static const MatchKind NAMED_PARAMETER_REFERENCE = const MatchKind(
+      'NAMED_PARAMETER_REFERENCE', 33);
+
+  /**
+   * A reference to a property accessor.
+   */
+  static const MatchKind PROPERTY_ACCESSOR_REFERENCE = const MatchKind(
+      'PROPERTY_ACCESSOR_REFERENCE', 34);
+
+  /**
+   * A reference to a type.
+   */
+  static const MatchKind TYPE_REFERENCE = const MatchKind('TYPE_REFERENCE', 35);
+
+  /**
+   * A reference to a type parameter.
+   */
+  static const MatchKind TYPE_PARAMETER_REFERENCE = const MatchKind(
+      'TYPE_PARAMETER_REFERENCE', 36);
+
+  /**
+   * A reference to a [CompilationUnitElement].
+   */
+  static const MatchKind UNIT_REFERENCE = const MatchKind('UNIT_REFERENCE', 37);
+
+  /**
+   * A declaration of a variable.
+   */
+  static const MatchKind VARIABLE_DECLARATION = const MatchKind(
+      'VARIABLE_DECLARATION', 38);
+
+  /**
+   * A reference to a variable in which the variable's value is being read.
+   */
+  static const MatchKind VARIABLE_READ = const MatchKind('VARIABLE_READ', 39);
+
+  /**
+   * A reference to a variable in which the variable's value is being both read
+   * and write.
+   */
+  static const MatchKind VARIABLE_READ_WRITE = const MatchKind(
+      'VARIABLE_READ_WRITE', 40);
+
+  /**
+   * A reference to a variable in which the variables's value is being written.
+   */
+  static const MatchKind VARIABLE_WRITE = const MatchKind('VARIABLE_WRITE', 41);
+
+  /**
+   * A reference to a type in which the type was mixed in.
+   */
+  static const MatchKind WITH_REFERENCE = const MatchKind('WITH_REFERENCE', 42);
+
+  static const List<MatchKind> values = const [ANGULAR_REFERENCE,
+      ANGULAR_CLOSING_TAG_REFERENCE, CLASS_DECLARATION, CLASS_ALIAS_DECLARATION,
+      CONSTRUCTOR_DECLARATION, CONSTRUCTOR_REFERENCE, EXTENDS_REFERENCE,
+      FIELD_INVOCATION, FIELD_REFERENCE, FIELD_READ, FIELD_WRITE,
+      FUNCTION_DECLARATION, FUNCTION_EXECUTION, FUNCTION_REFERENCE,
+      FUNCTION_TYPE_DECLARATION, FUNCTION_TYPE_REFERENCE, IMPLEMENTS_REFERENCE,
+      IMPORT_REFERENCE, INTERFACE_IMPLEMENTED, LIBRARY_REFERENCE, METHOD_INVOCATION,
+      METHOD_REFERENCE, NAME_DECLARATION, NAME_REFERENCE_RESOLVED,
+      NAME_INVOCATION_RESOLVED, NAME_READ_RESOLVED, NAME_READ_WRITE_RESOLVED,
+      NAME_WRITE_RESOLVED, NAME_INVOCATION_UNRESOLVED, NAME_READ_UNRESOLVED,
+      NAME_READ_WRITE_UNRESOLVED, NAME_WRITE_UNRESOLVED, NAME_REFERENCE_UNRESOLVED,
+      NAMED_PARAMETER_REFERENCE, PROPERTY_ACCESSOR_REFERENCE, TYPE_REFERENCE,
+      TYPE_PARAMETER_REFERENCE, UNIT_REFERENCE, VARIABLE_DECLARATION, VARIABLE_READ,
+      VARIABLE_READ_WRITE, VARIABLE_WRITE, WITH_REFERENCE];
+
+  const MatchKind(String name, int ordinal) : super(name, ordinal);
+}
+
+
+/**
+ * The interface [SearchEngine] defines the behavior of objects that can be used
+ * to search for various pieces of information.
+ */
+abstract class SearchEngine {
+//  /**
+//   * Returns types assigned to the given field or top-level variable.
+//   *
+//   * [variable] - the field or top-level variable to find assigned types for.
+//   */
+//  Future<Set<DartType>> searchAssignedTypes(PropertyInducingElement variable);
+
+  /**
+   * Returns declarations of class members with the given name.
+   *
+   * [name] - the name being declared by the found matches.
+   */
+  Future<List<SearchMatch>> searchMemberDeclarations(String name);
+
+  /**
+   * Returns all resolved and unresolved qualified references to the class
+   * members with given [name].
+   *
+   * [name] - the name being referenced by the found matches.
+   */
+  Future<List<SearchMatch>> searchMemberReferences(String name);
+
+  /**
+   * Returns references to the given [Element].
+   *
+   * [element] - the [Element] being referenced by the found matches.
+   */
+  Future<List<SearchMatch>> searchReferences(Element element);
+
+  /**
+   * Returns subtypes of the given [type].
+   *
+   * [type] - the [ClassElemnet] being subtyped by the found matches.
+   */
+  Future<List<SearchMatch>> searchSubtypes(ClassElement type);
+
+  /**
+   * Returns all the top-level declarations matching the given pattern.
+   *
+   * [pattern] the regular expression used to match the names of the
+   *    declarations to be found.
+   */
+  Future<List<SearchMatch>> searchTopLevelDeclarations(String pattern);
+}
+
+/**
+ * Instances of the class [SearchMatch] represent a match found by
+ * [SearchEngine].
+ */
+class SearchMatch {
+  /**
+   * The kind of the match.
+   */
+  final MatchKind kind;
+
+  /**
+   * The element containing the source range that was matched.
+   */
+  final Element element;
+
+  /**
+   * The source range that was matched.
+   */
+  final SourceRange sourceRange;
+
+  /**
+   * Is `true` if the match is a resolved reference to some [Element].
+   */
+  final bool isResolved;
+
+  /**
+   * Is `true` if field or method access is done using qualifier.
+   */
+  bool qualified = false;
+
+  SearchMatch(this.kind, this.element, this.sourceRange, this.isResolved);
+
+  @override
+  int get hashCode => JavaArrays.makeHashCode([element, sourceRange, kind]);
+
+  @override
+  bool operator ==(Object object) {
+    if (identical(object, this)) {
+      return true;
+    }
+    if (object is SearchMatch) {
+      return kind == object.kind && isResolved == object.isResolved && qualified
+          == object.qualified && sourceRange == object.sourceRange && element ==
+          object.element;
+    }
+    return false;
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("SearchMatch(kind=");
+    buffer.write(kind);
+    buffer.write(", isResolved=");
+    buffer.write(isResolved);
+    buffer.write(", element=");
+    buffer.write(element.displayName);
+    buffer.write(", range=");
+    buffer.write(sourceRange);
+    buffer.write(", qualified=");
+    buffer.write(qualified);
+    buffer.write(")");
+    return buffer.toString();
+  }
+}
diff --git a/pkg/analysis_services/lib/src/index/index_contributor.dart b/pkg/analysis_services/lib/src/index/index_contributor.dart
new file mode 100644
index 0000000..0444183
--- /dev/null
+++ b/pkg/analysis_services/lib/src/index/index_contributor.dart
@@ -0,0 +1,1214 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.src.index.index_contributor;
+
+import 'dart:collection' show Queue;
+
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/index_store.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/html.dart' as ht;
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * Adds data to [store] based on the resolved Dart [unit].
+ */
+void indexDartUnit(IndexStore store, AnalysisContext context,
+    CompilationUnit unit) {
+  // check unit
+  if (unit == null) {
+    return;
+  }
+  // prepare unit element
+  CompilationUnitElement unitElement = unit.element;
+  if (unitElement == null) {
+    return;
+  }
+  // about to index
+  bool mayIndex = store.aboutToIndexDart(context, unitElement);
+  if (!mayIndex) {
+    return;
+  }
+  // do index
+  unit.accept(new _IndexContributor(store));
+  unit.accept(new _AngularDartIndexContributor(store));
+  store.doneIndex();
+}
+
+
+/**
+ * Adds data to [store] based on the resolved HTML [unit].
+ */
+void indexHtmlUnit(IndexStore store, AnalysisContext context, ht.HtmlUnit unit)
+    {
+  // check unit
+  if (unit == null) {
+    return;
+  }
+  // prepare unit element
+  HtmlElement unitElement = unit.element;
+  if (unitElement == null) {
+    return;
+  }
+  // about to index
+  bool mayIndex = store.aboutToIndexHtml(context, unitElement);
+  if (!mayIndex) {
+    return;
+  }
+  // do index
+  unit.accept(new _AngularHtmlIndexContributor(store));
+  store.doneIndex();
+}
+
+
+/**
+ * Visits resolved [CompilationUnit] and adds Angular specific relationships
+ * into [IndexStore].
+ */
+class _AngularDartIndexContributor extends GeneralizingAstVisitor<Object> {
+  final IndexStore _store;
+
+  _AngularDartIndexContributor(this._store);
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement classElement = node.element;
+    if (classElement != null) {
+      List<ToolkitObjectElement> toolkitObjects = classElement.toolkitObjects;
+      for (ToolkitObjectElement object in toolkitObjects) {
+        if (object is AngularComponentElement) {
+          _indexComponent(object);
+        }
+        if (object is AngularDecoratorElement) {
+          AngularDecoratorElement directive = object;
+          _indexDirective(directive);
+        }
+      }
+    }
+    // stop visiting
+    return null;
+  }
+
+  @override
+  Object visitCompilationUnitMember(CompilationUnitMember node) => null;
+
+  void _indexComponent(AngularComponentElement component) {
+    _indexProperties(component.properties);
+  }
+
+  void _indexDirective(AngularDecoratorElement directive) {
+    _indexProperties(directive.properties);
+  }
+
+  /**
+   * Index [FieldElement] references from [AngularPropertyElement]s.
+   */
+  void _indexProperties(List<AngularPropertyElement> properties) {
+    for (AngularPropertyElement property in properties) {
+      FieldElement field = property.field;
+      if (field != null) {
+        int offset = property.fieldNameOffset;
+        if (offset == -1) {
+          continue;
+        }
+        int length = field.name.length;
+        Location location = new Location(property, offset, length);
+        // getter reference
+        if (property.propertyKind.callsGetter()) {
+          PropertyAccessorElement getter = field.getter;
+          if (getter != null) {
+            _store.recordRelationship(getter,
+                IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+          }
+        }
+        // setter reference
+        if (property.propertyKind.callsSetter()) {
+          PropertyAccessorElement setter = field.setter;
+          if (setter != null) {
+            _store.recordRelationship(setter,
+                IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+          }
+        }
+      }
+    }
+  }
+}
+
+
+/**
+ * Visits resolved [HtmlUnit] and adds relationships into [IndexStore].
+ */
+class _AngularHtmlIndexContributor extends _ExpressionVisitor {
+  /**
+   * The [IndexStore] to record relations into.
+   */
+  final IndexStore _store;
+
+  /**
+   * The index contributor used to index Dart [Expression]s.
+   */
+  _IndexContributor _indexContributor;
+
+  HtmlElement _htmlUnitElement;
+
+  /**
+   * Initialize a newly created Angular HTML index contributor.
+   *
+   * [store] - the [IndexStore] to record relations into.
+   */
+  _AngularHtmlIndexContributor(this._store) {
+    _indexContributor = new _AngularHtmlIndexContributor_forEmbeddedDart(_store,
+        this);
+  }
+
+  @override
+  void visitExpression(Expression expression) {
+    // Formatter
+    if (expression is SimpleIdentifier) {
+      Element element = expression.bestElement;
+      if (element is AngularElement) {
+        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE,
+            _createLocationForIdentifier(expression));
+        return;
+      }
+    }
+    // index as a normal Dart expression
+    expression.accept(_indexContributor);
+  }
+
+  @override
+  Object visitHtmlUnit(ht.HtmlUnit node) {
+    _htmlUnitElement = node.element;
+    CompilationUnitElement dartUnitElement =
+        _htmlUnitElement.angularCompilationUnit;
+    _indexContributor.enterScope(dartUnitElement);
+    return super.visitHtmlUnit(node);
+  }
+
+  @override
+  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
+    Element element = node.element;
+    if (element != null) {
+      ht.Token nameToken = node.nameToken;
+      Location location = _createLocationForToken(nameToken);
+      _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE,
+          location);
+    }
+    return super.visitXmlAttributeNode(node);
+  }
+
+  @override
+  Object visitXmlTagNode(ht.XmlTagNode node) {
+    Element element = node.element;
+    if (element != null) {
+      // tag
+      {
+        ht.Token tagToken = node.tagToken;
+        Location location = _createLocationForToken(tagToken);
+        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE,
+            location);
+      }
+      // maybe add closing tag range
+      ht.Token closingTag = node.closingTag;
+      if (closingTag != null) {
+        Location location = _createLocationForToken(closingTag);
+        _store.recordRelationship(element,
+            IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE, location);
+      }
+    }
+    return super.visitXmlTagNode(node);
+  }
+
+  Location _createLocationForIdentifier(SimpleIdentifier identifier) =>
+      new Location(_htmlUnitElement, identifier.offset, identifier.length);
+
+  Location _createLocationForToken(ht.Token token) => new Location(
+      _htmlUnitElement, token.offset, token.length);
+}
+
+
+class _AngularHtmlIndexContributor_forEmbeddedDart extends _IndexContributor {
+  final _AngularHtmlIndexContributor angularContributor;
+
+  _AngularHtmlIndexContributor_forEmbeddedDart(IndexStore store,
+      this.angularContributor) : super(store);
+
+  @override
+  Element peekElement() => angularContributor._htmlUnitElement;
+
+  @override
+  void recordRelationship(Element element, Relationship relationship,
+      Location location) {
+    AngularElement angularElement = AngularHtmlUnitResolver.getAngularElement(
+        element);
+    if (angularElement != null) {
+      element = angularElement;
+      relationship = IndexConstants.ANGULAR_REFERENCE;
+    }
+    super.recordRelationship(element, relationship, location);
+  }
+}
+
+
+/**
+ * Recursively visits an [HtmlUnit] and every embedded [Expression].
+ */
+abstract class _ExpressionVisitor extends ht.RecursiveXmlVisitor<Object> {
+  /**
+   * Visits the given [Expression]s embedded into tag or attribute.
+   *
+   * [expression] - the [Expression] to visit, not `null`
+   */
+  void visitExpression(Expression expression);
+
+  @override
+  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
+    _visitExpressions(node.expressions);
+    return super.visitXmlAttributeNode(node);
+  }
+
+  @override
+  Object visitXmlTagNode(ht.XmlTagNode node) {
+    _visitExpressions(node.expressions);
+    return super.visitXmlTagNode(node);
+  }
+
+  /**
+   * Visits [Expression]s of the given [XmlExpression]s.
+   */
+  void _visitExpressions(List<ht.XmlExpression> expressions) {
+    for (ht.XmlExpression xmlExpression in expressions) {
+      if (xmlExpression is AngularXmlExpression) {
+        AngularXmlExpression angularXmlExpression = xmlExpression;
+        List<Expression> dartExpressions =
+            angularXmlExpression.expression.expressions;
+        for (Expression dartExpression in dartExpressions) {
+          visitExpression(dartExpression);
+        }
+      }
+      if (xmlExpression is ht.RawXmlExpression) {
+        ht.RawXmlExpression rawXmlExpression = xmlExpression;
+        visitExpression(rawXmlExpression.expression);
+      }
+    }
+  }
+}
+
+
+/**
+ * Information about [ImportElement] and place where it is referenced using
+ * [PrefixElement].
+ */
+class _ImportElementInfo {
+  ImportElement _element;
+
+  int _periodEnd = 0;
+}
+
+
+/**
+ * Visits a resolved AST and adds relationships into [IndexStore].
+ */
+class _IndexContributor extends GeneralizingAstVisitor<Object> {
+  final IndexStore _store;
+
+  LibraryElement _libraryElement;
+
+  Map<ImportElement, Set<Element>> _importElementsMap = {};
+
+  /**
+   * A stack whose top element (the element with the largest index) is an element representing the
+   * inner-most enclosing scope.
+   */
+  Queue<Element> _elementStack = new Queue();
+
+  _IndexContributor(this._store);
+
+  /**
+   * Enter a new scope represented by the given [Element].
+   */
+  void enterScope(Element element) {
+    _elementStack.addFirst(element);
+  }
+
+  /**
+   * @return the inner-most enclosing [Element], may be `null`.
+   */
+  Element peekElement() {
+    for (Element element in _elementStack) {
+      if (element != null) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Record the given relationship between the given [Element] and [Location].
+   */
+  void recordRelationship(Element element, Relationship relationship,
+      Location location) {
+    if (element != null && location != null) {
+      _store.recordRelationship(element, relationship, location);
+    }
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    _recordOperatorReference(node.operator, node.bestElement);
+    return super.visitAssignmentExpression(node);
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    _recordOperatorReference(node.operator, node.bestElement);
+    return super.visitBinaryExpression(node);
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement element = node.element;
+    enterScope(element);
+    try {
+      _recordElementDefinition(element, IndexConstants.DEFINES_CLASS);
+      {
+        ExtendsClause extendsClause = node.extendsClause;
+        if (extendsClause != null) {
+          TypeName superclassNode = extendsClause.superclass;
+          _recordSuperType(superclassNode, IndexConstants.IS_EXTENDED_BY);
+        } else {
+          InterfaceType superType = element.supertype;
+          if (superType != null) {
+            ClassElement objectElement = superType.element;
+            recordRelationship(objectElement, IndexConstants.IS_EXTENDED_BY,
+                _createLocationFromOffset(node.name.offset, 0));
+          }
+        }
+      }
+      {
+        WithClause withClause = node.withClause;
+        if (withClause != null) {
+          for (TypeName mixinNode in withClause.mixinTypes) {
+            _recordSuperType(mixinNode, IndexConstants.IS_MIXED_IN_BY);
+          }
+        }
+      }
+      {
+        ImplementsClause implementsClause = node.implementsClause;
+        if (implementsClause != null) {
+          for (TypeName interfaceNode in implementsClause.interfaces) {
+            _recordSuperType(interfaceNode, IndexConstants.IS_IMPLEMENTED_BY);
+          }
+        }
+      }
+      return super.visitClassDeclaration(node);
+    } finally {
+      _exitScope();
+    }
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    ClassElement element = node.element;
+    enterScope(element);
+    try {
+      _recordElementDefinition(element, IndexConstants.DEFINES_CLASS_ALIAS);
+      {
+        TypeName superclassNode = node.superclass;
+        if (superclassNode != null) {
+          _recordSuperType(superclassNode, IndexConstants.IS_EXTENDED_BY);
+        }
+      }
+      {
+        WithClause withClause = node.withClause;
+        if (withClause != null) {
+          for (TypeName mixinNode in withClause.mixinTypes) {
+            _recordSuperType(mixinNode, IndexConstants.IS_MIXED_IN_BY);
+          }
+        }
+      }
+      {
+        ImplementsClause implementsClause = node.implementsClause;
+        if (implementsClause != null) {
+          for (TypeName interfaceNode in implementsClause.interfaces) {
+            _recordSuperType(interfaceNode, IndexConstants.IS_IMPLEMENTED_BY);
+          }
+        }
+      }
+      return super.visitClassTypeAlias(node);
+    } finally {
+      _exitScope();
+    }
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    CompilationUnitElement unitElement = node.element;
+    if (unitElement != null) {
+      _elementStack.add(unitElement);
+      _libraryElement = unitElement.enclosingElement;
+      if (_libraryElement != null) {
+        return super.visitCompilationUnit(node);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    ConstructorElement element = node.element;
+    // define
+    {
+      Location location;
+      if (node.name != null) {
+        int start = node.period.offset;
+        int end = node.name.end;
+        location = _createLocationFromOffset(start, end - start);
+      } else {
+        int start = node.returnType.end;
+        location = _createLocationFromOffset(start, 0);
+      }
+      recordRelationship(element, IndexConstants.IS_DEFINED_BY, location);
+    }
+    // visit children
+    enterScope(element);
+    try {
+      return super.visitConstructorDeclaration(node);
+    } finally {
+      _exitScope();
+    }
+  }
+
+  @override
+  Object visitConstructorName(ConstructorName node) {
+    ConstructorElement element = node.staticElement;
+    // in 'class B = A;' actually A constructors are invoked
+    if (element != null && element.isSynthetic && element.redirectedConstructor
+        != null) {
+      element = element.redirectedConstructor;
+    }
+    // prepare location
+    Location location;
+    if (node.name != null) {
+      int start = node.period.offset;
+      int end = node.name.end;
+      location = _createLocationFromOffset(start, end - start);
+    } else {
+      int start = node.type.end;
+      location = _createLocationFromOffset(start, 0);
+    }
+    // record relationship
+    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+    return super.visitConstructorName(node);
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    ExportElement element = node.element;
+    if (element != null) {
+      LibraryElement expLibrary = element.exportedLibrary;
+      _recordLibraryReference(node, expLibrary);
+    }
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  Object visitFormalParameter(FormalParameter node) {
+    ParameterElement element = node.element;
+    enterScope(element);
+    try {
+      return super.visitFormalParameter(node);
+    } finally {
+      _exitScope();
+    }
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    Element element = node.element;
+    _recordElementDefinition(element, IndexConstants.DEFINES_FUNCTION);
+    enterScope(element);
+    try {
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _exitScope();
+    }
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    Element element = node.element;
+    _recordElementDefinition(element, IndexConstants.DEFINES_FUNCTION_TYPE);
+    return super.visitFunctionTypeAlias(node);
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    ImportElement element = node.element;
+    if (element != null) {
+      LibraryElement impLibrary = element.importedLibrary;
+      _recordLibraryReference(node, impLibrary);
+    }
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    MethodElement element = node.bestElement;
+    if (element is MethodElement) {
+      Token operator = node.leftBracket;
+      Location location = _createLocationFromToken(operator);
+      recordRelationship(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
+          location);
+    }
+    return super.visitIndexExpression(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement element = node.element;
+    enterScope(element);
+    try {
+      return super.visitMethodDeclaration(node);
+    } finally {
+      _exitScope();
+    }
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    SimpleIdentifier name = node.methodName;
+    Element element = name.bestElement;
+    if (element is MethodElement || element is PropertyAccessorElement) {
+      Location location = _createLocationFromNode(name);
+      Relationship relationship;
+      if (node.target != null) {
+        relationship = IndexConstants.IS_INVOKED_BY_QUALIFIED;
+      } else {
+        relationship = IndexConstants.IS_INVOKED_BY_UNQUALIFIED;
+      }
+      recordRelationship(element, relationship, location);
+    }
+    if (element is FunctionElement || element is VariableElement) {
+      Location location = _createLocationFromNode(name);
+      recordRelationship(element, IndexConstants.IS_INVOKED_BY, location);
+    }
+    // name invocation
+    {
+      Element nameElement = new NameElement(name.name);
+      Location location = _createLocationFromNode(name);
+      Relationship kind = element != null ?
+          IndexConstants.NAME_IS_INVOKED_BY_RESOLVED :
+          IndexConstants.NAME_IS_INVOKED_BY_UNRESOLVED;
+      _store.recordRelationship(nameElement, kind, location);
+    }
+    _recordImportElementReferenceWithoutPrefix(name);
+    return super.visitMethodInvocation(node);
+  }
+
+  @override
+  Object visitPartDirective(PartDirective node) {
+    Element element = node.element;
+    Location location = _createLocationFromNode(node.uri);
+    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+    return super.visitPartDirective(node);
+  }
+
+  @override
+  Object visitPartOfDirective(PartOfDirective node) {
+    Location location = _createLocationFromNode(node.libraryName);
+    recordRelationship(node.element, IndexConstants.IS_REFERENCED_BY, location);
+    return null;
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    _recordOperatorReference(node.operator, node.bestElement);
+    return super.visitPostfixExpression(node);
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    _recordOperatorReference(node.operator, node.bestElement);
+    return super.visitPrefixExpression(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    Element nameElement = new NameElement(node.name);
+    Location location = _createLocationFromNode(node);
+    // name in declaration
+    if (node.inDeclarationContext()) {
+      recordRelationship(nameElement, IndexConstants.IS_DEFINED_BY, location);
+      return null;
+    }
+    // prepare information
+    Element element = node.bestElement;
+    // qualified name reference
+    _recordQualifiedMemberReference(node, element, nameElement, location);
+    // stop if already handled
+    if (_isAlreadyHandledName(node)) {
+      return null;
+    }
+    // record name read/write
+    {
+      bool inGetterContext = node.inGetterContext();
+      bool inSetterContext = node.inSetterContext();
+      if (inGetterContext && inSetterContext) {
+        Relationship kind = element != null ?
+            IndexConstants.NAME_IS_READ_WRITTEN_BY_RESOLVED :
+            IndexConstants.NAME_IS_READ_WRITTEN_BY_UNRESOLVED;
+        _store.recordRelationship(nameElement, kind, location);
+      } else if (inGetterContext) {
+        Relationship kind = element != null ?
+            IndexConstants.NAME_IS_READ_BY_RESOLVED :
+            IndexConstants.NAME_IS_READ_BY_UNRESOLVED;
+        _store.recordRelationship(nameElement, kind, location);
+      } else if (inSetterContext) {
+        Relationship kind = element != null ?
+            IndexConstants.NAME_IS_WRITTEN_BY_RESOLVED :
+            IndexConstants.NAME_IS_WRITTEN_BY_UNRESOLVED;
+        _store.recordRelationship(nameElement, kind, location);
+      }
+    }
+    // record specific relations
+    if (element is ClassElement || element is FunctionElement || element is
+        FunctionTypeAliasElement || element is LabelElement || element is
+        TypeParameterElement) {
+      recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+    } else if (element is FieldElement) {
+      location = _getLocationWithInitializerType(node, location);
+      recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+    } else if (element is FieldFormalParameterElement) {
+      FieldFormalParameterElement fieldParameter = element;
+      FieldElement field = fieldParameter.field;
+      recordRelationship(field, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
+          location);
+    } else if (element is PrefixElement) {
+      _recordImportElementReferenceWithPrefix(node);
+    } else if (element is PropertyAccessorElement || element is MethodElement) {
+      location = _getLocationWithTypeAssignedToField(node, element, location);
+      if (node.isQualified) {
+        recordRelationship(element, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
+            location);
+      } else {
+        recordRelationship(element, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
+            location);
+      }
+    } else if (element is ParameterElement || element is LocalVariableElement) {
+      bool inGetterContext = node.inGetterContext();
+      bool inSetterContext = node.inSetterContext();
+      if (inGetterContext && inSetterContext) {
+        recordRelationship(element, IndexConstants.IS_READ_WRITTEN_BY,
+            location);
+      } else if (inGetterContext) {
+        recordRelationship(element, IndexConstants.IS_READ_BY, location);
+      } else if (inSetterContext) {
+        recordRelationship(element, IndexConstants.IS_WRITTEN_BY, location);
+      } else {
+        recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+      }
+    }
+    _recordImportElementReferenceWithoutPrefix(node);
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    ConstructorElement element = node.staticElement;
+    Location location;
+    if (node.constructorName != null) {
+      int start = node.period.offset;
+      int end = node.constructorName.end;
+      location = _createLocationFromOffset(start, end - start);
+    } else {
+      int start = node.keyword.end;
+      location = _createLocationFromOffset(start, 0);
+    }
+    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+    return super.visitSuperConstructorInvocation(node);
+  }
+
+  @override
+  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    VariableDeclarationList variables = node.variables;
+    for (VariableDeclaration variableDeclaration in variables.variables) {
+      Element element = variableDeclaration.element;
+      _recordElementDefinition(element, IndexConstants.DEFINES_VARIABLE);
+    }
+    return super.visitTopLevelVariableDeclaration(node);
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    TypeParameterElement element = node.element;
+    enterScope(element);
+    try {
+      return super.visitTypeParameter(node);
+    } finally {
+      _exitScope();
+    }
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    VariableElement element = node.element;
+    // record declaration
+    {
+      SimpleIdentifier name = node.name;
+      Location location = _createLocationFromNode(name);
+      location = _getLocationWithExpressionType(location, node.initializer);
+      recordRelationship(element, IndexConstants.IS_DEFINED_BY, location);
+    }
+    // visit
+    enterScope(element);
+    try {
+      return super.visitVariableDeclaration(node);
+    } finally {
+      _exitScope();
+    }
+  }
+
+  @override
+  Object visitVariableDeclarationList(VariableDeclarationList node) {
+    NodeList<VariableDeclaration> variables = node.variables;
+    if (variables != null) {
+      // use first VariableDeclaration as Element for Location(s) in type
+      {
+        TypeName type = node.type;
+        if (type != null) {
+          for (VariableDeclaration variableDeclaration in variables) {
+            enterScope(variableDeclaration.element);
+            try {
+              type.accept(this);
+            } finally {
+              _exitScope();
+            }
+            // only one iteration
+            break;
+          }
+        }
+      }
+      // visit variables
+      variables.accept(this);
+    }
+    return null;
+  }
+
+  /**
+   * @return the [Location] representing location of the [AstNode].
+   */
+  Location _createLocationFromNode(AstNode node) => _createLocationFromOffset(
+      node.offset, node.length);
+
+  /**
+   * [offset] - the offset of the location within [Source].
+   * [length] - the length of the location.
+   *
+   * Returns the [Location] representing the given offset and length within the
+   * inner-most [Element].
+   */
+  Location _createLocationFromOffset(int offset, int length) {
+    Element element = peekElement();
+    return new Location(element, offset, length);
+  }
+
+  /**
+   * @return the [Location] representing location of the [Token].
+   */
+  Location _createLocationFromToken(Token token) => _createLocationFromOffset(
+      token.offset, token.length);
+
+  /**
+   * Exit the current scope.
+   */
+  void _exitScope() {
+    _elementStack.removeFirst();
+  }
+
+  /**
+   * @return `true` if given node already indexed as more interesting reference, so it should
+   *         not be indexed again.
+   */
+  bool _isAlreadyHandledName(SimpleIdentifier node) {
+    AstNode parent = node.parent;
+    if (parent is MethodInvocation) {
+      return identical(parent.methodName, node);
+    }
+    return false;
+  }
+
+  /**
+   * Records the [Element] definition in the library and universe.
+   */
+  void _recordElementDefinition(Element element, Relationship relationship) {
+    Location location = createLocation(element);
+    recordRelationship(_libraryElement, relationship, location);
+    recordRelationship(IndexConstants.UNIVERSE, relationship, location);
+  }
+
+  /**
+   * Records [ImportElement] that declares given prefix and imports library with element used
+   * with given prefix node.
+   */
+  void _recordImportElementReferenceWithPrefix(SimpleIdentifier prefixNode) {
+    _ImportElementInfo info = getImportElementInfo(prefixNode);
+    if (info != null) {
+      int offset = prefixNode.offset;
+      int length = info._periodEnd - offset;
+      Location location = _createLocationFromOffset(offset, length);
+      recordRelationship(info._element, IndexConstants.IS_REFERENCED_BY,
+          location);
+    }
+  }
+
+  /**
+   * Records [ImportElement] reference if given [SimpleIdentifier] references some
+   * top-level element and not qualified with import prefix.
+   */
+  void _recordImportElementReferenceWithoutPrefix(SimpleIdentifier node) {
+    if (_isIdentifierInImportCombinator(node)) {
+      return;
+    }
+    if (_isIdentifierInPrefixedIdentifier(node)) {
+      return;
+    }
+    Element element = node.staticElement;
+    ImportElement importElement = _internalGetImportElement(_libraryElement,
+        null, element, _importElementsMap);
+    if (importElement != null) {
+      Location location = _createLocationFromOffset(node.offset, 0);
+      recordRelationship(importElement, IndexConstants.IS_REFERENCED_BY,
+          location);
+    }
+  }
+
+  /**
+   * Records reference to defining [CompilationUnitElement] of the given
+   * [LibraryElement].
+   */
+  void _recordLibraryReference(UriBasedDirective node, LibraryElement library) {
+    if (library != null) {
+      Location location = _createLocationFromNode(node.uri);
+      recordRelationship(library.definingCompilationUnit,
+          IndexConstants.IS_REFERENCED_BY, location);
+    }
+  }
+
+  /**
+   * Record reference to the given operator [Element] and name.
+   */
+  void _recordOperatorReference(Token operator, Element element) {
+    // prepare location
+    Location location = _createLocationFromToken(operator);
+    // record name reference
+    {
+      String name = operator.lexeme;
+      if (name == "++") {
+        name = "+";
+      }
+      if (name == "--") {
+        name = "-";
+      }
+      if (StringUtilities.endsWithChar(name, 0x3D) && name != "==") {
+        name = name.substring(0, name.length - 1);
+      }
+      Element nameElement = new NameElement(name);
+      Relationship relationship = element != null ?
+          IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED :
+          IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED;
+      recordRelationship(nameElement, relationship, location);
+    }
+    // record element reference
+    if (element != null) {
+      recordRelationship(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
+          location);
+    }
+  }
+
+  /**
+   * Records reference if the given [SimpleIdentifier] looks like a qualified property access
+   * or method invocation.
+   */
+  void _recordQualifiedMemberReference(SimpleIdentifier node, Element element,
+      Element nameElement, Location location) {
+    if (node.isQualified) {
+      Relationship relationship = element != null ?
+          IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED :
+          IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED;
+      recordRelationship(nameElement, relationship, location);
+    }
+  }
+
+  /**
+   * Records extends/implements relationships between given [ClassElement] and [Type] of
+   * "superNode".
+   */
+  void _recordSuperType(TypeName superNode, Relationship relationship) {
+    if (superNode != null) {
+      Identifier superName = superNode.name;
+      if (superName != null) {
+        Element superElement = superName.staticElement;
+        recordRelationship(superElement, relationship, _createLocationFromNode(
+            superNode));
+      }
+    }
+  }
+
+  /**
+   * @return the [Location] representing location of the [Element].
+   */
+  static Location createLocation(Element element) {
+    if (element != null) {
+      int offset = element.nameOffset;
+      int length = element.displayName.length;
+      return new Location(element, offset, length);
+    }
+    return null;
+  }
+
+  /**
+   * @return the [ImportElement] that is referenced by this node with [PrefixElement],
+   *         may be `null`.
+   */
+  static ImportElement getImportElement(SimpleIdentifier prefixNode) {
+    _ImportElementInfo info = getImportElementInfo(prefixNode);
+    return info != null ? info._element : null;
+  }
+
+  /**
+   * @return the [ImportElementInfo] with [ImportElement] that is referenced by this
+   *         node with [PrefixElement], may be `null`.
+   */
+  static _ImportElementInfo getImportElementInfo(SimpleIdentifier prefixNode) {
+    _ImportElementInfo info = new _ImportElementInfo();
+    // prepare environment
+    AstNode parent = prefixNode.parent;
+    CompilationUnit unit = prefixNode.getAncestor((node) => node is
+        CompilationUnit);
+    LibraryElement libraryElement = unit.element.library;
+    // prepare used element
+    Element usedElement = null;
+    if (parent is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = parent;
+      if (identical(prefixed.prefix, prefixNode)) {
+        usedElement = prefixed.staticElement;
+        info._periodEnd = prefixed.period.end;
+      }
+    }
+    if (parent is MethodInvocation) {
+      MethodInvocation invocation = parent;
+      if (identical(invocation.target, prefixNode)) {
+        usedElement = invocation.methodName.staticElement;
+        info._periodEnd = invocation.period.end;
+      }
+    }
+    // we need used Element
+    if (usedElement == null) {
+      return null;
+    }
+    // find ImportElement
+    String prefix = prefixNode.name;
+    Map<ImportElement, Set<Element>> importElementsMap = {};
+    info._element = _internalGetImportElement(libraryElement, prefix,
+        usedElement, importElementsMap);
+    if (info._element == null) {
+      return null;
+    }
+    return info;
+  }
+
+  /**
+   * If the given expression has resolved type, returns the new location with this type.
+   *
+   * [location] - the base location
+   * [expression] - the expression assigned at the given location
+   */
+  static Location _getLocationWithExpressionType(Location location,
+      Expression expression) {
+    if (expression != null) {
+      return new LocationWithData<DartType>(location, expression.bestType);
+    }
+    return location;
+  }
+
+  /**
+   * If the given node is the part of the [ConstructorFieldInitializer], returns location with
+   * type of the initializer expression.
+   */
+  static Location _getLocationWithInitializerType(SimpleIdentifier node,
+      Location location) {
+    if (node.parent is ConstructorFieldInitializer) {
+      ConstructorFieldInitializer initializer = node.parent as
+          ConstructorFieldInitializer;
+      if (identical(initializer.fieldName, node)) {
+        location = _getLocationWithExpressionType(location,
+            initializer.expression);
+      }
+    }
+    return location;
+  }
+
+  /**
+   * If the given identifier has a synthetic [PropertyAccessorElement], i.e.
+   * accessor for normal field, and it is LHS of assignment, then include [Type]
+   * of the assigned value into the [Location].
+   *
+   * [identifier] - the identifier to record location.
+   * [element] - the [Element] of the identifier.
+   * [location] - the raw location
+   *
+   * Returns the [Location] with the type of the assigned value
+   */
+  static Location
+      _getLocationWithTypeAssignedToField(SimpleIdentifier identifier,
+      Element element, Location location) {
+    // TODO(scheglov) decide if we want to remember assigned types
+    // we need accessor
+    if (element is! PropertyAccessorElement) {
+      return location;
+    }
+    PropertyAccessorElement accessor = element as PropertyAccessorElement;
+    // should be setter
+    if (!accessor.isSetter) {
+      return location;
+    }
+    // accessor should be synthetic, i.e. field normal
+    if (!accessor.isSynthetic) {
+      return location;
+    }
+    // should be LHS of assignment
+    AstNode parent;
+    {
+      AstNode node = identifier;
+      parent = node.parent;
+      // new T().field = x;
+      if (parent is PropertyAccess) {
+        PropertyAccess propertyAccess = parent as PropertyAccess;
+        if (identical(propertyAccess.propertyName, node)) {
+          node = propertyAccess;
+          parent = propertyAccess.parent;
+        }
+      }
+      // obj.field = x;
+      if (parent is PrefixedIdentifier) {
+        PrefixedIdentifier prefixedIdentifier = parent as PrefixedIdentifier;
+        if (identical(prefixedIdentifier.identifier, node)) {
+          node = prefixedIdentifier;
+          parent = prefixedIdentifier.parent;
+        }
+      }
+    }
+    // OK, remember the type
+    if (parent is AssignmentExpression) {
+      AssignmentExpression assignment = parent as AssignmentExpression;
+      Expression rhs = assignment.rightHandSide;
+      location = _getLocationWithExpressionType(location, rhs);
+    }
+    // done
+    return location;
+  }
+
+  /**
+   * @return the [ImportElement] that declares given [PrefixElement] and imports library
+   *         with given "usedElement".
+   */
+  static ImportElement _internalGetImportElement(LibraryElement libraryElement,
+      String prefix, Element usedElement, Map<ImportElement,
+      Set<Element>> importElementsMap) {
+    // validate Element
+    if (usedElement == null) {
+      return null;
+    }
+    if (usedElement.enclosingElement is! CompilationUnitElement) {
+      return null;
+    }
+    LibraryElement usedLibrary = usedElement.library;
+    // find ImportElement that imports used library with used prefix
+    List<ImportElement> candidates = null;
+    for (ImportElement importElement in libraryElement.imports) {
+      // required library
+      if (importElement.importedLibrary != usedLibrary) {
+        continue;
+      }
+      // required prefix
+      PrefixElement prefixElement = importElement.prefix;
+      if (prefix == null) {
+        if (prefixElement != null) {
+          continue;
+        }
+      } else {
+        if (prefixElement == null) {
+          continue;
+        }
+        if (prefix != prefixElement.name) {
+          continue;
+        }
+      }
+      // no combinators => only possible candidate
+      if (importElement.combinators.length == 0) {
+        return importElement;
+      }
+      // OK, we have candidate
+      if (candidates == null) {
+        candidates = [];
+      }
+      candidates.add(importElement);
+    }
+    // no candidates, probably element is defined in this library
+    if (candidates == null) {
+      return null;
+    }
+    // one candidate
+    if (candidates.length == 1) {
+      return candidates[0];
+    }
+    // ensure that each ImportElement has set of elements
+    for (ImportElement importElement in candidates) {
+      if (importElementsMap.containsKey(importElement)) {
+        continue;
+      }
+      Namespace namespace = new NamespaceBuilder(
+          ).createImportNamespaceForDirective(importElement);
+      Set<Element> elements = new Set.from(namespace.definedNames.values);
+      importElementsMap[importElement] = elements;
+    }
+    // use import namespace to choose correct one
+    for (MapEntry<ImportElement, Set<Element>> entry in getMapEntrySet(
+        importElementsMap)) {
+      if (entry.getValue().contains(usedElement)) {
+        return entry.getKey();
+      }
+    }
+    // not found
+    return null;
+  }
+
+  /**
+   * @return `true` if given "node" is part of an import [Combinator].
+   */
+  static bool _isIdentifierInImportCombinator(SimpleIdentifier node) {
+    AstNode parent = node.parent;
+    return parent is Combinator;
+  }
+
+  /**
+   * @return `true` if given "node" is part of [PrefixedIdentifier] "prefix.node".
+   */
+  static bool _isIdentifierInPrefixedIdentifier(SimpleIdentifier node) {
+    AstNode parent = node.parent;
+    return parent is PrefixedIdentifier && identical(parent.identifier, node);
+  }
+}
diff --git a/pkg/analysis_services/lib/src/index/local_index.dart b/pkg/analysis_services/lib/src/index/local_index.dart
new file mode 100644
index 0000000..447cd22
--- /dev/null
+++ b/pkg/analysis_services/lib/src/index/local_index.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.index.local_index;
+
+import 'dart:async';
+
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/src/index/index_contributor.dart' as contributors;
+import 'package:analysis_services/src/index/store/split_store.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/html.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * A local implementation of [Index].
+ */
+class LocalIndex extends Index {
+  SplitIndexStore _store;
+
+  LocalIndex(NodeManager nodeManager) {
+    _store = new SplitIndexStore(nodeManager);
+  }
+
+  @override
+  String get statistics => _store.statistics;
+
+  @override
+  void clear() {
+    _store.clear();
+  }
+
+  /**
+   * Returns a `Future<List<Location>>` that completes with the list of
+   * [Location]s of the given [relationship] with the given [element].
+   *
+   * For example, if the [element] represents a function and the [relationship]
+   * is the `is-invoked-by` relationship, then the locations will be all of the
+   * places where the function is invoked.
+   */
+  @override
+  Future<List<Location>> getRelationships(Element element,
+      Relationship relationship) {
+    return _store.getRelationships(element, relationship);
+  }
+
+  @override
+  void indexHtmlUnit(AnalysisContext context, HtmlUnit unit) {
+    contributors.indexHtmlUnit(_store, context, unit);
+  }
+
+  @override
+  void indexUnit(AnalysisContext context, CompilationUnit unit) {
+    contributors.indexDartUnit(_store, context, unit);
+  }
+
+  @override
+  void removeContext(AnalysisContext context) {
+    _store.removeContext(context);
+  }
+
+  @override
+  void removeSource(AnalysisContext context, Source source) {
+    _store.removeSource(context, source);
+  }
+
+  @override
+  void removeSources(AnalysisContext context, SourceContainer container) {
+    _store.removeSources(context, container);
+  }
+
+  @override
+  void run() {
+    // NO-OP for the local index
+  }
+
+  @override
+  void stop() {
+    // NO-OP for the local index
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/store/codec.dart b/pkg/analysis_services/lib/src/index/store/codec.dart
similarity index 91%
rename from pkg/analysis_server/lib/src/index/store/codec.dart
rename to pkg/analysis_services/lib/src/index/store/codec.dart
index 20a66fd..9153e69 100644
--- a/pkg/analysis_server/lib/src/index/store/codec.dart
+++ b/pkg/analysis_services/lib/src/index/store/codec.dart
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library index.store.codec;
+library services.src.index.store.codec;
 
 import 'dart:collection';
 
-import 'package:analysis_server/src/index/store/collection.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/index.dart';
+import 'package:analysis_services/src/index/store/collection.dart';
+import 'package:analysis_services/index/index.dart';
 
 
 /**
@@ -67,18 +67,18 @@
  * A helper that encodes/decodes [Element]s to/from integers.
  */
 class ElementCodec {
-  /**
-   * A list that works as a mapping of integers to element encodings (in form of integer arrays).
-   */
-  List<List<int>> _indexToPath = [];
-
-  /**
-   * A table mapping element locations (in form of integer arrays) into a single integer.
-   */
-  IntArrayToIntMap _pathToIndex = new IntArrayToIntMap();
-
   final StringCodec _stringCodec;
 
+  /**
+   * A table mapping element encodings to a single integer.
+   */
+  final IntArrayToIntMap _pathToIndex = new IntArrayToIntMap();
+
+  /**
+   * A list that works as a mapping of integers to element encodings.
+   */
+  final List<List<int>> _indexToPath = <List<int>>[];
+
   ElementCodec(this._stringCodec);
 
   /**
@@ -189,12 +189,12 @@
   /**
    * A table mapping names to their unique indices.
    */
-  final Map<String, int> nameToIndex = {};
+  final Map<String, int> nameToIndex = new HashMap<String, int>();
 
   /**
    * A table mapping indices to the corresponding strings.
    */
-  List<String> _indexToName = [];
+  final List<String> _indexToName = <String>[];
 
   /**
    * Returns the [String] that corresponds to the given index.
diff --git a/pkg/analysis_server/lib/src/index/store/collection.dart b/pkg/analysis_services/lib/src/index/store/collection.dart
similarity index 95%
rename from pkg/analysis_server/lib/src/index/store/collection.dart
rename to pkg/analysis_services/lib/src/index/store/collection.dart
index 3c29445..9002aa9 100644
--- a/pkg/analysis_server/lib/src/index/store/collection.dart
+++ b/pkg/analysis_services/lib/src/index/store/collection.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library index.store.collection;
+library services.src.index.store.collection;
 
 import 'dart:collection';
 import 'dart:typed_data';
@@ -18,7 +18,7 @@
   /**
    * Returns the value for the given [key] or null if [key] is not in the map.
    */
-  int operator[](List<int> key) {
+  int operator [](List<int> key) {
     Int32List typedKey = _getTypedKey(key);
     return map[typedKey];
   }
@@ -29,7 +29,7 @@
    * If the key was already in the map, its associated value is changed.
    * Otherwise the key-value pair is added to the map.
    */
-  void operator[]=(List<int> key, int value) {
+  void operator []=(List<int> key, int value) {
     Int32List typedKey = _getTypedKey(key);
     map[typedKey] = value;
   }
diff --git a/pkg/analysis_server/test/index/store/memory_node_manager.dart b/pkg/analysis_services/lib/src/index/store/memory_node_manager.dart
similarity index 91%
rename from pkg/analysis_server/test/index/store/memory_node_manager.dart
rename to pkg/analysis_services/lib/src/index/store/memory_node_manager.dart
index 3a9209e..1de944f 100644
--- a/pkg/analysis_server/test/index/store/memory_node_manager.dart
+++ b/pkg/analysis_services/lib/src/index/store/memory_node_manager.dart
@@ -2,24 +2,25 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.index.store_memory_node_manager;
+library services.src.index.store.store_memory_node_manager;
 
 import 'dart:async';
 import 'dart:collection';
 
-import 'package:analysis_server/src/index/store/codec.dart';
-import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:analysis_services/src/index/store/codec.dart';
+import 'package:analysis_services/src/index/store/split_store.dart';
 import 'package:analyzer/src/generated/engine.dart';
 
 
 class MemoryNodeManager implements NodeManager {
+  StringCodec _stringCodec = new StringCodec();
   ContextCodec _contextCodec = new ContextCodec();
   ElementCodec _elementCodec;
+  RelationshipCodec _relationshipCodec;
+
   int _locationCount = 0;
   final Map<String, int> _nodeLocationCounts = new HashMap<String, int>();
   final Map<String, IndexNode> _nodes = new HashMap<String, IndexNode>();
-  RelationshipCodec _relationshipCodec;
-  StringCodec _stringCodec = new StringCodec();
 
   MemoryNodeManager() {
     _elementCodec = new ElementCodec(_stringCodec);
diff --git a/pkg/analysis_server/lib/src/index/store/separate_file_manager.dart b/pkg/analysis_services/lib/src/index/store/separate_file_manager.dart
similarity index 90%
rename from pkg/analysis_server/lib/src/index/store/separate_file_manager.dart
rename to pkg/analysis_services/lib/src/index/store/separate_file_manager.dart
index 143fb5e..5a51cfa 100644
--- a/pkg/analysis_server/lib/src/index/store/separate_file_manager.dart
+++ b/pkg/analysis_services/lib/src/index/store/separate_file_manager.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library index.store.separate_file_mananer;
+library services.src.index.store.separate_file_mananer;
 
 import 'dart:async';
 import 'dart:io';
 
-import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:analysis_services/src/index/store/split_store.dart';
 import 'package:path/path.dart' as pathos;
 
 
@@ -56,4 +56,4 @@
     String path = pathos.join(_directory.path, name);
     return new File(path);
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/analysis_server/lib/src/index/store/split_store.dart b/pkg/analysis_services/lib/src/index/store/split_store.dart
similarity index 95%
rename from pkg/analysis_server/lib/src/index/store/split_store.dart
rename to pkg/analysis_services/lib/src/index/store/split_store.dart
index ccb6bd9..49e3ba0 100644
--- a/pkg/analysis_server/lib/src/index/store/split_store.dart
+++ b/pkg/analysis_services/lib/src/index/store/split_store.dart
@@ -2,20 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library index.split_store;
+library services.src.index.store.split_store;
 
 import 'dart:async';
 import 'dart:collection';
 import 'dart:io';
 import 'dart:typed_data';
 
-import 'package:analysis_server/src/index/store/collection.dart';
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/index_store.dart';
+import 'package:analysis_services/src/index/store/codec.dart';
+import 'package:analysis_services/src/index/store/collection.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/index.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analysis_server/src/index/store/codec.dart';
 
 
 /**
@@ -50,22 +51,18 @@
 class FileNodeManager implements NodeManager {
   static int _VERSION = 1;
 
-  final ContextCodec contextCodec;
-
-  final ElementCodec elementCodec;
-
-  final StringCodec stringCodec;
-
   final FileManager _fileManager;
+  final Logger _logger;
+
+  final ContextCodec contextCodec;
+  final ElementCodec elementCodec;
+  final StringCodec stringCodec;
+  final RelationshipCodec _relationshipCodec;
 
   int _locationCount = 0;
 
-  final Logger _logger;
-
   Map<String, int> _nodeLocationCounts = new HashMap<String, int>();
 
-  final RelationshipCodec _relationshipCodec;
-
   FileNodeManager(this._fileManager, this._logger, this.stringCodec,
       this.contextCodec, this.elementCodec, this._relationshipCodec);
 
@@ -214,11 +211,11 @@
   final AnalysisContext context;
 
   final ElementCodec _elementCodec;
+  final RelationshipCodec _relationshipCodec;
 
   Map<RelationKeyData, List<LocationData>> _relations =
       new HashMap<RelationKeyData, List<LocationData>>();
 
-  final RelationshipCodec _relationshipCodec;
 
   IndexNode(this.context, this._elementCodec, this._relationshipCodec);
 
@@ -239,19 +236,21 @@
   Map<RelationKeyData, List<LocationData>> get relations => _relations;
 
   /**
-   * Sets relations data. This method is used during loading data from a storage.
+   * Sets relations data.
+   * This method is used during loading data from a storage.
    */
   void set relations(Map<RelationKeyData, List<LocationData>> relations) {
-    this._relations.clear();
-    this._relations.addAll(relations);
+    _relations = relations;
   }
 
   /**
-   * Return the locations of the elements that have the given relationship with the given element.
+   * Returns the locations of the elements that have the given relationship with
+   * the given element.
    *
-   * @param element the the element that has the relationship with the locations to be returned
-   * @param relationship the [Relationship] between the given element and the locations to be
-   *          returned
+   * [element] - the the element that has the relationship with the locations to
+   *    be returned.
+   * [relationship] - the [Relationship] between the given [element] and the
+   *    locations to be returned
    */
   List<Location> getRelationships(Element element, Relationship relationship) {
     // prepare key
@@ -274,11 +273,11 @@
   }
 
   /**
-   * Records that the given element and location have the given relationship.
+   * Records that the given [element] and [location] have the given [relationship].
    *
-   * @param element the element that is related to the location
-   * @param relationship the [Relationship] between the element and the location
-   * @param location the [Location] where relationship happens
+   * [element] - the [Element] that is related to the location.
+   * [relationship] - the [Relationship] between [element] and [location].
+   * [location] - the [Location] where relationship happens.
    */
   void recordRelationship(Element element, Relationship relationship,
       Location location) {
@@ -301,8 +300,8 @@
  */
 class LocationData {
   final int elementId;
-  final int length;
   final int offset;
+  final int length;
 
   LocationData.forData(this.elementId, this.offset, this.length);
 
@@ -606,13 +605,7 @@
     }
   }
 
-  @override
-  List<Location> getRelationships(Element element, Relationship relationship) {
-    // TODO(scheglov) make IndexStore interface async
-    return <Location>[];
-  }
-
-  Future<List<Location>> getRelationshipsAsync(Element element,
+  Future<List<Location>> getRelationships(Element element,
       Relationship relationship) {
     // special support for UniverseElement
     if (identical(element, UniverseElement.INSTANCE)) {
diff --git a/pkg/analysis_services/lib/src/search/search_engine.dart b/pkg/analysis_services/lib/src/search/search_engine.dart
new file mode 100644
index 0000000..b9419b9
--- /dev/null
+++ b/pkg/analysis_services/lib/src/search/search_engine.dart
@@ -0,0 +1,1228 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.src.search.search_engine;
+
+///**
+// * Instances of the class <code>AndSearchPattern</code> implement a search pattern that matches
+// * elements that match all of several other search patterns.
+// */
+//class AndSearchPattern implements SearchPattern {
+//  /**
+//   * The patterns used to determine whether this pattern matches an element.
+//   */
+//  final List<SearchPattern> _patterns;
+//
+//  /**
+//   * Initialize a newly created search pattern to match elements that match all of several other
+//   * search patterns.
+//   *
+//   * @param patterns the patterns used to determine whether this pattern matches an element
+//   */
+//  AndSearchPattern(this._patterns);
+//
+//  @override
+//  MatchQuality matches(Element element) {
+//    MatchQuality highestQuality = null;
+//    for (SearchPattern pattern in _patterns) {
+//      MatchQuality quality = pattern.matches(element);
+//      if (quality == null) {
+//        return null;
+//      }
+//      if (highestQuality == null) {
+//        highestQuality = quality;
+//      } else {
+//        highestQuality = highestQuality.max(quality);
+//      }
+//    }
+//    return highestQuality;
+//  }
+//}
+//
+///**
+// * Instances of the class <code>CamelCaseSearchPattern</code> implement a search pattern that
+// * matches elements whose name matches a partial identifier where camel case conventions are used to
+// * perform what is essentially multiple prefix matches.
+// */
+//class CamelCaseSearchPattern implements SearchPattern {
+//  /**
+//   * The pattern that matching elements must match.
+//   */
+//  List<int> _pattern;
+//
+//  /**
+//   * A flag indicating whether the pattern and the name being matched must have exactly the same
+//   * number of parts (i.e. the same number of uppercase characters).
+//   */
+//  final bool _samePartCount;
+//
+//  /**
+//   * Initialize a newly created search pattern to match elements whose names match the given
+//   * camel-case pattern.
+//   *
+//   * @param pattern the pattern that matching elements must match
+//   * @param samePartCount `true` if the pattern and the name being matched must have
+//   *          exactly the same number of parts (i.e. the same number of uppercase characters)
+//   */
+//  CamelCaseSearchPattern(String pattern, this._samePartCount) {
+//    this._pattern = pattern.toCharArray();
+//  }
+//
+//  @override
+//  MatchQuality matches(Element element) {
+//    String name = element.displayName;
+//    if (name == null) {
+//      return null;
+//    }
+//    if (CharOperation.camelCaseMatch(_pattern, name.toCharArray(), _samePartCount)) {
+//      return MatchQuality.EXACT;
+//    }
+//    return null;
+//  }
+//}
+//
+///**
+// * Instances of the class `CountingSearchListener` listen for search results, passing those
+// * results on to a wrapped listener, but ensure that the wrapped search listener receives only one
+// * notification that the search is complete.
+// */
+//class CountingSearchListener implements SearchListener {
+//  /**
+//   * The number of times that this listener expects to be told that the search is complete before
+//   * passing the information along to the wrapped listener.
+//   */
+//  int _completionCount = 0;
+//
+//  /**
+//   * The listener that will be notified as results are received and when the given number of search
+//   * complete notifications have been received.
+//   */
+//  final SearchListener _wrappedListener;
+//
+//  /**
+//   * Initialize a newly created search listener to pass search results on to the given listener and
+//   * to notify the given listener that the search is complete after getting the given number of
+//   * notifications.
+//   *
+//   * @param completionCount the number of times that this listener expects to be told that the
+//   *          search is complete
+//   * @param wrappedListener the listener that will be notified as results are received
+//   */
+//  CountingSearchListener(int completionCount, this._wrappedListener) {
+//    this._completionCount = completionCount;
+//    if (completionCount == 0) {
+//      _wrappedListener.searchComplete();
+//    }
+//  }
+//
+//  @override
+//  void matchFound(SearchMatch match) {
+//    _wrappedListener.matchFound(match);
+//  }
+//
+//  @override
+//  void searchComplete() {
+//    _completionCount--;
+//    if (_completionCount <= 0) {
+//      _wrappedListener.searchComplete();
+//    }
+//  }
+//}
+//
+///**
+// * Instances of the class <code>ExactSearchPattern</code> implement a search pattern that matches
+// * elements whose name matches a specified identifier exactly.
+// */
+//class ExactSearchPattern implements SearchPattern {
+//  /**
+//   * The identifier that matching elements must be equal to.
+//   */
+//  final String _identifier;
+//
+//  /**
+//   * A flag indicating whether a case sensitive match is to be performed.
+//   */
+//  final bool _caseSensitive;
+//
+//  /**
+//   * Initialize a newly created search pattern to match elements whose names begin with the given
+//   * prefix.
+//   *
+//   * @param identifier the identifier that matching elements must be equal to
+//   * @param caseSensitive `true` if a case sensitive match is to be performed
+//   */
+//  ExactSearchPattern(this._identifier, this._caseSensitive);
+//
+//  @override
+//  MatchQuality matches(Element element) {
+//    String name = element.displayName;
+//    if (name == null) {
+//      return null;
+//    }
+//    if (_caseSensitive && name == _identifier) {
+//      return MatchQuality.EXACT;
+//    }
+//    if (!_caseSensitive && javaStringEqualsIgnoreCase(name, _identifier)) {
+//      return MatchQuality.EXACT;
+//    }
+//    return null;
+//  }
+//}
+//
+///**
+// * Instances of the class <code>FilteredSearchListener</code> implement a search listener that
+// * delegates to another search listener after removing matches that do not pass a given filter.
+// */
+//class FilteredSearchListener extends WrappedSearchListener {
+//  /**
+//   * The filter used to filter the matches.
+//   */
+//  final SearchFilter _filter;
+//
+//  /**
+//   * Initialize a newly created search listener to pass on any matches that pass the given filter to
+//   * the given listener.
+//   *
+//   * @param filter the filter used to filter the matches
+//   * @param listener the search listener being wrapped
+//   */
+//  FilteredSearchListener(this._filter, SearchListener listener) : super(listener);
+//
+//  @override
+//  void matchFound(SearchMatch match) {
+//    if (_filter.passes(match)) {
+//      propagateMatch(match);
+//    }
+//  }
+//}
+//
+///**
+// * [SearchListener] used by [SearchEngineImpl] internally to gather asynchronous results
+// * and return them synchronously.
+// */
+//class GatheringSearchListener implements SearchListener {
+//  /**
+//   * A list containing the matches that have been found so far.
+//   */
+//  List<SearchMatch> _matches = [];
+//
+//  /**
+//   * A flag indicating whether the search is complete.
+//   */
+//  bool _isComplete = false;
+//
+//  /**
+//   * @return the the matches that have been found.
+//   */
+//  List<SearchMatch> get matches {
+//    _matches.sort(SearchMatch.SORT_BY_ELEMENT_NAME);
+//    return _matches;
+//  }
+//
+//  /**
+//   * Return `true` if the search is complete.
+//   *
+//   * @return `true` if the search is complete
+//   */
+//  bool get isComplete => _isComplete;
+//
+//  @override
+//  void matchFound(SearchMatch match) {
+//    _matches.add(match);
+//  }
+//
+//  @override
+//  void searchComplete() {
+//    _isComplete = true;
+//  }
+//}
+//
+///**
+// * Instances of the class <code>LibrarySearchScope</code> implement a search scope that encompasses
+// * everything in a given collection of libraries.
+// */
+//class LibrarySearchScope implements SearchScope {
+//  /**
+//   * The libraries defining which elements are included in the scope.
+//   */
+//  final List<LibraryElement> libraries;
+//
+//  /**
+//   * Create a search scope that encompasses everything in the given libraries.
+//   *
+//   * @param libraries the libraries defining which elements are included in the scope
+//   */
+//  LibrarySearchScope.con1(Iterable<LibraryElement> libraries) : this.con2(new List.from(libraries));
+//
+//  /**
+//   * Create a search scope that encompasses everything in the given libraries.
+//   *
+//   * @param libraries the libraries defining which elements are included in the scope
+//   */
+//  LibrarySearchScope.con2(this.libraries);
+//
+//  @override
+//  bool encloses(Element element) {
+//    LibraryElement elementLibrary = element.getAncestor((element) => element is LibraryElement);
+//    return ArrayUtils.contains(libraries, elementLibrary);
+//  }
+//}
+//
+///**
+// * Instances of the class <code>NameMatchingSearchListener</code> implement a search listener that
+// * delegates to another search listener after removing matches that do not match a given pattern.
+// */
+//class NameMatchingSearchListener extends WrappedSearchListener {
+//  /**
+//   * The pattern used to filter the matches.
+//   */
+//  final SearchPattern _pattern;
+//
+//  /**
+//   * Initialize a newly created search listener to pass on any matches that match the given pattern
+//   * to the given listener.
+//   *
+//   * @param pattern the pattern used to filter the matches
+//   * @param listener the search listener being wrapped
+//   */
+//  NameMatchingSearchListener(this._pattern, SearchListener listener) : super(listener);
+//
+//  @override
+//  void matchFound(SearchMatch match) {
+//    if (_pattern.matches(match.element) != null) {
+//      propagateMatch(match);
+//    }
+//  }
+//}
+//
+///**
+// * Instances of the class <code>OrSearchPattern</code> implement a search pattern that matches
+// * elements that match any one of several other search patterns.
+// */
+//class OrSearchPattern implements SearchPattern {
+//  /**
+//   * The patterns used to determine whether this pattern matches an element.
+//   */
+//  final List<SearchPattern> _patterns;
+//
+//  /**
+//   * Initialize a newly created search pattern to match elements that match any one of several other
+//   * search patterns.
+//   *
+//   * @param patterns the patterns used to determine whether this pattern matches an element
+//   */
+//  OrSearchPattern(this._patterns);
+//
+//  @override
+//  MatchQuality matches(Element element) {
+//    // Do we want to return the highest quality of match rather than stopping
+//    // after the first match? Doing so would be more accurate, but slower.
+//    for (SearchPattern pattern in _patterns) {
+//      MatchQuality quality = pattern.matches(element);
+//      if (quality != null) {
+//        return quality;
+//      }
+//    }
+//    return null;
+//  }
+//}
+//
+///**
+// * Instances of the class <code>PrefixSearchPattern</code> implement a search pattern that matches
+// * elements whose name has a given prefix.
+// */
+//class PrefixSearchPattern implements SearchPattern {
+//  /**
+//   * The prefix that matching elements must start with.
+//   */
+//  final String _prefix;
+//
+//  /**
+//   * A flag indicating whether a case sensitive match is to be performed.
+//   */
+//  final bool _caseSensitive;
+//
+//  /**
+//   * Initialize a newly created search pattern to match elements whose names begin with the given
+//   * prefix.
+//   *
+//   * @param prefix the prefix that matching elements must start with
+//   * @param caseSensitive `true` if a case sensitive match is to be performed
+//   */
+//  PrefixSearchPattern(this._prefix, this._caseSensitive);
+//
+//  @override
+//  MatchQuality matches(Element element) {
+//    if (element == null) {
+//      return null;
+//    }
+//    String name = element.displayName;
+//    if (name == null) {
+//      return null;
+//    }
+//    if (_caseSensitive && startsWith(name, _prefix)) {
+//      return MatchQuality.EXACT;
+//    }
+//    if (!_caseSensitive && startsWithIgnoreCase(name, _prefix)) {
+//      return MatchQuality.EXACT;
+//    }
+//    return null;
+//  }
+//}
+//
+///**
+// * Instances of the class <code>RegularExpressionSearchPattern</code> implement a search pattern
+// * that matches elements whose name matches a given regular expression.
+// */
+//class RegularExpressionSearchPattern implements SearchPattern {
+//  /**
+//   * The regular expression pattern that matching elements must match.
+//   */
+//  RegExp _pattern;
+//
+//  /**
+//   * Initialize a newly created search pattern to match elements whose names begin with the given
+//   * prefix.
+//   *
+//   * @param regularExpression the regular expression that matching elements must match
+//   * @param caseSensitive `true` if a case sensitive match is to be performed
+//   */
+//  RegularExpressionSearchPattern(String regularExpression, bool caseSensitive) {
+//    _pattern = new RegExp(regularExpression);
+//  }
+//
+//  @override
+//  MatchQuality matches(Element element) {
+//    if (element == null) {
+//      return null;
+//    }
+//    String name = element.displayName;
+//    if (name == null) {
+//      return null;
+//    }
+//    if (new JavaPatternMatcher(_pattern, name).matches()) {
+//      return MatchQuality.EXACT;
+//    }
+//    return null;
+//  }
+//}
+//
+///**
+// * Factory for [SearchEngine].
+// */
+//class SearchEngineFactory {
+//  /**
+//   * @return the new [SearchEngine] instance based on the given [Index].
+//   */
+//  static SearchEngine createSearchEngine(Index index) => new SearchEngineImpl(index);
+//}
+
+///**
+// * Implementation of [SearchEngine].
+// */
+//class SearchEngineImpl implements SearchEngine {
+//  /**
+//   * Apply the given filter to the given listener.
+//   *
+//   * @param filter the filter to be used before passing matches on to the listener, or `null`
+//   *          if all matches should be passed on
+//   * @param listener the listener that will only be given matches that pass the filter
+//   * @return a search listener that will pass to the given listener any matches that pass the given
+//   *         filter
+//   */
+//  static SearchListener _applyFilter(SearchFilter filter, SearchListener listener) {
+//    if (filter == null) {
+//      return listener;
+//    }
+//    return new FilteredSearchListener(filter, listener);
+//  }
+//
+//  /**
+//   * Apply the given pattern to the given listener.
+//   *
+//   * @param pattern the pattern to be used before passing matches on to the listener, or
+//   *          `null` if all matches should be passed on
+//   * @param listener the listener that will only be given matches that match the pattern
+//   * @return a search listener that will pass to the given listener any matches that match the given
+//   *         pattern
+//   */
+//  static SearchListener _applyPattern(SearchPattern pattern, SearchListener listener) {
+//    if (pattern == null) {
+//      return listener;
+//    }
+//    return new NameMatchingSearchListener(pattern, listener);
+//  }
+//
+//  static List<Element> _createElements(SearchScope scope) {
+//    if (scope is LibrarySearchScope) {
+//      return scope.libraries;
+//    }
+//    return <Element> [IndexConstants.UNIVERSE];
+//  }
+//
+//  static RelationshipCallback _newCallback(MatchKind matchKind, SearchScope scope, SearchListener listener) => new SearchEngineImpl_RelationshipCallbackImpl(scope, matchKind, listener);
+//
+//  /**
+//   * The index used to respond to the search requests.
+//   */
+//  final Index _index;
+//
+//  /**
+//   * Initialize a newly created search engine to use the given index.
+//   *
+//   * @param index the index used to respond to the search requests
+//   */
+//  SearchEngineImpl(this._index);
+//
+//  @override
+//  Set<DartType> searchAssignedTypes(PropertyInducingElement variable, SearchScope scope) {
+//    PropertyAccessorElement setter = variable.setter;
+//    int numRequests = (setter != null ? 2 : 0) + 2;
+//    // find locations
+//    List<Location> locations = [];
+//    CountDownLatch latch = new CountDownLatch(numRequests);
+//    if (setter != null) {
+//      _index.getRelationships(setter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, new Callback());
+//      _index.getRelationships(setter, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, new Callback());
+//    }
+//    _index.getRelationships(variable, IndexConstants.IS_REFERENCED_BY, new Callback());
+//    _index.getRelationships(variable, IndexConstants.IS_DEFINED_BY, new Callback());
+//    Uninterruptibles.awaitUninterruptibly(latch);
+//    // get types from locations
+//    Set<DartType> types = new Set();
+//    for (Location location in locations) {
+//      // check scope
+//      if (scope != null) {
+//        Element targetElement = location.element;
+//        if (!scope.encloses(targetElement)) {
+//          continue;
+//        }
+//      }
+//      // we need data
+//      if (location is! LocationWithData) {
+//        continue;
+//      }
+//      LocationWithData locationWithData = location as LocationWithData;
+//      // add type
+//      Object data = locationWithData.data;
+//      if (data is DartType) {
+//        DartType type = data as DartType;
+//        types.add(type);
+//      }
+//    }
+//    // done
+//    return types;
+//  }
+//
+//  @override
+//  List<SearchMatch> searchDeclarations(String name, SearchScope scope, SearchFilter filter) => _gatherResults(new SearchRunner_SearchEngineImpl_searchDeclarations(this, name, scope, filter));
+//
+//  @override
+//  void searchDeclarations2(String name, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.IS_DEFINED_BY, _newCallback(MatchKind.NAME_DECLARATION, scope, listener));
+//  }
+//
+//  @override
+//  List<SearchMatch> searchFunctionDeclarations(SearchScope scope, SearchPattern pattern, SearchFilter filter) => _gatherResults(new SearchRunner_SearchEngineImpl_searchFunctionDeclarations(this, scope, pattern, filter));
+//
+//  @override
+//  void searchFunctionDeclarations2(SearchScope scope, SearchPattern pattern, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    List<Element> elements = _createElements(scope);
+//    listener = _applyPattern(pattern, listener);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(elements.length, listener);
+//    for (Element element in elements) {
+//      _index.getRelationships(element, IndexConstants.DEFINES_FUNCTION, _newCallback(MatchKind.FUNCTION_DECLARATION, scope, listener));
+//    }
+//  }
+//
+//  @override
+//  List<SearchMatch> searchQualifiedMemberReferences(String name, SearchScope scope, SearchFilter filter) => _gatherResults(new SearchRunner_SearchEngineImpl_searchQualifiedMemberReferences(this, name, scope, filter));
+//
+//  @override
+//  void searchQualifiedMemberReferences2(String name, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(10, listener);
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _newCallback(MatchKind.NAME_REFERENCE_RESOLVED, scope, listener));
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _newCallback(MatchKind.NAME_REFERENCE_UNRESOLVED, scope, listener));
+//    // granular resolved operations
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.NAME_IS_INVOKED_BY_RESOLVED, _newCallback(MatchKind.NAME_INVOCATION_RESOLVED, scope, listener));
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.NAME_IS_READ_BY_RESOLVED, _newCallback(MatchKind.NAME_READ_RESOLVED, scope, listener));
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.NAME_IS_READ_WRITTEN_BY_RESOLVED, _newCallback(MatchKind.NAME_READ_WRITE_RESOLVED, scope, listener));
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.NAME_IS_WRITTEN_BY_RESOLVED, _newCallback(MatchKind.NAME_WRITE_RESOLVED, scope, listener));
+//    // granular unresolved operations
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.NAME_IS_INVOKED_BY_UNRESOLVED, _newCallback(MatchKind.NAME_INVOCATION_UNRESOLVED, scope, listener));
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.NAME_IS_READ_BY_UNRESOLVED, _newCallback(MatchKind.NAME_READ_UNRESOLVED, scope, listener));
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.NAME_IS_READ_WRITTEN_BY_UNRESOLVED, _newCallback(MatchKind.NAME_READ_WRITE_UNRESOLVED, scope, listener));
+//    _index.getRelationships(new NameElementImpl(name), IndexConstants.NAME_IS_WRITTEN_BY_UNRESOLVED, _newCallback(MatchKind.NAME_WRITE_UNRESOLVED, scope, listener));
+//  }
+//
+//  @override
+//  List<SearchMatch> searchReferences(Element element, SearchScope scope, SearchFilter filter) => _gatherResults(new SearchRunner_SearchEngineImpl_searchReferences(this, element, scope, filter));
+//
+//  @override
+//  void searchReferences2(Element element, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    if (element == null) {
+//      listener.searchComplete();
+//      return;
+//    }
+//    if (element is Member) {
+//      element = (element as Member).baseElement;
+//    }
+//    while (true) {
+//      if (element.kind == ElementKind.ANGULAR_COMPONENT || element.kind == ElementKind.ANGULAR_CONTROLLER || element.kind == ElementKind.ANGULAR_FORMATTER || element.kind == ElementKind.ANGULAR_PROPERTY || element.kind == ElementKind.ANGULAR_SCOPE_PROPERTY || element.kind == ElementKind.ANGULAR_SELECTOR) {
+//        _searchReferences(element as AngularElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.CLASS) {
+//        _searchReferences2(element as ClassElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.COMPILATION_UNIT) {
+//        _searchReferences3(element as CompilationUnitElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.CONSTRUCTOR) {
+//        _searchReferences4(element as ConstructorElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.FIELD || element.kind == ElementKind.TOP_LEVEL_VARIABLE) {
+//        _searchReferences12(element as PropertyInducingElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.FUNCTION) {
+//        _searchReferences5(element as FunctionElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.GETTER || element.kind == ElementKind.SETTER) {
+//        _searchReferences11(element as PropertyAccessorElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.IMPORT) {
+//        _searchReferences7(element as ImportElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.LIBRARY) {
+//        _searchReferences8(element as LibraryElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.LOCAL_VARIABLE) {
+//        _searchReferences14(element as LocalVariableElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.METHOD) {
+//        _searchReferences9(element as MethodElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.PARAMETER) {
+//        _searchReferences10(element as ParameterElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.FUNCTION_TYPE_ALIAS) {
+//        _searchReferences6(element as FunctionTypeAliasElement, scope, filter, listener);
+//        return;
+//      } else if (element.kind == ElementKind.TYPE_PARAMETER) {
+//        _searchReferences13(element as TypeParameterElement, scope, filter, listener);
+//        return;
+//      } else {
+//        listener.searchComplete();
+//        return;
+//      }
+//      break;
+//    }
+//  }
+//
+//  @override
+//  List<SearchMatch> searchSubtypes(ClassElement type, SearchScope scope, SearchFilter filter) => _gatherResults(new SearchRunner_SearchEngineImpl_searchSubtypes(this, type, scope, filter));
+//
+//  @override
+//  void searchSubtypes2(ClassElement type, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(3, listener);
+//    _index.getRelationships(type, IndexConstants.IS_EXTENDED_BY, _newCallback(MatchKind.EXTENDS_REFERENCE, scope, listener));
+//    _index.getRelationships(type, IndexConstants.IS_MIXED_IN_BY, _newCallback(MatchKind.WITH_REFERENCE, scope, listener));
+//    _index.getRelationships(type, IndexConstants.IS_IMPLEMENTED_BY, _newCallback(MatchKind.IMPLEMENTS_REFERENCE, scope, listener));
+//  }
+//
+//  @override
+//  List<SearchMatch> searchTypeDeclarations(SearchScope scope, SearchPattern pattern, SearchFilter filter) => _gatherResults(new SearchRunner_SearchEngineImpl_searchTypeDeclarations(this, scope, pattern, filter));
+//
+//  @override
+//  void searchTypeDeclarations2(SearchScope scope, SearchPattern pattern, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    List<Element> elements = _createElements(scope);
+//    listener = _applyPattern(pattern, listener);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(elements.length * 3, listener);
+//    for (Element element in elements) {
+//      _index.getRelationships(element, IndexConstants.DEFINES_CLASS, _newCallback(MatchKind.CLASS_DECLARATION, scope, listener));
+//      _index.getRelationships(element, IndexConstants.DEFINES_CLASS_ALIAS, _newCallback(MatchKind.CLASS_ALIAS_DECLARATION, scope, listener));
+//      _index.getRelationships(element, IndexConstants.DEFINES_FUNCTION_TYPE, _newCallback(MatchKind.FUNCTION_TYPE_DECLARATION, scope, listener));
+//    }
+//  }
+//
+//  @override
+//  List<SearchMatch> searchVariableDeclarations(SearchScope scope, SearchPattern pattern, SearchFilter filter) => _gatherResults(new SearchRunner_SearchEngineImpl_searchVariableDeclarations(this, scope, pattern, filter));
+//
+//  @override
+//  void searchVariableDeclarations2(SearchScope scope, SearchPattern pattern, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    List<Element> elements = _createElements(scope);
+//    listener = _applyPattern(pattern, listener);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(elements.length, listener);
+//    for (Element element in elements) {
+//      _index.getRelationships(element, IndexConstants.DEFINES_VARIABLE, _newCallback(MatchKind.VARIABLE_DECLARATION, scope, listener));
+//    }
+//  }
+//
+//  /**
+//   * Use the given runner to perform the given number of asynchronous searches, then wait until the
+//   * search has completed and return the results that were produced.
+//   *
+//   * @param runner the runner used to perform an asynchronous search
+//   * @return the results that were produced @ if the results of at least one of the searched could
+//   *         not be computed
+//   */
+//  List<SearchMatch> _gatherResults(SearchEngineImpl_SearchRunner runner) {
+//    GatheringSearchListener listener = new GatheringSearchListener();
+//    runner.performSearch(listener);
+//    while (!listener.isComplete) {
+//      Thread.yield();
+//    }
+//    return listener.matches;
+//  }
+//
+//  void _searchReferences(AngularElement element, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(2, listener);
+//    _index.getRelationships(element, IndexConstants.ANGULAR_REFERENCE, _newCallback(MatchKind.ANGULAR_REFERENCE, scope, listener));
+//    _index.getRelationships(element, IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE, _newCallback(MatchKind.ANGULAR_CLOSING_TAG_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences2(ClassElement type, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    _index.getRelationships(type, IndexConstants.IS_REFERENCED_BY, _newCallback(MatchKind.TYPE_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences3(CompilationUnitElement unit, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    _index.getRelationships(unit, IndexConstants.IS_REFERENCED_BY, _newCallback(MatchKind.UNIT_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences4(ConstructorElement constructor, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(2, listener);
+//    _index.getRelationships(constructor, IndexConstants.IS_DEFINED_BY, _newCallback(MatchKind.CONSTRUCTOR_DECLARATION, scope, listener));
+//    _index.getRelationships(constructor, IndexConstants.IS_REFERENCED_BY, _newCallback(MatchKind.CONSTRUCTOR_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences5(FunctionElement function, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(2, listener);
+//    _index.getRelationships(function, IndexConstants.IS_REFERENCED_BY, _newCallback(MatchKind.FUNCTION_REFERENCE, scope, listener));
+//    _index.getRelationships(function, IndexConstants.IS_INVOKED_BY, _newCallback(MatchKind.FUNCTION_EXECUTION, scope, listener));
+//  }
+//
+//  void _searchReferences6(FunctionTypeAliasElement alias, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    _index.getRelationships(alias, IndexConstants.IS_REFERENCED_BY, _newCallback(MatchKind.FUNCTION_TYPE_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences7(ImportElement imp, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    _index.getRelationships(imp, IndexConstants.IS_REFERENCED_BY, _newCallback(MatchKind.IMPORT_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences8(LibraryElement library, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    _index.getRelationships(library, IndexConstants.IS_REFERENCED_BY, _newCallback(MatchKind.LIBRARY_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences9(MethodElement method, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    // TODO(scheglov) use "5" when add named matches
+//    listener = new CountingSearchListener(4, listener);
+//    // exact matches
+//    _index.getRelationships(method, IndexConstants.IS_INVOKED_BY_UNQUALIFIED, _newCallback(MatchKind.METHOD_INVOCATION, scope, listener));
+//    _index.getRelationships(method, IndexConstants.IS_INVOKED_BY_QUALIFIED, _newCallback(MatchKind.METHOD_INVOCATION, scope, listener));
+//    _index.getRelationships(method, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _newCallback(MatchKind.METHOD_REFERENCE, scope, listener));
+//    _index.getRelationships(method, IndexConstants.IS_REFERENCED_BY_QUALIFIED, _newCallback(MatchKind.METHOD_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences10(ParameterElement parameter, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(5, listener);
+//    _index.getRelationships(parameter, IndexConstants.IS_READ_BY, _newCallback(MatchKind.VARIABLE_READ, scope, listener));
+//    _index.getRelationships(parameter, IndexConstants.IS_READ_WRITTEN_BY, _newCallback(MatchKind.VARIABLE_READ_WRITE, scope, listener));
+//    _index.getRelationships(parameter, IndexConstants.IS_WRITTEN_BY, _newCallback(MatchKind.VARIABLE_WRITE, scope, listener));
+//    _index.getRelationships(parameter, IndexConstants.IS_REFERENCED_BY, _newCallback(MatchKind.NAMED_PARAMETER_REFERENCE, scope, listener));
+//    _index.getRelationships(parameter, IndexConstants.IS_INVOKED_BY, _newCallback(MatchKind.FUNCTION_EXECUTION, scope, listener));
+//  }
+//
+//  void _searchReferences11(PropertyAccessorElement accessor, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(2, listener);
+//    _index.getRelationships(accessor, IndexConstants.IS_REFERENCED_BY_QUALIFIED, _newCallback(MatchKind.PROPERTY_ACCESSOR_REFERENCE, scope, listener));
+//    _index.getRelationships(accessor, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _newCallback(MatchKind.PROPERTY_ACCESSOR_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences12(PropertyInducingElement field, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    PropertyAccessorElement getter = field.getter;
+//    PropertyAccessorElement setter = field.setter;
+//    int numRequests = (getter != null ? 4 : 0) + (setter != null ? 2 : 0) + 2;
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(numRequests, listener);
+//    if (getter != null) {
+//      _index.getRelationships(getter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, _newCallback(MatchKind.FIELD_READ, scope, listener));
+//      _index.getRelationships(getter, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _newCallback(MatchKind.FIELD_READ, scope, listener));
+//      _index.getRelationships(getter, IndexConstants.IS_INVOKED_BY_QUALIFIED, _newCallback(MatchKind.FIELD_INVOCATION, scope, listener));
+//      _index.getRelationships(getter, IndexConstants.IS_INVOKED_BY_UNQUALIFIED, _newCallback(MatchKind.FIELD_INVOCATION, scope, listener));
+//    }
+//    if (setter != null) {
+//      _index.getRelationships(setter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, _newCallback(MatchKind.FIELD_WRITE, scope, listener));
+//      _index.getRelationships(setter, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _newCallback(MatchKind.FIELD_WRITE, scope, listener));
+//    }
+//    _index.getRelationships(field, IndexConstants.IS_REFERENCED_BY, _newCallback(MatchKind.FIELD_REFERENCE, scope, listener));
+//    _index.getRelationships(field, IndexConstants.IS_REFERENCED_BY_QUALIFIED, _newCallback(MatchKind.FIELD_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences13(TypeParameterElement typeParameter, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    _index.getRelationships(typeParameter, IndexConstants.IS_REFERENCED_BY, _newCallback(MatchKind.TYPE_PARAMETER_REFERENCE, scope, listener));
+//  }
+//
+//  void _searchReferences14(VariableElement variable, SearchScope scope, SearchFilter filter, SearchListener listener) {
+//    assert(listener != null);
+//    listener = _applyFilter(filter, listener);
+//    listener = new CountingSearchListener(4, listener);
+//    _index.getRelationships(variable, IndexConstants.IS_READ_BY, _newCallback(MatchKind.VARIABLE_READ, scope, listener));
+//    _index.getRelationships(variable, IndexConstants.IS_READ_WRITTEN_BY, _newCallback(MatchKind.VARIABLE_READ_WRITE, scope, listener));
+//    _index.getRelationships(variable, IndexConstants.IS_WRITTEN_BY, _newCallback(MatchKind.VARIABLE_WRITE, scope, listener));
+//    _index.getRelationships(variable, IndexConstants.IS_INVOKED_BY, _newCallback(MatchKind.FUNCTION_EXECUTION, scope, listener));
+//  }
+//}
+//
+///**
+// * Instances of the class <code>RelationshipCallbackImpl</code> implement a callback that can be
+// * used to report results to a search listener.
+// */
+//class SearchEngineImpl_RelationshipCallbackImpl implements RelationshipCallback {
+//  final SearchScope _scope;
+//
+//  /**
+//   * The kind of matches that are represented by the results that will be provided to this
+//   * callback.
+//   */
+//  final MatchKind _matchKind;
+//
+//  /**
+//   * The search listener that should be notified when results are found.
+//   */
+//  final SearchListener _listener;
+//
+//  /**
+//   * Initialize a newly created callback to report matches of the given kind to the given listener
+//   * when results are found.
+//   *
+//   * @param scope the [SearchScope] to return matches from, may be `null` to return
+//   *          all matches
+//   * @param matchKind the kind of matches that are represented by the results
+//   * @param listener the search listener that should be notified when results are found
+//   */
+//  SearchEngineImpl_RelationshipCallbackImpl(this._scope, this._matchKind, this._listener);
+//
+//  @override
+//  void hasRelationships(Element element, Relationship relationship, List<Location> locations) {
+//    for (Location location in locations) {
+//      Element targetElement = location.element;
+//      // check scope
+//      if (_scope != null && !_scope.encloses(targetElement)) {
+//        continue;
+//      }
+//      SourceRange range = new SourceRange(location.offset, location.length);
+//      // TODO(scheglov) IndexConstants.DYNAMIC for MatchQuality.NAME
+//      MatchQuality quality = MatchQuality.EXACT;
+//      //          MatchQuality quality = element.getResource() != IndexConstants.DYNAMIC
+//      //              ? MatchQuality.EXACT : MatchQuality.NAME;
+//      SearchMatch match = new SearchMatch(quality, _matchKind, targetElement, range);
+//      match.qualified = identical(relationship, IndexConstants.IS_REFERENCED_BY_QUALIFIED) || identical(relationship, IndexConstants.IS_INVOKED_BY_QUALIFIED);
+//      _listener.matchFound(match);
+//    }
+//    _listener.searchComplete();
+//  }
+//}
+//
+///**
+// * The interface <code>SearchRunner</code> defines the behavior of objects that can be used to
+// * perform an asynchronous search.
+// */
+//abstract class SearchEngineImpl_SearchRunner {
+//  /**
+//   * Perform an asynchronous search, passing the results to the given listener.
+//   *
+//   * @param listener the listener to which search results should be passed @ if the results could
+//   *          not be computed
+//   */
+//  void performSearch(SearchListener listener);
+//}
+//
+///**
+// * The interface <code>SearchListener</code> defines the behavior of objects that are listening for
+// * the results of a search.
+// */
+//abstract class SearchListener {
+//  /**
+//   * Record the fact that the given match was found.
+//   *
+//   * @param match the match that was found
+//   */
+//  void matchFound(SearchMatch match);
+//
+//  /**
+//   * This method is invoked when the search is complete and no additional matches will be found.
+//   */
+//  void searchComplete();
+//}
+
+///**
+// * The class <code>SearchPatternFactory</code> defines utility methods that can be used to create
+// * search patterns.
+// */
+//class SearchPatternFactory {
+//  /**
+//   * Create a pattern that will match any element that is matched by all of the given patterns. If
+//   * no patterns are given, then the resulting pattern will not match any elements.
+//   *
+//   * @param patterns the patterns that must all be matched in order for the new pattern to be
+//   *          matched
+//   * @return the pattern that was created
+//   */
+//  static SearchPattern createAndPattern(List<SearchPattern> patterns) {
+//    if (patterns.length == 1) {
+//      return patterns[0];
+//    }
+//    return new AndSearchPattern(patterns);
+//  }
+//
+//  /**
+//   * Create a pattern that will match any element whose name matches a partial identifier where
+//   * camel case conventions are used to perform what is essentially multiple prefix matches.
+//   *
+//   * @param pattern the pattern that matching elements must match
+//   * @param samePartCount `true` if the pattern and the name being matched must have
+//   *          exactly the same number of parts (i.e. the same number of uppercase characters)
+//   * @return the pattern that was created
+//   */
+//  static SearchPattern createCamelCasePattern(String prefix, bool samePartCount) => new CamelCaseSearchPattern(prefix, samePartCount);
+//
+//  /**
+//   * Create a pattern that will match any element whose name matches a specified identifier exactly.
+//   *
+//   * @param identifier the identifier that matching elements must be equal to
+//   * @param caseSensitive `true` if a case sensitive match is to be performed
+//   * @return the pattern that was created
+//   */
+//  static SearchPattern createExactPattern(String identifier, bool caseSensitive) => new ExactSearchPattern(identifier, caseSensitive);
+//
+//  /**
+//   * Create a pattern that will match any element that is matched by at least one of the given
+//   * patterns. If no patterns are given, then the resulting pattern will not match any elements.
+//   *
+//   * @param patterns the patterns used to determine whether the new pattern is matched
+//   * @return the pattern that was created
+//   */
+//  static SearchPattern createOrPattern(List<SearchPattern> patterns) {
+//    if (patterns.length == 1) {
+//      return patterns[0];
+//    }
+//    return new OrSearchPattern(patterns);
+//  }
+//
+//  /**
+//   * Create a pattern that will match any element whose name starts with the given prefix.
+//   *
+//   * @param prefix the prefix of names that match the pattern
+//   * @param caseSensitive `true` if a case sensitive match is to be performed
+//   * @return the pattern that was created
+//   */
+//  static SearchPattern createPrefixPattern(String prefix, bool caseSensitive) => new PrefixSearchPattern(prefix, caseSensitive);
+//
+//  /**
+//   * Create a pattern that will match any element whose name matches a regular expression.
+//   *
+//   * @param regularExpression the regular expression that matching elements must match
+//   * @param caseSensitive `true` if a case sensitive match is to be performed
+//   * @return the pattern that was created
+//   */
+//  static SearchPattern createRegularExpressionPattern(String regularExpression, bool caseSensitive) => new RegularExpressionSearchPattern(regularExpression, caseSensitive);
+//
+//  /**
+//   * Create a pattern that will match any element whose name matches a pattern containing wildcard
+//   * characters. The wildcard characters that are currently supported are '?' (to match any single
+//   * character) and '*' (to match zero or more characters).
+//   *
+//   * @param pattern the pattern that matching elements must match
+//   * @param caseSensitive `true` if a case sensitive match is to be performed
+//   * @return the pattern that was created
+//   */
+//  static SearchPattern createWildcardPattern(String pattern, bool caseSensitive) => new WildcardSearchPattern(pattern, caseSensitive);
+//}
+//
+//class SearchRunner_SearchEngineImpl_searchDeclarations implements SearchEngineImpl_SearchRunner {
+//  final SearchEngineImpl SearchEngineImpl_this;
+//
+//  String name;
+//
+//  SearchScope scope;
+//
+//  SearchFilter filter;
+//
+//  SearchRunner_SearchEngineImpl_searchDeclarations(this.SearchEngineImpl_this, this.name, this.scope, this.filter);
+//
+//  @override
+//  void performSearch(SearchListener listener) {
+//    SearchEngineImpl_this.searchDeclarations2(name, scope, filter, listener);
+//  }
+//}
+//
+//class SearchRunner_SearchEngineImpl_searchFunctionDeclarations implements SearchEngineImpl_SearchRunner {
+//  final SearchEngineImpl SearchEngineImpl_this;
+//
+//  SearchScope scope;
+//
+//  SearchPattern pattern;
+//
+//  SearchFilter filter;
+//
+//  SearchRunner_SearchEngineImpl_searchFunctionDeclarations(this.SearchEngineImpl_this, this.scope, this.pattern, this.filter);
+//
+//  @override
+//  void performSearch(SearchListener listener) {
+//    SearchEngineImpl_this.searchFunctionDeclarations2(scope, pattern, filter, listener);
+//  }
+//}
+//
+//class SearchRunner_SearchEngineImpl_searchQualifiedMemberReferences implements SearchEngineImpl_SearchRunner {
+//  final SearchEngineImpl SearchEngineImpl_this;
+//
+//  String name;
+//
+//  SearchScope scope;
+//
+//  SearchFilter filter;
+//
+//  SearchRunner_SearchEngineImpl_searchQualifiedMemberReferences(this.SearchEngineImpl_this, this.name, this.scope, this.filter);
+//
+//  @override
+//  void performSearch(SearchListener listener) {
+//    SearchEngineImpl_this.searchQualifiedMemberReferences2(name, scope, filter, listener);
+//  }
+//}
+//
+//class SearchRunner_SearchEngineImpl_searchReferences implements SearchEngineImpl_SearchRunner {
+//  final SearchEngineImpl SearchEngineImpl_this;
+//
+//  Element element;
+//
+//  SearchScope scope;
+//
+//  SearchFilter filter;
+//
+//  SearchRunner_SearchEngineImpl_searchReferences(this.SearchEngineImpl_this, this.element, this.scope, this.filter);
+//
+//  @override
+//  void performSearch(SearchListener listener) {
+//    SearchEngineImpl_this.searchReferences2(element, scope, filter, listener);
+//  }
+//}
+//
+//class SearchRunner_SearchEngineImpl_searchSubtypes implements SearchEngineImpl_SearchRunner {
+//  final SearchEngineImpl SearchEngineImpl_this;
+//
+//  ClassElement type;
+//
+//  SearchScope scope;
+//
+//  SearchFilter filter;
+//
+//  SearchRunner_SearchEngineImpl_searchSubtypes(this.SearchEngineImpl_this, this.type, this.scope, this.filter);
+//
+//  @override
+//  void performSearch(SearchListener listener) {
+//    SearchEngineImpl_this.searchSubtypes2(type, scope, filter, listener);
+//  }
+//}
+//
+//class SearchRunner_SearchEngineImpl_searchTypeDeclarations implements SearchEngineImpl_SearchRunner {
+//  final SearchEngineImpl SearchEngineImpl_this;
+//
+//  SearchScope scope;
+//
+//  SearchPattern pattern;
+//
+//  SearchFilter filter;
+//
+//  SearchRunner_SearchEngineImpl_searchTypeDeclarations(this.SearchEngineImpl_this, this.scope, this.pattern, this.filter);
+//
+//  @override
+//  void performSearch(SearchListener listener) {
+//    SearchEngineImpl_this.searchTypeDeclarations2(scope, pattern, filter, listener);
+//  }
+//}
+//
+//class SearchRunner_SearchEngineImpl_searchVariableDeclarations implements SearchEngineImpl_SearchRunner {
+//  final SearchEngineImpl SearchEngineImpl_this;
+//
+//  SearchScope scope;
+//
+//  SearchPattern pattern;
+//
+//  SearchFilter filter;
+//
+//  SearchRunner_SearchEngineImpl_searchVariableDeclarations(this.SearchEngineImpl_this, this.scope, this.pattern, this.filter);
+//
+//  @override
+//  void performSearch(SearchListener listener) {
+//    SearchEngineImpl_this.searchVariableDeclarations2(scope, pattern, filter, listener);
+//  }
+//}
+//
+///**
+// * The class <code>SearchScopeFactory</code> defines utility methods that can be used to create
+// * search scopes.
+// */
+//class SearchScopeFactory {
+//  /**
+//   * A search scope that encompasses everything in the "universe". Because it does not hold any
+//   * state there is no reason not to share a single instance.
+//   */
+//  static SearchScope _UNIVERSE_SCOPE = new UniverseSearchScope();
+//
+//  /**
+//   * Create a search scope that encompasses everything in the given library.
+//   *
+//   * @param library the library defining which elements are included in the scope
+//   * @return the search scope that was created
+//   */
+//  static SearchScope createLibraryScope(Iterable<LibraryElement> libraries) => new LibrarySearchScope.con1(libraries);
+//
+//  /**
+//   * Create a search scope that encompasses everything in the given libraries.
+//   *
+//   * @param libraries the libraries defining which elements are included in the scope
+//   * @return the search scope that was created
+//   */
+//  static SearchScope createLibraryScope2(List<LibraryElement> libraries) => new LibrarySearchScope.con2(libraries);
+//
+//  /**
+//   * Create a search scope that encompasses everything in the given library.
+//   *
+//   * @param library the library defining which elements are included in the scope
+//   * @return the search scope that was created
+//   */
+//  static SearchScope createLibraryScope3(LibraryElement library) => new LibrarySearchScope.con2([library]);
+//
+//  /**
+//   * Create a search scope that encompasses everything in the universe.
+//   *
+//   * @return the search scope that was created
+//   */
+//  static SearchScope createUniverseScope() => _UNIVERSE_SCOPE;
+//}
+//
+///**
+// * The [SearchScope] that encompasses everything in the universe.
+// */
+//class UniverseSearchScope implements SearchScope {
+//  @override
+//  bool encloses(Element element) => true;
+//}
+//
+///**
+// * Instances of the class <code>WildcardSearchPattern</code> implement a search pattern that matches
+// * elements whose name matches a pattern with wildcard characters. The wildcard characters that are
+// * currently supported are '?' (to match any single character) and '*' (to match zero or more
+// * characters).
+// */
+//class WildcardSearchPattern implements SearchPattern {
+//  /**
+//   * The pattern that matching elements must match.
+//   */
+//  List<int> _pattern;
+//
+//  /**
+//   * A flag indicating whether a case sensitive match is to be performed.
+//   */
+//  final bool _caseSensitive;
+//
+//  /**
+//   * Initialize a newly created search pattern to match elements whose names begin with the given
+//   * prefix.
+//   *
+//   * @param pattern the pattern that matching elements must match
+//   * @param caseSensitive `true` if a case sensitive match is to be performed
+//   */
+//  WildcardSearchPattern(String pattern, this._caseSensitive) {
+//    this._pattern = _caseSensitive ? pattern.toCharArray() : pattern.toLowerCase().toCharArray();
+//  }
+//
+//  @override
+//  MatchQuality matches(Element element) {
+//    if (element == null) {
+//      return null;
+//    }
+//    String name = element.displayName;
+//    if (name == null) {
+//      return null;
+//    }
+//    if (CharOperation.match(_pattern, name.toCharArray(), _caseSensitive)) {
+//      return MatchQuality.EXACT;
+//    }
+//    return null;
+//  }
+//}
+//
+///**
+// * Instances of the class <code>ScopedSearchListener</code> implement a search listener that
+// * delegates to another search listener after removing matches that are outside a given scope.
+// */
+//abstract class WrappedSearchListener implements SearchListener {
+//  /**
+//   * The listener being wrapped.
+//   */
+//  SearchListener _baseListener;
+//
+//  /**
+//   * Initialize a newly created search listener to wrap the given listener.
+//   *
+//   * @param listener the search listener being wrapped
+//   */
+//  WrappedSearchListener(SearchListener listener) {
+//    _baseListener = listener;
+//  }
+//
+//  @override
+//  void searchComplete() {
+//    _baseListener.searchComplete();
+//  }
+//
+//  /**
+//   * Pass the given match on to the wrapped listener.
+//   *
+//   * @param match the match to be propagated
+//   */
+//  void propagateMatch(SearchMatch match) {
+//    _baseListener.matchFound(match);
+//  }
+//}
diff --git a/pkg/analysis_services/pubspec.yaml b/pkg/analysis_services/pubspec.yaml
index 5bb7dca..66e9ac2 100644
--- a/pkg/analysis_services/pubspec.yaml
+++ b/pkg/analysis_services/pubspec.yaml
@@ -1,11 +1,12 @@
 name: analysis_services
-version: 0.0.3
+version: 0.1.0
 author: Dart Team <misc@dartlang.org>
 description: A set of services on top of Analysis Engine
 homepage: http://www.dartlang.org
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: '>=0.15.1 <0.16.0'
+  analyzer: '>=0.21.0 <1.0.0'
 dev_dependencies:
+  analysis_testing: '>=0.2.0 <1.0.0'
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_services/test/index/dart_index_contributor_test.dart b/pkg/analysis_services/test/index/dart_index_contributor_test.dart
new file mode 100644
index 0000000..3892d5d
--- /dev/null
+++ b/pkg/analysis_services/test/index/dart_index_contributor_test.dart
@@ -0,0 +1,1642 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.src.index.dart_index_contributor;
+
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/index_store.dart';
+import 'package:analysis_services/src/index/index_contributor.dart';
+import 'package:analysis_testing/abstract_context.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('DartUnitContributor', () {
+    runReflectiveTests(DartUnitContributorTest);
+  });
+}
+
+
+/**
+ * Returns `true` if the [actual] location the same properties as [expected].
+ */
+bool _equalsLocation(Location actual, ExpectedLocation expected) {
+  return _equalsLocationProperties(actual, expected.element, expected.offset,
+      expected.length);
+}
+
+
+/**
+ * Returns `true` if the [actual] location the expected properties.
+ */
+bool _equalsLocationProperties(Location actual, Element expectedElement,
+    int expectedOffset, int expectedLength) {
+  return expectedElement == actual.element && expectedOffset == actual.offset &&
+      expectedLength == actual.length;
+}
+
+
+bool _equalsRecordedRelation(RecordedRelation recordedRelation,
+    Element expectedElement, Relationship expectedRelationship,
+    ExpectedLocation expectedLocation) {
+  return expectedElement == recordedRelation.element && expectedRelationship ==
+      recordedRelation.relationship && (expectedLocation == null || _equalsLocation(
+      recordedRelation.location, expectedLocation));
+}
+
+
+int _getLeadingIdentifierLength(String search) {
+  int length = 0;
+  while (length < search.length) {
+    int c = search.codeUnitAt(length);
+    if (c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0)) {
+      length++;
+      continue;
+    }
+    if (c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0)) {
+      length++;
+      continue;
+    }
+    if (c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0)) {
+      length++;
+      continue;
+    }
+    break;
+  }
+  return length;
+}
+
+@ReflectiveTestCase()
+class DartUnitContributorTest extends AbstractContextTest {
+  IndexStore store = new MockIndexStore();
+  List<RecordedRelation> recordedRelations = <RecordedRelation>[];
+
+  bool verifyNoTestUnitErrors = true;
+
+  String testCode;
+  Source testSource;
+  CompilationUnit testUnit;
+  CompilationUnitElement testUnitElement;
+  LibraryElement testLibraryElement;
+
+  void setUp() {
+    super.setUp();
+    when(store.aboutToIndexDart(context, anyObject)).thenReturn(true);
+    when(store.recordRelationship(anyObject, anyObject, anyObject)).thenInvoke(
+        (Element element, Relationship relationship, Location location) {
+      recordedRelations.add(new RecordedRelation(element, relationship,
+          location));
+    });
+  }
+
+  void test_FieldElement_noAssignedType_notLHS() {
+    _indexTestUnit('''
+class A {
+  var myField;
+  main() {
+    print(myField);
+  }
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    FieldElement fieldElement = _findElement("myField");
+    PropertyAccessorElement getterElement = fieldElement.getter;
+    // verify
+    _assertRecordedRelation(getterElement,
+        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainElement,
+        'myField);'));
+  }
+
+  void test_definesClass() {
+    _indexTestUnit('class A {}');
+    // prepare elements
+    ClassElement classElement = _findElement("A");
+    // verify
+    _assertDefinesTopLevelElement(IndexConstants.DEFINES_CLASS,
+        _expectedLocation(classElement, 'A {}'));
+  }
+
+  void test_definesClassAlias() {
+    _indexTestUnit('''
+class Mix {}
+class MyClass = Object with Mix;''');
+    // prepare elements
+    Element classElement = _findElement("MyClass");
+    // verify
+    _assertDefinesTopLevelElement(IndexConstants.DEFINES_CLASS_ALIAS,
+        _expectedLocation(classElement, 'MyClass ='));
+  }
+
+  void test_definesFunction() {
+    _indexTestUnit('myFunction() {}');
+    // prepare elements
+    FunctionElement functionElement = _findElement("myFunction");
+    // verify
+    _assertDefinesTopLevelElement(IndexConstants.DEFINES_FUNCTION,
+        _expectedLocation(functionElement, 'myFunction() {}'));
+  }
+
+  void test_definesFunctionType() {
+    _indexTestUnit('typedef MyFunction(int p);');
+    // prepare elements
+    FunctionTypeAliasElement typeAliasElement = _findElement("MyFunction");
+    // verify
+    _assertDefinesTopLevelElement(IndexConstants.DEFINES_FUNCTION_TYPE,
+        _expectedLocation(typeAliasElement, 'MyFunction(int p);'));
+  }
+
+
+  void test_definesVariable() {
+    _indexTestUnit('var myVar = 42;');
+    // prepare elements
+    VariableElement varElement = _findElement("myVar");
+    // verify
+    _assertDefinesTopLevelElement(IndexConstants.DEFINES_VARIABLE,
+        _expectedLocation(varElement, 'myVar = 42;'));
+  }
+
+  void test_forIn() {
+    _indexTestUnit('''
+main() {
+  for (var v in []) {
+  }
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    VariableElement variableElement = _findElement("v");
+    // verify
+    _assertNoRecordedRelation(variableElement, IndexConstants.IS_READ_BY,
+        _expectedLocation(mainElement, 'v in []'));
+  }
+
+  void test_isDefinedBy_ConstructorElement() {
+    _indexTestUnit('''
+class A {
+  A() {}
+  A.foo() {}
+}''');
+    // prepare elements
+    ClassElement classA = _findElement("A");
+    ConstructorElement consA = _findNodeElementAtString("A()", (node) => node is
+        ConstructorDeclaration);
+    ConstructorElement consA_foo = _findNodeElementAtString("A.foo()", (node) =>
+        node is ConstructorDeclaration);
+    // verify
+    _assertRecordedRelation(consA, IndexConstants.IS_DEFINED_BY,
+        _expectedLocation(classA, '() {}'));
+    _assertRecordedRelation(consA_foo, IndexConstants.IS_DEFINED_BY,
+        _expectedLocation(classA, '.foo() {}', '.foo'.length));
+  }
+
+  void test_isDefinedBy_NameElement_method() {
+    _indexTestUnit('''
+class A {
+  m() {}
+}''');
+    // prepare elements
+    Element methodElement = _findElement("m");
+    Element nameElement = new NameElement("m");
+    // verify
+    _assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY,
+        _expectedLocation(methodElement, 'm() {}'));
+  }
+
+
+  void test_isDefinedBy_NameElement_operator() {
+    _indexTestUnit('''
+class A {
+  operator +(o) {}
+}''');
+    // prepare elements
+    Element methodElement = _findElement("+");
+    Element nameElement = new NameElement("+");
+    // verify
+    _assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY,
+        _expectedLocation(methodElement, '+(o) {}', 1));
+  }
+
+  void test_isExtendedBy_ClassDeclaration() {
+    _indexTestUnit('''
+class A {} // 1
+class B extends A {} // 2
+''');
+    // prepare elements
+    ClassElement classElementA = _findElement("A");
+    ClassElement classElementB = _findElement("B");
+    // verify
+    _assertRecordedRelation(classElementA, IndexConstants.IS_EXTENDED_BY,
+        _expectedLocation(classElementB, 'A {} // 2'));
+  }
+
+  void test_isExtendedBy_ClassDeclaration_Object() {
+    _indexTestUnit('''
+class A {} // 1
+''');
+    // prepare elements
+    ClassElement classElementA = _findElement("A");
+    ClassElement classElementObject = classElementA.supertype.element;
+    // verify
+    _assertRecordedRelation(classElementObject, IndexConstants.IS_EXTENDED_BY,
+        _expectedLocation(classElementA, 'A {}', 0));
+  }
+
+  void test_isExtendedBy_ClassTypeAlias() {
+    _indexTestUnit('''
+class A {} // 1
+class B {} // 2
+class C = A with B; // 3
+''');
+    // prepare elements
+    ClassElement classElementA = _findElement("A");
+    ClassElement classElementC = _findElement("C");
+    // verify
+    _assertRecordedRelation(classElementA, IndexConstants.IS_EXTENDED_BY,
+        _expectedLocation(classElementC, 'A with'));
+  }
+
+  void test_isImplementedBy_ClassDeclaration() {
+    _indexTestUnit('''
+class A {} // 1
+class B implements A {} // 2
+''');
+    // prepare elements
+    ClassElement classElementA = _findElement("A");
+    ClassElement classElementB = _findElement("B");
+    // verify
+    _assertRecordedRelation(classElementA, IndexConstants.IS_IMPLEMENTED_BY,
+        _expectedLocation(classElementB, 'A {} // 2'));
+  }
+
+  void test_isImplementedBy_ClassTypeAlias() {
+    _indexTestUnit('''
+class A {} // 1
+class B {} // 2
+class C = Object with A implements B; // 3
+''');
+    // prepare elements
+    ClassElement classElementB = _findElement("B");
+    ClassElement classElementC = _findElement("C");
+    // verify
+    _assertRecordedRelation(classElementB, IndexConstants.IS_IMPLEMENTED_BY,
+        _expectedLocation(classElementC, 'B; // 3'));
+  }
+
+
+  void test_isInvokedByQualified_FieldElement() {
+    _indexTestUnit('''
+class A {
+  var field;
+  main() {
+    this.field();
+  }
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    FieldElement fieldElement = _findElement("field");
+    PropertyAccessorElement getterElement = fieldElement.getter;
+    // verify
+    _assertRecordedRelation(getterElement,
+        IndexConstants.IS_INVOKED_BY_QUALIFIED, _expectedLocation(mainElement,
+        'field();'));
+  }
+
+
+  void test_isInvokedByQualified_MethodElement() {
+    _indexTestUnit('''
+class A {
+  foo() {}
+  main() {
+    this.foo();
+  }
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element methodElement = _findElement("foo");
+    // verify
+    var location = _expectedLocation(mainElement, 'foo();');
+    _assertRecordedRelation(methodElement,
+        IndexConstants.IS_INVOKED_BY_QUALIFIED, location);
+    _assertNoRecordedRelation(methodElement,
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+  }
+
+  void test_isInvokedByQualified_MethodElement_propagatedType() {
+    _indexTestUnit('''
+class A {
+  foo() {}
+}
+main() {
+  var a = new A();
+  a.foo();
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element methodElement = _findElement("foo");
+    // verify
+    _assertRecordedRelation(methodElement,
+        IndexConstants.IS_INVOKED_BY_QUALIFIED, _expectedLocation(mainElement,
+        'foo();'));
+  }
+
+  void test_isInvokedByUnqualified_MethodElement() {
+    _indexTestUnit('''
+class A {
+  foo() {}
+  main() {
+    foo();
+  }
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element methodElement = _findElement("foo");
+    // verify
+    _assertRecordedRelation(methodElement,
+        IndexConstants.IS_INVOKED_BY_UNQUALIFIED, _expectedLocation(mainElement,
+        'foo();'));
+  }
+
+  void test_isInvokedBy_FunctionElement() {
+    _indexTestUnit('''
+foo() {}
+main() {
+  foo();
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    FunctionElement functionElement = _findElement("foo");
+    // verify
+    _assertRecordedRelation(functionElement, IndexConstants.IS_INVOKED_BY,
+        _expectedLocation(mainElement, 'foo();'));
+  }
+
+  void test_isInvokedBy_LocalVariableElement() {
+    _indexTestUnit('''
+main() {
+  var v;
+  v();
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element element = _findElement("v");
+    // verify
+    _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY,
+        _expectedLocation(mainElement, 'v();'));
+  }
+
+  void test_isInvokedBy_ParameterElement() {
+    _indexTestUnit('''
+main(p()) {
+  p();
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element element = _findElement("p");
+    // verify
+    _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY,
+        _expectedLocation(mainElement, 'p();'));
+  }
+
+  void test_isMixedInBy_ClassDeclaration() {
+    _indexTestUnit('''
+class A {} // 1
+class B extends Object with A {} // 2
+''');
+    // prepare elements
+    ClassElement classElementA = _findElement("A");
+    ClassElement classElementB = _findElement("B");
+    // verify
+    _assertRecordedRelation(classElementA, IndexConstants.IS_MIXED_IN_BY,
+        _expectedLocation(classElementB, 'A {} // 2'));
+  }
+
+  void test_isMixedInBy_ClassTypeAlias() {
+    _indexTestUnit('''
+class A {} // 1
+class B = Object with A; // 2
+''');
+    // prepare elements
+    ClassElement classElementA = _findElement("A");
+    ClassElement classElementB = _findElement("B");
+    // verify
+    _assertRecordedRelation(classElementA, IndexConstants.IS_MIXED_IN_BY,
+        _expectedLocation(classElementB, 'A; // 2'));
+  }
+
+  void test_isReadBy_ParameterElement() {
+    _indexTestUnit('''
+main(var p) {
+  print(p);
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element parameterElement = _findElement("p");
+    // verify
+    _assertRecordedRelation(parameterElement, IndexConstants.IS_READ_BY,
+        _expectedLocation(mainElement, 'p);'));
+  }
+
+  void test_isReadBy_VariableElement() {
+    _indexTestUnit('''
+main() {
+  var v = 0;
+  print(v);
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element variableElement = _findElement("v");
+    // verify
+    _assertRecordedRelation(variableElement, IndexConstants.IS_READ_BY,
+        _expectedLocation(mainElement, 'v);'));
+  }
+
+  void test_isReadWrittenBy_ParameterElement() {
+    _indexTestUnit('''
+main(int p) {
+  p += 1;
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element parameterElement = _findElement("p");
+    // verify
+    _assertRecordedRelation(parameterElement, IndexConstants.IS_READ_WRITTEN_BY,
+        _expectedLocation(mainElement, 'p += 1'));
+  }
+
+  void test_isReadWrittenBy_VariableElement() {
+    _indexTestUnit('''
+main() {
+  var v = 0;
+  v += 1;
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element variableElement = _findElement("v");
+    // verify
+    _assertRecordedRelation(variableElement, IndexConstants.IS_READ_WRITTEN_BY,
+        _expectedLocation(mainElement, 'v += 1'));
+  }
+
+  void test_isReferencedByQualifiedResolved_NameElement_field() {
+    _indexTestUnit('''
+class A {
+  int field;
+}
+main(A a) {
+  print(a.field);
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    Element nameElement = new NameElement('field');
+    // verify
+    _assertRecordedRelation(nameElement,
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
+        mainElement, 'field);'));
+  }
+
+  void test_isReferencedByQualifiedResolved_NameElement_method() {
+    _indexTestUnit('''
+class A {
+  method() {}
+}
+main(A a) {
+  a.method();
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    Element nameElement = new NameElement('method');
+    // verify
+    _assertRecordedRelation(nameElement,
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
+        mainElement, 'method();'));
+  }
+
+  void test_isReferencedByQualifiedResolved_NameElement_operator() {
+    _indexTestUnit('''
+class A {
+  operator +(o) {}
+  operator -(o) {}
+  operator ~() {}
+  operator ==(o) {}
+}
+main(A a) {
+  a + 5;
+  a += 5;
+  a == 5;
+  ++a;
+  --a;
+  ~a;
+  a++;
+  a--;
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    // binary
+    _assertRecordedRelation(new NameElement('+'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
+        mainElement, '+ 5', '+'.length));
+    _assertRecordedRelation(new NameElement('+'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
+        mainElement, '+= 5', '+='.length));
+    _assertRecordedRelation(new NameElement('=='),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
+        mainElement, '== 5', '=='.length));
+    // prefix
+    _assertRecordedRelation(new NameElement('+'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
+        mainElement, '++a', '++'.length));
+    _assertRecordedRelation(new NameElement('-'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
+        mainElement, '--a', '--'.length));
+    _assertRecordedRelation(new NameElement('~'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
+        mainElement, '~a', '~'.length));
+    // postfix
+    _assertRecordedRelation(new NameElement('+'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
+        mainElement, '++;', '++'.length));
+    _assertRecordedRelation(new NameElement('-'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
+        mainElement, '--;', '--'.length));
+  }
+
+  void test_isReferencedByQualifiedUnresolved_NameElement_field() {
+    _indexTestUnit('''
+class A {
+  int field;
+}
+main(var a) {
+  print(a.field);
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    FieldElement fieldElement = _findElement('field');
+    Element nameElement = new NameElement('field');
+    // verify
+    _assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY,
+        _expectedLocation(fieldElement, 'field;'));
+    _assertRecordedRelation(nameElement,
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
+        mainElement, 'field);'));
+  }
+
+  void test_isReferencedByQualifiedUnresolved_NameElement_method() {
+    _indexTestUnit('''
+class A {
+  method() {}
+}
+main(var a) {
+  a.method();
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    MethodElement methodElement = _findElement('method');
+    Element nameElement = new NameElement('method');
+    // verify
+    _assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY,
+        _expectedLocation(methodElement, 'method() {}'));
+    _assertRecordedRelation(nameElement,
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
+        mainElement, 'method();'));
+  }
+
+  void test_isReferencedByQualifiedUnresolved_NameElement_operator() {
+    _indexTestUnit('''
+class A {
+  operator +(o) {}
+  operator -(o) {}
+  operator ~() {}
+  operator ==(o) {}
+}
+main(a) {
+  a + 5;
+  a += 5;
+  a == 5;
+  ++a;
+  --a;
+  ~a;
+  a++;
+  a--;
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    // binary
+    _assertRecordedRelation(new NameElement('+'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
+        mainElement, '+ 5', '+'.length));
+    _assertRecordedRelation(new NameElement('+'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
+        mainElement, '+= 5', '+='.length));
+    _assertRecordedRelation(new NameElement('=='),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
+        mainElement, '== 5', '=='.length));
+    // prefix
+    _assertRecordedRelation(new NameElement('+'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
+        mainElement, '++a', '++'.length));
+    _assertRecordedRelation(new NameElement('-'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
+        mainElement, '--a', '--'.length));
+    _assertRecordedRelation(new NameElement('~'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
+        mainElement, '~a', '~'.length));
+    // postfix
+    _assertRecordedRelation(new NameElement('+'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
+        mainElement, '++;', '++'.length));
+    _assertRecordedRelation(new NameElement('-'),
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
+        mainElement, '--;', '--'.length));
+  }
+
+  void test_isReferencedByQualified_ConstructorElement() {
+    _indexTestUnit('''
+class A implements B {
+  A() {}
+  A.foo() {}
+}
+class B extends A {
+  B() : super(); // marker-1
+  B.foo() : super.foo(); // marker-2
+  factory B.bar() = A.foo; // marker-3
+}
+main() {
+  new A(); // marker-main-1
+  new A.foo(); // marker-main-2
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    var isConstructor = (node) => node is ConstructorDeclaration;
+    ConstructorElement consA = _findNodeElementAtString("A()", isConstructor);
+    ConstructorElement consA_foo = _findNodeElementAtString("A.foo()",
+        isConstructor);
+    ConstructorElement consB = _findNodeElementAtString("B()", isConstructor);
+    ConstructorElement consB_foo = _findNodeElementAtString("B.foo()",
+        isConstructor);
+    ConstructorElement consB_bar = _findNodeElementAtString("B.bar()",
+        isConstructor);
+    // A()
+    _assertRecordedRelation(consA, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(consB, '(); // marker-1', 0));
+    _assertRecordedRelation(consA, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, '(); // marker-main-1', 0));
+    // A.foo()
+    _assertRecordedRelation(consA_foo, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(consB_foo, '.foo(); // marker-2', '.foo'.length));
+    _assertRecordedRelation(consA_foo, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(consB_bar, '.foo; // marker-3', '.foo'.length));
+    _assertRecordedRelation(consA_foo, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, '.foo(); // marker-main-2', '.foo'.length));
+  }
+
+  void test_isReferencedByQualified_ConstructorElement_classTypeAlias() {
+    _indexTestUnit('''
+class M {}
+class A implements B {
+  A() {}
+  A.named() {}
+}
+class B = A with M;
+main() {
+  new B(); // marker-main-1
+  new B.named(); // marker-main-2
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    var isConstructor = (node) => node is ConstructorDeclaration;
+    ConstructorElement consA = _findNodeElementAtString("A()", isConstructor);
+    ConstructorElement consA_named = _findNodeElementAtString("A.named()",
+        isConstructor);
+    // verify
+    _assertRecordedRelation(consA, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, '(); // marker-main-1', 0));
+    _assertRecordedRelation(consA_named, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, '.named(); // marker-main-2', '.named'.length));
+  }
+
+  void test_isReferencedByQualified_FieldElement() {
+    _indexTestUnit('''
+class A {
+  static var field;
+}
+main() {
+  A.field = 1;
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    FieldElement fieldElement = _findElement('field');
+    PropertyAccessorElement setterElement = fieldElement.setter;
+    // verify
+    _assertRecordedRelation(setterElement,
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED, _expectedLocation(mainElement,
+        'field = 1'));
+  }
+
+  void test_isReferencedByQualified_MethodElement() {
+    _indexTestUnit('''
+class A {
+  foo() {}
+  main() {
+    print(this.foo);
+  }
+}
+''');
+    // prepare elements
+    Element fooElement = _findElement('foo');
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(fooElement,
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED, _expectedLocation(mainElement,
+        'foo);'));
+  }
+
+  void test_isReferencedByQualified_MethodElement_operator_binary() {
+    _indexTestUnit('''
+class A {
+  operator +(other) => this;
+}
+main(A a) {
+  print(a + 1);
+  a += 2;
+  ++a;
+  a++;
+}
+''');
+    // prepare elements
+    Element element = _findElement('+');
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
+        _expectedLocation(mainElement, '+ 1', "+".length));
+    _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
+        _expectedLocation(mainElement, '+= 2', "+=".length));
+    _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
+        _expectedLocation(mainElement, '++a;', "++".length));
+    _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
+        _expectedLocation(mainElement, '++;', "++".length));
+  }
+
+  void test_isReferencedByQualified_MethodElement_operator_index() {
+    _indexTestUnit('''
+class A {
+  operator [](i) => null;
+  operator []=(i, v) {}
+}
+main(A a) {
+  print(a[0]);
+  a[1] = 42;
+}
+''');
+    // prepare elements
+    MethodElement readElement = _findElement("[]");
+    MethodElement writeElement = _findElement("[]=");
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(readElement, IndexConstants.IS_INVOKED_BY_QUALIFIED,
+        _expectedLocation(mainElement, '[0]', "[".length));
+    _assertRecordedRelation(writeElement,
+        IndexConstants.IS_INVOKED_BY_QUALIFIED, _expectedLocation(mainElement, '[1] =',
+        "[".length));
+  }
+
+  void test_isReferencedByQualified_MethodElement_operator_prefix() {
+    _indexTestUnit('''
+class A {
+  A operator ~() => this;
+}
+main(A a) {
+  print(~a);
+}
+''');
+    // prepare elements
+    MethodElement element = _findElement("~");
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
+        _expectedLocation(mainElement, '~a', "~".length));
+  }
+
+  void test_isReferencedByQualified_PropertyAccessorElement_method_getter() {
+    _indexTestUnit('''
+class A {
+  get foo => 42;
+  main() {
+    print(this.foo);
+  }
+}
+''');
+    // prepare elements
+    PropertyAccessorElement element = _findNodeElementAtString('foo =>');
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
+        _expectedLocation(mainElement, 'foo);'));
+    _assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, null);
+  }
+
+  void test_isReferencedByQualified_PropertyAccessorElement_method_setter() {
+    _indexTestUnit('''
+class A {
+  set foo(x) {}
+  main() {
+    this.foo = 42;
+  }
+}
+''');
+    // prepare elements
+    PropertyAccessorElement element = _findNodeElementAtString('foo(x)');
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
+        _expectedLocation(mainElement, 'foo = 42;'));
+    _assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, null);
+  }
+
+  void test_isReferencedByQualified_PropertyAccessorElement_topLevelField() {
+    addSource('/lib.dart', '''
+library lib;
+var myVar;
+''');
+    _indexTestUnit('''
+import 'lib.dart' as pref;
+main() {
+  pref.myVar = 1;
+  print(pref.myVar);
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    ImportElement importElement = testLibraryElement.imports[0];
+    CompilationUnitElement impUnit =
+        importElement.importedLibrary.definingCompilationUnit;
+    TopLevelVariableElement myVar = impUnit.topLevelVariables[0];
+    PropertyAccessorElement getter = myVar.getter;
+    PropertyAccessorElement setter = myVar.setter;
+    // verify
+    _assertRecordedRelation(setter, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
+        _expectedLocation(mainElement, 'myVar = 1'));
+    _assertRecordedRelation(getter, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
+        _expectedLocation(mainElement, 'myVar);'));
+  }
+
+  void test_isReferencedByUnqualified_FieldElement() {
+    _indexTestUnit('''
+class A {
+  var field;
+  main() {
+    field = 5;
+    print(field);
+  }
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    FieldElement fieldElement = _findElement("field");
+    PropertyAccessorElement getter = fieldElement.getter;
+    PropertyAccessorElement setter = fieldElement.setter;
+    // verify
+    _assertRecordedRelation(setter, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
+        _expectedLocation(mainElement, 'field = 5'));
+    _assertRecordedRelation(getter, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
+        _expectedLocation(mainElement, 'field);'));
+  }
+
+  void test_isReferencedByUnqualified_MethodElement() {
+    _indexTestUnit('''
+class A {
+  method() {}
+  main() {
+    print(method);
+  }
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    MethodElement methodElement = _findElement("method");
+    // verify
+    _assertRecordedRelation(methodElement,
+        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainElement,
+        'method);'));
+    _assertNoRecordedRelation(methodElement, IndexConstants.IS_REFERENCED_BY,
+        null);
+  }
+
+  void test_isReferencedByUnqualified_TopLevelVariableElement() {
+    _indexTestUnit('''
+var topVariable;
+main() {
+  topVariable = 5;
+  print(topVariable);
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    TopLevelVariableElement variableElement = _findElement("topVariable");
+    // verify
+    _assertRecordedRelation(variableElement.setter,
+        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainElement,
+        'topVariable = 5'));
+    _assertRecordedRelation(variableElement.getter,
+        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainElement,
+        'topVariable);'));
+  }
+
+  void test_isReferencedBy_ClassElement() {
+    _indexTestUnit('''
+class A {
+  static var field;
+}
+main(A p) {
+  A v;
+  new A(); // 2
+  A.field = 1;
+  print(A.field); // 3
+}
+''');
+    // prepare elements
+    ClassElement aElement = _findElement("A");
+    Element mainElement = _findElement("main");
+    ParameterElement pElement = _findElement("p");
+    VariableElement vElement = _findElement("v");
+    // verify
+    _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(pElement, 'A p) {'));
+    _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(vElement, 'A v;'));
+    _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'A(); // 2'));
+    _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'A.field = 1;'));
+    _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'A.field); // 3'));
+  }
+
+  void test_isReferencedBy_ClassTypeAlias() {
+    _indexTestUnit('''
+class A {}
+class B = Object with A;
+main(B p) {
+  B v;
+}
+''');
+    // prepare elements
+    ClassElement bElement = _findElement("B");
+    ParameterElement pElement = _findElement("p");
+    VariableElement vElement = _findElement("v");
+    // verify
+    _assertRecordedRelation(bElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(pElement, 'B p) {'));
+    _assertRecordedRelation(bElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(vElement, 'B v;'));
+  }
+
+  void test_isReferencedBy_CompilationUnitElement() {
+    addSource('/my_unit.dart', 'part of my_lib;');
+    _indexTestUnit('''
+library my_lib;
+part 'my_unit.dart';
+''');
+    // prepare elements
+    CompilationUnitElement myUnitElement = testLibraryElement.parts[0];
+    // verify
+    _assertRecordedRelation(myUnitElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(testUnitElement, "'my_unit.dart';", "'my_unit.dart'".length));
+  }
+
+  void test_isReferencedBy_ConstructorFieldInitializer() {
+    _indexTestUnit('''
+class A {
+  int field;
+  A() : field = 5;
+}
+''');
+    // prepare elements
+    ConstructorElement constructorElement = _findNodeElementAtString("A()",
+        (node) => node is ConstructorDeclaration);
+    FieldElement fieldElement = _findElement("field");
+    // verify
+    _assertRecordedRelation(fieldElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(constructorElement, 'field = 5'));
+  }
+
+  void test_isReferencedBy_FieldFormalParameterElement() {
+    _indexTestUnit('''
+class A {
+  int field;
+  A(this.field);
+}
+''');
+    // prepare elements
+    FieldElement fieldElement = _findElement("field");
+    Element fieldParameterElement = _findNodeElementAtString("field);");
+    // verify
+    _assertRecordedRelation(fieldElement,
+        IndexConstants.IS_REFERENCED_BY_QUALIFIED, _expectedLocation(
+        fieldParameterElement, 'field);'));
+  }
+
+  void test_isReferencedBy_FunctionElement() {
+    _indexTestUnit('''
+foo() {}
+main() {
+  print(foo);
+  print(foo());
+}
+''');
+    // prepare elements
+    FunctionElement element = _findElement("foo");
+    Element mainElement = _findElement("main");
+    // "referenced" here
+    _assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'foo);'));
+    // only "invoked", but not "referenced"
+    {
+      _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY,
+          _expectedLocation(mainElement, 'foo());'));
+      _assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY,
+          _expectedLocation(mainElement, 'foo());'));
+    }
+  }
+
+  void test_isReferencedBy_FunctionTypeAliasElement() {
+    _indexTestUnit('''
+typedef A();
+main(A p) {
+}
+''');
+    // prepare elements
+    Element aElement = _findElement('A');
+    Element pElement = _findElement('p');
+    // verify
+    _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(pElement, 'A p) {'));
+  }
+
+  void test_isReferencedBy_ImportElement_noPrefix() {
+    addSource('/lib.dart', '''
+library lib;
+var myVar;
+myFunction() {}
+myToHide() {}
+''');
+    _indexTestUnit('''
+import 'lib.dart' show myVar, myFunction hide myToHide;
+main() {
+  myVar = 1;
+  myFunction();
+  print(0);
+}
+''');
+    // prepare elements
+    ImportElement importElement = testLibraryElement.imports[0];
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'myVar = 1;', 0));
+    _assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'myFunction();', 0));
+    _assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'print(0);', 0));
+    // no references from import combinators
+    _assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(testUnitElement, 'myVar, ', 0));
+    _assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(testUnitElement, 'myFunction hide', 0));
+    _assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(testUnitElement, 'myToHide;', 0));
+  }
+
+  void test_isReferencedBy_ImportElement_withPrefix() {
+    addSource('/libA.dart', '''
+library libA;
+var myVar;
+''');
+    addSource('/libB.dart', '''
+library libB;
+class MyClass {}
+''');
+    _indexTestUnit('''
+import 'libA.dart' as pref;
+import 'libB.dart' as pref;
+main() {
+  pref.myVar = 1;
+  new pref.MyClass();
+}
+''');
+    // prepare elements
+    ImportElement importElementA = testLibraryElement.imports[0];
+    ImportElement importElementB = testLibraryElement.imports[1];
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(importElementA, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'pref.myVar = 1;', 'pref.'.length));
+    _assertRecordedRelation(importElementB, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'pref.MyClass();', 'pref.'.length));
+  }
+
+  void test_isReferencedBy_ImportElement_withPrefix_combinators() {
+    addSource('/lib.dart', '''
+library lib;
+class A {}
+class B {}
+''');
+    _indexTestUnit('''
+import 'lib.dart' as pref show A;
+import 'lib.dart' as pref show B;
+import 'lib.dart';
+import 'lib.dart' as otherPrefix;
+main() {
+  new pref.A();
+  new pref.B();
+}
+''');
+    // prepare elements
+    ImportElement importElementA = testLibraryElement.imports[0];
+    ImportElement importElementB = testLibraryElement.imports[1];
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(importElementA, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'pref.A();', 'pref.'.length));
+    _assertRecordedRelation(importElementB, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'pref.B();', 'pref.'.length));
+  }
+
+  void test_isReferencedBy_ImportElement_withPrefix_invocation() {
+    addSource('/lib.dart', '''
+library lib;
+myFunc() {}
+''');
+    _indexTestUnit('''
+import 'lib.dart' as pref;
+main() {
+  pref.myFunc();
+}
+''');
+    // prepare elements
+    ImportElement importElement = testLibraryElement.imports[0];
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'pref.myFunc();', 'pref.'.length));
+  }
+
+  void test_isReferencedBy_ImportElement_withPrefix_oneCandidate() {
+    addSource('/lib.dart', '''
+library lib;
+class A {}
+class B {}
+''');
+    _indexTestUnit('''
+import 'lib.dart' as pref show A;
+main() {
+  new pref.A();
+}
+''');
+    // prepare elements
+    ImportElement importElement = testLibraryElement.imports[0];
+    Element mainElement = _findElement('main');
+    // verify
+    _assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'pref.A();', 'pref.'.length));
+  }
+
+  void test_isReferencedBy_ImportElement_withPrefix_unresolvedElement() {
+    verifyNoTestUnitErrors = false;
+    addSource('/lib.dart', '''
+library lib;
+''');
+    _indexTestUnit('''
+import 'lib.dart' as pref;
+main() {
+  pref.myVar = 1;
+}
+''');
+  }
+
+  void test_isReferencedBy_ImportElement_withPrefix_wrongInvocation() {
+    verifyNoTestUnitErrors = false;
+    _indexTestUnit('''
+import 'dart:math' as m;
+main() {
+  m();
+}''');
+  }
+
+  void test_isReferencedBy_ImportElement_withPrefix_wrongPrefixedIdentifier() {
+    verifyNoTestUnitErrors = false;
+    _indexTestUnit('''
+import 'dart:math' as m;
+main() {
+  x.m;
+}
+''');
+  }
+
+  void test_isReferencedBy_LabelElement() {
+    _indexTestUnit('''
+main() {
+  L: while (true) {
+    break L;
+  }
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    Element element = _findElement('L');
+    // verify
+    _assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'L;'));
+  }
+
+  void test_isReferencedBy_LibraryElement_export() {
+    addSource('/lib.dart', '''
+library lib;
+''');
+    _indexTestUnit('''
+export 'lib.dart';
+''');
+    // prepare elements
+    LibraryElement libElement = testLibraryElement.exportedLibraries[0];
+    CompilationUnitElement libUnitElement = libElement.definingCompilationUnit;
+    // verify
+    _assertRecordedRelation(libUnitElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(testUnitElement, "'lib.dart'", "'lib.dart'".length));
+  }
+
+  void test_isReferencedBy_LibraryElement_import() {
+    addSource('/lib.dart', '''
+library lib;
+''');
+    _indexTestUnit('''
+import 'lib.dart';
+''');
+    // prepare elements
+    LibraryElement libElement = testLibraryElement.imports[0].importedLibrary;
+    CompilationUnitElement libUnitElement = libElement.definingCompilationUnit;
+    // verify
+    _assertRecordedRelation(libUnitElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(testUnitElement, "'lib.dart'", "'lib.dart'".length));
+  }
+
+  void test_isReferencedBy_ParameterElement() {
+    _indexTestUnit('''
+foo({var p}) {}
+main() {
+  foo(p: 1);
+}
+''');
+    // prepare elements
+    Element mainElement = _findElement('main');
+    Element element = _findElement('p');
+    // verify
+    _assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'p: 1'));
+  }
+
+  void test_isReferencedBy_TypeParameterElement() {
+    _indexTestUnit('''
+class A<T> {
+  T f;
+  foo(T p) {
+    T v;
+  }
+}
+''');
+    // prepare elements
+    Element typeParameterElement = _findElement('T');
+    Element fieldElement = _findElement('f');
+    Element parameterElement = _findElement('p');
+    Element variableElement = _findElement('v');
+    // verify
+    _assertRecordedRelation(typeParameterElement,
+        IndexConstants.IS_REFERENCED_BY, _expectedLocation(fieldElement, 'T f'));
+    _assertRecordedRelation(typeParameterElement,
+        IndexConstants.IS_REFERENCED_BY, _expectedLocation(parameterElement, 'T p'));
+    _assertRecordedRelation(typeParameterElement,
+        IndexConstants.IS_REFERENCED_BY, _expectedLocation(variableElement, 'T v'));
+  }
+
+  /**
+   * There was a bug in the AST structure, when single [Comment] was cloned and
+   * assigned to both [FieldDeclaration] and [VariableDeclaration].
+   *
+   * This caused duplicate indexing.
+   * Here we test that the problem is fixed one way or another.
+   */
+  void test_isReferencedBy_identifierInComment() {
+    _indexTestUnit('''
+class A {}
+/// [A] text
+var myVariable = null;
+''');
+    // prepare elements
+    Element aElement = _findElement('A');
+    Element variableElement = _findElement('myVariable');
+    // verify
+    _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(testUnitElement, 'A] text'));
+    _assertNoRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(variableElement, 'A] text'));
+  }
+
+  void test_isReferencedBy_libraryName() {
+    Source libSource = addSource('/lib.dart', '''
+library lib;
+part 'test.dart';
+''');
+    testCode = 'part of lib;';
+    testSource = addSource('/test.dart', testCode);
+    testUnit = resolveDartUnit(testSource, libSource);
+    testUnitElement = testUnit.element;
+    testLibraryElement = testUnitElement.library;
+    indexDartUnit(store, context, testUnit);
+    // verify
+    _assertRecordedRelation(testLibraryElement, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(testUnitElement, "lib;"));
+  }
+
+  void test_isReferencedBy_typeInVariableList() {
+    _indexTestUnit('''
+class A {}
+A myVariable = null;
+''');
+    // prepare elements
+    Element classElementA = _findElement('A');
+    Element variableElement = _findElement('myVariable');
+    // verify
+    _assertRecordedRelation(classElementA, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(variableElement, 'A myVariable'));
+  }
+
+  void test_isWrittenBy_ParameterElement() {
+    _indexTestUnit('''
+main(var p) {
+  p = 1;
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    ParameterElement pElement = _findElement("p");
+    // verify
+    _assertRecordedRelation(pElement, IndexConstants.IS_WRITTEN_BY,
+        _expectedLocation(mainElement, 'p = 1'));
+  }
+
+  void test_isWrittenBy_VariableElement() {
+    _indexTestUnit('''
+main() {
+  var v = 0;
+  v = 1;
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    LocalVariableElement vElement = _findElement("v");
+    // verify
+    _assertRecordedRelation(vElement, IndexConstants.IS_WRITTEN_BY,
+        _expectedLocation(mainElement, 'v = 1'));
+  }
+
+  void test_nameIsInvokedBy() {
+    _indexTestUnit('''
+class A {
+  test(x) {}
+}
+main(A a, p) {
+  a.test(1);
+  p.test(2);
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element nameElement = new NameElement('test');
+    // verify
+    _assertRecordedRelation(nameElement,
+        IndexConstants.NAME_IS_INVOKED_BY_RESOLVED, _expectedLocation(mainElement,
+        'test(1)'));
+    _assertRecordedRelation(nameElement,
+        IndexConstants.NAME_IS_INVOKED_BY_UNRESOLVED, _expectedLocation(mainElement,
+        'test(2)'));
+    _assertNoRecordedRelation(nameElement,
+        IndexConstants.NAME_IS_READ_BY_UNRESOLVED, _expectedLocation(mainElement,
+        'test(2)'));
+  }
+
+  void test_nameIsReadBy() {
+    _indexTestUnit('''
+class A {
+  var test;
+}
+main(A a, p) {
+  print(a.test); // a
+  print(p.test); // p
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element nameElement = new NameElement('test');
+    // verify
+    _assertRecordedRelation(nameElement,
+        IndexConstants.NAME_IS_READ_BY_RESOLVED, _expectedLocation(mainElement,
+        'test); // a'));
+    _assertRecordedRelation(nameElement,
+        IndexConstants.NAME_IS_READ_BY_UNRESOLVED, _expectedLocation(mainElement,
+        'test); // p'));
+  }
+
+  void test_nameIsReadWrittenBy() {
+    _indexTestUnit('''
+class A {
+  var test;
+}
+main(A a, p) {
+  a.test += 1;
+  p.test += 2;
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element nameElement = new NameElement('test');
+    // verify
+    _assertRecordedRelation(nameElement,
+        IndexConstants.NAME_IS_READ_WRITTEN_BY_RESOLVED, _expectedLocation(mainElement,
+        'test += 1'));
+    _assertRecordedRelation(nameElement,
+        IndexConstants.NAME_IS_READ_WRITTEN_BY_UNRESOLVED, _expectedLocation(
+        mainElement, 'test += 2'));
+  }
+
+  void test_nameIsWrittenBy() {
+    _indexTestUnit('''
+class A {
+  var test;
+}
+main(A a, p) {
+  a.test = 1;
+  p.test = 2;
+}''');
+    // prepare elements
+    Element mainElement = _findElement("main");
+    Element nameElement = new NameElement('test');
+    // verify
+    _assertRecordedRelation(nameElement,
+        IndexConstants.NAME_IS_WRITTEN_BY_RESOLVED, _expectedLocation(mainElement,
+        'test = 1'));
+    _assertRecordedRelation(nameElement,
+        IndexConstants.NAME_IS_WRITTEN_BY_UNRESOLVED, _expectedLocation(mainElement,
+        'test = 2'));
+  }
+
+  void test_nullUnit() {
+    indexDartUnit(store, context, null);
+  }
+
+  void test_nullUnitElement() {
+    CompilationUnit unit = new CompilationUnit(null, null, [], [], null);
+    indexDartUnit(store, context, unit);
+  }
+
+  void _assertDefinesTopLevelElement(Relationship relationship,
+      ExpectedLocation expectedLocation) {
+    _assertRecordedRelation(testLibraryElement, relationship, expectedLocation);
+    _assertRecordedRelation(UniverseElement.INSTANCE, relationship,
+        expectedLocation);
+  }
+
+  void _assertNoErrorsInSource() {
+    List<AnalysisError> errors = context.getErrors(testSource).errors;
+    expect(errors, isEmpty);
+  }
+
+  /**
+   * Asserts that [recordedRelations] has no item with the specified properties.
+   */
+  void _assertNoRecordedRelation(Element element, Relationship relationship,
+      ExpectedLocation location) {
+    for (RecordedRelation recordedRelation in recordedRelations) {
+      if (_equalsRecordedRelation(recordedRelation, element, relationship,
+          location)) {
+        fail('not expected: ${recordedRelation} in\n' + recordedRelations.join(
+            '\n'));
+      }
+    }
+  }
+
+  /**
+   * Asserts that [recordedRelations] has an item with the expected properties.
+   */
+  Location _assertRecordedRelation(Element expectedElement,
+      Relationship expectedRelationship, ExpectedLocation expectedLocation) {
+    for (RecordedRelation recordedRelation in recordedRelations) {
+      if (_equalsRecordedRelation(recordedRelation, expectedElement,
+          expectedRelationship, expectedLocation)) {
+        return recordedRelation.location;
+      }
+    }
+    fail("not found\n$expectedElement $expectedRelationship "
+        "in $expectedLocation in\n" + recordedRelations.join('\n'));
+    return null;
+  }
+
+  ExpectedLocation _expectedLocation(Element element, String search, [int length
+      = -1]) {
+    int offset = _findOffset(search);
+    if (length == -1) {
+      length = _getLeadingIdentifierLength(search);
+    }
+    return new ExpectedLocation(element, offset, length);
+  }
+
+  Element _findElement(String name, [ElementKind kind]) {
+    return findChildElement(testUnitElement, name, kind);
+  }
+
+  AstNode _findNodeAtOffset(int offset, [Predicate<AstNode> predicate]) {
+    AstNode result = new NodeLocator.con1(offset).searchWithin(testUnit);
+    if (result != null && predicate != null) {
+      result = result.getAncestor(predicate);
+    }
+    return result;
+  }
+
+  AstNode _findNodeAtString(String search, [Predicate<AstNode> predicate]) {
+    int offset = _findOffset(search);
+    return _findNodeAtOffset(offset, predicate);
+  }
+
+  Element _findNodeElementAtString(String search,
+      [Predicate<AstNode> predicate]) {
+    AstNode node = _findNodeAtString(search, predicate);
+    if (node == null) {
+      return null;
+    }
+    return ElementLocator.locate(node);
+  }
+
+  int _findOffset(String search) {
+    int offset = testCode.indexOf(search);
+    expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode");
+    return offset;
+  }
+
+  void _indexTestUnit(String code) {
+    testCode = code;
+    testSource = addSource('/test.dart', code);
+    testUnit = resolveLibraryUnit(testSource);
+    if (verifyNoTestUnitErrors) {
+      _assertNoErrorsInSource();
+    }
+    testUnitElement = testUnit.element;
+    testLibraryElement = testUnitElement.library;
+    indexDartUnit(store, context, testUnit);
+  }
+}
+
+class ExpectedLocation {
+  Element element;
+  int offset;
+  int length;
+
+  ExpectedLocation(this.element, this.offset, this.length);
+
+  @override
+  String toString() {
+    return 'ExpectedLocation(element=$element; offset=$offset; length=$length)';
+  }
+}
+
+class MockIndexStore extends TypedMock implements IndexStore {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+/**
+ * Information about a relation recorded into {@link IndexStore}.
+ */
+class RecordedRelation {
+  final Element element;
+  final Relationship relationship;
+  final Location location;
+
+  RecordedRelation(this.element, this.relationship, this.location);
+
+  @override
+  String toString() {
+    return 'RecordedRelation(element=$element; relationship=$relationship; '
+        'location=$location)';
+  }
+}
diff --git a/pkg/analysis_services/test/index/local_file_index_test.dart b/pkg/analysis_services/test/index/local_file_index_test.dart
new file mode 100644
index 0000000..8ac5fef
--- /dev/null
+++ b/pkg/analysis_services/test/index/local_file_index_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.src.index.local_file_index;
+
+import 'dart:io';
+
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/local_file_index.dart';
+import 'package:unittest/unittest.dart';
+
+
+main() {
+  groupSep = ' | ';
+  test('createLocalFileIndex', () {
+    Directory indexDirectory = Directory.systemTemp.createTempSync(
+        'AnalysisServer_index');
+    try {
+    Index index = createLocalFileIndex(indexDirectory);
+    expect(index, isNotNull);
+    } finally {
+      indexDirectory.delete(recursive: true);
+    }
+  });
+}
diff --git a/pkg/analysis_server/test/index/index_test.dart b/pkg/analysis_services/test/index/local_index_test.dart
similarity index 75%
rename from pkg/analysis_server/test/index/index_test.dart
rename to pkg/analysis_services/test/index/local_index_test.dart
index 73faa90..f4be0a6 100644
--- a/pkg/analysis_server/test/index/index_test.dart
+++ b/pkg/analysis_services/test/index/local_index_test.dart
@@ -2,22 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.index;
+library test.services.src.index.local_index;
 
 import 'dart:async';
-import 'dart:io' show Directory;
 
-import 'package:analysis_server/src/index/index.dart';
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_services/src/index/local_index.dart';
+import 'package:analysis_testing/abstract_context.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/html.dart';
-import 'package:analyzer/src/generated/index.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:unittest/unittest.dart';
 
-import '../abstract_context.dart';
-import '../reflective_tests.dart';
-import 'store/memory_node_manager.dart';
 import 'store/single_source_container.dart';
 
 
@@ -41,20 +39,15 @@
 
 @ReflectiveTestCase()
 class LocalIndexTest extends AbstractContextTest {
-  Directory indexDirectory;
   LocalIndex index;
 
   void setUp() {
     super.setUp();
-    // prepare Index
-    indexDirectory = Directory.systemTemp.createTempSync(
-        'AnalysisServer_index');
-    index = new LocalIndex(new MemoryNodeManager());
+    index = createLocalMemoryIndex();
   }
 
   void tearDown() {
     super.tearDown();
-    indexDirectory.delete(recursive: true);
     index = null;
   }
 
@@ -70,13 +63,6 @@
     });
   }
 
-  void test_getRelationships() {
-    var callback = new _RecordingRelationshipCallback();
-    Element element = UniverseElement.INSTANCE;
-    index.getRelationships(element, IndexConstants.DEFINES_CLASS, callback);
-    expect(callback.locations, isEmpty);
-  }
-
   void test_indexHtmlUnit_nullUnit() {
     index.indexHtmlUnit(context, null);
   }
@@ -148,7 +134,7 @@
   }
 
   Future<List<Location>> _getDefinedFunctions() {
-    return index.getRelationshipsAsync(UniverseElement.INSTANCE,
+    return index.getRelationships(UniverseElement.INSTANCE,
         IndexConstants.DEFINES_FUNCTION);
   }
 
@@ -163,17 +149,3 @@
     _indexLibraryUnit('/test.dart', content);
   }
 }
-
-
-/**
- * A [RelationshipCallback] that remembers [Location]s.
- */
-class _RecordingRelationshipCallback extends RelationshipCallback {
-  List<Location> locations;
-
-  @override
-  void hasRelationships(Element element, Relationship relationship,
-      List<Location> locations) {
-    this.locations = locations;
-  }
-}
diff --git a/pkg/analysis_server/test/index/store/codec_test.dart b/pkg/analysis_services/test/index/store/codec_test.dart
similarity index 95%
rename from pkg/analysis_server/test/index/store/codec_test.dart
rename to pkg/analysis_services/test/index/store/codec_test.dart
index 5d5262f..1b4dc6a 100644
--- a/pkg/analysis_server/test/index/store/codec_test.dart
+++ b/pkg/analysis_services/test/index/store/codec_test.dart
@@ -2,18 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.index.store.codec;
+library test.services.src.index.store.codec;
 
-import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/src/index/store/codec.dart';
+import 'package:analysis_testing/mocks.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/index.dart';
 import 'package:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
-import 'typed_mocks.dart';
-
 
 main() {
   groupSep = ' | ';
@@ -150,8 +149,8 @@
 
 @ReflectiveTestCase()
 class _RelationshipCodecTest {
-  RelationshipCodec codec;
   StringCodec stringCodec = new StringCodec();
+  RelationshipCodec codec;
 
   void setUp() {
     codec = new RelationshipCodec(stringCodec);
diff --git a/pkg/analysis_server/test/index/store/collection_test.dart b/pkg/analysis_services/test/index/store/collection_test.dart
similarity index 90%
rename from pkg/analysis_server/test/index/store/collection_test.dart
rename to pkg/analysis_services/test/index/store/collection_test.dart
index 382510b..5868886 100644
--- a/pkg/analysis_server/test/index/store/collection_test.dart
+++ b/pkg/analysis_services/test/index/store/collection_test.dart
@@ -2,13 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.index.store.collection;
+library test.services.src.index.store.collection;
 
-import 'package:analysis_server/src/index/store/collection.dart';
+import 'package:analysis_services/src/index/store/collection.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
-
 
 main() {
   groupSep = ' | ';
diff --git a/pkg/analysis_services/test/index/store/mocks.dart b/pkg/analysis_services/test/index/store/mocks.dart
new file mode 100644
index 0000000..8505114
--- /dev/null
+++ b/pkg/analysis_services/test/index/store/mocks.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.index.store.mocks;
+
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/src/index/store/codec.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:typed_mock/typed_mock.dart';
+
+
+class MockContextCodec extends TypedMock implements ContextCodec {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockElementCodec extends TypedMock implements ElementCodec {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockInstrumentedAnalysisContextImpl extends TypedMock implements
+    InstrumentedAnalysisContextImpl {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockLocation extends TypedMock implements Location {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockRelationshipCodec extends TypedMock implements RelationshipCodec {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analysis_server/test/index/store/separate_file_manager_test.dart b/pkg/analysis_services/test/index/store/separate_file_manager_test.dart
similarity index 90%
rename from pkg/analysis_server/test/index/store/separate_file_manager_test.dart
rename to pkg/analysis_services/test/index/store/separate_file_manager_test.dart
index 6c3c0e2..a42a1dc 100644
--- a/pkg/analysis_server/test/index/store/separate_file_manager_test.dart
+++ b/pkg/analysis_services/test/index/store/separate_file_manager_test.dart
@@ -2,16 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.index.store.separate_file_mananer;
+library test.services.src.index.store.separate_file_mananer;
 
 import 'dart:io';
 
-import 'package:analysis_server/src/index/store/separate_file_manager.dart';
+import 'package:analysis_services/src/index/store/separate_file_manager.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
-
 
 main() {
   groupSep = ' | ';
@@ -23,8 +22,8 @@
 
 @ReflectiveTestCase()
 class _SeparateFileManagerTest {
-  SeparateFileManager fileManager;
   Directory tempDir;
+  SeparateFileManager fileManager;
 
   void setUp() {
     tempDir = Directory.systemTemp.createTempSync('AnalysisServer_index');
diff --git a/pkg/analysis_server/test/index/store/single_source_container.dart b/pkg/analysis_services/test/index/store/single_source_container.dart
similarity index 88%
rename from pkg/analysis_server/test/index/store/single_source_container.dart
rename to pkg/analysis_services/test/index/store/single_source_container.dart
index 4968217..a7c7a94 100644
--- a/pkg/analysis_server/test/index/store/single_source_container.dart
+++ b/pkg/analysis_services/test/index/store/single_source_container.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.index.store_single_source_container;
+library test.services.src.index.store.single_source_container;
 
 import 'package:analyzer/src/generated/source.dart';
 
diff --git a/pkg/analysis_server/test/index/store/split_store_test.dart b/pkg/analysis_services/test/index/store/split_store_test.dart
similarity index 93%
rename from pkg/analysis_server/test/index/store/split_store_test.dart
rename to pkg/analysis_services/test/index/store/split_store_test.dart
index cc1b5c1..51c4474 100644
--- a/pkg/analysis_server/test/index/store/split_store_test.dart
+++ b/pkg/analysis_services/test/index/store/split_store_test.dart
@@ -2,23 +2,24 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.index.split_store;
+library test.services.src.index.store.split_store;
 
 import 'dart:async';
 
-import 'package:analysis_server/src/index/store/codec.dart';
-import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/src/index/store/codec.dart';
+import 'package:analysis_services/src/index/store/memory_node_manager.dart';
+import 'package:analysis_services/src/index/store/split_store.dart';
+import 'package:analysis_testing/mocks.dart';
+import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/index.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
-import 'memory_node_manager.dart';
+import 'mocks.dart';
 import 'single_source_container.dart';
-import 'typed_mocks.dart';
 
 
 main() {
@@ -56,16 +57,19 @@
 
 @ReflectiveTestCase()
 class _FileNodeManagerTest {
+  MockLogger logger = new MockLogger();
+  StringCodec stringCodec = new StringCodec();
+  RelationshipCodec relationshipCodec;
+
   AnalysisContext context = new MockAnalysisContext('context');
   ContextCodec contextCodec = new MockContextCodec();
   int contextId = 13;
+
   ElementCodec elementCodec = new MockElementCodec();
-  FileManager fileManager = new _MockFileManager();
-  MockLogger logger = new MockLogger();
   int nextElementId = 0;
+
   FileNodeManager nodeManager;
-  RelationshipCodec relationshipCodec;
-  StringCodec stringCodec = new StringCodec();
+  FileManager fileManager = new _MockFileManager();
 
   void setUp() {
     relationshipCodec = new RelationshipCodec(stringCodec);
@@ -560,17 +564,17 @@
     expect(store.aboutToIndexDart(instrumentedContext, unitElementA), isFalse);
   }
 
-  void test_aboutToIndexDart_library_first() {
+  Future test_aboutToIndexDart_library_first() {
     when(libraryElement.parts).thenReturn(<CompilationUnitElement>[unitElementA,
         unitElementB]);
     {
       store.aboutToIndexDart(contextA, libraryUnitElement);
       store.doneIndex();
     }
-    {
-      List<Location> locations = store.getRelationships(elementA, relationship);
+    return store.getRelationships(elementA, relationship).then(
+        (List<Location> locations) {
       assertLocations(locations, []);
-    }
+    });
   }
 
   test_aboutToIndexDart_library_secondWithoutOneUnit() {
@@ -587,17 +591,17 @@
       store.doneIndex();
     }
     // "A" and "B" locations
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
-    }).then((_) {
       // apply "libraryUnitElement", only with "B"
       when(libraryElement.parts).thenReturn([unitElementB]);
       {
         store.aboutToIndexDart(contextA, libraryUnitElement);
         store.doneIndex();
       }
-      return store.getRelationshipsAsync(elementA, relationship).then(
+    }).then((_) {
+      return store.getRelationships(elementA, relationship).then(
           (List<Location> locations) {
         assertLocations(locations, [locationB]);
       });
@@ -632,7 +636,7 @@
       store.doneIndex();
     }
     // "A" and "B" locations
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     });
@@ -655,7 +659,7 @@
   }
 
   test_getRelationships_empty() {
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       expect(locations, isEmpty);
     });
@@ -714,7 +718,7 @@
       store.recordRelationship(elementA, relationship, locationB);
       store.doneIndex();
     }
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     });
@@ -725,7 +729,7 @@
     store.aboutToIndexDart(contextA, unitElementA);
     store.recordRelationship(elementA, relationship, locationA);
     store.doneIndex();
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       assertLocations(locations, [locationA]);
     });
@@ -738,7 +742,7 @@
     store.recordRelationship(elementA, relationship, locationA);
     store.recordRelationship(elementA, relationship, locationB);
     store.doneIndex();
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     });
@@ -758,13 +762,13 @@
       store.doneIndex();
     }
     // "A" and "B" locations
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
-    }).then((_) {
       // remove "A" context
       store.removeContext(contextA);
-      return store.getRelationshipsAsync(elementA, relationship).then(
+    }).then((_) {
+      return store.getRelationships(elementA, relationship).then(
           (List<Location> locations) {
         assertLocations(locations, []);
       });
@@ -795,13 +799,13 @@
       store.doneIndex();
     }
     // "A", "B" and "C" locations
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       assertLocations(locations, [locationA, locationB, locationC]);
     }).then((_) {
       // remove "librarySource"
       store.removeSource(contextA, librarySource);
-      return store.getRelationshipsAsync(elementA, relationship).then(
+      return store.getRelationships(elementA, relationship).then(
           (List<Location> locations) {
         assertLocations(locations, []);
       });
@@ -832,13 +836,13 @@
       store.doneIndex();
     }
     // "A", "B" and "C" locations
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       assertLocations(locations, [locationA, locationB, locationC]);
     }).then((_) {
       // remove "A" source
       store.removeSource(contextA, sourceA);
-      return store.getRelationshipsAsync(elementA, relationship).then(
+      return store.getRelationships(elementA, relationship).then(
           (List<Location> locations) {
         assertLocations(locations, [locationB, locationC]);
       });
@@ -859,13 +863,13 @@
       store.doneIndex();
     }
     // "A" and "B" locations
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     }).then((_) {
       // remove "librarySource"
       store.removeSources(contextA, new SingleSourceContainer(librarySource));
-      return store.getRelationshipsAsync(elementA, relationship).then(
+      return store.getRelationships(elementA, relationship).then(
           (List<Location> locations) {
         assertLocations(locations, []);
       });
@@ -896,14 +900,14 @@
       store.doneIndex();
     }
     // "A", "B" and "C" locations
-    return store.getRelationshipsAsync(elementA, relationship).then(
+    return store.getRelationships(elementA, relationship).then(
         (List<Location> locations) {
       assertLocations(locations, [locationA, locationB, locationC]);
     }).then((_) {
       // remove "A" source
       store.removeSources(contextA, new SingleSourceContainer(sourceA));
       store.removeSource(contextA, sourceA);
-      return store.getRelationshipsAsync(elementA, relationship).then(
+      return store.getRelationships(elementA, relationship).then(
           (List<Location> locations) {
         assertLocations(locations, [locationB, locationC]);
       });
@@ -928,14 +932,14 @@
       store.doneIndex();
     }
     // get relationships
-    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
-        relationship).then((List<Location> locations) {
+    return store.getRelationships(UniverseElement.INSTANCE, relationship).then(
+        (List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     }).then((_) {
       // re-index "unitElementA"
       store.aboutToIndexDart(contextA, unitElementA);
       store.doneIndex();
-      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+      return store.getRelationships(UniverseElement.INSTANCE,
           relationship).then((List<Location> locations) {
         assertLocations(locations, [locationB]);
       });
@@ -959,13 +963,13 @@
           locationB);
       store.doneIndex();
     }
-    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
-        relationship).then((List<Location> locations) {
+    return store.getRelationships(UniverseElement.INSTANCE, relationship).then(
+        (List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     }).then((_) {
       // clear
       store.clear();
-      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+      return store.getRelationships(UniverseElement.INSTANCE,
           relationship).then((List<Location> locations) {
         expect(locations, isEmpty);
       });
@@ -989,13 +993,13 @@
           locationB);
       store.doneIndex();
     }
-    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
-        relationship).then((List<Location> locations) {
+    return store.getRelationships(UniverseElement.INSTANCE, relationship).then(
+        (List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     }).then((_) {
       // remove "contextA"
       store.removeContext(contextA);
-      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+      return store.getRelationships(UniverseElement.INSTANCE,
           relationship).then((List<Location> locations) {
         assertLocations(locations, [locationB]);
       });
@@ -1019,13 +1023,13 @@
           locationB);
       store.doneIndex();
     }
-    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
-        relationship).then((List<Location> locations) {
+    return store.getRelationships(UniverseElement.INSTANCE, relationship).then(
+        (List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     }).then((_) {
       // remove "sourceA"
       store.removeSource(contextA, sourceA);
-      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+      return store.getRelationships(UniverseElement.INSTANCE,
           relationship).then((List<Location> locations) {
         assertLocations(locations, [locationB]);
       });
diff --git a/pkg/analysis_server/test/index/store/test_all.dart b/pkg/analysis_services/test/index/store/test_all.dart
similarity index 94%
rename from pkg/analysis_server/test/index/store/test_all.dart
rename to pkg/analysis_services/test/index/store/test_all.dart
index 4e67d6b..e0a8d1f 100644
--- a/pkg/analysis_server/test/index/store/test_all.dart
+++ b/pkg/analysis_services/test/index/store/test_all.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.index.store;
+library test.services.src.index.store;
 
 import 'package:unittest/unittest.dart';
 
diff --git a/pkg/analysis_services/test/index/test_all.dart b/pkg/analysis_services/test/index/test_all.dart
new file mode 100644
index 0000000..47bae26
--- /dev/null
+++ b/pkg/analysis_services/test/index/test_all.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.src.index.all;
+
+import 'package:unittest/unittest.dart';
+
+import 'dart_index_contributor_test.dart' as dart_index_contributor_test;
+import 'local_file_index_test.dart' as local_file_index_test;
+import 'local_index_test.dart' as local_index_test;
+import 'store/test_all.dart' as store_test_all;
+
+
+/**
+ * Utility for manually running all tests.
+ */
+main() {
+  groupSep = ' | ';
+  group('index', () {
+    dart_index_contributor_test.main();
+    local_file_index_test.main();
+    local_index_test.main();
+    store_test_all.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/test/search/search_engine_test.dart b/pkg/analysis_services/test/search/search_engine_test.dart
new file mode 100644
index 0000000..db896c9
--- /dev/null
+++ b/pkg/analysis_services/test/search/search_engine_test.dart
@@ -0,0 +1,2148 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library engine.search_engine_test;
+
+
+main() {
+}
+
+
+//class AndSearchPatternTest extends EngineTestCase {
+//  Element _element = mock(Element);
+//
+//  SearchPattern _patternA = mock(SearchPattern);
+//
+//  SearchPattern _patternB = mock(SearchPattern);
+//
+//  AndSearchPattern _pattern = new AndSearchPattern([_patternA, _patternB]);
+//
+//  void test_allExact() {
+//    when(_patternA.matches(_element)).thenReturn(MatchQuality.EXACT);
+//    when(_patternB.matches(_element)).thenReturn(MatchQuality.EXACT);
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, _pattern.matches(_element));
+//  }
+//
+//  void test_ExactName() {
+//    when(_patternA.matches(_element)).thenReturn(MatchQuality.EXACT);
+//    when(_patternB.matches(_element)).thenReturn(MatchQuality.NAME);
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, _pattern.matches(_element));
+//  }
+//
+//  void test_NameExact() {
+//    when(_patternA.matches(_element)).thenReturn(MatchQuality.NAME);
+//    when(_patternB.matches(_element)).thenReturn(MatchQuality.EXACT);
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, _pattern.matches(_element));
+//  }
+//
+//  void test_oneNull() {
+//    when(_patternA.matches(_element)).thenReturn(MatchQuality.EXACT);
+//    when(_patternB.matches(_element)).thenReturn(null);
+//    // validate
+//    JUnitTestCase.assertSame(null, _pattern.matches(_element));
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('AndSearchPatternTest', () {
+//      _ut.test('test_ExactName', () {
+//        final __test = new AndSearchPatternTest();
+//        runJUnitTest(__test, __test.test_ExactName);
+//      });
+//      _ut.test('test_NameExact', () {
+//        final __test = new AndSearchPatternTest();
+//        runJUnitTest(__test, __test.test_NameExact);
+//      });
+//      _ut.test('test_allExact', () {
+//        final __test = new AndSearchPatternTest();
+//        runJUnitTest(__test, __test.test_allExact);
+//      });
+//      _ut.test('test_oneNull', () {
+//        final __test = new AndSearchPatternTest();
+//        runJUnitTest(__test, __test.test_oneNull);
+//      });
+//    });
+//  }
+//}
+//
+//class CamelCaseSearchPatternTest extends EngineTestCase {
+//  void test_matchExact_samePartCount() {
+//    Element element = mock(Element);
+//    when(element.displayName).thenReturn("HashMap");
+//    //
+//    CamelCaseSearchPattern pattern = new CamelCaseSearchPattern("HM", true);
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(element));
+//  }
+//
+//  void test_matchExact_withLowerCase() {
+//    Element element = mock(Element);
+//    when(element.displayName).thenReturn("HashMap");
+//    //
+//    CamelCaseSearchPattern pattern = new CamelCaseSearchPattern("HaMa", true);
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(element));
+//  }
+//
+//  void test_matchNot_nullName() {
+//    Element element = mock(Element);
+//    when(element.displayName).thenReturn(null);
+//    //
+//    CamelCaseSearchPattern pattern = new CamelCaseSearchPattern("HM", true);
+//    JUnitTestCase.assertSame(null, pattern.matches(element));
+//  }
+//
+//  void test_matchNot_samePartCount() {
+//    Element element = mock(Element);
+//    when(element.displayName).thenReturn("LinkedHashMap");
+//    //
+//    CamelCaseSearchPattern pattern = new CamelCaseSearchPattern("LH", true);
+//    JUnitTestCase.assertSame(null, pattern.matches(element));
+//  }
+//
+//  void test_matchNot_withLowerCase() {
+//    Element element = mock(Element);
+//    when(element.displayName).thenReturn("HashMap");
+//    //
+//    CamelCaseSearchPattern pattern = new CamelCaseSearchPattern("HaMu", true);
+//    JUnitTestCase.assertSame(null, pattern.matches(element));
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('CamelCaseSearchPatternTest', () {
+//      _ut.test('test_matchExact_samePartCount', () {
+//        final __test = new CamelCaseSearchPatternTest();
+//        runJUnitTest(__test, __test.test_matchExact_samePartCount);
+//      });
+//      _ut.test('test_matchExact_withLowerCase', () {
+//        final __test = new CamelCaseSearchPatternTest();
+//        runJUnitTest(__test, __test.test_matchExact_withLowerCase);
+//      });
+//      _ut.test('test_matchNot_nullName', () {
+//        final __test = new CamelCaseSearchPatternTest();
+//        runJUnitTest(__test, __test.test_matchNot_nullName);
+//      });
+//      _ut.test('test_matchNot_samePartCount', () {
+//        final __test = new CamelCaseSearchPatternTest();
+//        runJUnitTest(__test, __test.test_matchNot_samePartCount);
+//      });
+//      _ut.test('test_matchNot_withLowerCase', () {
+//        final __test = new CamelCaseSearchPatternTest();
+//        runJUnitTest(__test, __test.test_matchNot_withLowerCase);
+//      });
+//    });
+//  }
+//}
+//
+//class CountingSearchListenerTest extends EngineTestCase {
+//  void test_matchFound() {
+//    SearchListener listener = mock(SearchListener);
+//    SearchMatch match = mock(SearchMatch);
+//    SearchListener countingListener = new CountingSearchListener(2, listener);
+//    // "match" should be passed to "listener"
+//    countingListener.matchFound(match);
+//    verify(listener).matchFound(match);
+//    verifyNoMoreInteractions(listener);
+//  }
+//
+//  void test_searchComplete() {
+//    SearchListener listener = mock(SearchListener);
+//    SearchListener countingListener = new CountingSearchListener(2, listener);
+//    // complete 2 -> 1
+//    countingListener.searchComplete();
+//    verifyZeroInteractions(listener);
+//    // complete 2 -> 0
+//    countingListener.searchComplete();
+//    verify(listener).searchComplete();
+//  }
+//
+//  void test_searchComplete_zero() {
+//    SearchListener listener = mock(SearchListener);
+//    new CountingSearchListener(0, listener);
+//    // complete at 0
+//    verify(listener).searchComplete();
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('CountingSearchListenerTest', () {
+//      _ut.test('test_matchFound', () {
+//        final __test = new CountingSearchListenerTest();
+//        runJUnitTest(__test, __test.test_matchFound);
+//      });
+//      _ut.test('test_searchComplete', () {
+//        final __test = new CountingSearchListenerTest();
+//        runJUnitTest(__test, __test.test_searchComplete);
+//      });
+//      _ut.test('test_searchComplete_zero', () {
+//        final __test = new CountingSearchListenerTest();
+//        runJUnitTest(__test, __test.test_searchComplete_zero);
+//      });
+//    });
+//  }
+//}
+//
+//class ExactSearchPatternTest extends EngineTestCase {
+//  Element _element = mock(Element);
+//
+//  void test_caseInsensitive_false() {
+//    SearchPattern pattern = new ExactSearchPattern("HashMa", false);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  void test_caseInsensitive_true() {
+//    SearchPattern pattern = new ExactSearchPattern("HashMap", false);
+//    when(_element.displayName).thenReturn("HashMaP");
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(_element));
+//  }
+//
+//  void test_caseSensitive_false() {
+//    SearchPattern pattern = new ExactSearchPattern("HashMa", true);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  void test_caseSensitive_true() {
+//    SearchPattern pattern = new ExactSearchPattern("HashMap", true);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(_element));
+//  }
+//
+//  void test_nullName() {
+//    SearchPattern pattern = new ExactSearchPattern("HashMap", true);
+//    when(_element.displayName).thenReturn(null);
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('ExactSearchPatternTest', () {
+//      _ut.test('test_caseInsensitive_false', () {
+//        final __test = new ExactSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseInsensitive_false);
+//      });
+//      _ut.test('test_caseInsensitive_true', () {
+//        final __test = new ExactSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseInsensitive_true);
+//      });
+//      _ut.test('test_caseSensitive_false', () {
+//        final __test = new ExactSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseSensitive_false);
+//      });
+//      _ut.test('test_caseSensitive_true', () {
+//        final __test = new ExactSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseSensitive_true);
+//      });
+//      _ut.test('test_nullName', () {
+//        final __test = new ExactSearchPatternTest();
+//        runJUnitTest(__test, __test.test_nullName);
+//      });
+//    });
+//  }
+//}
+//
+//class FilterSearchListenerTest extends EngineTestCase {
+//  SearchListener _listener = mock(SearchListener);
+//
+//  SearchMatch _match = mock(SearchMatch);
+//
+//  SearchFilter _filter = mock(SearchFilter);
+//
+//  SearchListener _filteredListener = new FilteredSearchListener(_filter, _listener);
+//
+//  void test_matchFound_filterFalse() {
+//    when(_filter.passes(_match)).thenReturn(false);
+//    // "match" should be passed to "listener"
+//    _filteredListener.matchFound(_match);
+//    verifyNoMoreInteractions(_listener);
+//  }
+//
+//  void test_matchFound_filterTrue() {
+//    when(_filter.passes(_match)).thenReturn(true);
+//    // "match" should be passed to "listener"
+//    _filteredListener.matchFound(_match);
+//    verify(_listener).matchFound(_match);
+//    verifyNoMoreInteractions(_listener);
+//  }
+//
+//  void test_searchComplete() {
+//    _filteredListener.searchComplete();
+//    verify(_listener).searchComplete();
+//    verifyNoMoreInteractions(_listener);
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('FilterSearchListenerTest', () {
+//      _ut.test('test_matchFound_filterFalse', () {
+//        final __test = new FilterSearchListenerTest();
+//        runJUnitTest(__test, __test.test_matchFound_filterFalse);
+//      });
+//      _ut.test('test_matchFound_filterTrue', () {
+//        final __test = new FilterSearchListenerTest();
+//        runJUnitTest(__test, __test.test_matchFound_filterTrue);
+//      });
+//      _ut.test('test_searchComplete', () {
+//        final __test = new FilterSearchListenerTest();
+//        runJUnitTest(__test, __test.test_searchComplete);
+//      });
+//    });
+//  }
+//}
+//
+//class GatheringSearchListenerTest extends EngineTestCase {
+//  SearchMatch _matchA = mock(SearchMatch);
+//
+//  SearchMatch _matchB = mock(SearchMatch);
+//
+//  GatheringSearchListener _gatheringListener = new GatheringSearchListener();
+//
+//  void test_matchFound() {
+//    Element elementA = mock(Element);
+//    Element elementB = mock(Element);
+//    when(elementA.displayName).thenReturn("A");
+//    when(elementB.displayName).thenReturn("B");
+//    when(_matchA.element).thenReturn(elementA);
+//    when(_matchB.element).thenReturn(elementB);
+//    // matchB
+//    _gatheringListener.matchFound(_matchB);
+//    JUnitTestCase.assertFalse(_gatheringListener.isComplete);
+//    assertThat(_gatheringListener.matches).containsExactly(_matchB);
+//    // matchA
+//    _gatheringListener.matchFound(_matchA);
+//    JUnitTestCase.assertFalse(_gatheringListener.isComplete);
+//    assertThat(_gatheringListener.matches).containsExactly(_matchA, _matchB);
+//  }
+//
+//  void test_searchComplete() {
+//    JUnitTestCase.assertFalse(_gatheringListener.isComplete);
+//    // complete
+//    _gatheringListener.searchComplete();
+//    JUnitTestCase.assertTrue(_gatheringListener.isComplete);
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('GatheringSearchListenerTest', () {
+//      _ut.test('test_matchFound', () {
+//        final __test = new GatheringSearchListenerTest();
+//        runJUnitTest(__test, __test.test_matchFound);
+//      });
+//      _ut.test('test_searchComplete', () {
+//        final __test = new GatheringSearchListenerTest();
+//        runJUnitTest(__test, __test.test_searchComplete);
+//      });
+//    });
+//  }
+//}
+//
+//class LibrarySearchScopeTest extends EngineTestCase {
+//  LibraryElement _libraryA = mock(LibraryElement);
+//
+//  LibraryElement _libraryB = mock(LibraryElement);
+//
+//  Element _element = mock(Element);
+//
+//  void test_arrayConstructor_inA_false() {
+//    when(_element.getAncestor((element) => element is LibraryElement)).thenReturn(_libraryB);
+//    LibrarySearchScope scope = new LibrarySearchScope.con2([_libraryA]);
+//    assertThat(scope.libraries).containsOnly(_libraryA);
+//    JUnitTestCase.assertFalse(scope.encloses(_element));
+//  }
+//
+//  void test_arrayConstructor_inA_true() {
+//    when(_element.getAncestor((element) => element is LibraryElement)).thenReturn(_libraryA);
+//    LibrarySearchScope scope = new LibrarySearchScope.con2([_libraryA, _libraryB]);
+//    assertThat(scope.libraries).containsOnly(_libraryA, _libraryB);
+//    JUnitTestCase.assertTrue(scope.encloses(_element));
+//  }
+//
+//  void test_collectionConstructor_inB() {
+//    when(_element.getAncestor((element) => element is LibraryElement)).thenReturn(_libraryB);
+//    LibrarySearchScope scope = new LibrarySearchScope.con1(ImmutableSet.of(_libraryA, _libraryB));
+//    assertThat(scope.libraries).containsOnly(_libraryA, _libraryB);
+//    JUnitTestCase.assertTrue(scope.encloses(_element));
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('LibrarySearchScopeTest', () {
+//      _ut.test('test_arrayConstructor_inA_false', () {
+//        final __test = new LibrarySearchScopeTest();
+//        runJUnitTest(__test, __test.test_arrayConstructor_inA_false);
+//      });
+//      _ut.test('test_arrayConstructor_inA_true', () {
+//        final __test = new LibrarySearchScopeTest();
+//        runJUnitTest(__test, __test.test_arrayConstructor_inA_true);
+//      });
+//      _ut.test('test_collectionConstructor_inB', () {
+//        final __test = new LibrarySearchScopeTest();
+//        runJUnitTest(__test, __test.test_collectionConstructor_inB);
+//      });
+//    });
+//  }
+//}
+//
+//class NameMatchingSearchListenerTest extends EngineTestCase {
+//  SearchListener _listener = mock(SearchListener);
+//
+//  Element _element = mock(Element);
+//
+//  SearchMatch _match = mock(SearchMatch);
+//
+//  SearchPattern _pattern = mock(SearchPattern);
+//
+//  SearchListener _nameMatchingListener = new NameMatchingSearchListener(_pattern, _listener);
+//
+//  void test_matchFound_patternFalse() {
+//    when(_pattern.matches(_element)).thenReturn(null);
+//    // verify
+//    _nameMatchingListener.matchFound(_match);
+//    verifyNoMoreInteractions(_listener);
+//  }
+//
+//  void test_matchFound_patternTrue() {
+//    when(_pattern.matches(_element)).thenReturn(MatchQuality.EXACT);
+//    // verify
+//    _nameMatchingListener.matchFound(_match);
+//    verify(_listener).matchFound(_match);
+//    verifyNoMoreInteractions(_listener);
+//  }
+//
+//  @override
+//  void setUp() {
+//    super.setUp();
+//    when(_match.element).thenReturn(_element);
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('NameMatchingSearchListenerTest', () {
+//      _ut.test('test_matchFound_patternFalse', () {
+//        final __test = new NameMatchingSearchListenerTest();
+//        runJUnitTest(__test, __test.test_matchFound_patternFalse);
+//      });
+//      _ut.test('test_matchFound_patternTrue', () {
+//        final __test = new NameMatchingSearchListenerTest();
+//        runJUnitTest(__test, __test.test_matchFound_patternTrue);
+//      });
+//    });
+//  }
+//}
+//
+//class OrSearchPatternTest extends EngineTestCase {
+//  Element _element = mock(Element);
+//
+//  SearchPattern _patternA = mock(SearchPattern);
+//
+//  SearchPattern _patternB = mock(SearchPattern);
+//
+//  SearchPattern _pattern = new OrSearchPattern([_patternA, _patternB]);
+//
+//  void test_allExact() {
+//    when(_patternA.matches(_element)).thenReturn(MatchQuality.EXACT);
+//    when(_patternB.matches(_element)).thenReturn(MatchQuality.EXACT);
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, _pattern.matches(_element));
+//  }
+//
+//  void test_ExactName() {
+//    when(_patternA.matches(_element)).thenReturn(MatchQuality.EXACT);
+//    when(_patternB.matches(_element)).thenReturn(MatchQuality.NAME);
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, _pattern.matches(_element));
+//  }
+//
+//  void test_NameExact() {
+//    when(_patternA.matches(_element)).thenReturn(MatchQuality.NAME);
+//    when(_patternB.matches(_element)).thenReturn(MatchQuality.EXACT);
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.NAME, _pattern.matches(_element));
+//  }
+//
+//  void test_NullNull() {
+//    when(_patternA.matches(_element)).thenReturn(null);
+//    when(_patternB.matches(_element)).thenReturn(null);
+//    // validate
+//    JUnitTestCase.assertSame(null, _pattern.matches(_element));
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('OrSearchPatternTest', () {
+//      _ut.test('test_ExactName', () {
+//        final __test = new OrSearchPatternTest();
+//        runJUnitTest(__test, __test.test_ExactName);
+//      });
+//      _ut.test('test_NameExact', () {
+//        final __test = new OrSearchPatternTest();
+//        runJUnitTest(__test, __test.test_NameExact);
+//      });
+//      _ut.test('test_NullNull', () {
+//        final __test = new OrSearchPatternTest();
+//        runJUnitTest(__test, __test.test_NullNull);
+//      });
+//      _ut.test('test_allExact', () {
+//        final __test = new OrSearchPatternTest();
+//        runJUnitTest(__test, __test.test_allExact);
+//      });
+//    });
+//  }
+//}
+//
+//class PrefixSearchPatternTest extends EngineTestCase {
+//  Element _element = mock(Element);
+//
+//  void test_caseInsensitive_contentMatch_caseMatch() {
+//    SearchPattern pattern = new PrefixSearchPattern("HashMa", false);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(_element));
+//  }
+//
+//  void test_caseInsensitive_contentMatch_caseMismatch() {
+//    SearchPattern pattern = new PrefixSearchPattern("HaSHMa", false);
+//    when(_element.displayName).thenReturn("hashMaP");
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(_element));
+//  }
+//
+//  void test_caseInsensitive_contentMismatch() {
+//    SearchPattern pattern = new PrefixSearchPattern("HashMa", false);
+//    when(_element.displayName).thenReturn("HashTable");
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  void test_caseSensitive_contentMatch() {
+//    SearchPattern pattern = new PrefixSearchPattern("HashMa", true);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(_element));
+//  }
+//
+//  void test_caseSensitive_contentMismatch() {
+//    SearchPattern pattern = new PrefixSearchPattern("HashMa", true);
+//    when(_element.displayName).thenReturn("HashTable");
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  void test_nullElement() {
+//    SearchPattern pattern = new PrefixSearchPattern("HashMa", false);
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(null));
+//  }
+//
+//  void test_nullName() {
+//    SearchPattern pattern = new PrefixSearchPattern("HashMa", false);
+//    when(_element.displayName).thenReturn(null);
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('PrefixSearchPatternTest', () {
+//      _ut.test('test_caseInsensitive_contentMatch_caseMatch', () {
+//        final __test = new PrefixSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseInsensitive_contentMatch_caseMatch);
+//      });
+//      _ut.test('test_caseInsensitive_contentMatch_caseMismatch', () {
+//        final __test = new PrefixSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseInsensitive_contentMatch_caseMismatch);
+//      });
+//      _ut.test('test_caseInsensitive_contentMismatch', () {
+//        final __test = new PrefixSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseInsensitive_contentMismatch);
+//      });
+//      _ut.test('test_caseSensitive_contentMatch', () {
+//        final __test = new PrefixSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseSensitive_contentMatch);
+//      });
+//      _ut.test('test_caseSensitive_contentMismatch', () {
+//        final __test = new PrefixSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseSensitive_contentMismatch);
+//      });
+//      _ut.test('test_nullElement', () {
+//        final __test = new PrefixSearchPatternTest();
+//        runJUnitTest(__test, __test.test_nullElement);
+//      });
+//      _ut.test('test_nullName', () {
+//        final __test = new PrefixSearchPatternTest();
+//        runJUnitTest(__test, __test.test_nullName);
+//      });
+//    });
+//  }
+//}
+//
+//class RegularExpressionSearchPatternTest extends EngineTestCase {
+//  Element _element = mock(Element);
+//
+//  void test_caseInsensitive_false_contentMismatch() {
+//    SearchPattern pattern = new RegularExpressionSearchPattern("H[a-z]*Map", false);
+//    when(_element.displayName).thenReturn("Maps");
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  void test_caseInsensitive_true_caseMismatch() {
+//    SearchPattern pattern = new RegularExpressionSearchPattern("H[a-z]*MaP", false);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(_element));
+//  }
+//
+//  void test_caseSensitive_false_caseMismatch() {
+//    SearchPattern pattern = new RegularExpressionSearchPattern("H[a-z]*MaP", true);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  void test_caseSensitive_false_contentMismatch() {
+//    SearchPattern pattern = new RegularExpressionSearchPattern("H[a-z]*Map", true);
+//    when(_element.displayName).thenReturn("Maps");
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  void test_caseSensitive_true() {
+//    SearchPattern pattern = new RegularExpressionSearchPattern("H.*Map", true);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(_element));
+//  }
+//
+//  void test_nullElement() {
+//    SearchPattern pattern = new RegularExpressionSearchPattern("H.*Map", true);
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(null));
+//  }
+//
+//  void test_nullName() {
+//    SearchPattern pattern = new RegularExpressionSearchPattern("H.*Map", true);
+//    when(_element.displayName).thenReturn(null);
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('RegularExpressionSearchPatternTest', () {
+//      _ut.test('test_caseInsensitive_false_contentMismatch', () {
+//        final __test = new RegularExpressionSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseInsensitive_false_contentMismatch);
+//      });
+//      _ut.test('test_caseInsensitive_true_caseMismatch', () {
+//        final __test = new RegularExpressionSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseInsensitive_true_caseMismatch);
+//      });
+//      _ut.test('test_caseSensitive_false_caseMismatch', () {
+//        final __test = new RegularExpressionSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseSensitive_false_caseMismatch);
+//      });
+//      _ut.test('test_caseSensitive_false_contentMismatch', () {
+//        final __test = new RegularExpressionSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseSensitive_false_contentMismatch);
+//      });
+//      _ut.test('test_caseSensitive_true', () {
+//        final __test = new RegularExpressionSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseSensitive_true);
+//      });
+//      _ut.test('test_nullElement', () {
+//        final __test = new RegularExpressionSearchPatternTest();
+//        runJUnitTest(__test, __test.test_nullElement);
+//      });
+//      _ut.test('test_nullName', () {
+//        final __test = new RegularExpressionSearchPatternTest();
+//        runJUnitTest(__test, __test.test_nullName);
+//      });
+//    });
+//  }
+//}
+//
+//class SearchEngineImplTest extends EngineTestCase {
+//  static void _assertMatches(List<SearchMatch> matches, List<SearchEngineImplTest_ExpectedMatch> expectedMatches) {
+//    assertThat(matches).hasSize(expectedMatches.length);
+//    for (SearchMatch match in matches) {
+//      bool found = false;
+//      String msg = match.toString();
+//      for (SearchEngineImplTest_ExpectedMatch expectedMatch in expectedMatches) {
+//        if (match.element == expectedMatch._element && match.kind == expectedMatch._kind && match.quality == expectedMatch._quality && match.sourceRange == expectedMatch._range && match.isQualified == expectedMatch._qualified) {
+//          found = true;
+//          break;
+//        }
+//      }
+//      if (!found) {
+//        JUnitTestCase.fail("Not found: ${msg}");
+//      }
+//    }
+//  }
+//
+//  IndexStore _indexStore = IndexFactory.newSplitIndexStore(new MemoryNodeManager());
+//
+//  static AnalysisContext _CONTEXT = mock(AnalysisContext);
+//
+//  int _nextLocationId = 0;
+//
+//  SearchScope _scope;
+//
+//  SearchPattern _pattern = null;
+//
+//  SearchFilter _filter = null;
+//
+//  Source _source = mock(Source);
+//
+//  CompilationUnitElement _unitElement = mock(CompilationUnitElement);
+//
+//  LibraryElement _libraryElement = mock(LibraryElement);
+//
+//  Element _elementA = _mockElement(Element, ElementKind.CLASS);
+//
+//  Element _elementB = _mockElement(Element, ElementKind.CLASS);
+//
+//  Element _elementC = _mockElement(Element, ElementKind.CLASS);
+//
+//  Element _elementD = _mockElement(Element, ElementKind.CLASS);
+//
+//  Element _elementE = _mockElement(Element, ElementKind.CLASS);
+//
+//  void fail_searchAssignedTypes_assignments() {
+//    // TODO(scheglov) does not work - new split index store cannot store types (yet?)
+//    PropertyAccessorElement setterElement = _mockElement(PropertyAccessorElement, ElementKind.SETTER);
+//    FieldElement fieldElement = _mockElement(FieldElement, ElementKind.FIELD);
+//    when(fieldElement.setter).thenReturn(setterElement);
+//    DartType typeA = mock(DartType);
+//    DartType typeB = mock(DartType);
+//    DartType typeC = mock(DartType);
+//    _indexStore.aboutToIndexDart(_CONTEXT, _unitElement);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      location = new LocationWithData<DartType>.con1(location, typeA);
+//      _indexStore.recordRelationship(setterElement, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      location = new LocationWithData<DartType>.con1(location, typeB);
+//      _indexStore.recordRelationship(setterElement, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
+//    }
+//    // will be filtered by scope
+//    {
+//      Location location = new Location(_elementC, 3, 30);
+//      location = new LocationWithData<DartType>.con1(location, typeC);
+//      _indexStore.recordRelationship(setterElement, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+//    }
+//    // not LocationWithData
+//    {
+//      Location location = new Location(_elementD, 4, 40);
+//      _indexStore.recordRelationship(setterElement, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+//    }
+//    _indexStore.doneIndex();
+//    // ask types
+//    Set<DartType> types = _runSearch(new SearchRunner_SearchEngineImplTest_fail_searchAssignedTypes_assignments(fieldElement));
+//    assertThat(types).containsOnly(typeA, typeB);
+//  }
+//
+//  void fail_searchAssignedTypes_initializers() {
+//    // TODO(scheglov) does not work - new split index store cannot store types (yet?)
+//    FieldElement fieldElement = _mockElement(FieldElement, ElementKind.FIELD);
+//    DartType typeA = mock(DartType);
+//    DartType typeB = mock(DartType);
+//    {
+//      Location location = new Location(_elementA, 10, 1);
+//      location = new LocationWithData<DartType>.con1(location, typeA);
+//      _indexStore.recordRelationship(fieldElement, IndexConstants.IS_DEFINED_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 20, 1);
+//      location = new LocationWithData<DartType>.con1(location, typeB);
+//      _indexStore.recordRelationship(fieldElement, IndexConstants.IS_REFERENCED_BY, location);
+//    }
+//    _indexStore.doneIndex();
+//    // ask types
+//    Set<DartType> types = _runSearch(new SearchRunner_SearchEngineImplTest_fail_searchAssignedTypes_initializers(fieldElement));
+//    assertThat(types).containsOnly(typeA, typeB);
+//  }
+//
+//  void test_searchDeclarations_String() {
+//    Element referencedElement = new NameElementImpl("test");
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_DEFINED_BY, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_DEFINED_BY, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _runSearch(new SearchRunner_SearchEngineImplTest_test_searchDeclarations_String(this));
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.NAME_DECLARATION, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.NAME_DECLARATION, 10, 20)]);
+//  }
+//
+//  void test_searchFunctionDeclarations() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    _defineFunctionsAB(library);
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search matches
+//    List<SearchMatch> matches = _searchFunctionDeclarationsSync();
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.FUNCTION_DECLARATION, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.FUNCTION_DECLARATION, 10, 20)]);
+//  }
+//
+//  void test_searchFunctionDeclarations_async() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    _defineFunctionsAB(library);
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search matches
+//    List<SearchMatch> matches = _searchFunctionDeclarationsAsync();
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.FUNCTION_DECLARATION, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.FUNCTION_DECLARATION, 10, 20)]);
+//  }
+//
+//  void test_searchFunctionDeclarations_inUniverse() {
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(IndexConstants.UNIVERSE, IndexConstants.DEFINES_FUNCTION, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(IndexConstants.UNIVERSE, IndexConstants.DEFINES_FUNCTION, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    _scope = SearchScopeFactory.createUniverseScope();
+//    // search matches
+//    List<SearchMatch> matches = _searchFunctionDeclarationsSync();
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.FUNCTION_DECLARATION, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.FUNCTION_DECLARATION, 10, 20)]);
+//  }
+//
+//  void test_searchFunctionDeclarations_useFilter() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    _defineFunctionsAB(library);
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search "elementA"
+//    {
+//      _filter = new SearchFilter_SearchEngineImplTest_test_searchFunctionDeclarations_useFilter_2(this);
+//      List<SearchMatch> matches = _searchFunctionDeclarationsSync();
+//      _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.FUNCTION_DECLARATION, 1, 2)]);
+//    }
+//    // search "elementB"
+//    {
+//      _filter = new SearchFilter_SearchEngineImplTest_test_searchFunctionDeclarations_useFilter(this);
+//      List<SearchMatch> matches = _searchFunctionDeclarationsSync();
+//      _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.FUNCTION_DECLARATION, 10, 20)]);
+//    }
+//  }
+//
+//  void test_searchFunctionDeclarations_usePattern() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    _defineFunctionsAB(library);
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search "A"
+//    {
+//      _pattern = SearchPatternFactory.createExactPattern("A", true);
+//      List<SearchMatch> matches = _searchFunctionDeclarationsSync();
+//      _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.FUNCTION_DECLARATION, 1, 2)]);
+//    }
+//    // search "B"
+//    {
+//      _pattern = SearchPatternFactory.createExactPattern("B", true);
+//      List<SearchMatch> matches = _searchFunctionDeclarationsSync();
+//      _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.FUNCTION_DECLARATION, 10, 20)]);
+//    }
+//  }
+//
+//  void test_searchReferences_AngularComponentElement() {
+//    AngularComponentElement referencedElement = _mockElement(AngularComponentElement, ElementKind.ANGULAR_COMPONENT);
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.ANGULAR_REFERENCE, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.ANGULAR_CLOSING_TAG_REFERENCE, 10, 20)]);
+//  }
+//
+//  void test_searchReferences_AngularControllerElement() {
+//    AngularControllerElement referencedElement = _mockElement(AngularControllerElement, ElementKind.ANGULAR_CONTROLLER);
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.ANGULAR_REFERENCE, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.ANGULAR_REFERENCE, 10, 20)]);
+//  }
+//
+//  void test_searchReferences_AngularFilterElement() {
+//    AngularFormatterElement referencedElement = _mockElement(AngularFormatterElement, ElementKind.ANGULAR_FORMATTER);
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.ANGULAR_REFERENCE, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.ANGULAR_REFERENCE, 10, 20)]);
+//  }
+//
+//  void test_searchReferences_AngularPropertyElement() {
+//    AngularPropertyElement referencedElement = _mockElement(AngularPropertyElement, ElementKind.ANGULAR_PROPERTY);
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.ANGULAR_REFERENCE, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.ANGULAR_REFERENCE, 10, 20)]);
+//  }
+//
+//  void test_searchReferences_AngularScopePropertyElement() {
+//    AngularScopePropertyElement referencedElement = _mockElement(AngularScopePropertyElement, ElementKind.ANGULAR_SCOPE_PROPERTY);
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.ANGULAR_REFERENCE, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.ANGULAR_REFERENCE, 10, 20)]);
+//  }
+//
+//  void test_searchReferences_AngularSelectorElement() {
+//    AngularSelectorElement referencedElement = _mockElement(AngularSelectorElement, ElementKind.ANGULAR_SELECTOR);
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.ANGULAR_REFERENCE, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.ANGULAR_REFERENCE, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.ANGULAR_REFERENCE, 10, 20)]);
+//  }
+//
+//  void test_searchReferences_ClassElement() {
+//    ClassElement referencedElement = _mockElement(ClassElement, ElementKind.CLASS);
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.TYPE_REFERENCE, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.TYPE_REFERENCE, 10, 20)]);
+//  }
+//
+//  void test_searchReferences_ClassElement_useScope() {
+//    LibraryElement libraryA = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    LibraryElement libraryB = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    ClassElement referencedElement = _mockElement(ClassElement, ElementKind.CLASS);
+//    {
+//      when(_elementA.getAncestor((element) => element is LibraryElement)).thenReturn(libraryA);
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, locationA);
+//    }
+//    {
+//      when(_elementB.getAncestor((element) => element is LibraryElement)).thenReturn(libraryB);
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches, in "libraryA"
+//    _scope = SearchScopeFactory.createLibraryScope3(libraryA);
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.TYPE_REFERENCE, 1, 2)]);
+//  }
+//
+//  void test_searchReferences_CompilationUnitElement() {
+//    CompilationUnitElement referencedElement = _mockElement(CompilationUnitElement, ElementKind.COMPILATION_UNIT);
+//    {
+//      Location location = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.UNIT_REFERENCE, 1, 2)]);
+//  }
+//
+//  void test_searchReferences_ConstructorElement() {
+//    ConstructorElement referencedElement = _mockElement(ConstructorElement, ElementKind.CONSTRUCTOR);
+//    {
+//      Location location = new Location(_elementA, 10, 1);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_DEFINED_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 20, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementC, 30, 3);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.CONSTRUCTOR_DECLARATION, 10, 1),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.CONSTRUCTOR_REFERENCE, 20, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementC, MatchKind.CONSTRUCTOR_REFERENCE, 30, 3)]);
+//  }
+//
+//  void test_searchReferences_Element_unknown() {
+//    List<SearchMatch> matches = _searchReferencesSync(Element, null);
+//    assertThat(matches).isEmpty();
+//  }
+//
+//  void test_searchReferences_FieldElement() {
+//    PropertyAccessorElement getterElement = _mockElement(PropertyAccessorElement, ElementKind.GETTER);
+//    PropertyAccessorElement setterElement = _mockElement(PropertyAccessorElement, ElementKind.SETTER);
+//    FieldElement fieldElement = _mockElement(FieldElement, ElementKind.FIELD);
+//    when(fieldElement.getter).thenReturn(getterElement);
+//    when(fieldElement.setter).thenReturn(setterElement);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(getterElement, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      _indexStore.recordRelationship(getterElement, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementC, 3, 30);
+//      _indexStore.recordRelationship(setterElement, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementD, 4, 40);
+//      _indexStore.recordRelationship(setterElement, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, fieldElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementA, MatchKind.FIELD_READ, 1, 10, false),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementB, MatchKind.FIELD_READ, 2, 20, true),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementC, MatchKind.FIELD_WRITE, 3, 30, false),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementD, MatchKind.FIELD_WRITE, 4, 40, true)]);
+//  }
+//
+//  void test_searchReferences_FieldElement_invocation() {
+//    PropertyAccessorElement getterElement = _mockElement(PropertyAccessorElement, ElementKind.GETTER);
+//    FieldElement fieldElement = _mockElement(FieldElement, ElementKind.FIELD);
+//    when(fieldElement.getter).thenReturn(getterElement);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(getterElement, IndexConstants.IS_INVOKED_BY_QUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      _indexStore.recordRelationship(getterElement, IndexConstants.IS_INVOKED_BY_UNQUALIFIED, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, fieldElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementA, MatchKind.FIELD_INVOCATION, 1, 10, true),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementB, MatchKind.FIELD_INVOCATION, 2, 20, false)]);
+//  }
+//
+//  void test_searchReferences_FieldElement2() {
+//    FieldElement fieldElement = _mockElement(FieldElement, ElementKind.FIELD);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(fieldElement, IndexConstants.IS_REFERENCED_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      _indexStore.recordRelationship(fieldElement, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, fieldElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementA, MatchKind.FIELD_REFERENCE, 1, 10, false),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementB, MatchKind.FIELD_REFERENCE, 2, 20, true)]);
+//  }
+//
+//  void test_searchReferences_FunctionElement() {
+//    FunctionElement referencedElement = _mockElement(FunctionElement, ElementKind.FUNCTION);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_INVOKED_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.FUNCTION_EXECUTION, 1, 10),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.FUNCTION_REFERENCE, 2, 20)]);
+//  }
+//
+//  void test_searchReferences_ImportElement() {
+//    ImportElement referencedElement = _mockElement(ImportElement, ElementKind.IMPORT);
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 0);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.IMPORT_REFERENCE, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.IMPORT_REFERENCE, 10, 0)]);
+//  }
+//
+//  void test_searchReferences_LibraryElement() {
+//    LibraryElement referencedElement = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    {
+//      Location location = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.LIBRARY_REFERENCE, 1, 2)]);
+//  }
+//
+//  void test_searchReferences_MethodElement() {
+//    MethodElement referencedElement = _mockElement(MethodElement, ElementKind.METHOD);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_INVOKED_BY_UNQUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_INVOKED_BY_QUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementC, 3, 30);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementD, 4, 40);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementA, MatchKind.METHOD_INVOCATION, 1, 10, false),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementB, MatchKind.METHOD_INVOCATION, 2, 20, true),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementC, MatchKind.METHOD_REFERENCE, 3, 30, false),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementD, MatchKind.METHOD_REFERENCE, 4, 40, true)]);
+//  }
+//
+//  void test_searchReferences_MethodMember() {
+//    MethodElement referencedElement = _mockElement(MethodElement, ElementKind.METHOD);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_INVOKED_BY_UNQUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_INVOKED_BY_QUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementC, 3, 30);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementD, 4, 40);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    MethodMember referencedMember = new MethodMember(referencedElement, null);
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedMember);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementA, MatchKind.METHOD_INVOCATION, 1, 10, false),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementB, MatchKind.METHOD_INVOCATION, 2, 20, true),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementC, MatchKind.METHOD_REFERENCE, 3, 30, false),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementD, MatchKind.METHOD_REFERENCE, 4, 40, true)]);
+//  }
+//
+//  void test_searchReferences_notSupported() {
+//    Element referencedElement = _mockElement(Element, ElementKind.UNIVERSE);
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    assertThat(matches).isEmpty();
+//  }
+//
+//  void test_searchReferences_ParameterElement() {
+//    ParameterElement referencedElement = _mockElement(ParameterElement, ElementKind.PARAMETER);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_READ_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_WRITTEN_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementC, 3, 30);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_READ_WRITTEN_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementD, 4, 40);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementD, 5, 50);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_INVOKED_BY, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    // TODO(scheglov) why no MatchKind.FIELD_READ_WRITE ?
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.VARIABLE_READ, 1, 10),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.VARIABLE_WRITE, 2, 20),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementC, MatchKind.VARIABLE_READ_WRITE, 3, 30),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementD, MatchKind.NAMED_PARAMETER_REFERENCE, 4, 40),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementD, MatchKind.FUNCTION_EXECUTION, 5, 50)]);
+//  }
+//
+//  void test_searchReferences_PropertyAccessorElement_getter() {
+//    PropertyAccessorElement accessor = _mockElement(PropertyAccessorElement, ElementKind.GETTER);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(accessor, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      _indexStore.recordRelationship(accessor, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, accessor);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementA, MatchKind.PROPERTY_ACCESSOR_REFERENCE, 1, 10, false),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementB, MatchKind.PROPERTY_ACCESSOR_REFERENCE, 2, 20, true)]);
+//  }
+//
+//  void test_searchReferences_PropertyAccessorElement_setter() {
+//    PropertyAccessorElement accessor = _mockElement(PropertyAccessorElement, ElementKind.SETTER);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(accessor, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      _indexStore.recordRelationship(accessor, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, accessor);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementA, MatchKind.PROPERTY_ACCESSOR_REFERENCE, 1, 10, false),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementB, MatchKind.PROPERTY_ACCESSOR_REFERENCE, 2, 20, true)]);
+//  }
+//
+//  void test_searchReferences_TopLevelVariableElement() {
+//    PropertyAccessorElement getterElement = _mockElement(PropertyAccessorElement, ElementKind.GETTER);
+//    PropertyAccessorElement setterElement = _mockElement(PropertyAccessorElement, ElementKind.SETTER);
+//    TopLevelVariableElement topVariableElement = _mockElement(TopLevelVariableElement, ElementKind.TOP_LEVEL_VARIABLE);
+//    when(topVariableElement.getter).thenReturn(getterElement);
+//    when(topVariableElement.setter).thenReturn(setterElement);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(getterElement, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
+//    }
+//    {
+//      Location location = new Location(_elementC, 2, 20);
+//      _indexStore.recordRelationship(setterElement, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, topVariableElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementA, MatchKind.FIELD_READ, 1, 10, false),
+//        new SearchEngineImplTest_ExpectedMatch.con2(_elementC, MatchKind.FIELD_WRITE, 2, 20, false)]);
+//  }
+//
+//  void test_searchReferences_TypeAliasElement() {
+//    FunctionTypeAliasElement referencedElement = _mockElement(FunctionTypeAliasElement, ElementKind.FUNCTION_TYPE_ALIAS);
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.FUNCTION_TYPE_REFERENCE, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.FUNCTION_TYPE_REFERENCE, 10, 20)]);
+//  }
+//
+//  void test_searchReferences_TypeParameterElement() {
+//    TypeParameterElement referencedElement = _mockElement(TypeParameterElement, ElementKind.TYPE_PARAMETER);
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.TYPE_PARAMETER_REFERENCE, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.TYPE_PARAMETER_REFERENCE, 10, 20)]);
+//  }
+//
+//  void test_searchReferences_VariableElement() {
+//    LocalVariableElement referencedElement = _mockElement(LocalVariableElement, ElementKind.LOCAL_VARIABLE);
+//    {
+//      Location location = new Location(_elementA, 1, 10);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_READ_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementB, 2, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_WRITTEN_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementC, 3, 30);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_READ_WRITTEN_BY, location);
+//    }
+//    {
+//      Location location = new Location(_elementD, 4, 40);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_INVOKED_BY, location);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync(Element, referencedElement);
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.VARIABLE_READ, 1, 10),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.VARIABLE_WRITE, 2, 20),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementC, MatchKind.VARIABLE_READ_WRITE, 3, 30),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementD, MatchKind.FUNCTION_EXECUTION, 4, 40)]);
+//  }
+//
+//  void test_searchSubtypes() {
+//    ClassElement referencedElement = _mockElement(ClassElement, ElementKind.CLASS);
+//    {
+//      Location locationA = new Location(_elementA, 10, 1);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_EXTENDED_BY, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 20, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_MIXED_IN_BY, locationB);
+//    }
+//    {
+//      Location locationC = new Location(_elementC, 30, 3);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_IMPLEMENTED_BY, locationC);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _runSearch(new SearchRunner_SearchEngineImplTest_test_searchSubtypes(this, referencedElement));
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.EXTENDS_REFERENCE, 10, 1),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.WITH_REFERENCE, 20, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementC, MatchKind.IMPLEMENTS_REFERENCE, 30, 3)]);
+//  }
+//
+//  void test_searchTypeDeclarations_async() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    {
+//      when(_elementA.getAncestor((element) => element is LibraryElement)).thenReturn(library);
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(library, IndexConstants.DEFINES_CLASS, locationA);
+//    }
+//    _indexStore.doneIndex();
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search matches
+//    List<SearchMatch> matches = _searchTypeDeclarationsAsync();
+//    // verify
+//    _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.CLASS_DECLARATION, 1, 2)]);
+//  }
+//
+//  void test_searchTypeDeclarations_class() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    {
+//      when(_elementA.getAncestor((element) => element is LibraryElement)).thenReturn(library);
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(library, IndexConstants.DEFINES_CLASS, locationA);
+//    }
+//    _indexStore.doneIndex();
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search matches
+//    List<SearchMatch> matches = _searchTypeDeclarationsSync();
+//    // verify
+//    _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.CLASS_DECLARATION, 1, 2)]);
+//  }
+//
+//  void test_searchTypeDeclarations_classAlias() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    {
+//      when(_elementA.getAncestor((element) => element is LibraryElement)).thenReturn(library);
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(library, IndexConstants.DEFINES_CLASS_ALIAS, locationA);
+//    }
+//    _indexStore.doneIndex();
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search matches
+//    List<SearchMatch> matches = _searchTypeDeclarationsSync();
+//    // verify
+//    _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.CLASS_ALIAS_DECLARATION, 1, 2)]);
+//  }
+//
+//  void test_searchTypeDeclarations_functionType() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    {
+//      when(_elementA.getAncestor((element) => element is LibraryElement)).thenReturn(library);
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(library, IndexConstants.DEFINES_FUNCTION_TYPE, locationA);
+//    }
+//    _indexStore.doneIndex();
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search matches
+//    List<SearchMatch> matches = _searchTypeDeclarationsSync();
+//    // verify
+//    _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.FUNCTION_TYPE_DECLARATION, 1, 2)]);
+//  }
+//
+//  void test_searchUnresolvedQualifiedReferences() {
+//    Element referencedElement = new NameElementImpl("test");
+//    {
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, locationA);
+//    }
+//    {
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(referencedElement, IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, locationB);
+//    }
+//    _indexStore.doneIndex();
+//    // search matches
+//    List<SearchMatch> matches = _searchReferencesSync2("searchQualifiedMemberReferences", String, "test");
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.NAME_REFERENCE_RESOLVED, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.NAME_REFERENCE_UNRESOLVED, 10, 20)]);
+//  }
+//
+//  void test_searchVariableDeclarations() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    _defineVariablesAB(library);
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search matches
+//    List<SearchMatch> matches = _searchVariableDeclarationsSync();
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.VARIABLE_DECLARATION, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.VARIABLE_DECLARATION, 10, 20)]);
+//  }
+//
+//  void test_searchVariableDeclarations_async() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    _defineVariablesAB(library);
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search matches
+//    List<SearchMatch> matches = _searchVariableDeclarationsAsync();
+//    // verify
+//    _assertMatches(matches, [
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.VARIABLE_DECLARATION, 1, 2),
+//        new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.VARIABLE_DECLARATION, 10, 20)]);
+//  }
+//
+//  void test_searchVariableDeclarations_usePattern() {
+//    LibraryElement library = _mockElement(LibraryElement, ElementKind.LIBRARY);
+//    _defineVariablesAB(library);
+//    _scope = new LibrarySearchScope.con2([library]);
+//    // search "A"
+//    {
+//      _pattern = SearchPatternFactory.createExactPattern("A", true);
+//      List<SearchMatch> matches = _searchVariableDeclarationsSync();
+//      _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementA, MatchKind.VARIABLE_DECLARATION, 1, 2)]);
+//    }
+//    // search "B"
+//    {
+//      _pattern = SearchPatternFactory.createExactPattern("B", true);
+//      List<SearchMatch> matches = _searchVariableDeclarationsSync();
+//      _assertMatches(matches, [new SearchEngineImplTest_ExpectedMatch.con1(_elementB, MatchKind.VARIABLE_DECLARATION, 10, 20)]);
+//    }
+//  }
+//
+//  @override
+//  void setUp() {
+//    super.setUp();
+//    // library
+//    when(_unitElement.library).thenReturn(_libraryElement);
+//    when(_libraryElement.definingCompilationUnit).thenReturn(_unitElement);
+//    when(_unitElement.source).thenReturn(_source);
+//    when(_libraryElement.source).thenReturn(_source);
+//    when(_libraryElement.parts).thenReturn(new List<CompilationUnitElement>(0));
+//    // elements
+//    when(_elementA.toString()).thenReturn("A");
+//    when(_elementB.toString()).thenReturn("B");
+//    when(_elementC.toString()).thenReturn("C");
+//    when(_elementD.toString()).thenReturn("D");
+//    when(_elementE.toString()).thenReturn("E");
+//    when(_elementA.displayName).thenReturn("A");
+//    when(_elementB.displayName).thenReturn("B");
+//    when(_elementC.displayName).thenReturn("C");
+//    when(_elementD.displayName).thenReturn("D");
+//    when(_elementE.displayName).thenReturn("E");
+//    when(_elementA.source).thenReturn(_source);
+//    when(_elementB.source).thenReturn(_source);
+//    when(_elementC.source).thenReturn(_source);
+//    when(_elementD.source).thenReturn(_source);
+//    when(_elementE.source).thenReturn(_source);
+//    when(_elementA.context).thenReturn(_CONTEXT);
+//    when(_elementB.context).thenReturn(_CONTEXT);
+//    when(_elementC.context).thenReturn(_CONTEXT);
+//    when(_elementD.context).thenReturn(_CONTEXT);
+//    when(_elementE.context).thenReturn(_CONTEXT);
+//    when(_CONTEXT.getElement(_elementA.location)).thenReturn(_elementA);
+//    when(_CONTEXT.getElement(_elementB.location)).thenReturn(_elementB);
+//    when(_CONTEXT.getElement(_elementC.location)).thenReturn(_elementC);
+//    when(_CONTEXT.getElement(_elementD.location)).thenReturn(_elementD);
+//    when(_CONTEXT.getElement(_elementE.location)).thenReturn(_elementE);
+//    // start indexing
+//    JUnitTestCase.assertTrue(_indexStore.aboutToIndexDart(_CONTEXT, _unitElement));
+//  }
+//
+//  void _defineFunctionsAB(LibraryElement library) {
+//    {
+//      when(_elementA.getAncestor((element) => element is LibraryElement)).thenReturn(library);
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(library, IndexConstants.DEFINES_FUNCTION, locationA);
+//    }
+//    {
+//      when(_elementB.getAncestor((element) => element is LibraryElement)).thenReturn(library);
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(library, IndexConstants.DEFINES_FUNCTION, locationB);
+//    }
+//    _indexStore.doneIndex();
+//  }
+//
+//  void _defineVariablesAB(LibraryElement library) {
+//    {
+//      when(_elementA.getAncestor((element) => element is LibraryElement)).thenReturn(library);
+//      Location locationA = new Location(_elementA, 1, 2);
+//      _indexStore.recordRelationship(library, IndexConstants.DEFINES_VARIABLE, locationA);
+//    }
+//    {
+//      when(_elementB.getAncestor((element) => element is LibraryElement)).thenReturn(library);
+//      Location locationB = new Location(_elementB, 10, 20);
+//      _indexStore.recordRelationship(library, IndexConstants.DEFINES_VARIABLE, locationB);
+//    }
+//    _indexStore.doneIndex();
+//  }
+//
+//  Element _mockElement(Type clazz, ElementKind kind) {
+//    Element element = mock(clazz);
+//    when(element.context).thenReturn(_CONTEXT);
+//    when(element.source).thenReturn(_source);
+//    when(element.kind).thenReturn(kind);
+//    ElementLocation elementLocation = new ElementLocationImpl.con2("mockLocation${_nextLocationId++}");
+//    when(element.location).thenReturn(elementLocation);
+//    when(_CONTEXT.getElement(element.location)).thenReturn(element);
+//    return element;
+//  }
+//
+//  Object _runSearch(SearchEngineImplTest_SearchRunner runner) {
+//    OperationQueue queue = new OperationQueue();
+//    OperationProcessor processor = new OperationProcessor(queue);
+//    Index index = new IndexImpl(_indexStore, queue, processor);
+//    SearchEngine engine = SearchEngineFactory.createSearchEngine(index);
+//    try {
+//      new Thread_SearchEngineImplTest_runSearch(processor).start();
+//      processor.waitForRunning();
+//      return runner.run(queue, processor, index, engine);
+//    } finally {
+//      processor.stop(false);
+//    }
+//  }
+//
+//  List<SearchMatch> _searchDeclarationsAsync(String methodName) => _runSearch(new SearchRunner_SearchEngineImplTest_searchDeclarationsAsync(this, methodName, this, matches, latch));
+//
+//  List<SearchMatch> _searchDeclarationsSync(String methodName) => _runSearch(new SearchRunner_SearchEngineImplTest_searchDeclarationsSync(this, methodName));
+//
+//  List<SearchMatch> _searchFunctionDeclarationsAsync() => _searchDeclarationsAsync("searchFunctionDeclarations");
+//
+//  List<SearchMatch> _searchFunctionDeclarationsSync() => _searchDeclarationsSync("searchFunctionDeclarations");
+//
+//  List<SearchMatch> _searchReferencesSync(Type clazz, Object element) => _searchReferencesSync2("searchReferences", clazz, element);
+//
+//  List<SearchMatch> _searchReferencesSync2(String methodName, Type clazz, Object element) => _runSearch(new SearchRunner_SearchEngineImplTest_searchReferencesSync(this, methodName, clazz, element));
+//
+//  List<SearchMatch> _searchTypeDeclarationsAsync() => _searchDeclarationsAsync("searchTypeDeclarations");
+//
+//  List<SearchMatch> _searchTypeDeclarationsSync() => _searchDeclarationsSync("searchTypeDeclarations");
+//
+//  List<SearchMatch> _searchVariableDeclarationsAsync() => _searchDeclarationsAsync("searchVariableDeclarations");
+//
+//  List<SearchMatch> _searchVariableDeclarationsSync() => _searchDeclarationsSync("searchVariableDeclarations");
+//
+//  static dartSuite() {
+//    _ut.group('SearchEngineImplTest', () {
+//      _ut.test('test_searchDeclarations_String', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchDeclarations_String);
+//      });
+//      _ut.test('test_searchFunctionDeclarations', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchFunctionDeclarations);
+//      });
+//      _ut.test('test_searchFunctionDeclarations_async', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchFunctionDeclarations_async);
+//      });
+//      _ut.test('test_searchFunctionDeclarations_inUniverse', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchFunctionDeclarations_inUniverse);
+//      });
+//      _ut.test('test_searchFunctionDeclarations_useFilter', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchFunctionDeclarations_useFilter);
+//      });
+//      _ut.test('test_searchFunctionDeclarations_usePattern', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchFunctionDeclarations_usePattern);
+//      });
+//      _ut.test('test_searchReferences_AngularComponentElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_AngularComponentElement);
+//      });
+//      _ut.test('test_searchReferences_AngularControllerElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_AngularControllerElement);
+//      });
+//      _ut.test('test_searchReferences_AngularFilterElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_AngularFilterElement);
+//      });
+//      _ut.test('test_searchReferences_AngularPropertyElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_AngularPropertyElement);
+//      });
+//      _ut.test('test_searchReferences_AngularScopePropertyElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_AngularScopePropertyElement);
+//      });
+//      _ut.test('test_searchReferences_AngularSelectorElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_AngularSelectorElement);
+//      });
+//      _ut.test('test_searchReferences_ClassElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_ClassElement);
+//      });
+//      _ut.test('test_searchReferences_ClassElement_useScope', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_ClassElement_useScope);
+//      });
+//      _ut.test('test_searchReferences_CompilationUnitElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_CompilationUnitElement);
+//      });
+//      _ut.test('test_searchReferences_ConstructorElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_ConstructorElement);
+//      });
+//      _ut.test('test_searchReferences_Element_unknown', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_Element_unknown);
+//      });
+//      _ut.test('test_searchReferences_FieldElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_FieldElement);
+//      });
+//      _ut.test('test_searchReferences_FieldElement2', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_FieldElement2);
+//      });
+//      _ut.test('test_searchReferences_FieldElement_invocation', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_FieldElement_invocation);
+//      });
+//      _ut.test('test_searchReferences_FunctionElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_FunctionElement);
+//      });
+//      _ut.test('test_searchReferences_ImportElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_ImportElement);
+//      });
+//      _ut.test('test_searchReferences_LibraryElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_LibraryElement);
+//      });
+//      _ut.test('test_searchReferences_MethodElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_MethodElement);
+//      });
+//      _ut.test('test_searchReferences_MethodMember', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_MethodMember);
+//      });
+//      _ut.test('test_searchReferences_ParameterElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_ParameterElement);
+//      });
+//      _ut.test('test_searchReferences_PropertyAccessorElement_getter', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_PropertyAccessorElement_getter);
+//      });
+//      _ut.test('test_searchReferences_PropertyAccessorElement_setter', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_PropertyAccessorElement_setter);
+//      });
+//      _ut.test('test_searchReferences_TopLevelVariableElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_TopLevelVariableElement);
+//      });
+//      _ut.test('test_searchReferences_TypeAliasElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_TypeAliasElement);
+//      });
+//      _ut.test('test_searchReferences_TypeParameterElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_TypeParameterElement);
+//      });
+//      _ut.test('test_searchReferences_VariableElement', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_VariableElement);
+//      });
+//      _ut.test('test_searchReferences_notSupported', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchReferences_notSupported);
+//      });
+//      _ut.test('test_searchSubtypes', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchSubtypes);
+//      });
+//      _ut.test('test_searchTypeDeclarations_async', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchTypeDeclarations_async);
+//      });
+//      _ut.test('test_searchTypeDeclarations_class', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchTypeDeclarations_class);
+//      });
+//      _ut.test('test_searchTypeDeclarations_classAlias', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchTypeDeclarations_classAlias);
+//      });
+//      _ut.test('test_searchTypeDeclarations_functionType', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchTypeDeclarations_functionType);
+//      });
+//      _ut.test('test_searchUnresolvedQualifiedReferences', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchUnresolvedQualifiedReferences);
+//      });
+//      _ut.test('test_searchVariableDeclarations', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchVariableDeclarations);
+//      });
+//      _ut.test('test_searchVariableDeclarations_async', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchVariableDeclarations_async);
+//      });
+//      _ut.test('test_searchVariableDeclarations_usePattern', () {
+//        final __test = new SearchEngineImplTest();
+//        runJUnitTest(__test, __test.test_searchVariableDeclarations_usePattern);
+//      });
+//    });
+//  }
+//}
+//
+//class SearchEngineImplTest_ExpectedMatch {
+//  final Element _element;
+//
+//  final MatchKind _kind;
+//
+//  final MatchQuality _quality;
+//
+//  SourceRange _range;
+//
+//  final bool _qualified;
+//
+//  SearchEngineImplTest_ExpectedMatch.con1(Element element, MatchKind kind, int offset, int length) : this.con3(element, kind, MatchQuality.EXACT, offset, length);
+//
+//  SearchEngineImplTest_ExpectedMatch.con2(Element element, MatchKind kind, int offset, int length, bool qualified) : this.con4(element, kind, MatchQuality.EXACT, offset, length, qualified);
+//
+//  SearchEngineImplTest_ExpectedMatch.con3(Element element, MatchKind kind, MatchQuality quality, int offset, int length) : this.con4(element, kind, quality, offset, length, false);
+//
+//  SearchEngineImplTest_ExpectedMatch.con4(this._element, this._kind, this._quality, int offset, int length, this._qualified) {
+//    this._range = new SourceRange(offset, length);
+//  }
+//}
+//
+//abstract class SearchEngineImplTest_SearchRunner<T> {
+//  T run(OperationQueue queue, OperationProcessor processor, Index index, SearchEngine engine);
+//}
+//
+//class SearchFilter_SearchEngineImplTest_test_searchFunctionDeclarations_useFilter implements SearchFilter {
+//  final SearchEngineImplTest SearchEngineImplTest_this;
+//
+//  SearchFilter_SearchEngineImplTest_test_searchFunctionDeclarations_useFilter(this.SearchEngineImplTest_this);
+//
+//  @override
+//  bool passes(SearchMatch match) => identical(match.element, SearchEngineImplTest_this._elementB);
+//}
+//
+//class SearchFilter_SearchEngineImplTest_test_searchFunctionDeclarations_useFilter_2 implements SearchFilter {
+//  final SearchEngineImplTest SearchEngineImplTest_this;
+//
+//  SearchFilter_SearchEngineImplTest_test_searchFunctionDeclarations_useFilter_2(this.SearchEngineImplTest_this);
+//
+//  @override
+//  bool passes(SearchMatch match) => identical(match.element, SearchEngineImplTest_this._elementA);
+//}
+//
+//class SearchListener_SearchRunner_117_run implements SearchListener {
+//  List<SearchMatch> matches;
+//
+//  CountDownLatch latch;
+//
+//  SearchListener_SearchRunner_117_run(this.matches, this.latch);
+//
+//  @override
+//  void matchFound(SearchMatch match) {
+//    matches.add(match);
+//  }
+//
+//  @override
+//  void searchComplete() {
+//    latch.countDown();
+//  }
+//}
+//
+//class SearchRunner_SearchEngineImplTest_fail_searchAssignedTypes_assignments implements SearchEngineImplTest_SearchRunner {
+//  FieldElement fieldElement;
+//
+//  SearchRunner_SearchEngineImplTest_fail_searchAssignedTypes_assignments(this.fieldElement, this.fieldElement);
+//
+//  @override
+//  Set<DartType> run(OperationQueue queue, OperationProcessor processor, Index index, SearchEngine engine) => engine.searchAssignedTypes(fieldElement, new SearchScope_SearchRunner_109_run());
+//}
+//
+//class SearchRunner_SearchEngineImplTest_fail_searchAssignedTypes_initializers implements SearchEngineImplTest_SearchRunner {
+//  FieldElement fieldElement;
+//
+//  SearchRunner_SearchEngineImplTest_fail_searchAssignedTypes_initializers(this.fieldElement);
+//
+//  @override
+//  Set<DartType> run(OperationQueue queue, OperationProcessor processor, Index index, SearchEngine engine) => engine.searchAssignedTypes(fieldElement, null);
+//}
+//
+//class SearchRunner_SearchEngineImplTest_searchDeclarationsAsync implements SearchEngineImplTest_SearchRunner {
+//  final SearchEngineImplTest SearchEngineImplTest_this;
+//
+//  String methodName;
+//
+//  final SearchEngineImplTest SearchEngineImplTest_this;
+//
+//  List<SearchMatch> matches;
+//
+//  CountDownLatch latch;
+//
+//  SearchRunner_SearchEngineImplTest_searchDeclarationsAsync(this.SearchEngineImplTest_this, this.methodName, this.SearchEngineImplTest_this, this.matches, this.latch, this.SearchEngineImplTest_this, this.methodName, this.SearchEngineImplTest_this, this.matches, this.latch);
+//
+//  @override
+//  List<SearchMatch> run(OperationQueue queue, OperationProcessor processor, Index index, SearchEngine engine) {
+//    CountDownLatch latch = new CountDownLatch(1);
+//    List<SearchMatch> matches = [];
+//    engine.runtimeType.getMethod(methodName, [SearchScope, SearchPattern, SearchFilter, SearchListener]).invoke(engine, [
+//        SearchEngineImplTest_this._scope,
+//        SearchEngineImplTest_this._pattern,
+//        SearchEngineImplTest_this._filter,
+//        new SearchListener_SearchRunner_117_run(matches, latch)]);
+//    latch.await(30, TimeUnit.SECONDS);
+//    return matches;
+//  }
+//}
+//
+//class SearchRunner_SearchEngineImplTest_searchDeclarationsSync implements SearchEngineImplTest_SearchRunner {
+//  final SearchEngineImplTest SearchEngineImplTest_this;
+//
+//  String methodName;
+//
+//  SearchRunner_SearchEngineImplTest_searchDeclarationsSync(this.SearchEngineImplTest_this, this.methodName);
+//
+//  @override
+//  List<SearchMatch> run(OperationQueue queue, OperationProcessor processor, Index index, SearchEngine engine) => engine.runtimeType.getMethod(methodName, [SearchScope, SearchPattern, SearchFilter]).invoke(engine, [
+//      SearchEngineImplTest_this._scope,
+//      SearchEngineImplTest_this._pattern,
+//      SearchEngineImplTest_this._filter]) as List<SearchMatch>;
+//}
+//
+//class SearchRunner_SearchEngineImplTest_searchReferencesSync implements SearchEngineImplTest_SearchRunner {
+//  final SearchEngineImplTest SearchEngineImplTest_this;
+//
+//  String methodName;
+//
+//  Type clazz;
+//
+//  Object element;
+//
+//  SearchRunner_SearchEngineImplTest_searchReferencesSync(this.SearchEngineImplTest_this, this.methodName, this.clazz, this.element);
+//
+//  @override
+//  List<SearchMatch> run(OperationQueue queue, OperationProcessor processor, Index index, SearchEngine engine) {
+//    // pass some operation to wait if search will not call processor
+//    queue.enqueue(mock(IndexOperation));
+//    // run actual search
+//    return engine.runtimeType.getMethod(methodName, [clazz, SearchScope, SearchFilter]).invoke(engine, [
+//        element,
+//        SearchEngineImplTest_this._scope,
+//        SearchEngineImplTest_this._filter]) as List<SearchMatch>;
+//  }
+//}
+//
+//class SearchRunner_SearchEngineImplTest_test_searchDeclarations_String implements SearchEngineImplTest_SearchRunner {
+//  final SearchEngineImplTest SearchEngineImplTest_this;
+//
+//  SearchRunner_SearchEngineImplTest_test_searchDeclarations_String(this.SearchEngineImplTest_this);
+//
+//  @override
+//  List<SearchMatch> run(OperationQueue queue, OperationProcessor processor, Index index, SearchEngine engine) => engine.searchDeclarations("test", SearchEngineImplTest_this._scope, SearchEngineImplTest_this._filter);
+//}
+//
+//class SearchRunner_SearchEngineImplTest_test_searchSubtypes implements SearchEngineImplTest_SearchRunner {
+//  final SearchEngineImplTest SearchEngineImplTest_this;
+//
+//  ClassElement referencedElement;
+//
+//  SearchRunner_SearchEngineImplTest_test_searchSubtypes(this.SearchEngineImplTest_this, this.referencedElement);
+//
+//  @override
+//  List<SearchMatch> run(OperationQueue queue, OperationProcessor processor, Index index, SearchEngine engine) => engine.searchSubtypes(referencedElement, SearchEngineImplTest_this._scope, SearchEngineImplTest_this._filter);
+//}
+//
+//class SearchScope_SearchRunner_109_run implements SearchScope {
+//  @override
+//  bool encloses(Element element) => !identical(element, _elementC);
+//}
+//
+//class Thread_SearchEngineImplTest_runSearch extends Thread {
+//  OperationProcessor processor;
+//
+//  Thread_SearchEngineImplTest_runSearch(this.processor) : super();
+//
+//  @override
+//  void run() {
+//    processor.run();
+//  }
+//}
+//
+//class UniverseSearchScopeTest extends EngineTestCase {
+//  SearchScope _scope = new UniverseSearchScope();
+//
+//  Element _element = mock(Element);
+//
+//  void test_anyElement() {
+//    JUnitTestCase.assertTrue(_scope.encloses(_element));
+//  }
+//
+//  void test_nullElement() {
+//    JUnitTestCase.assertTrue(_scope.encloses(null));
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('UniverseSearchScopeTest', () {
+//      _ut.test('test_anyElement', () {
+//        final __test = new UniverseSearchScopeTest();
+//        runJUnitTest(__test, __test.test_anyElement);
+//      });
+//      _ut.test('test_nullElement', () {
+//        final __test = new UniverseSearchScopeTest();
+//        runJUnitTest(__test, __test.test_nullElement);
+//      });
+//    });
+//  }
+//}
+//
+//class WildcardSearchPatternTest extends EngineTestCase {
+//  Element _element = mock(Element);
+//
+//  void test_caseInsensitive_false_contentMismatch() {
+//    SearchPattern pattern = new WildcardSearchPattern("H*Map", false);
+//    when(_element.displayName).thenReturn("Maps");
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  void test_caseInsensitive_true_caseMismatch() {
+//    SearchPattern pattern = new WildcardSearchPattern("H*MaP", false);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(_element));
+//  }
+//
+//  void test_caseSensitive_false_caseMismatch() {
+//    SearchPattern pattern = new WildcardSearchPattern("H*MaP", true);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  void test_caseSensitive_false_contentMismatch() {
+//    SearchPattern pattern = new WildcardSearchPattern("H*Map", false);
+//    when(_element.displayName).thenReturn("Maps");
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  void test_caseSensitive_true() {
+//    SearchPattern pattern = new WildcardSearchPattern("H*Ma?", false);
+//    when(_element.displayName).thenReturn("HashMap");
+//    // validate
+//    JUnitTestCase.assertSame(MatchQuality.EXACT, pattern.matches(_element));
+//  }
+//
+//  void test_nullElement() {
+//    SearchPattern pattern = new WildcardSearchPattern("H*Map", false);
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(null));
+//  }
+//
+//  void test_nullName() {
+//    SearchPattern pattern = new WildcardSearchPattern("H*Map", false);
+//    when(_element.displayName).thenReturn(null);
+//    // validate
+//    JUnitTestCase.assertSame(null, pattern.matches(_element));
+//  }
+//
+//  static dartSuite() {
+//    _ut.group('WildcardSearchPatternTest', () {
+//      _ut.test('test_caseInsensitive_false_contentMismatch', () {
+//        final __test = new WildcardSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseInsensitive_false_contentMismatch);
+//      });
+//      _ut.test('test_caseInsensitive_true_caseMismatch', () {
+//        final __test = new WildcardSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseInsensitive_true_caseMismatch);
+//      });
+//      _ut.test('test_caseSensitive_false_caseMismatch', () {
+//        final __test = new WildcardSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseSensitive_false_caseMismatch);
+//      });
+//      _ut.test('test_caseSensitive_false_contentMismatch', () {
+//        final __test = new WildcardSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseSensitive_false_contentMismatch);
+//      });
+//      _ut.test('test_caseSensitive_true', () {
+//        final __test = new WildcardSearchPatternTest();
+//        runJUnitTest(__test, __test.test_caseSensitive_true);
+//      });
+//      _ut.test('test_nullElement', () {
+//        final __test = new WildcardSearchPatternTest();
+//        runJUnitTest(__test, __test.test_nullElement);
+//      });
+//      _ut.test('test_nullName', () {
+//        final __test = new WildcardSearchPatternTest();
+//        runJUnitTest(__test, __test.test_nullName);
+//      });
+//    });
+//  }
+//}
+//
+//main() {
+//  CountingSearchListenerTest.dartSuite();
+//  FilterSearchListenerTest.dartSuite();
+//  GatheringSearchListenerTest.dartSuite();
+//  NameMatchingSearchListenerTest.dartSuite();
+//  LibrarySearchScopeTest.dartSuite();
+//  UniverseSearchScopeTest.dartSuite();
+//  SearchEngineImplTest.dartSuite();
+//  AndSearchPatternTest.dartSuite();
+//  CamelCaseSearchPatternTest.dartSuite();
+//  ExactSearchPatternTest.dartSuite();
+//  OrSearchPatternTest.dartSuite();
+//  PrefixSearchPatternTest.dartSuite();
+//  RegularExpressionSearchPatternTest.dartSuite();
+//  WildcardSearchPatternTest.dartSuite();
+//}
diff --git a/pkg/analysis_services/test/test_all.dart b/pkg/analysis_services/test/test_all.dart
index fb22086..ee8b415 100644
--- a/pkg/analysis_services/test/test_all.dart
+++ b/pkg/analysis_services/test/test_all.dart
@@ -4,8 +4,10 @@
 
 import 'package:unittest/unittest.dart';
 
+import 'index/test_all.dart' as index_all;
+
 /// Utility for manually running all tests.
 main() {
-//  group('analysis_services', () {
-//  });
+  groupSep = ' | ';
+  index_all.main();
 }
\ No newline at end of file
diff --git a/pkg/analysis_testing/LICENSE b/pkg/analysis_testing/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/pkg/analysis_testing/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_testing/lib/abstract_context.dart
similarity index 79%
rename from pkg/analysis_server/test/abstract_context.dart
rename to pkg/analysis_testing/lib/abstract_context.dart
index b1e5a51..fe2b740 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_testing/lib/abstract_context.dart
@@ -2,26 +2,24 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.index;
+library testing.abstract_context;
 
-import 'package:analysis_server/src/resource.dart';
+import 'package:analysis_testing/mock_sdk.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 
-import 'mocks.dart';
-import 'reflective_tests.dart';
-
 
 /**
- * Finds an [engine.Element] with the given [name].
+ * Finds an [Element] with the given [name].
  */
-Element findElementInUnit(CompilationUnit unit, String name, [ElementKind kind])
-    {
+Element findChildElement(Element root, String name, [ElementKind kind]) {
   Element result = null;
-  unit.element.accept(new _ElementVisitorFunctionWrapper((Element element) {
+  root.accept(new _ElementVisitorFunctionWrapper((Element element) {
     if (element.name != name) {
       return;
     }
@@ -40,12 +38,11 @@
 typedef void _ElementVisitorFunction(Element element);
 
 
-@ReflectiveTestCase()
 class AbstractContextTest {
   static final DartSdk SDK = new MockSdk();
 
-  AnalysisContext context;
   MemoryResourceProvider provider = new MemoryResourceProvider();
+  AnalysisContext context;
 
   Source addSource(String path, String content) {
     File file = provider.newFile(path, content);
@@ -57,6 +54,10 @@
     return source;
   }
 
+  CompilationUnit resolveDartUnit(Source unitSource, Source librarySource) {
+    return context.resolveCompilationUnit2(unitSource, librarySource);
+  }
+
   CompilationUnit resolveLibraryUnit(Source source) {
     return context.resolveCompilationUnit2(source, source);
   }
diff --git a/pkg/analysis_testing/lib/mock_sdk.dart b/pkg/analysis_testing/lib/mock_sdk.dart
new file mode 100644
index 0000000..05251ab
--- /dev/null
+++ b/pkg/analysis_testing/lib/mock_sdk.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library testing.mock_sdk;
+
+import 'package:analyzer/file_system/file_system.dart' as resource;
+import 'package:analyzer/file_system/memory_file_system.dart' as resource;
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+class MockSdk implements DartSdk {
+  final resource.MemoryResourceProvider provider =
+      new resource.MemoryResourceProvider();
+
+  MockSdk() {
+    // TODO(paulberry): Add to this as needed.
+    const Map<String, String> pathToContent = const {
+      "/lib/core/core.dart": '''
+          library dart.core;
+          class Object {}
+          class Function {}
+          class StackTrace {}
+          class Symbol {}
+          class Type {}
+
+          class String extends Object {}
+          class bool extends Object {}
+          abstract class num extends Object {
+            num operator +(num other);
+            num operator -(num other);
+            num operator *(num other);
+            num operator /(num other);
+          }
+          abstract class int extends num {
+            int operator -();
+          }
+          class double extends num {}
+          class DateTime extends Object {}
+          class Null extends Object {}
+
+          class Deprecated extends Object {
+            final String expires;
+            const Deprecated(this.expires);
+          }
+          const Object deprecated = const Deprecated("next release");
+
+          abstract class List<E> extends Object {
+            void add(E value);
+            E operator [](int index);
+            void operator []=(int index, E value);
+          }
+          class Map<K, V> extends Object {}
+
+          void print(Object object) {}
+          ''',
+
+      "/lib/html/dartium/html_dartium.dart": '''
+          library dart.html;
+          class HtmlElement {}
+          ''',
+
+      "/lib/math/math.dart": '''
+          library dart.math;
+          '''
+    };
+
+    pathToContent.forEach((String path, String content) {
+      provider.newFile(path, content);
+    });
+  }
+
+  // Not used
+  @override
+  AnalysisContext get context => throw unimplemented;
+
+  @override
+  List<SdkLibrary> get sdkLibraries => throw unimplemented;
+
+  @override
+  String get sdkVersion => throw unimplemented;
+
+  UnimplementedError get unimplemented => new UnimplementedError();
+
+  @override
+  List<String> get uris => throw unimplemented;
+
+  // Not used.
+  @override
+  Source fromEncoding(UriKind kind, Uri uri) {
+    resource.Resource file = provider.getResource(uri.path);
+    if (file is resource.File) {
+      return file.createSource(kind);
+    }
+    return null;
+  }
+
+  // Not used.
+  @override
+  SdkLibrary getSdkLibrary(String dartUri) {
+    // getSdkLibrary() is only used to determine whether a library is internal
+    // to the SDK.  The mock SDK doesn't have any internals, so it's safe to
+    // return null.
+    return null;
+  }
+
+  // Not used.
+  @override
+  Source mapDartUri(String dartUri) {
+    const Map<String, String> uriToPath = const {
+      "dart:core": "/lib/core/core.dart",
+      "dart:html": "/lib/html/dartium/html_dartium.dart",
+      "dart:math": "/lib/math/math.dart"
+    };
+
+    String path = uriToPath[dartUri];
+    if (path != null) {
+      resource.File file = provider.getResource(path);
+      return file.createSource(UriKind.DART_URI);
+    }
+
+    // If we reach here then we tried to use a dartUri that's not in the
+    // table above.
+    throw unimplemented;
+  }
+}
diff --git a/pkg/analysis_testing/lib/mocks.dart b/pkg/analysis_testing/lib/mocks.dart
new file mode 100644
index 0000000..80aed86
--- /dev/null
+++ b/pkg/analysis_testing/lib/mocks.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library testing.mocks;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:typed_mock/typed_mock.dart';
+
+
+class MockAnalysisContext extends StringTypedMock implements AnalysisContext {
+  MockAnalysisContext(String name) : super(name);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockCompilationUnitElement extends TypedMock implements
+    CompilationUnitElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockElement extends StringTypedMock implements Element {
+  MockElement([String name = '<element>']) : super(name);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockHtmlElement extends TypedMock implements HtmlElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockLibraryElement extends TypedMock implements LibraryElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockLogger extends TypedMock implements Logger {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockSource extends StringTypedMock implements Source {
+  MockSource([String name = 'mocked.dart']) : super(name);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class StringTypedMock extends TypedMock {
+  String _toString;
+
+  StringTypedMock(this._toString);
+
+  @override
+  String toString() {
+    if (_toString != null) {
+      return _toString;
+    }
+    return super.toString();
+  }
+}
diff --git a/pkg/analysis_server/test/reflective_tests.dart b/pkg/analysis_testing/lib/reflective_tests.dart
similarity index 98%
rename from pkg/analysis_server/test/reflective_tests.dart
rename to pkg/analysis_testing/lib/reflective_tests.dart
index 5cfef6a..cdb617c 100644
--- a/pkg/analysis_server/test/reflective_tests.dart
+++ b/pkg/analysis_testing/lib/reflective_tests.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library reflective.tests;
+library reflective_tests;
 
 import 'dart:async';
 
diff --git a/pkg/analysis_testing/pubspec.yaml b/pkg/analysis_testing/pubspec.yaml
new file mode 100644
index 0000000..f064788
--- /dev/null
+++ b/pkg/analysis_testing/pubspec.yaml
@@ -0,0 +1,11 @@
+name: analysis_testing
+version: 0.2.0
+author: Dart Team <misc@dartlang.org>
+description: A set of libraries for testing Analysis services and server
+homepage: http://www.dartlang.org
+environment:
+  sdk: '>=1.0.0 <2.0.0'
+dependencies:
+  analyzer: '>=0.21.0 <1.0.0'
+  typed_mock: '>=0.0.4 <1.0.0'
+  unittest: '>=0.10.0 <0.12.0'
diff --git a/tests/compiler/dart2js_native/lru_test.dart b/pkg/analysis_testing/test/test_all.dart
similarity index 62%
rename from tests/compiler/dart2js_native/lru_test.dart
rename to pkg/analysis_testing/test/test_all.dart
index f5c5200..a6c2ed2 100644
--- a/tests/compiler/dart2js_native/lru_test.dart
+++ b/pkg/analysis_testing/test/test_all.dart
@@ -2,9 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:_internal" show LRUMap;
-import "../../lib/mirrors/lru_expect.dart";
+//import 'package:unittest/unittest.dart';
 
+/// Utility for manually running all tests.
 main() {
-  expect((shift) => new LRUMap.withShift(shift));
-}
+//  group('analysis_services', () {
+//  });
+}
\ No newline at end of file
diff --git a/pkg/analyzer/lib/file_system/file_system.dart b/pkg/analyzer/lib/file_system/file_system.dart
new file mode 100644
index 0000000..d97b595
--- /dev/null
+++ b/pkg/analyzer/lib/file_system/file_system.dart
@@ -0,0 +1,147 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library file_system;
+
+import 'dart:async';
+
+import 'package:analyzer/src/generated/source.dart';
+import 'package:path/path.dart';
+import 'package:watcher/watcher.dart';
+
+
+/**
+ * [File]s are leaf [Resource]s which contain data.
+ */
+abstract class File extends Resource {
+  /**
+   * Create a new [Source] instance that serves this file.
+   */
+  Source createSource(UriKind uriKind);
+}
+
+
+/**
+ * [Folder]s are [Resource]s which may contain files and/or other folders.
+ */
+abstract class Folder extends Resource {
+  /**
+   * Watch for changes to the files inside this folder (and in any nested
+   * folders, including folders reachable via links).
+   */
+  Stream<WatchEvent> get changes;
+
+  /**
+   * If the path [path] is a relative path, convert it to an absolute path
+   * by interpreting it relative to this folder.  If it is already an aboslute
+   * path, then don't change it.
+   *
+   * However, regardless of whether [path] is relative or absolute, normalize
+   * it by removing path components of the form '.' or '..'.
+   */
+  String canonicalizePath(String path);
+
+  /**
+   * Return an existing child [Resource] with the given [relPath].
+   * Return a not existing [File] if no such child exist.
+   */
+  Resource getChild(String relPath);
+
+  /**
+   * Return a list of existing direct children [Resource]s (folders and files)
+   * in this folder, in no particular order.
+   */
+  List<Resource> getChildren();
+}
+
+
+/**
+ * The abstract class [Resource] is an abstraction of file or folder.
+ */
+abstract class Resource {
+  /**
+   * Return `true` if this resource exists.
+   */
+  bool get exists;
+
+  /**
+   * Return the [Folder] that contains this resource, or `null` if this resource
+   * is a root folder.
+   */
+  Folder get parent;
+
+  /**
+   * Return the full path to this resource.
+   */
+  String get path;
+
+  /**
+   * Return a short version of the name that can be displayed to the user to
+   * denote this resource.
+   */
+  String get shortName;
+}
+
+
+/**
+ * Instances of the class [ResourceProvider] convert [String] paths into
+ * [Resource]s.
+ */
+abstract class ResourceProvider {
+  /**
+   * Get the path context used by this resource provider.
+   */
+  Context get pathContext;
+
+  /**
+   * Return the [Resource] that corresponds to the given [path].
+   */
+  Resource getResource(String path);
+}
+
+
+/**
+ * A [UriResolver] for [Resource]s.
+ */
+class ResourceUriResolver extends UriResolver {
+  /**
+   * The name of the `file` scheme.
+   */
+  static String _FILE_SCHEME = "file";
+
+  final ResourceProvider _provider;
+
+  ResourceUriResolver(this._provider);
+
+  @override
+  Source fromEncoding(UriKind kind, Uri uri) {
+    if (kind == UriKind.FILE_URI) {
+      Resource resource = _provider.getResource(uri.path);
+      if (resource is File) {
+        return resource.createSource(kind);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri) {
+    if (!_isFileUri(uri)) {
+      return null;
+    }
+    Resource resource = _provider.getResource(uri.path);
+    if (resource is File) {
+      return resource.createSource(UriKind.FILE_URI);
+    }
+    return null;
+  }
+
+  /**
+   * Return `true` if the given URI is a `file` URI.
+   *
+   * @param uri the URI being tested
+   * @return `true` if the given URI is a `file` URI
+   */
+  static bool _isFileUri(Uri uri) => uri.scheme == _FILE_SCHEME;
+}
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
new file mode 100644
index 0000000..b9c70e4
--- /dev/null
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -0,0 +1,341 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library memory_file_system;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart';
+import 'package:watcher/watcher.dart';
+
+import 'file_system.dart';
+
+
+/**
+ * Exception thrown when a memory [Resource] file operation fails.
+ */
+class MemoryResourceException {
+  final path;
+  final message;
+
+  MemoryResourceException(this.path, this.message);
+
+  @override
+  String toString() {
+    return "MemoryResourceException(path=$path; message=$message)";
+  }
+}
+
+
+/**
+ * An in-memory implementation of [ResourceProvider].
+ * Use `/` as a path separator.
+ */
+class MemoryResourceProvider implements ResourceProvider {
+  final Map<String, _MemoryResource> _pathToResource =
+      new HashMap<String, _MemoryResource>();
+  final Map<String, String> _pathToContent = new HashMap<String, String>();
+  final Map<String, int> _pathToTimestamp = new HashMap<String, int>();
+  final Map<String, List<StreamController<WatchEvent>>> _pathToWatchers =
+      new HashMap<String, List<StreamController<WatchEvent>>>();
+  int nextStamp = 0;
+
+  @override
+  Context get pathContext => posix;
+
+  void deleteFile(String path) {
+    _checkFileAtPath(path);
+    _pathToResource.remove(path);
+    _pathToContent.remove(path);
+    _pathToTimestamp.remove(path);
+    _notifyWatchers(path, ChangeType.REMOVE);
+  }
+
+  @override
+  Resource getResource(String path) {
+    path = posix.normalize(path);
+    Resource resource = _pathToResource[path];
+    if (resource == null) {
+      resource = new _MemoryFile(this, path);
+    }
+    return resource;
+  }
+
+  void modifyFile(String path, String content) {
+    _checkFileAtPath(path);
+    _pathToContent[path] = content;
+    _pathToTimestamp[path] = nextStamp++;
+    _notifyWatchers(path, ChangeType.MODIFY);
+  }
+
+  /**
+   * Create a resource representing a dummy link (that is, a File object which
+   * appears in its parent directory, but whose `exists` property is false)
+   */
+  File newDummyLink(String path) {
+    path = posix.normalize(path);
+    newFolder(posix.dirname(path));
+    _MemoryDummyLink link = new _MemoryDummyLink(this, path);
+    _pathToResource[path] = link;
+    _pathToTimestamp[path] = nextStamp++;
+    _notifyWatchers(path, ChangeType.ADD);
+    return link;
+  }
+
+  File newFile(String path, String content) {
+    path = posix.normalize(path);
+    newFolder(posix.dirname(path));
+    _MemoryFile file = new _MemoryFile(this, path);
+    _pathToResource[path] = file;
+    _pathToContent[path] = content;
+    _pathToTimestamp[path] = nextStamp++;
+    _notifyWatchers(path, ChangeType.ADD);
+    return file;
+  }
+
+  Folder newFolder(String path) {
+    path = posix.normalize(path);
+    if (!path.startsWith('/')) {
+      throw new ArgumentError("Path must start with '/'");
+    }
+    _MemoryResource resource = _pathToResource[path];
+    if (resource == null) {
+      String parentPath = posix.dirname(path);
+      if (parentPath != path) {
+        newFolder(parentPath);
+      }
+      _MemoryFolder folder = new _MemoryFolder(this, path);
+      _pathToResource[path] = folder;
+      _pathToTimestamp[path] = nextStamp++;
+      return folder;
+    } else if (resource is _MemoryFolder) {
+      return resource;
+    } else {
+      String message = 'Folder expected at '
+                       "'$path'"
+                       'but ${resource.runtimeType} found';
+      throw new ArgumentError(message);
+    }
+  }
+
+  void _checkFileAtPath(String path) {
+    _MemoryResource resource = _pathToResource[path];
+    if (resource is! _MemoryFile) {
+      throw new ArgumentError(
+          'File expected at "$path" but ${resource.runtimeType} found');
+    }
+  }
+
+  void _notifyWatchers(String path, ChangeType changeType) {
+    _pathToWatchers.forEach((String watcherPath, List<StreamController<WatchEvent>> streamControllers) {
+      if (posix.isWithin(watcherPath, path)) {
+        for (StreamController<WatchEvent> streamController in streamControllers) {
+          streamController.add(new WatchEvent(changeType, path));
+        }
+      }
+    });
+  }
+}
+
+
+/**
+ * An in-memory implementation of [File] which acts like a symbolic link to a
+ * non-existent file.
+ */
+class _MemoryDummyLink extends _MemoryResource implements File {
+  _MemoryDummyLink(MemoryResourceProvider provider, String path) :
+      super(provider, path);
+
+  @override
+  bool get exists => false;
+
+  String get _content {
+    throw new MemoryResourceException(path, "File '$path' could not be read");
+  }
+
+  int get _timestamp => _provider._pathToTimestamp[path];
+
+  @override
+  Source createSource(UriKind uriKind) {
+    throw new MemoryResourceException(path, "File '$path' could not be read");
+  }
+}
+
+
+/**
+ * An in-memory implementation of [File].
+ */
+class _MemoryFile extends _MemoryResource implements File {
+  _MemoryFile(MemoryResourceProvider provider, String path) :
+      super(provider, path);
+
+  String get _content {
+    String content = _provider._pathToContent[path];
+    if (content == null) {
+      throw new MemoryResourceException(path, "File '$path' does not exist");
+    }
+    return content;
+  }
+
+  int get _timestamp => _provider._pathToTimestamp[path];
+
+  @override
+  Source createSource(UriKind uriKind) {
+    return new _MemoryFileSource(this, uriKind);
+  }
+}
+
+
+/**
+ * An in-memory implementation of [Source].
+ */
+class _MemoryFileSource implements Source {
+  final _MemoryFile _file;
+
+  final UriKind uriKind;
+
+  _MemoryFileSource(this._file, this.uriKind);
+
+  @override
+  TimestampedData<String> get contents {
+    return new TimestampedData<String>(modificationStamp, _file._content);
+  }
+
+  @override
+  String get encoding {
+    return '${new String.fromCharCode(uriKind.encoding)}${_file.path}';
+  }
+
+  @override
+  String get fullName => _file.path;
+
+  @override
+  int get hashCode => _file.hashCode;
+
+  @override
+  bool get isInSystemLibrary => false;
+
+  @override
+  int get modificationStamp => _file._timestamp;
+
+  @override
+  String get shortName => _file.shortName;
+
+  @override
+  bool operator ==(other) {
+    if (other is _MemoryFileSource) {
+      return other._file == _file;
+    }
+    return false;
+  }
+
+  @override
+  bool exists() => _file.exists;
+
+  @override
+  Source resolveRelative(Uri relativeUri) {
+    String relativePath = posix.fromUri(relativeUri);
+    String folderPath = posix.dirname(_file.path);
+    String path = posix.join(folderPath, relativePath);
+    path = posix.normalize(path);
+    _MemoryFile file = new _MemoryFile(_file._provider, path);
+    return new _MemoryFileSource(file, uriKind);
+  }
+}
+
+
+/**
+ * An in-memory implementation of [Folder].
+ */
+class _MemoryFolder extends _MemoryResource implements Folder {
+  _MemoryFolder(MemoryResourceProvider provider, String path) :
+      super(provider, path);
+  @override
+  Stream<WatchEvent> get changes {
+    StreamController<WatchEvent> streamController = new StreamController<WatchEvent>();
+    if (!_provider._pathToWatchers.containsKey(path)) {
+      _provider._pathToWatchers[path] = <StreamController<WatchEvent>>[];
+    }
+    _provider._pathToWatchers[path].add(streamController);
+    streamController.done.then((_) {
+      _provider._pathToWatchers[path].remove(streamController);
+      if (_provider._pathToWatchers[path].isEmpty) {
+        _provider._pathToWatchers.remove(path);
+      }
+    });
+    return streamController.stream;
+  }
+
+  @override
+  String canonicalizePath(String relPath) {
+    relPath = posix.normalize(relPath);
+    String childPath = posix.join(path, relPath);
+    childPath = posix.normalize(childPath);
+    return childPath;
+  }
+
+  @override
+  Resource getChild(String relPath) {
+    String childPath = canonicalizePath(relPath);
+    _MemoryResource resource = _provider._pathToResource[childPath];
+    if (resource == null) {
+      resource = new _MemoryFile(_provider, childPath);
+    }
+    return resource;
+  }
+
+  @override
+  List<Resource> getChildren() {
+    List<Resource> children = <Resource>[];
+    _provider._pathToResource.forEach((resourcePath, resource) {
+      if (posix.dirname(resourcePath) == path) {
+        children.add(resource);
+      }
+    });
+    return children;
+  }
+}
+
+
+/**
+ * An in-memory implementation of [Resource].
+ */
+abstract class _MemoryResource implements Resource {
+  final MemoryResourceProvider _provider;
+  final String path;
+
+  _MemoryResource(this._provider, this.path);
+
+  @override
+  bool get exists => _provider._pathToResource.containsKey(path);
+
+  @override
+  get hashCode => path.hashCode;
+
+  @override
+  Folder get parent {
+    String parentPath = posix.dirname(path);
+    if (parentPath == path) {
+      return null;
+    }
+    return _provider.getResource(parentPath);
+  }
+
+  @override
+  String get shortName => posix.basename(path);
+
+  @override
+  bool operator ==(other) {
+    if (runtimeType != other.runtimeType) {
+      return false;
+    }
+    return path == other.path;
+  }
+
+  @override
+  String toString() => path;
+}
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
new file mode 100644
index 0000000..010fd0f
--- /dev/null
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library physical_file_system;
+
+import 'dart:async';
+import 'dart:io' as io;
+
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart';
+import 'package:watcher/watcher.dart';
+
+import 'file_system.dart';
+
+
+/**
+ * A `dart:io` based implementation of [ResourceProvider].
+ */
+class PhysicalResourceProvider implements ResourceProvider {
+  static final PhysicalResourceProvider INSTANCE =
+      new PhysicalResourceProvider._();
+
+  PhysicalResourceProvider._();
+
+  @override
+  Context get pathContext => io.Platform.isWindows ? windows : posix;
+
+  @override
+  Resource getResource(String path) {
+    if (io.FileSystemEntity.isDirectorySync(path)) {
+      io.Directory directory = new io.Directory(path);
+      return new _PhysicalFolder(directory);
+    } else {
+      io.File file = new io.File(path);
+      return new _PhysicalFile(file);
+    }
+  }
+}
+
+
+/**
+ * A `dart:io` based implementation of [File].
+ */
+class _PhysicalFile extends _PhysicalResource implements File {
+  _PhysicalFile(io.File file) : super(file);
+
+  @override
+  Source createSource(UriKind uriKind) {
+    io.File file = _entry as io.File;
+    JavaFile javaFile = new JavaFile(file.absolute.path);
+    return new FileBasedSource.con2(javaFile, uriKind);
+  }
+}
+
+
+/**
+ * A `dart:io` based implementation of [Folder].
+ */
+class _PhysicalFolder extends _PhysicalResource implements Folder {
+  _PhysicalFolder(io.Directory directory) : super(directory);
+
+  @override
+  Stream<WatchEvent> get changes => new DirectoryWatcher(_entry.path).events;
+
+  @override
+  String canonicalizePath(String relPath) {
+    return normalize(join(_entry.absolute.path, relPath));
+  }
+
+  @override
+  Resource getChild(String relPath) {
+    String canonicalPath = canonicalizePath(relPath);
+    return PhysicalResourceProvider.INSTANCE.getResource(canonicalPath);
+  }
+
+  @override
+  List<Resource> getChildren() {
+    List<Resource> children = <Resource>[];
+    io.Directory directory = _entry as io.Directory;
+    List<io.FileSystemEntity> entries = directory.listSync(recursive: false);
+    int numEntries = entries.length;
+    for (int i = 0; i < numEntries; i++) {
+      io.FileSystemEntity entity = entries[i];
+      if (entity is io.Directory) {
+        children.add(new _PhysicalFolder(entity));
+      } else if (entity is io.File) {
+        children.add(new _PhysicalFile(entity));
+      }
+    }
+    return children;
+  }
+}
+
+
+/**
+ * A `dart:io` based implementation of [Resource].
+ */
+abstract class _PhysicalResource implements Resource {
+  final io.FileSystemEntity _entry;
+
+  _PhysicalResource(this._entry);
+
+  @override
+  bool get exists => _entry.existsSync();
+
+  @override
+  get hashCode => path.hashCode;
+
+  @override
+  Folder get parent {
+    String parentPath = dirname(path);
+    if (parentPath == path) {
+      return null;
+    }
+    return new _PhysicalFolder(new io.Directory(parentPath));
+  }
+
+  @override
+  String get path => _entry.absolute.path;
+
+  @override
+  String get shortName => basename(path);
+
+  @override
+  bool operator ==(other) {
+    if (runtimeType != other.runtimeType) {
+      return false;
+    }
+    return path == other.path;
+  }
+
+  @override
+  String toString() => path;
+}
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
deleted file mode 100644
index 08b2c67..0000000
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ /dev/null
@@ -1,2586 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This code was auto-generated, is not intended to be edited, and is subject to
-// significant change. Please see the README file for more information.
-
-library engine.index;
-
-import 'dart:collection' show Queue;
-import 'java_core.dart';
-import 'java_engine.dart';
-import 'source.dart';
-import 'scanner.dart' show Token;
-import 'ast.dart';
-import 'element.dart';
-import 'resolver.dart' show Namespace, NamespaceBuilder;
-import 'engine.dart';
-import 'html.dart' as ht;
-
-/**
- * Visits resolved [CompilationUnit] and adds Angular specific relationships into
- * [IndexStore].
- */
-class AngularDartIndexContributor extends GeneralizingAstVisitor<Object> {
-  final IndexStore _store;
-
-  AngularDartIndexContributor(this._store);
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement classElement = node.element;
-    if (classElement != null) {
-      List<ToolkitObjectElement> toolkitObjects = classElement.toolkitObjects;
-      for (ToolkitObjectElement object in toolkitObjects) {
-        if (object is AngularComponentElement) {
-          _indexComponent(object);
-        }
-        if (object is AngularDecoratorElement) {
-          AngularDecoratorElement directive = object;
-          _indexDirective(directive);
-        }
-      }
-    }
-    // stop visiting
-    return null;
-  }
-
-  @override
-  Object visitCompilationUnitMember(CompilationUnitMember node) => null;
-
-  void _indexComponent(AngularComponentElement component) {
-    _indexProperties(component.properties);
-  }
-
-  void _indexDirective(AngularDecoratorElement directive) {
-    _indexProperties(directive.properties);
-  }
-
-  /**
-   * Index [FieldElement] references from [AngularPropertyElement]s.
-   */
-  void _indexProperties(List<AngularPropertyElement> properties) {
-    for (AngularPropertyElement property in properties) {
-      FieldElement field = property.field;
-      if (field != null) {
-        int offset = property.fieldNameOffset;
-        if (offset == -1) {
-          continue;
-        }
-        int length = field.name.length;
-        Location location = new Location(property, offset, length);
-        // getter reference
-        if (property.propertyKind.callsGetter()) {
-          PropertyAccessorElement getter = field.getter;
-          if (getter != null) {
-            _store.recordRelationship(getter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
-          }
-        }
-        // setter reference
-        if (property.propertyKind.callsSetter()) {
-          PropertyAccessorElement setter = field.setter;
-          if (setter != null) {
-            _store.recordRelationship(setter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
-          }
-        }
-      }
-    }
-  }
-}
-
-/**
- * Visits resolved [HtmlUnit] and adds relationships into [IndexStore].
- */
-class AngularHtmlIndexContributor extends ExpressionVisitor {
-  /**
-   * The [IndexStore] to record relations into.
-   */
-  final IndexStore _store;
-
-  /**
-   * The index contributor used to index Dart [Expression]s.
-   */
-  IndexContributor _indexContributor;
-
-  HtmlElement _htmlUnitElement;
-
-  /**
-   * Initialize a newly created Angular HTML index contributor.
-   *
-   * @param store the [IndexStore] to record relations into.
-   */
-  AngularHtmlIndexContributor(this._store) {
-    _indexContributor = new IndexContributor_AngularHtmlIndexContributor(_store, this);
-  }
-
-  @override
-  void visitExpression(Expression expression) {
-    // Formatter
-    if (expression is SimpleIdentifier) {
-      SimpleIdentifier identifier = expression;
-      Element element = identifier.bestElement;
-      if (element is AngularElement) {
-        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, _createLocationForIdentifier(identifier));
-        return;
-      }
-    }
-    // index as a normal Dart expression
-    expression.accept(_indexContributor);
-  }
-
-  @override
-  Object visitHtmlUnit(ht.HtmlUnit node) {
-    _htmlUnitElement = node.element;
-    CompilationUnitElement dartUnitElement = _htmlUnitElement.angularCompilationUnit;
-    _indexContributor.enterScope(dartUnitElement);
-    return super.visitHtmlUnit(node);
-  }
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    Element element = node.element;
-    if (element != null) {
-      ht.Token nameToken = node.nameToken;
-      Location location = _createLocationForToken(nameToken);
-      _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, location);
-    }
-    return super.visitXmlAttributeNode(node);
-  }
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    Element element = node.element;
-    if (element != null) {
-      // tag
-      {
-        ht.Token tagToken = node.tagToken;
-        Location location = _createLocationForToken(tagToken);
-        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, location);
-      }
-      // maybe add closing tag range
-      ht.Token closingTag = node.closingTag;
-      if (closingTag != null) {
-        Location location = _createLocationForToken(closingTag);
-        _store.recordRelationship(element, IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE, location);
-      }
-    }
-    return super.visitXmlTagNode(node);
-  }
-
-  Location _createLocationForIdentifier(SimpleIdentifier identifier) => new Location(_htmlUnitElement, identifier.offset, identifier.length);
-
-  Location _createLocationForToken(ht.Token token) => new Location(_htmlUnitElement, token.offset, token.length);
-}
-
-/**
- * Instances of the [ClearOperation] implement an operation that removes all of the
- * information from the index.
- */
-class ClearOperation implements IndexOperation {
-  /**
-   * The index store against which this operation is being run.
-   */
-  final IndexStore _indexStore;
-
-  ClearOperation(this._indexStore);
-
-  @override
-  bool get isQuery => false;
-
-  @override
-  void performOperation() {
-    _indexStore.clear();
-  }
-
-  @override
-  bool removeWhenSourceRemoved(Source source) => false;
-
-  @override
-  String toString() => "ClearOperation()";
-}
-
-/**
- * Recursively visits [HtmlUnit] and every embedded [Expression].
- */
-abstract class ExpressionVisitor extends ht.RecursiveXmlVisitor<Object> {
-  /**
-   * Visits the given [Expression]s embedded into tag or attribute.
-   *
-   * @param expression the [Expression] to visit, not `null`
-   */
-  void visitExpression(Expression expression);
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    _visitExpressions(node.expressions);
-    return super.visitXmlAttributeNode(node);
-  }
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    _visitExpressions(node.expressions);
-    return super.visitXmlTagNode(node);
-  }
-
-  /**
-   * Visits [Expression]s of the given [XmlExpression]s.
-   */
-  void _visitExpressions(List<ht.XmlExpression> expressions) {
-    for (ht.XmlExpression xmlExpression in expressions) {
-      if (xmlExpression is AngularXmlExpression) {
-        AngularXmlExpression angularXmlExpression = xmlExpression;
-        List<Expression> dartExpressions = angularXmlExpression.expression.expressions;
-        for (Expression dartExpression in dartExpressions) {
-          visitExpression(dartExpression);
-        }
-      }
-      if (xmlExpression is ht.RawXmlExpression) {
-        ht.RawXmlExpression rawXmlExpression = xmlExpression;
-        visitExpression(rawXmlExpression.expression);
-      }
-    }
-  }
-}
-
-/**
- * Instances of the [GetRelationshipsOperation] implement an operation used to access the
- * locations that have a specified relationship with a specified element.
- */
-class GetRelationshipsOperation implements IndexOperation {
-  final IndexStore _indexStore;
-
-  final Element element;
-
-  final Relationship relationship;
-
-  final RelationshipCallback callback;
-
-  /**
-   * Initialize a newly created operation that will access the locations that have a specified
-   * relationship with a specified element.
-   */
-  GetRelationshipsOperation(this._indexStore, this.element, this.relationship, this.callback);
-
-  @override
-  bool get isQuery => true;
-
-  @override
-  void performOperation() {
-    List<Location> locations;
-    locations = _indexStore.getRelationships(element, relationship);
-    callback.hasRelationships(element, relationship, locations);
-  }
-
-  @override
-  bool removeWhenSourceRemoved(Source source) => false;
-
-  @override
-  String toString() => "GetRelationships(${element}, ${relationship})";
-}
-
-/**
- * The interface [Index] defines the behavior of objects that maintain an index storing
- * [Relationship] between [Element]. All of the operations
- * defined on the index are asynchronous, and results, when there are any, are provided through a
- * callback.
- *
- * Despite being asynchronous, the results of the operations are guaranteed to be consistent with
- * the expectation that operations are performed in the order in which they are requested.
- * Modification operations are executed before any read operation. There is no guarantee about the
- * order in which the callbacks for read operations will be invoked.
- */
-abstract class Index {
-  /**
-   * Asynchronously remove from the index all of the information.
-   */
-  void clear();
-
-  /**
-   * Asynchronously invoke the given callback with an array containing all of the locations of the
-   * elements that have the given relationship with the given element. For example, if the element
-   * represents a method and the relationship is the is-referenced-by relationship, then the
-   * locations that will be passed into the callback will be all of the places where the method is
-   * invoked.
-   *
-   * @param element the element that has the relationship with the locations to be returned
-   * @param relationship the relationship between the given element and the locations to be returned
-   * @param callback the callback that will be invoked when the locations are found
-   */
-  void getRelationships(Element element, Relationship relationship, RelationshipCallback callback);
-
-  /**
-   * Answer index statistics.
-   */
-  String get statistics;
-
-  /**
-   * Asynchronously process the given [HtmlUnit] in order to record the relationships.
-   *
-   * @param context the [AnalysisContext] in which [HtmlUnit] was resolved
-   * @param unit the [HtmlUnit] being indexed
-   */
-  void indexHtmlUnit(AnalysisContext context, ht.HtmlUnit unit);
-
-  /**
-   * Asynchronously process the given [CompilationUnit] in order to record the relationships.
-   *
-   * @param context the [AnalysisContext] in which [CompilationUnit] was resolved
-   * @param unit the [CompilationUnit] being indexed
-   */
-  void indexUnit(AnalysisContext context, CompilationUnit unit);
-
-  /**
-   * Asynchronously remove from the index all of the information associated with the given context.
-   *
-   * This method should be invoked when a context is disposed.
-   *
-   * @param context the [AnalysisContext] to remove
-   */
-  void removeContext(AnalysisContext context);
-
-  /**
-   * Asynchronously remove from the index all of the information associated with elements or
-   * locations in the given source. This includes relationships between an element in the given
-   * source and any other locations, relationships between any other elements and a location within
-   * the given source.
-   *
-   * This method should be invoked when a source is no longer part of the code base.
-   *
-   * @param context the [AnalysisContext] in which [Source] being removed
-   * @param source the [Source] being removed
-   */
-  void removeSource(AnalysisContext context, Source source);
-
-  /**
-   * Asynchronously remove from the index all of the information associated with elements or
-   * locations in the given sources. This includes relationships between an element in the given
-   * sources and any other locations, relationships between any other elements and a location within
-   * the given sources.
-   *
-   * This method should be invoked when multiple sources are no longer part of the code base.
-   *
-   * @param the [AnalysisContext] in which [Source]s being removed
-   * @param container the [SourceContainer] holding the sources being removed
-   */
-  void removeSources(AnalysisContext context, SourceContainer container);
-
-  /**
-   * Should be called in separate [Thread] to process request in this [Index]. Does not
-   * return until the [stop] method is called.
-   */
-  void run();
-
-  /**
-   * Should be called to stop process running [run], so stop processing requests.
-   */
-  void stop();
-}
-
-/**
- * Constants used when populating and accessing the index.
- */
-abstract class IndexConstants {
-  /**
-   * An element used to represent the universe.
-   */
-  static final Element UNIVERSE = UniverseElement.INSTANCE;
-
-  /**
-   * The relationship used to indicate that a container (the left-operand) contains the definition
-   * of a class at a specific location (the right operand).
-   */
-  static final Relationship DEFINES_CLASS = Relationship.getRelationship("defines-class");
-
-  /**
-   * The relationship used to indicate that a container (the left-operand) contains the definition
-   * of a function at a specific location (the right operand).
-   */
-  static final Relationship DEFINES_FUNCTION = Relationship.getRelationship("defines-function");
-
-  /**
-   * The relationship used to indicate that a container (the left-operand) contains the definition
-   * of a class type alias at a specific location (the right operand).
-   */
-  static final Relationship DEFINES_CLASS_ALIAS = Relationship.getRelationship("defines-class-alias");
-
-  /**
-   * The relationship used to indicate that a container (the left-operand) contains the definition
-   * of a function type at a specific location (the right operand).
-   */
-  static final Relationship DEFINES_FUNCTION_TYPE = Relationship.getRelationship("defines-function-type");
-
-  /**
-   * The relationship used to indicate that a container (the left-operand) contains the definition
-   * of a method at a specific location (the right operand).
-   */
-  static final Relationship DEFINES_VARIABLE = Relationship.getRelationship("defines-variable");
-
-  /**
-   * The relationship used to indicate that a name (the left-operand) is defined at a specific
-   * location (the right operand).
-   */
-  static final Relationship IS_DEFINED_BY = Relationship.getRelationship("is-defined-by");
-
-  /**
-   * The relationship used to indicate that a type (the left-operand) is extended by a type at a
-   * specific location (the right operand).
-   */
-  static final Relationship IS_EXTENDED_BY = Relationship.getRelationship("is-extended-by");
-
-  /**
-   * The relationship used to indicate that a type (the left-operand) is implemented by a type at a
-   * specific location (the right operand).
-   */
-  static final Relationship IS_IMPLEMENTED_BY = Relationship.getRelationship("is-implemented-by");
-
-  /**
-   * The relationship used to indicate that a type (the left-operand) is mixed into a type at a
-   * specific location (the right operand).
-   */
-  static final Relationship IS_MIXED_IN_BY = Relationship.getRelationship("is-mixed-in-by");
-
-  /**
-   * The relationship used to indicate that a parameter or variable (the left-operand) is read at a
-   * specific location (the right operand).
-   */
-  static final Relationship IS_READ_BY = Relationship.getRelationship("is-read-by");
-
-  /**
-   * The relationship used to indicate that a parameter or variable (the left-operand) is both read
-   * and modified at a specific location (the right operand).
-   */
-  static final Relationship IS_READ_WRITTEN_BY = Relationship.getRelationship("is-read-written-by");
-
-  /**
-   * The relationship used to indicate that a parameter or variable (the left-operand) is modified
-   * (assigned to) at a specific location (the right operand).
-   */
-  static final Relationship IS_WRITTEN_BY = Relationship.getRelationship("is-written-by");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is referenced at a
-   * specific location (the right operand). This is used for everything except read/write operations
-   * for fields, parameters, and variables. Those use either [IS_REFERENCED_BY_QUALIFIED],
-   * [IS_REFERENCED_BY_UNQUALIFIED], [IS_READ_BY], [IS_WRITTEN_BY] or
-   * [IS_READ_WRITTEN_BY], as appropriate.
-   */
-  static final Relationship IS_REFERENCED_BY = Relationship.getRelationship("is-referenced-by");
-
-  /**
-   * The relationship used to indicate that an [NameElementImpl] (the left-operand) is
-   * referenced at a specific location (the right operand). This is used for qualified resolved
-   * references to methods and fields.
-   */
-  static final Relationship IS_REFERENCED_BY_QUALIFIED_RESOLVED = Relationship.getRelationship("is-referenced-by-qualified-resolved");
-
-  /**
-   * The relationship used to indicate that an [NameElementImpl] (the left-operand) is
-   * referenced at a specific location (the right operand). This is used for qualified unresolved
-   * references to methods and fields.
-   */
-  static final Relationship IS_REFERENCED_BY_QUALIFIED_UNRESOLVED = Relationship.getRelationship("is-referenced-by-qualified-unresolved");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is referenced at a
-   * specific location (the right operand). This is used for field accessors and methods.
-   */
-  static final Relationship IS_REFERENCED_BY_QUALIFIED = Relationship.getRelationship("is-referenced-by-qualified");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is referenced at a
-   * specific location (the right operand). This is used for field accessors and methods.
-   */
-  static final Relationship IS_REFERENCED_BY_UNQUALIFIED = Relationship.getRelationship("is-referenced-by-unqualified");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is invoked at a specific
-   * location (the right operand). This is used for functions.
-   */
-  static final Relationship IS_INVOKED_BY = Relationship.getRelationship("is-invoked-by");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is invoked at a specific
-   * location (the right operand). This is used for methods.
-   */
-  static final Relationship IS_INVOKED_BY_QUALIFIED = Relationship.getRelationship("is-invoked-by-qualified");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is invoked at a specific
-   * location (the right operand). This is used for methods.
-   */
-  static final Relationship IS_INVOKED_BY_UNQUALIFIED = Relationship.getRelationship("is-invoked-by-unqualified");
-
-  /**
-   * The relationship used to indicate that an [NameElementImpl] (the left-operand) is invoked
-   * at a specific location (the right operand). This is used for resolved invocations.
-   */
-  static final Relationship NAME_IS_INVOKED_BY_RESOLVED = Relationship.getRelationship("name-is-invoked-by-resolved");
-
-  /**
-   * The relationship used to indicate that an [NameElementImpl] (the left-operand) is read at
-   * a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_READ_BY_RESOLVED = Relationship.getRelationship("name-is-read-by-resolved");
-
-  /**
-   * The relationship used to indicate that an [NameElementImpl] (the left-operand) is both
-   * read and written at a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_READ_WRITTEN_BY_RESOLVED = Relationship.getRelationship("name-is-read-written-by-resolved");
-
-  /**
-   * The relationship used to indicate that an [NameElementImpl] (the left-operand) is written
-   * at a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_WRITTEN_BY_RESOLVED = Relationship.getRelationship("name-is-written-by-resolved");
-
-  /**
-   * The relationship used to indicate that an [NameElementImpl] (the left-operand) is invoked
-   * at a specific location (the right operand). This is used for unresolved invocations.
-   */
-  static final Relationship NAME_IS_INVOKED_BY_UNRESOLVED = Relationship.getRelationship("name-is-invoked-by-unresolved");
-
-  /**
-   * The relationship used to indicate that an [NameElementImpl] (the left-operand) is read at
-   * a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_READ_BY_UNRESOLVED = Relationship.getRelationship("name-is-read-by-unresolved");
-
-  /**
-   * The relationship used to indicate that an [NameElementImpl] (the left-operand) is both
-   * read and written at a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_READ_WRITTEN_BY_UNRESOLVED = Relationship.getRelationship("name-is-read-written-by-unresolved");
-
-  /**
-   * The relationship used to indicate that an [NameElementImpl] (the left-operand) is written
-   * at a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_WRITTEN_BY_UNRESOLVED = Relationship.getRelationship("name-is-written-by-unresolved");
-
-  /**
-   * Reference to some [AngularElement].
-   */
-  static final Relationship ANGULAR_REFERENCE = Relationship.getRelationship("angular-reference");
-
-  /**
-   * Reference to some closing tag of an XML element.
-   */
-  static final Relationship ANGULAR_CLOSING_TAG_REFERENCE = Relationship.getRelationship("angular-closing-tag-reference");
-}
-
-/**
- * Visits resolved AST and adds relationships into [IndexStore].
- */
-class IndexContributor extends GeneralizingAstVisitor<Object> {
-  /**
-   * @return the [Location] representing location of the [Element].
-   */
-  static Location createLocation(Element element) {
-    if (element != null) {
-      int offset = element.nameOffset;
-      int length = element.displayName.length;
-      return new Location(element, offset, length);
-    }
-    return null;
-  }
-
-  /**
-   * @return the [ImportElement] that is referenced by this node with [PrefixElement],
-   *         may be `null`.
-   */
-  static ImportElement getImportElement(SimpleIdentifier prefixNode) {
-    IndexContributor_ImportElementInfo info = getImportElementInfo(prefixNode);
-    return info != null ? info._element : null;
-  }
-
-  /**
-   * @return the [ImportElementInfo] with [ImportElement] that is referenced by this
-   *         node with [PrefixElement], may be `null`.
-   */
-  static IndexContributor_ImportElementInfo getImportElementInfo(SimpleIdentifier prefixNode) {
-    IndexContributor_ImportElementInfo info = new IndexContributor_ImportElementInfo();
-    // prepare environment
-    AstNode parent = prefixNode.parent;
-    CompilationUnit unit = prefixNode.getAncestor((node) => node is CompilationUnit);
-    LibraryElement libraryElement = unit.element.library;
-    // prepare used element
-    Element usedElement = null;
-    if (parent is PrefixedIdentifier) {
-      PrefixedIdentifier prefixed = parent;
-      if (identical(prefixed.prefix, prefixNode)) {
-        usedElement = prefixed.staticElement;
-        info._periodEnd = prefixed.period.end;
-      }
-    }
-    if (parent is MethodInvocation) {
-      MethodInvocation invocation = parent;
-      if (identical(invocation.target, prefixNode)) {
-        usedElement = invocation.methodName.staticElement;
-        info._periodEnd = invocation.period.end;
-      }
-    }
-    // we need used Element
-    if (usedElement == null) {
-      return null;
-    }
-    // find ImportElement
-    String prefix = prefixNode.name;
-    Map<ImportElement, Set<Element>> importElementsMap = {};
-    info._element = _internalGetImportElement(libraryElement, prefix, usedElement, importElementsMap);
-    if (info._element == null) {
-      return null;
-    }
-    return info;
-  }
-
-  /**
-   * If the given expression has resolved type, returns the new location with this type.
-   *
-   * @param location the base location
-   * @param expression the expression assigned at the given location
-   */
-  static Location _getLocationWithExpressionType(Location location, Expression expression) {
-    if (expression != null) {
-      return new LocationWithData<DartType>.con1(location, expression.bestType);
-    }
-    return location;
-  }
-
-  /**
-   * If the given node is the part of the [ConstructorFieldInitializer], returns location with
-   * type of the initializer expression.
-   */
-  static Location _getLocationWithInitializerType(SimpleIdentifier node, Location location) {
-    if (node.parent is ConstructorFieldInitializer) {
-      ConstructorFieldInitializer initializer = node.parent as ConstructorFieldInitializer;
-      if (identical(initializer.fieldName, node)) {
-        location = _getLocationWithExpressionType(location, initializer.expression);
-      }
-    }
-    return location;
-  }
-
-  /**
-   * If the given identifier has a synthetic [PropertyAccessorElement], i.e. accessor for
-   * normal field, and it is LHS of assignment, then include [Type] of the assigned value into
-   * the [Location].
-   *
-   * @param identifier the identifier to record location
-   * @param element the element of the identifier
-   * @param location the raw location
-   * @return the [Location] with the type of the assigned value
-   */
-  static Location _getLocationWithTypeAssignedToField(SimpleIdentifier identifier, Element element, Location location) {
-    // we need accessor
-    if (element is! PropertyAccessorElement) {
-      return location;
-    }
-    PropertyAccessorElement accessor = element as PropertyAccessorElement;
-    // should be setter
-    if (!accessor.isSetter) {
-      return location;
-    }
-    // accessor should be synthetic, i.e. field normal
-    if (!accessor.isSynthetic) {
-      return location;
-    }
-    // should be LHS of assignment
-    AstNode parent;
-    {
-      AstNode node = identifier;
-      parent = node.parent;
-      // new T().field = x;
-      if (parent is PropertyAccess) {
-        PropertyAccess propertyAccess = parent as PropertyAccess;
-        if (identical(propertyAccess.propertyName, node)) {
-          node = propertyAccess;
-          parent = propertyAccess.parent;
-        }
-      }
-      // obj.field = x;
-      if (parent is PrefixedIdentifier) {
-        PrefixedIdentifier prefixedIdentifier = parent as PrefixedIdentifier;
-        if (identical(prefixedIdentifier.identifier, node)) {
-          node = prefixedIdentifier;
-          parent = prefixedIdentifier.parent;
-        }
-      }
-    }
-    // OK, remember the type
-    if (parent is AssignmentExpression) {
-      AssignmentExpression assignment = parent as AssignmentExpression;
-      Expression rhs = assignment.rightHandSide;
-      location = _getLocationWithExpressionType(location, rhs);
-    }
-    // done
-    return location;
-  }
-
-  /**
-   * @return the [ImportElement] that declares given [PrefixElement] and imports library
-   *         with given "usedElement".
-   */
-  static ImportElement _internalGetImportElement(LibraryElement libraryElement, String prefix, Element usedElement, Map<ImportElement, Set<Element>> importElementsMap) {
-    // validate Element
-    if (usedElement == null) {
-      return null;
-    }
-    if (usedElement.enclosingElement is! CompilationUnitElement) {
-      return null;
-    }
-    LibraryElement usedLibrary = usedElement.library;
-    // find ImportElement that imports used library with used prefix
-    List<ImportElement> candidates = null;
-    for (ImportElement importElement in libraryElement.imports) {
-      // required library
-      if (importElement.importedLibrary != usedLibrary) {
-        continue;
-      }
-      // required prefix
-      PrefixElement prefixElement = importElement.prefix;
-      if (prefix == null) {
-        if (prefixElement != null) {
-          continue;
-        }
-      } else {
-        if (prefixElement == null) {
-          continue;
-        }
-        if (prefix != prefixElement.name) {
-          continue;
-        }
-      }
-      // no combinators => only possible candidate
-      if (importElement.combinators.length == 0) {
-        return importElement;
-      }
-      // OK, we have candidate
-      if (candidates == null) {
-        candidates = [];
-      }
-      candidates.add(importElement);
-    }
-    // no candidates, probably element is defined in this library
-    if (candidates == null) {
-      return null;
-    }
-    // one candidate
-    if (candidates.length == 1) {
-      return candidates[0];
-    }
-    // ensure that each ImportElement has set of elements
-    for (ImportElement importElement in candidates) {
-      if (importElementsMap.containsKey(importElement)) {
-        continue;
-      }
-      Namespace namespace = new NamespaceBuilder().createImportNamespaceForDirective(importElement);
-      Set<Element> elements = new Set();
-      importElementsMap[importElement] = elements;
-    }
-    // use import namespace to choose correct one
-    for (MapEntry<ImportElement, Set<Element>> entry in getMapEntrySet(importElementsMap)) {
-      if (entry.getValue().contains(usedElement)) {
-        return entry.getKey();
-      }
-    }
-    // not found
-    return null;
-  }
-
-  /**
-   * @return `true` if given "node" is part of an import [Combinator].
-   */
-  static bool _isIdentifierInImportCombinator(SimpleIdentifier node) {
-    AstNode parent = node.parent;
-    return parent is Combinator;
-  }
-
-  /**
-   * @return `true` if given "node" is part of [PrefixedIdentifier] "prefix.node".
-   */
-  static bool _isIdentifierInPrefixedIdentifier(SimpleIdentifier node) {
-    AstNode parent = node.parent;
-    return parent is PrefixedIdentifier && identical(parent.identifier, node);
-  }
-
-  final IndexStore _store;
-
-  LibraryElement _libraryElement;
-
-  Map<ImportElement, Set<Element>> _importElementsMap = {};
-
-  /**
-   * A stack whose top element (the element with the largest index) is an element representing the
-   * inner-most enclosing scope.
-   */
-  Queue<Element> _elementStack = new Queue();
-
-  IndexContributor(this._store);
-
-  /**
-   * Enter a new scope represented by the given [Element].
-   */
-  void enterScope(Element element) {
-    _elementStack.addFirst(element);
-  }
-
-  /**
-   * @return the inner-most enclosing [Element], may be `null`.
-   */
-  Element peekElement() {
-    for (Element element in _elementStack) {
-      if (element != null) {
-        return element;
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    _recordOperatorReference(node.operator, node.bestElement);
-    return super.visitAssignmentExpression(node);
-  }
-
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    _recordOperatorReference(node.operator, node.bestElement);
-    return super.visitBinaryExpression(node);
-  }
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement element = node.element;
-    enterScope(element);
-    try {
-      _recordElementDefinition(element, IndexConstants.DEFINES_CLASS);
-      {
-        ExtendsClause extendsClause = node.extendsClause;
-        if (extendsClause != null) {
-          TypeName superclassNode = extendsClause.superclass;
-          _recordSuperType(superclassNode, IndexConstants.IS_EXTENDED_BY);
-        } else {
-          InterfaceType superType = element.supertype;
-          if (superType != null) {
-            ClassElement objectElement = superType.element;
-            recordRelationship(objectElement, IndexConstants.IS_EXTENDED_BY, _createLocationFromOffset(node.name.offset, 0));
-          }
-        }
-      }
-      {
-        WithClause withClause = node.withClause;
-        if (withClause != null) {
-          for (TypeName mixinNode in withClause.mixinTypes) {
-            _recordSuperType(mixinNode, IndexConstants.IS_MIXED_IN_BY);
-          }
-        }
-      }
-      {
-        ImplementsClause implementsClause = node.implementsClause;
-        if (implementsClause != null) {
-          for (TypeName interfaceNode in implementsClause.interfaces) {
-            _recordSuperType(interfaceNode, IndexConstants.IS_IMPLEMENTED_BY);
-          }
-        }
-      }
-      return super.visitClassDeclaration(node);
-    } finally {
-      _exitScope();
-    }
-  }
-
-  @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
-    ClassElement element = node.element;
-    enterScope(element);
-    try {
-      _recordElementDefinition(element, IndexConstants.DEFINES_CLASS_ALIAS);
-      {
-        TypeName superclassNode = node.superclass;
-        if (superclassNode != null) {
-          _recordSuperType(superclassNode, IndexConstants.IS_EXTENDED_BY);
-        }
-      }
-      {
-        WithClause withClause = node.withClause;
-        if (withClause != null) {
-          for (TypeName mixinNode in withClause.mixinTypes) {
-            _recordSuperType(mixinNode, IndexConstants.IS_MIXED_IN_BY);
-          }
-        }
-      }
-      {
-        ImplementsClause implementsClause = node.implementsClause;
-        if (implementsClause != null) {
-          for (TypeName interfaceNode in implementsClause.interfaces) {
-            _recordSuperType(interfaceNode, IndexConstants.IS_IMPLEMENTED_BY);
-          }
-        }
-      }
-      return super.visitClassTypeAlias(node);
-    } finally {
-      _exitScope();
-    }
-  }
-
-  @override
-  Object visitCompilationUnit(CompilationUnit node) {
-    CompilationUnitElement unitElement = node.element;
-    if (unitElement != null) {
-      _elementStack.add(unitElement);
-      _libraryElement = unitElement.enclosingElement;
-      if (_libraryElement != null) {
-        return super.visitCompilationUnit(node);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    ConstructorElement element = node.element;
-    // define
-    {
-      Location location;
-      if (node.name != null) {
-        int start = node.period.offset;
-        int end = node.name.end;
-        location = _createLocationFromOffset(start, end - start);
-      } else {
-        int start = node.returnType.end;
-        location = _createLocationFromOffset(start, 0);
-      }
-      recordRelationship(element, IndexConstants.IS_DEFINED_BY, location);
-    }
-    // visit children
-    enterScope(element);
-    try {
-      return super.visitConstructorDeclaration(node);
-    } finally {
-      _exitScope();
-    }
-  }
-
-  @override
-  Object visitConstructorName(ConstructorName node) {
-    ConstructorElement element = node.staticElement;
-    // in 'class B = A;' actually A constructors are invoked
-    if (element != null && element.isSynthetic && element.redirectedConstructor != null) {
-      element = element.redirectedConstructor;
-    }
-    // prepare location
-    Location location;
-    if (node.name != null) {
-      int start = node.period.offset;
-      int end = node.name.end;
-      location = _createLocationFromOffset(start, end - start);
-    } else {
-      int start = node.type.end;
-      location = _createLocationFromOffset(start, 0);
-    }
-    // record relationship
-    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
-    return super.visitConstructorName(node);
-  }
-
-  @override
-  Object visitExportDirective(ExportDirective node) {
-    ExportElement element = node.element;
-    if (element != null) {
-      LibraryElement expLibrary = element.exportedLibrary;
-      _recordLibraryReference(node, expLibrary);
-    }
-    return super.visitExportDirective(node);
-  }
-
-  @override
-  Object visitFormalParameter(FormalParameter node) {
-    ParameterElement element = node.element;
-    enterScope(element);
-    try {
-      return super.visitFormalParameter(node);
-    } finally {
-      _exitScope();
-    }
-  }
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    Element element = node.element;
-    _recordElementDefinition(element, IndexConstants.DEFINES_FUNCTION);
-    enterScope(element);
-    try {
-      return super.visitFunctionDeclaration(node);
-    } finally {
-      _exitScope();
-    }
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    Element element = node.element;
-    _recordElementDefinition(element, IndexConstants.DEFINES_FUNCTION_TYPE);
-    return super.visitFunctionTypeAlias(node);
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) {
-    ImportElement element = node.element;
-    if (element != null) {
-      LibraryElement impLibrary = element.importedLibrary;
-      _recordLibraryReference(node, impLibrary);
-    }
-    return super.visitImportDirective(node);
-  }
-
-  @override
-  Object visitIndexExpression(IndexExpression node) {
-    MethodElement element = node.bestElement;
-    if (element is MethodElement) {
-      Token operator = node.leftBracket;
-      Location location = _createLocationFromToken(operator);
-      recordRelationship(element, IndexConstants.IS_INVOKED_BY_QUALIFIED, location);
-    }
-    return super.visitIndexExpression(node);
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    ExecutableElement element = node.element;
-    enterScope(element);
-    try {
-      return super.visitMethodDeclaration(node);
-    } finally {
-      _exitScope();
-    }
-  }
-
-  @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    SimpleIdentifier name = node.methodName;
-    Element element = name.bestElement;
-    if (element is MethodElement || element is PropertyAccessorElement) {
-      Location location = _createLocationFromNode(name);
-      Relationship relationship;
-      if (node.target != null) {
-        relationship = IndexConstants.IS_INVOKED_BY_QUALIFIED;
-      } else {
-        relationship = IndexConstants.IS_INVOKED_BY_UNQUALIFIED;
-      }
-      recordRelationship(element, relationship, location);
-    }
-    if (element is FunctionElement || element is VariableElement) {
-      Location location = _createLocationFromNode(name);
-      recordRelationship(element, IndexConstants.IS_INVOKED_BY, location);
-    }
-    // name invocation
-    {
-      Element nameElement = new NameElementImpl(name.name);
-      Location location = _createLocationFromNode(name);
-      Relationship kind = element != null ? IndexConstants.NAME_IS_INVOKED_BY_RESOLVED : IndexConstants.NAME_IS_INVOKED_BY_UNRESOLVED;
-      _store.recordRelationship(nameElement, kind, location);
-    }
-    _recordImportElementReferenceWithoutPrefix(name);
-    return super.visitMethodInvocation(node);
-  }
-
-  @override
-  Object visitPartDirective(PartDirective node) {
-    Element element = node.element;
-    Location location = _createLocationFromNode(node.uri);
-    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
-    return super.visitPartDirective(node);
-  }
-
-  @override
-  Object visitPartOfDirective(PartOfDirective node) {
-    Location location = _createLocationFromNode(node.libraryName);
-    recordRelationship(node.element, IndexConstants.IS_REFERENCED_BY, location);
-    return null;
-  }
-
-  @override
-  Object visitPostfixExpression(PostfixExpression node) {
-    _recordOperatorReference(node.operator, node.bestElement);
-    return super.visitPostfixExpression(node);
-  }
-
-  @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    _recordOperatorReference(node.operator, node.bestElement);
-    return super.visitPrefixExpression(node);
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    Element nameElement = new NameElementImpl(node.name);
-    Location location = _createLocationFromNode(node);
-    // name in declaration
-    if (node.inDeclarationContext()) {
-      recordRelationship(nameElement, IndexConstants.IS_DEFINED_BY, location);
-      return null;
-    }
-    // prepare information
-    Element element = node.bestElement;
-    // qualified name reference
-    _recordQualifiedMemberReference(node, element, nameElement, location);
-    // stop if already handled
-    if (_isAlreadyHandledName(node)) {
-      return null;
-    }
-    // record name read/write
-    {
-      bool inGetterContext = node.inGetterContext();
-      bool inSetterContext = node.inSetterContext();
-      if (inGetterContext && inSetterContext) {
-        Relationship kind = element != null ? IndexConstants.NAME_IS_READ_WRITTEN_BY_RESOLVED : IndexConstants.NAME_IS_READ_WRITTEN_BY_UNRESOLVED;
-        _store.recordRelationship(nameElement, kind, location);
-      } else if (inGetterContext) {
-        Relationship kind = element != null ? IndexConstants.NAME_IS_READ_BY_RESOLVED : IndexConstants.NAME_IS_READ_BY_UNRESOLVED;
-        _store.recordRelationship(nameElement, kind, location);
-      } else if (inSetterContext) {
-        Relationship kind = element != null ? IndexConstants.NAME_IS_WRITTEN_BY_RESOLVED : IndexConstants.NAME_IS_WRITTEN_BY_UNRESOLVED;
-        _store.recordRelationship(nameElement, kind, location);
-      }
-    }
-    // record specific relations
-    if (element is ClassElement || element is FunctionElement || element is FunctionTypeAliasElement || element is LabelElement || element is TypeParameterElement) {
-      recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
-    } else if (element is FieldElement) {
-      location = _getLocationWithInitializerType(node, location);
-      recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
-    } else if (element is FieldFormalParameterElement) {
-      FieldFormalParameterElement fieldParameter = element;
-      FieldElement field = fieldParameter.field;
-      recordRelationship(field, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
-    } else if (element is PrefixElement) {
-      _recordImportElementReferenceWithPrefix(node);
-    } else if (element is PropertyAccessorElement || element is MethodElement) {
-      location = _getLocationWithTypeAssignedToField(node, element, location);
-      if (node.isQualified) {
-        recordRelationship(element, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
-      } else {
-        recordRelationship(element, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
-      }
-    } else if (element is ParameterElement || element is LocalVariableElement) {
-      bool inGetterContext = node.inGetterContext();
-      bool inSetterContext = node.inSetterContext();
-      if (inGetterContext && inSetterContext) {
-        recordRelationship(element, IndexConstants.IS_READ_WRITTEN_BY, location);
-      } else if (inGetterContext) {
-        recordRelationship(element, IndexConstants.IS_READ_BY, location);
-      } else if (inSetterContext) {
-        recordRelationship(element, IndexConstants.IS_WRITTEN_BY, location);
-      } else {
-        recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
-      }
-    }
-    _recordImportElementReferenceWithoutPrefix(node);
-    return super.visitSimpleIdentifier(node);
-  }
-
-  @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    ConstructorElement element = node.staticElement;
-    Location location;
-    if (node.constructorName != null) {
-      int start = node.period.offset;
-      int end = node.constructorName.end;
-      location = _createLocationFromOffset(start, end - start);
-    } else {
-      int start = node.keyword.end;
-      location = _createLocationFromOffset(start, 0);
-    }
-    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
-    return super.visitSuperConstructorInvocation(node);
-  }
-
-  @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    VariableDeclarationList variables = node.variables;
-    for (VariableDeclaration variableDeclaration in variables.variables) {
-      Element element = variableDeclaration.element;
-      _recordElementDefinition(element, IndexConstants.DEFINES_VARIABLE);
-    }
-    return super.visitTopLevelVariableDeclaration(node);
-  }
-
-  @override
-  Object visitTypeParameter(TypeParameter node) {
-    TypeParameterElement element = node.element;
-    enterScope(element);
-    try {
-      return super.visitTypeParameter(node);
-    } finally {
-      _exitScope();
-    }
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    VariableElement element = node.element;
-    // record declaration
-    {
-      SimpleIdentifier name = node.name;
-      Location location = _createLocationFromNode(name);
-      location = _getLocationWithExpressionType(location, node.initializer);
-      recordRelationship(element, IndexConstants.IS_DEFINED_BY, location);
-    }
-    // visit
-    enterScope(element);
-    try {
-      return super.visitVariableDeclaration(node);
-    } finally {
-      _exitScope();
-    }
-  }
-
-  @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
-    NodeList<VariableDeclaration> variables = node.variables;
-    if (variables != null) {
-      // use first VariableDeclaration as Element for Location(s) in type
-      {
-        TypeName type = node.type;
-        if (type != null) {
-          for (VariableDeclaration variableDeclaration in variables) {
-            enterScope(variableDeclaration.element);
-            try {
-              type.accept(this);
-            } finally {
-              _exitScope();
-            }
-            // only one iteration
-            break;
-          }
-        }
-      }
-      // visit variables
-      variables.accept(this);
-    }
-    return null;
-  }
-
-  /**
-   * Record the given relationship between the given [Element] and [Location].
-   */
-  void recordRelationship(Element element, Relationship relationship, Location location) {
-    if (element != null && location != null) {
-      _store.recordRelationship(element, relationship, location);
-    }
-  }
-
-  /**
-   * @return the [Location] representing location of the [AstNode].
-   */
-  Location _createLocationFromNode(AstNode node) => _createLocationFromOffset(node.offset, node.length);
-
-  /**
-   * @param offset the offset of the location within [Source]
-   * @param length the length of the location
-   * @return the [Location] representing the given offset and length within the inner-most
-   *         [Element].
-   */
-  Location _createLocationFromOffset(int offset, int length) {
-    Element element = peekElement();
-    return new Location(element, offset, length);
-  }
-
-  /**
-   * @return the [Location] representing location of the [Token].
-   */
-  Location _createLocationFromToken(Token token) => _createLocationFromOffset(token.offset, token.length);
-
-  /**
-   * Exit the current scope.
-   */
-  void _exitScope() {
-    _elementStack.removeFirst();
-  }
-
-  /**
-   * @return `true` if given node already indexed as more interesting reference, so it should
-   *         not be indexed again.
-   */
-  bool _isAlreadyHandledName(SimpleIdentifier node) {
-    AstNode parent = node.parent;
-    if (parent is MethodInvocation) {
-      return identical(parent.methodName, node);
-    }
-    return false;
-  }
-
-  /**
-   * Records the [Element] definition in the library and universe.
-   */
-  void _recordElementDefinition(Element element, Relationship relationship) {
-    Location location = createLocation(element);
-    recordRelationship(_libraryElement, relationship, location);
-    recordRelationship(IndexConstants.UNIVERSE, relationship, location);
-  }
-
-  /**
-   * Records [ImportElement] reference if given [SimpleIdentifier] references some
-   * top-level element and not qualified with import prefix.
-   */
-  void _recordImportElementReferenceWithoutPrefix(SimpleIdentifier node) {
-    if (_isIdentifierInImportCombinator(node)) {
-      return;
-    }
-    if (_isIdentifierInPrefixedIdentifier(node)) {
-      return;
-    }
-    Element element = node.staticElement;
-    ImportElement importElement = _internalGetImportElement(_libraryElement, null, element, _importElementsMap);
-    if (importElement != null) {
-      Location location = _createLocationFromOffset(node.offset, 0);
-      recordRelationship(importElement, IndexConstants.IS_REFERENCED_BY, location);
-    }
-  }
-
-  /**
-   * Records [ImportElement] that declares given prefix and imports library with element used
-   * with given prefix node.
-   */
-  void _recordImportElementReferenceWithPrefix(SimpleIdentifier prefixNode) {
-    IndexContributor_ImportElementInfo info = getImportElementInfo(prefixNode);
-    if (info != null) {
-      int offset = prefixNode.offset;
-      int length = info._periodEnd - offset;
-      Location location = _createLocationFromOffset(offset, length);
-      recordRelationship(info._element, IndexConstants.IS_REFERENCED_BY, location);
-    }
-  }
-
-  /**
-   * Records reference to defining [CompilationUnitElement] of the given
-   * [LibraryElement].
-   */
-  void _recordLibraryReference(UriBasedDirective node, LibraryElement library) {
-    if (library != null) {
-      Location location = _createLocationFromNode(node.uri);
-      recordRelationship(library.definingCompilationUnit, IndexConstants.IS_REFERENCED_BY, location);
-    }
-  }
-
-  /**
-   * Record reference to the given operator [Element] and name.
-   */
-  void _recordOperatorReference(Token operator, Element element) {
-    // prepare location
-    Location location = _createLocationFromToken(operator);
-    // record name reference
-    {
-      String name = operator.lexeme;
-      if (name == "++") {
-        name = "+";
-      }
-      if (name == "--") {
-        name = "-";
-      }
-      if (StringUtilities.endsWithChar(name, 0x3D) && name != "==") {
-        name = name.substring(0, name.length - 1);
-      }
-      Element nameElement = new NameElementImpl(name);
-      Relationship relationship = element != null ? IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED : IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED;
-      recordRelationship(nameElement, relationship, location);
-    }
-    // record element reference
-    if (element != null) {
-      recordRelationship(element, IndexConstants.IS_INVOKED_BY_QUALIFIED, location);
-    }
-  }
-
-  /**
-   * Records reference if the given [SimpleIdentifier] looks like a qualified property access
-   * or method invocation.
-   */
-  void _recordQualifiedMemberReference(SimpleIdentifier node, Element element, Element nameElement, Location location) {
-    if (node.isQualified) {
-      Relationship relationship = element != null ? IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED : IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED;
-      recordRelationship(nameElement, relationship, location);
-    }
-  }
-
-  /**
-   * Records extends/implements relationships between given [ClassElement] and [Type] of
-   * "superNode".
-   */
-  void _recordSuperType(TypeName superNode, Relationship relationship) {
-    if (superNode != null) {
-      Identifier superName = superNode.name;
-      if (superName != null) {
-        Element superElement = superName.staticElement;
-        recordRelationship(superElement, relationship, _createLocationFromNode(superNode));
-      }
-    }
-  }
-}
-
-class IndexContributor_AngularHtmlIndexContributor extends IndexContributor {
-  final AngularHtmlIndexContributor AngularHtmlIndexContributor_this;
-
-  IndexContributor_AngularHtmlIndexContributor(IndexStore arg0, this.AngularHtmlIndexContributor_this) : super(arg0);
-
-  @override
-  Element peekElement() => AngularHtmlIndexContributor_this._htmlUnitElement;
-
-  @override
-  void recordRelationship(Element element, Relationship relationship, Location location) {
-    AngularElement angularElement = AngularHtmlUnitResolver.getAngularElement(element);
-    if (angularElement != null) {
-      element = angularElement;
-      relationship = IndexConstants.ANGULAR_REFERENCE;
-    }
-    super.recordRelationship(element, relationship, location);
-  }
-}
-
-/**
- * Information about [ImportElement] and place where it is referenced using
- * [PrefixElement].
- */
-class IndexContributor_ImportElementInfo {
-  ImportElement _element;
-
-  int _periodEnd = 0;
-}
-
-/**
- * Instances of the [IndexHtmlUnitOperation] implement an operation that adds data to the
- * index based on the resolved [HtmlUnit].
- */
-class IndexHtmlUnitOperation implements IndexOperation {
-  /**
-   * The index store against which this operation is being run.
-   */
-  final IndexStore _indexStore;
-
-  /**
-   * The context in which [HtmlUnit] was resolved.
-   */
-  final AnalysisContext _context;
-
-  /**
-   * The [HtmlUnit] being indexed.
-   */
-  final ht.HtmlUnit unit;
-
-  /**
-   * The element of the [HtmlUnit] being indexed.
-   */
-  HtmlElement _htmlElement;
-
-  /**
-   * The source being indexed.
-   */
-  Source _source;
-
-  /**
-   * Initialize a newly created operation that will index the specified [HtmlUnit].
-   *
-   * @param indexStore the index store against which this operation is being run
-   * @param context the context in which [HtmlUnit] was resolved
-   * @param unit the fully resolved [HtmlUnit]
-   */
-  IndexHtmlUnitOperation(this._indexStore, this._context, this.unit) {
-    this._htmlElement = unit.element;
-    this._source = _htmlElement.source;
-  }
-
-  /**
-   * @return the [Source] to be indexed.
-   */
-  Source get source => _source;
-
-  @override
-  bool get isQuery => false;
-
-  @override
-  void performOperation() {
-    try {
-      bool mayIndex = _indexStore.aboutToIndexHtml(_context, _htmlElement);
-      if (!mayIndex) {
-        return;
-      }
-      AngularHtmlIndexContributor contributor = new AngularHtmlIndexContributor(_indexStore);
-      unit.accept(contributor);
-      _indexStore.doneIndex();
-    } catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not index ${unit.element.location}", exception);
-    }
-  }
-
-  @override
-  bool removeWhenSourceRemoved(Source source) => this._source == source;
-
-  @override
-  String toString() => "IndexHtmlUnitOperation(${_source.fullName})";
-}
-
-/**
- * The interface [IndexOperation] defines the behavior of objects used to perform operations
- * on an index.
- */
-abstract class IndexOperation {
-  /**
-   * Return `true` if this operation returns information from the index.
-   *
-   * @return `true` if this operation returns information from the index
-   */
-  bool get isQuery;
-
-  /**
-   * Perform the operation implemented by this operation.
-   */
-  void performOperation();
-
-  /**
-   * Return `true` if this operation should be removed from the operation queue when the
-   * given resource has been removed.
-   *
-   * @param source the [Source] that has been removed
-   * @return `true` if this operation should be removed from the operation queue as a
-   *         result of removing the resource
-   */
-  bool removeWhenSourceRemoved(Source source);
-}
-
-/**
- * Container of information computed by the index - relationships between elements.
- */
-abstract class IndexStore {
-  /**
-   * Notifies the index store that we are going to index the unit with the given element.
-   *
-   * If the unit is a part of a library, then all its locations are removed. If it is a defining
-   * compilation unit of a library, then index store also checks if some previously indexed parts of
-   * the library are not parts of the library anymore, and clears their information.
-   *
-   * @param the [AnalysisContext] in which unit being indexed
-   * @param unitElement the element of the unit being indexed
-   * @return `true` the given [AnalysisContext] is active, or `false` if it was
-   *         removed before, so no any unit may be indexed with it
-   */
-  bool aboutToIndexDart(AnalysisContext context, CompilationUnitElement unitElement);
-
-  /**
-   * Notifies the index store that we are going to index the given [HtmlElement].
-   *
-   * @param the [AnalysisContext] in which unit being indexed
-   * @param htmlElement the [HtmlElement] being indexed
-   * @return `true` the given [AnalysisContext] is active, or `false` if it was
-   *         removed before, so no any unit may be indexed with it
-   */
-  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement);
-
-  /**
-   * Removes all of the information.
-   */
-  void clear();
-
-  /**
-   * Notifies that index store that the current Dart or HTML unit indexing is done.
-   *
-   * If this method is not invoked after corresponding "aboutToIndex*" invocation, all recorded
-   * information may be lost.
-   */
-  void doneIndex();
-
-  /**
-   * Return the locations of the elements that have the given relationship with the given element.
-   * For example, if the element represents a method and the relationship is the is-referenced-by
-   * relationship, then the returned locations will be all of the places where the method is
-   * invoked.
-   *
-   * @param element the the element that has the relationship with the locations to be returned
-   * @param relationship the [Relationship] between the given element and the locations to be
-   *          returned
-   * @return the locations that have the given relationship with the given element
-   */
-  List<Location> getRelationships(Element element, Relationship relationship);
-
-  /**
-   * Answer index statistics.
-   */
-  String get statistics;
-
-  /**
-   * Record that the given element and location have the given relationship. For example, if the
-   * relationship is the is-referenced-by relationship, then the element would be the element being
-   * referenced and the location would be the point at which it is referenced. Each element can have
-   * the same relationship with multiple locations. In other words, if the following code were
-   * executed
-   *
-   * <pre>
-   *   recordRelationship(element, isReferencedBy, location1);
-   *   recordRelationship(element, isReferencedBy, location2);
-   * </pre>
-   *
-   * then both relationships would be maintained in the index and the result of executing
-   *
-   * <pre>
-   *   getRelationship(element, isReferencedBy);
-   * </pre>
-   *
-   * would be an array containing both <code>location1</code> and <code>location2</code>.
-   *
-   * @param element the element that is related to the location
-   * @param relationship the [Relationship] between the element and the location
-   * @param location the [Location] where relationship happens
-   */
-  void recordRelationship(Element element, Relationship relationship, Location location);
-
-  /**
-   * Remove from the index all of the information associated with [AnalysisContext].
-   *
-   * This method should be invoked when a context is disposed.
-   *
-   * @param the [AnalysisContext] being removed
-   */
-  void removeContext(AnalysisContext context);
-
-  /**
-   * Remove from the index all of the information associated with elements or locations in the given
-   * source. This includes relationships between an element in the given source and any other
-   * locations, relationships between any other elements and a location within the given source.
-   *
-   * This method should be invoked when a source is no longer part of the code base.
-   *
-   * @param the [AnalysisContext] in which [Source] being removed
-   * @param source the source being removed
-   */
-  void removeSource(AnalysisContext context, Source source);
-
-  /**
-   * Remove from the index all of the information associated with elements or locations in the given
-   * sources. This includes relationships between an element in the given sources and any other
-   * locations, relationships between any other elements and a location within the given sources.
-   *
-   * This method should be invoked when multiple sources are no longer part of the code base.
-   *
-   * @param the [AnalysisContext] in which [Source]s being removed
-   * @param container the [SourceContainer] holding the sources being removed
-   */
-  void removeSources(AnalysisContext context, SourceContainer container);
-}
-
-/**
- * Instances of the [IndexUnitOperation] implement an operation that adds data to the index
- * based on the resolved [CompilationUnit].
- */
-class IndexUnitOperation implements IndexOperation {
-  /**
-   * The index store against which this operation is being run.
-   */
-  final IndexStore _indexStore;
-
-  /**
-   * The context in which compilation unit was resolved.
-   */
-  final AnalysisContext _context;
-
-  /**
-   * The compilation unit being indexed.
-   */
-  final CompilationUnit unit;
-
-  /**
-   * The element of the compilation unit being indexed.
-   */
-  CompilationUnitElement _unitElement;
-
-  /**
-   * The source being indexed.
-   */
-  Source _source;
-
-  /**
-   * Initialize a newly created operation that will index the specified unit.
-   *
-   * @param indexStore the index store against which this operation is being run
-   * @param context the context in which compilation unit was resolved
-   * @param unit the fully resolved AST structure
-   */
-  IndexUnitOperation(this._indexStore, this._context, this.unit) {
-    this._unitElement = unit.element;
-    this._source = _unitElement.source;
-  }
-
-  /**
-   * @return the [Source] to be indexed.
-   */
-  Source get source => _source;
-
-  @override
-  bool get isQuery => false;
-
-  @override
-  void performOperation() {
-    try {
-      bool mayIndex = _indexStore.aboutToIndexDart(_context, _unitElement);
-      if (!mayIndex) {
-        return;
-      }
-      unit.accept(new IndexContributor(_indexStore));
-      unit.accept(new AngularDartIndexContributor(_indexStore));
-      _indexStore.doneIndex();
-    } catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not index ${unit.element.location}", exception);
-    }
-  }
-
-  @override
-  bool removeWhenSourceRemoved(Source source) => this._source == source;
-
-  @override
-  String toString() => "IndexUnitOperation(${_source.fullName})";
-}
-
-/**
- * Instances of the class <code>Location</code> represent a location related to an element. The
- * location is expressed as an offset and length, but the offset is relative to the resource
- * containing the element rather than the start of the element within that resource.
- */
-class Location {
-  /**
-   * An empty array of locations.
-   */
-  static List<Location> EMPTY_ARRAY = new List<Location>(0);
-
-  /**
-   * The element containing this location.
-   */
-  final Element element;
-
-  /**
-   * The offset of this location within the resource containing the element.
-   */
-  final int offset;
-
-  /**
-   * The length of this location.
-   */
-  final int length;
-
-  /**
-   * Internal field used to hold a key that is referenced at this location.
-   */
-  Object internalKey;
-
-  /**
-   * Initialize a newly create location to be relative to the given element at the given offset with
-   * the given length.
-   *
-   * @param element the [Element] containing this location
-   * @param offset the offset of this location within the resource containing the element
-   * @param length the length of this location
-   */
-  Location(this.element, this.offset, this.length) {
-    if (element == null) {
-      throw new IllegalArgumentException("element location cannot be null");
-    }
-  }
-
-  /**
-   * Returns a clone of this [Location].
-   */
-  Location newClone() => new Location(element, offset, length);
-
-  @override
-  String toString() => "[${offset} - ${(offset + length)}) in ${element}";
-}
-
-/**
- * [Location] with attached data.
- */
-class LocationWithData<D> extends Location {
-  final D data;
-
-  LocationWithData.con1(Location location, this.data) : super(location.element, location.offset, location.length);
-
-  LocationWithData.con2(Element element, int offset, int length, this.data) : super(element, offset, length);
-
-  @override
-  Location newClone() => new LocationWithData<D>.con2(element, offset, length, data);
-}
-
-/**
- * [IndexStore] which keeps all information in memory, but can write it to stream and read
- * later.
- */
-abstract class MemoryIndexStore implements IndexStore {
-}
-
-/**
- * [IndexStore] which keeps full index in memory.
- */
-class MemoryIndexStoreImpl implements MemoryIndexStore {
-  /**
-   * When logging is on, [AnalysisEngine] actually creates
-   * [InstrumentedAnalysisContextImpl], which wraps [AnalysisContextImpl] used to create
-   * actual [Element]s. So, in index we have to unwrap [InstrumentedAnalysisContextImpl]
-   * when perform any operation.
-   */
-  static AnalysisContext unwrapContext(AnalysisContext context) {
-    if (context is InstrumentedAnalysisContextImpl) {
-      context = (context as InstrumentedAnalysisContextImpl).basis;
-    }
-    return context;
-  }
-
-  /**
-   * @return the [Source] of the enclosing [LibraryElement], may be `null`.
-   */
-  static Source _getLibrarySourceOrNull(Element element) {
-    LibraryElement library = element.library;
-    if (library == null) {
-      return null;
-    }
-    if (library.isAngularHtml) {
-      return null;
-    }
-    return library.source;
-  }
-
-  /**
-   * This map is used to canonicalize equal keys.
-   */
-  Map<MemoryIndexStoreImpl_ElementRelationKey, MemoryIndexStoreImpl_ElementRelationKey> _canonicalKeys = {};
-
-  /**
-   * The mapping of [ElementRelationKey] to the [Location]s, one-to-many.
-   */
-  Map<MemoryIndexStoreImpl_ElementRelationKey, Set<Location>> _keyToLocations = {};
-
-  /**
-   * The mapping of [Source] to the [ElementRelationKey]s. It is used in
-   * [removeSource] to identify keys to remove from
-   * [keyToLocations].
-   */
-  Map<AnalysisContext, Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>>> _contextToSourceToKeys = {};
-
-  /**
-   * The mapping of [Source] to the [Location]s existing in it. It is used in
-   * [clearSource0] to identify locations to remove from
-   * [keyToLocations].
-   */
-  Map<AnalysisContext, Map<MemoryIndexStoreImpl_Source2, List<Location>>> _contextToSourceToLocations = {};
-
-  /**
-   * The mapping of library [Source] to the [Source]s of part units.
-   */
-  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToLibraryToUnits = {};
-
-  /**
-   * The mapping of unit [Source] to the [Source]s of libraries it is used in.
-   */
-  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToUnitToLibraries = {};
-
-  int _sourceCount = 0;
-
-  int _keyCount = 0;
-
-  int _locationCount = 0;
-
-  @override
-  bool aboutToIndexDart(AnalysisContext context, CompilationUnitElement unitElement) {
-    context = unwrapContext(context);
-    // may be already disposed in other thread
-    if (context.isDisposed) {
-      return false;
-    }
-    // validate unit
-    if (unitElement == null) {
-      return false;
-    }
-    LibraryElement libraryElement = unitElement.library;
-    if (libraryElement == null) {
-      return false;
-    }
-    CompilationUnitElement definingUnitElement = libraryElement.definingCompilationUnit;
-    if (definingUnitElement == null) {
-      return false;
-    }
-    // prepare sources
-    Source library = definingUnitElement.source;
-    Source unit = unitElement.source;
-    // special handling for the defining library unit
-    if (unit == library) {
-      // prepare new parts
-      Set<Source> newParts = new Set();
-      for (CompilationUnitElement part in libraryElement.parts) {
-        newParts.add(part.source);
-      }
-      // prepare old parts
-      Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
-      if (libraryToUnits == null) {
-        libraryToUnits = {};
-        _contextToLibraryToUnits[context] = libraryToUnits;
-      }
-      Set<Source> oldParts = libraryToUnits[library];
-      // check if some parts are not in the library now
-      if (oldParts != null) {
-        Set<Source> noParts = oldParts.difference(newParts);
-        for (Source noPart in noParts) {
-          _removeLocations(context, library, noPart);
-        }
-      }
-      // remember new parts
-      libraryToUnits[library] = newParts;
-    }
-    // remember libraries in which unit is used
-    _recordUnitInLibrary(context, library, unit);
-    // remove locations
-    _removeLocations(context, library, unit);
-    // remove keys
-    {
-      Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
-      if (sourceToKeys != null) {
-        MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
-        bool hadSource = sourceToKeys.remove(source2) != null;
-        if (hadSource) {
-          _sourceCount--;
-        }
-      }
-    }
-    // OK, we can index
-    return true;
-  }
-
-  @override
-  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement) {
-    context = unwrapContext(context);
-    // may be already disposed in other thread
-    if (context.isDisposed) {
-      return false;
-    }
-    // remove locations
-    Source source = htmlElement.source;
-    _removeLocations(context, null, source);
-    // remove keys
-    {
-      Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
-      if (sourceToKeys != null) {
-        MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(null, source);
-        bool hadSource = sourceToKeys.remove(source2) != null;
-        if (hadSource) {
-          _sourceCount--;
-        }
-      }
-    }
-    // remember libraries in which unit is used
-    _recordUnitInLibrary(context, null, source);
-    // OK, we can index
-    return true;
-  }
-
-  @override
-  void clear() {
-    _canonicalKeys.clear();
-    _keyToLocations.clear();
-    _contextToSourceToKeys.clear();
-    _contextToSourceToLocations.clear();
-    _contextToLibraryToUnits.clear();
-    _contextToUnitToLibraries.clear();
-  }
-
-  @override
-  void doneIndex() {
-  }
-
-  @override
-  List<Location> getRelationships(Element element, Relationship relationship) {
-    MemoryIndexStoreImpl_ElementRelationKey key = new MemoryIndexStoreImpl_ElementRelationKey(element, relationship);
-    Set<Location> locations = _keyToLocations[key];
-    if (locations != null) {
-      return new List.from(locations);
-    }
-    return Location.EMPTY_ARRAY;
-  }
-
-  @override
-  String get statistics => "${_locationCount} relationships in ${_keyCount} keys in ${_sourceCount} sources";
-
-  int internalGetKeyCount() => _keyToLocations.length;
-
-  int internalGetLocationCount() {
-    int count = 0;
-    for (Set<Location> locations in _keyToLocations.values) {
-      count += locations.length;
-    }
-    return count;
-  }
-
-  int internalGetLocationCountForContext(AnalysisContext context) {
-    context = unwrapContext(context);
-    int count = 0;
-    for (Set<Location> locations in _keyToLocations.values) {
-      for (Location location in locations) {
-        if (identical(location.element.context, context)) {
-          count++;
-        }
-      }
-    }
-    return count;
-  }
-
-  int internalGetSourceKeyCount(AnalysisContext context) {
-    int count = 0;
-    Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
-    if (sourceToKeys != null) {
-      for (Set<MemoryIndexStoreImpl_ElementRelationKey> keys in sourceToKeys.values) {
-        count += keys.length;
-      }
-    }
-    return count;
-  }
-
-  @override
-  void recordRelationship(Element element, Relationship relationship, Location location) {
-    if (element == null || location == null) {
-      return;
-    }
-    location = location.newClone();
-    // at the index level we don't care about Member(s)
-    if (element is Member) {
-      element = (element as Member).baseElement;
-    }
-    //    System.out.println(element + " " + relationship + " " + location);
-    // prepare information
-    AnalysisContext elementContext = element.context;
-    AnalysisContext locationContext = location.element.context;
-    Source elementSource = element.source;
-    Source locationSource = location.element.source;
-    Source elementLibrarySource = _getLibrarySourceOrNull(element);
-    Source locationLibrarySource = _getLibrarySourceOrNull(location.element);
-    // sanity check
-    if (locationContext == null) {
-      return;
-    }
-    if (locationSource == null) {
-      return;
-    }
-    if (elementContext == null && element is! NameElementImpl && element is! UniverseElementImpl) {
-      return;
-    }
-    if (elementSource == null && element is! NameElementImpl && element is! UniverseElementImpl) {
-      return;
-    }
-    // may be already disposed in other thread
-    if (elementContext != null && elementContext.isDisposed) {
-      return;
-    }
-    if (locationContext.isDisposed) {
-      return;
-    }
-    // record: key -> location(s)
-    MemoryIndexStoreImpl_ElementRelationKey key = _getCanonicalKey(element, relationship);
-    {
-      Set<Location> locations = _keyToLocations.remove(key);
-      if (locations == null) {
-        locations = _createLocationIdentitySet();
-      } else {
-        _keyCount--;
-      }
-      _keyToLocations[key] = locations;
-      _keyCount++;
-      locations.add(location);
-      _locationCount++;
-    }
-    // record: location -> key
-    location.internalKey = key;
-    // prepare source pairs
-    MemoryIndexStoreImpl_Source2 elementSource2 = new MemoryIndexStoreImpl_Source2(elementLibrarySource, elementSource);
-    MemoryIndexStoreImpl_Source2 locationSource2 = new MemoryIndexStoreImpl_Source2(locationLibrarySource, locationSource);
-    // record: element source -> keys
-    {
-      Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[elementContext];
-      if (sourceToKeys == null) {
-        sourceToKeys = {};
-        _contextToSourceToKeys[elementContext] = sourceToKeys;
-      }
-      Set<MemoryIndexStoreImpl_ElementRelationKey> keys = sourceToKeys[elementSource2];
-      if (keys == null) {
-        keys = new Set();
-        sourceToKeys[elementSource2] = keys;
-        _sourceCount++;
-      }
-      keys.remove(key);
-      keys.add(key);
-    }
-    // record: location source -> locations
-    {
-      Map<MemoryIndexStoreImpl_Source2, List<Location>> sourceToLocations = _contextToSourceToLocations[locationContext];
-      if (sourceToLocations == null) {
-        sourceToLocations = {};
-        _contextToSourceToLocations[locationContext] = sourceToLocations;
-      }
-      List<Location> locations = sourceToLocations[locationSource2];
-      if (locations == null) {
-        locations = [];
-        sourceToLocations[locationSource2] = locations;
-      }
-      locations.add(location);
-    }
-  }
-
-  @override
-  void removeContext(AnalysisContext context) {
-    context = unwrapContext(context);
-    if (context == null) {
-      return;
-    }
-    // remove sources
-    removeSources(context, null);
-    // remove context
-    _contextToSourceToKeys.remove(context);
-    _contextToSourceToLocations.remove(context);
-    _contextToLibraryToUnits.remove(context);
-    _contextToUnitToLibraries.remove(context);
-  }
-
-  @override
-  void removeSource(AnalysisContext context, Source unit) {
-    context = unwrapContext(context);
-    if (context == null) {
-      return;
-    }
-    // remove locations defined in source
-    Map<Source, Set<Source>> unitToLibraries = _contextToUnitToLibraries[context];
-    if (unitToLibraries != null) {
-      Set<Source> libraries = unitToLibraries.remove(unit);
-      if (libraries != null) {
-        for (Source library in libraries) {
-          MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
-          // remove locations defined in source
-          _removeLocations(context, library, unit);
-          // remove keys for elements defined in source
-          Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
-          if (sourceToKeys != null) {
-            Set<MemoryIndexStoreImpl_ElementRelationKey> keys = sourceToKeys.remove(source2);
-            if (keys != null) {
-              for (MemoryIndexStoreImpl_ElementRelationKey key in keys) {
-                _canonicalKeys.remove(key);
-                Set<Location> locations = _keyToLocations.remove(key);
-                if (locations != null) {
-                  _keyCount--;
-                  _locationCount -= locations.length;
-                }
-              }
-              _sourceCount--;
-            }
-          }
-        }
-      }
-    }
-  }
-
-  @override
-  void removeSources(AnalysisContext context, SourceContainer container) {
-    context = unwrapContext(context);
-    if (context == null) {
-      return;
-    }
-    // remove sources #1
-    Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
-    if (sourceToKeys != null) {
-      List<MemoryIndexStoreImpl_Source2> sources = [];
-      for (MemoryIndexStoreImpl_Source2 source2 in sources) {
-        Source source = source2._unitSource;
-        if (container == null || container.contains(source)) {
-          removeSource(context, source);
-        }
-      }
-    }
-    // remove sources #2
-    Map<MemoryIndexStoreImpl_Source2, List<Location>> sourceToLocations = _contextToSourceToLocations[context];
-    if (sourceToLocations != null) {
-      List<MemoryIndexStoreImpl_Source2> sources = [];
-      for (MemoryIndexStoreImpl_Source2 source2 in sources) {
-        Source source = source2._unitSource;
-        if (container == null || container.contains(source)) {
-          removeSource(context, source);
-        }
-      }
-    }
-  }
-
-  /**
-   * Creates new [Set] that uses object identity instead of equals.
-   */
-  Set<Location> _createLocationIdentitySet() => new Set<Location>.identity();
-
-  /**
-   * @return the canonical [ElementRelationKey] for given [Element] and
-   *         [Relationship], i.e. unique instance for this combination.
-   */
-  MemoryIndexStoreImpl_ElementRelationKey _getCanonicalKey(Element element, Relationship relationship) {
-    MemoryIndexStoreImpl_ElementRelationKey key = new MemoryIndexStoreImpl_ElementRelationKey(element, relationship);
-    MemoryIndexStoreImpl_ElementRelationKey canonicalKey = _canonicalKeys[key];
-    if (canonicalKey == null) {
-      canonicalKey = key;
-      _canonicalKeys[key] = canonicalKey;
-    }
-    return canonicalKey;
-  }
-
-  void _recordUnitInLibrary(AnalysisContext context, Source library, Source unit) {
-    Map<Source, Set<Source>> unitToLibraries = _contextToUnitToLibraries[context];
-    if (unitToLibraries == null) {
-      unitToLibraries = {};
-      _contextToUnitToLibraries[context] = unitToLibraries;
-    }
-    Set<Source> libraries = unitToLibraries[unit];
-    if (libraries == null) {
-      libraries = new Set();
-      unitToLibraries[unit] = libraries;
-    }
-    libraries.add(library);
-  }
-
-  /**
-   * Removes locations recorded in the given library/unit pair.
-   */
-  void _removeLocations(AnalysisContext context, Source library, Source unit) {
-    MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
-    Map<MemoryIndexStoreImpl_Source2, List<Location>> sourceToLocations = _contextToSourceToLocations[context];
-    if (sourceToLocations != null) {
-      List<Location> sourceLocations = sourceToLocations.remove(source2);
-      if (sourceLocations != null) {
-        for (Location location in sourceLocations) {
-          MemoryIndexStoreImpl_ElementRelationKey key = location.internalKey as MemoryIndexStoreImpl_ElementRelationKey;
-          Set<Location> relLocations = _keyToLocations[key];
-          if (relLocations != null) {
-            relLocations.remove(location);
-            _locationCount--;
-            // no locations with this key
-            if (relLocations.isEmpty) {
-              _canonicalKeys.remove(key);
-              _keyToLocations.remove(key);
-              _keyCount--;
-            }
-          }
-        }
-      }
-    }
-  }
-}
-
-class MemoryIndexStoreImpl_ElementRelationKey {
-  final Element _element;
-
-  final Relationship _relationship;
-
-  MemoryIndexStoreImpl_ElementRelationKey(this._element, this._relationship);
-
-  @override
-  bool operator ==(Object obj) {
-    MemoryIndexStoreImpl_ElementRelationKey other = obj as MemoryIndexStoreImpl_ElementRelationKey;
-    Element otherElement = other._element;
-    return identical(other._relationship, _relationship) && otherElement.nameOffset == _element.nameOffset && otherElement.kind == _element.kind && otherElement.displayName == _element.displayName && otherElement.source == _element.source;
-  }
-
-  @override
-  int get hashCode => JavaArrays.makeHashCode([
-      _element.source,
-      _element.nameOffset,
-      _element.kind,
-      _element.displayName,
-      _relationship]);
-
-  @override
-  String toString() => "${_element} ${_relationship}";
-}
-
-class MemoryIndexStoreImpl_Source2 {
-  final Source _librarySource;
-
-  final Source _unitSource;
-
-  MemoryIndexStoreImpl_Source2(this._librarySource, this._unitSource);
-
-  @override
-  bool operator ==(Object obj) {
-    if (identical(obj, this)) {
-      return true;
-    }
-    if (obj is! MemoryIndexStoreImpl_Source2) {
-      return false;
-    }
-    MemoryIndexStoreImpl_Source2 other = obj as MemoryIndexStoreImpl_Source2;
-    return other._librarySource == _librarySource && other._unitSource == _unitSource;
-  }
-
-  @override
-  int get hashCode => JavaArrays.makeHashCode([_librarySource, _unitSource]);
-
-  @override
-  String toString() => "${_librarySource} ${_unitSource}";
-}
-
-/**
- * Special [Element] which is used to index references to the name without specifying concrete
- * kind of this name - field, method or something else.
- */
-class NameElementImpl extends ElementImpl {
-  NameElementImpl(String name) : super("name:${name}", -1);
-
-  @override
-  accept(ElementVisitor visitor) => null;
-
-  @override
-  ElementKind get kind => ElementKind.NAME;
-}
-
-/**
- * The enumeration <code>ProcessorState</code> represents the possible states of an operation
- * processor.
- */
-class ProcessorState extends Enum<ProcessorState> {
-  /**
-   * The processor is ready to be run (has not been run before).
-   */
-  static const ProcessorState READY = const ProcessorState('READY', 0);
-
-  /**
-   * The processor is currently performing operations.
-   */
-  static const ProcessorState RUNNING = const ProcessorState('RUNNING', 1);
-
-  /**
-   * The processor is currently performing operations but has been asked to stop.
-   */
-  static const ProcessorState STOP_REQESTED = const ProcessorState('STOP_REQESTED', 2);
-
-  /**
-   * The processor has stopped performing operations and cannot be used again.
-   */
-  static const ProcessorState STOPPED = const ProcessorState('STOPPED', 3);
-
-  static const List<ProcessorState> values = const [READY, RUNNING, STOP_REQESTED, STOPPED];
-
-  const ProcessorState(String name, int ordinal) : super(name, ordinal);
-}
-
-/**
- * Relationship between an element and a location. Relationships are identified by a globally unique
- * identifier.
- */
-class Relationship {
-  /**
-   * The unique identifier for this relationship.
-   */
-  final String _uniqueId;
-
-  /**
-   * A table mapping relationship identifiers to relationships.
-   */
-  static Map<String, Relationship> _RelationshipMap = {};
-
-  /**
-   * Return the relationship with the given unique identifier.
-   *
-   * @param uniqueId the unique identifier for the relationship
-   * @return the relationship with the given unique identifier
-   */
-  static Relationship getRelationship(String uniqueId) {
-    Relationship relationship = _RelationshipMap[uniqueId];
-    if (relationship == null) {
-      relationship = new Relationship(uniqueId);
-      _RelationshipMap[uniqueId] = relationship;
-    }
-    return relationship;
-  }
-
-  /**
-   * @return all registered [Relationship]s.
-   */
-  static Iterable<Relationship> values() => _RelationshipMap.values;
-
-  /**
-   * Initialize a newly created relationship to have the given unique identifier.
-   *
-   * @param uniqueId the unique identifier for this relationship
-   */
-  Relationship(this._uniqueId);
-
-  /**
-   * Return the unique identifier for this relationship.
-   *
-   * @return the unique identifier for this relationship
-   */
-  String get identifier => _uniqueId;
-
-  @override
-  String toString() => _uniqueId;
-}
-
-/**
- * The interface <code>RelationshipCallback</code> defines the behavior of objects that are invoked
- * with the results of a query about a given relationship.
- */
-abstract class RelationshipCallback {
-  /**
-   * This method is invoked when the locations that have a specified relationship with a specified
-   * element are available. For example, if the element is a field and the relationship is the
-   * is-referenced-by relationship, then this method will be invoked with each location at which the
-   * field is referenced.
-   *
-   * @param element the [Element] that has the relationship with the locations
-   * @param relationship the relationship between the given element and the locations
-   * @param locations the locations that were found
-   */
-  void hasRelationships(Element element, Relationship relationship, List<Location> locations);
-}
-
-/**
- * Instances of the [RemoveContextOperation] implement an operation that removes from the
- * index any data based on the specified [AnalysisContext].
- */
-class RemoveContextOperation implements IndexOperation {
-  /**
-   * The index store against which this operation is being run.
-   */
-  final IndexStore _indexStore;
-
-  /**
-   * The context being removed.
-   */
-  final AnalysisContext context;
-
-  /**
-   * Initialize a newly created operation that will remove the specified resource.
-   *
-   * @param indexStore the index store against which this operation is being run
-   * @param context the [AnalysisContext] to remove
-   */
-  RemoveContextOperation(this._indexStore, this.context);
-
-  @override
-  bool get isQuery => false;
-
-  @override
-  void performOperation() {
-    _indexStore.removeContext(context);
-  }
-
-  @override
-  bool removeWhenSourceRemoved(Source source) => false;
-
-  @override
-  String toString() => "RemoveContext(${context})";
-}
-
-/**
- * Instances of the [RemoveSourceOperation] implement an operation that removes from the index
- * any data based on the content of a specified source.
- */
-class RemoveSourceOperation implements IndexOperation {
-  /**
-   * The index store against which this operation is being run.
-   */
-  final IndexStore _indexStore;
-
-  /**
-   * The context in which source being removed.
-   */
-  final AnalysisContext _context;
-
-  /**
-   * The source being removed.
-   */
-  final Source source;
-
-  /**
-   * Initialize a newly created operation that will remove the specified resource.
-   *
-   * @param indexStore the index store against which this operation is being run
-   * @param context the [AnalysisContext] to remove source in
-   * @param source the [Source] to remove from index
-   */
-  RemoveSourceOperation(this._indexStore, this._context, this.source);
-
-  @override
-  bool get isQuery => false;
-
-  @override
-  void performOperation() {
-    _indexStore.removeSource(_context, source);
-  }
-
-  @override
-  bool removeWhenSourceRemoved(Source source) => false;
-
-  @override
-  String toString() => "RemoveSource(${source.fullName})";
-}
-
-/**
- * Instances of the [RemoveSourcesOperation] implement an operation that removes from the
- * index any data based on the content of source belonging to a [SourceContainer].
- */
-class RemoveSourcesOperation implements IndexOperation {
-  /**
-   * The index store against which this operation is being run.
-   */
-  final IndexStore _indexStore;
-
-  /**
-   * The context to remove container.
-   */
-  final AnalysisContext _context;
-
-  /**
-   * The source container to remove.
-   */
-  final SourceContainer container;
-
-  /**
-   * Initialize a newly created operation that will remove the specified resource.
-   *
-   * @param indexStore the index store against which this operation is being run
-   * @param context the [AnalysisContext] to remove container in
-   * @param container the [SourceContainer] to remove from index
-   */
-  RemoveSourcesOperation(this._indexStore, this._context, this.container);
-
-  @override
-  bool get isQuery => false;
-
-  @override
-  void performOperation() {
-    _indexStore.removeSources(_context, container);
-  }
-
-  @override
-  bool removeWhenSourceRemoved(Source source) => false;
-
-  @override
-  String toString() => "RemoveSources(${container})";
-}
-
-/**
- * The interface `UniverseElement` defines element to use when we want to request "defines"
- * relations without specifying exact library.
- */
-abstract class UniverseElement implements Element {
-  static final UniverseElement INSTANCE = UniverseElementImpl.INSTANCE;
-}
-
-/**
- * Implementation of [UniverseElement].
- */
-class UniverseElementImpl extends ElementImpl implements UniverseElement {
-  static UniverseElementImpl INSTANCE = new UniverseElementImpl();
-
-  UniverseElementImpl() : super("--universe--", -1);
-
-  @override
-  accept(ElementVisitor visitor) => null;
-
-  @override
-  ElementKind get kind => ElementKind.UNIVERSE;
-}
\ No newline at end of file
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index dde1f17..eabd388 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.17.3
+version: 0.21.0
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
@@ -9,5 +9,7 @@
   args: '>=0.10.0 <0.12.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
+  watcher: '>=0.9.0 <0.10.0'
 dev_dependencies:
+  typed_mock: '>=0.0.4 <1.0.0'
   unittest: '>=0.9.0 <0.12.0'
diff --git a/pkg/analysis_server/test/resource_test.dart b/pkg/analyzer/test/file_system/memory_file_system_test.dart
similarity index 89%
rename from pkg/analysis_server/test/resource_test.dart
rename to pkg/analyzer/test/file_system/memory_file_system_test.dart
index a290b39..8956b41 100644
--- a/pkg/analysis_server/test/resource_test.dart
+++ b/pkg/analyzer/test/file_system/memory_file_system_test.dart
@@ -2,18 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.resource;
+library test.memory_file_system;
 
 import 'dart:async';
 
-import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 import 'package:watcher/watcher.dart';
-
-import 'mocks.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/file_system/file_system.dart';
 
 
 var _isFile = new isInstanceOf<File>();
@@ -42,7 +41,7 @@
     group('Watch', () {
 
       Future delayed(computation()) {
-        return pumpEventQueue().then((_) => computation());
+        return new Future.delayed(Duration.ZERO, computation);
       }
 
       watchingFolder(String path, test(List<WatchEvent> changesReceived)) {
@@ -476,57 +475,4 @@
       });
     });
   });
-
-  group('ResourceUriResolver', testResourceResourceUriResolver);
-}
-
-
-void testResourceResourceUriResolver() {
-  MemoryResourceProvider provider;
-  ResourceUriResolver resolver;
-
-  setUp(() {
-    provider = new MemoryResourceProvider();
-    resolver = new ResourceUriResolver(provider);
-    provider.newFile('/test.dart', '');
-    provider.newFolder('/folder');
-  });
-
-  group('fromEncoding', () {
-    test('file', () {
-      var uri = new Uri(path: '/test.dart');
-      Source source = resolver.fromEncoding(UriKind.FILE_URI, uri);
-      expect(source, isNotNull);
-      expect(source.exists(), isTrue);
-      expect(source.fullName, '/test.dart');
-    });
-
-    test('not a UriKind.FILE_URI', () {
-      var uri = new Uri(path: '/test.dart');
-      Source source = resolver.fromEncoding(UriKind.DART_URI, uri);
-      expect(source, isNull);
-    });
-  });
-
-  group('resolveAbsolute', () {
-    test('file', () {
-      var uri = new Uri(scheme: 'file', path: '/test.dart');
-      Source source = resolver.resolveAbsolute(uri);
-      expect(source, isNotNull);
-      expect(source.exists(), isTrue);
-      expect(source.fullName, '/test.dart');
-    });
-
-    test('folder', () {
-      var uri = new Uri(scheme: 'file', path: '/folder');
-      Source source = resolver.resolveAbsolute(uri);
-      expect(source, isNull);
-    });
-
-    test('not a file URI', () {
-      var uri = new Uri(scheme: 'https', path: '127.0.0.1/test.dart');
-      Source source = resolver.resolveAbsolute(uri);
-      expect(source, isNull);
-    });
-  });
 }
diff --git a/pkg/analysis_server/test/physical_resource_provider_test.dart b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
similarity index 97%
rename from pkg/analysis_server/test/physical_resource_provider_test.dart
rename to pkg/analyzer/test/file_system/physical_resource_provider_test.dart
index eb63bf1..462a648 100644
--- a/pkg/analysis_server/test/physical_resource_provider_test.dart
+++ b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
@@ -2,17 +2,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.physical.resource.provider;
+library test.physical_file_system;
 
 import 'dart:async';
 import 'dart:io' as io;
 
-import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 import 'package:watcher/watcher.dart';
 
+
+var _isFile = new isInstanceOf<File>();
+var _isFolder = new isInstanceOf<Folder>();
+
+
 main() {
   groupSep = ' | ';
 
@@ -287,7 +293,3 @@
       });
     });
 }
-
-var _isFile = new isInstanceOf<File>();
-var _isFolder = new isInstanceOf<Folder>();
-var _isMemoryResourceException = new isInstanceOf<MemoryResourceException>();
diff --git a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
new file mode 100644
index 0000000..76761cb
--- /dev/null
+++ b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.resource_uri_resolver;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('ResourceUriResolver', () {
+    MemoryResourceProvider provider;
+    ResourceUriResolver resolver;
+
+    setUp(() {
+      provider = new MemoryResourceProvider();
+      resolver = new ResourceUriResolver(provider);
+      provider.newFile('/test.dart', '');
+      provider.newFolder('/folder');
+    });
+
+    group('fromEncoding', () {
+      test('file', () {
+        var uri = new Uri(path: '/test.dart');
+        Source source = resolver.fromEncoding(UriKind.FILE_URI, uri);
+        expect(source, isNotNull);
+        expect(source.exists(), isTrue);
+        expect(source.fullName, '/test.dart');
+      });
+
+      test('not a UriKind.FILE_URI', () {
+        var uri = new Uri(path: '/test.dart');
+        Source source = resolver.fromEncoding(UriKind.DART_URI, uri);
+        expect(source, isNull);
+      });
+    });
+
+    group('resolveAbsolute', () {
+      test('file', () {
+        var uri = new Uri(scheme: 'file', path: '/test.dart');
+        Source source = resolver.resolveAbsolute(uri);
+        expect(source, isNotNull);
+        expect(source.exists(), isTrue);
+        expect(source.fullName, '/test.dart');
+      });
+
+      test('folder', () {
+        var uri = new Uri(scheme: 'file', path: '/folder');
+        Source source = resolver.resolveAbsolute(uri);
+        expect(source, isNull);
+      });
+
+      test('not a file URI', () {
+        var uri = new Uri(scheme: 'https', path: '127.0.0.1/test.dart');
+        Source source = resolver.resolveAbsolute(uri);
+        expect(source, isNull);
+      });
+    });
+  });
+}
diff --git a/pkg/analyzer/test/file_system/test_all.dart b/pkg/analyzer/test/file_system/test_all.dart
new file mode 100644
index 0000000..41307a9
--- /dev/null
+++ b/pkg/analyzer/test/file_system/test_all.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.file_system;
+
+import 'package:unittest/unittest.dart';
+
+import 'memory_file_system_test.dart' as memory_file_system_test;
+import 'resource_uri_resolver_test.dart' as resource_uri_resolver_test;
+
+
+/// Utility for manually running all tests.
+main() {
+  groupSep = ' | ';
+  group('file_system', () {
+    memory_file_system_test.main();
+    resource_uri_resolver_test.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/args/CHANGELOG.md b/pkg/args/CHANGELOG.md
index cb8acb9..5349ae2 100644
--- a/pkg/args/CHANGELOG.md
+++ b/pkg/args/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.11.1
+
+* Options may define `valueHelp` which will then be shown in the usage.
+
 ## 0.11.0
 
 * Move handling trailing options from `ArgParser.parse()` into `ArgParser`
diff --git a/pkg/args/README.md b/pkg/args/README.md
index fe31554..bee1ea2 100644
--- a/pkg/args/README.md
+++ b/pkg/args/README.md
@@ -53,7 +53,7 @@
 Later, when parsing occurs, the callback function is invoked with the value of
 the option:
 
-    parser.addOption('mode', callback: (mode) => print('Got mode $mode));
+    parser.addOption('mode', callback: (mode) => print('Got mode $mode'));
     parser.addFlag('verbose', callback: (verbose) {
       if (verbose) print('Verbose');
     });
@@ -209,6 +209,11 @@
         allowed: ['debug', 'release']);
     parser.addFlag('verbose', help: 'Show additional diagnostic info');
 
+For non-flag options, you can also provide a help string for the parameter:
+
+    parser.addOption('out', help: 'The output path', helpValue: 'path',
+        allowed: ['debug', 'release']);
+
 For non-flag options, you can also provide detailed help for each expected value
 by using the `allowedHelp:` parameter:
 
@@ -227,16 +232,12 @@
     --mode            The compiler configuration
                       [debug, release]
 
+    --out=<path>      The output path
     --[no-]verbose    Show additional diagnostic info
     --arch            The architecture to compile for
-
           [arm]       ARM Holding 32-bit chip
           [ia32]      Intel x86
 
-To assist the formatting of the usage help, single-line help text is followed by
-a single new line. Options with multi-line help text are followed by two new
-lines. This provides spatial diversity between options.
-
 [posix]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
 [gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces
 [ArgParser]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/args.ArgParser
diff --git a/pkg/args/lib/args.dart b/pkg/args/lib/args.dart
index 4eb23c0..ec40958 100644
--- a/pkg/args/lib/args.dart
+++ b/pkg/args/lib/args.dart
@@ -68,7 +68,7 @@
   /// * There is already an option using abbreviation [abbr].
   void addFlag(String name, {String abbr, String help, bool defaultsTo: false,
       bool negatable: true, void callback(bool value), bool hide: false}) {
-    _addOption(name, abbr, help, null, null, defaultsTo, callback,
+    _addOption(name, abbr, help, null, null, null, defaultsTo, callback,
         isFlag: true, negatable: negatable, hide: hide);
   }
 
@@ -76,16 +76,16 @@
   ///
   /// * There is already an option with name [name].
   /// * There is already an option using abbreviation [abbr].
-  void addOption(String name, {String abbr, String help, List<String> allowed,
-      Map<String, String> allowedHelp, String defaultsTo,
+  void addOption(String name, {String abbr, String help, String valueHelp,
+      List<String> allowed, Map<String, String> allowedHelp, String defaultsTo,
       void callback(value), bool allowMultiple: false, bool hide: false}) {
-    _addOption(name, abbr, help, allowed, allowedHelp, defaultsTo,
+    _addOption(name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo,
         callback, isFlag: false, allowMultiple: allowMultiple,
         hide: hide);
   }
 
-  void _addOption(String name, String abbr, String help, List<String> allowed,
-      Map<String, String> allowedHelp, defaultsTo,
+  void _addOption(String name, String abbr, String help, String valueHelp,
+      List<String> allowed, Map<String, String> allowedHelp, defaultsTo,
       void callback(value), {bool isFlag, bool negatable: false,
       bool allowMultiple: false, bool hide: false}) {
     // Make sure the name isn't in use.
@@ -102,8 +102,8 @@
       }
     }
 
-    _options[name] = new Option(name, abbr, help, allowed, allowedHelp,
-        defaultsTo, callback, isFlag: isFlag, negatable: negatable,
+    _options[name] = new Option(name, abbr, help, valueHelp, allowed,
+        allowedHelp, defaultsTo, callback, isFlag: isFlag, negatable: negatable,
         allowMultiple: allowMultiple, hide: hide);
   }
 
diff --git a/pkg/args/lib/src/options.dart b/pkg/args/lib/src/options.dart
index d78459e..34dc8d3 100644
--- a/pkg/args/lib/src/options.dart
+++ b/pkg/args/lib/src/options.dart
@@ -10,15 +10,16 @@
   final defaultValue;
   final Function callback;
   final String help;
+  final String valueHelp;
   final Map<String, String> allowedHelp;
   final bool isFlag;
   final bool negatable;
   final bool allowMultiple;
   final bool hide;
 
-  Option(this.name, this.abbreviation, this.help, List<String> allowed,
-      Map<String, String> allowedHelp, this.defaultValue, this.callback,
-      {this.isFlag, this.negatable, this.allowMultiple: false,
+  Option(this.name, this.abbreviation, this.help, this.valueHelp,
+      List<String> allowed, Map<String, String> allowedHelp, this.defaultValue,
+      this.callback, {this.isFlag, this.negatable, this.allowMultiple: false,
       this.hide: false}) :
         this.allowed = allowed == null ?
             null : new UnmodifiableListView(allowed),
diff --git a/pkg/args/lib/src/usage.dart b/pkg/args/lib/src/usage.dart
index a431395..11be54b 100644
--- a/pkg/args/lib/src/usage.dart
+++ b/pkg/args/lib/src/usage.dart
@@ -108,11 +108,16 @@
   }
 
   String getLongOption(Option option) {
+    var result;
     if (option.negatable) {
-      return '--[no-]${option.name}';
+      result = '--[no-]${option.name}';
     } else {
-      return '--${option.name}';
+      result = '--${option.name}';
     }
+
+    if (option.valueHelp != null) result += "=<${option.valueHelp}>";
+
+    return result;
   }
 
   String getAllowedTitle(String allowed) {
diff --git a/pkg/args/pubspec.yaml b/pkg/args/pubspec.yaml
index 238df34..c554816 100644
--- a/pkg/args/pubspec.yaml
+++ b/pkg/args/pubspec.yaml
@@ -1,5 +1,5 @@
 name: args
-version: 0.11.0+1
+version: 0.11.1-dev
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 documentation: http://api.dartlang.org/docs/pkg/args
diff --git a/pkg/args/test/usage_test.dart b/pkg/args/test/usage_test.dart
index 77d66a8..b6b860d 100644
--- a/pkg/args/test/usage_test.dart
+++ b/pkg/args/test/usage_test.dart
@@ -122,6 +122,17 @@
           ''');
     });
 
+    test('the value help is shown', () {
+      var parser = new ArgParser();
+      parser.addOption('out', abbr: 'o', help: 'Where to write file',
+          valueHelp: 'path');
+
+      validateUsage(parser,
+          '''
+          -o, --out=<path>    Where to write file
+          ''');
+    });
+
     test('the allowed list is shown', () {
       var parser = new ArgParser();
       parser.addOption('suit', help: 'Like in cards',
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index 77b5b0c..deed1bc 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.14.1+2
+
+* Automatically log how long it takes long-running transforms to run.
+
 ## 0.14.1+1
 
 * Fix a bug where an event could be added to a closed stream.
diff --git a/pkg/barback/lib/src/graph/transform_node.dart b/pkg/barback/lib/src/graph/transform_node.dart
index 901d79e..44b369e 100644
--- a/pkg/barback/lib/src/graph/transform_node.dart
+++ b/pkg/barback/lib/src/graph/transform_node.dart
@@ -166,6 +166,18 @@
   /// [_State.NEEDS_DECLARE], and always `null` otherwise.
   AggregateTransformController _applyController;
 
+  /// The number of secondary inputs that have been requested but not yet
+  /// produced.
+  int _pendingSecondaryInputs = 0;
+
+  /// A stopwatch that tracks the total time spent in a transformer's `apply`
+  /// function.
+  final _timeInTransformer = new Stopwatch();
+
+  /// A stopwatch that tracks the time in a transformer's `apply` function spent
+  /// waiting for [getInput] calls to complete.
+  final _timeAwaitingInputs = new Stopwatch();
+
   TransformNode(this.classifier, this.transformer, this.key, this._location) {
     _forced = transformer is! DeclaringAggregateTransformer;
 
@@ -548,6 +560,8 @@
   ///
   /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
   Future<Asset> getInput(AssetId id) {
+    _timeAwaitingInputs.start();
+    _pendingSecondaryInputs++;
     return phase.previous.getOutput(id).then((node) {
       // Throw if the input isn't found. This ensures the transformer's apply
       // is exited. We'll then catch this and report it through the proper
@@ -562,6 +576,9 @@
       });
 
       return node.asset;
+    }).whenComplete(() {
+      _pendingSecondaryInputs--;
+      if (_pendingSecondaryInputs != 0) _timeAwaitingInputs.stop();
     });
   }
 
@@ -579,8 +596,14 @@
     _maybeFinishApplyController();
 
     return syncFuture(() {
+      _timeInTransformer.reset();
+      _timeAwaitingInputs.reset();
+      _timeInTransformer.start();
       return transformer.apply(controller.transform);
     }).whenComplete(() {
+      _timeInTransformer.stop();
+      _timeAwaitingInputs.stop();
+
       // Cancel the controller here even if `apply` wasn't interrupted. Since
       // the apply is finished, we want to close out the controller's streams.
       controller.cancel();
@@ -600,6 +623,27 @@
       if (_state == _State.NEEDS_APPLY) return false;
       if (_state == _State.NEEDS_DECLARE) return false;
       if (controller.loggedError) return true;
+
+      // If the transformer took long enough, log its duration in fine output.
+      // That way it's not always visible, but users running with "pub serve
+      // --verbose" can see it.
+      var ranLong = _timeInTransformer.elapsed > new Duration(seconds: 1);
+      var ranLongLocally =
+          _timeInTransformer.elapsed - _timeAwaitingInputs.elapsed >
+            new Duration(milliseconds: 200);
+
+      // Report the transformer's timing information if it spent more than 0.2s
+      // doing things other than waiting for its secondary inputs or if it spent
+      // more than 1s in total.
+      if (ranLongLocally || ranLong) {
+        _streams.onLogController.add(new LogEntry(
+            info, info.primaryId, LogLevel.FINE,
+            "Took ${niceDuration(_timeInTransformer.elapsed)} "
+              "(${niceDuration(_timeAwaitingInputs.elapsed)} awaiting "
+              "secondary inputs).",
+            null));
+      }
+
       _handleApplyResults(controller);
       return false;
     }).catchError((error, stackTrace) {
diff --git a/pkg/barback/lib/src/utils.dart b/pkg/barback/lib/src/utils.dart
index c26c7e8..7ce6724 100644
--- a/pkg/barback/lib/src/utils.dart
+++ b/pkg/barback/lib/src/utils.dart
@@ -336,3 +336,12 @@
 /// [toString], so we remove that if it exists.
 String getErrorMessage(error) =>
   error.toString().replaceFirst(_exceptionPrefix, '');
+
+/// Returns a human-friendly representation of [duration].
+String niceDuration(Duration duration) {
+  var result = duration.inMinutes > 0 ? "${duration.inMinutes}:" : "";
+
+  var s = duration.inSeconds % 59;
+  var ms = (duration.inMilliseconds % 1000) ~/ 100;
+  return result + "$s.${ms}s";
+}
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 44d2586..cc7f5df 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -7,7 +7,7 @@
 #
 # When the minor or patch version of this is upgraded, you *must* update that
 # version constraint in pub to stay in sync with this.
-version: 0.14.1+1
+version: 0.14.1+3
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
diff --git a/pkg/code_transformers/lib/src/test_harness.dart b/pkg/code_transformers/lib/src/test_harness.dart
index e579a58..3340204 100644
--- a/pkg/code_transformers/lib/src/test_harness.dart
+++ b/pkg/code_transformers/lib/src/test_harness.dart
@@ -64,8 +64,8 @@
     });
 
     logSubscription = barback.log.listen((entry) {
-      // Ignore info messages.
-      if (entry.level == LogLevel.INFO) return;
+      // Ignore info and fine messages.
+      if (entry.level == LogLevel.INFO || entry.level == LogLevel.FINE) return;
       if (entry.level == LogLevel.ERROR) errorSeen = true;
       // We only check messages when an expectation is provided.
       if (messages == null) return;
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index 784c07d..4ed4931 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -1,5 +1,5 @@
 name: code_transformers
-version: 0.1.4+2
+version: 0.1.4+3
 author: "Dart Team <misc@dartlang.org>"
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
diff --git a/pkg/http_server/lib/src/virtual_directory.dart b/pkg/http_server/lib/src/virtual_directory.dart
index f34baea..bf4e1a5 100644
--- a/pkg/http_server/lib/src/virtual_directory.dart
+++ b/pkg/http_server/lib/src/virtual_directory.dart
@@ -286,14 +286,17 @@
 
       response.write(header);
 
-      void add(String name, String modified, var size) {
-        try {
+      void add(String name, String modified, var size, bool folder) {
         if (size == null) size = "-";
         if (modified == null) modified = "";
         var encodedSize = new HtmlEscape().convert(size.toString());
         var encodedModified = new HtmlEscape().convert(modified);
         var encodedLink = new HtmlEscape(HtmlEscapeMode.ATTRIBUTE)
-            .convert(Uri.encodeComponent(normalize(join(path, name))));
+            .convert(Uri.encodeComponent(name));
+        if (folder) {
+          encodedLink += '/';
+          name += '/';
+        }
         var encodedName = new HtmlEscape().convert(name);
 
         var entry =
@@ -303,25 +306,25 @@
     <td style="text-align: right">$encodedSize</td>
   </tr>''';
         response.write(entry);
-        } catch (e) {
-          print(e);
-        }
       }
 
       if (path != '/') {
-        add('../', null, null);
+        add('..', null, null, true);
       }
 
       dir.list(followLinks: true).listen((entity) {
+        var name = basename(entity.path);
+        var stat = entity.statSync();
         if (entity is File) {
-          var stat = entity.statSync();
-          add(basename(entity.path),
+          add(name,
               stat.modified.toString(),
-              stat.size);
+              stat.size,
+              false);
         } else if (entity is Directory) {
-          add(basename(entity.path) + '/',
-              entity.statSync().modified.toString(),
-              null);
+          add(name,
+              stat.modified.toString(),
+              null,
+              true);
         }
       }, onError: (e) {
         // TODO(kevmoo): log error
diff --git a/pkg/http_server/pubspec.yaml b/pkg/http_server/pubspec.yaml
index 52323a6..c59bb7f 100644
--- a/pkg/http_server/pubspec.yaml
+++ b/pkg/http_server/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_server
-version: 0.9.2+1
+version: 0.9.2+2
 author: Dart Team <misc@dartlang.org>
 description: Library of HTTP server classes.
 homepage: http://www.dartlang.org
diff --git a/pkg/http_server/test/virtual_directory_test.dart b/pkg/http_server/test/virtual_directory_test.dart
index 81e0071..b95abdc 100644
--- a/pkg/http_server/test/virtual_directory_test.dart
+++ b/pkg/http_server/test/virtual_directory_test.dart
@@ -116,6 +116,17 @@
           });
       });
 
+      testVirtualDir('dir-href', (dir) {
+        var virDir = new VirtualDirectory(dir.path);
+        new Directory('${dir.path}/dir').createSync();
+        virDir.allowDirectoryListing = true;
+
+        return getAsString(virDir, '/')
+          .then((result) {
+            expect(result, contains('<a href="dir/">'));
+          });
+      });
+
       testVirtualDir('dirs', (dir) {
         var virDir = new VirtualDirectory(dir.path);
         for (int i = 0; i < 10; i++) {
@@ -194,7 +205,7 @@
 
           return getAsString(virDir, '/')
             .then((result) {
-              expect(result, contains('%2Fjavascript%3Aalert(document)%3B%22'));
+              expect(result, contains('javascript%3Aalert(document)%3B%22/'));
             });
         });
 
@@ -206,7 +217,7 @@
           return getAsString(virDir, '/')
             .then((result) {
               expect(result, contains('&lt;&gt;&amp;&quot;&#x2F;'));
-              expect(result, contains('href="%2F%3C%3E%26%22"'));
+              expect(result, contains('href="%3C%3E%26%22/"'));
             });
         });
       }
diff --git a/pkg/intl/CHANGELOG.md b/pkg/intl/CHANGELOG.md
index 33c6a16..67cad08 100644
--- a/pkg/intl/CHANGELOG.md
+++ b/pkg/intl/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.11.1
+
+ * Negative numbers were being parsed as positive.
+
+## 0.11.0
+
+ * Switch the message format from a custom JSON format to 
+   the ARB format ( https://code.google.com/p/arb/ )
+
 ## 0.10.0
  
  * Make message catalogs use deferred loading.
diff --git a/pkg/intl/bin/extract_to_arb.dart b/pkg/intl/bin/extract_to_arb.dart
new file mode 100644
index 0000000..13b8c30
--- /dev/null
+++ b/pkg/intl/bin/extract_to_arb.dart
@@ -0,0 +1,124 @@
+#!/usr/bin/env dart
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * This script uses the extract_messages.dart library to find the Intl.message
+ * calls in the target dart files and produces ARB format output. See
+ * https://code.google.com/p/arb/wiki/ApplicationResourceBundleSpecification
+ */
+library extract_to_arb;
+
+import 'dart:convert';
+import 'dart:io';
+import 'package:intl/extract_messages.dart';
+import 'package:path/path.dart' as path;
+import 'package:intl/src/intl_message.dart';
+import 'package:args/args.dart';
+
+main(List<String> args) {
+  var targetDir;
+  var parser = new ArgParser();
+  parser.addFlag("suppress-warnings", defaultsTo: false, callback: (x) =>
+      suppressWarnings = x);
+  parser.addFlag("warnings-are-errors", defaultsTo: false, callback: (x) =>
+      warningsAreErrors = x);
+
+  parser.addOption("output-dir", defaultsTo: '.', callback: (value) => targetDir
+      = value);
+  parser.parse(args);
+  if (args.length == 0) {
+    print('Usage: extract_to_arb [--output-dir=<dir>] [files.dart]');
+    print('Accepts Dart files and produces intl_messages.json');
+    exit(0);
+  }
+  var allMessages = {};
+  for (var arg in args.where((x) => x.contains(".dart"))) {
+    var messages = parseFile(new File(arg));
+    messages.forEach((k, v) => allMessages.addAll(toARB(v)));
+  }
+  var file = new File(path.join(targetDir, 'intl_messages.arb'));
+  file.writeAsStringSync(JSON.encode(allMessages));
+  if (hasWarnings && warningsAreErrors) {
+    exit(1);
+  }
+}
+
+/**
+ * This is a placeholder for transforming a parameter substitution from
+ * the translation file format into a Dart interpolation. In our case we
+ * store it to the file in Dart interpolation syntax, so the transformation
+ * is trivial.
+ */
+String leaveTheInterpolationsInDartForm(MainMessage msg, chunk) {
+  if (chunk is String) return chunk;
+  if (chunk is int) return "\$${msg.arguments[chunk]}";
+  return chunk.toCode();
+}
+
+/**
+ * Convert the [MainMessage] to a trivial JSON format.
+ */
+Map toARB(MainMessage message) {
+  if (message.messagePieces.isEmpty) return null;
+  var out = {};
+  out[message.name] = icuForm(message);
+  out["@${message.name}"] = arbMetadata(message);
+  return out;
+}
+
+
+Map arbMetadata(MainMessage message) {
+  var out = {};
+  var desc = message.description;
+  if (desc != null) {
+    out["description"] = desc;
+  }
+  out["type"] = "text";
+  var placeholders = {};
+  for (var arg in message.arguments) {
+    addArgumentFor(message, arg, placeholders);
+  }
+  out["placeholders"] = placeholders;
+  return out;
+}
+
+void addArgumentFor(MainMessage message, String arg, Map result) {
+  var extraInfo = {};
+  if (message.examples != null && message.examples[arg] != null) {
+    extraInfo["example"] = message.examples[arg];
+  }
+  result[arg] = extraInfo;
+}
+
+/**
+ * Return a version of the message string with
+ * with ICU parameters "{variable}" rather than Dart interpolations "$variable".
+ */
+String icuForm(MainMessage message) => message.expanded(
+    turnInterpolationIntoICUForm);
+
+String turnInterpolationIntoICUForm(Message message, chunk,
+    {bool shouldEscapeICU: false}) {
+  if (chunk is String) {
+    return shouldEscapeICU? escape(chunk) : chunk;
+  }
+  if (chunk is int && chunk >= 0 && chunk < message.arguments.length) {
+    return "{${message.arguments[chunk]}}";
+  }
+  if (chunk is SubMessage) {
+    return chunk.expanded((message, chunk) => turnInterpolationIntoICUForm(
+        message, chunk, shouldEscapeICU: true));
+  }
+  if (chunk is Message) {
+    return chunk.expanded((message, chunk) => turnInterpolationIntoICUForm(
+        message, chunk, shouldEscapeICU: shouldEscapeICU));
+  }
+  throw new FormatException("Illegal interpolation: $chunk");
+}
+
+String escape(String s) {
+  return s.replaceAll("'", "''").replaceAll("{", "'{'").replaceAll("}", "'}'");
+}
+
diff --git a/pkg/intl/test/message_extraction/generate_from_json.dart b/pkg/intl/bin/generate_from_arb.dart
similarity index 63%
rename from pkg/intl/test/message_extraction/generate_from_json.dart
rename to pkg/intl/bin/generate_from_arb.dart
index c3ed803..6830fc5 100644
--- a/pkg/intl/test/message_extraction/generate_from_json.dart
+++ b/pkg/intl/bin/generate_from_arb.dart
@@ -5,24 +5,25 @@
 
 /**
  * A main program that takes as input a source Dart file and a number
- * of JSON files representing translations of messages from the corresponding
- * Dart file. See extract_to_json.dart and make_hardcoded_translation.dart.
+ * of ARB files representing translations of messages from the corresponding
+ * Dart file. See extract_to_arb.dart and make_hardcoded_translation.dart.
  *
  * This produces a series of files named
  * "messages_<locale>.dart" containing messages for a particular locale
  * and a main import file named "messages_all.dart" which has imports all of
  * them and provides an initializeMessages function.
  */
-library generate_from_json;
+library generate_from_arb;
 
 import 'dart:convert';
 import 'dart:io';
 import 'package:intl/extract_messages.dart';
+import 'package:intl/src/icu_parser.dart';
 import 'package:intl/src/intl_message.dart';
 import 'package:intl/generate_localized.dart';
 import 'package:path/path.dart' as path;
 import 'package:args/args.dart';
-import 'package:serialization/serialization.dart';
+import 'package:petitparser/petitparser.dart';
 
 /**
  * Keeps track of all the messages we have processed so far, keyed by message
@@ -41,11 +42,11 @@
       callback: (x) => generatedFilePrefix = x);
   parser.parse(args);
   var dartFiles = args.where((x) => x.endsWith("dart")).toList();
-  var jsonFiles = args.where((x) => x.endsWith(".json")).toList();
+  var jsonFiles = args.where((x) => x.endsWith(".arb")).toList();
   if (dartFiles.length == 0 || jsonFiles.length == 0) {
-    print('Usage: generate_from_json [--output-dir=<dir>]'
+    print('Usage: generate_from_arb [--output-dir=<dir>]'
         ' [--generated-file-prefix=<prefix>] file1.dart file2.dart ...'
-        ' translation1.json translation2.json ...');
+        ' translation1_<languageTag>.arb translation2.arb ...');
     exit(0);
   }
 
@@ -69,43 +70,56 @@
   mainImportFile.writeAsStringSync(generateMainImportFile());
 }
 
-var s = new Serialization();
-var format = const SimpleFlatFormat();
-var r = s.newReader(format);
-
-recreateIntlObjects(key, value) {
-  if (value == null) return null;
-  if (value is String || value is int) return Message.from(value, null);
-  if (value is List) {
-    var newThing = r.read(value);
-    return newThing;
-  }
-  throw new FormatException("Invalid input data $value");
-}
-
 /**
- * Create the file of generated code for a particular locale. We read the json
+ * Create the file of generated code for a particular locale. We read the ARB
  * data and create [BasicTranslatedMessage] instances from everything,
  * excluding only the special _locale attribute that we use to indicate the
- * locale.
+ * locale. If that attribute is missing, we try to get the locale from the last
+ * section of the file name.
  */
 void generateLocaleFile(File file, String targetDir) {
   var src = file.readAsStringSync();
   var data = JSON.decode(src);
   data.forEach((k, v) => data[k] = recreateIntlObjects(k, v));
-  var locale = data["_locale"].string;
+  var locale = data["_locale"];
+  if (locale != null) {
+    locale = locale.translated.string;
+  } else {
+    // Get the locale from the end of the file name. This assumes that the file
+    // name doesn't contain any underscores except to begin the language tag
+    // and to separate language from country. Otherwise we can't tell if
+    // my_file_fr.arb is locale "fr" or "file_fr".
+    var name = path.basenameWithoutExtension(file.path);
+    locale = name.split("_").skip(1).join("_");
+  }
   allLocales.add(locale);
 
   var translations = [];
   data.forEach((key, value) {
-    if (key[0] != "_") {
-      translations.add(new BasicTranslatedMessage(key, value));
+    if (value != null) {
+      translations.add(value);
     }
   });
   generateIndividualMessageFile(locale, translations, targetDir);
 }
 
 /**
+ * Regenerate the original IntlMessage objects from the given [data]. For
+ * things that are messages, we expect [id] not to start with "@" and
+ * [data] to be a String. For metadata we expect [id] to start with "@"
+ * and [data] to be a Map or null. For metadata we return null.
+ */
+BasicTranslatedMessage recreateIntlObjects(String id, data) {
+  if (id.startsWith("@")) return null;
+  if (data == null) return null;
+  var parsed = pluralAndGenderParser.parse(data).value;
+  if (parsed is LiteralString && parsed.string.isEmpty) {
+    parsed = plainParser.parse(data).value;;
+  }
+  return new BasicTranslatedMessage(id, parsed);
+}
+
+/**
  * A TranslatedMessage that just uses the name as the id and knows how to look
  * up its original messages in our [messages].
  */
@@ -120,3 +134,8 @@
   //key in [messages].
   List<MainMessage> _findOriginals() => originalMessages = messages[id];
 }
+
+final pluralAndGenderParser = 
+    removeDuplicates(removeSetables(new ICUParser().message));
+final plainParser = 
+    removeDuplicates(removeSetables(new ICUParser().nonIcuMessage));
diff --git a/pkg/intl/lib/number_format.dart b/pkg/intl/lib/number_format.dart
index 864bb32..e44eddd 100644
--- a/pkg/intl/lib/number_format.dart
+++ b/pkg/intl/lib/number_format.dart
@@ -601,13 +601,13 @@
     }
 
     checkPrefixes();
-    var basicNumber = parseNumber(input);
+    var parsed = parseNumber(input);
 
     if (gotPositive && !gotPositiveSuffix) invalidNumber();
     if (gotNegative && !gotNegativeSuffix) invalidNumber();
     if (!input.atEnd()) invalidNumber();
 
-    return gotNegative ? -basicNumber : basicNumber;
+    return parsed;
   }
 
   /** The number is invalid, throw a [FormatException]. */
@@ -704,8 +704,8 @@
       format._negativeSuffix = _parseAffix();
     } else {
       // If no negative affix is specified, they share the same positive affix.
-      format._negativePrefix = format._positivePrefix + format._negativePrefix;
-      format._negativeSuffix = format._negativeSuffix + format._positiveSuffix;
+      format._negativePrefix = format._negativePrefix + format._positivePrefix;
+      format._negativeSuffix = format._positiveSuffix + format._negativeSuffix;
     }
   }
 
diff --git a/pkg/intl/lib/src/icu_parser.dart b/pkg/intl/lib/src/icu_parser.dart
new file mode 100644
index 0000000..d83c089
--- /dev/null
+++ b/pkg/intl/lib/src/icu_parser.dart
@@ -0,0 +1,109 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Contains a parser for ICU format plural/gender/select format for localized
+ * messages. See extract_to_arb.dart and make_hardcoded_translation.dart.
+ */
+library icu_parser;
+
+import 'package:intl/src/intl_message.dart';
+import 'package:petitparser/petitparser.dart';
+
+/**
+ * This defines a grammar for ICU MessageFormat syntax. Usage is
+ *       new ICUParser.message.parse(<string>).value;
+ * The "parse" method will return a Success or Failure object which responds
+ * to "value".
+ */
+class ICUParser {
+  get openCurly => char("{");
+
+  get closeCurly => char("}");
+  get quotedCurly => (string("'{'") | string("'}'")).map((x) => x[1]);
+
+  get icuEscapedText => quotedCurly | twoSingleQuotes;
+  get curly => (openCurly | closeCurly);
+  get notAllowedInIcuText => curly | char("<");
+  get icuText => notAllowedInIcuText.neg();
+  get notAllowedInNormalText => char("{");
+  get normalText => notAllowedInNormalText.neg();
+  get messageText => (icuEscapedText | icuText)
+      .plus().map((x) => x.join());
+  get nonIcuMessageText => normalText.plus().map((x) => x.join());
+  get twoSingleQuotes => string("''").map((x) => "'");
+  get number => digit().plus().flatten().trim().map(int.parse);
+  get id => (letter() & (word() | char("_")).star()).flatten();
+  get comma => char(",").trim();
+
+  /**
+   * Given a list of possible keywords, return a rule that accepts any of them.
+   * e.g., given ["male", "female", "other"], accept any of them.
+   */
+  asKeywords(list) => list.map(string).reduce((a, b) => a | b).flatten().trim();
+
+  get pluralKeyword => asKeywords(
+      ["=0", "=1", "=2", "zero", "one", "two", "few", "many", "other"]);
+  get genderKeyword => asKeywords(
+      ["female", "male", "other"]);
+
+  var interiorText = undefined();
+
+  get preface => (openCurly & id & comma).map((values) => values[1]);
+
+  get pluralLiteral => string("plural");
+  get pluralClause => (pluralKeyword & openCurly & interiorText & closeCurly)
+      .trim().map((result) => [result[0], result[2]]);
+  get plural =>
+      preface & pluralLiteral & comma & pluralClause.plus() & closeCurly;
+  get intlPlural =>
+      plural.map((values) => new Plural.from(values.first, values[3], null));
+
+  get selectLiteral => string("select");
+  get genderClause => (genderKeyword & openCurly & interiorText & closeCurly)
+      .trim().map((result) => [result[0], result[2]]);
+  get gender =>
+      preface & selectLiteral & comma & genderClause.plus() & closeCurly;
+  get intlGender =>
+      gender.map((values) => new Gender.from(values.first, values[3], null));
+  get selectClause => (id & openCurly & interiorText & closeCurly).map(
+      (x) => [x.first, x[2]]);
+  get generalSelect => preface & selectLiteral & comma & 
+      selectClause.plus() & closeCurly;
+  get intlSelect => generalSelect.map(
+      (values) => new Select.from(values.first, values[3], null));
+
+  get pluralOrGenderOrSelect => intlPlural | intlGender | intlSelect;
+
+  get contents => pluralOrGenderOrSelect | parameter | messageText;
+  get simpleText => (nonIcuMessageText | parameter | openCurly).plus();
+  get empty => epsilon().map((_) => '');
+  
+  get parameter => (openCurly & id & closeCurly).map(
+      (param) => new VariableSubstitution.named(param[1], null));
+
+  /**
+   * The primary entry point for parsing. Accepts a string and produces
+   * a parsed representation of it as a Message.
+   */
+  get message => (pluralOrGenderOrSelect | empty).map((chunk) =>
+      Message.from(chunk, null));
+
+  /**
+   * Represents an ordinary message, i.e. not a plural/gender/select, although 
+   * it may have parameters.
+   */
+  get nonIcuMessage => (simpleText | empty).map((chunk) =>
+      Message.from(chunk, null));  
+  
+  get stuff => (pluralOrGenderOrSelect | empty).map(
+      (chunk) => Message.from(chunk, null));
+  
+
+  ICUParser() {
+    // There is a cycle here, so we need the explicit set to avoid
+    // infinite recursion.
+    interiorText.set(contents.plus() | empty);
+  }
+}
\ No newline at end of file
diff --git a/pkg/intl/lib/src/intl_message.dart b/pkg/intl/lib/src/intl_message.dart
index 8ea11e3..97eb48e 100644
--- a/pkg/intl/lib/src/intl_message.dart
+++ b/pkg/intl/lib/src/intl_message.dart
@@ -117,6 +117,7 @@
     if (value is String) return new LiteralString(value, parent);
     if (value is int) return new VariableSubstitution(value, parent);
     if (value is Iterable) {
+      if (value.length == 1) return Message.from(value[0], parent);
       var result = new CompositeMessage([], parent);
       var items = value.map((x) => from(x, result)).toList();
       result.pieces.addAll(items);
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index 313d75d..6c1f0be 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -1,5 +1,5 @@
 name: intl
-version: 0.10.0
+version: 0.11.1
 author: Dart Team <misc@dartlang.org>
 description: Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues.
 homepage: http://www.dartlang.org
@@ -10,5 +10,5 @@
   analyzer: '>=0.13.2 <0.16.0'
   path: '>=0.9.0 <2.0.0'
 dev_dependencies:
-  serialization: '>=0.9.0 <0.10.0'
+  petitparser: '>=1.1.3 <2.0.0'
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/intl/test/message_extraction/extract_to_json.dart b/pkg/intl/test/message_extraction/extract_to_json.dart
deleted file mode 100644
index 279c8f5..0000000
--- a/pkg/intl/test/message_extraction/extract_to_json.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This script uses the extract_messages.dart library to find the Intl.message
- * calls in the target dart files and produces intl_messages.json containing the
- * information on those messages. It uses the analyzer-experimental parser
- * to find the information.
- *
- * This is intended to test the basic functioning of extracting messages and
- * serve as an example for how a program to extract them to a translation
- * file format could work. In the tests, this file is then run through a
- * simulated translation and the results of that are used to generate code. See
- * message_extraction_test.dart
- *
- * If the environment variable INTL_MESSAGE_OUTPUT is set then it will use
- * that as the output directory, otherwise it will use the working directory.
- */
-library extract_to_json;
-
-import 'dart:convert';
-import 'dart:io';
-import 'package:intl/extract_messages.dart';
-import 'package:path/path.dart' as path;
-import 'package:intl/src/intl_message.dart';
-import 'package:args/args.dart';
-
-main(List<String> args) {
-  var targetDir;
-  var parser = new ArgParser();
-  parser.addFlag("suppress-warnings", defaultsTo: false,
-      callback: (x) => suppressWarnings = x);
-  parser.addFlag("warnings-are-errors", defaultsTo: false,
-      callback: (x) => warningsAreErrors = x);
-
-  parser.addOption("output-dir", defaultsTo: '.',
-      callback: (value) => targetDir = value);
-  parser.parse(args);
-  if (args.length == 0) {
-    print('Usage: extract_to_json [--output-dir=<dir>] [files.dart]');
-    print('Accepts Dart files and produces intl_messages.json');
-    exit(0);
-  }
-  var allMessages = [];
-  for (var arg in args.where((x) => x.contains(".dart"))) {
-    var messages = parseFile(new File(arg));
-    messages.forEach((k, v) => allMessages.add(toJson(v)));
-  }
-  var file = new File(path.join(targetDir, 'intl_messages.json'));
-  file.writeAsStringSync(JSON.encode(allMessages));
-  if (hasWarnings && warningsAreErrors) {
-    exit(1);
-  }
-}
-
-/**
- * This is a placeholder for transforming a parameter substitution from
- * the translation file format into a Dart interpolation. In our case we
- * store it to the file in Dart interpolation syntax, so the transformation
- * is trivial.
- */
-String leaveTheInterpolationsInDartForm(MainMessage msg, chunk) {
-  if (chunk is String) return chunk;
-  if (chunk is int) return "\$${msg.arguments[chunk]}";
-  return chunk.toCode();
-}
-
-/**
- * Convert the [MainMessage] to a trivial JSON format.
- */
-Map toJson(MainMessage message) {
-  var result = new Map<String, Object>();
-  for (var attribute in message.attributeNames) {
-    result[attribute] = message[attribute];
-  }
-  result["message"] = message.expanded(leaveTheInterpolationsInDartForm);
-  return result;
-}
diff --git a/pkg/intl/test/message_extraction/failed_extraction_test.dart b/pkg/intl/test/message_extraction/failed_extraction_test.dart
index 9a02062..430a43f 100644
--- a/pkg/intl/test/message_extraction/failed_extraction_test.dart
+++ b/pkg/intl/test/message_extraction/failed_extraction_test.dart
@@ -24,7 +24,7 @@
   }
 
   copyFilesToTempDirectory();
-  var program = asTestDirPath("extract_to_json.dart");
+  var program = asTestDirPath("../../bin/extract_to_arb.dart");
   var args = ["--output-dir=$tempDir"];
   if (warningsAreErrors) {
     args.add('--warnings-are-errors');
diff --git a/pkg/intl/test/message_extraction/make_hardcoded_translation.dart b/pkg/intl/test/message_extraction/make_hardcoded_translation.dart
index f145075..27d9326 100644
--- a/pkg/intl/test/message_extraction/make_hardcoded_translation.dart
+++ b/pkg/intl/test/message_extraction/make_hardcoded_translation.dart
@@ -14,38 +14,21 @@
 import 'dart:io';
 import 'package:path/path.dart' as path;
 import 'package:args/args.dart';
-import 'package:intl/src/intl_message.dart';
-import 'package:serialization/serialization.dart';
-
-/**
- * A serialization so that we can write out the more complex plural and
- * gender examples to JSON easily. This is a stopgap and should be replaced
- * with a commonly used translation file format.
- */
-get serialization => new Serialization()
-  ..addRuleFor(new VariableSubstitution(0, null),
-      constructorFields: ["index", "parent"])
-  ..addRuleFor(new LiteralString("a", null),
-      constructorFields: ["string", "parent"])
-  ..addRuleFor(new CompositeMessage([], null), constructor: "withParent",
-      constructorFields: ["parent"]);
-var format = const SimpleFlatFormat();
-get writer => serialization.newWriter(format);
 
 /** A list of the French translations that we will produce. */
 var french = {
-  "types" : r"$a, $b, $c",
+  "types" : r"{a}, {b}, {c}",
   "multiLine" : "Cette message prend plusiers lignes.",
-  "message2" : r"Un autre message avec un seul paramètre $x",
+  "message2" : r"Un autre message avec un seul paramètre {x}",
   "alwaysTranslated" : "Cette chaîne est toujours traduit",
   "message1" : "Il s'agit d'un message",
   "leadingQuotes" : "\"Soi-disant\"",
   "trickyInterpolation" : r"L'interpolation est délicate "
-    r"quand elle se termine une phrase comme ${s}.",
+    r"quand elle se termine une phrase comme {s}.",
   "message3" : "Caractères qui doivent être échapper, par exemple barres \\ "
     "dollars \${ (les accolades sont ok), et xml/html réservés <& et "
     "des citations \" "
-    "avec quelques paramètres ainsi \$a, \$b, et \$c",
+    "avec quelques paramètres ainsi {a}, {b}, et {c}",
   "method" : "Cela vient d'une méthode",
   "nonLambda" : "Cette méthode n'est pas un lambda",
   "staticMessage" : "Cela vient d'une méthode statique",
@@ -57,171 +40,101 @@
   "differentNameSameContents" : "Bonjour tout le monde",
   "rentToBePaid" : "loyer",
   "rentAsVerb" : "louer",
-  "plurals" : writer.write(new Plural.from("num",
-      [
-        ["zero", "Est-ce que nulle est pluriel?"],
-        ["one", "C'est singulier"],
-        ["other", "C'est pluriel (\$num)."]
-      ], null)),
-  // TODO(alanknight): These are pretty horrible to write out manually. Provide
-  // a better way of reading/writing translations. A real format would be good.
-  "whereTheyWentMessage" : writer.write(new Gender.from("gender",
-    [
-      ["male", [0, " est allé à sa ", 2]],
-      ["female", [0, " est allée à sa ", 2]],
-      ["other", [0, " est allé à sa ", 2]]
-    ], null)),
+  "plurals" : 
+      "{num,plural, =0{Est-ce que nulle est pluriel?}=1{C'est singulier}"
+      "other{C'est pluriel ({num}).}}",
+  "whereTheyWentMessage" : "{gender,select, male{{name} est allé à sa {place}}"
+      "female{{name} est allée à sa {place}}other{{name}"
+          " est allé à sa {place}}}",
   // Gratuitously different translation for testing. Ignoring gender of place.
-  "nestedMessage" : writer.write(new Gender.from("combinedGender",
-    [
-      ["other", new Plural.from("number",
-        [
-          ["zero", "Personne n'avait allé à la \$place"],
-          ["one", "\${names} était allé à la \$place"],
-          ["other",  "\${names} étaient allés à la \$place"],
-        ], null)
-      ],
-      ["female", new Plural.from("number",
-        [
-          ["one", "\$names était allée à la \$place"],
-          ["other", "\$names étaient allées à la \$place"],
-        ], null)
-      ]
-    ], null
-  )),
-  "outerPlural" : writer.write(new Plural.from("n",
-      [
-        ['zero', 'rien'],
-        ['one', 'un'],
-        ['other', 'quelques-uns']
-      ], null)),
-  "outerGender" : writer.write(new Gender.from("g",
-      [
-        ['male', 'homme'],
-        ['female', 'femme'],
-        ['other', 'autre'],
-      ], null)),
-  "pluralThatFailsParsing" : writer.write(new Plural.from("noOfThings",
-      [
-        ['one', '1 chose:'],
-        ['other', '\$noOfThings choses:']
-      ], null)),
-  "nestedOuter" : writer.write ( new Plural.from("number",
-      [
-        ['other', new Gender.from("gen",
-            [["male", "\$number homme"], ["other", "\$number autre"]], null),
-        ]
-      ], null)),
-  "outerSelect" : writer.write(new Select.from("currency",
-      [
-        ['CDN', '\$amount dollars Canadiens'],
-        ['other', '\$amount certaine devise ou autre.'],
-      ], null)),
-  "nestedSelect" : writer.write(new Select.from("currency",
-      [
-        ['CDN', new Plural.from('amount',
-            [
-              ["other", '\$amount dollars Canadiens'],
-              ["one", '\$amount dollar Canadien'],
-            ], null)
-        ],
-        ['other', 'N''importe quoi'],
-      ], null)),
+  "nestedMessage" : "{combinedGender,select, "
+    "other{"
+      "{number,plural, "
+        "=0{Personne n'avait allé à la {place}}"
+        "=1{{names} était allé à la {place}}"
+        "other{{names} étaient allés à la {place}}"
+      "}"
+    "}"
+    "female{"
+      "{number,plural, "
+        "=1{{names} était allée à la {place}}"
+        "other{{names} étaient allées à la {place}}"
+      "}"
+    "}"
+  "}",
+  "outerPlural" : "{n,plural, =0{rien}=1{un}other{quelques-uns}}",
+  "outerGender" : "{g,select, male{homme}female{femme}other{autre}}",
+  "pluralThatFailsParsing" : "{noOfThings,plural, "
+    "=1{1 chose:}other{{noOfThings} choses:}}",
+  "nestedOuter" : "{number,plural, other{"
+    "{gen,select, male{{number} homme}other{{number} autre}}}}",
+  "outerSelect" : "{currency,select, CDN{{amount} dollars Canadiens}"
+    "other{{amount} certaine devise ou autre.}}}",
+  "nestedSelect" : "{currency,select, CDN{{amount,plural, "
+      "=1{{amount} dollar Canadien}"
+      "other{{amount} dollars Canadiens}}}"
+    "other{N'importe quoi}"
+    "}}"
 };
 
 /** A list of the German translations that we will produce. */
 var german = {
-  "types" : r"$a, $b, $c",
+  "types" : r"{a}, {b}, {c}",
   "multiLine" : "Dieser String erstreckt sich über mehrere Zeilen erstrecken.",
-  "message2" : r"Eine weitere Meldung mit dem Parameter $x",
+  "message2" : r"Eine weitere Meldung mit dem Parameter {x}",
   "alwaysTranslated" : "Diese Zeichenkette wird immer übersetzt",
   "message1" : "Dies ist eine Nachricht",
   "leadingQuotes" : "\"Sogenannt\"",
-  "trickyInterpolation" :
-    r"Interpolation ist schwierig, wenn es einen Satz wie dieser endet ${s}.",
+  "trickyInterpolation" : r"Interpolation ist schwierig, wenn es einen Satz "
+      "wie dieser endet {s}.",
   "message3" : "Zeichen, die Flucht benötigen, zB Schrägstriche \\ Dollar "
     "\${ (geschweiften Klammern sind ok) und xml reservierte Zeichen <& und "
-    "Zitate \" Parameter \$a, \$b und \$c",
+    "Zitate \" Parameter {a}, {b} und {c}",
   "method" : "Dies ergibt sich aus einer Methode",
+
   "nonLambda" : "Diese Methode ist nicht eine Lambda",
   "staticMessage" : "Dies ergibt sich aus einer statischen Methode",
+  "thisNameIsNotInTheOriginal" : "Could this lead to something malicious?",
   "originalNotInBMP" : "Antike griechische Galgenmännchen Zeichen: 𐅆𐅇",
   "escapable" : "Escapes: \n\r\f\b\t\v.",
   "sameContentsDifferentName" : "Hallo Welt",
   "differentNameSameContents" : "Hallo Welt",
   "rentToBePaid" : "Miete",
   "rentAsVerb" : "mieten",
-  "plurals" : writer.write(new Plural.from("num",
-    [
-      ["zero", "Ist Null Plural?"],
-      ["one", "Dies ist einmalig"],
-      ["other", "Dies ist Plural (\$num)."]
-    ], null)),
-  // TODO(alanknight): These are pretty horrible to write out manually. Provide
-  // a better way of reading/writing translations. A real format would be good.
-  "whereTheyWentMessage" : writer.write(new Gender.from("gender",
-    [
-      ["male", [0, " ging zu seinem ", 2]],
-      ["female", [0, " ging zu ihrem ", 2]],
-      ["other", [0, " ging zu seinem ", 2]]
-    ], null)),
+  "plurals" : "{num,plural, =0{Ist Null Plural?}=1{Dies ist einmalig}"
+      "other{Dies ist Plural ({num}).}}",
+  "whereTheyWentMessage" : "{gender,select, male{{name} ging zu seinem {place}}"
+      "female{{name} ging zu ihrem {place}}other{{name} ging zu seinem {place}}}",
   //Note that we're only using the gender of the people. The gender of the
   //place also matters, but we're not dealing with that here.
-  "nestedMessage" : writer.write(new Gender.from("combinedGender",
-    [
-      ["other", new Plural.from("number",
-        [
-          ["zero", "Niemand ging zu \$place"],
-          ["one", "\${names} ging zum \$place"],
-          ["other", "\${names} gingen zum \$place"],
-        ], null)
-      ],
-      ["female", new Plural.from("number",
-        [
-          ["one", "\$names ging in dem \$place"],
-          ["other", "\$names gingen zum \$place"],
-        ], null)
-      ]
-    ], null
-  )),
-  "outerPlural" : writer.write(new Plural.from("n",
-      [
-        ['zero', 'Null'],
-        ['one', 'ein'],
-        ['other', 'einige']
-      ], null)),
-  "outerGender" : writer.write(new Gender.from("g",
-      [
-        ['male', 'Mann'],
-        ['female', 'Frau'],
-        ['other', 'andere'],
-      ], null)),
-  "pluralThatFailsParsing" : writer.write(new Plural.from("noOfThings",
-      [
-        ['one', 'eins:'],
-        ['other', '\$noOfThings Dinge:']
-      ], null)),
-  "nestedOuter" : writer.write (new Plural.from("number",
-      [
-        ['other', new Gender.from("gen",
-          [["male", "\$number Mann"], ["other", "\$number andere"]], null),
-        ]
-       ], null)),
-  "outerSelect" : writer.write(new Select.from("currency",
-      [
-        ['CDN', '\$amount Kanadischen dollar'],
-        ['other', '\$amount einige Währung oder anderen.'],
-      ], null)),
-  "nestedSelect" : writer.write(new Select.from("currency",
-      [
-        ['CDN', new Plural.from('amount',
-            [
-              ["other", '\$amount Kanadischen dollar'],
-              ["one", '\$amount Kanadischer dollar'],
-            ], null)
-        ],
-        ['other', 'whatever'],
-      ], null)),
+  "nestedMessage" : "{combinedGender,select, "
+    "other{"
+      "{number,plural, "
+        "=0{Niemand ging zu {place}}"
+        "=1{{names} ging zum {place}}"
+        "other{{names} gingen zum {place}}"
+      "}"
+    "}"
+    "female{"
+      "{number,plural, "
+        "=1{{names} ging in dem {place}}"
+        "other{{names} gingen zum {place}}"
+      "}"
+    "}"
+  "}",
+  "outerPlural" : "{n,plural, =0{Null}=1{ein}other{einige}}",
+  "outerGender" : "{g,select, male{Mann}female{Frau}other{andere}}",
+  "pluralThatFailsParsing" : "{noOfThings,plural, "
+    "=1{eins:}other{{noOfThings} Dinge:}}",
+  "nestedOuter" : "{number,plural, other{"
+    "{gen,select, male{{number} Mann}other{{number} andere}}}}",
+  "outerSelect" : "{currency,select, CDN{{amount} Kanadischen dollar}"
+    "other{{amount} einige Währung oder anderen.}}}",
+  "nestedSelect" : "{currency,select, CDN{{amount,plural, "
+      "=1{{amount} Kanadischer dollar}"
+      "other{{amount} Kanadischen dollar}}}"
+    "other{whatever}"
+    "}"
 };
 
 /** The output directory for translated files. */
@@ -231,20 +144,19 @@
  * Generate a translated json version from [originals] in [locale] looking
  * up the translations in [translations].
  */
-void translate(List originals, String locale, Map translations) {
+void translate(Map originals, String locale, Map translations) {
   var translated = {"_locale" : locale};
-  for (var each in originals) {
-    var name = each["name"];
+  originals.forEach((name, text) {
     translated[name] = translations[name];
-  }
-  var file = new File(path.join(targetDir, 'translation_$locale.json'));
+  });
+  var file = new File(path.join(targetDir, 'translation_$locale.arb'));
   file.writeAsStringSync(JSON.encode(translated));
 }
 
 main(List<String> args) {
   if (args.length == 0) {
     print('Usage: make_hardcoded_translation [--output-dir=<dir>] '
-        '[originalFile.json]');
+        '[originalFile.arb]');
     exit(0);
   }
   var parser = new ArgParser();
@@ -252,7 +164,7 @@
       callback: (value) => targetDir = value);
   parser.parse(args);
 
-  var fileArgs = args.where((x) => x.contains('.json'));
+  var fileArgs = args.where((x) => x.contains('.arb'));
 
   var messages = JSON.decode(new File(fileArgs.first).readAsStringSync());
   translate(messages, "fr", french);
diff --git a/pkg/intl/test/message_extraction/message_extraction_test.dart b/pkg/intl/test/message_extraction/message_extraction_test.dart
index ec6c73f..56d2fa3 100644
--- a/pkg/intl/test/message_extraction/message_extraction_test.dart
+++ b/pkg/intl/test/message_extraction/message_extraction_test.dart
@@ -134,20 +134,20 @@
 }
 
 Future<ProcessResult> extractMessages(ProcessResult previousResult) => run(
-    previousResult, [asTestDirPath('extract_to_json.dart'),
+    previousResult, [asTestDirPath('../../bin/extract_to_arb.dart'),
     '--suppress-warnings', 'sample_with_messages.dart',
     'part_of_sample_with_messages.dart']);
 
 Future<ProcessResult> generateTranslationFiles(ProcessResult previousResult) =>
     run(previousResult,
         [asTestDirPath('make_hardcoded_translation.dart'),
-        'intl_messages.json']);
+        'intl_messages.arb']);
 
 Future<ProcessResult> generateCodeFromTranslation(ProcessResult previousResult)
-    => run(previousResult, [asTestDirPath('generate_from_json.dart'),
+    => run(previousResult, [asTestDirPath('../../bin/generate_from_arb.dart'),
     '--generated-file-prefix=foo_', 'sample_with_messages.dart',
-    'part_of_sample_with_messages.dart', 'translation_fr.json',
-    'translation_de_DE.json']);
+    'part_of_sample_with_messages.dart', 'translation_fr.arb',
+    'translation_de_DE.arb']);
 
 Future<ProcessResult> runAndVerify(ProcessResult previousResult) => run(
     previousResult, [asTempDirPath('run_and_verify.dart')]);
diff --git a/pkg/intl/test/number_closure_test.dart b/pkg/intl/test/number_closure_test.dart
index 5037b0e..523ca8c 100644
--- a/pkg/intl/test/number_closure_test.dart
+++ b/pkg/intl/test/number_closure_test.dart
@@ -150,11 +150,11 @@
 
   fmt = new NumberFormat('a\'fo\'\'o\'b#');
   str = fmt.format(-123);
-  expect('afo\'ob-123', str);
+  expect('-afo\'ob123', str);
 
   fmt = new NumberFormat('a\'\'b#');
   str = fmt.format(-123);
-  expect('a\'b-123', str);
+  expect('-a\'b123', str);
 }
 
 void testZeros() {
diff --git a/pkg/intl/test/number_format_test.dart b/pkg/intl/test/number_format_test.dart
index 3401971..d94f126 100644
--- a/pkg/intl/test/number_format_test.dart
+++ b/pkg/intl/test/number_format_test.dart
@@ -16,6 +16,9 @@
  * Tests the Numeric formatting library in dart.
  */
 var testNumbersWeCanReadBack = {
+  "-1" : -1,
+  "-2" : -2.0,
+  "-0.01" : -0.01, 
   "0.001": 0.001,
   "0.01": 0.01,
   "0.1": 0.1,
@@ -63,7 +66,7 @@
 List<NumberFormat> standardFormats(String locale) {
   return [
           new NumberFormat.decimalPattern(locale),
-          new NumberFormat.percentPattern(locale)
+          new NumberFormat.percentPattern(locale),
           ];
 }
 
@@ -73,23 +76,36 @@
 
 main() {
   // For data from a list of locales, run each locale's data as a separate
-  // test so we can see exactly which ones pass or fail.
+  // test so we can see exactly which ones pass or fail. The test data is 
+  // hard-coded as printing 123, -12.3, %12,300, -1,230% in each locale.
   var mainList = numberTestData;
   var sortedLocales = new List.from(numberFormatSymbols.keys);
   sortedLocales.sort((a, b) => a.compareTo(b));
   for (var locale in sortedLocales) {
     var testFormats = standardFormats(locale);
-    var list = mainList.take(testFormats.length + 1).iterator;
-    mainList = mainList.skip(testFormats.length + 1);
+    var list = mainList.take((testFormats.length * 2) + 1).iterator;
+    mainList = mainList.skip((testFormats.length * 2) + 1);
     var nextLocaleFromList = (list..moveNext()).current;
     test("Test against ICU data for $locale", () {
       expect(locale, nextLocaleFromList);
       for (var format in testFormats) {
         var formatted = format.format(123);
+        var negative = format.format(-12.3);
         var expected = (list..moveNext()).current;
         expect(formatted, expected);
+        var expectedNegative = (list..moveNext()).current;
+        // Some of these results from CLDR have a leading LTR/RTL indicator, 
+        // which we don't want. We also treat the difference between Unicode 
+        // minus sign (2212) and hyphen-minus (45) as not significant.
+        expectedNegative = expectedNegative
+            .replaceAll("\u200e", "")
+            .replaceAll("\u200f", "")
+            .replaceAll("\u2212", "-");
+        expect(negative, expectedNegative);
         var readBack = format.parse(formatted);
         expect(readBack, 123);
+        var readBackNegative = format.parse(negative);
+        expect(readBackNegative, -12.3);
       }
     });
   }
diff --git a/pkg/intl/test/number_test_data.dart b/pkg/intl/test/number_test_data.dart
index 1e13abf..1f2dcd1 100644
--- a/pkg/intl/test/number_test_data.dart
+++ b/pkg/intl/test/number_test_data.dart
@@ -14,302 +14,502 @@
 var numberTestData = const [
     "af",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "am",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "ar",
     r"١٢٣",
+    r"‏-١٢٫٣",
     r"١٢٬٣٠٠٪",
+    r"‏-١٬٢٣٠٪",
     "az",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "bg",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "bn",
     r"১২৩",
+    r"-১২.৩",
     r"১২,৩০০%",
+    r"-১,২৩০%",
     "br",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "ca",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "chr",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "cs",
     r"123",
+    r"-12,3",
     r"12 300 %",
+    r"-1 230 %",
     "cy",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "da",
     r"123",
+    r"-12,3",
     r"12.300 %",
+    r"-1.230 %",
     "de",
     r"123",
+    r"-12,3",
     r"12.300 %",
+    r"-1.230 %",
     "de_AT",
     r"123",
+    r"-12,3",
     r"12.300 %",
+    r"-1.230 %",
     "de_CH",
     r"123",
+    r"-12.3",
     r"12'300 %",
+    r"-1'230 %",
     "el",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "en",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "en_AU",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "en_GB",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "en_IE",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "en_IN",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "en_SG",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "en_US",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "en_ZA",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "es",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "es_419",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "es_ES",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "et",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "eu",
     r"123",
+    r"-12,3",
     r"% 12.300",
+    r"-% 1.230",
     "fa",
     r"۱۲۳",
+    r"‎−۱۲٫۳",
     r"۱۲٬۳۰۰٪",
+    r"‎−۱٬۲۳۰٪",
     "fi",
     r"123",
+    r"−12,3",
     r"12 300 %",
+    r"−1 230 %",
     "fil",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "fr",
     r"123",
+    r"-12,3",
     r"12 300 %",
+    r"-1 230 %",
     "fr_CA",
     r"123",
+    r"-12,3",
     r"12 300 %",
+    r"-1 230 %",
     "gl",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "gsw",
     r"123",
+    r"−12.3",
     r"12’300 %",
+    r"−1’230 %",
     "gu",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "haw",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "he",
     r"123",
+    r"‎-12.3",
     r"12,300%",
+    r"‎-1,230%",
     "hi",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "hr",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "hu",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "hy",
     r"123",
+    r"-12,3",
     r"12300%",
+    r"-1230%",
     "id",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "in",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "is",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "it",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "iw",
     r"123",
+    r"‎-12.3",
     r"12,300%",
+    r"‎-1,230%",
     "ja",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "ka",
     r"123",
+    r"-12,3",
     r"12 300 %",
+    r"-1 230 %",
     "kk",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "km",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "kn",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "ko",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "ky",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "ln",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "lo",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "lt",
     r"123",
+    r"−12,3",
     r"12 300 %",
+    r"−1 230 %",
     "lv",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "mk",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "ml",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "mn",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "mr",
     r"१२३",
+    r"-१२.३",
     r"१२,३००%",
+    r"-१,२३०%",
     "ms",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "mt",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "my",
     r"၁၂၃",
+    r"-၁၂.၃",
     r"၁၂,၃၀၀%",
+    r"-၁,၂၃၀%",
     "nb",
     r"123",
+    r"−12,3",
     r"12 300 %",
+    r"−1 230 %",
     "ne",
     r"१२३",
+    r"-१२.३",
     r"१२,३००%",
+    r"-१,२३०%",
     "nl",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "no",
     r"123",
+    r"−12,3",
     r"12 300 %",
+    r"−1 230 %",
     "no_NO",
     r"123",
+    r"−12,3",
     r"12 300 %",
+    r"−1 230 %",
     "or",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "pa",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "pl",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "pt",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "pt_BR",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "pt_PT",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "ro",
     r"123",
+    r"-12,3",
     r"12.300 %",
+    r"-1.230 %",
     "ru",
     r"123",
+    r"-12,3",
     r"12 300 %",
+    r"-1 230 %",
     "si",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "sk",
     r"123",
+    r"-12,3",
     r"12 300 %",
+    r"-1 230 %",
     "sl",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "sq",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "sr",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "sv",
     r"123",
+    r"−12,3",
     r"12 300 %",
+    r"−1 230 %",
     "sw",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "ta",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "te",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "th",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "tl",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "tr",
     r"123",
+    r"-12,3",
     r"%12.300",
+    r"-%1.230",
     "uk",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "ur",
     r"123",
+    r"‎-12.3",
     r"12,300%",
+    r"‎-1,230%",
     "uz",
     r"123",
+    r"-12,3",
     r"12 300%",
+    r"-1 230%",
     "vi",
     r"123",
+    r"-12,3",
     r"12.300%",
+    r"-1.230%",
     "zh",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "zh_CN",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "zh_HK",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "zh_TW",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "zu",
     r"123",
+    r"-12.3",
     r"12,300%",
+    r"-1,230%",
     "END"];
\ No newline at end of file
diff --git a/pkg/observe/CHANGELOG.md b/pkg/observe/CHANGELOG.md
index 7337b98..b32303a 100644
--- a/pkg/observe/CHANGELOG.md
+++ b/pkg/observe/CHANGELOG.md
@@ -3,6 +3,10 @@
 This file contains highlights of what changes on each version of the observe
 package.
 
+#### Pub version 0.10.0+3
+  * minor changes to documentation, deprecated `discardListChages` in favor of
+    `discardListChanges` (the former had a typo).
+
 #### Pub version 0.10.0
   * package:observe no longer declares @MirrorsUsed. The package uses mirrors
     for development time, but assumes frameworks (like polymer) and apps that
diff --git a/pkg/observe/lib/src/bind_property.dart b/pkg/observe/lib/src/bind_property.dart
index b1d8918..21e14f9 100644
--- a/pkg/observe/lib/src/bind_property.dart
+++ b/pkg/observe/lib/src/bind_property.dart
@@ -16,14 +16,14 @@
 ///       MyModel() {
 ///         ...
 ///         _sub = onPropertyChange(_otherModel, #value,
-///             () => notifyProperty(this, #prop);
+///             () => notifyPropertyChange(#prop, oldValue, newValue);
 ///       }
 ///
 ///       String get prop => _otherModel.value;
 ///       set prop(String value) { _otherModel.value = value; }
 ///     }
 ///
-/// See also [notifyProperty].
+/// See also [notifyPropertyChange].
 // TODO(jmesserly): make this an instance method?
 StreamSubscription onPropertyChange(Observable source, Symbol sourceName,
     void callback()) {
diff --git a/pkg/observe/lib/src/bindable.dart b/pkg/observe/lib/src/bindable.dart
index 4b628a60..c3314a2 100644
--- a/pkg/observe/lib/src/bindable.dart
+++ b/pkg/observe/lib/src/bindable.dart
@@ -8,11 +8,8 @@
 // Normally this is used with 'package:template_binding'.
 // TODO(jmesserly): Node.bind polyfill calls this "observable"
 abstract class Bindable {
-  // TODO(jmesserly): since we have "value", should open be a void method?
   // Dart note: changed setValue to be "set value" and discardChanges() to
-  // be "get value". Also "set value" implies discard changes.
-  // TOOD(jmesserly): is this change too subtle? Is there any other way to
-  // make Bindable friendly in a world with getters/setters?
+  // be "get value".
 
   /// Initiates observation and returns the initial value.
   /// The callback will be called with the updated [value].
@@ -28,10 +25,18 @@
   void close();
 
   /// Gets the current value of the bindings.
+  /// Note: once the value of a [Bindable] is fetched, the callback passed to
+  /// [open] should not be called again with this new value.
+  /// In other words, any pending change notifications must be discarded.
+  // TODO(jmesserly): I don't like a getter with side effects. Should we just
+  // rename the getter/setter pair to discardChanges/setValue like they are in
+  // JavaScript?
   get value;
 
   /// This can be implemented for two-way bindings. By default does nothing.
-  /// Note: setting the value of a [Bindable] must not call the [callback] with
-  /// the new value. Any pending change notifications must be discarded.
   set value(newValue) {}
+
+  /// Deliver changes. Typically this will perform dirty-checking, if any is
+  /// needed.
+  void deliver() {}
 }
diff --git a/pkg/observe/lib/src/metadata.dart b/pkg/observe/lib/src/metadata.dart
index 16c6cca..f128102 100644
--- a/pkg/observe/lib/src/metadata.dart
+++ b/pkg/observe/lib/src/metadata.dart
@@ -5,31 +5,37 @@
 library observe.src.metadata;
 
 /// Use `@observable` to make a field automatically observable, or to indicate
-/// that a property is observable.
+/// that a property is observable. This only works on classes that extend or
+/// mix in `Observable`.
 const ObservableProperty observable = const ObservableProperty();
 
 /// An annotation that is used to make a property observable.
 /// Normally this is used via the [observable] constant, for example:
 ///
-///     class Monster {
+///     class Monster extends Observable {
 ///       @observable int health;
 ///     }
 ///
-/// If needed, you can subclass this to create another annotation that will also
-/// be treated as observable.
+// TODO(sigmund): re-add this to the documentation when it's really true:
+//     If needed, you can subclass this to create another annotation that will
+//     also be treated as observable.
 // Note: observable properties imply reflectable.
 class ObservableProperty {
   const ObservableProperty();
 }
 
 
-/// Use `@reflectable` to make a type or member available to reflection in the
-/// observe package. This is necessary to make the member visible to
-/// [PathObserver], or similar systems, once the code is deployed.
+/// This can be used to retain any properties that you wish to access with
+/// Dart's mirror system. If you import `package:observe/mirrors_used.dart`, all
+/// classes or members annotated with `@reflectable` wil be preserved by dart2js
+/// during compilation.  This is necessary to make the member visible to
+/// `PathObserver`, or similar systems, once the code is deployed, if you are
+/// not doing a different kind of code-generation for your app. If you are using
+/// polymer, you most likely don't need to use this annotation anymore.
 const Reflectable reflectable = const Reflectable();
 
 /// An annotation that is used to make a type or member reflectable. This makes
-/// it available to [PathObserver] at runtime. For example:
+/// it available to `PathObserver` at runtime. For example:
 ///
 ///     @reflectable
 ///     class Monster extends ChangeNotifier {
diff --git a/pkg/observe/lib/src/observable_list.dart b/pkg/observe/lib/src/observable_list.dart
index 4a6b56a..3972fe6 100644
--- a/pkg/observe/lib/src/observable_list.dart
+++ b/pkg/observe/lib/src/observable_list.dart
@@ -247,7 +247,11 @@
     notifyPropertyChange(#isNotEmpty, oldValue != 0, newValue != 0);
   }
 
-  void discardListChages() {
+  /// Deprecated. Name had a typo, use [discardListChanges] instead.
+  @deprecated
+  void discardListChages() => discardListChanges();
+
+  void discardListChanges() {
     // Leave _listRecords set so we don't schedule another delivery.
     if (_listRecords != null) _listRecords = [];
   }
diff --git a/pkg/observe/lib/src/observer_transform.dart b/pkg/observe/lib/src/observer_transform.dart
index 0587cd9..2ca9fda 100644
--- a/pkg/observe/lib/src/observer_transform.dart
+++ b/pkg/observe/lib/src/observer_transform.dart
@@ -80,4 +80,6 @@
     }
     _bindable.value = newValue;
   }
+
+  deliver() => _bindable.deliver();
 }
diff --git a/pkg/observe/lib/src/path_observer.dart b/pkg/observe/lib/src/path_observer.dart
index d6bf814..a95f2bb 100644
--- a/pkg/observe/lib/src/path_observer.dart
+++ b/pkg/observe/lib/src/path_observer.dart
@@ -41,7 +41,6 @@
   /// Sets the value at this path.
   void set value(Object newValue) {
     if (_path != null) _path.setValueFrom(_object, newValue);
-    _discardChanges();
   }
 
   int get _reportArgumentCount => 2;
@@ -509,7 +508,7 @@
   void _connect();
   void _disconnect();
   bool get _isClosed;
-  _check({bool skipChanges: false});
+  bool _check({bool skipChanges: false});
 
   bool get _isOpen => _notifyCallback != null;
 
@@ -548,7 +547,9 @@
     return _value;
   }
 
-  bool deliver() => _isOpen ? _dirtyCheck() : false;
+  void deliver() {
+    if (_isOpen) _dirtyCheck();
+  }
 
   bool _dirtyCheck() {
     var cycles = 0;
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index 0cfa532..f2f738f 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,5 +1,5 @@
 name: observe
-version: 0.10.1
+version: 0.11.0-dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in template_binding.
diff --git a/pkg/observe/test/path_observer_test.dart b/pkg/observe/test/path_observer_test.dart
index 25ff63e..674f8b2 100644
--- a/pkg/observe/test/path_observer_test.dart
+++ b/pkg/observe/test/path_observer_test.dart
@@ -327,7 +327,7 @@
     expect(model._foo, 'hi');
     expect(observer.value, 'hi');
 
-    expect(model.log, [#foo, const Symbol('foo='), #foo, #foo]);
+    expect(model.log, [#foo, const Symbol('foo='), #foo]);
 
     // These shouldn't throw
     observer = new PathObserver(model, 'bar');
@@ -345,7 +345,7 @@
     model.log.clear();
 
     observer.value = 'hi';
-    expect(model.log, ['[]= foo hi', '[] foo']);
+    expect(model.log, ['[]= foo hi']);
     expect(model._foo, 'hi');
 
     expect(observer.value, 'hi');
@@ -358,7 +358,7 @@
     model.log.clear();
 
     observer.value = 42;
-    expect(model.log, ['[]= bar 42', '[] bar']);
+    expect(model.log, ['[]= bar 42']);
     model.log.clear();
   });
 }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 41b7fe2..1d7c97c 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -117,10 +117,13 @@
 serialization/test/serialization_test: Skip
 
 [ $runtime == d8 ]
+analysis_server/test/analysis_notification_overrides_test: Pass, Slow # Issue 19756
+analysis_server/test/analysis_notification_occurrences_test: Pass, Slow # Issue 19756
 analysis_server/test/analysis_notification_outline_test: Pass, Slow # Issue 19756
 analysis_server/test/domain_search_test: Pass, Slow # Issue 19756
 
 [ $runtime == jsshell ]
+analysis_server/test/analysis_notification_occurrences_test: Pass, Slow # Issue 16473, 19756
 analysis_server/test/analysis_notification_outline_test: Pass, Slow # Issue 16473, 19756
 analysis_server/test/analysis_notification_navigation_test: Pass, Slow # Issue 16473, 19756
 analysis_server/test/domain_analysis_test: Pass, Slow # Issue 16473, 19756
@@ -270,14 +273,8 @@
 
 [ $browser ]
 analysis_server/test/*: Skip # Uses dart:io.
-analyzer/test/error_test: Fail, OK # Uses dart:io.
-analyzer/test/generated/element_test: Fail, OK # Uses dart:io.
-analyzer/test/generated/element_test: Fail, OK # Uses dart:io.
-analyzer/test/generated/resolver_test: Fail, OK # Uses dart:io.
-analyzer/test/generated/resolver_test: Fail, OK # Uses dart:io.
-analyzer/test/options_test: Fail, OK # Uses dart:io.
-analyzer/test/parse_compilation_unit_test: Fail, OK # Uses dart:io.
-analyzer/test/services/formatter_test: Fail, OK # Uses dart:io.
+analysis_services/test/*: Skip # Uses dart:io.
+analyzer/test/*: Skip # Uses dart:io.
 barback/test/*: Fail, OK # Uses dart:io.
 code_transformers/test/*: Skip # Uses dart:io.
 http/test/io/*: Fail, OK # Uses dart:io.
diff --git a/pkg/pkg_files.gyp b/pkg/pkg_files.gyp
index df3a986..787e5dd 100644
--- a/pkg/pkg_files.gyp
+++ b/pkg/pkg_files.gyp
@@ -17,11 +17,25 @@
           'inputs': [
             '../tools/create_timestamp_file.py',
             '<!@(["python", "../tools/list_files.py", "\\.dart$", "."])',
+            '<(SHARED_INTERMEDIATE_DIR)/third_party_pkg_files.stamp',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/pkg_files.stamp',
+          ],
+          'action': [
+            'python', '../tools/create_timestamp_file.py',
+            '<@(_outputs)',
+          ],
+        },
+        {
+          'action_name': 'make_third_party_pkg_files_stamp',
+          'inputs': [
+            '../tools/create_timestamp_file.py',
             '<!@(["python", "../tools/list_files.py", "\\.dart$",'
                 '"../third_party/pkg"])',
           ],
           'outputs': [
-            '<(SHARED_INTERMEDIATE_DIR)/pkg_files.stamp',
+            '<(SHARED_INTERMEDIATE_DIR)/third_party_pkg_files.stamp',
           ],
           'action': [
             'python', '../tools/create_timestamp_file.py',
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index 83daf7f..e3628f1 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -17,6 +17,9 @@
 
 [ $use_public_packages ]
 samples/third_party/angular_todo: Pass, Slow
+pkg/template_binding: PubGetError
+pkg/polymer_expressions: PubGetError
+pkg/polymer: PubGetError
 
 [ $use_public_packages && $builder_tag == russian ]
 samples/third_party/todomvc: Fail # Issue 18104
diff --git a/pkg/polymer/lib/deploy.dart b/pkg/polymer/lib/deploy.dart
index a6e302f..919894e 100644
--- a/pkg/polymer/lib/deploy.dart
+++ b/pkg/polymer/lib/deploy.dart
@@ -36,6 +36,10 @@
 
   var test = args['test'];
   var outDir = args['out'];
+  var filters = [];
+  if (args['file-filter'] != null) {
+    filters = args['file-filter'].split(',');
+  }
 
   var options;
   if (test == null) {
@@ -50,7 +54,8 @@
         packagePhases: {'polymer': phasesForPolymer});
   } else {
     options = _createTestOptions(
-        test, outDir, args['js'], args['csp'], !args['debug']);
+        test, outDir, args['js'], args['csp'], !args['debug'],
+        filters);
   }
   if (options == null) exit(1);
 
@@ -63,7 +68,8 @@
 }
 
 BarbackOptions _createTestOptions(String testFile, String outDir,
-    bool directlyIncludeJS, bool contentSecurityPolicy, bool releaseMode) {
+    bool directlyIncludeJS, bool contentSecurityPolicy, bool releaseMode,
+    List<String> filters) {
 
   var testDir = path.normalize(path.dirname(testFile));
 
@@ -101,7 +107,8 @@
       // TODO(sigmund): include here also smoke transformer when it's on by
       // default.
       packagePhases: {'polymer': phasesForPolymer},
-      transformTests: true);
+      transformTests: true,
+      fileFilter: filters);
 }
 
 String _findDirWithFile(String dir, String filename) {
@@ -140,6 +147,9 @@
           defaultsTo: false, negatable: false)
       ..addOption('out', abbr: 'o', help: 'Directory to generate files into.',
           defaultsTo: 'out')
+      ..addOption('file-filter', help: 'Do not copy in files that match \n'
+           'these filters to the deployed folder, e.g., ".svn"',
+          defaultsTo: null)
       ..addOption('test', help: 'Deploy the test at the given path.\n'
           'Note: currently this will deploy all tests in its directory,\n'
           'but it will eventually deploy only the specified test.')
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index 9e683f4..a48badb 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -338,8 +338,11 @@
       hasIsAttribute = true;
     }
 
-    if (customTagName == null || customTagName == 'polymer-element') return;
-
+    if (customTagName == null || 
+        INTERNALLY_DEFINED_ELEMENTS.contains(customTagName)) {
+      return;
+    }
+    
     var info = _elements[customTagName];
     if (info == null) {
       // TODO(jmesserly): this warning is wrong if someone is using raw custom
@@ -451,3 +454,6 @@
 const String NO_DART_SCRIPT_AND_EXPERIMENTAL =
     'The experimental bootstrap feature doesn\'t support script tags on '
     'the main document (for now).';
+
+const List<String> INTERNALLY_DEFINED_ELEMENTS = 
+    const ['auto-binding-dart', 'polymer-element'];
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/build/runner.dart b/pkg/polymer/lib/src/build/runner.dart
index bacb40d..dd511a2 100644
--- a/pkg/polymer/lib/src/build/runner.dart
+++ b/pkg/polymer/lib/src/build/runner.dart
@@ -38,6 +38,10 @@
   /// Directory where to generate code, if any.
   final String outDir;
 
+  /// Disregard files that match these filters when copying in non
+  /// transformed files
+  List<String> fileFilter;
+
   /// Whether to print error messages using a json-format that tools, such as
   /// the Dart Editor, can process.
   final bool machineFormat;
@@ -54,7 +58,8 @@
   BarbackOptions(this.phases, this.outDir, {currentPackage, String packageHome,
       packageDirs, this.transformTests: false, this.machineFormat: false,
       this.followLinks: false,
-      this.packagePhases: const {}})
+      this.packagePhases: const {},
+      this.fileFilter: const []})
       : currentPackage = (currentPackage != null
           ? currentPackage : readCurrentPackageFromPubspec()),
         packageHome = packageHome,
@@ -122,6 +127,10 @@
   return map;
 }
 
+bool shouldSkip(List<String> filters, String path) {
+  return filters.any((filter) => path.contains(filter));
+}
+
 /// Return the relative path of each file under [subDir] in [package].
 Iterable<String> _listPackageDir(String package, String subDir,
     BarbackOptions options) {
@@ -131,6 +140,7 @@
   if (!dir.existsSync()) return const [];
   return dir.listSync(recursive: true, followLinks: options.followLinks)
       .where((f) => f is File)
+      .where((f) => !shouldSkip(options.fileFilter, f.path))
       .map((f) => path.relative(f.path, from: packageDir));
 }
 
@@ -287,7 +297,6 @@
 
   // Copy all the files we didn't process
   var dirs = options.packageDirs;
-
   return Future.forEach(dirs.keys, (package) {
     return Future.forEach(_listPackageDir(package, 'lib', options), (relpath) {
       var inpath = path.join(dirs[package], relpath);
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index bf4b47f..cfc1ede 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.11.0+5
+version: 0.11.1-dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
@@ -14,12 +14,12 @@
   code_transformers: '>=0.1.4 <0.2.0'
   html5lib: '>=0.11.0 <0.12.0'
   logging: '>=0.9.0 <0.10.0'
-  observe: '>=0.10.0 <0.11.0'
+  observe: '>=0.11.0-dev <0.12.0'
   path: '>=0.9.0 <2.0.0'
-  polymer_expressions: '>=0.11.0 <0.12.0'
+  polymer_expressions: '>=0.12.0-dev <0.13.0'
   smoke: '>=0.1.0 <0.2.0'
   source_maps: '>=0.9.0 <0.10.0'
-  template_binding: '>=0.11.0 <0.12.0'
+  template_binding: '>=0.12.0-dev <0.13.0'
   web_components: '>=0.4.0 <0.5.0'
   yaml: '>=0.9.0 <2.0.0'
 dev_dependencies:
diff --git a/pkg/polymer/test/build/linter_test.dart b/pkg/polymer/test/build/linter_test.dart
index ef05428..3bff05c 100644
--- a/pkg/polymer/test/build/linter_test.dart
+++ b/pkg/polymer/test/build/linter_test.dart
@@ -515,6 +515,10 @@
         'warning: definition for Polymer element with tag name "x-foo" not '
         'found. (lib/test.html 0 0)'
       ]);
+    
+    _testLinter('tag exists (internally defined in code)', {
+      'a|lib/test.html': '<div is="auto-binding-dart"></div>',
+      }, []);
 
     _testLinter('used correctly (no base tag)', {
         'a|lib/test.html': '''
diff --git a/pkg/polymer/test/js_interop_test.dart b/pkg/polymer/test/js_interop_test.dart
index 3704ccb..154cd01 100644
--- a/pkg/polymer/test/js_interop_test.dart
+++ b/pkg/polymer/test/js_interop_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -11,11 +11,35 @@
 import 'package:unittest/html_config.dart';
 import 'package:unittest/unittest.dart';
 
-@CustomTag("dart-element")
+@CustomTag('dart-element')
 class DartElement extends PolymerElement {
   DartElement.created() : super.created();
 }
 
+@CustomTag('dart-element2')
+class DartElement2 extends PolymerElement {
+  Element get quux => this.querySelector('.quux');
+  DartElement2.created() : super.created();
+}
+
+@CustomTag('dart-element3')
+class DartElement3 extends PolymerElement {
+  @observable var quux;
+  DartElement3.created() : super.created();
+
+  domReady() {
+    quux = new JsObject.jsify({
+      'aDartMethod': (x) => 444 + x
+    });
+  }
+}
+
+@CustomTag('dart-two-way')
+class DartTwoWay extends PolymerElement {
+  @observable var twoWay = 40;
+  DartTwoWay.created() : super.created();
+}
+
 main() => initPolymer().run(() {
   useHtmlConfiguration();
 
@@ -31,8 +55,62 @@
 
   test('js-element in dart-element', () => testInterop(
       querySelector('dart-element').shadowRoot.querySelector('js-element')));
+
+  test('elements can be passed through Node.bind to JS', () {
+    var text = querySelector('dart-element2')
+        .shadowRoot.querySelector('js-element2')
+        .shadowRoot.text;
+    expect(text, 'QUX:123');
+  });
+
+  test('objects with functions can be passed through Node.bind to JS', () {
+    var sr = querySelector('dart-element3')
+      .shadowRoot.querySelector('js-element3')
+      .shadowRoot;
+
+    return new Future(() {
+      expect(sr.text, 'js-element3[qux]:765');
+    });
+  });
+
+  test('two way bindings work', () {
+    var dartElem = querySelector('dart-two-way');
+    var jsElem = dartElem.shadowRoot.querySelector('js-two-way');
+    var interop = new JsObject.fromBrowserObject(jsElem);
+
+    return new Future(() {
+      expect(jsElem.shadowRoot.text, 'FOOBAR:40');
+
+      expect(dartElem.twoWay, 40);
+      expect(interop['foobar'], 40);
+
+      interop.callMethod('aJsMethod', [2]);
+
+      // Because Polymer.js two-way bindings are just a getter/setter pair
+      // pointing at the original, we will see the new value immediately.
+      expect(dartElem.twoWay, 42);
+
+      expect(interop['foobar'], 42);
+
+      // Text will update asynchronously
+      expect(jsElem.shadowRoot.text, 'FOOBAR:40');
+
+      return _onTextChanged(jsElem.shadowRoot).then((_) {
+        expect(jsElem.shadowRoot.text, 'FOOBAR:42');
+      });
+    });     
+  });
 });
 
+Future<List<MutationRecord>> _onTextChanged(Node node) {
+  var completer = new Completer();
+  new MutationObserver((mutations, observer) {
+    observer.disconnect();
+    completer.complete(mutations);
+  })..observe(node, characterData: true, subtree: true);
+  return completer.future;
+}
+
 testInterop(jsElem) {
   expect(jsElem.shadowRoot.text, 'FOOBAR');
   var interop = new JsObject.fromBrowserObject(jsElem);
diff --git a/pkg/polymer/test/js_interop_test.html b/pkg/polymer/test/js_interop_test.html
index 01fab3e..5dab7fd 100644
--- a/pkg/polymer/test/js_interop_test.html
+++ b/pkg/polymer/test/js_interop_test.html
@@ -38,6 +38,60 @@
   <dart-element></dart-element>
   <js-element></js-element>
 
+  <polymer-element name="js-element2" attributes="qux">
+    <template>QUX:{{qux.baz}}</template>
+    <script>Polymer('js-element2');</script>
+  </polymer-element>
+
+
+  <polymer-element name="dart-element2">
+    <template>
+     <js-element2 qux="{{quux}}"></js-element2>
+    </template>
+  </polymer-element>
+
+  <dart-element2>
+    <js-element baz="123" class="quux"></js-element>
+  </dart-element2>
+
+
+  <polymer-element name="js-element3" attributes="qux">
+    <template>FOOBAR</template>
+    <script>Polymer('js-element3', {
+      quxChanged: function() {
+        this.shadowRoot.textContent = 'js-element3[qux]:' +
+            this.qux.aDartMethod(321);
+      }
+    });</script>
+  </polymer-element>
+
+  <polymer-element name="dart-element3">
+    <template>
+      <js-element3 qux="{{quux}}"></js-element3>
+    </template>
+  </polymer-element>
+
+  <dart-element3></dart-element3>
+
+
+  <polymer-element name="js-two-way" attributes="foobar">
+    <template>FOOBAR:{{foobar}}</template>
+    <script>Polymer('js-two-way', {
+      foobar: 0,
+      aJsMethod: function(inc) {
+        this.foobar = this.foobar + inc;
+      },
+    });</script>
+  </polymer-element>
+
+  <polymer-element name="dart-two-way">
+    <template>
+      <js-two-way foobar="{{twoWay}}"></js-two-way>
+    </template>
+  </polymer-element>
+
+  <dart-two-way></dart-two-way>
+
   <script type="application/dart" src="js_interop_test.dart"></script>
 
   </body>
diff --git a/pkg/polymer_expressions/lib/polymer_expressions.dart b/pkg/polymer_expressions/lib/polymer_expressions.dart
index c263d03..00e5409 100644
--- a/pkg/polymer_expressions/lib/polymer_expressions.dart
+++ b/pkg/polymer_expressions/lib/polymer_expressions.dart
@@ -278,14 +278,20 @@
     return null;
   }
 
-  _check(v, {bool skipChanges: false}) {
+  bool _convertAndCheck(newValue, {bool skipChanges: false}) {
     var oldValue = _value;
-    _value = _converter(v);
+    _value = _converter(newValue);
+
     if (!skipChanges && _callback != null && oldValue != _value) {
       _callback(_value);
+      return true;
     }
+    return false;
   }
 
+  // TODO(jmesserly): this should discard changes, but it caused
+  // a strange infinite loop in one of the bindings_tests.
+  // For now skipping the test. See http://dartbug.com/19105.
   get value {
     // if there's a callback, then _value has been set, if not we need to
     // force an evaluation
@@ -296,7 +302,7 @@
   set value(v) {
     try {
       var newValue = assign(_expr, v, _scope, checkAssignability: false);
-      _check(newValue, skipChanges: true);
+      _convertAndCheck(newValue);
     } catch (e, s) {
       new Completer().completeError(
           "Error evaluating expression '$_expr': $e", s);
@@ -308,20 +314,25 @@
 
     _callback = callback;
     _observer = observe(_expr, _scope);
-    _sub = _observer.onUpdate.listen(_check)..onError((e, s) {
+    _sub = _observer.onUpdate.listen(_convertAndCheck)..onError((e, s) {
       new Completer().completeError(
           "Error evaluating expression '$_observer': $e", s);
     });
 
+    _check(skipChanges: true);
+    return _value;
+  }
+
+  bool _check({bool skipChanges: false}) {
     try {
       // this causes a call to _updateValue with the new value
       update(_observer, _scope);
-      _check(_observer.currentValue, skipChanges: true);
+      return _convertAndCheck(_observer.currentValue, skipChanges: skipChanges);
     } catch (e, s) {
       new Completer().completeError(
           "Error evaluating expression '$_observer': $e", s);
+      return false;
     }
-    return _value;
   }
 
   void close() {
@@ -334,6 +345,27 @@
     new Closer().visit(_observer);
     _observer = null;
   }
+
+
+  // TODO(jmesserly): the following code is copy+pasted from path_observer.dart
+  // What seems to be going on is: polymer_expressions.dart has its own _Binding
+  // unlike polymer-expressions.js, which builds on CompoundObserver.
+  // This can lead to subtle bugs and should be reconciled. I'm not sure how it
+  // should go, but CompoundObserver does have some nice optimizations around
+  // ObservedSet which are lacking here. And reuse is nice.
+  void deliver() {
+    if (_callback != null) _dirtyCheck();
+  }
+
+  bool _dirtyCheck() {
+    var cycles = 0;
+    while (cycles < _MAX_DIRTY_CHECK_CYCLES && _check()) {
+      cycles++;
+    }
+    return cycles > 0;
+  }
+
+  static const int _MAX_DIRTY_CHECK_CYCLES = 1000;
 }
 
 _identity(x) => x;
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index bd94d258..fe7c41c 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -1,12 +1,12 @@
 name: polymer_expressions
-version: 0.11.2
+version: 0.12.0-dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: An expressive custom binding syntax for HTML templates
 homepage: http://www.dartlang.org/polymer-dart/
 dependencies:
   browser: ">=0.10.0 <0.11.0"
-  observe: ">=0.10.0 <0.11.0"
-  template_binding: ">=0.10.0 <0.12.0"
+  observe: ">=0.11.0-dev <0.12.0"
+  template_binding: ">=0.12.0-dev <0.13.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
   benchmark_harness: ">=1.0.0 <2.0.0"
diff --git a/pkg/polymer_expressions/test/bindings_test.dart b/pkg/polymer_expressions/test/bindings_test.dart
index 571b473..c5469ba 100644
--- a/pkg/polymer_expressions/test/bindings_test.dart
+++ b/pkg/polymer_expressions/test/bindings_test.dart
@@ -157,10 +157,6 @@
       });
     });
 
-    // TODO(sigmund): enable this test (issue 19105)
-    // _cursorPositionTest(false);
-    _cursorPositionTest(true);
-
     // Regression tests for issue 18792.
     for (var usePolymer in [true, false]) {
       // We run these tests both with PolymerExpressions and with the default
@@ -171,6 +167,10 @@
         // Use <option template repeat="{{y}}" value="{{}}">item {{}}
         _initialSelectTest('{{y}}', '{{}}', usePolymer);
         _updateSelectTest('{{y}}', '{{}}', usePolymer);
+
+        // TODO(jmesserly): this is broken with polymer-expressions, see
+        // http://dartbug.com/19105
+        if (!usePolymer) _cursorPositionTest(usePolymer);
       });
     }
 
@@ -210,7 +210,7 @@
       expect(el.selectionEnd, 3);
 
       el.value = 'abc de';
-      // Updating the input value programatically (even to the same value in
+      // Updating the input value programmatically (even to the same value in
       // Chrome) loses the selection position.
       expect(el.selectionStart, 6);
       expect(el.selectionEnd, 6);
diff --git a/pkg/polymer_expressions/test/bindings_test.html b/pkg/polymer_expressions/test/bindings_test.html
new file mode 100644
index 0000000..855f892
--- /dev/null
+++ b/pkg/polymer_expressions/test/bindings_test.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="dart.unittest" content="full-stack-traces">
+  <title> bindings_test </title>
+  <style>
+     .unittest-table { font-family:monospace; border:1px; }
+     .unittest-pass { background: #6b3;}
+     .unittest-fail { background: #d55;}
+     .unittest-error { background: #a11;}
+  </style>
+  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/dart_support.js"></script>
+</head>
+<body>
+  <h1> Running template_binding_test </h1>
+  <script type="text/javascript"
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  %TEST_SCRIPTS%
+</body>
+</html>
diff --git a/pkg/polymer_expressions/test/globals_test.html b/pkg/polymer_expressions/test/globals_test.html
new file mode 100644
index 0000000..51f606b
--- /dev/null
+++ b/pkg/polymer_expressions/test/globals_test.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="dart.unittest" content="full-stack-traces">
+  <title> globals_test </title>
+  <style>
+     .unittest-table { font-family:monospace; border:1px; }
+     .unittest-pass { background: #6b3;}
+     .unittest-fail { background: #d55;}
+     .unittest-error { background: #a11;}
+  </style>
+  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/dart_support.js"></script>
+</head>
+<body>
+  <h1> Running template_binding_test </h1>
+  <script type="text/javascript"
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  %TEST_SCRIPTS%
+</body>
+</html>
diff --git a/pkg/polymer_expressions/test/syntax_test.html b/pkg/polymer_expressions/test/syntax_test.html
new file mode 100644
index 0000000..9413dd3
--- /dev/null
+++ b/pkg/polymer_expressions/test/syntax_test.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="dart.unittest" content="full-stack-traces">
+  <title> syntax_test </title>
+  <style>
+     .unittest-table { font-family:monospace; border:1px; }
+     .unittest-pass { background: #6b3;}
+     .unittest-fail { background: #d55;}
+     .unittest-error { background: #a11;}
+  </style>
+  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/dart_support.js"></script>
+</head>
+<body>
+  <h1> Running template_binding_test </h1>
+  <script type="text/javascript"
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  %TEST_SCRIPTS%
+</body>
+</html>
diff --git a/pkg/shelf/CHANGELOG.md b/pkg/shelf/CHANGELOG.md
index 2926976..0e6dc49 100644
--- a/pkg/shelf/CHANGELOG.md
+++ b/pkg/shelf/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.5.4+2
+
+* Updated headers map to use a more efficient case-insensitive backing store.
+
 ## 0.5.4+1
 
 * Widen the version constraint for `stack_trace`.
diff --git a/pkg/shelf/lib/src/shelf_unmodifiable_map.dart b/pkg/shelf/lib/src/shelf_unmodifiable_map.dart
index 9634c85..7cb5553 100644
--- a/pkg/shelf/lib/src/shelf_unmodifiable_map.dart
+++ b/pkg/shelf/lib/src/shelf_unmodifiable_map.dart
@@ -6,8 +6,6 @@
 
 import 'dart:collection';
 
-// TODO(kevmoo): MapView lacks a const ctor, so we have to use DelegatingMap
-// from pkg/collection - https://codereview.chromium.org/294093003/
 import 'package:collection/wrappers.dart' as pc;
 
 /// A simple wrapper over [pc.UnmodifiableMapView] which avoids re-wrapping
@@ -33,15 +31,8 @@
     }
 
     if (ignoreKeyCase) {
-      // TODO(kevmoo) generalize this model with a 'canonical map' to align with
-      // similiar implementation in http pkg [BaseRequest].
-      var map = new LinkedHashMap<String, V>(
-          equals: (key1, key2) => key1.toLowerCase() == key2.toLowerCase(),
-          hashCode: (key) => key.toLowerCase().hashCode);
-
-      map.addAll(source);
-
-      source = map;
+      source = new pc.CanonicalizedMap<String, String, V>.from(source,
+          (key) => key.toLowerCase(), isValidKey: (key) => key != null);
     } else {
       source = new Map<String, V>.from(source);
     }
@@ -53,6 +44,8 @@
 }
 
 /// An const empty implementation of [ShelfUnmodifiableMap].
+// TODO(kevmoo): Consider using MapView from dart:collection which has a const
+// ctor. Would require updating min SDK to 1.5.
 class _EmptyShelfUnmodifiableMap<V> extends pc.DelegatingMap<String, V>
     implements ShelfUnmodifiableMap<V>  {
   const _EmptyShelfUnmodifiableMap() : super(const {});
diff --git a/pkg/shelf/pubspec.yaml b/pkg/shelf/pubspec.yaml
index b6e13fb..4e7c128 100644
--- a/pkg/shelf/pubspec.yaml
+++ b/pkg/shelf/pubspec.yaml
@@ -1,13 +1,12 @@
 name: shelf
-version: 0.5.4+1
+version: 0.5.4+2
 author: Dart Team <misc@dartlang.org>
 description: Web Server Middleware for Dart
 homepage: http://www.dartlang.org
 environment:
   sdk: '>=1.4.0 <2.0.0'
-documentation: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf
 dependencies:
-  collection: '>=0.9.1 <0.10.0'
+  collection: '>=0.9.4 <0.10.0'
   http_parser: '>=0.0.0 <0.1.0'
   path: '>=1.0.0 <2.0.0'
   stack_trace: '>=0.9.2 <2.0.0'
diff --git a/pkg/source_maps/lib/builder.dart b/pkg/source_maps/lib/builder.dart
index ef22e31..cd30ccb 100644
--- a/pkg/source_maps/lib/builder.dart
+++ b/pkg/source_maps/lib/builder.dart
@@ -7,25 +7,16 @@
 
 // TODO(sigmund): add a builder for multi-section mappings.
 
-import 'dart:collection';
 import 'dart:convert';
 
+import 'parser.dart';
 import 'span.dart';
-import 'src/vlq.dart';
 
 /// Builds a source map given a set of mappings.
 class SourceMapBuilder {
 
   final List<Entry> _entries = <Entry>[];
 
-  /// Indices associated with file urls that will be part of the source map. We
-  /// use a linked hash-map so that `_urls.keys[_urls[u]] == u`
-  final Map<String, int> _urls = new LinkedHashMap<String, int>();
-
-  /// Indices associated with identifiers that will be part of the source map.
-  /// We use a linked hash-map so that `_names.keys[_names[n]] == n`
-  final Map<String, int> _names = new LinkedHashMap<String, int>();
-
   /// Adds an entry mapping the [targetOffset] to [source].
   void addFromOffset(Location source,
       SourceFile targetFile, int targetOffset, String identifier) {
@@ -48,78 +39,11 @@
 
   /// Encodes all mappings added to this builder as a json map.
   Map build(String fileUrl) {
-    var buff = new StringBuffer();
-    var line = 0;
-    var column = 0;
-    var srcLine = 0;
-    var srcColumn = 0;
-    var srcUrlId = 0;
-    var srcNameId = 0;
-    var first = true;
-
-    // The encoding needs to be sorted by the target offsets.
-    _entries.sort();
-    for (var entry in _entries) {
-      int nextLine = entry.target.line;
-      if (nextLine > line) {
-        for (int i = line; i < nextLine; ++i) {
-          buff.write(';');
-        }
-        line = nextLine;
-        column = 0;
-        first = true;
-      }
-
-      if (!first) buff.write(',');
-      first = false;
-      column = _append(buff, column, entry.target.column);
-
-      // Encoding can be just the column offset if there is no source
-      // information.
-      var source = entry.source;
-      if (source == null) continue;
-      var newUrlId = _indexOf(_urls, source.sourceUrl);
-
-      srcUrlId = _append(buff, srcUrlId, newUrlId);
-      srcLine = _append(buff, srcLine, source.line);
-      srcColumn = _append(buff, srcColumn, source.column);
-
-      if (entry.identifierName == null) continue;
-      srcNameId = _append(buff, srcNameId,
-          _indexOf(_names, entry.identifierName));
-    }
-
-    var result = {
-      'version': 3,
-      'sourceRoot': '',
-      'sources': _urls.keys.toList(),
-      'names' : _names.keys.toList(),
-      'mappings' : buff.toString()
-    };
-    if (fileUrl != null) {
-      result['file'] = fileUrl;
-    }
-    return result;
+    return new SingleMapping.fromEntries(this._entries, fileUrl).toJson();
   }
 
   /// Encodes all mappings added to this builder as a json string.
   String toJson(String fileUrl) => JSON.encode(build(fileUrl));
-
-  /// Get the index of [value] in [map], or create one if it doesn't exist.
-  int _indexOf(Map<String, int> map, String value) {
-    return map.putIfAbsent(value, () {
-      int index = map.length;
-      map[value] = index;
-      return index;
-    });
-  }
-
-  /// Appends to [buff] a VLQ encoding of [newValue] using the difference
-  /// between [oldValue] and [newValue]
-  static int _append(StringBuffer buff, int oldValue, int newValue) {
-    buff.writeAll(encodeVlq(newValue - oldValue));
-    return newValue;
-  }
 }
 
 /// An entry in the source map builder.
diff --git a/pkg/source_maps/lib/parser.dart b/pkg/source_maps/lib/parser.dart
index c92a8bb..23835a6 100644
--- a/pkg/source_maps/lib/parser.dart
+++ b/pkg/source_maps/lib/parser.dart
@@ -5,8 +5,10 @@
 /// Contains the top-level function to parse source maps version 3.
 library source_maps.parser;
 
+import 'dart:collection';
 import 'dart:convert';
 
+import 'builder.dart' as builder;
 import 'span.dart';
 import 'src/utils.dart';
 import 'src/vlq.dart';
@@ -41,7 +43,7 @@
 }
 
 
-/// A mapping parsed our of a source map.
+/// A mapping parsed out of a source map.
 abstract class Mapping {
   Span spanFor(int line, int column, {Map<String, SourceFile> files});
 
@@ -131,7 +133,6 @@
 }
 
 /// A map containing direct source mappings.
-// TODO(sigmund): integrate mapping and sourcemap builder?
 class SingleMapping extends Mapping {
   /// Url of the target file.
   final String targetUrl;
@@ -143,13 +144,58 @@
   final List<String> names;
 
   /// Entries indicating the beginning of each span.
-  final List<TargetLineEntry> lines = <TargetLineEntry>[];
+  final List<TargetLineEntry> lines;
+
+  SingleMapping._internal(this.targetUrl, this.urls, this.names, this.lines);
+
+  factory SingleMapping.fromEntries(
+      Iterable<builder.Entry> entries, [String fileUrl]) {
+    // The entries needs to be sorted by the target offsets.
+    var sourceEntries = new List.from(entries)..sort();
+    var lines = <TargetLineEntry>[];
+
+    // Indices associated with file urls that will be part of the source map. We
+    // use a linked hash-map so that `_urls.keys[_urls[u]] == u`
+    var urls = new LinkedHashMap<String, int>();
+
+    // Indices associated with identifiers that will be part of the source map.
+    // We use a linked hash-map so that `_names.keys[_names[n]] == n`
+    var names = new LinkedHashMap<String, int>();
+
+    var lineNum;
+    var targetEntries;
+    for (var sourceEntry in sourceEntries) {
+      if (lineNum == null || sourceEntry.target.line > lineNum) {
+        lineNum = sourceEntry.target.line;
+        targetEntries = <TargetEntry>[];
+        lines.add(new TargetLineEntry(lineNum, targetEntries));
+      }
+
+      if (sourceEntry.source == null) {
+        targetEntries.add(new TargetEntry(sourceEntry.target.column));
+      } else {
+        var urlId = urls.putIfAbsent(
+            sourceEntry.source.sourceUrl, () => urls.length);
+        var srcNameId = sourceEntry.identifierName == null ? null :
+            names.putIfAbsent(sourceEntry.identifierName, () => names.length);
+        targetEntries.add(new TargetEntry(
+            sourceEntry.target.column,
+            urlId,
+            sourceEntry.source.line,
+            sourceEntry.source.column,
+            srcNameId));
+      }
+    }
+    return new SingleMapping._internal(
+        fileUrl, urls.keys.toList(), names.keys.toList(), lines);
+  }
 
   SingleMapping.fromJson(Map map)
       : targetUrl = map['file'],
         // TODO(sigmund): add support for 'sourceRoot'
         urls = map['sources'],
-        names = map['names'] {
+        names = map['names'],
+        lines = <TargetLineEntry>[] {
     int line = 0;
     int column = 0;
     int srcUrlId = 0;
@@ -215,6 +261,66 @@
     }
   }
 
+  /// Encodes the Mapping mappings as a json map.
+  Map toJson() {
+    var buff = new StringBuffer();
+    var line = 0;
+    var column = 0;
+    var srcLine = 0;
+    var srcColumn = 0;
+    var srcUrlId = 0;
+    var srcNameId = 0;
+    var first = true;
+
+    for (var entry in lines) {
+      int nextLine = entry.line;
+      if (nextLine > line) {
+        for (int i = line; i < nextLine; ++i) {
+          buff.write(';');
+        }
+        line = nextLine;
+        column = 0;
+        first = true;
+      }
+
+      for (var segment in entry.entries) {
+        if (!first) buff.write(',');
+        first = false;
+        column = _append(buff, column, segment.column);
+
+        // Encoding can be just the column offset if there is no source
+        // information.
+        var newUrlId = segment.sourceUrlId;
+        if (newUrlId == null) continue;
+        srcUrlId = _append(buff, srcUrlId, newUrlId);
+        srcLine = _append(buff, srcLine, segment.sourceLine);
+        srcColumn = _append(buff, srcColumn, segment.sourceColumn);
+
+        if (segment.sourceNameId == null) continue;
+        srcNameId = _append(buff, srcNameId, segment.sourceNameId);
+      }
+    }
+
+    var result = {
+      'version': 3,
+      'sourceRoot': '',
+      'sources': urls,
+      'names' : names,
+      'mappings' : buff.toString()
+    };
+    if (targetUrl != null) {
+      result['file'] = targetUrl;
+    }
+    return result;
+  }
+
+  /// Appends to [buff] a VLQ encoding of [newValue] using the difference
+  /// between [oldValue] and [newValue]
+  static int _append(StringBuffer buff, int oldValue, int newValue) {
+    buff.writeAll(encodeVlq(newValue - oldValue));
+    return newValue;
+  }
+
   _segmentError(int seen, int line) => new StateError(
       'Invalid entry in sourcemap, expected 1, 4, or 5'
       ' values, but got $seen.\ntargeturl: $targetUrl, line: $line');
@@ -308,7 +414,7 @@
 /// A line entry read from a source map.
 class TargetLineEntry {
   final int line;
-  List<TargetEntry> entries = <TargetEntry>[];
+  List<TargetEntry> entries;
   TargetLineEntry(this.line, this.entries);
 
   String toString() => '$runtimeType: $line $entries';
diff --git a/pkg/source_maps/test/parser_test.dart b/pkg/source_maps/test/parser_test.dart
index afdd7fb..8f1be3d 100644
--- a/pkg/source_maps/test/parser_test.dart
+++ b/pkg/source_maps/test/parser_test.dart
@@ -99,4 +99,15 @@
     expect(entry.sourceLine, 0);
     expect(entry.sourceNameId, 0);
   });
+
+  test('parse and re-emit', () {
+    for (var expected in [
+        EXPECTED_MAP,
+        MAP_WITH_NO_SOURCE_LOCATION,
+        MAP_WITH_SOURCE_LOCATION,
+        MAP_WITH_SOURCE_LOCATION_AND_NAME]) {
+      var mapping = parseJson(expected);
+      expect(mapping.toJson(), equals(expected));
+    }
+  });
 }
diff --git a/pkg/template_binding/CHANGELOG.md b/pkg/template_binding/CHANGELOG.md
index 7df9ea5..fbc46ff 100644
--- a/pkg/template_binding/CHANGELOG.md
+++ b/pkg/template_binding/CHANGELOG.md
@@ -3,12 +3,19 @@
 This file contains highlights of what changes on each version of the
 template_binding package.
 
+#### Pub version 0.12.0-dev
+  * NodeBind interop support. This allows elements such as Polymer's
+    core-elements and paper-elements to work properly with Dart binding paths,
+    including using Elements and functions as values, and two-way bindings.
+  * NodeBind is no longer ported. It now comes from
+    packages/web_components/platform.js
+
 #### Pub version 0.11.0
   * Ported up to commit [TemplateBinding#1cee02][5b9a3b] and
     [NodeBind#c47bc1][c47bc1].
 
 #### Pub version 0.10.0
-  * Applied patch to throw errors asycnhronously if property path evaluation
+  * Applied patch to throw errors asynchronously if property path evaluation
     fails.
   * Applied patch matching commit [51df59][] (fix parser to avoid allocating
     PropertyPath if there is a non-null delegateFn).
diff --git a/pkg/template_binding/lib/src/element.dart b/pkg/template_binding/lib/src/element.dart
deleted file mode 100644
index 6d82baa..0000000
--- a/pkg/template_binding/lib/src/element.dart
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of template_binding;
-
-/** Extensions to the [Element] API. */
-class _ElementExtension extends NodeBindExtension {
-  _ElementExtension(Element node) : super._(node);
-
-  bind(String name, value, {bool oneTime: false}) {
-    Element node = _node;
-
-    if (node is OptionElement && name == 'value') {
-      // Note: because <option> can be a semantic template, <option> will be
-      // a TemplateBindExtension sometimes. So we need to handle it here.
-      node.attributes.remove(name);
-
-      if (oneTime) return _updateOption(value);
-      _open(value, _updateOption);
-    } else {
-      bool conditional = name.endsWith('?');
-      if (conditional) {
-        node.attributes.remove(name);
-        name = name.substring(0, name.length - 1);
-      }
-
-      if (oneTime) return _updateAttribute(_node, name, conditional, value);
-
-      _open(value, (x) => _updateAttribute(_node, name, conditional, x));
-    }
-    return _maybeUpdateBindings(name, value);
-  }
-
-  void _updateOption(newValue) {
-    OptionElement node = _node;
-    var oldValue = null;
-    var selectBinding = null;
-    var select = node.parentNode;
-    if (select is SelectElement) {
-      var bindings = nodeBind(select).bindings;
-      if (bindings != null) {
-        var valueBinding = bindings['value'];
-        if (valueBinding is _InputBinding) {
-          selectBinding = valueBinding;
-          oldValue = select.value;
-        }
-      }
-    }
-
-    node.value = _sanitizeValue(newValue);
-
-    if (selectBinding != null && select.value != oldValue) {
-      selectBinding.value = select.value;
-    }
-  }
-}
-
-void _updateAttribute(Element node, String name, bool conditional, value) {
-  if (conditional) {
-    if (_toBoolean(value)) {
-      node.attributes[name] = '';
-    } else {
-      node.attributes.remove(name);
-    }
-  } else {
-    // TODO(jmesserly): escape value if needed to protect against XSS.
-    // See https://github.com/polymer-project/mdv/issues/58
-    node.attributes[name] = _sanitizeValue(value);
-  }
-}
diff --git a/pkg/template_binding/lib/src/input_bindings.dart b/pkg/template_binding/lib/src/input_bindings.dart
deleted file mode 100644
index 3cdc7db..0000000
--- a/pkg/template_binding/lib/src/input_bindings.dart
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of template_binding;
-
-
-// Note: the JavaScript version monkeypatches(!!) the close method of the passed
-// in Bindable. We use a wrapper instead.
-class _InputBinding extends Bindable {
-  // Note: node can be an InputElement or TextAreaElement. Both have "value".
-  var _node;
-  StreamSubscription _eventSub;
-  Bindable _bindable;
-  String _propertyName;
-
-  _InputBinding(this._node, this._bindable, this._propertyName) {
-    _eventSub = _getStreamForInputType(_node).listen(_nodeChanged);
-    _updateNode(open(_updateNode));
-  }
-
-  void _updateNode(newValue) => _updateProperty(_node, newValue, _propertyName);
-
-  static void _updateProperty(node, newValue, String propertyName) {
-    switch (propertyName) {
-      case 'checked':
-        node.checked = _toBoolean(newValue);
-        return;
-      case 'selectedIndex':
-        node.selectedIndex = _toInt(newValue);
-        return;
-      case 'value':
-        node.value = _sanitizeValue(newValue);
-        return;
-    }
-  }
-
-  void _nodeChanged(e) {
-    switch (_propertyName) {
-      case 'value':
-        value = _node.value;
-        break;
-      case 'checked':
-        value = _node.checked;
-
-        // Only the radio button that is getting checked gets an event. We
-        // therefore find all the associated radio buttons and update their
-        // checked binding manually.
-        if (_node is InputElement && _node.type == 'radio') {
-          for (var r in _getAssociatedRadioButtons(_node)) {
-            var checkedBinding = nodeBind(r).bindings['checked'];
-            if (checkedBinding != null) {
-              // Set the value directly to avoid an infinite call stack.
-              checkedBinding.value = false;
-            }
-          }
-        }
-        break;
-      case 'selectedIndex':
-        value = _node.selectedIndex;
-        break;
-    }
-
-    Observable.dirtyCheck();
-  }
-
-  open(callback(value)) => _bindable.open(callback);
-  get value => _bindable.value;
-  set value(newValue) => _bindable.value = newValue;
-
-  void close() {
-    if (_eventSub != null) {
-      _eventSub.cancel();
-      _eventSub = null;
-    }
-    if (_bindable != null) {
-      _bindable.close();
-      _bindable = null;
-    }
-  }
-
-  static EventStreamProvider<Event> _checkboxEventType = () {
-    // Attempt to feature-detect which event (change or click) is fired first
-    // for checkboxes.
-    var div = new DivElement();
-    var checkbox = div.append(new InputElement());
-    checkbox.type = 'checkbox';
-    var fired = [];
-    checkbox.onClick.listen((e) {
-      fired.add(Element.clickEvent);
-    });
-    checkbox.onChange.listen((e) {
-      fired.add(Element.changeEvent);
-    });
-    checkbox.dispatchEvent(new MouseEvent('click', view: window));
-    // WebKit/Blink don't fire the change event if the element is outside the
-    // document, so assume 'change' for that case.
-    return fired.length == 1 ? Element.changeEvent : fired.first;
-  }();
-
-  static Stream<Event> _getStreamForInputType(element) {
-    if (element is OptionElement) return element.onInput;
-    switch (element.type) {
-      case 'checkbox':
-        return _checkboxEventType.forTarget(element);
-      case 'radio':
-      case 'select-multiple':
-      case 'select-one':
-        return element.onChange;
-      case 'range':
-        if (window.navigator.userAgent.contains(new RegExp('Trident|MSIE'))) {
-          return element.onChange;
-        }
-    }
-    return element.onInput;
-  }
-
-  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
-  // Returns an array containing all radio buttons other than |element| that
-  // have the same |name|, either in the form that |element| belongs to or,
-  // if no form, in the document tree to which |element| belongs.
-  //
-  // This implementation is based upon the HTML spec definition of a
-  // "radio button group":
-  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
-  //
-  static Iterable _getAssociatedRadioButtons(element) {
-    if (element.form != null) {
-      return element.form.nodes.where((el) {
-        return el != element &&
-            el is InputElement &&
-            el.type == 'radio' &&
-            el.name == element.name;
-      });
-    } else {
-      var treeScope = _getTreeScope(element);
-      if (treeScope == null) return const [];
-
-      var radios = treeScope.querySelectorAll(
-          'input[type="radio"][name="${element.name}"]');
-      return radios.where((el) => el != element && el.form == null);
-    }
-  }
-
-  // TODO(jmesserly,sigmund): I wonder how many bindings typically convert from
-  // one type to another (e.g. value-as-number) and whether it is useful to
-  // have something like a int/num binding converter (either as a base class or
-  // a wrapper).
-  static int _toInt(value) {
-    if (value is String) return int.parse(value, onError: (_) => 0);
-    return value is int ? value : 0;
-  }
-}
-
-_getTreeScope(Node node) {
-  Node parent;
-  while ((parent = node.parentNode) != null ) {
-    node = parent;
-  }
-
-  return _hasGetElementById(node) ? node : null;
-}
-
-// Note: JS code tests that getElementById is present. We can't do that
-// easily, so instead check for the types known to implement it.
-bool _hasGetElementById(Node node) =>
-    node is Document || node is ShadowRoot || node is SvgSvgElement;
diff --git a/pkg/template_binding/lib/src/input_element.dart b/pkg/template_binding/lib/src/input_element.dart
deleted file mode 100644
index 72cd7cc..0000000
--- a/pkg/template_binding/lib/src/input_element.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of template_binding;
-
-/** Extensions to the [InputElement] API. */
-class _InputElementExtension extends _ElementExtension {
-  _InputElementExtension(InputElement node) : super(node);
-
-  InputElement get _node => super._node;
-
-  Bindable bind(String name, value, {bool oneTime: false}) {
-    if (name != 'value' && name != 'checked') {
-      return super.bind(name, value, oneTime: oneTime);
-    }
-
-    _node.attributes.remove(name);
-    if (oneTime) {
-      _InputBinding._updateProperty(_node, value, name);
-      return null;
-    }
-
-    // Note: call _updateBindings to always store binding reflection, because
-    // checkboxes may need to update bindings of other checkboxes.
-    return _updateBindings(name, new _InputBinding(_node, value, name));
-  }
-}
diff --git a/pkg/template_binding/lib/src/node.dart b/pkg/template_binding/lib/src/node.dart
index 97c6406..c4bb5f3 100644
--- a/pkg/template_binding/lib/src/node.dart
+++ b/pkg/template_binding/lib/src/node.dart
@@ -7,6 +7,11 @@
 /** Extensions to the [Node] API. */
 class NodeBindExtension {
   final Node _node;
+  final JsObject _js;
+
+  NodeBindExtension._(node)
+      : _node = node,
+        _js = new JsObject.fromBrowserObject(node);
 
   /**
    * Gets the data bindings that are associated with this node, if any.
@@ -17,9 +22,25 @@
   // Dart note: in JS this has a trailing underscore, meaning "private".
   // But in dart if we made it _bindings, it wouldn't be accessible at all.
   // It is unfortunately needed to implement Node.bind correctly.
-  Map<String, Bindable> bindings;
-
-  NodeBindExtension._(this._node);
+  Map<String, Bindable> get bindings {
+    var b = _js['bindings_'];
+    if (b == null) return null;
+    // TODO(jmesserly): should cache this for identity.
+    return new _NodeBindingsMap(b);
+  }
+  
+  set bindings(Map<String, Bindable> value) {
+    if (value == null) {
+      _js.deleteProperty('bindings_');
+      return;
+    }
+    var b = bindings;
+    if (b == null) {
+      _js['bindings_'] = new JsObject.jsify({});
+      b = bindings;
+    }
+    b.addAll(value);
+  }
 
   /**
    * Binds the attribute [name] to [value]. [value] can be a simple value when
@@ -27,50 +48,125 @@
    * Returns the [Bindable] instance.
    */
   Bindable bind(String name, value, {bool oneTime: false}) {
-    // TODO(jmesserly): in Dart we could deliver an async error, which would
-    // have a similar affect but be reported as a test failure. Should we?
-    window.console.error('Unhandled binding to Node: '
-        '$this $name $value $oneTime');
-    return null;
+    name = _dartToJsName(name);
+
+    if (!oneTime && value is Bindable) {
+      value = bindableToJsObject(value);
+    }
+    return jsObjectToBindable(_js.callMethod('bind', [name, value, oneTime]));
   }
 
   /**
    * Called when all [bind] calls are finished for a given template expansion.
    */
-  void bindFinished() {}
+  bindFinished() => _js.callMethod('bindFinished');
 
-  /**
-   * Dispatch support so custom HtmlElement's can override these methods.
-   *
-   * A public method like [this.bind] should not call another public method.
-   *
-   * Instead it should dispatch through [_self] to give the "overridden" method
-   * a chance to intercept.
-   */
-  NodeBindExtension get _self => _node is NodeBindExtension ? _node : this;
-
+  // Note: confusingly this is on NodeBindExtension because it can be on any
+  // Node. It's really an API added by TemplateBinding. Therefore it stays
+  // implemented in Dart because TemplateBinding still is.
   TemplateInstance _templateInstance;
 
   /** Gets the template instance that instantiated this node, if any. */
   TemplateInstance get templateInstance =>
       _templateInstance != null ? _templateInstance :
       (_node.parent != null ? nodeBind(_node.parent).templateInstance : null);
+}
 
-  _open(Bindable bindable, callback(value)) =>
-      callback(bindable.open(callback));
+class _NodeBindingsMap extends MapBase<String, Bindable> {
+  final JsObject _bindings;
 
-  Bindable _maybeUpdateBindings(String name, Bindable binding) {
-    return enableBindingsReflection ? _updateBindings(name, binding) : binding;
+  _NodeBindingsMap(this._bindings);
+
+  // TODO(jmesserly): this should be lazy
+  Iterable<String> get keys =>
+      js.context['Object'].callMethod('keys', [_bindings]).map(_jsToDartName);
+
+  Bindable operator[](String name) =>
+      jsObjectToBindable(_bindings[_dartToJsName(name)]);
+
+  operator[]=(String name, Bindable value) {
+    _bindings[_dartToJsName(name)] = bindableToJsObject(value);
   }
 
-  Bindable _updateBindings(String name, Bindable binding) {
-    if (bindings == null) bindings = {};
-    var old = bindings[name];
-    if (old != null) old.close();
-    return bindings[name] = binding;
+  @override Bindable remove(String name) {
+    name = _dartToJsName(name);
+    var old = this[name];
+    _bindings.deleteProperty(name);
+    return old;
+  }
+
+  @override void clear() {
+    // Notes: this implementation only works because our "keys" returns a copy.
+    // We could also make it O(1) by assigning a new JS object to the bindings_
+    // property, if performance is an issue.
+    keys.forEach(remove);
   }
 }
 
+// TODO(jmesserly): perhaps we should switch Dart's Node.bind API back to
+// 'textContent' for consistency? This only affects the raw Node.bind API when
+// called on Text nodes, which is unlikely to be used except by TemplateBinding.
+// Seems like a lot of magic to support it. I don't think Node.bind promises any
+// strong relationship between properties and [name], so textContent seems fine.
+String _dartToJsName(String name) {
+  if (name == 'text') name = 'textContent';
+  return name;
+}
+
+
+String _jsToDartName(String name) {
+  if (name == 'textContent') name = 'text';
+  return name;
+}
+
+
+/// Given a bindable [JsObject], wraps it in a Dart [Bindable].
+/// See [bindableToJsObject] to go in the other direction.
+Bindable jsObjectToBindable(JsObject obj) {
+  if (obj == null) return null;
+  var b = obj['__dartBindable'];
+  // For performance, unwrap the Dart bindable if we find one.
+  // Note: in the unlikely event some code messes with our __dartBindable
+  // property we can simply fallback to a _JsBindable wrapper.
+  return b is Bindable ? b : new _JsBindable(obj);
+}
+
+class _JsBindable extends Bindable {
+  final JsObject _js;
+  _JsBindable(JsObject obj) : _js = obj;
+
+  open(callback) => _js.callMethod('open', [callback]);
+
+  close() => _js.callMethod('close');
+
+  get value => _js.callMethod('discardChanges');
+
+  set value(newValue) {
+    _js.callMethod('setValue', [newValue]);
+  }
+
+  deliver() => _js.callMethod('deliver');
+}
+
+/// Given a [bindable], create a JS object proxy for it.
+/// This is the inverse of [jsObjectToBindable].
+JsObject bindableToJsObject(Bindable bindable) {
+  if (bindable is _JsBindable) return bindable._js;
+
+  return new JsObject.jsify({
+    'open': (callback) => bindable.open((x) => callback.apply([x])),
+    'close': () => bindable.close(),
+    'discardChanges': () => bindable.value,
+    'setValue': (x) => bindable.value = x,
+    // NOTE: this is not used by Node.bind, but it's used by Polymer:
+    // https://github.com/Polymer/polymer-dev/blob/ba2b68fe5a5721f60b5994135f3270e63588809a/src/declaration/properties.js#L130
+    // Technically this works because 'deliver' is on PathObserver and
+    // CompoundObserver. But ideally Polymer-JS would not assume that.
+    'deliver': () => bindable.deliver(),
+    // Save this so we can return it from [jsObjectToBindable]
+    '__dartBindable': bindable
+  });
+}
 
 /** Information about the instantiated template. */
 class TemplateInstance {
diff --git a/pkg/template_binding/lib/src/select_element.dart b/pkg/template_binding/lib/src/select_element.dart
deleted file mode 100644
index c936d40..0000000
--- a/pkg/template_binding/lib/src/select_element.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of template_binding;
-
-/** Extensions to the [SelectElement] API. */
-class _SelectElementExtension extends _ElementExtension {
-  _SelectElementExtension(SelectElement node) : super(node);
-
-  SelectElement get _node => super._node;
-
-  Bindable bind(String name, value, {bool oneTime: false}) {
-    if (name == 'selectedindex') name = 'selectedIndex';
-    if (name != 'selectedIndex' && name != 'value') {
-      return super.bind(name, value, oneTime: oneTime);
-    }
-
-    // TODO(jmesserly): merge logic here with InputElement, it's the same except
-    // for the addition of selectedIndex as a valid property name.
-    _node.attributes.remove(name);
-    if (oneTime) {
-      _InputBinding._updateProperty(_node, value, name);
-      return null;
-    }
-
-    // Option update events may need to access select bindings.
-    return _updateBindings(name, new _InputBinding(_node, value, name));
-  }
-}
diff --git a/pkg/template_binding/lib/src/template.dart b/pkg/template_binding/lib/src/template.dart
index f9d0e1e..7554dc8 100644
--- a/pkg/template_binding/lib/src/template.dart
+++ b/pkg/template_binding/lib/src/template.dart
@@ -5,7 +5,7 @@
 part of template_binding;
 
 /** Extensions to [Element]s that behave as templates. */
-class TemplateBindExtension extends _ElementExtension {
+class TemplateBindExtension extends NodeBindExtension {
   var _model;
   BindingDelegate _bindingDelegate;
   _TemplateIterator _iterator;
@@ -23,17 +23,16 @@
 
   Node _refContent;
 
-  TemplateBindExtension._(Element node) : super(node);
+  TemplateBindExtension._(Element node) : super._(node);
 
   Element get _node => super._node;
 
-  TemplateBindExtension get _self => super._node is TemplateBindExtension
+  TemplateBindExtension get _self => _node is TemplateBindExtension
       ? _node : this;
 
   Bindable bind(String name, value, {bool oneTime: false}) {
     if (name != 'ref') return super.bind(name, value, oneTime: oneTime);
 
-
     var ref = oneTime ? value : value.open((ref) {
       _node.attributes['ref'] = ref;
       _refChanged();
@@ -43,7 +42,8 @@
     _refChanged();
     if (oneTime) return null;
 
-    return _updateBindings('ref', value);
+    if (bindings == null) bindings = {};
+    return bindings['ref'] = value;
   }
 
   _TemplateIterator _processBindingDirectives(_TemplateBindingMap directives) {
@@ -78,7 +78,7 @@
    *
    * If [instanceBindings] is supplied, each [Bindable] in the returned
    * instance will be added to the list. This makes it easy to close all of the
-   * bindings without walking the tree. This is not normally necesssary, but is
+   * bindings without walking the tree. This is not normally necessary, but is
    * used internally by the system.
    */
   DocumentFragment createInstance([model, BindingDelegate delegate]) {
@@ -526,6 +526,11 @@
   return instance != null && instance._templateCreator != null ? node : null;
 }
 
+// Note: JS code tests that getElementById is present. We can't do that
+// easily, so instead check for the types known to implement it.
+bool _hasGetElementById(Node node) =>
+    node is Document || node is ShadowRoot || node is SvgSvgElement;
+
 final Expando<_InstanceExtension> _instanceExtension = new Expando();
 
 final _isStagingDocument = new Expando();
diff --git a/pkg/template_binding/lib/src/text.dart b/pkg/template_binding/lib/src/text.dart
deleted file mode 100644
index d057be7..0000000
--- a/pkg/template_binding/lib/src/text.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of template_binding;
-
-/** Extensions to the [Text] API. */
-class _TextExtension extends NodeBindExtension {
-  _TextExtension(Text node) : super._(node);
-
-  Bindable bind(String name, value, {bool oneTime: false}) {
-    // Dart note: 'text' instead of 'textContent' to match the DOM property.
-    if (name != 'text') {
-      return super.bind(name, value, oneTime: oneTime);
-    }
-    if (oneTime) {
-      _updateText(value);
-      return null;
-    }
-
-    _open(value, _updateText);
-    return _maybeUpdateBindings(name, value);
-  }
-
-  _updateText(value) {
-    _node.text = _sanitizeValue(value);
-  }
-}
-
-/** Called to sanitize the value before it is assigned into the property. */
-_sanitizeValue(value) => value == null ? '' : '$value';
diff --git a/pkg/template_binding/lib/src/text_area_element.dart b/pkg/template_binding/lib/src/text_area_element.dart
deleted file mode 100644
index 89fdf0c..0000000
--- a/pkg/template_binding/lib/src/text_area_element.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of template_binding;
-
-/** Extensions to the [TextAreaElement] API. */
-class _TextAreaElementExtension extends _ElementExtension {
-  _TextAreaElementExtension(TextAreaElement node) : super(node);
-
-  TextAreaElement get _node => super._node;
-
-  Bindable bind(String name, value, {bool oneTime: false}) {
-    if (name != 'value') return super.bind(name, value, oneTime: oneTime);
-
-    _node.attributes.remove(name);
-    if (oneTime) {
-      _InputBinding._updateProperty(_node, value, name);
-      return null;
-    }
-
-    return _maybeUpdateBindings(name, new _InputBinding(_node, value, name));
-  }
-}
diff --git a/pkg/template_binding/lib/template_binding.dart b/pkg/template_binding/lib/template_binding.dart
index 1e8b3a8..88fa17b 100644
--- a/pkg/template_binding/lib/template_binding.dart
+++ b/pkg/template_binding/lib/template_binding.dart
@@ -21,22 +21,18 @@
 import 'dart:async';
 import 'dart:collection';
 import 'dart:html';
+import 'dart:js' as js show context;
+import 'dart:js' show JsObject;
 import 'dart:svg' show SvgSvgElement;
 import 'package:observe/observe.dart';
 
 import 'src/mustache_tokens.dart';
 
 part 'src/binding_delegate.dart';
-part 'src/element.dart';
-part 'src/input_bindings.dart';
-part 'src/input_element.dart';
 part 'src/instance_binding_map.dart';
 part 'src/node.dart';
-part 'src/select_element.dart';
 part 'src/template.dart';
 part 'src/template_iterator.dart';
-part 'src/text.dart';
-part 'src/text_area_element.dart';
 
 // TODO(jmesserly): ideally we would split TemplateBinding and Node.bind into
 // two packages, but this is not easy when we are faking extension methods.
@@ -108,25 +104,11 @@
   var extension = _expando[node];
   if (extension != null) return extension;
 
-  // TODO(jmesserly): switch on localName?
-  if (node is InputElement) {
-    extension = new _InputElementExtension(node);
-  } else if (node is SelectElement) {
-    extension = new _SelectElementExtension(node);
-  } else if (node is TextAreaElement) {
-    extension = new _TextAreaElementExtension(node);
-  } else if (node is Element) {
-    if (isSemanticTemplate(node)) {
-      extension = new TemplateBindExtension._(node);
-    } else {
-      extension = new _ElementExtension(node);
-    }
-  } else if (node is Text) {
-    extension = new _TextExtension(node);
+  if (isSemanticTemplate(node)) {
+    extension = new TemplateBindExtension._(node);
   } else {
     extension = new NodeBindExtension._(node);
   }
-
   _expando[node] = extension;
   return extension;
 }
@@ -147,7 +129,7 @@
  * A node is a template if [tagName] is TEMPLATE, or the node has the
  * 'template' attribute and this tag supports attribute form for backwards
  * compatibility with existing HTML parsers. The nodes that can use attribute
- * form are table elments (THEAD, TBODY, TFOOT, TH, TR, TD, CAPTION, COLGROUP
+ * form are table elements (THEAD, TBODY, TFOOT, TH, TR, TD, CAPTION, COLGROUP
  * and COL), OPTION, and OPTGROUP.
  */
 bool isSemanticTemplate(Node n) => n is Element &&
@@ -162,7 +144,12 @@
  * such as UI builders to easily inspect live bindings. Defaults to false for
  * performance reasons.
  */
-bool enableBindingsReflection = false;
+bool get enableBindingsReflection =>
+    js.context['Platform']['enableBindingsReflection'] == true;
+
+set enableBindingsReflection(bool value) {
+  js.context['Platform']['enableBindingsReflection'] = value;
+}
 
 // TODO(jmesserly): const set would be better
 const _SEMANTIC_TEMPLATE_TAGS = const {
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index acb2c24..8247c2e 100644
--- a/pkg/template_binding/pubspec.yaml
+++ b/pkg/template_binding/pubspec.yaml
@@ -1,12 +1,12 @@
 name: template_binding
-version: 0.11.0
+version: 0.12.0-dev
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: >
   Extends the capabilities of the HTML Template Element by enabling it to
   create, manage, and remove instances of content bound to data defined in Dart.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  observe: ">=0.10.0 <0.11.0"
+  observe: ">=0.11.0-dev <0.12.0"
 dev_dependencies:
   web_components: ">=0.3.1 <0.4.0"
   unittest: ">=0.10.0 <0.11.0"
diff --git a/pkg/template_binding/test/custom_element_bindings_test.dart b/pkg/template_binding/test/custom_element_bindings_test.dart
index 17068a4..0b53033 100644
--- a/pkg/template_binding/test/custom_element_bindings_test.dart
+++ b/pkg/template_binding/test/custom_element_bindings_test.dart
@@ -21,8 +21,6 @@
 
   _registered = customElementsReady.then((_) {
     document.registerElement('my-custom-element', MyCustomElement);
-    document.registerElement('with-attrs-custom-element',
-        WithAttrsCustomElement);
   });
 
   group('Custom Element Bindings', customElementBindingsTest);
@@ -75,49 +73,6 @@
     });
   });
 
-  test('override attribute setter', () {
-    var element = new WithAttrsCustomElement();
-    var model = toObservable({'a': 1, 'b': 2});
-    nodeBind(element).bind('hidden?', new PathObserver(model, 'a'));
-    nodeBind(element).bind('id', new PathObserver(model, 'b'));
-
-    expect(element.attributes, contains('hidden'));
-    expect(element.attributes['hidden'], '');
-    expect(element.id, '2');
-
-    model['a'] = null;
-    return new Future(() {
-      expect(element.attributes, isNot(contains('hidden')),
-          reason: 'null is false-y');
-
-      model['a'] = false;
-    }).then(endOfMicrotask).then((_) {
-      expect(element.attributes, isNot(contains('hidden')));
-
-      model['a'] = 'foo';
-      // TODO(jmesserly): this is here to force an ordering between the two
-      // changes. Otherwise the order depends on what order StreamController
-      // chooses to fire the two listeners in.
-    }).then(endOfMicrotask).then((_) {
-
-      model['b'] = 'x';
-    }).then(endOfMicrotask).then((_) {
-      expect(element.attributes, contains('hidden'));
-      expect(element.attributes['hidden'], '');
-      expect(element.id, 'x');
-
-      expect(element.attributes.log, [
-        ['remove', 'hidden?'],
-        ['[]=', 'hidden', ''],
-        ['[]=', 'id', '2'],
-        ['remove', 'hidden'],
-        ['remove', 'hidden'],
-        ['[]=', 'hidden', ''],
-        ['[]=', 'id', 'x'],
-      ]);
-    });
-  });
-
   test('template bind uses overridden custom element bind', () {
 
     var model = toObservable({'a': new Point(123, 444), 'b': new Monster(100)});
@@ -217,37 +172,3 @@
   }
 }
 
-
-/**
- * Demonstrates a custom element can override attributes []= and remove.
- * and see changes that the data binding system is making to the attributes.
- */
-class WithAttrsCustomElement extends HtmlElement {
-  AttributeMapWrapper _attributes;
-
-  factory WithAttrsCustomElement() =>
-      new Element.tag('with-attrs-custom-element');
-
-  WithAttrsCustomElement.created() : super.created() {
-    _attributes = new AttributeMapWrapper(super.attributes);
-  }
-
-  get attributes => _attributes;
-}
-
-// TODO(jmesserly): would be nice to use mocks when mirrors work on dart2js.
-class AttributeMapWrapper<K, V> extends MapView<K, V> {
-  final List log = [];
-
-  AttributeMapWrapper(Map map) : super(map);
-
-  void operator []=(K key, V value) {
-    log.add(['[]=', key, value]);
-    super[key] = value;
-  }
-
-  V remove(Object key) {
-    log.add(['remove', key]);
-    return super.remove(key);
-  }
-}
diff --git a/pkg/template_binding/test/node_bind_test.html b/pkg/template_binding/test/node_bind_test.html
new file mode 100644
index 0000000..da39fb8a
--- /dev/null
+++ b/pkg/template_binding/test/node_bind_test.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="dart.unittest" content="full-stack-traces">
+  <title> node_bind_test </title>
+  <style>
+     .unittest-table { font-family:monospace; border:1px; }
+     .unittest-pass { background: #6b3;}
+     .unittest-fail { background: #d55;}
+     .unittest-error { background: #a11;}
+  </style>
+  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/dart_support.js"></script>
+</head>
+<body>
+  <h1> Running node_bind_test </h1>
+  <script type="text/javascript"
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  %TEST_SCRIPTS%
+</body>
+</html>
diff --git a/pkg/template_binding/test/template_binding_test.dart b/pkg/template_binding/test/template_binding_test.dart
index 42fd389..375d3d6 100644
--- a/pkg/template_binding/test/template_binding_test.dart
+++ b/pkg/template_binding/test/template_binding_test.dart
@@ -168,7 +168,7 @@
     runZoned(() {
       templateBind(template).model = m;
     }, onError: (e, s) {
-      expect(e, isNoSuchMethodError);
+      _expectNoSuchMethod(e);
       errorSeen = true;
     });
     return new Future(() {
@@ -252,7 +252,7 @@
     runZoned(() {
       templateBind(template).model = m;
     }, onError: (e, s) {
-      expect(e, isNoSuchMethodError);
+      _expectNoSuchMethod(e);
       errorSeen = true;
     });
 
@@ -2246,8 +2246,10 @@
     expect(templateB.ownerDocument, templateA.ownerDocument);
     expect(contentB.ownerDocument, contentA.ownerDocument);
 
-    expect(templateA.ownerDocument.window, window);
-    expect(templateB.ownerDocument.window, window);
+    // NOTE: these tests don't work under ShadowDOM polyfill.
+    // Disabled for now.
+    //expect(templateA.ownerDocument.window, window);
+    //expect(templateB.ownerDocument.window, window);
 
     expect(contentA.ownerDocument.window, null);
     expect(contentB.ownerDocument.window, null);
@@ -2376,7 +2378,7 @@
     var outer = templateBind(div.nodes.first);
     var model = 1; // model is missing 'foo' should throw.
     expect(() => outer.createInstance(model, new TestBindingSyntax()),
-        throwsA(isNoSuchMethodError));
+        throwsA(_isNoSuchMethodError));
   });
 
   test('CreateInstance - async error', () {
@@ -2392,7 +2394,7 @@
     bool seen = false;
     runZoned(() => outer.createInstance(model, new TestBindingSyntax()),
       onError: (e) {
-        expect(e, isNoSuchMethodError);
+        _expectNoSuchMethod(e);
         seen = true;
       });
     return new Future(() { expect(seen, isTrue); });
@@ -2593,6 +2595,16 @@
   });
 }
 
+// TODO(jmesserly): ideally we could test the type with isNoSuchMethodError,
+// however dart:js converts the nSM into a String at some point.
+// So for now we do string comparison.
+_isNoSuchMethodError(e) => '$e'.contains('NoSuchMethodError');
+
+_expectNoSuchMethod(e) {
+  // expect(e, isNoSuchMethodError);
+  expect('$e', contains('NoSuchMethodError'));
+}
+
 class Issue285Syntax extends BindingDelegate {
   prepareInstanceModel(template) {
     if (template.id == 'del') return (val) => val * 2;
diff --git a/pkg/template_binding/test/template_binding_test.html b/pkg/template_binding/test/template_binding_test.html
new file mode 100644
index 0000000..4c302c18
--- /dev/null
+++ b/pkg/template_binding/test/template_binding_test.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="dart.unittest" content="full-stack-traces">
+  <title> template_binding_test </title>
+  <style>
+     .unittest-table { font-family:monospace; border:1px; }
+     .unittest-pass { background: #6b3;}
+     .unittest-fail { background: #d55;}
+     .unittest-error { background: #a11;}
+  </style>
+  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/dart_support.js"></script>
+</head>
+<body>
+  <h1> Running template_binding_test </h1>
+  <script type="text/javascript"
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  %TEST_SCRIPTS%
+</body>
+</html>
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js
index 2044ee3..9481eee 100644
--- a/pkg/web_components/lib/platform.concat.js
+++ b/pkg/web_components/lib/platform.concat.js
@@ -5440,6 +5440,43 @@
   scope.wrappers.HTMLContentElement = HTMLContentElement;
 })(window.ShadowDOMPolyfill);
 
+/*
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var wrapHTMLCollection = scope.wrapHTMLCollection;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+
+  var OriginalHTMLFormElement = window.HTMLFormElement;
+
+  function HTMLFormElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);
+  mixin(HTMLFormElement.prototype, {
+    get elements() {
+      // Note: technically this should be an HTMLFormControlsCollection, but
+      // that inherits from HTMLCollection, so should be good enough. Spec:
+      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection
+      return wrapHTMLCollection(unwrap(this).elements);
+    }
+  });
+
+  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,
+                  document.createElement('form'));
+
+  scope.wrappers.HTMLFormElement = HTMLFormElement;
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
index 9abc6b5..46cb900 100644
--- a/pkg/web_components/lib/platform.concat.js.map
+++ b/pkg/web_components/lib/platform.concat.js.map
@@ -24,6 +24,7 @@
     "../ShadowDOM/src/wrappers/HTMLElement.js",
     "../ShadowDOM/src/wrappers/HTMLCanvasElement.js",
     "../ShadowDOM/src/wrappers/HTMLContentElement.js",
+    "../ShadowDOM/src/wrappers/HTMLFormElement.js",
     "../ShadowDOM/src/wrappers/HTMLImageElement.js",
     "../ShadowDOM/src/wrappers/HTMLShadowElement.js",
     "../ShadowDOM/src/wrappers/HTMLTemplateElement.js",
@@ -84,7 +85,7 @@
     "src/patches-mdv.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CClEA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CCnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;CCprDA;AACA;CCDA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC/ZA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CChDA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCnXA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CChFA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCn4BA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,C;AC5HA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CC/CA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCdA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9tBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CCjHA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CC1EA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CC5CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CCzCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;CC7CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;CCrJA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;CC1TA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CC9BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCtCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CC1CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCzBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCtEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCrBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CCzCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CC9DA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjDA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CC/DA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCnCA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCpCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CC9BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;CC3BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CC7CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CClEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCvCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjDA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CC9FA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCvBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCzEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9oBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCrDA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CClEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CC1UA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CCpEA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CCvBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;CC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CCjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CCpwBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC5CA,C;ACAA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;CCdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CCpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,C;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CChIA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CCtLA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCvTA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCtSA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCpEA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA,EACA;AACA,EACA;CCvVA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;CC3dA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA,0B;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;CCjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCtEA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;CCtVA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CCtuCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,C",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CClEA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CCnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;CCprDA;AACA;CCDA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC/ZA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CChDA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCnXA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CChFA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCn4BA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,C;AC5HA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CC/CA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCdA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9tBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CCjHA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CC1EA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CC5CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CCzCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;CC7CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;CCrJA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;CC1TA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CC9BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCtCA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCnCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CC1CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCzBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCtEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCrBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CCzCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CC9DA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjDA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CC/DA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCnCA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCpCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CC9BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;CC3BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CC7CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CClEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCvCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjDA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CC9FA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCvBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCzEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9oBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCrDA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CClEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CC1UA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CCpEA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CCvBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;CC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CCjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CCpwBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC5CA,C;ACAA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;CCdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CCpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,C;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CChIA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CCtLA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCvTA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCtSA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCpEA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA,EACA;AACA,EACA;CCvVA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;CC3dA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA,0B;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;CCjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCtEA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;CCtVA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CCtuCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,C",
   "sourcesContent": [
     "/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n",
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n",
@@ -108,6 +109,7 @@
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n",
+    "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n",
diff --git a/pkg/web_components/lib/platform.js b/pkg/web_components/lib/platform.js
index 2e3f9d6..5d67ba5 100644
--- a/pkg/web_components/lib/platform.js
+++ b/pkg/web_components/lib/platform.js
@@ -10,8 +10,8 @@
 // @version: 0.3.3-29065bc
 
 window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");a.length&&Array.prototype.push.apply(this,a.slice()),hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];K(a,e,M(b,e))}return a}function e(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}K(a,e,M(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){N.value=c,K(a,b,N)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=G.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return J&&l(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function n(a){return J&&l(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function o(a){return J&&l(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return P}}function q(b,c,d){for(var e=L(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){O&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),K(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===G.get(a)),G.set(a,b),H.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return G.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a instanceof I.EventTarget||a instanceof I.Event||a instanceof I.Range||a instanceof I.DOMImplementation||a instanceof I.CanvasRenderingContext2D||I.WebGLRenderingContext&&a instanceof I.WebGLRenderingContext}function x(a){return R&&a instanceof R||a instanceof T||a instanceof S||a instanceof U||a instanceof V||a instanceof Q||a instanceof W||X&&a instanceof X||Y&&a instanceof Y}function y(a){return null===a?null:(c(x(a)),a.polymerWrapper_||(a.polymerWrapper_=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.impl)}function A(a){return a&&w(a)?z(a):a}function B(a){return a&&!w(a)?y(a):a}function C(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.polymerWrapper_=b)}function D(a,b,c){Z.get=c,K(a.prototype,b,Z)}function E(a,b){D(a,b,function(){return y(this.impl[b])})}function F(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=B(this);return a[b].apply(a,arguments)}})})}var G=new WeakMap,H=new WeakMap,I=Object.create(null),J=b(),K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor,N={value:void 0,configurable:!0,enumerable:!1,writable:!0};L(window);var O=/Firefox/.test(navigator.userAgent),P={get:function(){},set:function(){},configurable:!0,enumerable:!0},Q=window.DOMImplementation,R=window.EventTarget,S=window.Event,T=window.Node,U=window.Window,V=window.Range,W=window.CanvasRenderingContext2D,X=window.WebGLRenderingContext,Y=window.SVGElementInstance,Z={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=G,a.defineGetter=D,a.defineWrapGetter=E,a.forwardMethodsToWrapper=F,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=H,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=C,a.unwrap=z,a.unwrapIfNeeded=A,a.wrap=y,a.wrapIfNeeded=B,a.wrappers=I}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof Q.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof Q.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof Q.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!S.get(a)&&(S.set(a,!0),n(P(a),P(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof Q.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof Q.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof Q.Document&&(g=i.defaultView)}return _.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),X.set(b,ab),V.delete(b,null),T.delete(b),b.defaultPrevented
-}function o(a,b,c,d){var e=bb;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=cb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=db,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=R.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===bb)return!0;c===db&&(c=cb)}else if(c===db&&!b.bubbles)return!0;if("relatedTarget"in b){var i=O(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=P(j),m=k(b,a,l);if(m===g)return!0}else m=null;W.set(b,m)}}X.set(b,c);var n=b.type,o=!1;U.set(b,g),V.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===bb||r.capture&&c===db))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),Z.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!Y.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof eb))return P(x(eb,"Event",a,b));var c=a;return pb||"beforeunload"!==c.type?void(this.impl=c):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(nb)return new a(c,u(d));var e=O(document.createEvent(b)),f=mb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=O(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){this.impl=a}function C(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function D(a,b){var c=R.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=O(a);c;c=c.parentNode)if(D(P(c),b))return!0;return!1}function F(a){K(a,rb)}function G(b,c,e,f){a.renderAllPending();var g=P(sb.call(c.impl,e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=$.get(this);d||(d=Object.create(null),$.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.unwrap,P=a.wrap,Q=a.wrappers,R=(new WeakMap,new WeakMap),S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=0,bb=1,cb=2,db=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var eb=window.Event;eb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=_.get(this);return a?a.slice():[]},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(eb,t,document.createEvent("Event"));var fb=v("UIEvent",t),gb=v("CustomEvent",t),hb={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},ib=M({initMouseEvent:w("initMouseEvent",14)},hb),jb=M({initFocusEvent:w("initFocusEvent",5)},hb),kb=v("MouseEvent",fb,ib),lb=v("FocusEvent",fb,jb),mb=Object.create(null),nb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!nb){var ob=function(a,b,c){if(c){var d=mb[c];b=M(M({},d),b)}mb[a]=b};ob("Event",{bubbles:!1,cancelable:!1}),ob("CustomEvent",{detail:null},"Event"),ob("UIEvent",{view:null,detail:0},"Event"),ob("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ob("FocusEvent",{relatedTarget:null},"UIEvent")}var pb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),pb&&N(pb,y);var qb=window.EventTarget,rb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;rb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=R.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,R.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=R.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},qb&&N(qb,B);var sb=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=gb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=lb,a.wrappers.MouseEvent=kb,a.wrappers.UIEvent=fb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,o)}function c(a){this.impl=a}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.unwrap,k=a.wrap,l=window.TouchEvent;if(l){var m;try{m=document.createEvent("TouchEvent")}catch(n){return}var o={enumerable:!1};c.prototype={get target(){return k(this.impl.target)}};var p={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){p.get=function(){return this.impl[a]},Object.defineProperty(c.prototype,a,p)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(j(this).touches)},get targetTouches(){return e(j(this).targetTouches)},get changedTouches(){return e(j(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(l,f,m),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,g)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap,g={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);O=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;O=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=J(b),e=d.parentNode;e&&V.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,V.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=L(c?P.call(c,a.impl,!1):Q.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof N.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof R),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unwrap,K=a.unwrapIfNeeded,L=a.wrap,M=a.wrapIfNeeded,N=a.wrappers,O=!1,P=document.importNode,Q=window.Node.prototype.cloneNode,R=window.Node,S=window.DocumentFragment,T=(R.prototype.appendChild,R.prototype.compareDocumentPosition),U=R.prototype.insertBefore,V=R.prototype.removeChild,W=R.prototype.replaceChild,X=/Trident/.test(navigator.userAgent),Y=X?function(a,b){try{V.call(a,b)}catch(c){if(!(a instanceof S))throw c}}:function(a,b){V.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=J(c):(d=c,c=L(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),U.call(this.impl,J(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:this.impl;j?U.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Y(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Y(this.impl,f);return O||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=J(d):(e=d,d=L(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),W.call(this.impl,J(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&W.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:L(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:L(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:L(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:L(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:L(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,M(a))},compareDocumentPosition:function(a){return T.call(this.impl,K(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(R,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b){return a.matches(b)}function d(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===l}function e(){return!0}function f(a,b){return a.localName===b}function g(a,b){return a.namespaceURI===b}function h(a,b,c){return a.namespaceURI===b&&a.localName===c}function i(a,b,c,d,e){for(var f=a.firstElementChild;f;)c(f,d,e)&&(b[b.length++]=f),i(f,b,c,d,e),f=f.nextElementSibling;return b}var j=a.wrappers.HTMLCollection,k=a.wrappers.NodeList,l="http://www.w3.org/1999/xhtml",m={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return i(this,new k,c,a)}},n={getElementsByTagName:function(a){var b=new j;return"*"===a?i(this,b,e):i(this,b,d,a,a.toLowerCase())},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new j;if(""===a)a=null;else if("*"===a)return"*"===b?i(this,c,e):i(this,c,f,b);return"*"===b?i(this,c,g,a):i(this,c,h,a,b)}};a.GetElementsByInterface=n,a.SelectorsInterface=m}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){this.impl=a,this.ownerElement_=b}c.prototype={get length(){return this.impl.length},item:function(a){return this.impl.item(a)},contains:function(a){return this.impl.contains(a)},add:function(){this.impl.add.apply(this.impl,arguments),b(this.ownerElement_)},remove:function(){this.impl.remove.apply(this.impl,arguments),b(this.ownerElement_)},toggle:function(){var a=this.impl.toggle.apply(this.impl,arguments);return b(this.ownerElement_),a},toString:function(){return this.impl.toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(this.impl,a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;
-b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;m.set(this,e),this.treeScope_=new d(this,g(e||a)),l.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){I.set(a,[])}function f(a){var b=I.get(a);return b||I.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<M.length;a++){var b=M[a],c=b.parentRenderer;c&&c.dirty||b.render()}M=[]}function i(){y=null,h()}function j(a){var b=K.get(a);return b||(b=new n(a),K.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=J.get(a);c?c.push(b):J.set(a,[b])}function r(a){return J.get(a)}function s(a){J.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!O.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),M=[],N=new ArraySplice;N.equals=function(a,b){return G(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(G(b)),h=a||new WeakMap,i=N.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){if(this.dirty=!0,M.push(this),y)return;y=window[L](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){a.impl.polymerShadowRenderer_=this}};var O=/^[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return A(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var D=document.adoptNode,E=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){A(this)instanceof d||y(this),b.apply(A(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);F.call(z(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)},get defaultView(){return A(z(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(m.call(h(this)))},get document(){return j(h(this).document)}}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertCombinators(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertCombinators:function(a){for(var b=0;b<combinatorsRe.length;b++)a=a.replace(combinatorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){}},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),combinatorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}}),Platform.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";
-continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),function(a){a.templateContent=a.templateContent||function(a){return a.content}}(window.Platform),function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;var f=this.pending[a];e&&e!==a&&(this.cache[e]=d,f=f.concat(this.pending[e]));for(var g,h=0,i=f.length;i>h&&(g=f[h]);h++)this.onload(e||a,g,d),this.tail();this.pending[a]=null,e&&e!==a&&(this.pending[e]=null)},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:c;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+b}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import.__importParsed=!0,this.markParsingComplete(a),a.dispatchEvent(a.__resource?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&!a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,q)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(q)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}function e(a,b){b=b||r,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===y}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===y)&&(b.removeEventListener(z,c),g(a,b))};b.addEventListener(z,c)}}function h(a,b){function c(){f==g&&a&&a()}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return o?a.import&&"loading"!==a.import.readyState||a.__loaded:a.__importParsed}function j(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)k(b)&&l(b)}function k(a){return"link"===a.localName&&"import"===a.rel}function l(a){var b=a.import;b?m({target:a}):(a.addEventListener("load",m),a.addEventListener("error",m))}function m(a){a.target.__loaded=!0}var n="import"in document.createElement("link"),o=n,p=a.flags,q="import",r=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(o)var s={};else var t=(a.xhr,a.Loader),u=a.parser,s={documents:{},documentPreloadSelectors:"link[rel="+q+"]",importsPreloadSelectors:["link[rel="+q+"]"].join(","),loadNode:function(a){v.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);v.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===r?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(p.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}u.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),u.parseNext()},loadedAll:function(){u.parseNext()}},v=new t(s.loaded.bind(s),s.loadedAll.bind(s));var w={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",w),Object.defineProperty(r,"_currentScript",w),!document.baseURI){var x={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",x),Object.defineProperty(r,"baseURI",x)}var y=HTMLImports.isIE?"complete":"interactive",z="readystatechange";o&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&j(b.addedNodes)}).observe(document.head,{childList:!0}),a.hasNative=n,a.useNative=o,a.importer=s,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=q,a.isImportLoaded=i,a.importLoader=v}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor
-}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(window.Platform),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue())},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,this)}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
+}function o(a,b,c,d){var e=bb;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=cb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=db,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=R.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===bb)return!0;c===db&&(c=cb)}else if(c===db&&!b.bubbles)return!0;if("relatedTarget"in b){var i=O(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=P(j),m=k(b,a,l);if(m===g)return!0}else m=null;W.set(b,m)}}X.set(b,c);var n=b.type,o=!1;U.set(b,g),V.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===bb||r.capture&&c===db))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),Z.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!Y.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof eb))return P(x(eb,"Event",a,b));var c=a;return pb||"beforeunload"!==c.type?void(this.impl=c):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(nb)return new a(c,u(d));var e=O(document.createEvent(b)),f=mb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=O(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){this.impl=a}function C(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function D(a,b){var c=R.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=O(a);c;c=c.parentNode)if(D(P(c),b))return!0;return!1}function F(a){K(a,rb)}function G(b,c,e,f){a.renderAllPending();var g=P(sb.call(c.impl,e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=$.get(this);d||(d=Object.create(null),$.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.unwrap,P=a.wrap,Q=a.wrappers,R=(new WeakMap,new WeakMap),S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=0,bb=1,cb=2,db=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var eb=window.Event;eb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=_.get(this);return a?a.slice():[]},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(eb,t,document.createEvent("Event"));var fb=v("UIEvent",t),gb=v("CustomEvent",t),hb={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},ib=M({initMouseEvent:w("initMouseEvent",14)},hb),jb=M({initFocusEvent:w("initFocusEvent",5)},hb),kb=v("MouseEvent",fb,ib),lb=v("FocusEvent",fb,jb),mb=Object.create(null),nb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!nb){var ob=function(a,b,c){if(c){var d=mb[c];b=M(M({},d),b)}mb[a]=b};ob("Event",{bubbles:!1,cancelable:!1}),ob("CustomEvent",{detail:null},"Event"),ob("UIEvent",{view:null,detail:0},"Event"),ob("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ob("FocusEvent",{relatedTarget:null},"UIEvent")}var pb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),pb&&N(pb,y);var qb=window.EventTarget,rb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;rb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=R.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,R.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=R.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},qb&&N(qb,B);var sb=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=gb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=lb,a.wrappers.MouseEvent=kb,a.wrappers.UIEvent=fb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,o)}function c(a){this.impl=a}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.unwrap,k=a.wrap,l=window.TouchEvent;if(l){var m;try{m=document.createEvent("TouchEvent")}catch(n){return}var o={enumerable:!1};c.prototype={get target(){return k(this.impl.target)}};var p={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){p.get=function(){return this.impl[a]},Object.defineProperty(c.prototype,a,p)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(j(this).touches)},get targetTouches(){return e(j(this).targetTouches)},get changedTouches(){return e(j(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(l,f,m),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,g)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap,g={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);O=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;O=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=J(b),e=d.parentNode;e&&V.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,V.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=L(c?P.call(c,a.impl,!1):Q.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof N.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof R),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unwrap,K=a.unwrapIfNeeded,L=a.wrap,M=a.wrapIfNeeded,N=a.wrappers,O=!1,P=document.importNode,Q=window.Node.prototype.cloneNode,R=window.Node,S=window.DocumentFragment,T=(R.prototype.appendChild,R.prototype.compareDocumentPosition),U=R.prototype.insertBefore,V=R.prototype.removeChild,W=R.prototype.replaceChild,X=/Trident/.test(navigator.userAgent),Y=X?function(a,b){try{V.call(a,b)}catch(c){if(!(a instanceof S))throw c}}:function(a,b){V.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=J(c):(d=c,c=L(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),U.call(this.impl,J(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:this.impl;j?U.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Y(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Y(this.impl,f);return O||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=J(d):(e=d,d=L(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),W.call(this.impl,J(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&W.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:L(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:L(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:L(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:L(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:L(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,M(a))},compareDocumentPosition:function(a){return T.call(this.impl,K(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(R,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b){return a.matches(b)}function d(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===l}function e(){return!0}function f(a,b){return a.localName===b}function g(a,b){return a.namespaceURI===b}function h(a,b,c){return a.namespaceURI===b&&a.localName===c}function i(a,b,c,d,e){for(var f=a.firstElementChild;f;)c(f,d,e)&&(b[b.length++]=f),i(f,b,c,d,e),f=f.nextElementSibling;return b}var j=a.wrappers.HTMLCollection,k=a.wrappers.NodeList,l="http://www.w3.org/1999/xhtml",m={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return i(this,new k,c,a)}},n={getElementsByTagName:function(a){var b=new j;return"*"===a?i(this,b,e):i(this,b,d,a,a.toLowerCase())},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new j;if(""===a)a=null;else if("*"===a)return"*"===b?i(this,c,e):i(this,c,f,b);return"*"===b?i(this,c,g,a):i(this,c,h,a,b)}};a.GetElementsByInterface=n,a.SelectorsInterface=m}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){this.impl=a,this.ownerElement_=b}c.prototype={get length(){return this.impl.length},item:function(a){return this.impl.item(a)},contains:function(a){return this.impl.contains(a)},add:function(){this.impl.add.apply(this.impl,arguments),b(this.ownerElement_)},remove:function(){this.impl.remove.apply(this.impl,arguments),b(this.ownerElement_)},toggle:function(){var a=this.impl.toggle.apply(this.impl,arguments);return b(this.ownerElement_),a},toString:function(){return this.impl.toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(this.impl,a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=(a.wrap,window.HTMLFormElement);b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList
+}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;m.set(this,e),this.treeScope_=new d(this,g(e||a)),l.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){I.set(a,[])}function f(a){var b=I.get(a);return b||I.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<M.length;a++){var b=M[a],c=b.parentRenderer;c&&c.dirty||b.render()}M=[]}function i(){y=null,h()}function j(a){var b=K.get(a);return b||(b=new n(a),K.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=J.get(a);c?c.push(b):J.set(a,[b])}function r(a){return J.get(a)}function s(a){J.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!O.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),M=[],N=new ArraySplice;N.equals=function(a,b){return G(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(G(b)),h=a||new WeakMap,i=N.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){if(this.dirty=!0,M.push(this),y)return;y=window[L](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){a.impl.polymerShadowRenderer_=this}};var O=/^[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return A(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var D=document.adoptNode,E=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){A(this)instanceof d||y(this),b.apply(A(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);F.call(z(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)},get defaultView(){return A(z(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(m.call(h(this)))},get document(){return j(h(this).document)}}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertCombinators(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertCombinators:function(a){for(var b=0;b<combinatorsRe.length;b++)a=a.replace(combinatorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){}},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),combinatorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}}),Platform.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";
+continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),function(a){a.templateContent=a.templateContent||function(a){return a.content}}(window.Platform),function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;var f=this.pending[a];e&&e!==a&&(this.cache[e]=d,f=f.concat(this.pending[e]));for(var g,h=0,i=f.length;i>h&&(g=f[h]);h++)this.onload(e||a,g,d),this.tail();this.pending[a]=null,e&&e!==a&&(this.pending[e]=null)},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:c;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+b}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import.__importParsed=!0,this.markParsingComplete(a),a.dispatchEvent(a.__resource?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&!a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,q)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(q)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}function e(a,b){b=b||r,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===y}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===y)&&(b.removeEventListener(z,c),g(a,b))};b.addEventListener(z,c)}}function h(a,b){function c(){f==g&&a&&a()}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return o?a.import&&"loading"!==a.import.readyState||a.__loaded:a.__importParsed}function j(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)k(b)&&l(b)}function k(a){return"link"===a.localName&&"import"===a.rel}function l(a){var b=a.import;b?m({target:a}):(a.addEventListener("load",m),a.addEventListener("error",m))}function m(a){a.target.__loaded=!0}var n="import"in document.createElement("link"),o=n,p=a.flags,q="import",r=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(o)var s={};else var t=(a.xhr,a.Loader),u=a.parser,s={documents:{},documentPreloadSelectors:"link[rel="+q+"]",importsPreloadSelectors:["link[rel="+q+"]"].join(","),loadNode:function(a){v.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);v.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===r?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(p.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}u.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),u.parseNext()},loadedAll:function(){u.parseNext()}},v=new t(s.loaded.bind(s),s.loadedAll.bind(s));var w={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",w),Object.defineProperty(r,"_currentScript",w),!document.baseURI){var x={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",x),Object.defineProperty(r,"baseURI",x)}var y=HTMLImports.isIE?"complete":"interactive",z="readystatechange";o&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&j(b.addedNodes)}).observe(document.head,{childList:!0}),a.hasNative=n,a.useNative=o,a.importer=s,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=q,a.isImportLoaded=i,a.importLoader=v}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");
+return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(window.Platform),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue())},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,this)}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
 //# sourceMappingURL=platform.js.map
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js.map b/pkg/web_components/lib/platform.js.map
index e0e09db..9740272 100644
--- a/pkg/web_components/lib/platform.js.map
+++ b/pkg/web_components/lib/platform.js.map
@@ -1 +1 @@
-{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","../ShadowDOM/src/wrappers.js","build/if-poly.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/dom.js","src/url.js","../MutationObservers/MutationObserver.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","../HTMLImports/src/scope.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","../NodeBind/src/NodeBind.js","src/styleloader.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (parts.length)\n      Array.prototype.push.apply(this, parts.slice());\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return this.impl[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalName(el, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    this.impl = impl;\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    get length() {\n      return this.impl.length;\n    },\n    item: function(index) {\n      return this.impl.item(index);\n    },\n    contains: function(token) {\n      return this.impl.contains(token);\n    },\n    add: function() {\n      this.impl.add.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      this.impl.remove.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = this.impl.toggle.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
+{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","../ShadowDOM/src/wrappers.js","build/if-poly.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLFormElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","build/else.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","src/url.js","../MutationObservers/MutationObserver.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","../HTMLImports/src/Loader.js","../HTMLImports/src/scope.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","../NodeBind/src/NodeBind.js","src/styleloader.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (parts.length)\n      Array.prototype.push.apply(this, parts.slice());\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return this.impl[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalName(el, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    this.impl = impl;\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    get length() {\n      return this.impl.length;\n    },\n    item: function(index) {\n      return this.impl.item(index);\n    },\n    contains: function(token) {\n      return this.impl.contains(token);\n    },\n    add: function() {\n      this.impl.add.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      this.impl.remove.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = this.impl.toggle.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","} else {","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction mixin(inObj/*, inProps, inMoreProps, ...*/) {\n  var obj = inObj || {};\n  for (var i = 1; i < arguments.length; i++) {\n    var p = arguments[i];\n    try {\n      for (var n in p) {\n        copyProperty(n, p, obj);\n      }\n    } catch(x) {\n    }\n  }\n  return obj;\n}\n\n// copy property inName from inSource object to inTarget object\nfunction copyProperty(inName, inSource, inTarget) {\n  var pd = getPropertyDescriptor(inSource, inName);\n  Object.defineProperty(inTarget, inName, pd);\n}\n\n// get property descriptor for inName on inObject, even if\n// inName exists on some link in inObject's prototype chain\nfunction getPropertyDescriptor(inObject, inName) {\n  if (inObject) {\n    var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n  }\n}\n\n// export\n\nscope.mixin = mixin;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
diff --git a/runtime/bin/dbg_connection.cc b/runtime/bin/dbg_connection.cc
index 3695e2a..820bbf6 100644
--- a/runtime/bin/dbg_connection.cc
+++ b/runtime/bin/dbg_connection.cc
@@ -23,7 +23,7 @@
 
 extern bool trace_debug_protocol;
 
-int DebuggerConnectionHandler::listener_fd_ = -1;
+intptr_t DebuggerConnectionHandler::listener_fd_ = -1;
 dart::Monitor* DebuggerConnectionHandler::handler_lock_ = new dart::Monitor();
 
 // TODO(asiva): Remove this once we have support for multiple debugger
@@ -37,7 +37,7 @@
 
 class MessageBuffer {
  public:
-  explicit MessageBuffer(int fd);
+  explicit MessageBuffer(intptr_t fd);
   ~MessageBuffer();
   void ReadData();
   bool IsValidMessage() const;
@@ -50,7 +50,7 @@
   static const int kInitialBufferSize = 256;
   char* buf_;
   int buf_length_;
-  int fd_;
+  intptr_t fd_;
   int data_length_;
   bool connection_is_alive_;
 
@@ -58,7 +58,7 @@
 };
 
 
-MessageBuffer::MessageBuffer(int fd)
+MessageBuffer::MessageBuffer(intptr_t fd)
     :  buf_(NULL),
        buf_length_(0),
        fd_(fd),
@@ -152,7 +152,7 @@
 }
 
 
-DebuggerConnectionHandler::DebuggerConnectionHandler(int debug_fd)
+DebuggerConnectionHandler::DebuggerConnectionHandler(intptr_t debug_fd)
     : debug_fd_(debug_fd), msgbuf_(NULL) {
   msgbuf_ = new MessageBuffer(debug_fd_);
 }
@@ -208,7 +208,7 @@
         intptr_t msg_len = msg_end - msgbuf_->buf();
         int print_len = ((msg_len > kMaxPrintMessageLen)
                          ? kMaxPrintMessageLen : msg_len);
-        Log::Print("[<<<] Receiving message from debug fd %d:\n%.*s%s\n",
+        Log::Print("[<<<] Receiving message from debug fd %" Pd ":\n%.*s%s\n",
                    debug_fd_, print_len, msgbuf_->buf(),
                    ((msg_len > print_len) ? "..." : ""));
       }
@@ -273,7 +273,7 @@
 }
 
 
-void DebuggerConnectionHandler::SendError(int debug_fd,
+void DebuggerConnectionHandler::SendError(intptr_t debug_fd,
                                           int msg_id,
                                           const char* err_msg) {
   dart::TextBuffer msg(64);
@@ -352,7 +352,8 @@
 }
 
 
-void DebuggerConnectionHandler::SendMsg(int debug_fd, dart::TextBuffer* msg) {
+void DebuggerConnectionHandler::SendMsg(intptr_t debug_fd,
+                                        dart::TextBuffer* msg) {
   ASSERT(handler_lock_ != NULL);
   MonitorLocker ml(handler_lock_);
   SendMsgHelper(debug_fd, msg);
@@ -374,7 +375,7 @@
 }
 
 
-void DebuggerConnectionHandler::SendMsgHelper(int debug_fd,
+void DebuggerConnectionHandler::SendMsgHelper(intptr_t debug_fd,
                                               dart::TextBuffer* msg) {
   ASSERT(debug_fd >= 0);
   ASSERT(IsValidJSON(msg->buf()));
@@ -382,7 +383,7 @@
   if (trace_debug_protocol) {
     int print_len = ((msg->length() > kMaxPrintMessageLen)
                      ? kMaxPrintMessageLen : msg->length());
-    Log::Print("[>>>] Sending message to debug fd %d:\n%.*s%s\n",
+    Log::Print("[>>>] Sending message to debug fd %" Pd ":\n%.*s%s\n",
                debug_fd, print_len, msg->buf(),
                ((msg->length() > print_len) ? "..." : ""));
   }
@@ -421,7 +422,7 @@
 }
 
 
-void DebuggerConnectionHandler::AcceptDbgConnection(int debug_fd) {
+void DebuggerConnectionHandler::AcceptDbgConnection(intptr_t debug_fd) {
   Socket::SetNoDelay(debug_fd, true);
   AddNewDebuggerConnection(debug_fd);
   {
@@ -473,7 +474,7 @@
 }
 
 
-void DebuggerConnectionHandler::AddNewDebuggerConnection(int debug_fd) {
+void DebuggerConnectionHandler::AddNewDebuggerConnection(intptr_t debug_fd) {
   // TODO(asiva): Support multiple debugger connections, for now we just
   // create one handler, store it in a static variable and use it.
   ASSERT(singleton_handler == NULL);
@@ -481,7 +482,7 @@
 }
 
 
-void DebuggerConnectionHandler::RemoveDebuggerConnection(int debug_fd) {
+void DebuggerConnectionHandler::RemoveDebuggerConnection(intptr_t debug_fd) {
   // TODO(asiva): Support multiple debugger connections, for now we just
   // set the static handler back to NULL.
   ASSERT(singleton_handler != NULL);
@@ -490,7 +491,7 @@
 
 
 DebuggerConnectionHandler*
-DebuggerConnectionHandler::GetDebuggerConnectionHandler(int debug_fd) {
+DebuggerConnectionHandler::GetDebuggerConnectionHandler(intptr_t debug_fd) {
   // TODO(asiva): Support multiple debugger connections, for now we just
   // return the one static handler that was created.
   ASSERT(singleton_handler != NULL);
diff --git a/runtime/bin/dbg_connection.h b/runtime/bin/dbg_connection.h
index 7efc3f2..cdc24b1 100644
--- a/runtime/bin/dbg_connection.h
+++ b/runtime/bin/dbg_connection.h
@@ -37,11 +37,11 @@
 
 class DebuggerConnectionHandler {
  public:
-  explicit DebuggerConnectionHandler(int debug_fd);
+  explicit DebuggerConnectionHandler(intptr_t debug_fd);
   ~DebuggerConnectionHandler();
 
   // Accessors.
-  int debug_fd() const { return debug_fd_; }
+  intptr_t debug_fd() const { return debug_fd_; }
 
   // Return message id of current debug command message.
   int MessageId();
@@ -61,8 +61,8 @@
   static void WaitForConnection();
 
   // Sends a reply or an error message to a specific debugger client.
-  static void SendMsg(int debug_fd, dart::TextBuffer* msg);
-  static void SendError(int debug_fd, int msg_id, const char* err_msg);
+  static void SendMsg(intptr_t debug_fd, dart::TextBuffer* msg);
+  static void SendError(intptr_t debug_fd, int msg_id, const char* err_msg);
 
   // Sends an event message to all debugger clients that are connected.
   static void BroadcastMsg(dart::TextBuffer* msg);
@@ -75,7 +75,7 @@
 
   // The socket that connects with the debugger client.
   // The descriptor is created and closed by the debugger connection thread.
-  int debug_fd_;
+  intptr_t debug_fd_;
 
   // Buffer holding the messages received over the wire from the debugger
   // front end..
@@ -83,7 +83,7 @@
 
   // Accepts connection requests from debugger client and sets up a
   // connection handler object to read and handle messages from the client.
-  static void AcceptDbgConnection(int debug_fd);
+  static void AcceptDbgConnection(intptr_t debug_fd);
 
   // Handlers for generic debug command messages which are not specific to
   // an isolate.
@@ -91,13 +91,14 @@
   static void HandleIsolatesListCmd(DbgMessage* msg);
 
   // Helper methods to manage debugger client connections.
-  static void AddNewDebuggerConnection(int debug_fd);
-  static void RemoveDebuggerConnection(int debug_fd);
-  static DebuggerConnectionHandler* GetDebuggerConnectionHandler(int debug_fd);
+  static void AddNewDebuggerConnection(intptr_t debug_fd);
+  static void RemoveDebuggerConnection(intptr_t debug_fd);
+  static DebuggerConnectionHandler* GetDebuggerConnectionHandler(
+                                       intptr_t debug_fd);
   static bool IsConnected();
 
   // Helper method for sending messages back to a debugger client.
-  static void SendMsgHelper(int debug_fd, dart::TextBuffer* msg);
+  static void SendMsgHelper(intptr_t debug_fd, dart::TextBuffer* msg);
 
   // mutex/condition variable used by isolates when writing back to the
   // debugger. This is also used to ensure that the isolate waits for
@@ -110,7 +111,7 @@
 
   // The socket that is listening for incoming debugger connections.
   // This descriptor is created and closed by a native thread.
-  static int listener_fd_;
+  static intptr_t listener_fd_;
 
   friend class DebuggerConnectionImpl;
 
diff --git a/runtime/bin/dbg_connection_android.cc b/runtime/bin/dbg_connection_android.cc
index 35154a3..f57c297 100644
--- a/runtime/bin/dbg_connection_android.cc
+++ b/runtime/bin/dbg_connection_android.cc
@@ -21,7 +21,7 @@
 namespace dart {
 namespace bin {
 
-int DebuggerConnectionImpl::epoll_fd_ = -1;
+intptr_t DebuggerConnectionImpl::epoll_fd_ = -1;
 int DebuggerConnectionImpl::wakeup_fds_[2] = {-1, -1};
 
 
@@ -30,7 +30,7 @@
     if (DebuggerConnectionHandler::IsConnected()) {
       FATAL("Cannot connect to more than one debugger.\n");
     }
-    int fd = ServerSocket::Accept(event->data.fd);
+    intptr_t fd = ServerSocket::Accept(event->data.fd);
     if (fd < 0) {
       FATAL("Accepting new debugger connection failed.\n");
     }
@@ -49,7 +49,7 @@
 
 
 void DebuggerConnectionImpl::Handler(uword args) {
-  static const intptr_t kMaxEvents = 4;
+  static const int kMaxEvents = 4;
   struct epoll_event events[kMaxEvents];
   while (1) {
     const int no_timeout = -1;
diff --git a/runtime/bin/dbg_connection_linux.cc b/runtime/bin/dbg_connection_linux.cc
index 59dbd23..d37c752 100644
--- a/runtime/bin/dbg_connection_linux.cc
+++ b/runtime/bin/dbg_connection_linux.cc
@@ -29,7 +29,7 @@
     if (DebuggerConnectionHandler::IsConnected()) {
       FATAL("Cannot connect to more than one debugger.\n");
     }
-    int fd = ServerSocket::Accept(event->data.fd);
+    intptr_t fd = ServerSocket::Accept(event->data.fd);
     if (fd < 0) {
       FATAL("Accepting new debugger connection failed.\n");
     }
@@ -48,7 +48,7 @@
 
 
 void DebuggerConnectionImpl::Handler(uword args) {
-  static const intptr_t kMaxEvents = 4;
+  static const int kMaxEvents = 4;
   struct epoll_event events[kMaxEvents];
   while (1) {
     const int no_timeout = -1;
diff --git a/runtime/bin/dbg_connection_macos.cc b/runtime/bin/dbg_connection_macos.cc
index f47755d..3797c4b 100644
--- a/runtime/bin/dbg_connection_macos.cc
+++ b/runtime/bin/dbg_connection_macos.cc
@@ -71,12 +71,12 @@
 
 
 void DebuggerConnectionImpl::HandleEvent(struct kevent* event) {
-  int ident = event->ident;
+  intptr_t ident = event->ident;
   if (ident == DebuggerConnectionHandler::listener_fd_) {
     if (DebuggerConnectionHandler::IsConnected()) {
       FATAL("Cannot connect to more than one debugger.\n");
     }
-    int fd = ServerSocket::Accept(ident);
+    intptr_t fd = ServerSocket::Accept(ident);
     if (fd < 0) {
       FATAL("Accepting new debugger connection failed.\n");
     }
@@ -108,7 +108,7 @@
 
 
 void DebuggerConnectionImpl::Handler(uword args) {
-  static const intptr_t kMaxEvents = 4;
+  static const int kMaxEvents = 4;
   struct kevent events[kMaxEvents];
 
   while (1) {
diff --git a/runtime/bin/dbg_connection_win.cc b/runtime/bin/dbg_connection_win.cc
index bd650a4..15c63a3 100644
--- a/runtime/bin/dbg_connection_win.cc
+++ b/runtime/bin/dbg_connection_win.cc
@@ -21,7 +21,8 @@
     FATAL("Accepting new debugger connection failed.\n");
   }
   ClientSocket* socket = new ClientSocket(client_socket);
-  DebuggerConnectionHandler::AcceptDbgConnection(reinterpret_cast<int>(socket));
+  DebuggerConnectionHandler::AcceptDbgConnection(
+      reinterpret_cast<intptr_t>(socket));
 }
 
 
diff --git a/runtime/bin/dbg_message.cc b/runtime/bin/dbg_message.cc
index bea6054..28fe8ad 100644
--- a/runtime/bin/dbg_message.cc
+++ b/runtime/bin/dbg_message.cc
@@ -1041,7 +1041,7 @@
 void DbgMsgQueue::AddMessage(int32_t cmd_idx,
                              const char* start,
                              const char* end,
-                             int debug_fd) {
+                             intptr_t debug_fd) {
   if ((end > start) && ((end - start) < kMaxInt32)) {
     MonitorLocker ml(&msg_queue_lock_);
     DbgMessage* msg = new DbgMessage(cmd_idx, start, end, debug_fd);
@@ -1235,7 +1235,7 @@
                                         int32_t cmd_idx,
                                         const char* start,
                                         const char* end,
-                                        int debug_fd) {
+                                        intptr_t debug_fd) {
   MutexLocker ml(msg_queue_list_lock_);
   DbgMsgQueue* queue = DbgMsgQueueList::GetIsolateMsgQueueLocked(isolate_id);
   if (queue != NULL) {
diff --git a/runtime/bin/dbg_message.h b/runtime/bin/dbg_message.h
index 20120e1..8e27dc0 100644
--- a/runtime/bin/dbg_message.h
+++ b/runtime/bin/dbg_message.h
@@ -63,7 +63,7 @@
 class DbgMessage {
  public:
   DbgMessage(int32_t cmd_idx, const char* start,
-             const char* end, int debug_fd)
+             const char* end, intptr_t debug_fd)
       : next_(NULL), cmd_idx_(cmd_idx),
         buffer_(NULL), buffer_len_(end - start),
         debug_fd_(debug_fd) {
@@ -81,7 +81,7 @@
   void set_next(DbgMessage* next) { next_ = next; }
   char* buffer() const { return buffer_; }
   int32_t buffer_len() const { return buffer_len_; }
-  int debug_fd() const { return debug_fd_; }
+  intptr_t debug_fd() const { return debug_fd_; }
 
   // Handle debugger command message.
   // Returns true if the execution needs to resume after this message is
@@ -121,7 +121,7 @@
   int32_t cmd_idx_;  // Isolate specific debugger command index.
   char* buffer_;  // Debugger command message.
   int32_t buffer_len_;  // Length of the debugger command message.
-  int debug_fd_;  // Debugger connection on which replies are to be sent.
+  intptr_t debug_fd_;  // Debugger connection on which replies are to be sent.
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(DbgMessage);
 };
@@ -160,7 +160,7 @@
   void AddMessage(int32_t cmd_idx,
                   const char* start,
                   const char* end,
-                  int debug_fd);
+                  intptr_t debug_fd);
 
   // Notify an isolate of a pending vmservice message.
   void Notify();
@@ -232,7 +232,7 @@
                                 int32_t cmd_idx,
                                 const char* start,
                                 const char* end,
-                                int debug_fd);
+                                intptr_t debug_fd);
 
   // Notify an isolate of a pending vmservice message.
   static void NotifyIsolate(Dart_Isolate isolate);
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index a92e132..fd11844 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -2496,6 +2496,7 @@
 
 
 
+
 <polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
@@ -3404,6 +3405,42 @@
 
 
 
+<polymer-element name="script-inset" extends="observatory-element">
+  <template>
+    <style>
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+      .grayBox {
+        width: 100%;
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+     }
+    </style>
+    <div class="sourceInset">
+      <content></content>
+      <div class="grayBox">
+        <table>
+          <tbody>
+            <tr template="" repeat="{{ lineNumber in lineNumbers }}">
+              <td style="{{ styleForHits(script.lines[lineNumber].hits) }}"><span>  </span></td>
+              <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{script.lines[lineNumber].line}}</td>
+              <td>&nbsp;</td>
+              <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{script.lines[lineNumber].text}}</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+  </template>
+</polymer-element>
+
+
+
+
+
 
 <polymer-element name="script-ref" extends="service-ref">
 <template>
@@ -4078,6 +4115,11 @@
     <div class="content">
       <eval-box callback="{{ eval }}"></eval-box>
     </div>
+
+    <hr>
+    <script-inset script="{{ cls.script }}" pos="{{ cls.tokenPos }}" endpos="{{ cls.endTokenPos }}">
+    </script-inset>
+
     <br><br><br><br>
     <br><br><br><br>
   </template>
@@ -6221,42 +6263,6 @@
 
 
 
-
-
-
-<polymer-element name="script-inset" extends="observatory-element">
-  <template>
-    <style>
-      .sourceInset {
-        padding-left: 15%;
-        padding-right: 15%;
-      }
-      .grayBox {
-        width: 100%;
-        background-color: #f5f5f5;
-        border: 1px solid #ccc;
-        padding: 10px;
-     }
-    </style>
-    <div class="sourceInset">
-      <content></content>
-      <div class="grayBox">
-        <table>
-          <tbody>
-            <tr template="" repeat="{{ lineNumber in lineNumbers }}">
-              <td style="{{ styleForHits(script.lines[lineNumber].hits) }}"><span>  </span></td>
-              <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{script.lines[lineNumber].line}}</td>
-              <td>&nbsp;</td>
-              <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{script.lines[lineNumber].text}}</td>
-            </tr>
-          </tbody>
-        </table>
-      </div>
-    </div>
-  </template>
-</polymer-element>
-
-
 <polymer-element name="function-view" extends="observatory-element">
   <template>
     <style>
@@ -13847,6 +13853,12 @@
                   <div class="memberName">[{{ element['index']}}]</div>
                   <div class="memberValue">
                     <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                    <template if="{{ element['parentField'] != null }}">
+                      in <field-ref ref="{{ element['parentField'] }}"></field-ref>
+                    </template>
+                    <template if="{{ element['parentListIndex'] != null }}">
+                      at list index {{ element['parentListIndex'] }} of
+                    </template>
                   </div>
                   </div>
                 </template>
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html._data b/runtime/bin/vmservice/client/deployed/web/index.html._data
index b65a6eb..6b743d9 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html._data
+++ b/runtime/bin/vmservice/client/deployed/web/index.html._data
@@ -1 +1 @@
-{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index dbb3421..ab4e425 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -194,7 +194,7 @@
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
 bu:function(a){return H.a5(a)},
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,68],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,69],
 gbx:function(a){return new H.cu(H.b7(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
@@ -209,12 +209,12 @@
 bu:function(a){return"null"},
 giO:function(a){return 0},
 gbx:function(a){return C.GX},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,68]},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,69]},
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
 gbx:function(a){return C.lU}},
-Ai:{
+iCW:{
 "^":"Ue1;"},
 kdQ:{
 "^":"Ue1;"},
@@ -292,6 +292,9 @@
 z.fixed$length=init
 return z}},
 br:function(a){return this.tt(a,!0)},
+zH:function(a){var z=P.Ls(null,null,null,H.Kp(a,0))
+z.FV(0,a)
+return z},
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
@@ -346,7 +349,7 @@
 if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gKy",2,0,15,69],
+return y},"$1","gKy",2,0,15,70],
 WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:function(a){if(a===0&&1/a<0)return"-0.0"
@@ -440,12 +443,12 @@
 if(typeof b==="string")return a.split(b)
 else if(!!J.x(b).$isVR)return a.split(b.Ej)
 else throw H.b("String.split(Pattern) UNIMPLEMENTED")},
-wu:function(a,b,c){var z
+lV:function(a,b,c){var z
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 z=c+b.length
 if(z>a.length)return!1
 return b===a.substring(c,z)},
-nC:function(a,b){return this.wu(a,b,0)},
+nC:function(a,b){return this.lV(a,b,0)},
 Nj:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -672,7 +675,7 @@
 c.$1(z==null?"Error spawning worker for "+H.d(b):"Error spawning worker for "+H.d(b)+" ("+z+")")
 return!0},"$3","dd",6,0,null,2,3,4],
 t0:function(a){var z
-if(init.globalState.ji===!0){z=new H.NA(0,new H.cx())
+if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
 z.mR=new H.m3(null)
 return z.Zo(a)}else{z=new H.fL(new H.cx())
 z.mR=new H.m3(null)
@@ -682,11 +685,11 @@
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 PK:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 JO:{
-"^":"Tp:70;a,c",
+"^":"Tp:71;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 FU:{
@@ -694,7 +697,7 @@
 qi:function(a){var z,y,x,w
 z=$.My()==null
 y=$.rm()
-x=z&&$.ey()===!0
+x=z&&$.wB()===!0
 this.EF=x
 if(!x)y=y!=null&&$.Zt()!=null
 else y=!0
@@ -789,7 +792,7 @@
 if(this===init.globalState.Nr)throw v}}finally{this.mf=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
-if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,71,72],
+if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,72,73],
 Ds:function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.oz(z.t(a,1),z.t(a,2))
 break
@@ -869,16 +872,16 @@
 In:{
 "^":"a;"},
 kb:{
-"^":"Tp:70;a,b,c,d,e,f",
+"^":"Tp:71;a,b,c,d,e,f",
 $0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 mN:{
 "^":"Tp:13;UI",
-$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,73,"call"],
+$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,74,"call"],
 $isEH:true},
 xn:{
 "^":"Tp:5;bK",
-$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,74,"call"],
+$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,75,"call"],
 $isEH:true},
 WK:{
 "^":"Tp:13;a",
@@ -887,14 +890,14 @@
 y=this.a
 if(J.xC(z.t(a,0),"spawned")){z=y.MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,73,"call"],
+z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,74,"call"],
 $isEH:true},
 tZ:{
 "^":"Tp:5;b",
-$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,75,"call"],
+$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,76,"call"],
 $isEH:true},
 hI:{
-"^":"Tp:70;a,b,c,d,e",
+"^":"Tp:71;a,b,c,d,e",
 $0:[function(){var z=this.a
 H.Di(init.globalFunctions[this.b](),z.a,z.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -938,7 +941,7 @@
 $ispW:true,
 $isXY:true},
 Ua:{
-"^":"Tp:70;a,b,c",
+"^":"Tp:71;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gKS()){if(this.c){y=this.a
@@ -994,7 +997,7 @@
 this.vl.D1=z.ght(z)},
 $aswS:function(){return[null]},
 $iswS:true},
-NA:{
+RS:{
 "^":"jP1;Ao,mR",
 DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.oL,a.tv,J.ki(a.JE)]
 if(!!a.$isbM)return["sendport",a.ZU,a.tv,a.bv]
@@ -1079,9 +1082,9 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 RK:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,76,77,"call"],
+J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,77,78,"call"],
 $isEH:true},
 jP1:{
 "^":"BB;",
@@ -1632,7 +1635,7 @@
 Pq:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
 wzi:function(a){return H.eQ(a)},
-bm:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+Xn:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
 Gz:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.q4[z]
@@ -1756,7 +1759,7 @@
 $isyN:true},
 hY:{
 "^":"Tp:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,76,"call"],
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,77,"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1836,14 +1839,14 @@
 z[y]=x},
 $isEH:true},
 Cj:{
-"^":"Tp:79;a,b,c",
+"^":"Tp:80;a,b,c",
 $2:function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
 this.b.push(b);++z.a},
 $isEH:true},
 u8:{
-"^":"Tp:79;a,b",
+"^":"Tp:80;a,b",
 $2:function(a,b){var z=this.b
 if(z.x4(0,a))z.u(0,a,b)
 else this.a.a=!0},
@@ -1918,23 +1921,23 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Tp:70;b,c",
+"^":"Tp:71;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"Tp:70;d,e,f",
+"^":"Tp:71;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"Tp:70;UI,bK,Gq,Rm",
+"^":"Tp:71;UI,bK,Gq,Rm",
 $0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
 Qx:{
-"^":"Tp:70;w3,HZ,mG,xC,cj",
+"^":"Tp:71;w3,HZ,mG,xC,cj",
 $0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
 Tp:{
@@ -2061,7 +2064,7 @@
 $1:function(a){return this.a(a)},
 $isEH:true},
 VX:{
-"^":"Tp:80;b",
+"^":"Tp:81;b",
 $2:function(a,b){return this.b(a,b)},
 $isEH:true},
 rh:{
@@ -2082,7 +2085,7 @@
 z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
 this.Ua=z
 return z},
-ej:function(a){var z
+ik:function(a){var z
 if(typeof a!=="string")H.vh(P.u(a))
 z=this.Ej.exec(a)
 if(z==null)return
@@ -2175,7 +2178,7 @@
 F6:[function(a,b,c,d){var z=a.fi
 if(z===!0)return
 if(a.dB!=null){a.fi=this.ct(a,C.S4,z,!0)
-this.LY(a,null).YM(new X.jE(a))}},"$3","gNa",6,0,81,46,47,82],
+this.LY(a,null).YM(new X.jE(a))}},"$3","gNa",6,0,82,46,47,83],
 static:{zy:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -2195,7 +2198,7 @@
 "^":"xc+Pi;",
 $isd3:true},
 jE:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){var z=this.a
 z.fi=J.Q5(z,C.S4,z.fi,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["app","package:observatory/app.dart",,G,{
@@ -2281,10 +2284,10 @@
 z.Cy()},
 x3:function(a){J.uY(this.cC,new G.dw(a,new G.cE()))},
 kj:[function(a){this.Pv=a
-this.og("error/",null)},"$1","gbf",2,0,83,24],
+this.og("error/",null)},"$1","gbf",2,0,84,24],
 kI:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
-else this.og("error/",null)},"$1","gXa",2,0,84,85],
+else this.og("error/",null)},"$1","gXa",2,0,85,86],
 og:function(a,b){var z,y,x
 for(z=this.cE,y=0;y<z.length;++y){x=z[y]
 if(x.VU(a)){this.lJ(x)
@@ -2305,10 +2308,10 @@
 z=y
 N.QM("").YX("Failed to install pane: "+H.d(z))}this.bn.appendChild(a.gyF())
 this.GZ=a},
-mn:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,86,87],
+mn:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,87,88],
 aO:[function(a){if(!J.xC(this.Eh,a))return
 this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,86,87],
+this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,87,88],
 Ty:function(a){var z=this.m2.TY
 z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
@@ -2321,13 +2324,13 @@
 this.AQ(!0)},
 static:{"^":"mf<"}},
 cE:{
-"^":"Tp:88;",
+"^":"Tp:89;",
 $1:function(a){var z=J.RE(a)
 return J.xC(z.gfG(a),"IsolateInterrupted")||J.xC(z.gfG(a),"BreakpointReached")||J.xC(z.gfG(a),"ExceptionThrown")},
 $isEH:true},
 dw:{
 "^":"Tp:13;a,b",
-$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,89,"call"],
+$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,90,"call"],
 $isEH:true},
 Kf:{
 "^":"a;KJ",
@@ -2374,7 +2377,7 @@
 if(window.location.hash===""||window.location.hash==="#")z="#"+this.MP
 window.history.pushState(z,document.title,z)
 this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,90,14],
+y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,91,14],
 wa:function(a){return"#"+H.d(a)}},
 uG:{
 "^":"Pi;i6>,yF<",
@@ -2389,7 +2392,7 @@
 VU:function(a){return!0}},
 zv:{
 "^":"Tp:13;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,91,"call"],
+$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 OX:{
 "^":"Tp:13;",
@@ -2400,15 +2403,15 @@
 ci:function(){if(this.yF==null){var z=W.r3("class-tree",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 DV:function(a){a=J.ZZ(a,11)
-this.i6.Eh.cv(a).ml(new G.yk(this)).OA(new G.xu())},
+this.i6.Eh.cv(a).ml(new G.yk(this)).OA(new G.qH())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"o9x"}},
 yk:{
 "^":"Tp:13;a",
 $1:[function(a){var z=this.a.yF
-if(z!=null)J.uM(z,a)},"$1",null,2,0,null,92,"call"],
+if(z!=null)J.uM(z,a)},"$1",null,2,0,null,93,"call"],
 $isEH:true},
-xu:{
+qH:{
 "^":"Tp:13;",
 $1:[function(a){N.QM("").YX("ClassTreePane visit error: "+H.d(a))},"$1",null,2,0,null,1,"call"],
 $isEH:true},
@@ -2440,14 +2443,14 @@
 while(!0){w=y.gB(z)
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
-y.u(z,x,U.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,93,"call"],
+y.u(z,x,U.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 KF:{
 "^":"Tp:13;",
 $1:[function(a){},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 nD:{
-"^":"d3;Ys,jY>,TY,ro,dUC,pt",
+"^":"d3;wu,jY>,TY,ro,dUC,pt",
 NY:function(){return"ws://"+H.d(window.location.host)+"/ws"},
 TP:function(a){var z=this.MG(a)
 if(z!=null)return z
@@ -2467,21 +2470,21 @@
 z.h(0,b)
 this.XT()
 this.XT()
-y=this.Ys.IU+".history"
+y=this.wu.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
 Rz:function(a,b){var z,y
 z=this.jY
 z.Rz(0,b)
 this.XT()
 this.XT()
-y=this.Ys.IU+".history"
+y=this.wu.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
 XT:function(){var z=this.jY
 z.GT(z,new G.jQ())},
 UJ:function(){var z,y,x,w,v
 z=this.jY
 z.V1(z)
-y=G.oh(this.Ys.IU+".history")
+y=G.oh(this.wu.IU+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
@@ -2500,7 +2503,7 @@
 $1:function(a){if(J.xC(a.gw8(),this.b)&&J.xC(a.gA9(),!1))this.a.a=a},
 $isEH:true},
 jQ:{
-"^":"Tp:94;",
+"^":"Tp:95;",
 $2:function(a,b){return J.FW(b.geX(),a.geX())},
 $isEH:true},
 Y2:{
@@ -2560,8 +2563,8 @@
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.UQ(J.TP(z[a]),b)},
 PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.FW(this.eE(b,this.pT),z)},"$2","gpPX",4,0,95],
-zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gPd",4,0,95],
+return J.FW(this.eE(b,this.pT),z)},"$2","gpPX",4,0,96],
+zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gPd",4,0,96],
 Jd:function(a){var z,y
 new P.VV(1000000,null,null).wE(0)
 z=this.zz
@@ -2586,18 +2589,18 @@
 return J.ew(J.Yq(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.Yq(z[a])
-return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,15,96]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,15,97]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
 "^":"",
 Jz:[function(){var z,y,x,w,v
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.BE,new E.wa(),C.WC,new E.Or(),C.hR,new E.YL(),C.S4,new E.wf(),C.Ro,new E.Oa(),C.hN,new E.emv(),C.AV,new E.Lbd(),C.bV,new E.QAa(),C.C0,new E.CvS(),C.eZ,new E.edy(),C.bk,new E.waE(),C.lH,new E.Ore(),C.am,new E.YLa(),C.oE,new E.wfa(),C.kG,new E.Oaa(),C.OI,new E.e0(),C.I9,new E.e1(),C.To,new E.e2(),C.XA,new E.e3(),C.i4,new E.e4(),C.qt,new E.e5(),C.p1,new E.e6(),C.yJ,new E.e7(),C.la,new E.e8(),C.yL,new E.e9(),C.bJ,new E.e10(),C.ox,new E.e11(),C.Je,new E.e12(),C.Lw,new E.e13(),C.iE,new E.e14(),C.f4,new E.e15(),C.VK,new E.e16(),C.aH,new E.e17(),C.aK,new E.e18(),C.GP,new E.e19(),C.vs,new E.e20(),C.Gr,new E.e21(),C.TU,new E.e22(),C.tP,new E.e23(),C.yh,new E.e24(),C.Zb,new E.e25(),C.u7,new E.e26(),C.p8,new E.e27(),C.qR,new E.e28(),C.ld,new E.e29(),C.ne,new E.e30(),C.B0,new E.e31(),C.r1,new E.e32(),C.mr,new E.e33(),C.Ek,new E.e34(),C.Pn,new E.e35(),C.YT,new E.e36(),C.h7,new E.e37(),C.R3,new E.e38(),C.WQ,new E.e39(),C.fV,new E.e40(),C.jU,new E.e41(),C.Gd,new E.e42(),C.OO,new E.e43(),C.Mc,new E.e44(),C.FP,new E.e45(),C.kF,new E.e46(),C.UD,new E.e47(),C.Aq,new E.e48(),C.DS,new E.e49(),C.C9,new E.e50(),C.VF,new E.e51(),C.uU,new E.e52(),C.YJ,new E.e53(),C.eF,new E.e54(),C.oI,new E.e55(),C.ST,new E.e56(),C.QH,new E.e57(),C.qX,new E.e58(),C.rE,new E.e59(),C.nf,new E.e60(),C.pO,new E.e61(),C.EI,new E.e62(),C.JB,new E.e63(),C.RY,new E.e64(),C.d4,new E.e65(),C.cF,new E.e66(),C.Ql,new E.e67(),C.SI,new E.e68(),C.zS,new E.e69(),C.YA,new E.e70(),C.ak,new E.e71(),C.Ge,new E.e72(),C.He,new E.e73(),C.im,new E.e74(),C.Ss,new E.e75(),C.k6,new E.e76(),C.oj,new E.e77(),C.PJ,new E.e78(),C.q2,new E.e79(),C.d2,new E.e80(),C.kN,new E.e81(),C.fn,new E.e82(),C.yB,new E.e83(),C.eJ,new E.e84(),C.iG,new E.e85(),C.Py,new E.e86(),C.pC,new E.e87(),C.uu,new E.e88(),C.qs,new E.e89(),C.XH,new E.e90(),C.tJ,new E.e91(),C.F8,new E.e92(),C.C1,new E.e93(),C.nL,new E.e94(),C.a0,new E.e95(),C.Yg,new E.e96(),C.bR,new E.e97(),C.ai,new E.e98(),C.ob,new E.e99(),C.Iv,new E.e100(),C.Wg,new E.e101(),C.tD,new E.e102(),C.nZ,new E.e103(),C.Of,new E.e104(),C.pY,new E.e105(),C.XL,new E.e106(),C.LA,new E.e107(),C.Lk,new E.e108(),C.dK,new E.e109(),C.xf,new E.e110(),C.rB,new E.e111(),C.bz,new E.e112(),C.Jx,new E.e113(),C.b5,new E.e114(),C.Lc,new E.e115(),C.hf,new E.e116(),C.uk,new E.e117(),C.Zi,new E.e118(),C.TN,new E.e119(),C.kA,new E.e120(),C.GI,new E.e121(),C.Wn,new E.e122(),C.ur,new E.e123(),C.VN,new E.e124(),C.EV,new E.e125(),C.VI,new E.e126(),C.eh,new E.e127(),C.r6,new E.e128(),C.MW,new E.e129(),C.SA,new E.e130(),C.kV,new E.e131(),C.vp,new E.e132(),C.cc,new E.e133(),C.DY,new E.e134(),C.Lx,new E.e135(),C.M3,new E.e136(),C.wT,new E.e137(),C.SR,new E.e138(),C.t6,new E.e139(),C.rP,new E.e140(),C.pX,new E.e141(),C.VD,new E.e142(),C.NN,new E.e143(),C.UX,new E.e144(),C.YS,new E.e145(),C.pu,new E.e146(),C.BJ,new E.e147(),C.c6,new E.e148(),C.td,new E.e149(),C.Gn,new E.e150(),C.zO,new E.e151(),C.vg,new E.e152(),C.Ys,new E.e153(),C.zm,new E.e154(),C.XM,new E.e155(),C.Ic,new E.e156(),C.yG,new E.e157(),C.uI,new E.e158(),C.O9,new E.e159(),C.ba,new E.e160(),C.tW,new E.e161(),C.CG,new E.e162(),C.Wj,new E.e163(),C.vb,new E.e164(),C.UL,new E.e165(),C.AY,new E.e166(),C.QK,new E.e167(),C.AO,new E.e168(),C.Xd,new E.e169(),C.I7,new E.e170(),C.xP,new E.e171(),C.Wm,new E.e172(),C.GR,new E.e173(),C.KX,new E.e174(),C.ja,new E.e175(),C.Dj,new E.e176(),C.ir,new E.e177(),C.dx,new E.e178(),C.ni,new E.e179(),C.X2,new E.e180(),C.F3,new E.e181(),C.UY,new E.e182(),C.Aa,new E.e183(),C.nY,new E.e184(),C.tg,new E.e185(),C.HD,new E.e186(),C.iU,new E.e187(),C.eN,new E.e188(),C.ue,new E.e189(),C.nh,new E.e190(),C.L2,new E.e191(),C.Gs,new E.e192(),C.bE,new E.e193(),C.YD,new E.e194(),C.PX,new E.e195(),C.N8,new E.e196(),C.EA,new E.e197(),C.oW,new E.e198(),C.hd,new E.e199(),C.pH,new E.e200(),C.Ve,new E.e201(),C.jM,new E.e202(),C.W5,new E.e203(),C.uX,new E.e204(),C.nt,new E.e205(),C.PM,new E.e206(),C.xA,new E.e207(),C.k5,new E.e208(),C.Nv,new E.e209(),C.Cw,new E.e210(),C.TW,new E.e211(),C.xS,new E.e212(),C.ft,new E.e213(),C.QF,new E.e214(),C.mi,new E.e215(),C.zz,new E.e216(),C.hO,new E.e217(),C.ei,new E.e218(),C.HK,new E.e219(),C.je,new E.e220(),C.Ef,new E.e221(),C.RH,new E.e222(),C.Q1,new E.e223(),C.ID,new E.e224(),C.z6,new E.e225(),C.bc,new E.e226(),C.kw,new E.e227(),C.ep,new E.e228(),C.J2,new E.e229(),C.zU,new E.e230(),C.bn,new E.e231(),C.mh,new E.e232(),C.Fh,new E.e233(),C.LP,new E.e234(),C.jh,new E.e235(),C.fj,new E.e236(),C.xw,new E.e237(),C.zn,new E.e238(),C.RJ,new E.e239(),C.Tc,new E.e240(),C.YE,new E.e241(),C.Uy,new E.e242()],null,null)
-y=P.EF([C.aP,new E.e243(),C.cg,new E.e244(),C.S4,new E.e245(),C.AV,new E.e246(),C.bk,new E.e247(),C.lH,new E.e248(),C.am,new E.e249(),C.oE,new E.e250(),C.kG,new E.e251(),C.XA,new E.e252(),C.i4,new E.e253(),C.yL,new E.e254(),C.bJ,new E.e255(),C.VK,new E.e256(),C.aH,new E.e257(),C.vs,new E.e258(),C.Gr,new E.e259(),C.tP,new E.e260(),C.yh,new E.e261(),C.Zb,new E.e262(),C.p8,new E.e263(),C.ld,new E.e264(),C.ne,new E.e265(),C.B0,new E.e266(),C.mr,new E.e267(),C.YT,new E.e268(),C.WQ,new E.e269(),C.jU,new E.e270(),C.Gd,new E.e271(),C.OO,new E.e272(),C.Mc,new E.e273(),C.QH,new E.e274(),C.rE,new E.e275(),C.nf,new E.e276(),C.Ql,new E.e277(),C.ak,new E.e278(),C.Ge,new E.e279(),C.He,new E.e280(),C.oj,new E.e281(),C.d2,new E.e282(),C.fn,new E.e283(),C.yB,new E.e284(),C.Py,new E.e285(),C.uu,new E.e286(),C.qs,new E.e287(),C.a0,new E.e288(),C.rB,new E.e289(),C.Lc,new E.e290(),C.hf,new E.e291(),C.uk,new E.e292(),C.Zi,new E.e293(),C.TN,new E.e294(),C.kA,new E.e295(),C.ur,new E.e296(),C.EV,new E.e297(),C.eh,new E.e298(),C.SA,new E.e299(),C.kV,new E.e300(),C.vp,new E.e301(),C.SR,new E.e302(),C.t6,new E.e303(),C.UX,new E.e304(),C.YS,new E.e305(),C.c6,new E.e306(),C.td,new E.e307(),C.zO,new E.e308(),C.Ys,new E.e309(),C.XM,new E.e310(),C.Ic,new E.e311(),C.O9,new E.e312(),C.tW,new E.e313(),C.Wj,new E.e314(),C.vb,new E.e315(),C.QK,new E.e316(),C.AO,new E.e317(),C.Xd,new E.e318(),C.xP,new E.e319(),C.GR,new E.e320(),C.KX,new E.e321(),C.ja,new E.e322(),C.Dj,new E.e323(),C.X2,new E.e324(),C.UY,new E.e325(),C.Aa,new E.e326(),C.nY,new E.e327(),C.tg,new E.e328(),C.HD,new E.e329(),C.iU,new E.e330(),C.eN,new E.e331(),C.Gs,new E.e332(),C.bE,new E.e333(),C.YD,new E.e334(),C.PX,new E.e335(),C.pH,new E.e336(),C.Ve,new E.e337(),C.jM,new E.e338(),C.uX,new E.e339(),C.nt,new E.e340(),C.PM,new E.e341(),C.Nv,new E.e342(),C.Cw,new E.e343(),C.TW,new E.e344(),C.ft,new E.e345(),C.mi,new E.e346(),C.zz,new E.e347(),C.z6,new E.e348(),C.kw,new E.e349(),C.zU,new E.e350(),C.RJ,new E.e351(),C.YE,new E.e352()],null,null)
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.BE,new E.wa(),C.WC,new E.Or(),C.hR,new E.YL(),C.S4,new E.wf(),C.Ro,new E.Oa(),C.hN,new E.emv(),C.AV,new E.Lbd(),C.bV,new E.QAa(),C.C0,new E.CvS(),C.eZ,new E.edy(),C.bk,new E.waE(),C.lH,new E.Ore(),C.am,new E.YLa(),C.oE,new E.wfa(),C.kG,new E.Oaa(),C.OI,new E.e0(),C.I9,new E.e1(),C.To,new E.e2(),C.XA,new E.e3(),C.i4,new E.e4(),C.qt,new E.e5(),C.p1,new E.e6(),C.yJ,new E.e7(),C.la,new E.e8(),C.yL,new E.e9(),C.bJ,new E.e10(),C.ox,new E.e11(),C.Je,new E.e12(),C.Lw,new E.e13(),C.iE,new E.e14(),C.f4,new E.e15(),C.VK,new E.e16(),C.aH,new E.e17(),C.aK,new E.e18(),C.GP,new E.e19(),C.vs,new E.e20(),C.Gr,new E.e21(),C.TU,new E.e22(),C.Fe,new E.e23(),C.tP,new E.e24(),C.yh,new E.e25(),C.Zb,new E.e26(),C.u7,new E.e27(),C.p8,new E.e28(),C.qR,new E.e29(),C.ld,new E.e30(),C.ne,new E.e31(),C.B0,new E.e32(),C.r1,new E.e33(),C.mr,new E.e34(),C.Ek,new E.e35(),C.Pn,new E.e36(),C.YT,new E.e37(),C.h7,new E.e38(),C.R3,new E.e39(),C.WQ,new E.e40(),C.fV,new E.e41(),C.jU,new E.e42(),C.Gd,new E.e43(),C.OO,new E.e44(),C.Mc,new E.e45(),C.FP,new E.e46(),C.kF,new E.e47(),C.UD,new E.e48(),C.Aq,new E.e49(),C.DS,new E.e50(),C.C9,new E.e51(),C.VF,new E.e52(),C.uU,new E.e53(),C.YJ,new E.e54(),C.eF,new E.e55(),C.oI,new E.e56(),C.ST,new E.e57(),C.QH,new E.e58(),C.qX,new E.e59(),C.rE,new E.e60(),C.nf,new E.e61(),C.pO,new E.e62(),C.EI,new E.e63(),C.JB,new E.e64(),C.RY,new E.e65(),C.d4,new E.e66(),C.cF,new E.e67(),C.Ql,new E.e68(),C.SI,new E.e69(),C.zS,new E.e70(),C.YA,new E.e71(),C.ak,new E.e72(),C.Ge,new E.e73(),C.He,new E.e74(),C.im,new E.e75(),C.Ss,new E.e76(),C.k6,new E.e77(),C.oj,new E.e78(),C.PJ,new E.e79(),C.q2,new E.e80(),C.d2,new E.e81(),C.kN,new E.e82(),C.fn,new E.e83(),C.yB,new E.e84(),C.eJ,new E.e85(),C.iG,new E.e86(),C.Py,new E.e87(),C.pC,new E.e88(),C.uu,new E.e89(),C.qs,new E.e90(),C.XH,new E.e91(),C.tJ,new E.e92(),C.F8,new E.e93(),C.C1,new E.e94(),C.nL,new E.e95(),C.a0,new E.e96(),C.Yg,new E.e97(),C.bR,new E.e98(),C.ai,new E.e99(),C.ob,new E.e100(),C.Iv,new E.e101(),C.Wg,new E.e102(),C.tD,new E.e103(),C.nZ,new E.e104(),C.Of,new E.e105(),C.pY,new E.e106(),C.XL,new E.e107(),C.LA,new E.e108(),C.Lk,new E.e109(),C.dK,new E.e110(),C.xf,new E.e111(),C.rB,new E.e112(),C.bz,new E.e113(),C.Jx,new E.e114(),C.b5,new E.e115(),C.Lc,new E.e116(),C.hf,new E.e117(),C.uk,new E.e118(),C.Zi,new E.e119(),C.TN,new E.e120(),C.kA,new E.e121(),C.GI,new E.e122(),C.Wn,new E.e123(),C.ur,new E.e124(),C.VN,new E.e125(),C.EV,new E.e126(),C.VI,new E.e127(),C.eh,new E.e128(),C.r6,new E.e129(),C.MW,new E.e130(),C.SA,new E.e131(),C.kV,new E.e132(),C.vp,new E.e133(),C.cc,new E.e134(),C.DY,new E.e135(),C.Lx,new E.e136(),C.M3,new E.e137(),C.wT,new E.e138(),C.SR,new E.e139(),C.t6,new E.e140(),C.rP,new E.e141(),C.pX,new E.e142(),C.VD,new E.e143(),C.NN,new E.e144(),C.UX,new E.e145(),C.YS,new E.e146(),C.pu,new E.e147(),C.BJ,new E.e148(),C.c6,new E.e149(),C.td,new E.e150(),C.Gn,new E.e151(),C.zO,new E.e152(),C.vg,new E.e153(),C.Ys,new E.e154(),C.zm,new E.e155(),C.XM,new E.e156(),C.Ic,new E.e157(),C.yG,new E.e158(),C.uI,new E.e159(),C.O9,new E.e160(),C.ba,new E.e161(),C.tW,new E.e162(),C.CG,new E.e163(),C.Wj,new E.e164(),C.vb,new E.e165(),C.UL,new E.e166(),C.AY,new E.e167(),C.QK,new E.e168(),C.AO,new E.e169(),C.Xd,new E.e170(),C.I7,new E.e171(),C.xP,new E.e172(),C.Wm,new E.e173(),C.GR,new E.e174(),C.KX,new E.e175(),C.ja,new E.e176(),C.Dj,new E.e177(),C.ir,new E.e178(),C.dx,new E.e179(),C.ni,new E.e180(),C.X2,new E.e181(),C.F3,new E.e182(),C.UY,new E.e183(),C.Aa,new E.e184(),C.nY,new E.e185(),C.tg,new E.e186(),C.HD,new E.e187(),C.iU,new E.e188(),C.eN,new E.e189(),C.ue,new E.e190(),C.nh,new E.e191(),C.L2,new E.e192(),C.Gs,new E.e193(),C.bE,new E.e194(),C.YD,new E.e195(),C.PX,new E.e196(),C.N8,new E.e197(),C.EA,new E.e198(),C.oW,new E.e199(),C.hd,new E.e200(),C.pH,new E.e201(),C.Ve,new E.e202(),C.jM,new E.e203(),C.W5,new E.e204(),C.uX,new E.e205(),C.nt,new E.e206(),C.PM,new E.e207(),C.xA,new E.e208(),C.k5,new E.e209(),C.Nv,new E.e210(),C.Cw,new E.e211(),C.TW,new E.e212(),C.xS,new E.e213(),C.ft,new E.e214(),C.QF,new E.e215(),C.mi,new E.e216(),C.zz,new E.e217(),C.hO,new E.e218(),C.ei,new E.e219(),C.HK,new E.e220(),C.je,new E.e221(),C.Ef,new E.e222(),C.RH,new E.e223(),C.Q1,new E.e224(),C.ID,new E.e225(),C.z6,new E.e226(),C.bc,new E.e227(),C.kw,new E.e228(),C.ep,new E.e229(),C.J2,new E.e230(),C.zU,new E.e231(),C.bn,new E.e232(),C.mh,new E.e233(),C.Fh,new E.e234(),C.LP,new E.e235(),C.jh,new E.e236(),C.fj,new E.e237(),C.xw,new E.e238(),C.zn,new E.e239(),C.RJ,new E.e240(),C.Tc,new E.e241(),C.YE,new E.e242(),C.Uy,new E.e243()],null,null)
+y=P.EF([C.aP,new E.e244(),C.cg,new E.e245(),C.S4,new E.e246(),C.AV,new E.e247(),C.bk,new E.e248(),C.lH,new E.e249(),C.am,new E.e250(),C.oE,new E.e251(),C.kG,new E.e252(),C.XA,new E.e253(),C.i4,new E.e254(),C.yL,new E.e255(),C.bJ,new E.e256(),C.VK,new E.e257(),C.aH,new E.e258(),C.vs,new E.e259(),C.Gr,new E.e260(),C.Fe,new E.e261(),C.tP,new E.e262(),C.yh,new E.e263(),C.Zb,new E.e264(),C.p8,new E.e265(),C.ld,new E.e266(),C.ne,new E.e267(),C.B0,new E.e268(),C.mr,new E.e269(),C.YT,new E.e270(),C.WQ,new E.e271(),C.jU,new E.e272(),C.Gd,new E.e273(),C.OO,new E.e274(),C.Mc,new E.e275(),C.QH,new E.e276(),C.rE,new E.e277(),C.nf,new E.e278(),C.Ql,new E.e279(),C.ak,new E.e280(),C.Ge,new E.e281(),C.He,new E.e282(),C.oj,new E.e283(),C.d2,new E.e284(),C.fn,new E.e285(),C.yB,new E.e286(),C.Py,new E.e287(),C.uu,new E.e288(),C.qs,new E.e289(),C.a0,new E.e290(),C.rB,new E.e291(),C.Lc,new E.e292(),C.hf,new E.e293(),C.uk,new E.e294(),C.Zi,new E.e295(),C.TN,new E.e296(),C.kA,new E.e297(),C.ur,new E.e298(),C.EV,new E.e299(),C.eh,new E.e300(),C.SA,new E.e301(),C.kV,new E.e302(),C.vp,new E.e303(),C.SR,new E.e304(),C.t6,new E.e305(),C.UX,new E.e306(),C.YS,new E.e307(),C.c6,new E.e308(),C.td,new E.e309(),C.zO,new E.e310(),C.Ys,new E.e311(),C.XM,new E.e312(),C.Ic,new E.e313(),C.O9,new E.e314(),C.tW,new E.e315(),C.Wj,new E.e316(),C.vb,new E.e317(),C.QK,new E.e318(),C.AO,new E.e319(),C.Xd,new E.e320(),C.xP,new E.e321(),C.GR,new E.e322(),C.KX,new E.e323(),C.ja,new E.e324(),C.Dj,new E.e325(),C.X2,new E.e326(),C.UY,new E.e327(),C.Aa,new E.e328(),C.nY,new E.e329(),C.tg,new E.e330(),C.HD,new E.e331(),C.iU,new E.e332(),C.eN,new E.e333(),C.Gs,new E.e334(),C.bE,new E.e335(),C.YD,new E.e336(),C.PX,new E.e337(),C.pH,new E.e338(),C.Ve,new E.e339(),C.jM,new E.e340(),C.uX,new E.e341(),C.nt,new E.e342(),C.PM,new E.e343(),C.Nv,new E.e344(),C.Cw,new E.e345(),C.TW,new E.e346(),C.ft,new E.e347(),C.mi,new E.e348(),C.zz,new E.e349(),C.z6,new E.e350(),C.kw,new E.e351(),C.zU,new E.e352(),C.RJ,new E.e353(),C.YE,new E.e354()],null,null)
 x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.BL,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Zj,C.Mt,C.Ep,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.qJ,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
 w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,C.CM,C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.xE,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.BL,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.Yo,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.V3,C.pO,C.au,C.Lc,C.Pc,C.AO,C.fi],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,C.CM,C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.nX,C.CM,C.Zj,P.EF([C.oj,C.GT],null,null),C.Ep,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.bw],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,C.CM,C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.ON,P.EF([C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.SA,C.KI,C.tW,C.kH,C.CG,C.Ml,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.xP,C.TO,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.Zk,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.u3],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null)
-v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.Lw,"deleteVm",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",C.jU,"file",C.Gd,"firstTokenPos",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.ak,"hasParent",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.kA,"lastTokenPos",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.r6,"lineNumber",C.MW,"lineNumbers",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.PM,"status",C.xA,"styleForHits",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.RH,"toStringAsFixed",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
+v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.Lw,"deleteVm",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",C.jU,"file",C.Gd,"firstTokenPos",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.ak,"hasParent",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.kA,"lastTokenPos",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.r6,"lineNumber",C.MW,"lineNumbers",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.PM,"status",C.xA,"styleForHits",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.RH,"toStringAsFixed",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
 $.j8=new O.fH(z,y,C.CM)
 $.Yv=new O.bY(x,w,!1)
 $.qe=v
-$.M6=[new E.e353(),new E.e354(),new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430()]
+$.M6=[new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432()]
 $.UG=!0
 F.E2()},"$0","V7",0,0,18],
 em:{
@@ -2774,1634 +2777,1642 @@
 $isEH:true},
 e23:{
 "^":"Tp:13;",
-$1:function(a){return a.gw2()},
+$1:function(a){return a.gej()},
 $isEH:true},
 e24:{
 "^":"Tp:13;",
-$1:function(a){return J.w8(a)},
+$1:function(a){return a.gw2()},
 $isEH:true},
 e25:{
 "^":"Tp:13;",
-$1:function(a){return J.is(a)},
+$1:function(a){return J.w8(a)},
 $isEH:true},
 e26:{
 "^":"Tp:13;",
-$1:function(a){return J.nE(a)},
+$1:function(a){return J.is(a)},
 $isEH:true},
 e27:{
 "^":"Tp:13;",
-$1:function(a){return J.a3(a)},
+$1:function(a){return J.nE(a)},
 $isEH:true},
 e28:{
 "^":"Tp:13;",
-$1:function(a){return J.Ts(a)},
+$1:function(a){return J.a3(a)},
 $isEH:true},
 e29:{
 "^":"Tp:13;",
-$1:function(a){return J.Ky(a)},
+$1:function(a){return J.Ts(a)},
 $isEH:true},
 e30:{
 "^":"Tp:13;",
-$1:function(a){return J.Vl(a)},
+$1:function(a){return J.Ky(a)},
 $isEH:true},
 e31:{
 "^":"Tp:13;",
-$1:function(a){return J.kE(a)},
+$1:function(a){return J.Vl(a)},
 $isEH:true},
 e32:{
 "^":"Tp:13;",
-$1:function(a){return J.Gl(a)},
+$1:function(a){return J.kE(a)},
 $isEH:true},
 e33:{
 "^":"Tp:13;",
-$1:function(a){return J.Mz(a)},
+$1:function(a){return J.Gl(a)},
 $isEH:true},
 e34:{
 "^":"Tp:13;",
-$1:function(a){return J.nb(a)},
+$1:function(a){return J.Mz(a)},
 $isEH:true},
 e35:{
 "^":"Tp:13;",
-$1:function(a){return a.gty()},
+$1:function(a){return J.nb(a)},
 $isEH:true},
 e36:{
 "^":"Tp:13;",
-$1:function(a){return J.yn(a)},
+$1:function(a){return a.gty()},
 $isEH:true},
 e37:{
 "^":"Tp:13;",
-$1:function(a){return a.gMX()},
+$1:function(a){return J.yn(a)},
 $isEH:true},
 e38:{
 "^":"Tp:13;",
-$1:function(a){return a.gkE()},
+$1:function(a){return a.gMX()},
 $isEH:true},
 e39:{
 "^":"Tp:13;",
-$1:function(a){return J.pm(a)},
+$1:function(a){return a.gkE()},
 $isEH:true},
 e40:{
 "^":"Tp:13;",
-$1:function(a){return a.gtJ()},
+$1:function(a){return J.pm(a)},
 $isEH:true},
 e41:{
 "^":"Tp:13;",
-$1:function(a){return J.Ec(a)},
+$1:function(a){return a.gtJ()},
 $isEH:true},
 e42:{
 "^":"Tp:13;",
-$1:function(a){return a.ghY()},
+$1:function(a){return J.Ec(a)},
 $isEH:true},
 e43:{
 "^":"Tp:13;",
-$1:function(a){return J.ra(a)},
+$1:function(a){return a.ghY()},
 $isEH:true},
 e44:{
 "^":"Tp:13;",
-$1:function(a){return J.YH(a)},
+$1:function(a){return J.ra(a)},
 $isEH:true},
 e45:{
 "^":"Tp:13;",
-$1:function(a){return J.WX(a)},
+$1:function(a){return J.YH(a)},
 $isEH:true},
 e46:{
 "^":"Tp:13;",
-$1:function(a){return J.IP(a)},
+$1:function(a){return J.WX(a)},
 $isEH:true},
 e47:{
 "^":"Tp:13;",
-$1:function(a){return a.gZd()},
+$1:function(a){return J.IP(a)},
 $isEH:true},
 e48:{
 "^":"Tp:13;",
-$1:function(a){return J.TM(a)},
+$1:function(a){return a.gZd()},
 $isEH:true},
 e49:{
 "^":"Tp:13;",
-$1:function(a){return J.xo(a)},
+$1:function(a){return J.TM(a)},
 $isEH:true},
 e50:{
 "^":"Tp:13;",
-$1:function(a){return a.gkA()},
+$1:function(a){return J.xo(a)},
 $isEH:true},
 e51:{
 "^":"Tp:13;",
-$1:function(a){return a.gGK()},
+$1:function(a){return a.gkA()},
 $isEH:true},
 e52:{
 "^":"Tp:13;",
-$1:function(a){return a.gan()},
+$1:function(a){return a.gGK()},
 $isEH:true},
 e53:{
 "^":"Tp:13;",
-$1:function(a){return a.gcQ()},
+$1:function(a){return a.gan()},
 $isEH:true},
 e54:{
 "^":"Tp:13;",
-$1:function(a){return a.gS7()},
+$1:function(a){return a.gcQ()},
 $isEH:true},
 e55:{
 "^":"Tp:13;",
-$1:function(a){return a.gJz()},
+$1:function(a){return a.gS7()},
 $isEH:true},
 e56:{
 "^":"Tp:13;",
-$1:function(a){return J.PY(a)},
+$1:function(a){return a.gJz()},
 $isEH:true},
 e57:{
 "^":"Tp:13;",
-$1:function(a){return J.bu(a)},
+$1:function(a){return J.PY(a)},
 $isEH:true},
 e58:{
 "^":"Tp:13;",
-$1:function(a){return J.VL(a)},
+$1:function(a){return J.bu(a)},
 $isEH:true},
 e59:{
 "^":"Tp:13;",
-$1:function(a){return J.zN(a)},
+$1:function(a){return J.VL(a)},
 $isEH:true},
 e60:{
 "^":"Tp:13;",
-$1:function(a){return J.m4(a)},
+$1:function(a){return J.zN(a)},
 $isEH:true},
 e61:{
 "^":"Tp:13;",
-$1:function(a){return J.v8(a)},
+$1:function(a){return J.m4(a)},
 $isEH:true},
 e62:{
 "^":"Tp:13;",
-$1:function(a){return a.gmu()},
+$1:function(a){return J.v8(a)},
 $isEH:true},
 e63:{
 "^":"Tp:13;",
-$1:function(a){return a.gCO()},
+$1:function(a){return a.gmu()},
 $isEH:true},
 e64:{
 "^":"Tp:13;",
-$1:function(a){return J.MB(a)},
+$1:function(a){return a.gCO()},
 $isEH:true},
 e65:{
 "^":"Tp:13;",
-$1:function(a){return J.eU(a)},
+$1:function(a){return J.MB(a)},
 $isEH:true},
 e66:{
 "^":"Tp:13;",
-$1:function(a){return J.DB(a)},
+$1:function(a){return J.eU(a)},
 $isEH:true},
 e67:{
 "^":"Tp:13;",
-$1:function(a){return J.wO(a)},
+$1:function(a){return J.DB(a)},
 $isEH:true},
 e68:{
 "^":"Tp:13;",
-$1:function(a){return a.gGf()},
+$1:function(a){return J.wO(a)},
 $isEH:true},
 e69:{
 "^":"Tp:13;",
-$1:function(a){return a.gvS()},
+$1:function(a){return a.gGf()},
 $isEH:true},
 e70:{
 "^":"Tp:13;",
-$1:function(a){return a.gJL()},
+$1:function(a){return a.gvS()},
 $isEH:true},
 e71:{
 "^":"Tp:13;",
-$1:function(a){return J.u1(a)},
+$1:function(a){return a.gJL()},
 $isEH:true},
 e72:{
 "^":"Tp:13;",
-$1:function(a){return J.z3(a)},
+$1:function(a){return J.u1(a)},
 $isEH:true},
 e73:{
 "^":"Tp:13;",
-$1:function(a){return J.YQ(a)},
+$1:function(a){return J.z3(a)},
 $isEH:true},
 e74:{
 "^":"Tp:13;",
-$1:function(a){return J.tC(a)},
+$1:function(a){return J.YQ(a)},
 $isEH:true},
 e75:{
 "^":"Tp:13;",
-$1:function(a){return a.gu9()},
+$1:function(a){return J.tC(a)},
 $isEH:true},
 e76:{
 "^":"Tp:13;",
-$1:function(a){return J.fA(a)},
+$1:function(a){return a.gu9()},
 $isEH:true},
 e77:{
 "^":"Tp:13;",
-$1:function(a){return J.aB(a)},
+$1:function(a){return J.fA(a)},
 $isEH:true},
 e78:{
 "^":"Tp:13;",
-$1:function(a){return a.gL4()},
+$1:function(a){return J.aB(a)},
 $isEH:true},
 e79:{
 "^":"Tp:13;",
-$1:function(a){return a.gaj()},
+$1:function(a){return a.gL4()},
 $isEH:true},
 e80:{
 "^":"Tp:13;",
-$1:function(a){return a.giq()},
+$1:function(a){return a.gaj()},
 $isEH:true},
 e81:{
 "^":"Tp:13;",
-$1:function(a){return a.gBm()},
+$1:function(a){return a.giq()},
 $isEH:true},
 e82:{
 "^":"Tp:13;",
-$1:function(a){return J.xR(a)},
+$1:function(a){return a.gBm()},
 $isEH:true},
 e83:{
 "^":"Tp:13;",
-$1:function(a){return J.US(a)},
+$1:function(a){return J.xR(a)},
 $isEH:true},
 e84:{
 "^":"Tp:13;",
-$1:function(a){return a.gNI()},
+$1:function(a){return J.US(a)},
 $isEH:true},
 e85:{
 "^":"Tp:13;",
-$1:function(a){return a.gva()},
+$1:function(a){return a.gNI()},
 $isEH:true},
 e86:{
 "^":"Tp:13;",
-$1:function(a){return a.gKt()},
+$1:function(a){return a.gva()},
 $isEH:true},
 e87:{
 "^":"Tp:13;",
-$1:function(a){return a.gp2()},
+$1:function(a){return a.gKt()},
 $isEH:true},
 e88:{
 "^":"Tp:13;",
-$1:function(a){return J.UU(a)},
+$1:function(a){return a.gp2()},
 $isEH:true},
 e89:{
 "^":"Tp:13;",
-$1:function(a){return J.Ew(a)},
+$1:function(a){return J.UU(a)},
 $isEH:true},
 e90:{
 "^":"Tp:13;",
-$1:function(a){return a.gVM()},
+$1:function(a){return J.Ew(a)},
 $isEH:true},
 e91:{
 "^":"Tp:13;",
-$1:function(a){return J.Xi(a)},
+$1:function(a){return a.gVM()},
 $isEH:true},
 e92:{
 "^":"Tp:13;",
-$1:function(a){return J.bL(a)},
+$1:function(a){return J.Xi(a)},
 $isEH:true},
 e93:{
 "^":"Tp:13;",
-$1:function(a){return a.gUB()},
+$1:function(a){return J.bL(a)},
 $isEH:true},
 e94:{
 "^":"Tp:13;",
-$1:function(a){return J.ix(a)},
+$1:function(a){return a.gUB()},
 $isEH:true},
 e95:{
 "^":"Tp:13;",
-$1:function(a){return J.pd(a)},
+$1:function(a){return J.ix(a)},
 $isEH:true},
 e96:{
 "^":"Tp:13;",
-$1:function(a){return a.gqy()},
+$1:function(a){return J.pd(a)},
 $isEH:true},
 e97:{
 "^":"Tp:13;",
-$1:function(a){return J.GU(a)},
+$1:function(a){return a.gqy()},
 $isEH:true},
 e98:{
 "^":"Tp:13;",
-$1:function(a){return J.FN(a)},
+$1:function(a){return J.GU(a)},
 $isEH:true},
 e99:{
 "^":"Tp:13;",
-$1:function(a){return J.Wk(a)},
+$1:function(a){return J.FN(a)},
 $isEH:true},
 e100:{
 "^":"Tp:13;",
-$1:function(a){return J.eT(a)},
+$1:function(a){return J.Wk(a)},
 $isEH:true},
 e101:{
 "^":"Tp:13;",
-$1:function(a){return J.C8(a)},
+$1:function(a){return J.eT(a)},
 $isEH:true},
 e102:{
 "^":"Tp:13;",
-$1:function(a){return J.tf(a)},
+$1:function(a){return J.C8(a)},
 $isEH:true},
 e103:{
 "^":"Tp:13;",
-$1:function(a){return J.yx(a)},
+$1:function(a){return J.tf(a)},
 $isEH:true},
 e104:{
 "^":"Tp:13;",
-$1:function(a){return J.cU(a)},
+$1:function(a){return J.yx(a)},
 $isEH:true},
 e105:{
 "^":"Tp:13;",
-$1:function(a){return a.gYG()},
+$1:function(a){return J.cU(a)},
 $isEH:true},
 e106:{
 "^":"Tp:13;",
-$1:function(a){return a.gi2()},
+$1:function(a){return a.gYG()},
 $isEH:true},
 e107:{
 "^":"Tp:13;",
-$1:function(a){return a.gHY()},
+$1:function(a){return a.gi2()},
 $isEH:true},
 e108:{
 "^":"Tp:13;",
-$1:function(a){return J.j0(a)},
+$1:function(a){return a.gHY()},
 $isEH:true},
 e109:{
 "^":"Tp:13;",
-$1:function(a){return J.ZN(a)},
+$1:function(a){return J.j0(a)},
 $isEH:true},
 e110:{
 "^":"Tp:13;",
-$1:function(a){return J.xa(a)},
+$1:function(a){return J.ZN(a)},
 $isEH:true},
 e111:{
 "^":"Tp:13;",
-$1:function(a){return J.aT(a)},
+$1:function(a){return J.xa(a)},
 $isEH:true},
 e112:{
 "^":"Tp:13;",
-$1:function(a){return J.KG(a)},
+$1:function(a){return J.aT(a)},
 $isEH:true},
 e113:{
 "^":"Tp:13;",
-$1:function(a){return a.giR()},
+$1:function(a){return J.KG(a)},
 $isEH:true},
 e114:{
 "^":"Tp:13;",
-$1:function(a){return a.gEB()},
+$1:function(a){return a.giR()},
 $isEH:true},
 e115:{
 "^":"Tp:13;",
-$1:function(a){return J.Iz(a)},
+$1:function(a){return a.gEB()},
 $isEH:true},
 e116:{
 "^":"Tp:13;",
-$1:function(a){return J.Yq(a)},
+$1:function(a){return J.Iz(a)},
 $isEH:true},
 e117:{
 "^":"Tp:13;",
-$1:function(a){return J.MQ(a)},
+$1:function(a){return J.Yq(a)},
 $isEH:true},
 e118:{
 "^":"Tp:13;",
-$1:function(a){return J.X7(a)},
+$1:function(a){return J.MQ(a)},
 $isEH:true},
 e119:{
 "^":"Tp:13;",
-$1:function(a){return J.IR(a)},
+$1:function(a){return J.X7(a)},
 $isEH:true},
 e120:{
 "^":"Tp:13;",
-$1:function(a){return a.gSK()},
+$1:function(a){return J.IR(a)},
 $isEH:true},
 e121:{
 "^":"Tp:13;",
-$1:function(a){return a.gPE()},
+$1:function(a){return a.gSK()},
 $isEH:true},
 e122:{
 "^":"Tp:13;",
-$1:function(a){return J.q8(a)},
+$1:function(a){return a.gPE()},
 $isEH:true},
 e123:{
 "^":"Tp:13;",
-$1:function(a){return a.ghX()},
+$1:function(a){return J.q8(a)},
 $isEH:true},
 e124:{
 "^":"Tp:13;",
-$1:function(a){return a.gvU()},
+$1:function(a){return a.ghX()},
 $isEH:true},
 e125:{
 "^":"Tp:13;",
-$1:function(a){return J.jl(a)},
+$1:function(a){return a.gvU()},
 $isEH:true},
 e126:{
 "^":"Tp:13;",
-$1:function(a){return a.gRd()},
+$1:function(a){return J.jl(a)},
 $isEH:true},
 e127:{
 "^":"Tp:13;",
-$1:function(a){return J.zY(a)},
+$1:function(a){return a.gRd()},
 $isEH:true},
 e128:{
 "^":"Tp:13;",
-$1:function(a){return J.k7(a)},
+$1:function(a){return J.zY(a)},
 $isEH:true},
 e129:{
 "^":"Tp:13;",
-$1:function(a){return J.oZ(a)},
+$1:function(a){return J.k7(a)},
 $isEH:true},
 e130:{
 "^":"Tp:13;",
-$1:function(a){return J.de(a)},
+$1:function(a){return J.oZ(a)},
 $isEH:true},
 e131:{
 "^":"Tp:13;",
-$1:function(a){return J.Ds(a)},
+$1:function(a){return J.de(a)},
 $isEH:true},
 e132:{
 "^":"Tp:13;",
-$1:function(a){return J.cO(a)},
+$1:function(a){return J.Ds(a)},
 $isEH:true},
 e133:{
 "^":"Tp:13;",
-$1:function(a){return a.gzM()},
+$1:function(a){return J.cO(a)},
 $isEH:true},
 e134:{
 "^":"Tp:13;",
-$1:function(a){return a.gMN()},
+$1:function(a){return a.gzM()},
 $isEH:true},
 e135:{
 "^":"Tp:13;",
-$1:function(a){return a.giP()},
+$1:function(a){return a.gMN()},
 $isEH:true},
 e136:{
 "^":"Tp:13;",
-$1:function(a){return a.gmd()},
+$1:function(a){return a.giP()},
 $isEH:true},
 e137:{
 "^":"Tp:13;",
-$1:function(a){return a.geH()},
+$1:function(a){return a.gmd()},
 $isEH:true},
 e138:{
 "^":"Tp:13;",
-$1:function(a){return J.S8(a)},
+$1:function(a){return a.geH()},
 $isEH:true},
 e139:{
 "^":"Tp:13;",
-$1:function(a){return J.kv(a)},
+$1:function(a){return J.S8(a)},
 $isEH:true},
 e140:{
 "^":"Tp:13;",
-$1:function(a){return J.ih(a)},
+$1:function(a){return J.kv(a)},
 $isEH:true},
 e141:{
 "^":"Tp:13;",
-$1:function(a){return J.z2(a)},
+$1:function(a){return J.ih(a)},
 $isEH:true},
 e142:{
 "^":"Tp:13;",
-$1:function(a){return J.ZF(a)},
+$1:function(a){return J.z2(a)},
 $isEH:true},
 e143:{
 "^":"Tp:13;",
-$1:function(a){return J.Lh(a)},
+$1:function(a){return J.ZF(a)},
 $isEH:true},
 e144:{
 "^":"Tp:13;",
-$1:function(a){return J.Zv(a)},
+$1:function(a){return J.Lh(a)},
 $isEH:true},
 e145:{
 "^":"Tp:13;",
-$1:function(a){return J.O6(a)},
+$1:function(a){return J.Zv(a)},
 $isEH:true},
 e146:{
 "^":"Tp:13;",
-$1:function(a){return J.Pf(a)},
+$1:function(a){return J.O6(a)},
 $isEH:true},
 e147:{
 "^":"Tp:13;",
-$1:function(a){return a.gUY()},
+$1:function(a){return J.Pf(a)},
 $isEH:true},
 e148:{
 "^":"Tp:13;",
-$1:function(a){return a.gvK()},
+$1:function(a){return a.gUY()},
 $isEH:true},
 e149:{
 "^":"Tp:13;",
-$1:function(a){return J.Jj(a)},
+$1:function(a){return a.gvK()},
 $isEH:true},
 e150:{
 "^":"Tp:13;",
-$1:function(a){return J.t8(a)},
+$1:function(a){return J.Jj(a)},
 $isEH:true},
 e151:{
 "^":"Tp:13;",
-$1:function(a){return a.gL1()},
+$1:function(a){return J.t8(a)},
 $isEH:true},
 e152:{
 "^":"Tp:13;",
-$1:function(a){return a.gxQ()},
+$1:function(a){return a.gL1()},
 $isEH:true},
 e153:{
 "^":"Tp:13;",
-$1:function(a){return J.ee(a)},
+$1:function(a){return a.gxQ()},
 $isEH:true},
 e154:{
 "^":"Tp:13;",
-$1:function(a){return J.JG(a)},
+$1:function(a){return J.ee(a)},
 $isEH:true},
 e155:{
 "^":"Tp:13;",
-$1:function(a){return J.AF(a)},
+$1:function(a){return J.JG(a)},
 $isEH:true},
 e156:{
 "^":"Tp:13;",
-$1:function(a){return J.LB(a)},
+$1:function(a){return J.AF(a)},
 $isEH:true},
 e157:{
 "^":"Tp:13;",
-$1:function(a){return J.Kl(a)},
+$1:function(a){return J.LB(a)},
 $isEH:true},
 e158:{
 "^":"Tp:13;",
-$1:function(a){return a.gU6()},
+$1:function(a){return J.Kl(a)},
 $isEH:true},
 e159:{
 "^":"Tp:13;",
-$1:function(a){return J.cj(a)},
+$1:function(a){return a.gU6()},
 $isEH:true},
 e160:{
 "^":"Tp:13;",
-$1:function(a){return J.br(a)},
+$1:function(a){return J.cj(a)},
 $isEH:true},
 e161:{
 "^":"Tp:13;",
-$1:function(a){return J.io(a)},
+$1:function(a){return J.br(a)},
 $isEH:true},
 e162:{
 "^":"Tp:13;",
-$1:function(a){return J.fy(a)},
+$1:function(a){return J.io(a)},
 $isEH:true},
 e163:{
 "^":"Tp:13;",
-$1:function(a){return J.Qa(a)},
+$1:function(a){return J.fy(a)},
 $isEH:true},
 e164:{
 "^":"Tp:13;",
-$1:function(a){return J.ks(a)},
+$1:function(a){return J.Qa(a)},
 $isEH:true},
 e165:{
 "^":"Tp:13;",
-$1:function(a){return J.CN(a)},
+$1:function(a){return J.ks(a)},
 $isEH:true},
 e166:{
 "^":"Tp:13;",
-$1:function(a){return J.ql(a)},
+$1:function(a){return J.CN(a)},
 $isEH:true},
 e167:{
 "^":"Tp:13;",
-$1:function(a){return J.ul(a)},
+$1:function(a){return J.ql(a)},
 $isEH:true},
 e168:{
 "^":"Tp:13;",
-$1:function(a){return J.Sz(a)},
+$1:function(a){return J.ul(a)},
 $isEH:true},
 e169:{
 "^":"Tp:13;",
-$1:function(a){return J.id(a)},
+$1:function(a){return J.Sz(a)},
 $isEH:true},
 e170:{
 "^":"Tp:13;",
-$1:function(a){return a.gm8()},
+$1:function(a){return J.id(a)},
 $isEH:true},
 e171:{
 "^":"Tp:13;",
-$1:function(a){return J.BZ(a)},
+$1:function(a){return a.gm8()},
 $isEH:true},
 e172:{
 "^":"Tp:13;",
-$1:function(a){return J.H1(a)},
+$1:function(a){return J.BZ(a)},
 $isEH:true},
 e173:{
 "^":"Tp:13;",
-$1:function(a){return J.Cm(a)},
+$1:function(a){return J.H1(a)},
 $isEH:true},
 e174:{
 "^":"Tp:13;",
-$1:function(a){return J.fU(a)},
+$1:function(a){return J.Cm(a)},
 $isEH:true},
 e175:{
 "^":"Tp:13;",
-$1:function(a){return J.GH(a)},
+$1:function(a){return J.fU(a)},
 $isEH:true},
 e176:{
 "^":"Tp:13;",
-$1:function(a){return J.n8(a)},
+$1:function(a){return J.GH(a)},
 $isEH:true},
 e177:{
 "^":"Tp:13;",
-$1:function(a){return a.gLc()},
+$1:function(a){return J.n8(a)},
 $isEH:true},
 e178:{
 "^":"Tp:13;",
-$1:function(a){return a.gNS()},
+$1:function(a){return a.gLc()},
 $isEH:true},
 e179:{
 "^":"Tp:13;",
-$1:function(a){return a.guh()},
+$1:function(a){return a.gNS()},
 $isEH:true},
 e180:{
 "^":"Tp:13;",
-$1:function(a){return J.iL(a)},
+$1:function(a){return a.guh()},
 $isEH:true},
 e181:{
 "^":"Tp:13;",
-$1:function(a){return J.bx(a)},
+$1:function(a){return J.iL(a)},
 $isEH:true},
 e182:{
 "^":"Tp:13;",
-$1:function(a){return J.uW(a)},
+$1:function(a){return J.bx(a)},
 $isEH:true},
 e183:{
 "^":"Tp:13;",
-$1:function(a){return J.W2(a)},
+$1:function(a){return J.uW(a)},
 $isEH:true},
 e184:{
 "^":"Tp:13;",
-$1:function(a){return J.UT(a)},
+$1:function(a){return J.W2(a)},
 $isEH:true},
 e185:{
 "^":"Tp:13;",
-$1:function(a){return J.Kd(a)},
+$1:function(a){return J.UT(a)},
 $isEH:true},
 e186:{
 "^":"Tp:13;",
-$1:function(a){return J.pU(a)},
+$1:function(a){return J.Kd(a)},
 $isEH:true},
 e187:{
 "^":"Tp:13;",
-$1:function(a){return J.Tg(a)},
+$1:function(a){return J.pU(a)},
 $isEH:true},
 e188:{
 "^":"Tp:13;",
-$1:function(a){return a.gVc()},
+$1:function(a){return J.Tg(a)},
 $isEH:true},
 e189:{
 "^":"Tp:13;",
-$1:function(a){return a.gpF()},
+$1:function(a){return a.gVc()},
 $isEH:true},
 e190:{
 "^":"Tp:13;",
-$1:function(a){return J.TY(a)},
+$1:function(a){return a.gpF()},
 $isEH:true},
 e191:{
 "^":"Tp:13;",
-$1:function(a){return a.gA6()},
+$1:function(a){return J.TY(a)},
 $isEH:true},
 e192:{
 "^":"Tp:13;",
-$1:function(a){return J.Ry(a)},
+$1:function(a){return a.gA6()},
 $isEH:true},
 e193:{
 "^":"Tp:13;",
-$1:function(a){return J.UP(a)},
+$1:function(a){return J.Ry(a)},
 $isEH:true},
 e194:{
 "^":"Tp:13;",
-$1:function(a){return J.fw(a)},
+$1:function(a){return J.UP(a)},
 $isEH:true},
 e195:{
 "^":"Tp:13;",
-$1:function(a){return J.zH(a)},
+$1:function(a){return J.fw(a)},
 $isEH:true},
 e196:{
 "^":"Tp:13;",
-$1:function(a){return J.Zs(a)},
+$1:function(a){return J.zH(a)},
 $isEH:true},
 e197:{
 "^":"Tp:13;",
-$1:function(a){return a.gXR()},
+$1:function(a){return J.Zs(a)},
 $isEH:true},
 e198:{
 "^":"Tp:13;",
-$1:function(a){return J.NB(a)},
+$1:function(a){return a.gXR()},
 $isEH:true},
 e199:{
 "^":"Tp:13;",
-$1:function(a){return a.gzS()},
+$1:function(a){return J.NB(a)},
 $isEH:true},
 e200:{
 "^":"Tp:13;",
-$1:function(a){return J.U8(a)},
+$1:function(a){return a.gzS()},
 $isEH:true},
 e201:{
 "^":"Tp:13;",
-$1:function(a){return J.oN(a)},
+$1:function(a){return J.U8(a)},
 $isEH:true},
 e202:{
 "^":"Tp:13;",
-$1:function(a){return a.gV8()},
+$1:function(a){return J.oN(a)},
 $isEH:true},
 e203:{
 "^":"Tp:13;",
-$1:function(a){return a.gp8()},
+$1:function(a){return a.gV8()},
 $isEH:true},
 e204:{
 "^":"Tp:13;",
-$1:function(a){return J.F9(a)},
+$1:function(a){return a.gp8()},
 $isEH:true},
 e205:{
 "^":"Tp:13;",
-$1:function(a){return J.HB(a)},
+$1:function(a){return J.F9(a)},
 $isEH:true},
 e206:{
 "^":"Tp:13;",
-$1:function(a){return J.jB(a)},
+$1:function(a){return J.HB(a)},
 $isEH:true},
 e207:{
 "^":"Tp:13;",
-$1:function(a){return J.xb(a)},
+$1:function(a){return J.jB(a)},
 $isEH:true},
 e208:{
 "^":"Tp:13;",
-$1:function(a){return a.gS5()},
+$1:function(a){return J.xb(a)},
 $isEH:true},
 e209:{
 "^":"Tp:13;",
-$1:function(a){return a.gDo()},
+$1:function(a){return a.gS5()},
 $isEH:true},
 e210:{
 "^":"Tp:13;",
-$1:function(a){return a.guj()},
+$1:function(a){return a.gDo()},
 $isEH:true},
 e211:{
 "^":"Tp:13;",
-$1:function(a){return J.j1(a)},
+$1:function(a){return a.guj()},
 $isEH:true},
 e212:{
 "^":"Tp:13;",
-$1:function(a){return J.Aw(a)},
+$1:function(a){return J.j1(a)},
 $isEH:true},
 e213:{
 "^":"Tp:13;",
-$1:function(a){return J.l2(a)},
+$1:function(a){return J.Aw(a)},
 $isEH:true},
 e214:{
 "^":"Tp:13;",
-$1:function(a){return a.gm2()},
+$1:function(a){return J.l2(a)},
 $isEH:true},
 e215:{
 "^":"Tp:13;",
-$1:function(a){return J.dY(a)},
+$1:function(a){return a.gm2()},
 $isEH:true},
 e216:{
 "^":"Tp:13;",
-$1:function(a){return J.yq(a)},
+$1:function(a){return J.dY(a)},
 $isEH:true},
 e217:{
 "^":"Tp:13;",
-$1:function(a){return a.gki()},
+$1:function(a){return J.yq(a)},
 $isEH:true},
 e218:{
 "^":"Tp:13;",
-$1:function(a){return a.gZn()},
+$1:function(a){return a.gki()},
 $isEH:true},
 e219:{
 "^":"Tp:13;",
-$1:function(a){return a.gvs()},
+$1:function(a){return a.gZn()},
 $isEH:true},
 e220:{
 "^":"Tp:13;",
-$1:function(a){return a.gVh()},
+$1:function(a){return a.gvs()},
 $isEH:true},
 e221:{
 "^":"Tp:13;",
-$1:function(a){return a.gZX()},
+$1:function(a){return a.gVh()},
 $isEH:true},
 e222:{
 "^":"Tp:13;",
-$1:function(a){return J.d5(a)},
+$1:function(a){return a.gZX()},
 $isEH:true},
 e223:{
 "^":"Tp:13;",
-$1:function(a){return J.SG(a)},
+$1:function(a){return J.d5(a)},
 $isEH:true},
 e224:{
 "^":"Tp:13;",
-$1:function(a){return J.cs(a)},
+$1:function(a){return J.SG(a)},
 $isEH:true},
 e225:{
 "^":"Tp:13;",
-$1:function(a){return a.gVF()},
+$1:function(a){return J.cs(a)},
 $isEH:true},
 e226:{
 "^":"Tp:13;",
-$1:function(a){return a.gkw()},
+$1:function(a){return a.gVF()},
 $isEH:true},
 e227:{
 "^":"Tp:13;",
-$1:function(a){return J.K2(a)},
+$1:function(a){return a.gkw()},
 $isEH:true},
 e228:{
 "^":"Tp:13;",
-$1:function(a){return J.uy(a)},
+$1:function(a){return J.K2(a)},
 $isEH:true},
 e229:{
 "^":"Tp:13;",
-$1:function(a){return a.gEy()},
+$1:function(a){return J.uy(a)},
 $isEH:true},
 e230:{
 "^":"Tp:13;",
-$1:function(a){return J.XJ(a)},
+$1:function(a){return a.gEy()},
 $isEH:true},
 e231:{
 "^":"Tp:13;",
-$1:function(a){return J.P4(a)},
+$1:function(a){return J.XJ(a)},
 $isEH:true},
 e232:{
 "^":"Tp:13;",
-$1:function(a){return a.gJk()},
+$1:function(a){return J.P4(a)},
 $isEH:true},
 e233:{
 "^":"Tp:13;",
-$1:function(a){return J.Q2(a)},
+$1:function(a){return a.gJk()},
 $isEH:true},
 e234:{
 "^":"Tp:13;",
-$1:function(a){return a.gSU()},
+$1:function(a){return J.Q2(a)},
 $isEH:true},
 e235:{
 "^":"Tp:13;",
-$1:function(a){return a.gXA()},
+$1:function(a){return a.gSU()},
 $isEH:true},
 e236:{
 "^":"Tp:13;",
-$1:function(a){return a.gYY()},
+$1:function(a){return a.gXA()},
 $isEH:true},
 e237:{
 "^":"Tp:13;",
-$1:function(a){return a.gZ3()},
+$1:function(a){return a.gYY()},
 $isEH:true},
 e238:{
 "^":"Tp:13;",
-$1:function(a){return J.ry(a)},
+$1:function(a){return a.gZ3()},
 $isEH:true},
 e239:{
 "^":"Tp:13;",
-$1:function(a){return J.I2(a)},
+$1:function(a){return J.ry(a)},
 $isEH:true},
 e240:{
 "^":"Tp:13;",
-$1:function(a){return a.gdN()},
+$1:function(a){return J.I2(a)},
 $isEH:true},
 e241:{
 "^":"Tp:13;",
-$1:function(a){return J.NC(a)},
+$1:function(a){return a.gdN()},
 $isEH:true},
 e242:{
 "^":"Tp:13;",
-$1:function(a){return a.gV0()},
+$1:function(a){return J.NC(a)},
 $isEH:true},
 e243:{
-"^":"Tp:78;",
-$2:function(a,b){J.RX(a,b)},
+"^":"Tp:13;",
+$1:function(a){return a.gV0()},
 $isEH:true},
 e244:{
-"^":"Tp:78;",
-$2:function(a,b){J.L9(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.RX(a,b)},
 $isEH:true},
 e245:{
-"^":"Tp:78;",
-$2:function(a,b){J.l7(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.L9(a,b)},
 $isEH:true},
 e246:{
-"^":"Tp:78;",
-$2:function(a,b){J.kB(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.l7(a,b)},
 $isEH:true},
 e247:{
-"^":"Tp:78;",
-$2:function(a,b){J.Ae(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.kB(a,b)},
 $isEH:true},
 e248:{
-"^":"Tp:78;",
-$2:function(a,b){J.IX(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Ae(a,b)},
 $isEH:true},
 e249:{
-"^":"Tp:78;",
-$2:function(a,b){J.Ed(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.IX(a,b)},
 $isEH:true},
 e250:{
-"^":"Tp:78;",
-$2:function(a,b){J.NE(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Ed(a,b)},
 $isEH:true},
 e251:{
-"^":"Tp:78;",
-$2:function(a,b){J.WI(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.NE(a,b)},
 $isEH:true},
 e252:{
-"^":"Tp:78;",
-$2:function(a,b){J.NZ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.WI(a,b)},
 $isEH:true},
 e253:{
-"^":"Tp:78;",
-$2:function(a,b){J.T5(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.NZ(a,b)},
 $isEH:true},
 e254:{
-"^":"Tp:78;",
-$2:function(a,b){J.i0(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.T5(a,b)},
 $isEH:true},
 e255:{
-"^":"Tp:78;",
-$2:function(a,b){J.Sf(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.i0(a,b)},
 $isEH:true},
 e256:{
-"^":"Tp:78;",
-$2:function(a,b){J.LM(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Sf(a,b)},
 $isEH:true},
 e257:{
-"^":"Tp:78;",
-$2:function(a,b){J.qq(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.LM(a,b)},
 $isEH:true},
 e258:{
-"^":"Tp:78;",
-$2:function(a,b){J.Ac(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.qq(a,b)},
 $isEH:true},
 e259:{
-"^":"Tp:78;",
-$2:function(a,b){J.Yz(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Ac(a,b)},
 $isEH:true},
 e260:{
-"^":"Tp:78;",
-$2:function(a,b){a.sw2(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Yz(a,b)},
 $isEH:true},
 e261:{
-"^":"Tp:78;",
-$2:function(a,b){J.Qr(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sej(b)},
 $isEH:true},
 e262:{
-"^":"Tp:78;",
-$2:function(a,b){J.xW(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sw2(b)},
 $isEH:true},
 e263:{
-"^":"Tp:78;",
-$2:function(a,b){J.Wy(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Qr(a,b)},
 $isEH:true},
 e264:{
-"^":"Tp:78;",
-$2:function(a,b){J.i2(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.xW(a,b)},
 $isEH:true},
 e265:{
-"^":"Tp:78;",
-$2:function(a,b){J.BC(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Wy(a,b)},
 $isEH:true},
 e266:{
-"^":"Tp:78;",
-$2:function(a,b){J.pB(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.i2(a,b)},
 $isEH:true},
 e267:{
-"^":"Tp:78;",
-$2:function(a,b){J.NO(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.BC(a,b)},
 $isEH:true},
 e268:{
-"^":"Tp:78;",
-$2:function(a,b){J.WB(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.pB(a,b)},
 $isEH:true},
 e269:{
-"^":"Tp:78;",
-$2:function(a,b){J.JZ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.NO(a,b)},
 $isEH:true},
 e270:{
-"^":"Tp:78;",
-$2:function(a,b){J.fR(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.WB(a,b)},
 $isEH:true},
 e271:{
-"^":"Tp:78;",
-$2:function(a,b){a.shY(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.JZ(a,b)},
 $isEH:true},
 e272:{
-"^":"Tp:78;",
-$2:function(a,b){J.uP(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.fR(a,b)},
 $isEH:true},
 e273:{
-"^":"Tp:78;",
-$2:function(a,b){J.vJ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.shY(b)},
 $isEH:true},
 e274:{
-"^":"Tp:78;",
-$2:function(a,b){J.Nf(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.uP(a,b)},
 $isEH:true},
 e275:{
-"^":"Tp:78;",
-$2:function(a,b){J.Pl(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.vJ(a,b)},
 $isEH:true},
 e276:{
-"^":"Tp:78;",
-$2:function(a,b){J.C3(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Nf(a,b)},
 $isEH:true},
 e277:{
-"^":"Tp:78;",
-$2:function(a,b){J.xH(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Pl(a,b)},
 $isEH:true},
 e278:{
-"^":"Tp:78;",
-$2:function(a,b){J.Nh(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.C3(a,b)},
 $isEH:true},
 e279:{
-"^":"Tp:78;",
-$2:function(a,b){J.AI(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.xH(a,b)},
 $isEH:true},
 e280:{
-"^":"Tp:78;",
-$2:function(a,b){J.nA(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Nh(a,b)},
 $isEH:true},
 e281:{
-"^":"Tp:78;",
-$2:function(a,b){J.fb(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.AI(a,b)},
 $isEH:true},
 e282:{
-"^":"Tp:78;",
-$2:function(a,b){a.siq(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.nA(a,b)},
 $isEH:true},
 e283:{
-"^":"Tp:78;",
-$2:function(a,b){J.Qy(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.fb(a,b)},
 $isEH:true},
 e284:{
-"^":"Tp:78;",
-$2:function(a,b){J.x0(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.siq(b)},
 $isEH:true},
 e285:{
-"^":"Tp:78;",
-$2:function(a,b){a.sKt(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Qy(a,b)},
 $isEH:true},
 e286:{
-"^":"Tp:78;",
-$2:function(a,b){J.cV(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.x0(a,b)},
 $isEH:true},
 e287:{
-"^":"Tp:78;",
-$2:function(a,b){J.mU(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sKt(b)},
 $isEH:true},
 e288:{
-"^":"Tp:78;",
-$2:function(a,b){J.Kz(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.cV(a,b)},
 $isEH:true},
 e289:{
-"^":"Tp:78;",
-$2:function(a,b){J.uM(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.mU(a,b)},
 $isEH:true},
 e290:{
-"^":"Tp:78;",
-$2:function(a,b){J.Er(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Kz(a,b)},
 $isEH:true},
 e291:{
-"^":"Tp:78;",
-$2:function(a,b){J.GZ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.uM(a,b)},
 $isEH:true},
 e292:{
-"^":"Tp:78;",
-$2:function(a,b){J.hS(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Er(a,b)},
 $isEH:true},
 e293:{
-"^":"Tp:78;",
-$2:function(a,b){J.mz(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.GZ(a,b)},
 $isEH:true},
 e294:{
-"^":"Tp:78;",
-$2:function(a,b){J.pA(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.hS(a,b)},
 $isEH:true},
 e295:{
-"^":"Tp:78;",
-$2:function(a,b){a.sSK(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.mz(a,b)},
 $isEH:true},
 e296:{
-"^":"Tp:78;",
-$2:function(a,b){a.shX(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.pA(a,b)},
 $isEH:true},
 e297:{
-"^":"Tp:78;",
-$2:function(a,b){J.cl(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sSK(b)},
 $isEH:true},
 e298:{
-"^":"Tp:78;",
-$2:function(a,b){J.Jb(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.shX(b)},
 $isEH:true},
 e299:{
-"^":"Tp:78;",
-$2:function(a,b){J.xQ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.cl(a,b)},
 $isEH:true},
 e300:{
-"^":"Tp:78;",
-$2:function(a,b){J.MX(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Jb(a,b)},
 $isEH:true},
 e301:{
-"^":"Tp:78;",
-$2:function(a,b){J.A4(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.xQ(a,b)},
 $isEH:true},
 e302:{
-"^":"Tp:78;",
-$2:function(a,b){J.wD(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.MX(a,b)},
 $isEH:true},
 e303:{
-"^":"Tp:78;",
-$2:function(a,b){J.wJ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.A4(a,b)},
 $isEH:true},
 e304:{
-"^":"Tp:78;",
-$2:function(a,b){J.oJ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.wD(a,b)},
 $isEH:true},
 e305:{
-"^":"Tp:78;",
-$2:function(a,b){J.DF(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.wJ(a,b)},
 $isEH:true},
 e306:{
-"^":"Tp:78;",
-$2:function(a,b){a.svK(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.oJ(a,b)},
 $isEH:true},
 e307:{
-"^":"Tp:78;",
-$2:function(a,b){J.h9(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.DF(a,b)},
 $isEH:true},
 e308:{
-"^":"Tp:78;",
-$2:function(a,b){a.sL1(b)},
+"^":"Tp:79;",
+$2:function(a,b){a.svK(b)},
 $isEH:true},
 e309:{
-"^":"Tp:78;",
-$2:function(a,b){J.XF(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.h9(a,b)},
 $isEH:true},
 e310:{
-"^":"Tp:78;",
-$2:function(a,b){J.SF(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sL1(b)},
 $isEH:true},
 e311:{
-"^":"Tp:78;",
-$2:function(a,b){J.Qv(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.XF(a,b)},
 $isEH:true},
 e312:{
-"^":"Tp:78;",
-$2:function(a,b){J.R8(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.SF(a,b)},
 $isEH:true},
 e313:{
-"^":"Tp:78;",
-$2:function(a,b){J.Xg(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Qv(a,b)},
 $isEH:true},
 e314:{
-"^":"Tp:78;",
-$2:function(a,b){J.aw(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.R8(a,b)},
 $isEH:true},
 e315:{
-"^":"Tp:78;",
-$2:function(a,b){J.CJ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Xg(a,b)},
 $isEH:true},
 e316:{
-"^":"Tp:78;",
-$2:function(a,b){J.P2(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.aw(a,b)},
 $isEH:true},
 e317:{
-"^":"Tp:78;",
-$2:function(a,b){J.fv(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.CJ(a,b)},
 $isEH:true},
 e318:{
-"^":"Tp:78;",
-$2:function(a,b){J.J0(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.P2(a,b)},
 $isEH:true},
 e319:{
-"^":"Tp:78;",
-$2:function(a,b){J.PP(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.fv(a,b)},
 $isEH:true},
 e320:{
-"^":"Tp:78;",
-$2:function(a,b){J.Sj(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.J0(a,b)},
 $isEH:true},
 e321:{
-"^":"Tp:78;",
-$2:function(a,b){J.tv(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.PP(a,b)},
 $isEH:true},
 e322:{
-"^":"Tp:78;",
-$2:function(a,b){J.w7(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Sj(a,b)},
 $isEH:true},
 e323:{
-"^":"Tp:78;",
-$2:function(a,b){J.ME(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.tv(a,b)},
 $isEH:true},
 e324:{
-"^":"Tp:78;",
-$2:function(a,b){J.kX(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.w7(a,b)},
 $isEH:true},
 e325:{
-"^":"Tp:78;",
-$2:function(a,b){J.q0(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.ME(a,b)},
 $isEH:true},
 e326:{
-"^":"Tp:78;",
-$2:function(a,b){J.EJ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.kX(a,b)},
 $isEH:true},
 e327:{
-"^":"Tp:78;",
-$2:function(a,b){J.iH(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.q0(a,b)},
 $isEH:true},
 e328:{
-"^":"Tp:78;",
-$2:function(a,b){J.SO(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.EJ(a,b)},
 $isEH:true},
 e329:{
-"^":"Tp:78;",
-$2:function(a,b){J.B9(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.iH(a,b)},
 $isEH:true},
 e330:{
-"^":"Tp:78;",
-$2:function(a,b){J.PN(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.SO(a,b)},
 $isEH:true},
 e331:{
-"^":"Tp:78;",
-$2:function(a,b){a.sVc(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.B9(a,b)},
 $isEH:true},
 e332:{
-"^":"Tp:78;",
-$2:function(a,b){J.By(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.PN(a,b)},
 $isEH:true},
 e333:{
-"^":"Tp:78;",
-$2:function(a,b){J.jd(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sVc(b)},
 $isEH:true},
 e334:{
-"^":"Tp:78;",
-$2:function(a,b){J.Rx(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.By(a,b)},
 $isEH:true},
 e335:{
-"^":"Tp:78;",
-$2:function(a,b){J.ZI(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.jd(a,b)},
 $isEH:true},
 e336:{
-"^":"Tp:78;",
-$2:function(a,b){J.fa(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Rx(a,b)},
 $isEH:true},
 e337:{
-"^":"Tp:78;",
-$2:function(a,b){J.Cu(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.ZI(a,b)},
 $isEH:true},
 e338:{
-"^":"Tp:78;",
-$2:function(a,b){a.sV8(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.fa(a,b)},
 $isEH:true},
 e339:{
-"^":"Tp:78;",
-$2:function(a,b){J.EC(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Cu(a,b)},
 $isEH:true},
 e340:{
-"^":"Tp:78;",
-$2:function(a,b){J.Hn(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sV8(b)},
 $isEH:true},
 e341:{
-"^":"Tp:78;",
-$2:function(a,b){J.Tx(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.EC(a,b)},
 $isEH:true},
 e342:{
-"^":"Tp:78;",
-$2:function(a,b){a.sDo(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Hn(a,b)},
 $isEH:true},
 e343:{
-"^":"Tp:78;",
-$2:function(a,b){a.suj(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Tx(a,b)},
 $isEH:true},
 e344:{
-"^":"Tp:78;",
-$2:function(a,b){J.H3(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sDo(b)},
 $isEH:true},
 e345:{
-"^":"Tp:78;",
-$2:function(a,b){J.TZ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.suj(b)},
 $isEH:true},
 e346:{
-"^":"Tp:78;",
-$2:function(a,b){J.t3(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.H3(a,b)},
 $isEH:true},
 e347:{
-"^":"Tp:78;",
-$2:function(a,b){J.my(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.TZ(a,b)},
 $isEH:true},
 e348:{
-"^":"Tp:78;",
-$2:function(a,b){a.sVF(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.t3(a,b)},
 $isEH:true},
 e349:{
-"^":"Tp:78;",
-$2:function(a,b){J.yO(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.my(a,b)},
 $isEH:true},
 e350:{
-"^":"Tp:78;",
-$2:function(a,b){J.ZU(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sVF(b)},
 $isEH:true},
 e351:{
-"^":"Tp:78;",
-$2:function(a,b){J.tQ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.yO(a,b)},
 $isEH:true},
 e352:{
-"^":"Tp:78;",
-$2:function(a,b){J.tH(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.ZU(a,b)},
 $isEH:true},
 e353:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+"^":"Tp:79;",
+$2:function(a,b){J.tQ(a,b)},
 $isEH:true},
 e354:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
+"^":"Tp:79;",
+$2:function(a,b){J.tH(a,b)},
 $isEH:true},
 e355:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e356:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e357:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e358:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e359:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e360:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e361:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e362:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e363:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e364:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e365:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e366:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e367:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e368:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e369:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e370:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e371:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e372:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e373:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e374:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e375:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e376:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e377:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e378:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e379:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e380:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e381:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e382:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e383:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e384:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e385:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e386:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
+e380:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e381:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e382:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e383:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e384:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e385:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e386:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+$isEH:true},
 e387:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e388:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e389:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e390:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e391:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e392:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e393:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e394:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e395:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e396:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e397:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e398:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e399:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e400:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e401:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e402:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e403:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e404:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e405:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e406:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e407:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e408:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e409:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e410:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e411:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e412:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e413:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e414:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e415:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e416:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e417:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e418:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e419:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e420:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e421:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e422:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e423:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e424:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e425:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e426:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e427:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e428:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e429:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e430:{
-"^":"Tp:70;",
+"^":"Tp:71;",
+$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e431:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e432:{
+"^":"Tp:71;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
 $isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
@@ -4409,7 +4420,7 @@
 "^":"pv;BW,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 grs:function(a){return a.BW},
 srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-pA:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,20,98],
 static:{Dw:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4438,8 +4449,8 @@
 a.XN=!1
 a.Xy=z
 a.ZQ=y
-C.YZ.ZL(a)
-C.YZ.XI(a)
+C.YZz.ZL(a)
+C.YZz.XI(a)
 return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
 "^":"",
 CZ:{
@@ -4488,8 +4499,8 @@
 x=new H.XO(q,null)
 N.QM("").xH("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,98,99],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,98,99],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -4500,7 +4511,7 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gwJ",6,0,100,1,101,102],
+N.QM("").xH("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,1,102,103],
 static:{l0:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4518,7 +4529,7 @@
 $isd3:true},
 nc:{
 "^":"Tp:13;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,103,"call"],
+$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,104,"call"],
 $isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 aC:{
@@ -4529,13 +4540,13 @@
 sWt:function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,b)},
 gCF:function(a){return a.mN},
 sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,104,105],
-tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ez(a))},"$1","gR1",2,0,106,107],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,106,108],
+vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,105,106],
+tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ez(a))},"$1","gR1",2,0,107,108],
+S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,107,109],
 pA:[function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,null)
 a.mN=this.ct(a,C.tg,a.mN,null)
-J.cI(a.yB).YM(b)},"$1","gvC",2,0,20,97],
-j9:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,20,97],
+J.cI(a.yB).YM(b)},"$1","gvC",2,0,20,98],
+j9:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,20,98],
 static:{lW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4552,16 +4563,16 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ez:{
-"^":"Tp:109;a",
+"^":"Tp:110;a",
 $1:[function(a){var z=this.a
-z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,91,"call"],
+z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 SS:{
-"^":"Tp:109;a",
+"^":"Tp:110;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,91,"call"],
+z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,92,"call"],
 $isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 VY:{
@@ -4592,7 +4603,7 @@
 z=a.Xx
 if(z==null)return
 J.SK(z).ml(new F.Bc())},
-pA:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,20,98],
 b0:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
@@ -4602,10 +4613,10 @@
 return x},
 YI:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gff",6,0,110,1,101,102],
+J.pP(z).h(0,"highlight")},"$3","gff",6,0,111,1,102,103],
 Lk:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,110,1,101,102],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,111,1,102,103],
 static:{f9:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4622,8 +4633,8 @@
 "^":"uL+Pi;",
 $isd3:true},
 Bc:{
-"^":"Tp:111;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,82,"call"],
+"^":"Tp:112;",
+$1:[function(a){a.OF()},"$1",null,2,0,null,83,"call"],
 $isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 JI:{
@@ -4647,7 +4658,7 @@
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.gN2(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,81,46,47,82],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,82,46,47,83],
 static:{oS:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4904,6 +4915,13 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
+zH:function(a){var z,y,x
+z=P.Ls(null,null,null,H.ip(this,"aL",0))
+y=0
+while(!0){x=this.gB(this)
+if(typeof x!=="number")return H.s(x)
+if(!(y<x))break
+z.h(0,this.Zv(0,y));++y}return z},
 $isyN:true},
 bX:{
 "^":"aL;l6,SH,AN",
@@ -5039,7 +5057,7 @@
 Nk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-Zl:{
+JJ:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
@@ -5062,7 +5080,7 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+Zl;",
+"^":"ark+JJ;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5145,7 +5163,7 @@
 if(J.xC($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
 z.wr(z.xi(a,!0))},
-x2:function(a,b,c,d,e,f){return e?H.VM(new P.F4(b,c,d,a,null,0,null),[f]):H.VM(new P.q1(b,c,d,a,null,0,null),[f])},
+x2:function(a,b,c,d,e,f){return e?H.VM(new P.Mv(b,c,d,a,null,0,null),[f]):H.VM(new P.q1(b,c,d,a,null,0,null),[f])},
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -5212,7 +5230,7 @@
 z=P.YM(null,null,null,null,null)
 return new P.uo(c,d,z)},"$5","Is",10,0,44],
 C6:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -5284,9 +5302,9 @@
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},112],
+this.Iv(b)},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},113],
 js:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,113,23,24,25],
+this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,114,23,24,25],
 xO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.yx
@@ -5366,7 +5384,7 @@
 "^":"a;",
 $isb8:true},
 w4:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
@@ -5374,7 +5392,7 @@
 this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 mQ:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:[function(a,b){var z,y,x
 z=this.a
 y=z.b
@@ -5382,10 +5400,10 @@
 x=--z.c
 if(y!=null)if(x===0||this.b)z.a.w0(a,b)
 else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,114,115,"call"],
+z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,115,116,"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:116;a,c,d",
+"^":"Tp:117;a,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=--z.c
@@ -5407,12 +5425,12 @@
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,117,23,21],
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,118,23,21],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,113,23,24,25]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,114,23,24,25]},
 Gc:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -5538,7 +5556,7 @@
 y=b
 b=q}}}},
 da:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 U7:{
@@ -5546,23 +5564,23 @@
 $1:[function(a){this.a.R8(a)},"$1",null,2,0,null,21,"call"],
 $isEH:true},
 vr:{
-"^":"Tp:118;b",
+"^":"Tp:119;b",
 $2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
 $isEH:true},
 cX:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 eX:{
-"^":"Tp:70;c,d",
+"^":"Tp:71;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:70;a,b,c",
+"^":"Tp:71;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:119;b,d,e,f",
+"^":"Tp:120;b,d,e,f",
 $0:function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
@@ -5629,10 +5647,10 @@
 $isEH:true},
 jZ:{
 "^":"Tp:13;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,120,"call"],
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:118;a,mG",
+"^":"Tp:119;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isGc){y=P.Dt(null)
@@ -5644,8 +5662,8 @@
 Ki:function(a){return this.FR.$0()}},
 wS:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"bp",ret:P.wS,args:[{func:"Lf",args:[a]}]}},this.$receiver,"wS")},121],
-lM:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},121],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"bp",ret:P.wS,args:[{func:"Lf",args:[a]}]}},this.$receiver,"wS")},122],
+lM:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},122],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
@@ -5676,6 +5694,11 @@
 z.a=null
 z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gaq())
 return y},
+zH:function(a){var z,y
+z=P.Ls(null,null,null,H.ip(this,"wS",0))
+y=P.Dt([P.xu,H.ip(this,"wS",0)])
+this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gaq())
+return y},
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"wS",0))
@@ -5695,28 +5718,28 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,122,"call"],
+P.FE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"wS")}},
 Oh:{
-"^":"Tp:70;e,f",
+"^":"Tp:71;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
 jvH:{
-"^":"Tp:123;a,UI",
+"^":"Tp:124;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 tG:{
-"^":"Tp:70;bK",
+"^":"Tp:71;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Tp;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,122,"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"wS")}},
 Rl:{
-"^":"Tp:70;e,f",
+"^":"Tp:71;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 at:{
@@ -5724,7 +5747,7 @@
 $1:function(a){},
 $isEH:true},
 M4:{
-"^":"Tp:70;UI",
+"^":"Tp:71;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 BSd:{
@@ -5732,19 +5755,19 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,122,"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"wS")}},
 WN:{
-"^":"Tp:70;e,f",
+"^":"Tp:71;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 XPB:{
-"^":"Tp:123;a,UI",
+"^":"Tp:124;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 dyj:{
-"^":"Tp:70;bK",
+"^":"Tp:71;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 PI:{
@@ -5752,7 +5775,7 @@
 $1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
 $isEH:true},
 uO:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 qg:{
@@ -5760,16 +5783,25 @@
 $1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,14,"call"],
 $isEH:true},
 Wd:{
-"^":"Tp:70;c",
+"^":"Tp:71;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
+oY:{
+"^":"Tp;a,b",
+$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,113,"call"],
+$isEH:true,
+$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.a,"wS")}},
+yZ:{
+"^":"Tp:71;c,d",
+$0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
+$isEH:true},
 xp:{
 "^":"Tp;a,b,c",
 $1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"wS")}},
 OC:{
-"^":"Tp:70;d",
+"^":"Tp:71;d",
 $0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
@@ -5780,7 +5812,7 @@
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"wS")}},
 eI:{
-"^":"Tp:70;a,c",
+"^":"Tp:71;a,c",
 $0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
@@ -5858,7 +5890,7 @@
 m4:function(a){if((this.Gv&8)!==0)this.xG.QE(0)
 P.ot(this.gZ9())}},
 UO:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:function(){P.ot(this.a.gnL())},
 $isEH:true},
 BcV:{
@@ -5881,7 +5913,7 @@
 tA:function(){return this.QC.$0()}},
 ZzD:{
 "^":"nR+of2;"},
-F4:{
+Mv:{
 "^":"MFI;nL<,p4<,Z9<,QC<,xG,Gv,yx",
 tA:function(){return this.QC.$0()}},
 MFI:{
@@ -5918,7 +5950,7 @@
 this.Gv=(z+128|4)>>>0
 if(b!=null)b.YM(this.gDQ(this))
 if(z<128&&this.Ri!=null)this.Ri.IO()
-if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,124,23,125],
+if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,23,126],
 QE:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -6075,7 +6107,7 @@
 this.Gv=1},
 IO:function(){if(this.Gv===1)this.Gv=3}},
 CR:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -6109,7 +6141,7 @@
 fm:function(a,b){},
 y5:function(a){this.Bd=a},
 Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,124,23,125],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,23,126],
 QE:[function(a){var z=this.Gv
 if(z>=4){z-=4
 this.Gv=z
@@ -6124,15 +6156,15 @@
 $isMO:true,
 static:{"^":"D4,ED7,ELg"}},
 dR:{
-"^":"Tp:70;a,b,c",
+"^":"Tp:71;a,b,c",
 $0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:126;a,b",
+"^":"Tp:127;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 QX:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 og:{
@@ -6168,8 +6200,8 @@
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},112],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,127,24,25],
+vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},113],
+xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,128,24,25],
 Sp:[function(){this.Qj()},"$0","gH1",0,0,18],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
@@ -6304,11 +6336,11 @@
 if(b)return new P.dv(this,z)
 else return new P.wd(this,z)}},
 TF:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Xz:{
-"^":"Tp:70;c,d",
+"^":"Tp:71;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
@@ -6320,11 +6352,11 @@
 $1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,33,"call"],
 $isEH:true},
 dv:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,9,10,"call"],
 $isEH:true},
 wd:{
-"^":"Tp:78;c,d",
+"^":"Tp:79;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,9,10,"call"],
 $isEH:true},
 uo:{
@@ -6348,11 +6380,11 @@
 uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
 Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
 FO:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:70;c,d",
+"^":"Tp:71;c,d",
 $0:[function(){var z,y
 z=this.c
 P.FL("Uncaught Error: "+H.d(z))
@@ -6362,8 +6394,8 @@
 throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Uez:{
-"^":"Tp:78;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,21,"call"],
+"^":"Tp:79;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,21,"call"],
 $isEH:true},
 AHi:{
 "^":"a;",
@@ -6605,7 +6637,7 @@
 return z}}},
 oi:{
 "^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,128,"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
@@ -6793,11 +6825,11 @@
 return z}}},
 a1:{
 "^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,128,"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
 $isEH:true},
 pk:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,21,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a,b){return{func:"lb",args:[a,b]}},this.a,"YB")}},
 db:{
@@ -6833,6 +6865,9 @@
 return!0}}}},
 Rr:{
 "^":"u3T;X5,vv,OX,OB,DM",
+Ys:function(){var z=new P.Rr(0,null,null,null,null)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
 gA:function(a){var z=new P.cN(this,this.Zl(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
@@ -6881,7 +6916,7 @@
 this.DM=null
 return!0},
 FV:function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},
+for(z=J.mY(b);z.G();)this.h(0,z.gl())},
 Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
 else return this.bB(b)},
@@ -6931,6 +6966,7 @@
 z=a.length
 for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
+$isxu:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -6952,6 +6988,9 @@
 return!0}}},
 D0:{
 "^":"u3T;X5,vv,OX,OB,H9,lX,zN",
+Ys:function(){var z=new P.D0(0,null,null,null,null,null,0)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
 gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
@@ -7068,6 +7107,7 @@
 z=a.length
 for(y=0;y<z;++y)if(J.xC(J.Nq(a[y]),b))return y
 return-1},
+$isxu:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -7094,7 +7134,10 @@
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]}},
 u3T:{
-"^":"Vj5;"},
+"^":"Vj5;",
+zH:function(a){var z=this.Ys()
+z.FV(0,this)
+return z}},
 mW:{
 "^":"a;",
 ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"Uy",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"mW")},31],
@@ -7120,6 +7163,9 @@
 return!1},
 tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
 br:function(a){return this.tt(a,!0)},
+zH:function(a){var z=P.Ls(null,null,null,H.ip(this,"mW",0))
+z.FV(0,this)
+return z},
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
@@ -7187,6 +7233,10 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y}return z},
 br:function(a){return this.tt(a,!0)},
+zH:function(a){var z,y
+z=P.Ls(null,null,null,H.ip(a,"lD",0))
+for(y=0;y<this.gB(a);++y)z.h(0,this.t(a,y))
+return z},
 h:function(a,b){var z=this.gB(a)
 this.sB(a,z+1)
 this.u(a,z,b)},
@@ -7264,14 +7314,14 @@
 $isQV:true,
 $asQV:null},
 W0:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,129,64,"call"],
+z.KF(b)},"$2",null,4,0,null,130,64,"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -7490,6 +7540,7 @@
 do y=z.gl()
 while(z.G())
 return y},
+$isxu:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -7685,7 +7736,7 @@
 throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
 tp:[function(a){return a.Lt()},"$1","Jn",2,0,49,50],
 JC:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return b},
 $isEH:true},
 f1:{
@@ -7958,11 +8009,11 @@
 if(y==null)H.qw(z)
 else y.$1(z)},
 Y25:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){this.a.u(0,a.gfN(a),b)},
 $isEH:true},
 CL:{
-"^":"Tp:130;a",
+"^":"Tp:131;a",
 $2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -7998,7 +8049,7 @@
 RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
 static:{"^":"bS,Vp8,Eu,p2W,h2,KL,EQe,NXt,Hm,Gio,zM3,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
+z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
 if(z!=null){y=new P.MF()
 x=z.QK
 if(1>=x.length)return H.e(x,1)
@@ -8044,12 +8095,12 @@
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 MF:{
-"^":"Tp:131;",
+"^":"Tp:132;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Tp:132;",
+"^":"Tp:133;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -8240,6 +8291,10 @@
 ns:{
 "^":"a;",
 $isns:true},
+xu:{
+"^":"mW;",
+$isxu:true,
+$isyN:true},
 BpP:{
 "^":"a;"},
 VV:{
@@ -8318,7 +8373,7 @@
 z=a==null
 if(z&&!0)return""
 z=!z
-if(z);y=z?P.Xc(a):C.bP.ez(b,new P.uF()).zV(0,"/")
+if(z);y=z?P.Xc(a):C.bP.ez(b,new P.bm()).zV(0,"/")
 if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
 return y},
 yM:function(a,b){if(a==="")return"/"+H.d(b)
@@ -8476,7 +8531,7 @@
 if(y);if(y)return P.Xc(a)
 x=P.p9("")
 z.a=!0
-C.bP.aN(b,new P.yZ(z,x))
+C.bP.aN(b,new P.Ue(z,x))
 return x.vM},o6:function(a){if(a==null)return""
 return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z={}
@@ -8575,7 +8630,7 @@
 y.vM+=u
 z.$2(v,y)}}return y.vM}}},
 jY:{
-"^":"Tp:133;",
+"^":"Tp:134;",
 $1:function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
@@ -8583,25 +8638,25 @@
 return z},
 $isEH:true},
 Uo:{
-"^":"Tp:134;a",
+"^":"Tp:135;a",
 $1:function(a){a=J.DP(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
 return a+1},
 $isEH:true},
 QU:{
-"^":"Tp:133;",
+"^":"Tp:134;",
 $1:function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.JH,z)
 z=(C.JH[z]&C.jn.KI(1,a&15))!==0}else z=!1
 return z},
 $isEH:true},
-uF:{
+bm:{
 "^":"Tp:13;",
 $1:function(a){return P.jW(C.ZJ,a,C.xM,!1)},
 $isEH:true},
-yZ:{
-"^":"Tp:78;a,b",
+Ue:{
+"^":"Tp:79;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -8612,18 +8667,18 @@
 z.KF(P.jW(C.B2,b,C.xM,!0))},
 $isEH:true},
 Al:{
-"^":"Tp:133;",
+"^":"Tp:134;",
 $1:function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
 return z},
 $isEH:true},
 tS:{
-"^":"Tp:133;",
+"^":"Tp:134;",
 $1:function(a){return 97<=a&&a<=102},
 $isEH:true},
 m9:{
-"^":"Tp:133;",
+"^":"Tp:134;",
 $1:function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.B2,z)
@@ -8631,7 +8686,7 @@
 return z},
 $isEH:true},
 wm:{
-"^":"Tp:134;b,c,d",
+"^":"Tp:135;b,c,d",
 $1:function(a){var z,y
 z=this.b
 y=J.Pp(z,a)
@@ -8640,7 +8695,7 @@
 else return y},
 $isEH:true},
 QE:{
-"^":"Tp:134;e",
+"^":"Tp:135;e",
 $1:function(a){var z,y,x,w,v
 for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
 if(48<=v&&v<=57)x=x*16+v-48
@@ -8660,7 +8715,7 @@
 else y.KF(J.Nj(w,x,v))},
 $isEH:true},
 XZ:{
-"^":"Tp:135;",
+"^":"Tp:136;",
 $2:function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
 return b*31+z&1073741823},
@@ -8675,14 +8730,14 @@
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,136,"call"],
+return z},"$1",null,2,0,null,137,"call"],
 $isEH:true},
 x8:{
 "^":"Tp:43;",
 $1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
 $isEH:true},
 JT:{
-"^":"Tp:95;a,b",
+"^":"Tp:96;a,b",
 $2:function(a,b){var z,y
 if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(C.xB.Nj(this.a,a,b),16,null)
@@ -8697,7 +8752,7 @@
 else return[z.m(a,8)&255,z.i(a,255)]},
 $isEH:true},
 rI:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.JM(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.JM(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
@@ -8920,7 +8975,7 @@
 gEr:function(a){return H.VM(new W.JF(a,C.U3.Ph,!1),[null])},
 gfs:function(a){return H.VM(new W.JF(a,C.T1.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.JF(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.JF(a,C.uh.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
 ZL:function(a){},
 $ish4:true,
@@ -9024,7 +9079,7 @@
 ttH:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-Gx:{
+pL:{
 "^":"Bo;P:value%",
 "%":"HTMLLIElement"},
 hi:{
@@ -9182,7 +9237,7 @@
 "^":"Bo;MB:form=,vH:index=,ph:label%,P:value%",
 $isQlt:true,
 "%":"HTMLOptionElement"},
-wL2:{
+Xp:{
 "^":"Bo;MB:form=,oc:name%,t5:type=,P:value%",
 "%":"HTMLOutputElement"},
 HDy:{
@@ -9528,10 +9583,10 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"Tp:13;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,137,"call"],
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,138,"call"],
 $isEH:true},
 bU2:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){this.a.setRequestHeader(a,b)},
 $isEH:true},
 bU:{
@@ -9547,7 +9602,7 @@
 y.OH(z)}else x.pm(a)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 QR:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
 wi:{
@@ -9620,15 +9675,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 AA:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){this.a.setItem(a,b)},
 $isEH:true},
 wQ:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){return this.a.push(a)},
 $isEH:true},
 rs:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){return this.a.push(b)},
 $isEH:true},
 yoo:{
@@ -9684,7 +9739,7 @@
 $isZ0:true,
 $asZ0:function(){return[P.qU,P.qU]}},
 Zc:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 E9:{
@@ -9731,7 +9786,7 @@
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
 hD:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
@@ -9801,7 +9856,7 @@
 return},
 Fv:[function(a,b){if(this.DK==null)return;++this.VP
 this.Ns()
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,124,23,125],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,23,126],
 gUF:function(){return this.VP>0},
 QE:[function(a){if(this.DK==null||this.VP<=0)return;--this.VP
 this.Zz()},"$0","gDQ",0,0,18],
@@ -9824,7 +9879,7 @@
 this.pY.xO(0)},"$0","gQF",0,0,18],
 xd:function(a){this.pY=P.bK(this.gQF(this),null,!0,a)}},
 rW:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Gm:{
@@ -9970,7 +10025,7 @@
 pQ:{
 "^":"d5G;x=,y=",
 "%":"SVGFESpotLightElement"},
-Qya:{
+HX:{
 "^":"d5G;yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
@@ -10015,7 +10070,7 @@
 gEr:function(a){return H.VM(new W.JF(a,C.U3.Ph,!1),[null])},
 gfs:function(a){return H.VM(new W.JF(a,C.T1.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.JF(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.JF(a,C.uh.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
 $isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
@@ -10073,7 +10128,7 @@
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,41,59,27,60],
+d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","Gx",8,0,null,41,59,27,60],
 Dm:function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},
@@ -10175,7 +10230,7 @@
 FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
 xe:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
 this.V7("splice",[b,0,c])},
-UZ:function(a,b,c){P.oY(b,c,this.gB(this))
+UZ:function(a,b,c){P.uF(b,c,this.gB(this))
 this.V7("splice",[b,c-b])},
 YW:function(a,b,c,d,e){var z,y,x
 z=this.gB(this)
@@ -10190,7 +10245,7 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 GT:function(a,b){this.V7("sort",[b])},
 Jd:function(a){return this.GT(a,null)},
-static:{oY:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
+static:{uF:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
 if(b<a||b>c)throw H.b(P.TE(b,a,c))}}},
 WkF:{
 "^":"E4+lD;",
@@ -10428,7 +10483,7 @@
 return a},
 WZ:{
 "^":"Gv;",
-gbx:function(a){return C.E0},
+gbx:function(a){return C.uh},
 $isWZ:true,
 "%":"ArrayBuffer"},
 eH:{
@@ -10559,7 +10614,7 @@
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
-gbx:function(a){return C.Fe},
+gbx:function(a){return C.YZ},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
@@ -10689,7 +10744,7 @@
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gVr",6,0,110,1,101,102],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gVr",6,0,111,1,102,103],
 Z1:[function(a,b,c,d){var z,y,x
 J.Kr(b)
 z=a.a3
@@ -10698,9 +10753,9 @@
 x=R.tB(y)
 J.kW(x,"expr",z)
 J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,110,1,101,102],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,111,1,102,103],
 o5:[function(a,b){var z=J.bN(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,138,1],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,139,1],
 static:{Rp:function(a){var z,y,x
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -10721,7 +10776,7 @@
 $isd3:true},
 YW:{
 "^":"Tp:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,139,"call"],
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Eg:{
@@ -10742,7 +10797,7 @@
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.uv(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,81,46,47,82],
+this.LY(a,a.jv).ml(new R.uv(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,82,46,47,83],
 static:{Nd:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -10764,12 +10819,12 @@
 "^":"xc+Pi;",
 $isd3:true},
 uv:{
-"^":"Tp:140;a",
+"^":"Tp:141;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,91,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 Ou:{
-"^":"Tp:70;b",
+"^":"Tp:71;b",
 $0:[function(){var z=this.b
 z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
@@ -10794,7 +10849,7 @@
 "^":"pva;KV,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-pA:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,20,98],
 static:{nv:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -10815,7 +10870,7 @@
 "^":"cda;DC,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-pA:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,20,98],
 static:{Ak:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -10946,7 +11001,7 @@
 break
 default:a.ZZ=this.ct(a,C.Lc,y,"UNKNOWN")
 break}},"$1","gnp",2,0,20,57],
-pA:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,20,98],
 static:{nz:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -10965,7 +11020,7 @@
 "^":"",
 Hz:{
 "^":"a;zE,mS",
-PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,141],
+PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,142],
 gvH:function(a){return C.CD.cU(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=b.gy(b)
@@ -11053,9 +11108,9 @@
 w=z.mS
 v=a.UL.t(0,a.Aj.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,138,2],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,139,2],
 X7:[function(a,b){var z=J.cR(this.on(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,138,2],
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,139,2],
 My:function(a){var z,y,x,w,v
 z=a.oj
 if(z==null||a.hi==null)return
@@ -11126,9 +11181,9 @@
 P.Iw(new O.R5(a,b),null)},
 pA:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,20,97],
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,20,98],
 YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,20,57],
-static:{"^":"nK,Os,SoT,WBO",dF:function(a){var z,y,x,w,v
+static:{"^":"nK,Os,SoT,WBO",pn:function(a){var z,y,x,w,v
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
@@ -11150,20 +11205,20 @@
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:function(){J.MU(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"Tp:109;a",
+"^":"Tp:110;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,142,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,143,"call"],
 $isEH:true},
 z4:{
-"^":"Tp:78;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,143,"call"],
+"^":"Tp:79;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,144,"call"],
 $isEH:true},
 oc:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:function(){J.vP(this.a)},
 $isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
@@ -11267,17 +11322,17 @@
 if(z==null?y!=null:z!==y){x.sxp(y)
 a.nc.sT3(!0)}else x.sT3(!x.gT3())
 J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,100,1,101,102],
+this.Jh(a)}},"$3","gQq",6,0,101,1,102,103],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,20,97],
+J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,20,98],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,20,97],
+J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,20,98],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,20,97],
-hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,144,145],
+J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,20,98],
+hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,145,146],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
@@ -11343,17 +11398,17 @@
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,146,147],
+return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,147,148],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,146,147],
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,147,148],
 F9:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,146,147],
+return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,147,148],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.GQ=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
@@ -11415,19 +11470,19 @@
 return y},
 $isEH:true},
 rG:{
-"^":"Tp:148;d",
+"^":"Tp:149;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 fh:{
-"^":"Tp:149;e",
+"^":"Tp:150;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
 uS:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){},
 $isEH:true},
 Tm:{
@@ -11465,8 +11520,8 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
 ib:{
-"^":"Tp:78;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,76,21,"call"],
+"^":"Tp:79;a,Gq",
+$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,77,21,"call"],
 $isEH:true},
 CA:{
 "^":"Tp:48;a,b",
@@ -11479,13 +11534,13 @@
 return y},
 $isEH:true},
 ti:{
-"^":"Tp:148;c",
+"^":"Tp:149;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"Tp:149;d",
+"^":"Tp:150;d",
 $2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
@@ -11532,11 +11587,11 @@
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
 ez:[function(a,b){var z=this.lF()
-return H.VM(new H.xy(z,b),[H.Kp(z,0),null])},"$1","gIr",2,0,150,31],
+return H.VM(new H.xy(z,b),[H.Kp(z,0),null])},"$1","gIr",2,0,151,31],
 ad:function(a,b){var z=this.lF()
 return H.VM(new H.U5(z,b),[H.Kp(z,0)])},
 lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.Kp(z,0),null])},"$1","git",2,0,151,31],
+return H.VM(new H.oA(z,b),[H.Kp(z,0),null])},"$1","git",2,0,152,31],
 ou:function(a,b){return this.lF().ou(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -11557,30 +11612,37 @@
 return z.gGc(z)},
 tt:function(a,b){return this.lF().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
+zH:function(a){var z,y
+z=this.lF()
+y=z.Ys()
+y.FV(0,z)
+return y},
 V1:function(a){this.OS(new P.uQ())},
 OS:function(a){var z,y
 z=this.lF()
 y=a.$1(z)
 this.p5(z)
 return y},
+$isxu:true,
+$asxu:function(){return[P.qU]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 GE:{
 "^":"Tp:13;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,152,"call"],
+$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,153,"call"],
 $isEH:true},
 rl:{
 "^":"Tp:13;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,152,"call"],
+$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,153,"call"],
 $isEH:true},
 PR:{
 "^":"Tp:13;a",
-$1:[function(a){return J.uY(a,this.a)},"$1",null,2,0,null,152,"call"],
+$1:[function(a){return J.uY(a,this.a)},"$1",null,2,0,null,153,"call"],
 $isEH:true},
 uQ:{
 "^":"Tp:13;",
-$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,152,"call"],
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,153,"call"],
 $isEH:true},
 D7:{
 "^":"ark;Yn,iz",
@@ -11644,14 +11706,14 @@
 else if(J.xC(J.eS(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.xC(J.eS(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
 return Q.xI.prototype.gJp.call(this,a)},
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,70],
+Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,71],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.cI(z).ml(new B.Ng(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,153,154,97],
+c.$0()}},"$2","gus",4,0,154,155,98],
 static:{lu:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11673,7 +11735,7 @@
 a.sdN(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.xP,z.tY,a)
-y.ct(z,C.xP,0,1)},"$1",null,2,0,null,139,"call"],
+y.ct(z,C.xP,0,1)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
@@ -11684,10 +11746,10 @@
 sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
 gCF:function(a){return a.Rr},
 sCF:function(a,b){a.Rr=this.ct(a,C.tg,a.Rr,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,104,105],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,106,108],
-Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,106,33],
-pA:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,20,97],
+vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,107,109],
+Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,107,33],
+pA:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,20,98],
 static:{CoW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11705,23 +11767,23 @@
 "^":"uL+Pi;",
 $isd3:true},
 wU:{
-"^":"Tp:109;a",
+"^":"Tp:110;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,91,"call"],
+z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 cL:{
-"^":"Tp:140;a",
+"^":"Tp:141;a",
 $1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,91,"call"],
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
 "^":"",
 L4:{
 "^":"V13;PM,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-pA:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,20,98],
 static:{p4t:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11756,7 +11818,7 @@
 "^":"V14;Cr,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,98],
 static:{Ch:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11791,7 +11853,7 @@
 "^":"V15;yR,mZ,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-pA:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,20,98],
 Lg:[function(a){J.cI(a.yR).YM(new E.Kv(a))},"$0","gW6",0,0,18],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
@@ -11816,7 +11878,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Kv:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -11824,7 +11886,7 @@
 "^":"V16;vd,mZ,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gPB:function(a){return a.vd},
 sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-pA:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,20,98],
 Lg:[function(a){J.cI(a.vd).YM(new E.uN(a))},"$0","gW6",0,0,18],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
@@ -11849,7 +11911,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 uN:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -11887,7 +11949,7 @@
 "^":"V17;Cr,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,98],
 static:{UE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11907,7 +11969,7 @@
 "^":"V18;uv,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-pA:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,20,98],
 static:{chF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11942,7 +12004,7 @@
 "^":"V19;Cr,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,98],
 static:{xK:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11962,7 +12024,7 @@
 "^":"V20;h1,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gHy:function(a){return a.h1},
 sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-pA:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,20,98],
 static:{iOo:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11982,7 +12044,7 @@
 "^":"V21;Cr,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,98],
 static:{Ii:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12017,7 +12079,7 @@
 "^":"V22;wT,mZ,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-pA:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,20,98],
 nK:[function(a){J.cI(a.wT).YM(new E.mj(a))},"$0","guT",0,0,18],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
@@ -12042,7 +12104,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 mj:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -12050,7 +12112,7 @@
 "^":"V23;Cr,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,98],
 static:{tX:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12092,7 +12154,7 @@
 gNN:function(a){return a.RX},
 Fn:function(a){return this.gNN(a).$0()},
 sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-pA:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,20,98],
 nK:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,18],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
@@ -12117,7 +12179,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Cc:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
@@ -12210,7 +12272,7 @@
 this.Zb(a)},
 m5:[function(a,b){this.pA(a,null)},"$1","gb6",2,0,20,57],
 pA:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,20,97],
+J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,20,98],
 Zb:function(a){if(a.oi==null)return
 this.GN(a)},
 GN:function(a){var z,y,x,w,v
@@ -12221,8 +12283,8 @@
 x=new H.XO(w,null)
 N.QM("").xH("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,98,99],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,98,99],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -12233,7 +12295,7 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gwJ",6,0,100,1,101,102],
+N.QM("").xH("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,1,102,103],
 static:{"^":"B6",jD:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12259,9 +12321,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"Tp:109;a",
+"^":"Tp:110;a",
 $1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,155,"call"],
+z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,156,"call"],
 $isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oa:{
@@ -12303,8 +12365,8 @@
 "^":"V27;ow,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,156,14],
-kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,156,14],
+Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,157,14],
+kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,157,14],
 static:{zr:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12322,13 +12384,13 @@
 $isd3:true},
 GG:{
 "^":"Tp:13;a",
-$1:[function(a){return J.cI(this.a.ow)},"$1",null,2,0,null,139,"call"],
+$1:[function(a){return J.cI(this.a.ow)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 r8:{
 "^":"Tp:13;a",
 $1:[function(a){var z=this.a
 $.mf.x3(z.ow)
-return J.cI(z.ow)},"$1",null,2,0,null,139,"call"],
+return J.cI(z.ow)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 Qh:{
 "^":"V28;ow,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
@@ -12457,7 +12519,7 @@
 god:function(a){return a.ck},
 sod:function(a,b){a.ck=this.ct(a,C.rB,a.ck,b)},
 vV:[function(a,b){var z=a.ck
-return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,104,105],
+return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
 Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,18],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.ts=P.rT(P.ii(0,0,0,0,0,1),this.gJD(a))},
@@ -12466,10 +12528,10 @@
 z=a.ts
 if(z!=null){z.ed()
 a.ts=null}},
-pA:[function(a,b){J.cI(a.ck).YM(b)},"$1","gvC",2,0,20,97],
-j9:[function(a,b){J.eg(a.ck).YM(b)},"$1","gDX",2,0,20,97],
-Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,156,14],
-kf:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,156,14],
+pA:[function(a,b){J.cI(a.ck).YM(b)},"$1","gvC",2,0,20,98],
+j9:[function(a,b){J.eg(a.ck).YM(b)},"$1","gDX",2,0,20,98],
+Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,157,14],
+kf:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,157,14],
 static:{Qtp:function(a){var z,y,x
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -12500,15 +12562,15 @@
 y.YT=v
 w.u(0,"isStacked",!0)
 y.YT.bG.u(0,"connectSteps",!1)
-y.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.YT.W2(y.X6)}if(z.ts!=null)z.ts=P.rT(P.ii(0,0,0,0,0,1),J.OY(z))},"$1",null,2,0,null,157,"call"],
+y.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.YT.W2(y.X6)}if(z.ts!=null)z.ts=P.rT(P.ii(0,0,0,0,0,1),J.OY(z))},"$1",null,2,0,null,158,"call"],
 $isEH:true},
 CV:{
 "^":"Tp:13;a",
-$1:[function(a){return J.cI(this.a.ck)},"$1",null,2,0,null,139,"call"],
+$1:[function(a){return J.cI(this.a.ck)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 Vq:{
 "^":"Tp:13;a",
-$1:[function(a){return J.cI(this.a.ck)},"$1",null,2,0,null,139,"call"],
+$1:[function(a){return J.cI(this.a.ck)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 xh:{
@@ -12614,9 +12676,9 @@
 "^":"V33;iI,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,104,105],
-pA:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,20,97],
-j9:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,20,97],
+vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+pA:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,20,98],
+j9:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,20,98],
 static:{as:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12680,7 +12742,7 @@
 $isRw:true,
 static:{"^":"Uj",QM:function(a){return $.Iu().to(0,a,new N.aO(a))}}},
 aO:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
@@ -12723,23 +12785,23 @@
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e431())
+N.QM("").gSZ().yI(new F.e433())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
 z=J.UQ($.Si(),"google")
 y=$.Ib()
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e432())},
-e431:{
-"^":"Tp:159;",
+$.Ib().MM.ml(G.vN()).ml(new F.e434())},
+e433:{
+"^":"Tp:160;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,158,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,159,"call"],
 $isEH:true},
-e432:{
+e434:{
 "^":"Tp:13;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
@@ -12830,7 +12892,7 @@
 W1:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,110,1,101,102],
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,111,1,102,103],
 ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
 static:{ZC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -12979,7 +13041,7 @@
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 gBk:function(a){return a.Wx},
 sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,160,1,101,102],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,161,1,102,103],
 static:{zC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -13055,23 +13117,23 @@
 z=a.di
 if(z==null){this.Hq(a)
 return}a.o1=P.rT(z,this.gWE(a))},"$0","gWE",0,0,18],
-wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gRh",6,0,160,2,101,102],
+wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gRh",6,0,161,2,102,103],
 XD:[function(a,b){this.gi6(a).Z6
-return"#"+H.d(b)},"$1","gn0",2,0,161,162],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,163,164],
+return"#"+H.d(b)},"$1","gn0",2,0,162,163],
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,164,165],
 Ze:[function(a,b){return G.As(b)},"$1","gbJ",2,0,15,16],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,165,166],
-i5:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,165,166],
+uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,166,167],
+i5:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,166,167],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,165,166],
-RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,165,166],
-ze:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,165,166],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,165,166],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,165,166],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,166,167],
+RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,166,167],
+ze:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,166,167],
+wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,166,167],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,166,167],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,165,166],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,165,166],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,165,166],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,166,167],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,166,167],
+AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,166,167],
 static:{EE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -13109,7 +13171,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,119],
+return!0}return!1},"$0","gDx",0,0,120],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -13156,14 +13218,14 @@
 z=new O.YC(z)
 return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
 YC:{
-"^":"Tp:167;a",
+"^":"Tp:168;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
 a.RK(b,new O.aR(z))},
 $isEH:true},
 aR:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){this.a.a=!1
 O.N0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -13173,12 +13235,12 @@
 return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
 $isEH:true},
 HF:{
-"^":"Tp:70;c,d,e,f",
+"^":"Tp:71;c,d,e,f",
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 hw:{
-"^":"Tp:168;UI",
+"^":"Tp:169;UI",
 $4:[function(a,b,c,d){if(d==null)return d
 return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
 $isEH:true},
@@ -13456,7 +13518,7 @@
 this.gme(a).push(b)},
 $isd3:true},
 X6:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
 y=$.cp().jD(z,a)
@@ -13641,7 +13703,7 @@
 if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,119],
+return!0}return!1},"$0","gL6",0,0,120],
 $iswn:true,
 static:{ch:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -13678,7 +13740,7 @@
 "^":"ark+Pi;",
 $isd3:true},
 OA:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:function(){this.a.iT=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
@@ -13749,11 +13811,11 @@
 return y}}},
 zT:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,21,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a,b){return{func:"VfV",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){var z=this.a
 z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
 $isEH:true}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
@@ -13787,7 +13849,7 @@
 if(a==null)return
 z=b
 if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$isGD){z=a
-y=H.RB(z,"$isHX",[P.qU,null],"$asHX")
+y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
 z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
@@ -13799,7 +13861,7 @@
 z=x.$1(z)
 return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.Jk(a)
 v=$.mX().F1(z,C.OV)
-if(!(v!=null&&v.fY===C.WH&&!v.Fo))throw w}else throw w}}z=$.YV()
+if(!(v!=null&&v.fY===C.hU&&!v.Fo))throw w}else throw w}}z=$.YV()
 if(z.mL(C.D8))z.kS("can't get "+H.d(b)+" in "+H.d(a))
 return},
 iu:function(a,b,c){var z,y,x
@@ -13807,7 +13869,7 @@
 z=b
 if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
 return!0}}else if(!!J.x(b).$isGD){z=a
-y=H.RB(z,"$isHX",[P.qU,null],"$asHX")
+y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
 z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
@@ -13928,14 +13990,14 @@
 $isEH:true},
 f7:{
 "^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isGD?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,152,"call"],
+$1:[function(a){return!!J.x(a).$isGD?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,153,"call"],
 $isEH:true},
 TV:{
 "^":"Tv;OK",
 gPu:function(){return!1},
 static:{"^":"qa"}},
 YJG:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true},
 ww:{
@@ -14045,7 +14107,7 @@
 b.nf(this.gTT(this))},
 we:[function(a,b){var z=J.x(b)
 if(!!z.$iswn)this.wq(b.gQV())
-if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,169,91],
+if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,170,92],
 wq:function(a){var z,y
 if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
 z=this.HN
@@ -14064,7 +14126,7 @@
 t9:[function(a){var z,y
 for(z=this.yj,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 if(y.ga8())y.tF()}this.op=!0
-P.rb(this.gTh(this))},"$1","gCP",2,0,20,170],
+P.rb(this.gTh(this))},"$1","gCP",2,0,20,171],
 static:{"^":"xG",SE:function(a,b){var z,y
 z=$.xG
 if(z!=null){y=z.kTd
@@ -14083,8 +14145,8 @@
 x.FV(0,z)
 return x}return a},"$1","Ft",2,0,13,21],
 Qe:{
-"^":"Tp:78;a",
-$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,129,64,"call"],
+"^":"Tp:79;a",
+$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,130,64,"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 YG:function(a,b,c){if(a==null||$.AM()==null)return
@@ -14108,7 +14170,7 @@
 z=$.Mg().ep.t(0,a)
 if(z==null)return!1
 y=J.rY(z)
-return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","Xm",2,0,62,63],
+return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,62,63],
 Ad:function(a,b){$.Ej().u(0,a,b)
 H.Go(J.UQ($.Si(),"Polymer"),"$isr7").PO([a])},
 h6:function(a,b){var z,y,x,w
@@ -14179,7 +14241,7 @@
 s=this.Q7
 if(s!=null&&s.x4(0,t))continue
 r=$.mX().CV(z,u)
-if(r==null||r.fY===C.WH||r.V5){window
+if(r==null||r.fY===C.hU||r.V5){window
 s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
 if(typeof console!="undefined")console.warn(s)
 continue}s=this.Q7
@@ -14272,11 +14334,11 @@
 $1:function(a){return a.gvn()},
 $isEH:true},
 eY:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){if(C.n7.x4(0,a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
 $isEH:true},
 BO:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).kJ(b,"{{")
@@ -14292,11 +14354,11 @@
 $1:function(a){return J.RF(a,this.a)},
 $isEH:true},
 XUG:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){return[]},
 $isEH:true},
 Tj:{
-"^":"Tp:171;a",
+"^":"Tp:172;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 Li:{
@@ -14337,7 +14399,7 @@
 J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 li:{
-"^":"Tp:175;a,b,c",
+"^":"Tp:176;a,b,c",
 $3:[function(a,b,c){var z,y,x,w
 z=this.c
 y=this.b.Y2(null,b,z)
@@ -14345,7 +14407,7 @@
 w=H.VM(new W.Ov(0,x.DK,x.Ph,W.aF(y),x.Sg),[H.Kp(x,0)])
 w.Zz()
 if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,172,173,174,"call"],
+return new A.d6(w,z)},"$3",null,6,0,null,173,174,175,"call"],
 $isEH:true},
 d6:{
 "^":"Yj;Jq,ED",
@@ -14439,7 +14501,7 @@
 z=this.er(a)
 y=this.gUj(a)
 x=!!J.x(b).$isvy?b:M.SB(b)
-w=J.Yb(x,a,y==null&&J.Xp(x)==null?J.du(a.IX):y)
+w=J.Yb(x,a,y==null&&J.fx(x)==null?J.du(a.IX):y)
 v=$.vH().t(0,w)
 u=v!=null?v.gu2():v
 a.Sa.push(u)
@@ -14468,7 +14530,7 @@
 x=J.x(v)
 u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.eP))&&w!=null?J.Jk(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,176],
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,177],
 B2:function(a,b){var z=a.IX.gNF()
 if(z==null)return
 return z.t(0,b)},
@@ -14537,14 +14599,14 @@
 for(y=H.VM(new P.fG(z),[H.Kp(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.Kp(y,0)]);y.G();){v=y.fD
 x.yN(a,v)
 this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.qz(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gnu",6,0,177],
+FQ:[function(a,b,c,d){J.Me(c,new A.qz(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gnu",6,0,178],
 HT:[function(a,b){var z,y,x,w,v
 for(z=J.mY(b);z.G();){y=z.gl()
 if(!J.x(y).$isqI)continue
 x=y.oc
 w=$.Mg().ep.t(0,x)
 v=a.IX.gBj()
-if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gqY",2,0,178,170],
+if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gqY",2,0,179,171],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.JR(a.IX)
 if(z==null)return
@@ -14564,7 +14626,7 @@
 a.q9=v}v.u(0,x,w)}},
 rB:[function(a,b){var z,y
 for(z=J.mY(b);z.G();){y=z.gl()
-if(y!=null)J.yd(y)}},"$1","ghb",2,0,179],
+if(y!=null)J.yd(y)}},"$1","ghb",2,0,180],
 iQ:function(a,b){var z=a.q9.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -14612,17 +14674,17 @@
 $1:[function(a){return},"$1",null,2,0,null,14,"call"],
 $isEH:true},
 Sv:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){var z=J.Vs(this.a)
 if(z.x4(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
 z.t(0,a)},
 $isEH:true},
 Te4:{
-"^":"Tp:70;b",
+"^":"Tp:71;b",
 $0:function(){return this.b},
 $isEH:true},
 qz:{
-"^":"Tp:78;a,b,c,d,e,f",
+"^":"Tp:79;a,b,c,d,e,f",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=this.b
 y=J.UQ(z,a)
@@ -14638,16 +14700,16 @@
 for(w=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;w.G();){p=w.gl()
 if(!q.h(0,p))continue
 s.rJ(t,v,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,92,57,"call"],
+$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,93,57,"call"],
 $isEH:true},
 Y0:{
 "^":"Tp:13;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,180,"call"],
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,181,"call"],
 $isEH:true},
 SX:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){var z,y
 z=this.a
 y=J.Ei(z).t(0,a)
@@ -14665,7 +14727,7 @@
 v=w.$1(z)
 z=this.dY
 if(z==null?v!=null:z!==v)J.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,178,170],
+return}}},"$1","gXQ",2,0,179,171],
 TR:function(a,b){return J.mu(this.q0,b)},
 gP:function(a){return J.Vm(this.q0)},
 sP:function(a,b){J.ta(this.q0,b)
@@ -14697,24 +14759,24 @@
 z.Ws()}return},"$1",null,2,0,null,14,"call"],
 $isEH:true},
 mS:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 hp:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:[function(){var z=$.iF().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"Tp:183;a,b",
+"^":"Tp:184;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
 if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.vE().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,181,56,182,"call"],
+return this.b.qP([b,c],a)},"$3",null,6,0,null,182,56,183,"call"],
 $isEH:true},
 zR:{
-"^":"Tp:70;c,d,e,f",
+"^":"Tp:71;c,d,e,f",
 $0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=this.c
 y=this.d
@@ -14731,7 +14793,7 @@
 t.I9()
 s=J.RE(z)
 r=s.Wk(z,"template")
-if(r!=null)J.Co(!!J.x(r).$isvy?r:M.SB(r),v)
+if(r!=null)J.NA(!!J.x(r).$isvy?r:M.SB(r),v)
 t.Mi()
 t.f6()
 t.OL()
@@ -14768,7 +14830,7 @@
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 Md:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){var z=J.UQ(P.HU(document.createElement("polymer-element",null)),"__proto__")
 return!!J.x(z).$isKV?P.HU(z):z},
 $isEH:true}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
@@ -14776,17 +14838,17 @@
 q6:{
 "^":"wc;Hf,ro,dUC,pt,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gk8:function(a){return J.ZH(a.Hf)},
-gzH:function(a){return J.Xp(a.Hf)},
-szH:function(a,b){J.Co(a.Hf,b)},
+gG5:function(a){return J.fx(a.Hf)},
+sG5:function(a,b){J.NA(a.Hf,b)},
 V1:function(a){return J.Z8(a.Hf)},
-gUj:function(a){return J.Xp(a.Hf)},
+gUj:function(a){return J.fx(a.Hf)},
 ZK:function(a,b,c){return J.Yb(a.Hf,b,c)},
 ea:function(a,b,c,d){return A.zs.prototype.ea.call(this,a,b===a?J.ZH(a.Hf):b,c,d)},
 dX:function(a){var z
 this.Pa(a)
 a.Hf=M.SB(a)
 z=T.GF(null,C.qY)
-J.Co(a.Hf,new Y.zp(a,z,null))
+J.NA(a.Hf,new Y.zp(a,z,null))
 $.iF().MM.ml(new Y.zl(a))},
 $isDT:true,
 $isvy:true,
@@ -14838,26 +14900,26 @@
 return y}catch(x){H.Ru(x)
 return a}},
 lP:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a},
 $isEH:true},
 Uf:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a},
 $isEH:true},
 Ra:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){var z,y
 try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
 wJY:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
 zOQ:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return H.BU(a,null,new Z.fT(b))},
 $isEH:true},
 fT:{
@@ -14865,7 +14927,7 @@
 $1:function(a){return this.a},
 $isEH:true},
 W6o:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return H.RR(a,new Z.Lf(b))},
 $isEH:true},
 Lf:{
@@ -14888,7 +14950,7 @@
 $isEH:true},
 k9:{
 "^":"Tp:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,129,"call"],
+$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,130,"call"],
 $isEH:true},
 QB:{
 "^":"VE;VA,jw,iX,WK,cJ",
@@ -14947,33 +15009,33 @@
 x.FV(0,C.va)
 return new T.QB(b,x,z,y,null)}}},
 qb:{
-"^":"Tp:184;b,c,d",
+"^":"Tp:185;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
 z.WK.u(0,b,this.c)
 y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
 z.iX.u(0,b,y)
 z=T.kR()
-return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,172,173,174,"call"],
+return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,173,174,175,"call"],
 $isEH:true},
 Xyb:{
-"^":"Tp:184;e,f",
+"^":"Tp:185;e,f",
 $3:[function(a,b,c){var z,y
 z=this.e
 y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
 z.iX.u(0,b,y)
 if(c===!0)return T.jF(this.f,y,null)
 z=T.kR()
-return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,172,173,174,"call"],
+return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,173,174,175,"call"],
 $isEH:true},
 Ddj:{
-"^":"Tp:184;a,UI,bK",
+"^":"Tp:185;a,UI,bK",
 $3:[function(a,b,c){var z,y
 z=this.UI.ey(b,a)
 if(c===!0)return T.jF(this.bK,z,this.a.a)
 y=this.a.a
 if(y==null)y=T.kR()
-return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,172,173,174,"call"],
+return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,173,174,175,"call"],
 $isEH:true},
 Wb:{
 "^":"Tp:13;a,b",
@@ -14982,7 +15044,7 @@
 y=this.b
 x=z.iX.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.dZ(a,z.jw)}else return z.ey(y,a)},"$1",null,2,0,null,172,"call"],
+return K.dZ(a,z.jw)}else return z.ey(y,a)},"$1",null,2,0,null,173,"call"],
 $isEH:true},
 uKo:{
 "^":"Tp:13;c,d,e",
@@ -14992,7 +15054,7 @@
 x=z.iX.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.fO(y).t1(w,a)},"$1",null,2,0,null,172,"call"],
+else return z.fO(y).t1(w,a)},"$1",null,2,0,null,173,"call"],
 $isEH:true},
 tI:{
 "^":"Yj;IM,eI,kG,Tu,T7,z0,IZ",
@@ -15002,7 +15064,7 @@
 z=this.IZ
 y=this.bh(a)
 this.IZ=y
-if(b!==!0&&this.Tu!=null&&!J.xC(z,y))this.tC(this.IZ)},function(a){return this.b9(a,!1)},"bU","$2$skipChanges","$1","gNB",2,3,185,186,64,187],
+if(b!==!0&&this.Tu!=null&&!J.xC(z,y))this.tC(this.IZ)},function(a){return this.b9(a,!1)},"bU","$2$skipChanges","$1","gNB",2,3,186,187,64,188],
 gP:function(a){if(this.Tu!=null)return this.IZ
 return T.jF(this.kG,this.IM,this.eI)},
 sP:function(a,b){var z,y,x,w,v
@@ -15046,8 +15108,8 @@
 x=new H.XO(v,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
 pI:{
-"^":"Tp:78;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.z0)+"': "+H.d(a),b)},"$2",null,4,0,null,1,152,"call"],
+"^":"Tp:79;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.z0)+"': "+H.d(a),b)},"$2",null,4,0,null,1,153,"call"],
 $isEH:true},
 yy:{
 "^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
@@ -15062,7 +15124,7 @@
 fg:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.ls,z.DA,a)},"$1",null,2,0,null,92,"call"],
+z.DA=F.Wi(z,C.ls,z.DA,a)},"$1",null,2,0,null,93,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
@@ -15093,67 +15155,67 @@
 if(y.x4(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
 y=x}return y},
 w10:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.ew(a,b)},
 $isEH:true},
 w11:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.bI(a,b)},
 $isEH:true},
 w12:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 w13:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.X9(a,b)},
 $isEH:true},
 w14:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.hh(a,b)},
 $isEH:true},
 w15:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w16:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w17:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a==null?b==null:a===b},
 $isEH:true},
 w18:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a==null?b!=null:a!==b},
 $isEH:true},
 w19:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.z8(a,b)},
 $isEH:true},
 w20:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 w21:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 w22:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
 w23:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
 w24:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
 w25:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.$1(a)
@@ -15177,8 +15239,8 @@
 t1:function(a,b){if(J.xC(a,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
 return new K.PO(this,a,b)},
 $isGK:true,
-$isHX:true,
-$asHX:function(){return[P.qU,P.a]}},
+$isCo:true,
+$asCo:function(){return[P.qU,P.a]}},
 nk:{
 "^":"GK;k8>",
 t:function(a,b){var z,y
@@ -15404,7 +15466,7 @@
 $isIp:true},
 Hv:{
 "^":"Tp:13;",
-$1:[function(a){return a.gzo()},"$1",null,2,0,null,92,"call"],
+$1:[function(a){return a.gzo()},"$1",null,2,0,null,93,"call"],
 $isEH:true},
 ev:{
 "^":"Ay0;Rl>,Hu,mm,uy,zo,P0",
@@ -15414,7 +15476,7 @@
 $isMm:true,
 $isIp:true},
 Ku:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){J.kW(a,J.A6(b).gzo(),b.gv4().gzo())
 return a},
 $isEH:true},
@@ -15445,11 +15507,11 @@
 $isIp:true},
 V8:{
 "^":"Tp:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.GC(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,180,"call"],
+$1:[function(a){if(J.nE1(a,new K.GC(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
 GC:{
 "^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,82,"call"],
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 mv:{
 "^":"Ay0;wz<,Hu,mm,uy,zo,P0",
@@ -15515,11 +15577,11 @@
 $isIp:true},
 fk:{
 "^":"Tp:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.WKb(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,180,"call"],
+$1:[function(a){if(J.nE1(a,new K.WKb(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
 WKb:{
 "^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,82,"call"],
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 iT:{
 "^":"Ay0;Tf<,Jn<,Hu,mm,uy,zo,P0",
@@ -15537,19 +15599,19 @@
 $isIp:true},
 tE:{
 "^":"Tp:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.GST(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,180,"call"],
+$1:[function(a){if(J.nE1(a,new K.zw(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
-GST:{
+zw:{
 "^":"Tp:13;d",
-$1:[function(a){return a.vP(this.d)},"$1",null,2,0,null,82,"call"],
+$1:[function(a){return a.vP(this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 na:{
 "^":"Tp:13;e,f,UI",
-$1:[function(a){if(J.nE1(a,new K.zw(this.UI))===!0)this.e.po(this.f)},"$1",null,2,0,null,180,"call"],
+$1:[function(a){if(J.nE1(a,new K.ey(this.UI))===!0)this.e.po(this.f)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
-zw:{
+ey:{
 "^":"Tp:13;bK",
-$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,82,"call"],
+$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 c3:{
 "^":"Ay0;Tf<,re<,Hu,mm,uy,zo,P0",
@@ -15577,12 +15639,12 @@
 $1:[function(a){return a.gzo()},"$1",null,2,0,null,46,"call"],
 $isEH:true},
 Sr:{
-"^":"Tp:188;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.ho(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,180,"call"],
+"^":"Tp:189;a,b,c",
+$1:[function(a){if(J.nE1(a,new K.ho(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
 ho:{
 "^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,82,"call"],
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 B03:{
 "^":"a;G1>",
@@ -15609,7 +15671,7 @@
 return 536870911&a+((16383&a)<<15>>>0)},
 tu:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,189,1,46]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,190,1,46]},
 Ip:{
 "^":"a;",
 $isIp:true},
@@ -15787,7 +15849,7 @@
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isNb:true},
 xs:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return U.C0C(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
@@ -15806,8 +15868,8 @@
 GI:function(a){return this.lx(a,null)},
 Te:function(){if(this.vi.lo==null){this.rp.toString
 return C.OL}var z=this.Yq()
-return z==null?null:this.G5(z,0)},
-G5:function(a,b){var z,y,x,w,v,u
+return z==null?null:this.mi(z,0)},
+mi:function(a,b){var z,y,x,w,v,u
 for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.rD()
 this.rp.toString
 a=new U.Nb(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
@@ -15857,7 +15919,7 @@
 w=v}else w=!1
 else w=!1
 if(!w)break
-x=this.G5(x,this.vi.lo.gP9())}y=y.gP(z)
+x=this.mi(x,this.vi.lo.gP9())}y=y.gP(z)
 this.rp.toString
 return new U.uku(y,a,x)},
 Yq:function(){var z,y,x,w
@@ -15875,10 +15937,10 @@
 z=new U.no(x)
 z.$builtinTypeInfo=[null]
 this.Bp()
-return z}else{w=this.G5(this.LL(),11)
+return z}else{w=this.mi(this.LL(),11)
 y.toString
 return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
-w=this.G5(this.LL(),11)
+w=this.mi(this.LL(),11)
 this.rp.toString
 return new U.cJ(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LL()},
 LL:function(){var z,y
@@ -15973,7 +16035,7 @@
 return y},
 xJ:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-RS:[function(a){return H.VM(new K.Bt(a),[null])},"$1","y8",2,0,66,67],
+C7:[function(a){return H.VM(new K.Bt(a),[null])},"$1","pg",2,0,66,67],
 Aep:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
@@ -16112,7 +16174,7 @@
 "^":"",
 P55:{
 "^":"a;",
-DV:[function(a){return J.NV(a,this)},"$1","gay",2,0,190,152]},
+DV:[function(a){return J.NV(a,this)},"$1","gay",2,0,191,153]},
 cfS:{
 "^":"P55;",
 xn:function(a){},
@@ -16175,7 +16237,7 @@
 rA:[function(a,b){this.mC(a)},"$1","gRq",2,0,20,57],
 DJ:[function(a,b){if(b==null)return"min-width:32px;"
 else if(J.xC(b,0))return"min-width:32px; background-color:red"
-return"min-width:32px; background-color:green"},"$1","gfq",2,0,15,191],
+return"min-width:32px; background-color:green"},"$1","gfq",2,0,15,192],
 mC:function(a){var z,y,x
 if(a.Oq!=null)return
 if(J.iS(a.oX)!==!0){a.Oq=J.SK(a.oX).ml(new T.Es(a))
@@ -16265,8 +16327,8 @@
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-pA:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,20,97],
-j9:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,20,97],
+pA:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,20,98],
+j9:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,20,98],
 static:{dI:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -16283,6 +16345,7 @@
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
+Xm:[function(a,b){return J.FW(J.O6(a),J.O6(b))},"$2","E0",4,0,68],
 Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q
 if(b==null)return
 z=J.U6(b)
@@ -16315,7 +16378,7 @@
 t.$builtinTypeInfo=[z]
 t=new Q.wn(null,null,t,null,null)
 t.$builtinTypeInfo=[z]
-s=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.dy(null,null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Code":z=[]
 z.$builtinTypeInfo=[D.Fc]
@@ -16453,10 +16516,10 @@
 if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
 this.mQ=x
 this.bF(0,a,y)},
-Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gLc",2,0,161,192],
+Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gLc",2,0,162,193],
 $isaf:true},
 Bf:{
-"^":"Tp:194;a",
+"^":"Tp:195;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -16464,25 +16527,25 @@
 y=this.a
 if(!J.xC(z,y.mQ))return D.Nl(y.P3,a)
 y.eC(a)
-return y},"$1",null,2,0,null,193,"call"],
+return y},"$1",null,2,0,null,194,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:70;b",
+"^":"Tp:71;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 boh:{
 "^":"a;",
 O5:function(a){J.Me(a,new D.P5())},
-Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,195]},
+Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,196]},
 P5:{
 "^":"Tp:13;",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,196,"call"],
+z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,197,"call"],
 $isEH:true},
 Rv:{
-"^":"Tp:194;a",
+"^":"Tp:195;a",
 $1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,193,"call"],
+z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,194,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -16493,7 +16556,7 @@
 giR:function(){var z=this.z7
 return z.gUQ(z)},
 gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,161,192],
+Mq:[function(a){return H.d(a)},"$1","gLc",2,0,162,193],
 gYe:function(a){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
@@ -16540,7 +16603,7 @@
 return this.B7(z).ml(new D.it(this,y))}x=this.Qy.t(0,a)
 if(x!=null)return J.cI(x)
 return this.jU(a).ml(new D.lb(this,a))},
-Ym:[function(a,b){return b},"$2","gcO",4,0,78],
+Ym:[function(a,b){return b},"$2","gcO",4,0,79],
 ng:function(a){var z,y,x
 z=null
 try{y=new P.c5(this.gcO())
@@ -16598,12 +16661,12 @@
 z=D.Nl(a,this.a.a)
 y=this.b.Rk
 if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)},"$1",null,2,0,null,197,"call"],
+y.Iv(z)},"$1",null,2,0,null,198,"call"],
 $isEH:true},
 MZ:{
 "^":"Tp:13;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,139,"call"],
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 it:{
 "^":"Tp:13;a,b",
@@ -16614,21 +16677,21 @@
 else return a.cv(z)},"$1",null,2,0,null,7,"call"],
 $isEH:true},
 lb:{
-"^":"Tp:194;c,d",
+"^":"Tp:195;c,d",
 $1:[function(a){var z,y
 z=this.c
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.d,new D.QZ(y))
-return y},"$1",null,2,0,null,193,"call"],
+return y},"$1",null,2,0,null,194,"call"],
 $isEH:true},
 QZ:{
-"^":"Tp:70;e",
+"^":"Tp:71;e",
 $0:function(){return this.e},
 $isEH:true},
 zA:{
 "^":"Tp:13;a",
 $1:[function(a){var z=this.a
-return z.N7(z.ng(a))},"$1",null,2,0,null,142,"call"],
+return z.N7(z.ng(a))},"$1",null,2,0,null,143,"call"],
 $isEH:true},
 tm:{
 "^":"Tp:13;b",
@@ -16646,14 +16709,14 @@
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,85,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,86,"call"],
 $isEH:true},
 hc:{
 "^":"Tp:13;",
 $1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Yu:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){J.cI(b)},
 $isEH:true},
 ER:{
@@ -16752,7 +16815,7 @@
 gA6:function(){return this.EY},
 gaj:function(){return this.eU},
 gMN:function(){return this.yP},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,161,192],
+Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,162,193],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -16774,7 +16837,7 @@
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,198,199],
+if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,199,200],
 Nze:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
@@ -16784,7 +16847,7 @@
 if(J.xC(x.gdN(),"Object")&&J.xC(x.gi2(),!1)){w=this.Wm
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,200,201],
+this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,201,202],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -16884,8 +16947,8 @@
 this.yv=F.Wi(this,C.yh,this.yv,y)
 y=this.tW
 y.V1(y)
-for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
-y.GT(y,new D.hU())},
+y.FV(0,z.t(b,"libraries"))
+y.GT(y,D.E0())},
 m7:function(){return this.P3.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
 aU:function(a,b){this.FF=0
 this.bj=a
@@ -16940,34 +17003,30 @@
 a.Oo.V1(0)}},
 $isEH:true},
 KQ:{
-"^":"Tp:194;a,b",
+"^":"Tp:195;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,193,"call"],
+return y},"$1",null,2,0,null,194,"call"],
 $isEH:true},
 Ea:{
-"^":"Tp:70;c",
+"^":"Tp:71;c",
 $0:function(){return this.c},
 $isEH:true},
 Qq:{
 "^":"Tp:13;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,202,"call"],
-$isEH:true},
-hU:{
-"^":"Tp:78;",
-$2:function(a,b){return J.FW(J.O6(a),J.O6(b))},
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,203,"call"],
 $isEH:true},
 AP:{
-"^":"Tp:194;a",
+"^":"Tp:195;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.GH
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,155,"call"],
+return y},"$1",null,2,0,null,156,"call"],
 $isEH:true},
 vO:{
 "^":"af;RF,P3,r0,mQ,kT,bN,t7,VR,AP,fn",
@@ -17003,7 +17062,7 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 HC:[function(a){var z=this.RF
-return z.HC(z)},"$0","gDx",0,0,119],
+return z.HC(z)},"$0","gDx",0,0,120],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
@@ -17140,19 +17199,26 @@
 D.kT(b,J.aT(this.P3))
 y=this.Bm
 y.V1(y)
-y.FV(0,z.t(b,"imports"))
+w=J.dF(z.t(b,"imports")).br(0)
+H.rd(w,D.E0())
+y.FV(0,w)
 y=this.XR
 y.V1(y)
-y.FV(0,z.t(b,"scripts"))
+w=J.dF(z.t(b,"scripts")).br(0)
+H.rd(w,D.E0())
+y.FV(0,w)
 y=this.DD
 y.V1(y)
 y.FV(0,z.t(b,"classes"))
+y.GT(y,D.E0())
 y=this.Z3
 y.V1(y)
 y.FV(0,z.t(b,"variables"))
+y.GT(y,D.E0())
 y=this.mu
 y.V1(y)
-y.FV(0,z.t(b,"functions"))},
+y.FV(0,z.t(b,"functions"))
+y.GT(y,D.E0())},
 $isU4:true},
 T5W:{
 "^":"af+boh;"},
@@ -17180,7 +17246,7 @@
 x.rT=F.Wi(x,C.hN,x.rT,y)},
 static:{"^":"jZx,xxx,qWF,oQ,S1O,wXu,WVi,Whu"}},
 dy:{
-"^":"cOr;Gz,ar,x8,Lh,vY,u0,J1,E8,qG,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,t7,VR,AP,fn",
+"^":"cOr;Gz,ar,x8,Lh,vY,u0,J1,E8,qG,TX,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,t7,VR,AP,fn",
 gHt:function(a){return this.Gz},
 sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
 gIs:function(a){return this.ar},
@@ -17191,6 +17257,8 @@
 gi2:function(){return this.J1},
 gVF:function(){return this.qG},
 sVF:function(a){this.qG=F.Wi(this,C.z6,this.qG,a)},
+gej:function(){return this.TX},
+sej:function(a){this.TX=F.Wi(this,C.Fe,this.TX,a)},
 gkc:function(a){return this.yv},
 skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
 gJL:function(){var z,y
@@ -17231,15 +17299,20 @@
 this.E8=F.Wi(this,C.Ih,this.E8,y)
 y=z.t(b,"tokenPos")
 this.qG=F.Wi(this,C.z6,this.qG,y)
+y=z.t(b,"endTokenPos")
+this.TX=F.Wi(this,C.Fe,this.TX,y)
 y=this.S5
 y.V1(y)
 y.FV(0,z.t(b,"subclasses"))
+y.GT(y,D.E0())
 y=this.tJ
 y.V1(y)
 y.FV(0,z.t(b,"fields"))
+y.GT(y,D.E0())
 y=this.mu
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
+y.GT(y,D.E0())
 y=z.t(b,"super")
 y=F.Wi(this,C.Cw,this.x8,y)
 this.x8=y
@@ -17383,7 +17456,7 @@
 z=this.LR
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,203],
+return y.bu(z)},"$0","gkA",0,0,204],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -17403,18 +17476,18 @@
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,203],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,204],
 io:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
 if(J.xC(z.gfF(),z.gPl()))return""
-return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,204,72],
+return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,205,73],
 HU:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-return D.dJ(z.gPl(),a.glt())+" ("+H.d(z.gPl())+")"},"$1","gGK",2,0,204,72],
+return D.dJ(z.gPl(),a.glt())+" ("+H.d(z.gPl())+")"},"$1","gGK",2,0,205,73],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -17442,7 +17515,7 @@
 WAE:{
 "^":"a;uX",
 bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
+static:{"^":"Oci,l8R,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
@@ -17474,7 +17547,7 @@
 gM8:function(){return!0},
 tx:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,205,206],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,206,207],
 OF:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.MO
@@ -17586,13 +17659,13 @@
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.gUH())},"$1",null,2,0,null,207,"call"],
+J.SK(y).ml(z.gUH())},"$1",null,2,0,null,208,"call"],
 $isEH:true},
 Cq:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.bI(b.gAv(),a.gAv())},
 $isEH:true},
-l8R:{
+M9x:{
 "^":"a;uX",
 bu:function(a){return this.uX},
 static:{"^":"Cnk,lTU,FJy,wr",B4:function(a){var z=J.x(a)
@@ -17654,7 +17727,7 @@
 "^":"af+Pi;",
 $isd3:true},
 Qf:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
@@ -17757,9 +17830,9 @@
 else this.JS.u(0,y,x)
 return z.MM},
 W4X:[function(a){this.CS()
-this.t3()},"$1","gxb",2,0,208,2],
+this.t3()},"$1","gxb",2,0,209,2],
 Wp:[function(a){this.CS()
-this.t3()},"$1","gpU",2,0,20,209],
+this.t3()},"$1","gpU",2,0,20,210],
 ML:[function(a){var z,y
 z=this.N
 y=Date.now()
@@ -17769,7 +17842,7 @@
 y=this.eG.MM
 if(y.Gv===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(this)}},"$1","gqM",2,0,20,209],
+y.OH(this)}},"$1","gqM",2,0,20,210],
 SS:[function(a){var z,y,x,w,v
 z=C.xr.kV(J.Qd(a))
 if(z==null){N.QM("").YX("WebSocketVM got empty message")
@@ -17783,7 +17856,7 @@
 if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
 return}y=v.gmh().MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(w)},"$1","ga9",2,0,210,2],
+y.OH(w)},"$1","ga9",2,0,211,2],
 z1:function(a){a.aN(0,new U.Fw(this))
 a.V1(0)},
 CS:function(){var z=this.S3
@@ -17801,10 +17874,10 @@
 if(!J.Vr(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.N.gw8()))
 this.S3.u(0,a,b)
 y=this.N.gA9()===!0?C.xr.KP(P.EF(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.EF(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.EF(["seq",a,"request",z.gjO(b)],null,null))
-this.bs.send(y)},"$2","gkB",4,0,211],
+this.bs.send(y)},"$2","gkB",4,0,212],
 $isKM:true},
 Fw:{
-"^":"Tp:212;a",
+"^":"Tp:213;a",
 $2:function(a,b){var z,y
 z=b.gmh()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
@@ -17826,7 +17899,7 @@
 z=this.S3
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,73],
+J.KD(v,w)},"$1","gVx",2,0,20,74],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -18015,7 +18088,7 @@
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
 RC:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,110,1,213,102],
+a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,111,1,214,103],
 static:{Sm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -18050,7 +18123,7 @@
 "^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
 gZI:function(){return this.fY===C.nU},
 gUd:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.WH},
+gUA:function(){return this.fY===C.hU},
 giO:function(a){var z=this.oc
 return z.giO(z)},
 n:function(a,b){if(b==null)return!1
@@ -18157,12 +18230,12 @@
 if(y==null){if(!this.AZ)return!1
 throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
 UK:function(a,b){var z=this.F1(a,b)
-return z!=null&&z.fY===C.WH&&!z.Fo},
+return z!=null&&z.fY===C.hU&&!z.Fo},
 n6:function(a,b){var z,y
 z=this.WF.t(0,a)
 if(z==null){if(!this.AZ)return!1
 throw H.b(O.lA("declarations for "+H.d(a)))}y=z.t(0,b)
-return y!=null&&y.fY===C.WH&&y.Fo},
+return y!=null&&y.fY===C.hU&&y.Fo},
 CV:function(a,b){var z=this.F1(a,b)
 if(z==null){if(!this.AZ)return
 throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
@@ -18193,7 +18266,7 @@
 z.Ut(a)
 return z}}},
 m8:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){this.a.Nz.u(0,b,a)},
 $isEH:true},
 tk:{
@@ -18225,7 +18298,7 @@
 "^":"V51;ju,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gtN:function(a){return a.ju},
 stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-pA:[function(a,b){J.cI(a.ju).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.ju).YM(b)},"$1","gvC",2,0,20,98],
 static:{HI:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -18235,8 +18308,8 @@
 a.XN=!1
 a.Xy=z
 a.ZQ=y
-C.wB.ZL(a)
-C.wB.XI(a)
+C.uC.ZL(a)
+C.uC.XI(a)
 return a}}},
 V51:{
 "^":"uL+Pi;",
@@ -18266,7 +18339,7 @@
 z=b.appendChild(J.Ha(c,a,!1))
 for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.JW(w):null,e,f,g,null)
 if(d.ghK()){M.SB(z).bt(a)
-if(f!=null)J.Co(M.SB(z),f)}M.mV(z,d,e,g)
+if(f!=null)J.NA(M.SB(z),f)}M.mV(z,d,e,g)
 return z},
 tA:function(a){var z
 for(;z=J.TmB(a),z!=null;a=z);return a},
@@ -18481,7 +18554,7 @@
 return x.ad(x,new M.y4(a))}},h5:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 Ufa:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -18646,8 +18719,8 @@
 r.Ci=null
 return s},
 gk8:function(a){return this.Q2},
-gzH:function(a){return this.nF},
-szH:function(a,b){var z
+gG5:function(a){return this.nF},
+sG5:function(a,b){var z
 if(this.nF!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
 this.nF=b
 this.VZ=null
@@ -18765,7 +18838,7 @@
 "^":"Tp:13;a",
 $1:[function(a){var z=this.a
 J.Vs(z.rF).MW.setAttribute("ref",a)
-z.aX()},"$1",null,2,0,null,214,"call"],
+z.aX()},"$1",null,2,0,null,215,"call"],
 $isEH:true},
 yi:{
 "^":"Tp:20;",
@@ -18773,15 +18846,15 @@
 $isEH:true},
 MdQ:{
 "^":"Tp:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,129,"call"],
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,130,"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).aX()},"$2",null,4,0,null,170,14,"call"],
+for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).aX()},"$2",null,4,0,null,171,14,"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){var z=document.createDocumentFragment()
 $.vH().u(0,z,new M.Fi([],null,null,null))
 return z},
@@ -18793,7 +18866,7 @@
 $1:function(a){return this.c.US(a,this.a,this.b)},
 $isEH:true},
 Uk:{
-"^":"Tp:78;a,b,c,d",
+"^":"Tp:79;a,b,c,d",
 $2:function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
@@ -18888,7 +18961,7 @@
 Q.Y5(s,this.S6,a)
 z=u.nF
 if(!this.Wv){this.Wv=!0
-r=J.Xp(!!J.x(u.rF).$isDT?u.rF:u)
+r=J.fx(!!J.x(u.rF).$isDT?u.rF:u)
 if(r!=null){this.eY=r.Mn.CE(t)
 this.TC=null}}q=P.YM(P.N3R(),null,null,null,null)
 for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
@@ -18916,7 +18989,7 @@
 f=this.xS(h-1)
 e=J.TmB(u.rF)
 C.Nm.xe(this.Rj,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Kp(u,0),H.Kp(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,215,216],
+e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Kp(u,0),H.Kp(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,216,217],
 Ep:[function(a){var z,y,x
 z=$.vH()
 z.toString
@@ -18924,7 +18997,7 @@
 x=(y==null?null:H.of(y,z.J4())).gu2()
 z=new H.a7(x,x.length,0,null)
 z.$builtinTypeInfo=[H.Kp(x,0)]
-for(;z.G();)J.yd(z.lo)},"$1","gMR",2,0,217],
+for(;z.G();)J.yd(z.lo)},"$1","gMR",2,0,218],
 Ke:function(){var z=this.VC
 if(z==null)return
 z.ed()
@@ -18999,7 +19072,7 @@
 x=z.length
 w=C.jn.cU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","geb",2,0,218,21],
+return y+H.d(z[w])},"$1","geb",2,0,219,21],
 Xb:[function(a){var z,y,x,w,v,u,t,s
 z=this.iB
 if(0>=z.length)return H.e(z,0)
@@ -19010,7 +19083,7 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,219,220],
+y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,220,221],
 l3:function(a,b){this.UV=this.iB.length===5?this.geb():this.gqt()},
 static:{"^":"rz5,xN8,t3a,epG,oM,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
@@ -19061,7 +19134,7 @@
 y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
 z.swv(0,y)}w=J.Vs(d).MW.getAttribute("href")
-$.mf.Z6.bo(0,w)},"$3","gkD",6,0,160,2,101,173],
+$.mf.Z6.bo(0,w)},"$3","gkD",6,0,161,2,102,174],
 MeB:[function(a,b,c,d){var z,y,x,w
 z=$.mf.m2
 y=a.P5
@@ -19069,8 +19142,8 @@
 x.Rz(0,y)
 z.XT()
 z.XT()
-w=z.Ys.IU+".history"
-$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,160,2,101,173],
+w=z.wu.IU+".history"
+$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,161,2,102,174],
 static:{fXx:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -19105,9 +19178,9 @@
 x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.mf.Z6.bo(0,"#/vm")},"$3","gMt",6,0,110,1,101,102],
+$.mf.Z6.bo(0,"#/vm")},"$3","gMt",6,0,111,1,102,103],
 qf:[function(a,b,c,d){J.Kr(b)
-this.Vf(a)},"$3","gzG",6,0,110,1,101,102],
+this.Vf(a)},"$3","gzG",6,0,111,1,102,103],
 Vf:function(a){G.FI(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
 Kq:function(a){var z=P.ii(0,0,0,0,0,1)
 a.di=this.ct(a,C.O9,a.di,z)},
@@ -19143,7 +19216,7 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,221,"call"],
+J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,222,"call"],
 $isEH:true},
 oU:{
 "^":"Tp:13;b",
@@ -19152,7 +19225,7 @@
 "^":"",
 I5:{
 "^":"xI;tY,Pe,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{pn:function(a){var z,y
+static:{vC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -19172,7 +19245,7 @@
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-pA:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,20,98],
 static:{oH:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -19301,6 +19374,8 @@
 W.Hy.$isHy=true
 W.Hy.$isea=true
 W.Hy.$isa=true
+P.xu.$isQV=true
+P.xu.$isa=true
 P.a2.$isa2=true
 P.a2.$isa=true
 W.fJ.$isa=true
@@ -19470,7 +19545,6 @@
 J.CN=function(a){return J.RE(a).gd0(a)}
 J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
 J.Cm=function(a){return J.RE(a).gvC(a)}
-J.Co=function(a,b){return J.RE(a).szH(a,b)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
 J.DB=function(a){return J.RE(a).gn0(a)}
 J.DF=function(a,b){return J.RE(a).soc(a,b)}
@@ -19557,6 +19631,7 @@
 J.Mx=function(a){return J.RE(a).gks(a)}
 J.Mz=function(a){return J.RE(a).goE(a)}
 J.N1=function(a){return J.RE(a).Es(a)}
+J.NA=function(a,b){return J.RE(a).sG5(a,b)}
 J.NB=function(a){return J.RE(a).gHo(a)}
 J.NC=function(a){return J.RE(a).gHy(a)}
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
@@ -19661,7 +19736,6 @@
 J.XJ=function(a){return J.RE(a).gRY(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
 J.Xi=function(a){return J.RE(a).gr9(a)}
-J.Xp=function(a){return J.RE(a).gzH(a)}
 J.YH=function(a){return J.RE(a).gpM(a)}
 J.YQ=function(a){return J.RE(a).gPL(a)}
 J.Yb=function(a,b,c){return J.RE(a).ZK(a,b,c)}
@@ -19708,6 +19782,7 @@
 J.cs=function(a){return J.RE(a).gwJ(a)}
 J.d5=function(a){return J.Wx(a).gKy(a)}
 J.d7=function(a){return J.RE(a).giG(a)}
+J.dF=function(a){return J.w1(a).zH(a)}
 J.dY=function(a){return J.RE(a).ga4(a)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
@@ -19730,6 +19805,7 @@
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fv=function(a,b){return J.RE(a).sUx(a,b)}
 J.fw=function(a){return J.RE(a).gEl(a)}
+J.fx=function(a){return J.RE(a).gG5(a)}
 J.fy=function(a){return J.RE(a).gIF(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
@@ -19897,7 +19973,7 @@
 C.Gkp=Y.q6.prototype
 C.Mw=B.G6.prototype
 C.HR=A.wM.prototype
-C.YZ=Q.eW.prototype
+C.YZz=Q.eW.prototype
 C.RD=O.eo.prototype
 C.ka=Z.aC.prototype
 C.tWO=O.VY.prototype
@@ -19966,7 +20042,7 @@
 C.t5=W.BH3.prototype
 C.BH=V.F1.prototype
 C.Pfz=Z.uL.prototype
-C.Sx=J.Ai.prototype
+C.Sx=J.iCW.prototype
 C.Ki=A.xc.prototype
 C.Fa=T.ov.prototype
 C.Wa=A.kn.prototype
@@ -19977,7 +20053,7 @@
 C.HRc=Q.xI.prototype
 C.zb=Q.CY.prototype
 C.dX=K.nm.prototype
-C.wB=X.uw.prototype
+C.uC=X.uw.prototype
 C.OKl=A.G1.prototype
 C.vB=J.kdQ.prototype
 C.hj=V.D2.prototype
@@ -20002,7 +20078,7 @@
 C.Z7=new D.WAE("Tag")
 C.nU=new A.iYn(0)
 C.BM=new A.iYn(1)
-C.WH=new A.iYn(2)
+C.hU=new A.iYn(2)
 C.hf=new H.IN("label")
 C.Gh=H.IL('qU')
 C.B10=new K.vly()
@@ -20024,19 +20100,19 @@
 C.UL=new H.IN("profileChanged")
 C.yQP=H.IL('EH')
 C.dn=I.uL([])
-C.mM=new A.ES(C.UL,C.WH,!1,C.yQP,!1,C.dn)
+C.mM=new A.ES(C.UL,C.hU,!1,C.yQP,!1,C.dn)
 C.Ql=new H.IN("hasClass")
 C.HL=H.IL('a2')
 C.J19=new K.nd()
 C.esx=I.uL([C.B10,C.J19])
 C.TJ=new A.ES(C.Ql,C.BM,!1,C.HL,!1,C.esx)
 C.TU=new H.IN("endPosChanged")
-C.Cp=new A.ES(C.TU,C.WH,!1,C.yQP,!1,C.dn)
+C.Cp=new A.ES(C.TU,C.hU,!1,C.yQP,!1,C.dn)
 C.ne=new H.IN("exception")
 C.SNu=H.IL('EP')
 C.rZ=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.ucP)
 C.Wm=new H.IN("refChanged")
-C.QW=new A.ES(C.Wm,C.WH,!1,C.yQP,!1,C.dn)
+C.QW=new A.ES(C.Wm,C.hU,!1,C.yQP,!1,C.dn)
 C.UY=new H.IN("result")
 C.SmN=H.IL('af')
 C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
@@ -20056,9 +20132,9 @@
 C.a2p=H.IL('bv')
 C.xY=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.esx)
 C.bz=new H.IN("isolateChanged")
-C.Bk=new A.ES(C.bz,C.WH,!1,C.yQP,!1,C.dn)
+C.Bk=new A.ES(C.bz,C.hU,!1,C.yQP,!1,C.dn)
 C.CG=new H.IN("posChanged")
-C.Ml=new A.ES(C.CG,C.WH,!1,C.yQP,!1,C.dn)
+C.Ml=new A.ES(C.CG,C.hU,!1,C.yQP,!1,C.dn)
 C.yh=new H.IN("error")
 C.oUD=H.IL('N7')
 C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
@@ -20073,7 +20149,7 @@
 C.He=new H.IN("hideTagsChecked")
 C.oV=new A.ES(C.He,C.BM,!1,C.HL,!1,C.esx)
 C.ba=new H.IN("pollPeriodChanged")
-C.kQ=new A.ES(C.ba,C.WH,!1,C.yQP,!1,C.dn)
+C.kQ=new A.ES(C.ba,C.hU,!1,C.yQP,!1,C.dn)
 C.zz=new H.IN("timeSpan")
 C.lS=new A.ES(C.zz,C.BM,!1,C.Gh,!1,C.esx)
 C.AO=new H.IN("qualifiedName")
@@ -20083,13 +20159,13 @@
 C.kw=new H.IN("trace")
 C.oC=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.ucP)
 C.qX=new H.IN("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.WH,!1,C.yQP,!1,C.dn)
+C.dO=new A.ES(C.qX,C.hU,!1,C.yQP,!1,C.dn)
 C.UX=new H.IN("msg")
 C.Pt=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.ucP)
 C.pO=new H.IN("functionChanged")
-C.au=new A.ES(C.pO,C.WH,!1,C.yQP,!1,C.dn)
+C.au=new A.ES(C.pO,C.hU,!1,C.yQP,!1,C.dn)
 C.rP=new H.IN("mapChanged")
-C.Nt=new A.ES(C.rP,C.WH,!1,C.yQP,!1,C.dn)
+C.Nt=new A.ES(C.rP,C.hU,!1,C.yQP,!1,C.dn)
 C.bk=new H.IN("checked")
 C.Ud=new A.ES(C.bk,C.BM,!1,C.HL,!1,C.ucP)
 C.kV=new H.IN("link")
@@ -20150,7 +20226,7 @@
 C.pH=new H.IN("small")
 C.Fk=new A.ES(C.pH,C.BM,!1,C.HL,!1,C.ucP)
 C.ox=new H.IN("countersChanged")
-C.Rh=new A.ES(C.ox,C.WH,!1,C.yQP,!1,C.dn)
+C.Rh=new A.ES(C.ox,C.hU,!1,C.yQP,!1,C.dn)
 C.XM=new H.IN("path")
 C.Tt=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.ucP)
 C.bJ=new H.IN("counters")
@@ -20161,7 +20237,7 @@
 C.Ys=new H.IN("pad")
 C.Ce=new A.ES(C.Ys,C.BM,!1,C.HL,!1,C.ucP)
 C.N8=new H.IN("scriptChanged")
-C.qE=new A.ES(C.N8,C.WH,!1,C.yQP,!1,C.dn)
+C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.dn)
 C.YT=new H.IN("expr")
 C.eP=H.IL('dynamic')
 C.LC=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.ucP)
@@ -20170,7 +20246,7 @@
 C.ak=new H.IN("hasParent")
 C.yI=new A.ES(C.ak,C.BM,!1,C.HL,!1,C.esx)
 C.xS=new H.IN("tagSelectorChanged")
-C.bB=new A.ES(C.xS,C.WH,!1,C.yQP,!1,C.dn)
+C.bB=new A.ES(C.xS,C.hU,!1,C.yQP,!1,C.dn)
 C.jU=new H.IN("file")
 C.bw=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.ucP)
 C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
@@ -20193,15 +20269,15 @@
 C.aP=new H.IN("active")
 C.xD=new A.ES(C.aP,C.BM,!1,C.HL,!1,C.ucP)
 C.Gn=new H.IN("objectChanged")
-C.az=new A.ES(C.Gn,C.WH,!1,C.yQP,!1,C.dn)
+C.az=new A.ES(C.Gn,C.hU,!1,C.yQP,!1,C.dn)
 C.vp=new H.IN("list")
 C.o0=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.ucP)
 C.i4=new H.IN("code")
 C.pM=H.IL('kx')
 C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
 C.kG=new H.IN("classTable")
-C.rX=H.IL('UC')
-C.Pr=new A.ES(C.kG,C.BM,!1,C.rX,!1,C.esx)
+C.m7I=H.IL('UC')
+C.Pr=new A.ES(C.kG,C.BM,!1,C.m7I,!1,C.esx)
 C.TN=new H.IN("lastServiceGC")
 C.Gj=new A.ES(C.TN,C.BM,!1,C.Gh,!1,C.esx)
 C.zd=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.ucP)
@@ -20218,7 +20294,7 @@
 C.WQ=new H.IN("field")
 C.ah=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.ucP)
 C.r1=new H.IN("expandChanged")
-C.nP=new A.ES(C.r1,C.WH,!1,C.yQP,!1,C.dn)
+C.nP=new A.ES(C.r1,C.hU,!1,C.yQP,!1,C.dn)
 C.Mc=new H.IN("flagList")
 C.f0=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.ucP)
 C.fn=new H.IN("instance")
@@ -20250,7 +20326,7 @@
 C.i3=H.VM(new W.FkO("input"),[W.ea])
 C.LF=H.VM(new W.FkO("load"),[W.kf])
 C.ph=H.VM(new W.FkO("message"),[W.Hy])
-C.uh=H.VM(new W.FkO("mousedown"),[W.AjY])
+C.Whw=H.VM(new W.FkO("mousedown"),[W.AjY])
 C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
 C.JL=H.VM(new W.FkO("open"),[W.ea])
 C.yf=H.VM(new W.FkO("popstate"),[W.f5])
@@ -20424,7 +20500,7 @@
 C.lx=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.Y1)
 C.CM=new H.Px(0,{},C.dn)
 C.MEG=I.uL(["enumerate"])
-C.va=new H.Px(1,{enumerate:K.y8()},C.MEG)
+C.va=new H.Px(1,{enumerate:K.pg()},C.MEG)
 C.tq=H.IL('Bo')
 C.uwj=H.IL('wA')
 C.wE=I.uL([C.uwj])
@@ -20432,10 +20508,10 @@
 C.uDk=H.IL('hG')
 C.tmF=I.uL([C.uDk])
 C.aj=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.tmF,null)
-C.wj=new D.l8R("Internal")
-C.Cn=new D.l8R("Listening")
-C.lT=new D.l8R("Normal")
-C.FJ=new D.l8R("Pipe")
+C.wj=new D.M9x("Internal")
+C.Cn=new D.M9x("Listening")
+C.lT=new D.M9x("Normal")
+C.FJ=new D.M9x("Pipe")
 C.BE=new H.IN("averageCollectionPeriodInMillis")
 C.IH=new H.IN("address")
 C.j2=new H.IN("app")
@@ -20463,6 +20539,7 @@
 C.f4=new H.IN("descriptors")
 C.aK=new H.IN("doAction")
 C.GP=new H.IN("element")
+C.Fe=new H.IN("endTokenPos")
 C.tP=new H.IN("entry")
 C.Zb=new H.IN("eval")
 C.u7=new H.IN("evalNow")
@@ -20618,7 +20695,7 @@
 C.Dl=H.IL('F1')
 C.Jf=H.IL('Mb')
 C.UJ=H.IL('oa')
-C.E0=H.IL('aI')
+C.uh=H.IL('aI')
 C.Y3=H.IL('CY')
 C.lU=H.IL('Hl')
 C.kq=H.IL('Nn')
@@ -20681,7 +20758,7 @@
 C.FG=H.IL('qh')
 C.bC=H.IL('D2')
 C.a8=H.IL('Zx')
-C.Fe=H.IL('zt')
+C.YZ=H.IL('zt')
 C.NR=H.IL('nm')
 C.DD=H.IL('Zn')
 C.qF=H.IL('mO')
@@ -20756,11 +20833,11 @@
 $.vU=null
 $.xV=null
 $.rK=!1
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.z1},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.Ir},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.BL,X.Nr,{created:X.Ak},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.dF},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.pn},C.jA,R.Eg,{created:R.Nd},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.lW},C.vu,X.uw,{created:X.HI},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.RP},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.NI},C.a8,A.Zx,{created:A.zC},C.NR,K.nm,{created:K.ant},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.nX,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.jRi,H.we,{"":H.ic},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.tX},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJm},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.nv},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.oS},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
+$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.z1},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.Ir},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.BL,X.Nr,{created:X.Ak},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Nd},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.lW},C.vu,X.uw,{created:X.HI},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.RP},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.NI},C.a8,A.Zx,{created:A.zC},C.NR,K.nm,{created:K.ant},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.nX,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.jRi,H.we,{"":H.ic},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.tX},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJm},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.nv},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.oS},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
 I.$lazy($,"globalWindow","UW","My",function(){return $.jk().window})
 I.$lazy($,"globalWorker","u9","rm",function(){return $.jk().Worker})
-I.$lazy($,"globalPostMessageDefined","Wdn","ey",function(){return $.jk().postMessage!==void 0})
+I.$lazy($,"globalPostMessageDefined","WH","wB",function(){return $.jk().postMessage!==void 0})
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
@@ -20800,7 +20877,7 @@
 I.$lazy($,"_ShadowCss","qP","AM",function(){var z=$.Kc()
 return z!=null?J.UQ(z,"ShadowCSS"):null})
 I.$lazy($,"_sheetLog","dz","QJ",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.Xm())})
+I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
 I.$lazy($,"_ATTRIBUTES_REGEX","mD","aQ",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Si(),"Platform")})
 I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
@@ -20831,8 +20908,8 @@
 I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.functionAliases={Sa:222}
-init.metadata=["sender","e","event","uri","onError",{func:"pd",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Cu",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"b1",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.dl,P.qK,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.qK,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"Ls",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"ie",ret:{func:"l4",args:[null]},args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"Ls",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"Ls",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"as",ret:P.Xa,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.dl,P.qK,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aYy,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.GD]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable","invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message","key","val",{func:"Ls",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"uC",args:[U.Z5,U.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"lv",args:[P.GD,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Ve",ret:P.KN,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"QO",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Yi",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"la",ret:P.QV,args:[P.qU]}]},"s",{func:"S0",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"xc",ret:P.a2,args:[P.qU]},"type",{func:"B4",args:[P.qK,P.dl]},{func:"Zg",args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"K7",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.Yj]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Qc",args:[U.Ip]},"hits","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer",{func:"I6a",ret:P.qU},{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"JQ",void:true,args:[W.BI]},"Event",{func:"WEz",void:true,args:[W.Hy]},{func:"T2",void:true,args:[P.qU,U.U2]},{func:"px",args:[P.qU,U.U2]},"details","ref",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"xh",void:true,args:[W.Aj]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
+init.functionAliases={Sa:223}
+init.metadata=["sender","e","event","uri","onError",{func:"pd",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Cu",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"b1",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.dl,P.qK,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.qK,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"Ls",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"ie",ret:{func:"l4",args:[null]},args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"Ls",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"Ls",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"as",ret:P.Xa,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.dl,P.qK,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aYy,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.GD]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Hc",ret:P.KN,args:[D.af,D.af]},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message","key","val",{func:"Ls",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"uC",args:[U.Z5,U.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"lv",args:[P.GD,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Ve",ret:P.KN,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"QO",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Yi",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"la",ret:P.QV,args:[P.qU]}]},"s",{func:"S0",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"xc",ret:P.a2,args:[P.qU]},"type",{func:"B4",args:[P.qK,P.dl]},{func:"Zg",args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"K7",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.Yj]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Qc",args:[U.Ip]},"hits","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer",{func:"I6a",ret:P.qU},{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"JQ",void:true,args:[W.BI]},"Event",{func:"WEz",void:true,args:[W.Hy]},{func:"T2",void:true,args:[P.qU,U.U2]},{func:"px",args:[P.qU,U.U2]},"details","ref",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"xh",void:true,args:[W.Aj]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index f629ff5..509875d 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -2496,6 +2496,7 @@
 
 
 
+
 <polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
@@ -3404,6 +3405,42 @@
 
 
 
+<polymer-element name="script-inset" extends="observatory-element">
+  <template>
+    <style>
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+      .grayBox {
+        width: 100%;
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+     }
+    </style>
+    <div class="sourceInset">
+      <content></content>
+      <div class="grayBox">
+        <table>
+          <tbody>
+            <tr template="" repeat="{{ lineNumber in lineNumbers }}">
+              <td style="{{ styleForHits(script.lines[lineNumber].hits) }}"><span>  </span></td>
+              <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{script.lines[lineNumber].line}}</td>
+              <td>&nbsp;</td>
+              <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{script.lines[lineNumber].text}}</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+  </template>
+</polymer-element>
+
+
+
+
+
 
 <polymer-element name="script-ref" extends="service-ref">
 <template>
@@ -4078,6 +4115,11 @@
     <div class="content">
       <eval-box callback="{{ eval }}"></eval-box>
     </div>
+
+    <hr>
+    <script-inset script="{{ cls.script }}" pos="{{ cls.tokenPos }}" endpos="{{ cls.endTokenPos }}">
+    </script-inset>
+
     <br><br><br><br>
     <br><br><br><br>
   </template>
@@ -6221,42 +6263,6 @@
 
 
 
-
-
-
-<polymer-element name="script-inset" extends="observatory-element">
-  <template>
-    <style>
-      .sourceInset {
-        padding-left: 15%;
-        padding-right: 15%;
-      }
-      .grayBox {
-        width: 100%;
-        background-color: #f5f5f5;
-        border: 1px solid #ccc;
-        padding: 10px;
-     }
-    </style>
-    <div class="sourceInset">
-      <content></content>
-      <div class="grayBox">
-        <table>
-          <tbody>
-            <tr template="" repeat="{{ lineNumber in lineNumbers }}">
-              <td style="{{ styleForHits(script.lines[lineNumber].hits) }}"><span>  </span></td>
-              <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{script.lines[lineNumber].line}}</td>
-              <td>&nbsp;</td>
-              <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{script.lines[lineNumber].text}}</td>
-            </tr>
-          </tbody>
-        </table>
-      </div>
-    </div>
-  </template>
-</polymer-element>
-
-
 <polymer-element name="function-view" extends="observatory-element">
   <template>
     <style>
@@ -13847,6 +13853,12 @@
                   <div class="memberName">[{{ element['index']}}]</div>
                   <div class="memberValue">
                     <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                    <template if="{{ element['parentField'] != null }}">
+                      in <field-ref ref="{{ element['parentField'] }}"></field-ref>
+                    </template>
+                    <template if="{{ element['parentListIndex'] != null }}">
+                      at list index {{ element['parentListIndex'] }} of
+                    </template>
                   </div>
                   </div>
                 </template>
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data b/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data
index b65a6eb..6b743d9 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data
@@ -1 +1 @@
-{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
index b744ba7..0bf76e7 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -194,7 +194,7 @@
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
 bu:function(a){return H.a5(a)},
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,68],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,69],
 gbx:function(a){return new H.cu(H.b7(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
@@ -209,12 +209,12 @@
 bu:function(a){return"null"},
 giO:function(a){return 0},
 gbx:function(a){return C.GX},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,68]},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,69]},
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
 gbx:function(a){return C.lU}},
-Ai:{
+iCW:{
 "^":"Ue1;"},
 kdQ:{
 "^":"Ue1;"},
@@ -292,6 +292,9 @@
 z.fixed$length=init
 return z}},
 br:function(a){return this.tt(a,!0)},
+zH:function(a){var z=P.Ls(null,null,null,H.Kp(a,0))
+z.FV(0,a)
+return z},
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
@@ -346,7 +349,7 @@
 if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gKy",2,0,15,69],
+return y},"$1","gKy",2,0,15,70],
 WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:function(a){if(a===0&&1/a<0)return"-0.0"
@@ -440,12 +443,12 @@
 if(typeof b==="string")return a.split(b)
 else if(!!J.x(b).$isVR)return a.split(b.Ej)
 else throw H.b("String.split(Pattern) UNIMPLEMENTED")},
-wu:function(a,b,c){var z
+lV:function(a,b,c){var z
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 z=c+b.length
 if(z>a.length)return!1
 return b===a.substring(c,z)},
-nC:function(a,b){return this.wu(a,b,0)},
+nC:function(a,b){return this.lV(a,b,0)},
 Nj:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -672,7 +675,7 @@
 c.$1(z==null?"Error spawning worker for "+H.d(b):"Error spawning worker for "+H.d(b)+" ("+z+")")
 return!0},"$3","dd",6,0,null,2,3,4],
 t0:function(a){var z
-if(init.globalState.ji===!0){z=new H.NA(0,new H.cx())
+if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
 z.mR=new H.m3(null)
 return z.Zo(a)}else{z=new H.fL(new H.cx())
 z.mR=new H.m3(null)
@@ -682,11 +685,11 @@
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 PK:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 JO:{
-"^":"Tp:70;a,c",
+"^":"Tp:71;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 FU:{
@@ -694,7 +697,7 @@
 qi:function(a){var z,y,x,w
 z=$.My()==null
 y=$.rm()
-x=z&&$.ey()===!0
+x=z&&$.wB()===!0
 this.EF=x
 if(!x)y=y!=null&&$.Zt()!=null
 else y=!0
@@ -789,7 +792,7 @@
 if(this===init.globalState.Nr)throw v}}finally{this.mf=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
-if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,71,72],
+if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,72,73],
 Ds:function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.oz(z.t(a,1),z.t(a,2))
 break
@@ -869,16 +872,16 @@
 In:{
 "^":"a;"},
 kb:{
-"^":"Tp:70;a,b,c,d,e,f",
+"^":"Tp:71;a,b,c,d,e,f",
 $0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 mN:{
 "^":"Tp:13;UI",
-$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,73,"call"],
+$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,74,"call"],
 $isEH:true},
 xn:{
 "^":"Tp:5;bK",
-$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,74,"call"],
+$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,75,"call"],
 $isEH:true},
 WK:{
 "^":"Tp:13;a",
@@ -887,14 +890,14 @@
 y=this.a
 if(J.xC(z.t(a,0),"spawned")){z=y.MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,73,"call"],
+z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,74,"call"],
 $isEH:true},
 tZ:{
 "^":"Tp:5;b",
-$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,75,"call"],
+$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,76,"call"],
 $isEH:true},
 hI:{
-"^":"Tp:70;a,b,c,d,e",
+"^":"Tp:71;a,b,c,d,e",
 $0:[function(){var z=this.a
 H.Di(init.globalFunctions[this.b](),z.a,z.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -938,7 +941,7 @@
 $ispW:true,
 $isXY:true},
 Ua:{
-"^":"Tp:70;a,b,c",
+"^":"Tp:71;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gKS()){if(this.c){y=this.a
@@ -994,7 +997,7 @@
 this.vl.D1=z.ght(z)},
 $aswS:function(){return[null]},
 $iswS:true},
-NA:{
+RS:{
 "^":"jP1;Ao,mR",
 DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.oL,a.tv,J.ki(a.JE)]
 if(!!a.$isbM)return["sendport",a.ZU,a.tv,a.bv]
@@ -1079,9 +1082,9 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 RK:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,76,77,"call"],
+J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,77,78,"call"],
 $isEH:true},
 jP1:{
 "^":"BB;",
@@ -1632,7 +1635,7 @@
 Pq:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
 wzi:function(a){return H.eQ(a)},
-bm:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+Xn:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
 Gz:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.q4[z]
@@ -1756,7 +1759,7 @@
 $isyN:true},
 hY:{
 "^":"Tp:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,76,"call"],
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,77,"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1836,14 +1839,14 @@
 z[y]=x},
 $isEH:true},
 Cj:{
-"^":"Tp:79;a,b,c",
+"^":"Tp:80;a,b,c",
 $2:function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
 this.b.push(b);++z.a},
 $isEH:true},
 u8:{
-"^":"Tp:79;a,b",
+"^":"Tp:80;a,b",
 $2:function(a,b){var z=this.b
 if(z.x4(0,a))z.u(0,a,b)
 else this.a.a=!0},
@@ -1918,23 +1921,23 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Tp:70;b,c",
+"^":"Tp:71;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"Tp:70;d,e,f",
+"^":"Tp:71;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"Tp:70;UI,bK,Gq,Rm",
+"^":"Tp:71;UI,bK,Gq,Rm",
 $0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
 Qx:{
-"^":"Tp:70;w3,HZ,mG,xC,cj",
+"^":"Tp:71;w3,HZ,mG,xC,cj",
 $0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
 Tp:{
@@ -2061,7 +2064,7 @@
 $1:function(a){return this.a(a)},
 $isEH:true},
 VX:{
-"^":"Tp:80;b",
+"^":"Tp:81;b",
 $2:function(a,b){return this.b(a,b)},
 $isEH:true},
 rh:{
@@ -2082,7 +2085,7 @@
 z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
 this.Ua=z
 return z},
-ej:function(a){var z
+ik:function(a){var z
 if(typeof a!=="string")H.vh(P.u(a))
 z=this.Ej.exec(a)
 if(z==null)return
@@ -2175,7 +2178,7 @@
 F6:[function(a,b,c,d){var z=a.fi
 if(z===!0)return
 if(a.dB!=null){a.fi=this.ct(a,C.S4,z,!0)
-this.LY(a,null).YM(new X.jE(a))}},"$3","gNa",6,0,81,46,47,82],
+this.LY(a,null).YM(new X.jE(a))}},"$3","gNa",6,0,82,46,47,83],
 static:{zy:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -2195,7 +2198,7 @@
 "^":"xc+Pi;",
 $isd3:true},
 jE:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){var z=this.a
 z.fi=J.Q5(z,C.S4,z.fi,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["app","package:observatory/app.dart",,G,{
@@ -2281,10 +2284,10 @@
 z.Cy()},
 x3:function(a){J.uY(this.cC,new G.dw(a,new G.cE()))},
 kj:[function(a){this.Pv=a
-this.og("error/",null)},"$1","gbf",2,0,83,24],
+this.og("error/",null)},"$1","gbf",2,0,84,24],
 kI:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
-else this.og("error/",null)},"$1","gXa",2,0,84,85],
+else this.og("error/",null)},"$1","gXa",2,0,85,86],
 og:function(a,b){var z,y,x
 for(z=this.cE,y=0;y<z.length;++y){x=z[y]
 if(x.VU(a)){this.lJ(x)
@@ -2305,10 +2308,10 @@
 z=y
 N.QM("").YX("Failed to install pane: "+H.d(z))}this.bn.appendChild(a.gyF())
 this.GZ=a},
-mn:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,86,87],
+mn:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,87,88],
 aO:[function(a){if(!J.xC(this.Eh,a))return
 this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,86,87],
+this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,87,88],
 Ty:function(a){var z=this.m2.TY
 z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
@@ -2321,13 +2324,13 @@
 this.AQ(!0)},
 static:{"^":"mf<"}},
 cE:{
-"^":"Tp:88;",
+"^":"Tp:89;",
 $1:function(a){var z=J.RE(a)
 return J.xC(z.gfG(a),"IsolateInterrupted")||J.xC(z.gfG(a),"BreakpointReached")||J.xC(z.gfG(a),"ExceptionThrown")},
 $isEH:true},
 dw:{
 "^":"Tp:13;a,b",
-$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,89,"call"],
+$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,90,"call"],
 $isEH:true},
 Kf:{
 "^":"a;KJ",
@@ -2374,7 +2377,7 @@
 if(window.location.hash===""||window.location.hash==="#")z="#"+this.MP
 window.history.pushState(z,document.title,z)
 this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,90,14],
+y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,91,14],
 wa:function(a){return"#"+H.d(a)}},
 uG:{
 "^":"Pi;i6>,yF<",
@@ -2389,7 +2392,7 @@
 VU:function(a){return!0}},
 zv:{
 "^":"Tp:13;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,91,"call"],
+$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 OX:{
 "^":"Tp:13;",
@@ -2400,15 +2403,15 @@
 ci:function(){if(this.yF==null){var z=W.r3("class-tree",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 DV:function(a){a=J.ZZ(a,11)
-this.i6.Eh.cv(a).ml(new G.yk(this)).OA(new G.xu())},
+this.i6.Eh.cv(a).ml(new G.yk(this)).OA(new G.qH())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"o9x"}},
 yk:{
 "^":"Tp:13;a",
 $1:[function(a){var z=this.a.yF
-if(z!=null)J.uM(z,a)},"$1",null,2,0,null,92,"call"],
+if(z!=null)J.uM(z,a)},"$1",null,2,0,null,93,"call"],
 $isEH:true},
-xu:{
+qH:{
 "^":"Tp:13;",
 $1:[function(a){N.QM("").YX("ClassTreePane visit error: "+H.d(a))},"$1",null,2,0,null,1,"call"],
 $isEH:true},
@@ -2440,14 +2443,14 @@
 while(!0){w=y.gB(z)
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
-y.u(z,x,U.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,93,"call"],
+y.u(z,x,U.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 KF:{
 "^":"Tp:13;",
 $1:[function(a){},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 nD:{
-"^":"d3;Ys,jY>,TY,ro,dUC,pt",
+"^":"d3;wu,jY>,TY,ro,dUC,pt",
 NY:function(){return"ws://"+H.d(window.location.host)+"/ws"},
 TP:function(a){var z=this.MG(a)
 if(z!=null)return z
@@ -2467,21 +2470,21 @@
 z.h(0,b)
 this.XT()
 this.XT()
-y=this.Ys.IU+".history"
+y=this.wu.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
 Rz:function(a,b){var z,y
 z=this.jY
 z.Rz(0,b)
 this.XT()
 this.XT()
-y=this.Ys.IU+".history"
+y=this.wu.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
 XT:function(){var z=this.jY
 z.GT(z,new G.jQ())},
 UJ:function(){var z,y,x,w,v
 z=this.jY
 z.V1(z)
-y=G.oh(this.Ys.IU+".history")
+y=G.oh(this.wu.IU+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
@@ -2500,7 +2503,7 @@
 $1:function(a){if(J.xC(a.gw8(),this.b)&&J.xC(a.gA9(),!1))this.a.a=a},
 $isEH:true},
 jQ:{
-"^":"Tp:94;",
+"^":"Tp:95;",
 $2:function(a,b){return J.FW(b.geX(),a.geX())},
 $isEH:true},
 Y2:{
@@ -2560,8 +2563,8 @@
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.UQ(J.TP(z[a]),b)},
 PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.FW(this.eE(b,this.pT),z)},"$2","gpPX",4,0,95],
-zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gPd",4,0,95],
+return J.FW(this.eE(b,this.pT),z)},"$2","gpPX",4,0,96],
+zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gPd",4,0,96],
 Jd:function(a){var z,y
 new P.VV(1000000,null,null).wE(0)
 z=this.zz
@@ -2586,18 +2589,18 @@
 return J.ew(J.Yq(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.Yq(z[a])
-return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,15,96]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,15,97]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
 "^":"",
 Jz:[function(){var z,y,x,w,v
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.BE,new E.wa(),C.WC,new E.Or(),C.hR,new E.YL(),C.S4,new E.wf(),C.Ro,new E.Oa(),C.hN,new E.emv(),C.AV,new E.Lbd(),C.bV,new E.QAa(),C.C0,new E.CvS(),C.eZ,new E.edy(),C.bk,new E.waE(),C.lH,new E.Ore(),C.am,new E.YLa(),C.oE,new E.wfa(),C.kG,new E.Oaa(),C.OI,new E.e0(),C.I9,new E.e1(),C.To,new E.e2(),C.XA,new E.e3(),C.i4,new E.e4(),C.qt,new E.e5(),C.p1,new E.e6(),C.yJ,new E.e7(),C.la,new E.e8(),C.yL,new E.e9(),C.bJ,new E.e10(),C.ox,new E.e11(),C.Je,new E.e12(),C.Lw,new E.e13(),C.iE,new E.e14(),C.f4,new E.e15(),C.VK,new E.e16(),C.aH,new E.e17(),C.aK,new E.e18(),C.GP,new E.e19(),C.vs,new E.e20(),C.Gr,new E.e21(),C.TU,new E.e22(),C.tP,new E.e23(),C.yh,new E.e24(),C.Zb,new E.e25(),C.u7,new E.e26(),C.p8,new E.e27(),C.qR,new E.e28(),C.ld,new E.e29(),C.ne,new E.e30(),C.B0,new E.e31(),C.r1,new E.e32(),C.mr,new E.e33(),C.Ek,new E.e34(),C.Pn,new E.e35(),C.YT,new E.e36(),C.h7,new E.e37(),C.R3,new E.e38(),C.WQ,new E.e39(),C.fV,new E.e40(),C.jU,new E.e41(),C.Gd,new E.e42(),C.OO,new E.e43(),C.Mc,new E.e44(),C.FP,new E.e45(),C.kF,new E.e46(),C.UD,new E.e47(),C.Aq,new E.e48(),C.DS,new E.e49(),C.C9,new E.e50(),C.VF,new E.e51(),C.uU,new E.e52(),C.YJ,new E.e53(),C.eF,new E.e54(),C.oI,new E.e55(),C.ST,new E.e56(),C.QH,new E.e57(),C.qX,new E.e58(),C.rE,new E.e59(),C.nf,new E.e60(),C.pO,new E.e61(),C.EI,new E.e62(),C.JB,new E.e63(),C.RY,new E.e64(),C.d4,new E.e65(),C.cF,new E.e66(),C.Ql,new E.e67(),C.SI,new E.e68(),C.zS,new E.e69(),C.YA,new E.e70(),C.ak,new E.e71(),C.Ge,new E.e72(),C.He,new E.e73(),C.im,new E.e74(),C.Ss,new E.e75(),C.k6,new E.e76(),C.oj,new E.e77(),C.PJ,new E.e78(),C.q2,new E.e79(),C.d2,new E.e80(),C.kN,new E.e81(),C.fn,new E.e82(),C.yB,new E.e83(),C.eJ,new E.e84(),C.iG,new E.e85(),C.Py,new E.e86(),C.pC,new E.e87(),C.uu,new E.e88(),C.qs,new E.e89(),C.XH,new E.e90(),C.tJ,new E.e91(),C.F8,new E.e92(),C.C1,new E.e93(),C.nL,new E.e94(),C.a0,new E.e95(),C.Yg,new E.e96(),C.bR,new E.e97(),C.ai,new E.e98(),C.ob,new E.e99(),C.Iv,new E.e100(),C.Wg,new E.e101(),C.tD,new E.e102(),C.nZ,new E.e103(),C.Of,new E.e104(),C.pY,new E.e105(),C.XL,new E.e106(),C.LA,new E.e107(),C.Lk,new E.e108(),C.dK,new E.e109(),C.xf,new E.e110(),C.rB,new E.e111(),C.bz,new E.e112(),C.Jx,new E.e113(),C.b5,new E.e114(),C.Lc,new E.e115(),C.hf,new E.e116(),C.uk,new E.e117(),C.Zi,new E.e118(),C.TN,new E.e119(),C.kA,new E.e120(),C.GI,new E.e121(),C.Wn,new E.e122(),C.ur,new E.e123(),C.VN,new E.e124(),C.EV,new E.e125(),C.VI,new E.e126(),C.eh,new E.e127(),C.r6,new E.e128(),C.MW,new E.e129(),C.SA,new E.e130(),C.kV,new E.e131(),C.vp,new E.e132(),C.cc,new E.e133(),C.DY,new E.e134(),C.Lx,new E.e135(),C.M3,new E.e136(),C.wT,new E.e137(),C.SR,new E.e138(),C.t6,new E.e139(),C.rP,new E.e140(),C.pX,new E.e141(),C.VD,new E.e142(),C.NN,new E.e143(),C.UX,new E.e144(),C.YS,new E.e145(),C.pu,new E.e146(),C.BJ,new E.e147(),C.c6,new E.e148(),C.td,new E.e149(),C.Gn,new E.e150(),C.zO,new E.e151(),C.vg,new E.e152(),C.Ys,new E.e153(),C.zm,new E.e154(),C.XM,new E.e155(),C.Ic,new E.e156(),C.yG,new E.e157(),C.uI,new E.e158(),C.O9,new E.e159(),C.ba,new E.e160(),C.tW,new E.e161(),C.CG,new E.e162(),C.Wj,new E.e163(),C.vb,new E.e164(),C.UL,new E.e165(),C.AY,new E.e166(),C.QK,new E.e167(),C.AO,new E.e168(),C.Xd,new E.e169(),C.I7,new E.e170(),C.xP,new E.e171(),C.Wm,new E.e172(),C.GR,new E.e173(),C.KX,new E.e174(),C.ja,new E.e175(),C.Dj,new E.e176(),C.ir,new E.e177(),C.dx,new E.e178(),C.ni,new E.e179(),C.X2,new E.e180(),C.F3,new E.e181(),C.UY,new E.e182(),C.Aa,new E.e183(),C.nY,new E.e184(),C.tg,new E.e185(),C.HD,new E.e186(),C.iU,new E.e187(),C.eN,new E.e188(),C.ue,new E.e189(),C.nh,new E.e190(),C.L2,new E.e191(),C.Gs,new E.e192(),C.bE,new E.e193(),C.YD,new E.e194(),C.PX,new E.e195(),C.N8,new E.e196(),C.EA,new E.e197(),C.oW,new E.e198(),C.hd,new E.e199(),C.pH,new E.e200(),C.Ve,new E.e201(),C.jM,new E.e202(),C.W5,new E.e203(),C.uX,new E.e204(),C.nt,new E.e205(),C.PM,new E.e206(),C.xA,new E.e207(),C.k5,new E.e208(),C.Nv,new E.e209(),C.Cw,new E.e210(),C.TW,new E.e211(),C.xS,new E.e212(),C.ft,new E.e213(),C.QF,new E.e214(),C.mi,new E.e215(),C.zz,new E.e216(),C.hO,new E.e217(),C.ei,new E.e218(),C.HK,new E.e219(),C.je,new E.e220(),C.Ef,new E.e221(),C.RH,new E.e222(),C.Q1,new E.e223(),C.ID,new E.e224(),C.z6,new E.e225(),C.bc,new E.e226(),C.kw,new E.e227(),C.ep,new E.e228(),C.J2,new E.e229(),C.zU,new E.e230(),C.bn,new E.e231(),C.mh,new E.e232(),C.Fh,new E.e233(),C.LP,new E.e234(),C.jh,new E.e235(),C.fj,new E.e236(),C.xw,new E.e237(),C.zn,new E.e238(),C.RJ,new E.e239(),C.Tc,new E.e240(),C.YE,new E.e241(),C.Uy,new E.e242()],null,null)
-y=P.EF([C.aP,new E.e243(),C.cg,new E.e244(),C.S4,new E.e245(),C.AV,new E.e246(),C.bk,new E.e247(),C.lH,new E.e248(),C.am,new E.e249(),C.oE,new E.e250(),C.kG,new E.e251(),C.XA,new E.e252(),C.i4,new E.e253(),C.yL,new E.e254(),C.bJ,new E.e255(),C.VK,new E.e256(),C.aH,new E.e257(),C.vs,new E.e258(),C.Gr,new E.e259(),C.tP,new E.e260(),C.yh,new E.e261(),C.Zb,new E.e262(),C.p8,new E.e263(),C.ld,new E.e264(),C.ne,new E.e265(),C.B0,new E.e266(),C.mr,new E.e267(),C.YT,new E.e268(),C.WQ,new E.e269(),C.jU,new E.e270(),C.Gd,new E.e271(),C.OO,new E.e272(),C.Mc,new E.e273(),C.QH,new E.e274(),C.rE,new E.e275(),C.nf,new E.e276(),C.Ql,new E.e277(),C.ak,new E.e278(),C.Ge,new E.e279(),C.He,new E.e280(),C.oj,new E.e281(),C.d2,new E.e282(),C.fn,new E.e283(),C.yB,new E.e284(),C.Py,new E.e285(),C.uu,new E.e286(),C.qs,new E.e287(),C.a0,new E.e288(),C.rB,new E.e289(),C.Lc,new E.e290(),C.hf,new E.e291(),C.uk,new E.e292(),C.Zi,new E.e293(),C.TN,new E.e294(),C.kA,new E.e295(),C.ur,new E.e296(),C.EV,new E.e297(),C.eh,new E.e298(),C.SA,new E.e299(),C.kV,new E.e300(),C.vp,new E.e301(),C.SR,new E.e302(),C.t6,new E.e303(),C.UX,new E.e304(),C.YS,new E.e305(),C.c6,new E.e306(),C.td,new E.e307(),C.zO,new E.e308(),C.Ys,new E.e309(),C.XM,new E.e310(),C.Ic,new E.e311(),C.O9,new E.e312(),C.tW,new E.e313(),C.Wj,new E.e314(),C.vb,new E.e315(),C.QK,new E.e316(),C.AO,new E.e317(),C.Xd,new E.e318(),C.xP,new E.e319(),C.GR,new E.e320(),C.KX,new E.e321(),C.ja,new E.e322(),C.Dj,new E.e323(),C.X2,new E.e324(),C.UY,new E.e325(),C.Aa,new E.e326(),C.nY,new E.e327(),C.tg,new E.e328(),C.HD,new E.e329(),C.iU,new E.e330(),C.eN,new E.e331(),C.Gs,new E.e332(),C.bE,new E.e333(),C.YD,new E.e334(),C.PX,new E.e335(),C.pH,new E.e336(),C.Ve,new E.e337(),C.jM,new E.e338(),C.uX,new E.e339(),C.nt,new E.e340(),C.PM,new E.e341(),C.Nv,new E.e342(),C.Cw,new E.e343(),C.TW,new E.e344(),C.ft,new E.e345(),C.mi,new E.e346(),C.zz,new E.e347(),C.z6,new E.e348(),C.kw,new E.e349(),C.zU,new E.e350(),C.RJ,new E.e351(),C.YE,new E.e352()],null,null)
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.BE,new E.wa(),C.WC,new E.Or(),C.hR,new E.YL(),C.S4,new E.wf(),C.Ro,new E.Oa(),C.hN,new E.emv(),C.AV,new E.Lbd(),C.bV,new E.QAa(),C.C0,new E.CvS(),C.eZ,new E.edy(),C.bk,new E.waE(),C.lH,new E.Ore(),C.am,new E.YLa(),C.oE,new E.wfa(),C.kG,new E.Oaa(),C.OI,new E.e0(),C.I9,new E.e1(),C.To,new E.e2(),C.XA,new E.e3(),C.i4,new E.e4(),C.qt,new E.e5(),C.p1,new E.e6(),C.yJ,new E.e7(),C.la,new E.e8(),C.yL,new E.e9(),C.bJ,new E.e10(),C.ox,new E.e11(),C.Je,new E.e12(),C.Lw,new E.e13(),C.iE,new E.e14(),C.f4,new E.e15(),C.VK,new E.e16(),C.aH,new E.e17(),C.aK,new E.e18(),C.GP,new E.e19(),C.vs,new E.e20(),C.Gr,new E.e21(),C.TU,new E.e22(),C.Fe,new E.e23(),C.tP,new E.e24(),C.yh,new E.e25(),C.Zb,new E.e26(),C.u7,new E.e27(),C.p8,new E.e28(),C.qR,new E.e29(),C.ld,new E.e30(),C.ne,new E.e31(),C.B0,new E.e32(),C.r1,new E.e33(),C.mr,new E.e34(),C.Ek,new E.e35(),C.Pn,new E.e36(),C.YT,new E.e37(),C.h7,new E.e38(),C.R3,new E.e39(),C.WQ,new E.e40(),C.fV,new E.e41(),C.jU,new E.e42(),C.Gd,new E.e43(),C.OO,new E.e44(),C.Mc,new E.e45(),C.FP,new E.e46(),C.kF,new E.e47(),C.UD,new E.e48(),C.Aq,new E.e49(),C.DS,new E.e50(),C.C9,new E.e51(),C.VF,new E.e52(),C.uU,new E.e53(),C.YJ,new E.e54(),C.eF,new E.e55(),C.oI,new E.e56(),C.ST,new E.e57(),C.QH,new E.e58(),C.qX,new E.e59(),C.rE,new E.e60(),C.nf,new E.e61(),C.pO,new E.e62(),C.EI,new E.e63(),C.JB,new E.e64(),C.RY,new E.e65(),C.d4,new E.e66(),C.cF,new E.e67(),C.Ql,new E.e68(),C.SI,new E.e69(),C.zS,new E.e70(),C.YA,new E.e71(),C.ak,new E.e72(),C.Ge,new E.e73(),C.He,new E.e74(),C.im,new E.e75(),C.Ss,new E.e76(),C.k6,new E.e77(),C.oj,new E.e78(),C.PJ,new E.e79(),C.q2,new E.e80(),C.d2,new E.e81(),C.kN,new E.e82(),C.fn,new E.e83(),C.yB,new E.e84(),C.eJ,new E.e85(),C.iG,new E.e86(),C.Py,new E.e87(),C.pC,new E.e88(),C.uu,new E.e89(),C.qs,new E.e90(),C.XH,new E.e91(),C.tJ,new E.e92(),C.F8,new E.e93(),C.C1,new E.e94(),C.nL,new E.e95(),C.a0,new E.e96(),C.Yg,new E.e97(),C.bR,new E.e98(),C.ai,new E.e99(),C.ob,new E.e100(),C.Iv,new E.e101(),C.Wg,new E.e102(),C.tD,new E.e103(),C.nZ,new E.e104(),C.Of,new E.e105(),C.pY,new E.e106(),C.XL,new E.e107(),C.LA,new E.e108(),C.Lk,new E.e109(),C.dK,new E.e110(),C.xf,new E.e111(),C.rB,new E.e112(),C.bz,new E.e113(),C.Jx,new E.e114(),C.b5,new E.e115(),C.Lc,new E.e116(),C.hf,new E.e117(),C.uk,new E.e118(),C.Zi,new E.e119(),C.TN,new E.e120(),C.kA,new E.e121(),C.GI,new E.e122(),C.Wn,new E.e123(),C.ur,new E.e124(),C.VN,new E.e125(),C.EV,new E.e126(),C.VI,new E.e127(),C.eh,new E.e128(),C.r6,new E.e129(),C.MW,new E.e130(),C.SA,new E.e131(),C.kV,new E.e132(),C.vp,new E.e133(),C.cc,new E.e134(),C.DY,new E.e135(),C.Lx,new E.e136(),C.M3,new E.e137(),C.wT,new E.e138(),C.SR,new E.e139(),C.t6,new E.e140(),C.rP,new E.e141(),C.pX,new E.e142(),C.VD,new E.e143(),C.NN,new E.e144(),C.UX,new E.e145(),C.YS,new E.e146(),C.pu,new E.e147(),C.BJ,new E.e148(),C.c6,new E.e149(),C.td,new E.e150(),C.Gn,new E.e151(),C.zO,new E.e152(),C.vg,new E.e153(),C.Ys,new E.e154(),C.zm,new E.e155(),C.XM,new E.e156(),C.Ic,new E.e157(),C.yG,new E.e158(),C.uI,new E.e159(),C.O9,new E.e160(),C.ba,new E.e161(),C.tW,new E.e162(),C.CG,new E.e163(),C.Wj,new E.e164(),C.vb,new E.e165(),C.UL,new E.e166(),C.AY,new E.e167(),C.QK,new E.e168(),C.AO,new E.e169(),C.Xd,new E.e170(),C.I7,new E.e171(),C.xP,new E.e172(),C.Wm,new E.e173(),C.GR,new E.e174(),C.KX,new E.e175(),C.ja,new E.e176(),C.Dj,new E.e177(),C.ir,new E.e178(),C.dx,new E.e179(),C.ni,new E.e180(),C.X2,new E.e181(),C.F3,new E.e182(),C.UY,new E.e183(),C.Aa,new E.e184(),C.nY,new E.e185(),C.tg,new E.e186(),C.HD,new E.e187(),C.iU,new E.e188(),C.eN,new E.e189(),C.ue,new E.e190(),C.nh,new E.e191(),C.L2,new E.e192(),C.Gs,new E.e193(),C.bE,new E.e194(),C.YD,new E.e195(),C.PX,new E.e196(),C.N8,new E.e197(),C.EA,new E.e198(),C.oW,new E.e199(),C.hd,new E.e200(),C.pH,new E.e201(),C.Ve,new E.e202(),C.jM,new E.e203(),C.W5,new E.e204(),C.uX,new E.e205(),C.nt,new E.e206(),C.PM,new E.e207(),C.xA,new E.e208(),C.k5,new E.e209(),C.Nv,new E.e210(),C.Cw,new E.e211(),C.TW,new E.e212(),C.xS,new E.e213(),C.ft,new E.e214(),C.QF,new E.e215(),C.mi,new E.e216(),C.zz,new E.e217(),C.hO,new E.e218(),C.ei,new E.e219(),C.HK,new E.e220(),C.je,new E.e221(),C.Ef,new E.e222(),C.RH,new E.e223(),C.Q1,new E.e224(),C.ID,new E.e225(),C.z6,new E.e226(),C.bc,new E.e227(),C.kw,new E.e228(),C.ep,new E.e229(),C.J2,new E.e230(),C.zU,new E.e231(),C.bn,new E.e232(),C.mh,new E.e233(),C.Fh,new E.e234(),C.LP,new E.e235(),C.jh,new E.e236(),C.fj,new E.e237(),C.xw,new E.e238(),C.zn,new E.e239(),C.RJ,new E.e240(),C.Tc,new E.e241(),C.YE,new E.e242(),C.Uy,new E.e243()],null,null)
+y=P.EF([C.aP,new E.e244(),C.cg,new E.e245(),C.S4,new E.e246(),C.AV,new E.e247(),C.bk,new E.e248(),C.lH,new E.e249(),C.am,new E.e250(),C.oE,new E.e251(),C.kG,new E.e252(),C.XA,new E.e253(),C.i4,new E.e254(),C.yL,new E.e255(),C.bJ,new E.e256(),C.VK,new E.e257(),C.aH,new E.e258(),C.vs,new E.e259(),C.Gr,new E.e260(),C.Fe,new E.e261(),C.tP,new E.e262(),C.yh,new E.e263(),C.Zb,new E.e264(),C.p8,new E.e265(),C.ld,new E.e266(),C.ne,new E.e267(),C.B0,new E.e268(),C.mr,new E.e269(),C.YT,new E.e270(),C.WQ,new E.e271(),C.jU,new E.e272(),C.Gd,new E.e273(),C.OO,new E.e274(),C.Mc,new E.e275(),C.QH,new E.e276(),C.rE,new E.e277(),C.nf,new E.e278(),C.Ql,new E.e279(),C.ak,new E.e280(),C.Ge,new E.e281(),C.He,new E.e282(),C.oj,new E.e283(),C.d2,new E.e284(),C.fn,new E.e285(),C.yB,new E.e286(),C.Py,new E.e287(),C.uu,new E.e288(),C.qs,new E.e289(),C.a0,new E.e290(),C.rB,new E.e291(),C.Lc,new E.e292(),C.hf,new E.e293(),C.uk,new E.e294(),C.Zi,new E.e295(),C.TN,new E.e296(),C.kA,new E.e297(),C.ur,new E.e298(),C.EV,new E.e299(),C.eh,new E.e300(),C.SA,new E.e301(),C.kV,new E.e302(),C.vp,new E.e303(),C.SR,new E.e304(),C.t6,new E.e305(),C.UX,new E.e306(),C.YS,new E.e307(),C.c6,new E.e308(),C.td,new E.e309(),C.zO,new E.e310(),C.Ys,new E.e311(),C.XM,new E.e312(),C.Ic,new E.e313(),C.O9,new E.e314(),C.tW,new E.e315(),C.Wj,new E.e316(),C.vb,new E.e317(),C.QK,new E.e318(),C.AO,new E.e319(),C.Xd,new E.e320(),C.xP,new E.e321(),C.GR,new E.e322(),C.KX,new E.e323(),C.ja,new E.e324(),C.Dj,new E.e325(),C.X2,new E.e326(),C.UY,new E.e327(),C.Aa,new E.e328(),C.nY,new E.e329(),C.tg,new E.e330(),C.HD,new E.e331(),C.iU,new E.e332(),C.eN,new E.e333(),C.Gs,new E.e334(),C.bE,new E.e335(),C.YD,new E.e336(),C.PX,new E.e337(),C.pH,new E.e338(),C.Ve,new E.e339(),C.jM,new E.e340(),C.uX,new E.e341(),C.nt,new E.e342(),C.PM,new E.e343(),C.Nv,new E.e344(),C.Cw,new E.e345(),C.TW,new E.e346(),C.ft,new E.e347(),C.mi,new E.e348(),C.zz,new E.e349(),C.z6,new E.e350(),C.kw,new E.e351(),C.zU,new E.e352(),C.RJ,new E.e353(),C.YE,new E.e354()],null,null)
 x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.BL,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Zj,C.Mt,C.Ep,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.qJ,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
 w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,C.CM,C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.xE,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.BL,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.Yo,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.V3,C.pO,C.au,C.Lc,C.Pc,C.AO,C.fi],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,C.CM,C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.nX,C.CM,C.Zj,P.EF([C.oj,C.GT],null,null),C.Ep,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.bw],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,C.CM,C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.ON,P.EF([C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.SA,C.KI,C.tW,C.kH,C.CG,C.Ml,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.xP,C.TO,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.Zk,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.u3],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null)
-v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.Lw,"deleteVm",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",C.jU,"file",C.Gd,"firstTokenPos",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.ak,"hasParent",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.kA,"lastTokenPos",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.r6,"lineNumber",C.MW,"lineNumbers",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.PM,"status",C.xA,"styleForHits",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.RH,"toStringAsFixed",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
+v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.Lw,"deleteVm",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",C.jU,"file",C.Gd,"firstTokenPos",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.ak,"hasParent",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.kA,"lastTokenPos",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.r6,"lineNumber",C.MW,"lineNumbers",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.PM,"status",C.xA,"styleForHits",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.RH,"toStringAsFixed",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
 $.j8=new O.fH(z,y,C.CM)
 $.Yv=new O.bY(x,w,!1)
 $.qe=v
-$.M6=[new E.e353(),new E.e354(),new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430()]
+$.M6=[new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432()]
 $.UG=!0
 F.E2()},"$0","V7",0,0,18],
 em:{
@@ -2774,1634 +2777,1642 @@
 $isEH:true},
 e23:{
 "^":"Tp:13;",
-$1:function(a){return a.gw2()},
+$1:function(a){return a.gej()},
 $isEH:true},
 e24:{
 "^":"Tp:13;",
-$1:function(a){return J.w8(a)},
+$1:function(a){return a.gw2()},
 $isEH:true},
 e25:{
 "^":"Tp:13;",
-$1:function(a){return J.is(a)},
+$1:function(a){return J.w8(a)},
 $isEH:true},
 e26:{
 "^":"Tp:13;",
-$1:function(a){return J.nE(a)},
+$1:function(a){return J.is(a)},
 $isEH:true},
 e27:{
 "^":"Tp:13;",
-$1:function(a){return J.a3(a)},
+$1:function(a){return J.nE(a)},
 $isEH:true},
 e28:{
 "^":"Tp:13;",
-$1:function(a){return J.Ts(a)},
+$1:function(a){return J.a3(a)},
 $isEH:true},
 e29:{
 "^":"Tp:13;",
-$1:function(a){return J.Ky(a)},
+$1:function(a){return J.Ts(a)},
 $isEH:true},
 e30:{
 "^":"Tp:13;",
-$1:function(a){return J.Vl(a)},
+$1:function(a){return J.Ky(a)},
 $isEH:true},
 e31:{
 "^":"Tp:13;",
-$1:function(a){return J.kE(a)},
+$1:function(a){return J.Vl(a)},
 $isEH:true},
 e32:{
 "^":"Tp:13;",
-$1:function(a){return J.Gl(a)},
+$1:function(a){return J.kE(a)},
 $isEH:true},
 e33:{
 "^":"Tp:13;",
-$1:function(a){return J.Mz(a)},
+$1:function(a){return J.Gl(a)},
 $isEH:true},
 e34:{
 "^":"Tp:13;",
-$1:function(a){return J.nb(a)},
+$1:function(a){return J.Mz(a)},
 $isEH:true},
 e35:{
 "^":"Tp:13;",
-$1:function(a){return a.gty()},
+$1:function(a){return J.nb(a)},
 $isEH:true},
 e36:{
 "^":"Tp:13;",
-$1:function(a){return J.yn(a)},
+$1:function(a){return a.gty()},
 $isEH:true},
 e37:{
 "^":"Tp:13;",
-$1:function(a){return a.gMX()},
+$1:function(a){return J.yn(a)},
 $isEH:true},
 e38:{
 "^":"Tp:13;",
-$1:function(a){return a.gkE()},
+$1:function(a){return a.gMX()},
 $isEH:true},
 e39:{
 "^":"Tp:13;",
-$1:function(a){return J.pm(a)},
+$1:function(a){return a.gkE()},
 $isEH:true},
 e40:{
 "^":"Tp:13;",
-$1:function(a){return a.gtJ()},
+$1:function(a){return J.pm(a)},
 $isEH:true},
 e41:{
 "^":"Tp:13;",
-$1:function(a){return J.Ec(a)},
+$1:function(a){return a.gtJ()},
 $isEH:true},
 e42:{
 "^":"Tp:13;",
-$1:function(a){return a.ghY()},
+$1:function(a){return J.Ec(a)},
 $isEH:true},
 e43:{
 "^":"Tp:13;",
-$1:function(a){return J.ra(a)},
+$1:function(a){return a.ghY()},
 $isEH:true},
 e44:{
 "^":"Tp:13;",
-$1:function(a){return J.YH(a)},
+$1:function(a){return J.ra(a)},
 $isEH:true},
 e45:{
 "^":"Tp:13;",
-$1:function(a){return J.WX(a)},
+$1:function(a){return J.YH(a)},
 $isEH:true},
 e46:{
 "^":"Tp:13;",
-$1:function(a){return J.IP(a)},
+$1:function(a){return J.WX(a)},
 $isEH:true},
 e47:{
 "^":"Tp:13;",
-$1:function(a){return a.gZd()},
+$1:function(a){return J.IP(a)},
 $isEH:true},
 e48:{
 "^":"Tp:13;",
-$1:function(a){return J.TM(a)},
+$1:function(a){return a.gZd()},
 $isEH:true},
 e49:{
 "^":"Tp:13;",
-$1:function(a){return J.xo(a)},
+$1:function(a){return J.TM(a)},
 $isEH:true},
 e50:{
 "^":"Tp:13;",
-$1:function(a){return a.gkA()},
+$1:function(a){return J.xo(a)},
 $isEH:true},
 e51:{
 "^":"Tp:13;",
-$1:function(a){return a.gGK()},
+$1:function(a){return a.gkA()},
 $isEH:true},
 e52:{
 "^":"Tp:13;",
-$1:function(a){return a.gan()},
+$1:function(a){return a.gGK()},
 $isEH:true},
 e53:{
 "^":"Tp:13;",
-$1:function(a){return a.gcQ()},
+$1:function(a){return a.gan()},
 $isEH:true},
 e54:{
 "^":"Tp:13;",
-$1:function(a){return a.gS7()},
+$1:function(a){return a.gcQ()},
 $isEH:true},
 e55:{
 "^":"Tp:13;",
-$1:function(a){return a.gJz()},
+$1:function(a){return a.gS7()},
 $isEH:true},
 e56:{
 "^":"Tp:13;",
-$1:function(a){return J.PY(a)},
+$1:function(a){return a.gJz()},
 $isEH:true},
 e57:{
 "^":"Tp:13;",
-$1:function(a){return J.bu(a)},
+$1:function(a){return J.PY(a)},
 $isEH:true},
 e58:{
 "^":"Tp:13;",
-$1:function(a){return J.VL(a)},
+$1:function(a){return J.bu(a)},
 $isEH:true},
 e59:{
 "^":"Tp:13;",
-$1:function(a){return J.zN(a)},
+$1:function(a){return J.VL(a)},
 $isEH:true},
 e60:{
 "^":"Tp:13;",
-$1:function(a){return J.m4(a)},
+$1:function(a){return J.zN(a)},
 $isEH:true},
 e61:{
 "^":"Tp:13;",
-$1:function(a){return J.v8(a)},
+$1:function(a){return J.m4(a)},
 $isEH:true},
 e62:{
 "^":"Tp:13;",
-$1:function(a){return a.gmu()},
+$1:function(a){return J.v8(a)},
 $isEH:true},
 e63:{
 "^":"Tp:13;",
-$1:function(a){return a.gCO()},
+$1:function(a){return a.gmu()},
 $isEH:true},
 e64:{
 "^":"Tp:13;",
-$1:function(a){return J.MB(a)},
+$1:function(a){return a.gCO()},
 $isEH:true},
 e65:{
 "^":"Tp:13;",
-$1:function(a){return J.eU(a)},
+$1:function(a){return J.MB(a)},
 $isEH:true},
 e66:{
 "^":"Tp:13;",
-$1:function(a){return J.DB(a)},
+$1:function(a){return J.eU(a)},
 $isEH:true},
 e67:{
 "^":"Tp:13;",
-$1:function(a){return J.wO(a)},
+$1:function(a){return J.DB(a)},
 $isEH:true},
 e68:{
 "^":"Tp:13;",
-$1:function(a){return a.gGf()},
+$1:function(a){return J.wO(a)},
 $isEH:true},
 e69:{
 "^":"Tp:13;",
-$1:function(a){return a.gvS()},
+$1:function(a){return a.gGf()},
 $isEH:true},
 e70:{
 "^":"Tp:13;",
-$1:function(a){return a.gJL()},
+$1:function(a){return a.gvS()},
 $isEH:true},
 e71:{
 "^":"Tp:13;",
-$1:function(a){return J.u1(a)},
+$1:function(a){return a.gJL()},
 $isEH:true},
 e72:{
 "^":"Tp:13;",
-$1:function(a){return J.z3(a)},
+$1:function(a){return J.u1(a)},
 $isEH:true},
 e73:{
 "^":"Tp:13;",
-$1:function(a){return J.YQ(a)},
+$1:function(a){return J.z3(a)},
 $isEH:true},
 e74:{
 "^":"Tp:13;",
-$1:function(a){return J.tC(a)},
+$1:function(a){return J.YQ(a)},
 $isEH:true},
 e75:{
 "^":"Tp:13;",
-$1:function(a){return a.gu9()},
+$1:function(a){return J.tC(a)},
 $isEH:true},
 e76:{
 "^":"Tp:13;",
-$1:function(a){return J.fA(a)},
+$1:function(a){return a.gu9()},
 $isEH:true},
 e77:{
 "^":"Tp:13;",
-$1:function(a){return J.aB(a)},
+$1:function(a){return J.fA(a)},
 $isEH:true},
 e78:{
 "^":"Tp:13;",
-$1:function(a){return a.gL4()},
+$1:function(a){return J.aB(a)},
 $isEH:true},
 e79:{
 "^":"Tp:13;",
-$1:function(a){return a.gaj()},
+$1:function(a){return a.gL4()},
 $isEH:true},
 e80:{
 "^":"Tp:13;",
-$1:function(a){return a.giq()},
+$1:function(a){return a.gaj()},
 $isEH:true},
 e81:{
 "^":"Tp:13;",
-$1:function(a){return a.gBm()},
+$1:function(a){return a.giq()},
 $isEH:true},
 e82:{
 "^":"Tp:13;",
-$1:function(a){return J.xR(a)},
+$1:function(a){return a.gBm()},
 $isEH:true},
 e83:{
 "^":"Tp:13;",
-$1:function(a){return J.US(a)},
+$1:function(a){return J.xR(a)},
 $isEH:true},
 e84:{
 "^":"Tp:13;",
-$1:function(a){return a.gNI()},
+$1:function(a){return J.US(a)},
 $isEH:true},
 e85:{
 "^":"Tp:13;",
-$1:function(a){return a.gva()},
+$1:function(a){return a.gNI()},
 $isEH:true},
 e86:{
 "^":"Tp:13;",
-$1:function(a){return a.gKt()},
+$1:function(a){return a.gva()},
 $isEH:true},
 e87:{
 "^":"Tp:13;",
-$1:function(a){return a.gp2()},
+$1:function(a){return a.gKt()},
 $isEH:true},
 e88:{
 "^":"Tp:13;",
-$1:function(a){return J.UU(a)},
+$1:function(a){return a.gp2()},
 $isEH:true},
 e89:{
 "^":"Tp:13;",
-$1:function(a){return J.Ew(a)},
+$1:function(a){return J.UU(a)},
 $isEH:true},
 e90:{
 "^":"Tp:13;",
-$1:function(a){return a.gVM()},
+$1:function(a){return J.Ew(a)},
 $isEH:true},
 e91:{
 "^":"Tp:13;",
-$1:function(a){return J.Xi(a)},
+$1:function(a){return a.gVM()},
 $isEH:true},
 e92:{
 "^":"Tp:13;",
-$1:function(a){return J.bL(a)},
+$1:function(a){return J.Xi(a)},
 $isEH:true},
 e93:{
 "^":"Tp:13;",
-$1:function(a){return a.gUB()},
+$1:function(a){return J.bL(a)},
 $isEH:true},
 e94:{
 "^":"Tp:13;",
-$1:function(a){return J.ix(a)},
+$1:function(a){return a.gUB()},
 $isEH:true},
 e95:{
 "^":"Tp:13;",
-$1:function(a){return J.pd(a)},
+$1:function(a){return J.ix(a)},
 $isEH:true},
 e96:{
 "^":"Tp:13;",
-$1:function(a){return a.gqy()},
+$1:function(a){return J.pd(a)},
 $isEH:true},
 e97:{
 "^":"Tp:13;",
-$1:function(a){return J.GU(a)},
+$1:function(a){return a.gqy()},
 $isEH:true},
 e98:{
 "^":"Tp:13;",
-$1:function(a){return J.FN(a)},
+$1:function(a){return J.GU(a)},
 $isEH:true},
 e99:{
 "^":"Tp:13;",
-$1:function(a){return J.Wk(a)},
+$1:function(a){return J.FN(a)},
 $isEH:true},
 e100:{
 "^":"Tp:13;",
-$1:function(a){return J.eT(a)},
+$1:function(a){return J.Wk(a)},
 $isEH:true},
 e101:{
 "^":"Tp:13;",
-$1:function(a){return J.C8(a)},
+$1:function(a){return J.eT(a)},
 $isEH:true},
 e102:{
 "^":"Tp:13;",
-$1:function(a){return J.tf(a)},
+$1:function(a){return J.C8(a)},
 $isEH:true},
 e103:{
 "^":"Tp:13;",
-$1:function(a){return J.yx(a)},
+$1:function(a){return J.tf(a)},
 $isEH:true},
 e104:{
 "^":"Tp:13;",
-$1:function(a){return J.cU(a)},
+$1:function(a){return J.yx(a)},
 $isEH:true},
 e105:{
 "^":"Tp:13;",
-$1:function(a){return a.gYG()},
+$1:function(a){return J.cU(a)},
 $isEH:true},
 e106:{
 "^":"Tp:13;",
-$1:function(a){return a.gi2()},
+$1:function(a){return a.gYG()},
 $isEH:true},
 e107:{
 "^":"Tp:13;",
-$1:function(a){return a.gHY()},
+$1:function(a){return a.gi2()},
 $isEH:true},
 e108:{
 "^":"Tp:13;",
-$1:function(a){return J.j0(a)},
+$1:function(a){return a.gHY()},
 $isEH:true},
 e109:{
 "^":"Tp:13;",
-$1:function(a){return J.ZN(a)},
+$1:function(a){return J.j0(a)},
 $isEH:true},
 e110:{
 "^":"Tp:13;",
-$1:function(a){return J.xa(a)},
+$1:function(a){return J.ZN(a)},
 $isEH:true},
 e111:{
 "^":"Tp:13;",
-$1:function(a){return J.aT(a)},
+$1:function(a){return J.xa(a)},
 $isEH:true},
 e112:{
 "^":"Tp:13;",
-$1:function(a){return J.KG(a)},
+$1:function(a){return J.aT(a)},
 $isEH:true},
 e113:{
 "^":"Tp:13;",
-$1:function(a){return a.giR()},
+$1:function(a){return J.KG(a)},
 $isEH:true},
 e114:{
 "^":"Tp:13;",
-$1:function(a){return a.gEB()},
+$1:function(a){return a.giR()},
 $isEH:true},
 e115:{
 "^":"Tp:13;",
-$1:function(a){return J.Iz(a)},
+$1:function(a){return a.gEB()},
 $isEH:true},
 e116:{
 "^":"Tp:13;",
-$1:function(a){return J.Yq(a)},
+$1:function(a){return J.Iz(a)},
 $isEH:true},
 e117:{
 "^":"Tp:13;",
-$1:function(a){return J.MQ(a)},
+$1:function(a){return J.Yq(a)},
 $isEH:true},
 e118:{
 "^":"Tp:13;",
-$1:function(a){return J.X7(a)},
+$1:function(a){return J.MQ(a)},
 $isEH:true},
 e119:{
 "^":"Tp:13;",
-$1:function(a){return J.IR(a)},
+$1:function(a){return J.X7(a)},
 $isEH:true},
 e120:{
 "^":"Tp:13;",
-$1:function(a){return a.gSK()},
+$1:function(a){return J.IR(a)},
 $isEH:true},
 e121:{
 "^":"Tp:13;",
-$1:function(a){return a.gPE()},
+$1:function(a){return a.gSK()},
 $isEH:true},
 e122:{
 "^":"Tp:13;",
-$1:function(a){return J.q8(a)},
+$1:function(a){return a.gPE()},
 $isEH:true},
 e123:{
 "^":"Tp:13;",
-$1:function(a){return a.ghX()},
+$1:function(a){return J.q8(a)},
 $isEH:true},
 e124:{
 "^":"Tp:13;",
-$1:function(a){return a.gvU()},
+$1:function(a){return a.ghX()},
 $isEH:true},
 e125:{
 "^":"Tp:13;",
-$1:function(a){return J.jl(a)},
+$1:function(a){return a.gvU()},
 $isEH:true},
 e126:{
 "^":"Tp:13;",
-$1:function(a){return a.gRd()},
+$1:function(a){return J.jl(a)},
 $isEH:true},
 e127:{
 "^":"Tp:13;",
-$1:function(a){return J.zY(a)},
+$1:function(a){return a.gRd()},
 $isEH:true},
 e128:{
 "^":"Tp:13;",
-$1:function(a){return J.k7(a)},
+$1:function(a){return J.zY(a)},
 $isEH:true},
 e129:{
 "^":"Tp:13;",
-$1:function(a){return J.oZ(a)},
+$1:function(a){return J.k7(a)},
 $isEH:true},
 e130:{
 "^":"Tp:13;",
-$1:function(a){return J.de(a)},
+$1:function(a){return J.oZ(a)},
 $isEH:true},
 e131:{
 "^":"Tp:13;",
-$1:function(a){return J.Ds(a)},
+$1:function(a){return J.de(a)},
 $isEH:true},
 e132:{
 "^":"Tp:13;",
-$1:function(a){return J.cO(a)},
+$1:function(a){return J.Ds(a)},
 $isEH:true},
 e133:{
 "^":"Tp:13;",
-$1:function(a){return a.gzM()},
+$1:function(a){return J.cO(a)},
 $isEH:true},
 e134:{
 "^":"Tp:13;",
-$1:function(a){return a.gMN()},
+$1:function(a){return a.gzM()},
 $isEH:true},
 e135:{
 "^":"Tp:13;",
-$1:function(a){return a.giP()},
+$1:function(a){return a.gMN()},
 $isEH:true},
 e136:{
 "^":"Tp:13;",
-$1:function(a){return a.gmd()},
+$1:function(a){return a.giP()},
 $isEH:true},
 e137:{
 "^":"Tp:13;",
-$1:function(a){return a.geH()},
+$1:function(a){return a.gmd()},
 $isEH:true},
 e138:{
 "^":"Tp:13;",
-$1:function(a){return J.S8(a)},
+$1:function(a){return a.geH()},
 $isEH:true},
 e139:{
 "^":"Tp:13;",
-$1:function(a){return J.kv(a)},
+$1:function(a){return J.S8(a)},
 $isEH:true},
 e140:{
 "^":"Tp:13;",
-$1:function(a){return J.ih(a)},
+$1:function(a){return J.kv(a)},
 $isEH:true},
 e141:{
 "^":"Tp:13;",
-$1:function(a){return J.z2(a)},
+$1:function(a){return J.ih(a)},
 $isEH:true},
 e142:{
 "^":"Tp:13;",
-$1:function(a){return J.ZF(a)},
+$1:function(a){return J.z2(a)},
 $isEH:true},
 e143:{
 "^":"Tp:13;",
-$1:function(a){return J.Lh(a)},
+$1:function(a){return J.ZF(a)},
 $isEH:true},
 e144:{
 "^":"Tp:13;",
-$1:function(a){return J.Zv(a)},
+$1:function(a){return J.Lh(a)},
 $isEH:true},
 e145:{
 "^":"Tp:13;",
-$1:function(a){return J.O6(a)},
+$1:function(a){return J.Zv(a)},
 $isEH:true},
 e146:{
 "^":"Tp:13;",
-$1:function(a){return J.Pf(a)},
+$1:function(a){return J.O6(a)},
 $isEH:true},
 e147:{
 "^":"Tp:13;",
-$1:function(a){return a.gUY()},
+$1:function(a){return J.Pf(a)},
 $isEH:true},
 e148:{
 "^":"Tp:13;",
-$1:function(a){return a.gvK()},
+$1:function(a){return a.gUY()},
 $isEH:true},
 e149:{
 "^":"Tp:13;",
-$1:function(a){return J.Jj(a)},
+$1:function(a){return a.gvK()},
 $isEH:true},
 e150:{
 "^":"Tp:13;",
-$1:function(a){return J.t8(a)},
+$1:function(a){return J.Jj(a)},
 $isEH:true},
 e151:{
 "^":"Tp:13;",
-$1:function(a){return a.gL1()},
+$1:function(a){return J.t8(a)},
 $isEH:true},
 e152:{
 "^":"Tp:13;",
-$1:function(a){return a.gxQ()},
+$1:function(a){return a.gL1()},
 $isEH:true},
 e153:{
 "^":"Tp:13;",
-$1:function(a){return J.ee(a)},
+$1:function(a){return a.gxQ()},
 $isEH:true},
 e154:{
 "^":"Tp:13;",
-$1:function(a){return J.JG(a)},
+$1:function(a){return J.ee(a)},
 $isEH:true},
 e155:{
 "^":"Tp:13;",
-$1:function(a){return J.AF(a)},
+$1:function(a){return J.JG(a)},
 $isEH:true},
 e156:{
 "^":"Tp:13;",
-$1:function(a){return J.LB(a)},
+$1:function(a){return J.AF(a)},
 $isEH:true},
 e157:{
 "^":"Tp:13;",
-$1:function(a){return J.Kl(a)},
+$1:function(a){return J.LB(a)},
 $isEH:true},
 e158:{
 "^":"Tp:13;",
-$1:function(a){return a.gU6()},
+$1:function(a){return J.Kl(a)},
 $isEH:true},
 e159:{
 "^":"Tp:13;",
-$1:function(a){return J.cj(a)},
+$1:function(a){return a.gU6()},
 $isEH:true},
 e160:{
 "^":"Tp:13;",
-$1:function(a){return J.br(a)},
+$1:function(a){return J.cj(a)},
 $isEH:true},
 e161:{
 "^":"Tp:13;",
-$1:function(a){return J.io(a)},
+$1:function(a){return J.br(a)},
 $isEH:true},
 e162:{
 "^":"Tp:13;",
-$1:function(a){return J.fy(a)},
+$1:function(a){return J.io(a)},
 $isEH:true},
 e163:{
 "^":"Tp:13;",
-$1:function(a){return J.Qa(a)},
+$1:function(a){return J.fy(a)},
 $isEH:true},
 e164:{
 "^":"Tp:13;",
-$1:function(a){return J.ks(a)},
+$1:function(a){return J.Qa(a)},
 $isEH:true},
 e165:{
 "^":"Tp:13;",
-$1:function(a){return J.CN(a)},
+$1:function(a){return J.ks(a)},
 $isEH:true},
 e166:{
 "^":"Tp:13;",
-$1:function(a){return J.ql(a)},
+$1:function(a){return J.CN(a)},
 $isEH:true},
 e167:{
 "^":"Tp:13;",
-$1:function(a){return J.ul(a)},
+$1:function(a){return J.ql(a)},
 $isEH:true},
 e168:{
 "^":"Tp:13;",
-$1:function(a){return J.Sz(a)},
+$1:function(a){return J.ul(a)},
 $isEH:true},
 e169:{
 "^":"Tp:13;",
-$1:function(a){return J.id(a)},
+$1:function(a){return J.Sz(a)},
 $isEH:true},
 e170:{
 "^":"Tp:13;",
-$1:function(a){return a.gm8()},
+$1:function(a){return J.id(a)},
 $isEH:true},
 e171:{
 "^":"Tp:13;",
-$1:function(a){return J.BZ(a)},
+$1:function(a){return a.gm8()},
 $isEH:true},
 e172:{
 "^":"Tp:13;",
-$1:function(a){return J.H1(a)},
+$1:function(a){return J.BZ(a)},
 $isEH:true},
 e173:{
 "^":"Tp:13;",
-$1:function(a){return J.Cm(a)},
+$1:function(a){return J.H1(a)},
 $isEH:true},
 e174:{
 "^":"Tp:13;",
-$1:function(a){return J.fU(a)},
+$1:function(a){return J.Cm(a)},
 $isEH:true},
 e175:{
 "^":"Tp:13;",
-$1:function(a){return J.GH(a)},
+$1:function(a){return J.fU(a)},
 $isEH:true},
 e176:{
 "^":"Tp:13;",
-$1:function(a){return J.n8(a)},
+$1:function(a){return J.GH(a)},
 $isEH:true},
 e177:{
 "^":"Tp:13;",
-$1:function(a){return a.gLc()},
+$1:function(a){return J.n8(a)},
 $isEH:true},
 e178:{
 "^":"Tp:13;",
-$1:function(a){return a.gNS()},
+$1:function(a){return a.gLc()},
 $isEH:true},
 e179:{
 "^":"Tp:13;",
-$1:function(a){return a.guh()},
+$1:function(a){return a.gNS()},
 $isEH:true},
 e180:{
 "^":"Tp:13;",
-$1:function(a){return J.iL(a)},
+$1:function(a){return a.guh()},
 $isEH:true},
 e181:{
 "^":"Tp:13;",
-$1:function(a){return J.bx(a)},
+$1:function(a){return J.iL(a)},
 $isEH:true},
 e182:{
 "^":"Tp:13;",
-$1:function(a){return J.uW(a)},
+$1:function(a){return J.bx(a)},
 $isEH:true},
 e183:{
 "^":"Tp:13;",
-$1:function(a){return J.W2(a)},
+$1:function(a){return J.uW(a)},
 $isEH:true},
 e184:{
 "^":"Tp:13;",
-$1:function(a){return J.UT(a)},
+$1:function(a){return J.W2(a)},
 $isEH:true},
 e185:{
 "^":"Tp:13;",
-$1:function(a){return J.Kd(a)},
+$1:function(a){return J.UT(a)},
 $isEH:true},
 e186:{
 "^":"Tp:13;",
-$1:function(a){return J.pU(a)},
+$1:function(a){return J.Kd(a)},
 $isEH:true},
 e187:{
 "^":"Tp:13;",
-$1:function(a){return J.Tg(a)},
+$1:function(a){return J.pU(a)},
 $isEH:true},
 e188:{
 "^":"Tp:13;",
-$1:function(a){return a.gVc()},
+$1:function(a){return J.Tg(a)},
 $isEH:true},
 e189:{
 "^":"Tp:13;",
-$1:function(a){return a.gpF()},
+$1:function(a){return a.gVc()},
 $isEH:true},
 e190:{
 "^":"Tp:13;",
-$1:function(a){return J.TY(a)},
+$1:function(a){return a.gpF()},
 $isEH:true},
 e191:{
 "^":"Tp:13;",
-$1:function(a){return a.gA6()},
+$1:function(a){return J.TY(a)},
 $isEH:true},
 e192:{
 "^":"Tp:13;",
-$1:function(a){return J.Ry(a)},
+$1:function(a){return a.gA6()},
 $isEH:true},
 e193:{
 "^":"Tp:13;",
-$1:function(a){return J.UP(a)},
+$1:function(a){return J.Ry(a)},
 $isEH:true},
 e194:{
 "^":"Tp:13;",
-$1:function(a){return J.fw(a)},
+$1:function(a){return J.UP(a)},
 $isEH:true},
 e195:{
 "^":"Tp:13;",
-$1:function(a){return J.zH(a)},
+$1:function(a){return J.fw(a)},
 $isEH:true},
 e196:{
 "^":"Tp:13;",
-$1:function(a){return J.Zs(a)},
+$1:function(a){return J.zH(a)},
 $isEH:true},
 e197:{
 "^":"Tp:13;",
-$1:function(a){return a.gXR()},
+$1:function(a){return J.Zs(a)},
 $isEH:true},
 e198:{
 "^":"Tp:13;",
-$1:function(a){return J.NB(a)},
+$1:function(a){return a.gXR()},
 $isEH:true},
 e199:{
 "^":"Tp:13;",
-$1:function(a){return a.gzS()},
+$1:function(a){return J.NB(a)},
 $isEH:true},
 e200:{
 "^":"Tp:13;",
-$1:function(a){return J.U8(a)},
+$1:function(a){return a.gzS()},
 $isEH:true},
 e201:{
 "^":"Tp:13;",
-$1:function(a){return J.oN(a)},
+$1:function(a){return J.U8(a)},
 $isEH:true},
 e202:{
 "^":"Tp:13;",
-$1:function(a){return a.gV8()},
+$1:function(a){return J.oN(a)},
 $isEH:true},
 e203:{
 "^":"Tp:13;",
-$1:function(a){return a.gp8()},
+$1:function(a){return a.gV8()},
 $isEH:true},
 e204:{
 "^":"Tp:13;",
-$1:function(a){return J.F9(a)},
+$1:function(a){return a.gp8()},
 $isEH:true},
 e205:{
 "^":"Tp:13;",
-$1:function(a){return J.HB(a)},
+$1:function(a){return J.F9(a)},
 $isEH:true},
 e206:{
 "^":"Tp:13;",
-$1:function(a){return J.jB(a)},
+$1:function(a){return J.HB(a)},
 $isEH:true},
 e207:{
 "^":"Tp:13;",
-$1:function(a){return J.xb(a)},
+$1:function(a){return J.jB(a)},
 $isEH:true},
 e208:{
 "^":"Tp:13;",
-$1:function(a){return a.gS5()},
+$1:function(a){return J.xb(a)},
 $isEH:true},
 e209:{
 "^":"Tp:13;",
-$1:function(a){return a.gDo()},
+$1:function(a){return a.gS5()},
 $isEH:true},
 e210:{
 "^":"Tp:13;",
-$1:function(a){return a.guj()},
+$1:function(a){return a.gDo()},
 $isEH:true},
 e211:{
 "^":"Tp:13;",
-$1:function(a){return J.j1(a)},
+$1:function(a){return a.guj()},
 $isEH:true},
 e212:{
 "^":"Tp:13;",
-$1:function(a){return J.Aw(a)},
+$1:function(a){return J.j1(a)},
 $isEH:true},
 e213:{
 "^":"Tp:13;",
-$1:function(a){return J.l2(a)},
+$1:function(a){return J.Aw(a)},
 $isEH:true},
 e214:{
 "^":"Tp:13;",
-$1:function(a){return a.gm2()},
+$1:function(a){return J.l2(a)},
 $isEH:true},
 e215:{
 "^":"Tp:13;",
-$1:function(a){return J.dY(a)},
+$1:function(a){return a.gm2()},
 $isEH:true},
 e216:{
 "^":"Tp:13;",
-$1:function(a){return J.yq(a)},
+$1:function(a){return J.dY(a)},
 $isEH:true},
 e217:{
 "^":"Tp:13;",
-$1:function(a){return a.gki()},
+$1:function(a){return J.yq(a)},
 $isEH:true},
 e218:{
 "^":"Tp:13;",
-$1:function(a){return a.gZn()},
+$1:function(a){return a.gki()},
 $isEH:true},
 e219:{
 "^":"Tp:13;",
-$1:function(a){return a.gvs()},
+$1:function(a){return a.gZn()},
 $isEH:true},
 e220:{
 "^":"Tp:13;",
-$1:function(a){return a.gVh()},
+$1:function(a){return a.gvs()},
 $isEH:true},
 e221:{
 "^":"Tp:13;",
-$1:function(a){return a.gZX()},
+$1:function(a){return a.gVh()},
 $isEH:true},
 e222:{
 "^":"Tp:13;",
-$1:function(a){return J.d5(a)},
+$1:function(a){return a.gZX()},
 $isEH:true},
 e223:{
 "^":"Tp:13;",
-$1:function(a){return J.SG(a)},
+$1:function(a){return J.d5(a)},
 $isEH:true},
 e224:{
 "^":"Tp:13;",
-$1:function(a){return J.cs(a)},
+$1:function(a){return J.SG(a)},
 $isEH:true},
 e225:{
 "^":"Tp:13;",
-$1:function(a){return a.gVF()},
+$1:function(a){return J.cs(a)},
 $isEH:true},
 e226:{
 "^":"Tp:13;",
-$1:function(a){return a.gkw()},
+$1:function(a){return a.gVF()},
 $isEH:true},
 e227:{
 "^":"Tp:13;",
-$1:function(a){return J.K2(a)},
+$1:function(a){return a.gkw()},
 $isEH:true},
 e228:{
 "^":"Tp:13;",
-$1:function(a){return J.uy(a)},
+$1:function(a){return J.K2(a)},
 $isEH:true},
 e229:{
 "^":"Tp:13;",
-$1:function(a){return a.gEy()},
+$1:function(a){return J.uy(a)},
 $isEH:true},
 e230:{
 "^":"Tp:13;",
-$1:function(a){return J.XJ(a)},
+$1:function(a){return a.gEy()},
 $isEH:true},
 e231:{
 "^":"Tp:13;",
-$1:function(a){return J.P4(a)},
+$1:function(a){return J.XJ(a)},
 $isEH:true},
 e232:{
 "^":"Tp:13;",
-$1:function(a){return a.gJk()},
+$1:function(a){return J.P4(a)},
 $isEH:true},
 e233:{
 "^":"Tp:13;",
-$1:function(a){return J.Q2(a)},
+$1:function(a){return a.gJk()},
 $isEH:true},
 e234:{
 "^":"Tp:13;",
-$1:function(a){return a.gSU()},
+$1:function(a){return J.Q2(a)},
 $isEH:true},
 e235:{
 "^":"Tp:13;",
-$1:function(a){return a.gXA()},
+$1:function(a){return a.gSU()},
 $isEH:true},
 e236:{
 "^":"Tp:13;",
-$1:function(a){return a.gYY()},
+$1:function(a){return a.gXA()},
 $isEH:true},
 e237:{
 "^":"Tp:13;",
-$1:function(a){return a.gZ3()},
+$1:function(a){return a.gYY()},
 $isEH:true},
 e238:{
 "^":"Tp:13;",
-$1:function(a){return J.ry(a)},
+$1:function(a){return a.gZ3()},
 $isEH:true},
 e239:{
 "^":"Tp:13;",
-$1:function(a){return J.I2(a)},
+$1:function(a){return J.ry(a)},
 $isEH:true},
 e240:{
 "^":"Tp:13;",
-$1:function(a){return a.gdN()},
+$1:function(a){return J.I2(a)},
 $isEH:true},
 e241:{
 "^":"Tp:13;",
-$1:function(a){return J.NC(a)},
+$1:function(a){return a.gdN()},
 $isEH:true},
 e242:{
 "^":"Tp:13;",
-$1:function(a){return a.gV0()},
+$1:function(a){return J.NC(a)},
 $isEH:true},
 e243:{
-"^":"Tp:78;",
-$2:function(a,b){J.RX(a,b)},
+"^":"Tp:13;",
+$1:function(a){return a.gV0()},
 $isEH:true},
 e244:{
-"^":"Tp:78;",
-$2:function(a,b){J.L9(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.RX(a,b)},
 $isEH:true},
 e245:{
-"^":"Tp:78;",
-$2:function(a,b){J.l7(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.L9(a,b)},
 $isEH:true},
 e246:{
-"^":"Tp:78;",
-$2:function(a,b){J.kB(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.l7(a,b)},
 $isEH:true},
 e247:{
-"^":"Tp:78;",
-$2:function(a,b){J.Ae(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.kB(a,b)},
 $isEH:true},
 e248:{
-"^":"Tp:78;",
-$2:function(a,b){J.IX(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Ae(a,b)},
 $isEH:true},
 e249:{
-"^":"Tp:78;",
-$2:function(a,b){J.Ed(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.IX(a,b)},
 $isEH:true},
 e250:{
-"^":"Tp:78;",
-$2:function(a,b){J.NE(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Ed(a,b)},
 $isEH:true},
 e251:{
-"^":"Tp:78;",
-$2:function(a,b){J.WI(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.NE(a,b)},
 $isEH:true},
 e252:{
-"^":"Tp:78;",
-$2:function(a,b){J.NZ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.WI(a,b)},
 $isEH:true},
 e253:{
-"^":"Tp:78;",
-$2:function(a,b){J.T5(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.NZ(a,b)},
 $isEH:true},
 e254:{
-"^":"Tp:78;",
-$2:function(a,b){J.i0(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.T5(a,b)},
 $isEH:true},
 e255:{
-"^":"Tp:78;",
-$2:function(a,b){J.Sf(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.i0(a,b)},
 $isEH:true},
 e256:{
-"^":"Tp:78;",
-$2:function(a,b){J.LM(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Sf(a,b)},
 $isEH:true},
 e257:{
-"^":"Tp:78;",
-$2:function(a,b){J.qq(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.LM(a,b)},
 $isEH:true},
 e258:{
-"^":"Tp:78;",
-$2:function(a,b){J.Ac(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.qq(a,b)},
 $isEH:true},
 e259:{
-"^":"Tp:78;",
-$2:function(a,b){J.Yz(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Ac(a,b)},
 $isEH:true},
 e260:{
-"^":"Tp:78;",
-$2:function(a,b){a.sw2(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Yz(a,b)},
 $isEH:true},
 e261:{
-"^":"Tp:78;",
-$2:function(a,b){J.Qr(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sej(b)},
 $isEH:true},
 e262:{
-"^":"Tp:78;",
-$2:function(a,b){J.xW(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sw2(b)},
 $isEH:true},
 e263:{
-"^":"Tp:78;",
-$2:function(a,b){J.Wy(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Qr(a,b)},
 $isEH:true},
 e264:{
-"^":"Tp:78;",
-$2:function(a,b){J.i2(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.xW(a,b)},
 $isEH:true},
 e265:{
-"^":"Tp:78;",
-$2:function(a,b){J.BC(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Wy(a,b)},
 $isEH:true},
 e266:{
-"^":"Tp:78;",
-$2:function(a,b){J.pB(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.i2(a,b)},
 $isEH:true},
 e267:{
-"^":"Tp:78;",
-$2:function(a,b){J.NO(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.BC(a,b)},
 $isEH:true},
 e268:{
-"^":"Tp:78;",
-$2:function(a,b){J.WB(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.pB(a,b)},
 $isEH:true},
 e269:{
-"^":"Tp:78;",
-$2:function(a,b){J.JZ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.NO(a,b)},
 $isEH:true},
 e270:{
-"^":"Tp:78;",
-$2:function(a,b){J.fR(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.WB(a,b)},
 $isEH:true},
 e271:{
-"^":"Tp:78;",
-$2:function(a,b){a.shY(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.JZ(a,b)},
 $isEH:true},
 e272:{
-"^":"Tp:78;",
-$2:function(a,b){J.uP(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.fR(a,b)},
 $isEH:true},
 e273:{
-"^":"Tp:78;",
-$2:function(a,b){J.vJ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.shY(b)},
 $isEH:true},
 e274:{
-"^":"Tp:78;",
-$2:function(a,b){J.Nf(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.uP(a,b)},
 $isEH:true},
 e275:{
-"^":"Tp:78;",
-$2:function(a,b){J.Pl(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.vJ(a,b)},
 $isEH:true},
 e276:{
-"^":"Tp:78;",
-$2:function(a,b){J.C3(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Nf(a,b)},
 $isEH:true},
 e277:{
-"^":"Tp:78;",
-$2:function(a,b){J.xH(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Pl(a,b)},
 $isEH:true},
 e278:{
-"^":"Tp:78;",
-$2:function(a,b){J.Nh(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.C3(a,b)},
 $isEH:true},
 e279:{
-"^":"Tp:78;",
-$2:function(a,b){J.AI(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.xH(a,b)},
 $isEH:true},
 e280:{
-"^":"Tp:78;",
-$2:function(a,b){J.nA(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Nh(a,b)},
 $isEH:true},
 e281:{
-"^":"Tp:78;",
-$2:function(a,b){J.fb(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.AI(a,b)},
 $isEH:true},
 e282:{
-"^":"Tp:78;",
-$2:function(a,b){a.siq(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.nA(a,b)},
 $isEH:true},
 e283:{
-"^":"Tp:78;",
-$2:function(a,b){J.Qy(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.fb(a,b)},
 $isEH:true},
 e284:{
-"^":"Tp:78;",
-$2:function(a,b){J.x0(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.siq(b)},
 $isEH:true},
 e285:{
-"^":"Tp:78;",
-$2:function(a,b){a.sKt(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Qy(a,b)},
 $isEH:true},
 e286:{
-"^":"Tp:78;",
-$2:function(a,b){J.cV(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.x0(a,b)},
 $isEH:true},
 e287:{
-"^":"Tp:78;",
-$2:function(a,b){J.mU(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sKt(b)},
 $isEH:true},
 e288:{
-"^":"Tp:78;",
-$2:function(a,b){J.Kz(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.cV(a,b)},
 $isEH:true},
 e289:{
-"^":"Tp:78;",
-$2:function(a,b){J.uM(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.mU(a,b)},
 $isEH:true},
 e290:{
-"^":"Tp:78;",
-$2:function(a,b){J.Er(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Kz(a,b)},
 $isEH:true},
 e291:{
-"^":"Tp:78;",
-$2:function(a,b){J.GZ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.uM(a,b)},
 $isEH:true},
 e292:{
-"^":"Tp:78;",
-$2:function(a,b){J.hS(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Er(a,b)},
 $isEH:true},
 e293:{
-"^":"Tp:78;",
-$2:function(a,b){J.mz(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.GZ(a,b)},
 $isEH:true},
 e294:{
-"^":"Tp:78;",
-$2:function(a,b){J.pA(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.hS(a,b)},
 $isEH:true},
 e295:{
-"^":"Tp:78;",
-$2:function(a,b){a.sSK(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.mz(a,b)},
 $isEH:true},
 e296:{
-"^":"Tp:78;",
-$2:function(a,b){a.shX(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.pA(a,b)},
 $isEH:true},
 e297:{
-"^":"Tp:78;",
-$2:function(a,b){J.cl(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sSK(b)},
 $isEH:true},
 e298:{
-"^":"Tp:78;",
-$2:function(a,b){J.Jb(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.shX(b)},
 $isEH:true},
 e299:{
-"^":"Tp:78;",
-$2:function(a,b){J.xQ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.cl(a,b)},
 $isEH:true},
 e300:{
-"^":"Tp:78;",
-$2:function(a,b){J.MX(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Jb(a,b)},
 $isEH:true},
 e301:{
-"^":"Tp:78;",
-$2:function(a,b){J.A4(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.xQ(a,b)},
 $isEH:true},
 e302:{
-"^":"Tp:78;",
-$2:function(a,b){J.wD(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.MX(a,b)},
 $isEH:true},
 e303:{
-"^":"Tp:78;",
-$2:function(a,b){J.wJ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.A4(a,b)},
 $isEH:true},
 e304:{
-"^":"Tp:78;",
-$2:function(a,b){J.oJ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.wD(a,b)},
 $isEH:true},
 e305:{
-"^":"Tp:78;",
-$2:function(a,b){J.DF(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.wJ(a,b)},
 $isEH:true},
 e306:{
-"^":"Tp:78;",
-$2:function(a,b){a.svK(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.oJ(a,b)},
 $isEH:true},
 e307:{
-"^":"Tp:78;",
-$2:function(a,b){J.h9(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.DF(a,b)},
 $isEH:true},
 e308:{
-"^":"Tp:78;",
-$2:function(a,b){a.sL1(b)},
+"^":"Tp:79;",
+$2:function(a,b){a.svK(b)},
 $isEH:true},
 e309:{
-"^":"Tp:78;",
-$2:function(a,b){J.XF(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.h9(a,b)},
 $isEH:true},
 e310:{
-"^":"Tp:78;",
-$2:function(a,b){J.SF(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sL1(b)},
 $isEH:true},
 e311:{
-"^":"Tp:78;",
-$2:function(a,b){J.Qv(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.XF(a,b)},
 $isEH:true},
 e312:{
-"^":"Tp:78;",
-$2:function(a,b){J.R8(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.SF(a,b)},
 $isEH:true},
 e313:{
-"^":"Tp:78;",
-$2:function(a,b){J.Xg(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Qv(a,b)},
 $isEH:true},
 e314:{
-"^":"Tp:78;",
-$2:function(a,b){J.aw(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.R8(a,b)},
 $isEH:true},
 e315:{
-"^":"Tp:78;",
-$2:function(a,b){J.CJ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Xg(a,b)},
 $isEH:true},
 e316:{
-"^":"Tp:78;",
-$2:function(a,b){J.P2(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.aw(a,b)},
 $isEH:true},
 e317:{
-"^":"Tp:78;",
-$2:function(a,b){J.fv(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.CJ(a,b)},
 $isEH:true},
 e318:{
-"^":"Tp:78;",
-$2:function(a,b){J.J0(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.P2(a,b)},
 $isEH:true},
 e319:{
-"^":"Tp:78;",
-$2:function(a,b){J.PP(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.fv(a,b)},
 $isEH:true},
 e320:{
-"^":"Tp:78;",
-$2:function(a,b){J.Sj(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.J0(a,b)},
 $isEH:true},
 e321:{
-"^":"Tp:78;",
-$2:function(a,b){J.tv(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.PP(a,b)},
 $isEH:true},
 e322:{
-"^":"Tp:78;",
-$2:function(a,b){J.w7(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Sj(a,b)},
 $isEH:true},
 e323:{
-"^":"Tp:78;",
-$2:function(a,b){J.ME(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.tv(a,b)},
 $isEH:true},
 e324:{
-"^":"Tp:78;",
-$2:function(a,b){J.kX(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.w7(a,b)},
 $isEH:true},
 e325:{
-"^":"Tp:78;",
-$2:function(a,b){J.q0(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.ME(a,b)},
 $isEH:true},
 e326:{
-"^":"Tp:78;",
-$2:function(a,b){J.EJ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.kX(a,b)},
 $isEH:true},
 e327:{
-"^":"Tp:78;",
-$2:function(a,b){J.iH(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.q0(a,b)},
 $isEH:true},
 e328:{
-"^":"Tp:78;",
-$2:function(a,b){J.SO(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.EJ(a,b)},
 $isEH:true},
 e329:{
-"^":"Tp:78;",
-$2:function(a,b){J.B9(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.iH(a,b)},
 $isEH:true},
 e330:{
-"^":"Tp:78;",
-$2:function(a,b){J.PN(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.SO(a,b)},
 $isEH:true},
 e331:{
-"^":"Tp:78;",
-$2:function(a,b){a.sVc(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.B9(a,b)},
 $isEH:true},
 e332:{
-"^":"Tp:78;",
-$2:function(a,b){J.By(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.PN(a,b)},
 $isEH:true},
 e333:{
-"^":"Tp:78;",
-$2:function(a,b){J.jd(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sVc(b)},
 $isEH:true},
 e334:{
-"^":"Tp:78;",
-$2:function(a,b){J.Rx(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.By(a,b)},
 $isEH:true},
 e335:{
-"^":"Tp:78;",
-$2:function(a,b){J.ZI(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.jd(a,b)},
 $isEH:true},
 e336:{
-"^":"Tp:78;",
-$2:function(a,b){J.fa(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Rx(a,b)},
 $isEH:true},
 e337:{
-"^":"Tp:78;",
-$2:function(a,b){J.Cu(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.ZI(a,b)},
 $isEH:true},
 e338:{
-"^":"Tp:78;",
-$2:function(a,b){a.sV8(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.fa(a,b)},
 $isEH:true},
 e339:{
-"^":"Tp:78;",
-$2:function(a,b){J.EC(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Cu(a,b)},
 $isEH:true},
 e340:{
-"^":"Tp:78;",
-$2:function(a,b){J.Hn(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sV8(b)},
 $isEH:true},
 e341:{
-"^":"Tp:78;",
-$2:function(a,b){J.Tx(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.EC(a,b)},
 $isEH:true},
 e342:{
-"^":"Tp:78;",
-$2:function(a,b){a.sDo(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Hn(a,b)},
 $isEH:true},
 e343:{
-"^":"Tp:78;",
-$2:function(a,b){a.suj(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.Tx(a,b)},
 $isEH:true},
 e344:{
-"^":"Tp:78;",
-$2:function(a,b){J.H3(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sDo(b)},
 $isEH:true},
 e345:{
-"^":"Tp:78;",
-$2:function(a,b){J.TZ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.suj(b)},
 $isEH:true},
 e346:{
-"^":"Tp:78;",
-$2:function(a,b){J.t3(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.H3(a,b)},
 $isEH:true},
 e347:{
-"^":"Tp:78;",
-$2:function(a,b){J.my(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.TZ(a,b)},
 $isEH:true},
 e348:{
-"^":"Tp:78;",
-$2:function(a,b){a.sVF(b)},
+"^":"Tp:79;",
+$2:function(a,b){J.t3(a,b)},
 $isEH:true},
 e349:{
-"^":"Tp:78;",
-$2:function(a,b){J.yO(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.my(a,b)},
 $isEH:true},
 e350:{
-"^":"Tp:78;",
-$2:function(a,b){J.ZU(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){a.sVF(b)},
 $isEH:true},
 e351:{
-"^":"Tp:78;",
-$2:function(a,b){J.tQ(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.yO(a,b)},
 $isEH:true},
 e352:{
-"^":"Tp:78;",
-$2:function(a,b){J.tH(a,b)},
+"^":"Tp:79;",
+$2:function(a,b){J.ZU(a,b)},
 $isEH:true},
 e353:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+"^":"Tp:79;",
+$2:function(a,b){J.tQ(a,b)},
 $isEH:true},
 e354:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
+"^":"Tp:79;",
+$2:function(a,b){J.tH(a,b)},
 $isEH:true},
 e355:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e356:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e357:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e358:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e359:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e360:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e361:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e362:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e363:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e364:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e365:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e366:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e367:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e368:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e369:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e370:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e371:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e372:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e373:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e374:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e375:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e376:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e377:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e378:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e379:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e380:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e381:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e382:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e383:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e384:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e385:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e386:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
+e380:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e381:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e382:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e383:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e384:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e385:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e386:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+$isEH:true},
 e387:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e388:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e389:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e390:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e391:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e392:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e393:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e394:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e395:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e396:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e397:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e398:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e399:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e400:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e401:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e402:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e403:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e404:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e405:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e406:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e407:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e408:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e409:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e410:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e411:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e412:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e413:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e414:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e415:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e416:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e417:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e418:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e419:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e420:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e421:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e422:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e423:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e424:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e425:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e426:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e427:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e428:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e429:{
-"^":"Tp:70;",
-$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+"^":"Tp:71;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e430:{
-"^":"Tp:70;",
+"^":"Tp:71;",
+$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e431:{
+"^":"Tp:71;",
+$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e432:{
+"^":"Tp:71;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
 $isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
@@ -4409,7 +4420,7 @@
 "^":"pv;BW,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 grs:function(a){return a.BW},
 srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-pA:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,20,98],
 static:{Dw:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4438,8 +4449,8 @@
 a.XN=!1
 a.Xy=z
 a.ZQ=y
-C.YZ.ZL(a)
-C.YZ.XI(a)
+C.YZz.ZL(a)
+C.YZz.XI(a)
 return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
 "^":"",
 CZ:{
@@ -4488,8 +4499,8 @@
 x=new H.XO(q,null)
 N.QM("").xH("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,98,99],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,98,99],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -4500,7 +4511,7 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gwJ",6,0,100,1,101,102],
+N.QM("").xH("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,1,102,103],
 static:{l0:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4518,7 +4529,7 @@
 $isd3:true},
 nc:{
 "^":"Tp:13;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,103,"call"],
+$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,104,"call"],
 $isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 aC:{
@@ -4529,13 +4540,13 @@
 sWt:function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,b)},
 gCF:function(a){return a.mN},
 sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,104,105],
-tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ez(a))},"$1","gR1",2,0,106,107],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,106,108],
+vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,105,106],
+tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ez(a))},"$1","gR1",2,0,107,108],
+S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,107,109],
 pA:[function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,null)
 a.mN=this.ct(a,C.tg,a.mN,null)
-J.cI(a.yB).YM(b)},"$1","gvC",2,0,20,97],
-j9:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,20,97],
+J.cI(a.yB).YM(b)},"$1","gvC",2,0,20,98],
+j9:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,20,98],
 static:{lW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4552,16 +4563,16 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ez:{
-"^":"Tp:109;a",
+"^":"Tp:110;a",
 $1:[function(a){var z=this.a
-z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,91,"call"],
+z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 SS:{
-"^":"Tp:109;a",
+"^":"Tp:110;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,91,"call"],
+z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,92,"call"],
 $isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 VY:{
@@ -4592,7 +4603,7 @@
 z=a.Xx
 if(z==null)return
 J.SK(z).ml(new F.Bc())},
-pA:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,20,98],
 b0:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
@@ -4602,10 +4613,10 @@
 return x},
 YI:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gff",6,0,110,1,101,102],
+J.pP(z).h(0,"highlight")},"$3","gff",6,0,111,1,102,103],
 Lk:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,110,1,101,102],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,111,1,102,103],
 static:{f9:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4622,8 +4633,8 @@
 "^":"uL+Pi;",
 $isd3:true},
 Bc:{
-"^":"Tp:111;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,82,"call"],
+"^":"Tp:112;",
+$1:[function(a){a.OF()},"$1",null,2,0,null,83,"call"],
 $isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 JI:{
@@ -4647,7 +4658,7 @@
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.gN2(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,81,46,47,82],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,82,46,47,83],
 static:{oS:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4904,6 +4915,13 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
+zH:function(a){var z,y,x
+z=P.Ls(null,null,null,H.ip(this,"aL",0))
+y=0
+while(!0){x=this.gB(this)
+if(typeof x!=="number")return H.s(x)
+if(!(y<x))break
+z.h(0,this.Zv(0,y));++y}return z},
 $isyN:true},
 bX:{
 "^":"aL;l6,SH,AN",
@@ -5039,7 +5057,7 @@
 Nk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-Zl:{
+JJ:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
@@ -5062,7 +5080,7 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+Zl;",
+"^":"ark+JJ;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5145,7 +5163,7 @@
 if(J.xC($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
 z.wr(z.xi(a,!0))},
-x2:function(a,b,c,d,e,f){return e?H.VM(new P.F4(b,c,d,a,null,0,null),[f]):H.VM(new P.q1(b,c,d,a,null,0,null),[f])},
+x2:function(a,b,c,d,e,f){return e?H.VM(new P.Mv(b,c,d,a,null,0,null),[f]):H.VM(new P.q1(b,c,d,a,null,0,null),[f])},
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -5212,7 +5230,7 @@
 z=P.YM(null,null,null,null,null)
 return new P.uo(c,d,z)},"$5","Is",10,0,44],
 C6:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -5284,9 +5302,9 @@
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},112],
+this.Iv(b)},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},113],
 js:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,113,23,24,25],
+this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,114,23,24,25],
 xO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.yx
@@ -5366,7 +5384,7 @@
 "^":"a;",
 $isb8:true},
 w4:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
@@ -5374,7 +5392,7 @@
 this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 mQ:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:[function(a,b){var z,y,x
 z=this.a
 y=z.b
@@ -5382,10 +5400,10 @@
 x=--z.c
 if(y!=null)if(x===0||this.b)z.a.w0(a,b)
 else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,114,115,"call"],
+z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,115,116,"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:116;a,c,d",
+"^":"Tp:117;a,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=--z.c
@@ -5407,12 +5425,12 @@
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,117,23,21],
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,118,23,21],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,113,23,24,25]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,114,23,24,25]},
 Gc:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -5538,7 +5556,7 @@
 y=b
 b=q}}}},
 da:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 U7:{
@@ -5546,23 +5564,23 @@
 $1:[function(a){this.a.R8(a)},"$1",null,2,0,null,21,"call"],
 $isEH:true},
 vr:{
-"^":"Tp:118;b",
+"^":"Tp:119;b",
 $2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
 $isEH:true},
 cX:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 eX:{
-"^":"Tp:70;c,d",
+"^":"Tp:71;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:70;a,b,c",
+"^":"Tp:71;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:119;b,d,e,f",
+"^":"Tp:120;b,d,e,f",
 $0:function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
@@ -5629,10 +5647,10 @@
 $isEH:true},
 jZ:{
 "^":"Tp:13;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,120,"call"],
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:118;a,mG",
+"^":"Tp:119;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isGc){y=P.Dt(null)
@@ -5644,8 +5662,8 @@
 Ki:function(a){return this.FR.$0()}},
 wS:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"bp",ret:P.wS,args:[{func:"Lf",args:[a]}]}},this.$receiver,"wS")},121],
-lM:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},121],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"bp",ret:P.wS,args:[{func:"Lf",args:[a]}]}},this.$receiver,"wS")},122],
+lM:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},122],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
@@ -5676,6 +5694,11 @@
 z.a=null
 z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gaq())
 return y},
+zH:function(a){var z,y
+z=P.Ls(null,null,null,H.ip(this,"wS",0))
+y=P.Dt([P.xu,H.ip(this,"wS",0)])
+this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gaq())
+return y},
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"wS",0))
@@ -5695,28 +5718,28 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,122,"call"],
+P.FE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"wS")}},
 Oh:{
-"^":"Tp:70;e,f",
+"^":"Tp:71;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
 jvH:{
-"^":"Tp:123;a,UI",
+"^":"Tp:124;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 tG:{
-"^":"Tp:70;bK",
+"^":"Tp:71;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Tp;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,122,"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"wS")}},
 Rl:{
-"^":"Tp:70;e,f",
+"^":"Tp:71;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 at:{
@@ -5724,7 +5747,7 @@
 $1:function(a){},
 $isEH:true},
 M4:{
-"^":"Tp:70;UI",
+"^":"Tp:71;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 BSd:{
@@ -5732,19 +5755,19 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,122,"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"wS")}},
 WN:{
-"^":"Tp:70;e,f",
+"^":"Tp:71;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 XPB:{
-"^":"Tp:123;a,UI",
+"^":"Tp:124;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 dyj:{
-"^":"Tp:70;bK",
+"^":"Tp:71;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 PI:{
@@ -5752,7 +5775,7 @@
 $1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
 $isEH:true},
 uO:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 qg:{
@@ -5760,16 +5783,25 @@
 $1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,14,"call"],
 $isEH:true},
 Wd:{
-"^":"Tp:70;c",
+"^":"Tp:71;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
+oY:{
+"^":"Tp;a,b",
+$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,113,"call"],
+$isEH:true,
+$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.a,"wS")}},
+yZ:{
+"^":"Tp:71;c,d",
+$0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
+$isEH:true},
 xp:{
 "^":"Tp;a,b,c",
 $1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"wS")}},
 OC:{
-"^":"Tp:70;d",
+"^":"Tp:71;d",
 $0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
@@ -5780,7 +5812,7 @@
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"wS")}},
 eI:{
-"^":"Tp:70;a,c",
+"^":"Tp:71;a,c",
 $0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
@@ -5858,7 +5890,7 @@
 m4:function(a){if((this.Gv&8)!==0)this.xG.QE(0)
 P.ot(this.gZ9())}},
 UO:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:function(){P.ot(this.a.gnL())},
 $isEH:true},
 BcV:{
@@ -5881,7 +5913,7 @@
 tA:function(){return this.QC.$0()}},
 ZzD:{
 "^":"nR+of2;"},
-F4:{
+Mv:{
 "^":"MFI;nL<,p4<,Z9<,QC<,xG,Gv,yx",
 tA:function(){return this.QC.$0()}},
 MFI:{
@@ -5918,7 +5950,7 @@
 this.Gv=(z+128|4)>>>0
 if(b!=null)b.YM(this.gDQ(this))
 if(z<128&&this.Ri!=null)this.Ri.IO()
-if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,124,23,125],
+if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,23,126],
 QE:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -6075,7 +6107,7 @@
 this.Gv=1},
 IO:function(){if(this.Gv===1)this.Gv=3}},
 CR:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -6109,7 +6141,7 @@
 fm:function(a,b){},
 y5:function(a){this.Bd=a},
 Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,124,23,125],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,23,126],
 QE:[function(a){var z=this.Gv
 if(z>=4){z-=4
 this.Gv=z
@@ -6124,15 +6156,15 @@
 $isMO:true,
 static:{"^":"D4,ED7,ELg"}},
 dR:{
-"^":"Tp:70;a,b,c",
+"^":"Tp:71;a,b,c",
 $0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:126;a,b",
+"^":"Tp:127;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 QX:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 og:{
@@ -6168,8 +6200,8 @@
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},112],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,127,24,25],
+vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},113],
+xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,128,24,25],
 Sp:[function(){this.Qj()},"$0","gH1",0,0,18],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
@@ -6304,11 +6336,11 @@
 if(b)return new P.dv(this,z)
 else return new P.wd(this,z)}},
 TF:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Xz:{
-"^":"Tp:70;c,d",
+"^":"Tp:71;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
@@ -6320,11 +6352,11 @@
 $1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,33,"call"],
 $isEH:true},
 dv:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,9,10,"call"],
 $isEH:true},
 wd:{
-"^":"Tp:78;c,d",
+"^":"Tp:79;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,9,10,"call"],
 $isEH:true},
 uo:{
@@ -6348,11 +6380,11 @@
 uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
 Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
 FO:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:70;c,d",
+"^":"Tp:71;c,d",
 $0:[function(){var z,y
 z=this.c
 P.FL("Uncaught Error: "+H.d(z))
@@ -6362,8 +6394,8 @@
 throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Uez:{
-"^":"Tp:78;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,21,"call"],
+"^":"Tp:79;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,21,"call"],
 $isEH:true},
 AHi:{
 "^":"a;",
@@ -6605,7 +6637,7 @@
 return z}}},
 oi:{
 "^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,128,"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
@@ -6793,11 +6825,11 @@
 return z}}},
 a1:{
 "^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,128,"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
 $isEH:true},
 pk:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,21,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a,b){return{func:"lb",args:[a,b]}},this.a,"YB")}},
 db:{
@@ -6833,6 +6865,9 @@
 return!0}}}},
 Rr:{
 "^":"u3T;X5,vv,OX,OB,DM",
+Ys:function(){var z=new P.Rr(0,null,null,null,null)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
 gA:function(a){var z=new P.cN(this,this.Zl(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
@@ -6881,7 +6916,7 @@
 this.DM=null
 return!0},
 FV:function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},
+for(z=J.mY(b);z.G();)this.h(0,z.gl())},
 Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
 else return this.bB(b)},
@@ -6931,6 +6966,7 @@
 z=a.length
 for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
+$isxu:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -6952,6 +6988,9 @@
 return!0}}},
 D0:{
 "^":"u3T;X5,vv,OX,OB,H9,lX,zN",
+Ys:function(){var z=new P.D0(0,null,null,null,null,null,0)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
 gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
@@ -7068,6 +7107,7 @@
 z=a.length
 for(y=0;y<z;++y)if(J.xC(J.Nq(a[y]),b))return y
 return-1},
+$isxu:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -7094,7 +7134,10 @@
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]}},
 u3T:{
-"^":"Vj5;"},
+"^":"Vj5;",
+zH:function(a){var z=this.Ys()
+z.FV(0,this)
+return z}},
 mW:{
 "^":"a;",
 ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"Uy",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"mW")},31],
@@ -7120,6 +7163,9 @@
 return!1},
 tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
 br:function(a){return this.tt(a,!0)},
+zH:function(a){var z=P.Ls(null,null,null,H.ip(this,"mW",0))
+z.FV(0,this)
+return z},
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
@@ -7187,6 +7233,10 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y}return z},
 br:function(a){return this.tt(a,!0)},
+zH:function(a){var z,y
+z=P.Ls(null,null,null,H.ip(a,"lD",0))
+for(y=0;y<this.gB(a);++y)z.h(0,this.t(a,y))
+return z},
 h:function(a,b){var z=this.gB(a)
 this.sB(a,z+1)
 this.u(a,z,b)},
@@ -7264,14 +7314,14 @@
 $isQV:true,
 $asQV:null},
 W0:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,129,64,"call"],
+z.KF(b)},"$2",null,4,0,null,130,64,"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -7490,6 +7540,7 @@
 do y=z.gl()
 while(z.G())
 return y},
+$isxu:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -7685,7 +7736,7 @@
 throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
 tp:[function(a){return a.Lt()},"$1","Jn",2,0,49,50],
 JC:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return b},
 $isEH:true},
 f1:{
@@ -7958,11 +8009,11 @@
 if(y==null)H.qw(z)
 else y.$1(z)},
 Y25:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){this.a.u(0,a.gfN(a),b)},
 $isEH:true},
 CL:{
-"^":"Tp:130;a",
+"^":"Tp:131;a",
 $2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -7998,7 +8049,7 @@
 RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
 static:{"^":"bS,Vp8,Eu,p2W,h2,KL,EQe,NXt,Hm,Gio,zM3,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
+z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
 if(z!=null){y=new P.MF()
 x=z.QK
 if(1>=x.length)return H.e(x,1)
@@ -8044,12 +8095,12 @@
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 MF:{
-"^":"Tp:131;",
+"^":"Tp:132;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Tp:132;",
+"^":"Tp:133;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -8240,6 +8291,10 @@
 ns:{
 "^":"a;",
 $isns:true},
+xu:{
+"^":"mW;",
+$isxu:true,
+$isyN:true},
 BpP:{
 "^":"a;"},
 VV:{
@@ -8318,7 +8373,7 @@
 z=a==null
 if(z&&!0)return""
 z=!z
-if(z);y=z?P.Xc(a):C.bP.ez(b,new P.uF()).zV(0,"/")
+if(z);y=z?P.Xc(a):C.bP.ez(b,new P.bm()).zV(0,"/")
 if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
 return y},
 yM:function(a,b){if(a==="")return"/"+H.d(b)
@@ -8476,7 +8531,7 @@
 if(y);if(y)return P.Xc(a)
 x=P.p9("")
 z.a=!0
-C.bP.aN(b,new P.yZ(z,x))
+C.bP.aN(b,new P.Ue(z,x))
 return x.vM},o6:function(a){if(a==null)return""
 return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z={}
@@ -8575,7 +8630,7 @@
 y.vM+=u
 z.$2(v,y)}}return y.vM}}},
 jY:{
-"^":"Tp:133;",
+"^":"Tp:134;",
 $1:function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
@@ -8583,25 +8638,25 @@
 return z},
 $isEH:true},
 Uo:{
-"^":"Tp:134;a",
+"^":"Tp:135;a",
 $1:function(a){a=J.DP(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
 return a+1},
 $isEH:true},
 QU:{
-"^":"Tp:133;",
+"^":"Tp:134;",
 $1:function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.JH,z)
 z=(C.JH[z]&C.jn.KI(1,a&15))!==0}else z=!1
 return z},
 $isEH:true},
-uF:{
+bm:{
 "^":"Tp:13;",
 $1:function(a){return P.jW(C.ZJ,a,C.xM,!1)},
 $isEH:true},
-yZ:{
-"^":"Tp:78;a,b",
+Ue:{
+"^":"Tp:79;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -8612,18 +8667,18 @@
 z.KF(P.jW(C.B2,b,C.xM,!0))},
 $isEH:true},
 Al:{
-"^":"Tp:133;",
+"^":"Tp:134;",
 $1:function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
 return z},
 $isEH:true},
 tS:{
-"^":"Tp:133;",
+"^":"Tp:134;",
 $1:function(a){return 97<=a&&a<=102},
 $isEH:true},
 m9:{
-"^":"Tp:133;",
+"^":"Tp:134;",
 $1:function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.B2,z)
@@ -8631,7 +8686,7 @@
 return z},
 $isEH:true},
 wm:{
-"^":"Tp:134;b,c,d",
+"^":"Tp:135;b,c,d",
 $1:function(a){var z,y
 z=this.b
 y=J.Pp(z,a)
@@ -8640,7 +8695,7 @@
 else return y},
 $isEH:true},
 QE:{
-"^":"Tp:134;e",
+"^":"Tp:135;e",
 $1:function(a){var z,y,x,w,v
 for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
 if(48<=v&&v<=57)x=x*16+v-48
@@ -8660,7 +8715,7 @@
 else y.KF(J.Nj(w,x,v))},
 $isEH:true},
 XZ:{
-"^":"Tp:135;",
+"^":"Tp:136;",
 $2:function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
 return b*31+z&1073741823},
@@ -8675,14 +8730,14 @@
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,136,"call"],
+return z},"$1",null,2,0,null,137,"call"],
 $isEH:true},
 x8:{
 "^":"Tp:43;",
 $1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
 $isEH:true},
 JT:{
-"^":"Tp:95;a,b",
+"^":"Tp:96;a,b",
 $2:function(a,b){var z,y
 if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(C.xB.Nj(this.a,a,b),16,null)
@@ -8697,7 +8752,7 @@
 else return[z.m(a,8)&255,z.i(a,255)]},
 $isEH:true},
 rI:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.JM(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.JM(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
@@ -8920,7 +8975,7 @@
 gEr:function(a){return H.VM(new W.JF(a,C.U3.Ph,!1),[null])},
 gfs:function(a){return H.VM(new W.JF(a,C.T1.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.JF(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.JF(a,C.uh.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
 ZL:function(a){},
 $ish4:true,
@@ -9024,7 +9079,7 @@
 ttH:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-Gx:{
+pL:{
 "^":"Bo;P:value%",
 "%":"HTMLLIElement"},
 hi:{
@@ -9182,7 +9237,7 @@
 "^":"Bo;MB:form=,vH:index=,ph:label%,P:value%",
 $isQlt:true,
 "%":"HTMLOptionElement"},
-wL2:{
+Xp:{
 "^":"Bo;MB:form=,oc:name%,t5:type=,P:value%",
 "%":"HTMLOutputElement"},
 HDy:{
@@ -9528,10 +9583,10 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"Tp:13;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,137,"call"],
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,138,"call"],
 $isEH:true},
 bU2:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){this.a.setRequestHeader(a,b)},
 $isEH:true},
 bU:{
@@ -9547,7 +9602,7 @@
 y.OH(z)}else x.pm(a)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 QR:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
 wi:{
@@ -9620,15 +9675,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 AA:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){this.a.setItem(a,b)},
 $isEH:true},
 wQ:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){return this.a.push(a)},
 $isEH:true},
 rs:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){return this.a.push(b)},
 $isEH:true},
 yoo:{
@@ -9684,7 +9739,7 @@
 $isZ0:true,
 $asZ0:function(){return[P.qU,P.qU]}},
 Zc:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 E9:{
@@ -9731,7 +9786,7 @@
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
 hD:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
@@ -9801,7 +9856,7 @@
 return},
 Fv:[function(a,b){if(this.DK==null)return;++this.VP
 this.Ns()
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,124,23,125],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,23,126],
 gUF:function(){return this.VP>0},
 QE:[function(a){if(this.DK==null||this.VP<=0)return;--this.VP
 this.Zz()},"$0","gDQ",0,0,18],
@@ -9824,7 +9879,7 @@
 this.pY.xO(0)},"$0","gQF",0,0,18],
 xd:function(a){this.pY=P.bK(this.gQF(this),null,!0,a)}},
 rW:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Gm:{
@@ -9970,7 +10025,7 @@
 pQ:{
 "^":"d5G;x=,y=",
 "%":"SVGFESpotLightElement"},
-Qya:{
+HX:{
 "^":"d5G;yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
@@ -10015,7 +10070,7 @@
 gEr:function(a){return H.VM(new W.JF(a,C.U3.Ph,!1),[null])},
 gfs:function(a){return H.VM(new W.JF(a,C.T1.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.JF(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.JF(a,C.uh.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
 $isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
@@ -10073,7 +10128,7 @@
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,41,59,27,60],
+d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","Gx",8,0,null,41,59,27,60],
 Dm:function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},
@@ -10175,7 +10230,7 @@
 FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
 xe:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
 this.V7("splice",[b,0,c])},
-UZ:function(a,b,c){P.oY(b,c,this.gB(this))
+UZ:function(a,b,c){P.uF(b,c,this.gB(this))
 this.V7("splice",[b,c-b])},
 YW:function(a,b,c,d,e){var z,y,x
 z=this.gB(this)
@@ -10190,7 +10245,7 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 GT:function(a,b){this.V7("sort",[b])},
 Jd:function(a){return this.GT(a,null)},
-static:{oY:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
+static:{uF:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
 if(b<a||b>c)throw H.b(P.TE(b,a,c))}}},
 WkF:{
 "^":"E4+lD;",
@@ -10428,7 +10483,7 @@
 return a},
 WZ:{
 "^":"Gv;",
-gbx:function(a){return C.E0},
+gbx:function(a){return C.uh},
 $isWZ:true,
 "%":"ArrayBuffer"},
 eH:{
@@ -10559,7 +10614,7 @@
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
-gbx:function(a){return C.Fe},
+gbx:function(a){return C.YZ},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
@@ -10689,7 +10744,7 @@
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gVr",6,0,110,1,101,102],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gVr",6,0,111,1,102,103],
 Z1:[function(a,b,c,d){var z,y,x
 J.Kr(b)
 z=a.a3
@@ -10698,9 +10753,9 @@
 x=R.tB(y)
 J.kW(x,"expr",z)
 J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,110,1,101,102],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,111,1,102,103],
 o5:[function(a,b){var z=J.bN(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,138,1],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,139,1],
 static:{Rp:function(a){var z,y,x
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -10721,7 +10776,7 @@
 $isd3:true},
 YW:{
 "^":"Tp:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,139,"call"],
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Eg:{
@@ -10742,7 +10797,7 @@
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.uv(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,81,46,47,82],
+this.LY(a,a.jv).ml(new R.uv(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,82,46,47,83],
 static:{Nd:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -10764,12 +10819,12 @@
 "^":"xc+Pi;",
 $isd3:true},
 uv:{
-"^":"Tp:140;a",
+"^":"Tp:141;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,91,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 Ou:{
-"^":"Tp:70;b",
+"^":"Tp:71;b",
 $0:[function(){var z=this.b
 z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
@@ -10794,7 +10849,7 @@
 "^":"pva;KV,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-pA:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,20,98],
 static:{nv:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -10815,7 +10870,7 @@
 "^":"cda;DC,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-pA:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,20,98],
 static:{Ak:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -10946,7 +11001,7 @@
 break
 default:a.ZZ=this.ct(a,C.Lc,y,"UNKNOWN")
 break}},"$1","gnp",2,0,20,57],
-pA:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,20,98],
 static:{nz:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -10965,7 +11020,7 @@
 "^":"",
 Hz:{
 "^":"a;zE,mS",
-PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,141],
+PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,142],
 gvH:function(a){return C.CD.cU(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=b.gy(b)
@@ -11053,9 +11108,9 @@
 w=z.mS
 v=a.UL.t(0,a.Aj.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,138,2],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,139,2],
 X7:[function(a,b){var z=J.cR(this.on(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,138,2],
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,139,2],
 My:function(a){var z,y,x,w,v
 z=a.oj
 if(z==null||a.hi==null)return
@@ -11126,9 +11181,9 @@
 P.Iw(new O.R5(a,b),null)},
 pA:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,20,97],
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,20,98],
 YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,20,57],
-static:{"^":"nK,Os,SoT,WBO",dF:function(a){var z,y,x,w,v
+static:{"^":"nK,Os,SoT,WBO",pn:function(a){var z,y,x,w,v
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
@@ -11150,20 +11205,20 @@
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
-"^":"Tp:70;a,b",
+"^":"Tp:71;a,b",
 $0:function(){J.MU(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"Tp:109;a",
+"^":"Tp:110;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,142,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,143,"call"],
 $isEH:true},
 z4:{
-"^":"Tp:78;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,143,"call"],
+"^":"Tp:79;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,144,"call"],
 $isEH:true},
 oc:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:function(){J.vP(this.a)},
 $isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
@@ -11267,17 +11322,17 @@
 if(z==null?y!=null:z!==y){x.sxp(y)
 a.nc.sT3(!0)}else x.sT3(!x.gT3())
 J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,100,1,101,102],
+this.Jh(a)}},"$3","gQq",6,0,101,1,102,103],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,20,97],
+J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,20,98],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,20,97],
+J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,20,98],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,20,97],
-hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,144,145],
+J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,20,98],
+hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,145,146],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
@@ -11343,17 +11398,17 @@
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,146,147],
+return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,147,148],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,146,147],
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,147,148],
 F9:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,146,147],
+return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,147,148],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.GQ=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
@@ -11415,19 +11470,19 @@
 return y},
 $isEH:true},
 rG:{
-"^":"Tp:148;d",
+"^":"Tp:149;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 fh:{
-"^":"Tp:149;e",
+"^":"Tp:150;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
 uS:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){},
 $isEH:true},
 Tm:{
@@ -11465,8 +11520,8 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
 ib:{
-"^":"Tp:78;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,76,21,"call"],
+"^":"Tp:79;a,Gq",
+$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,77,21,"call"],
 $isEH:true},
 CA:{
 "^":"Tp:48;a,b",
@@ -11479,13 +11534,13 @@
 return y},
 $isEH:true},
 ti:{
-"^":"Tp:148;c",
+"^":"Tp:149;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"Tp:149;d",
+"^":"Tp:150;d",
 $2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
@@ -11532,11 +11587,11 @@
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
 ez:[function(a,b){var z=this.lF()
-return H.VM(new H.xy(z,b),[H.Kp(z,0),null])},"$1","gIr",2,0,150,31],
+return H.VM(new H.xy(z,b),[H.Kp(z,0),null])},"$1","gIr",2,0,151,31],
 ad:function(a,b){var z=this.lF()
 return H.VM(new H.U5(z,b),[H.Kp(z,0)])},
 lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.Kp(z,0),null])},"$1","git",2,0,151,31],
+return H.VM(new H.oA(z,b),[H.Kp(z,0),null])},"$1","git",2,0,152,31],
 ou:function(a,b){return this.lF().ou(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -11557,30 +11612,37 @@
 return z.gGc(z)},
 tt:function(a,b){return this.lF().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
+zH:function(a){var z,y
+z=this.lF()
+y=z.Ys()
+y.FV(0,z)
+return y},
 V1:function(a){this.OS(new P.uQ())},
 OS:function(a){var z,y
 z=this.lF()
 y=a.$1(z)
 this.p5(z)
 return y},
+$isxu:true,
+$asxu:function(){return[P.qU]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 GE:{
 "^":"Tp:13;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,152,"call"],
+$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,153,"call"],
 $isEH:true},
 rl:{
 "^":"Tp:13;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,152,"call"],
+$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,153,"call"],
 $isEH:true},
 PR:{
 "^":"Tp:13;a",
-$1:[function(a){return J.uY(a,this.a)},"$1",null,2,0,null,152,"call"],
+$1:[function(a){return J.uY(a,this.a)},"$1",null,2,0,null,153,"call"],
 $isEH:true},
 uQ:{
 "^":"Tp:13;",
-$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,152,"call"],
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,153,"call"],
 $isEH:true},
 D7:{
 "^":"ark;Yn,iz",
@@ -11644,14 +11706,14 @@
 else if(J.xC(J.eS(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.xC(J.eS(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
 return Q.xI.prototype.gJp.call(this,a)},
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,70],
+Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,71],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.cI(z).ml(new B.Ng(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,153,154,97],
+c.$0()}},"$2","gus",4,0,154,155,98],
 static:{lu:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11673,7 +11735,7 @@
 a.sdN(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.xP,z.tY,a)
-y.ct(z,C.xP,0,1)},"$1",null,2,0,null,139,"call"],
+y.ct(z,C.xP,0,1)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
@@ -11684,10 +11746,10 @@
 sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
 gCF:function(a){return a.Rr},
 sCF:function(a,b){a.Rr=this.ct(a,C.tg,a.Rr,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,104,105],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,106,108],
-Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,106,33],
-pA:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,20,97],
+vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,107,109],
+Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,107,33],
+pA:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,20,98],
 static:{CoW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11705,23 +11767,23 @@
 "^":"uL+Pi;",
 $isd3:true},
 wU:{
-"^":"Tp:109;a",
+"^":"Tp:110;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,91,"call"],
+z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 cL:{
-"^":"Tp:140;a",
+"^":"Tp:141;a",
 $1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,91,"call"],
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
 "^":"",
 L4:{
 "^":"V13;PM,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-pA:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,20,98],
 static:{p4t:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11756,7 +11818,7 @@
 "^":"V14;Cr,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,98],
 static:{Ch:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11791,7 +11853,7 @@
 "^":"V15;yR,mZ,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-pA:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,20,98],
 Lg:[function(a){J.cI(a.yR).YM(new E.Kv(a))},"$0","gW6",0,0,18],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
@@ -11816,7 +11878,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Kv:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -11824,7 +11886,7 @@
 "^":"V16;vd,mZ,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gPB:function(a){return a.vd},
 sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-pA:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,20,98],
 Lg:[function(a){J.cI(a.vd).YM(new E.uN(a))},"$0","gW6",0,0,18],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
@@ -11849,7 +11911,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 uN:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -11887,7 +11949,7 @@
 "^":"V17;Cr,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,98],
 static:{UE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11907,7 +11969,7 @@
 "^":"V18;uv,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-pA:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,20,98],
 static:{chF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11942,7 +12004,7 @@
 "^":"V19;Cr,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,98],
 static:{xK:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11962,7 +12024,7 @@
 "^":"V20;h1,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gHy:function(a){return a.h1},
 sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-pA:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,20,98],
 static:{iOo:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11982,7 +12044,7 @@
 "^":"V21;Cr,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,98],
 static:{Ii:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12017,7 +12079,7 @@
 "^":"V22;wT,mZ,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-pA:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,20,98],
 nK:[function(a){J.cI(a.wT).YM(new E.mj(a))},"$0","guT",0,0,18],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
@@ -12042,7 +12104,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 mj:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -12050,7 +12112,7 @@
 "^":"V23;Cr,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,98],
 static:{tX:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12092,7 +12154,7 @@
 gNN:function(a){return a.RX},
 Fn:function(a){return this.gNN(a).$0()},
 sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-pA:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,20,98],
 nK:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,18],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
@@ -12117,7 +12179,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Cc:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
@@ -12210,7 +12272,7 @@
 this.Zb(a)},
 m5:[function(a,b){this.pA(a,null)},"$1","gb6",2,0,20,57],
 pA:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,20,97],
+J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,20,98],
 Zb:function(a){if(a.oi==null)return
 this.GN(a)},
 GN:function(a){var z,y,x,w,v
@@ -12221,8 +12283,8 @@
 x=new H.XO(w,null)
 N.QM("").xH("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,98,99],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,98,99],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -12233,7 +12295,7 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gwJ",6,0,100,1,101,102],
+N.QM("").xH("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,1,102,103],
 static:{"^":"B6",jD:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12259,9 +12321,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"Tp:109;a",
+"^":"Tp:110;a",
 $1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,155,"call"],
+z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,156,"call"],
 $isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oa:{
@@ -12303,8 +12365,8 @@
 "^":"V27;ow,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,156,14],
-kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,156,14],
+Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,157,14],
+kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,157,14],
 static:{zr:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12322,13 +12384,13 @@
 $isd3:true},
 GG:{
 "^":"Tp:13;a",
-$1:[function(a){return J.cI(this.a.ow)},"$1",null,2,0,null,139,"call"],
+$1:[function(a){return J.cI(this.a.ow)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 r8:{
 "^":"Tp:13;a",
 $1:[function(a){var z=this.a
 $.mf.x3(z.ow)
-return J.cI(z.ow)},"$1",null,2,0,null,139,"call"],
+return J.cI(z.ow)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 Qh:{
 "^":"V28;ow,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
@@ -12457,7 +12519,7 @@
 god:function(a){return a.ck},
 sod:function(a,b){a.ck=this.ct(a,C.rB,a.ck,b)},
 vV:[function(a,b){var z=a.ck
-return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,104,105],
+return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
 Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,18],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.ts=P.rT(P.ii(0,0,0,0,0,1),this.gJD(a))},
@@ -12466,10 +12528,10 @@
 z=a.ts
 if(z!=null){z.ed()
 a.ts=null}},
-pA:[function(a,b){J.cI(a.ck).YM(b)},"$1","gvC",2,0,20,97],
-j9:[function(a,b){J.eg(a.ck).YM(b)},"$1","gDX",2,0,20,97],
-Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,156,14],
-kf:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,156,14],
+pA:[function(a,b){J.cI(a.ck).YM(b)},"$1","gvC",2,0,20,98],
+j9:[function(a,b){J.eg(a.ck).YM(b)},"$1","gDX",2,0,20,98],
+Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,157,14],
+kf:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,157,14],
 static:{Qtp:function(a){var z,y,x
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -12500,15 +12562,15 @@
 y.YT=v
 w.u(0,"isStacked",!0)
 y.YT.bG.u(0,"connectSteps",!1)
-y.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.YT.W2(y.X6)}if(z.ts!=null)z.ts=P.rT(P.ii(0,0,0,0,0,1),J.OY(z))},"$1",null,2,0,null,157,"call"],
+y.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.YT.W2(y.X6)}if(z.ts!=null)z.ts=P.rT(P.ii(0,0,0,0,0,1),J.OY(z))},"$1",null,2,0,null,158,"call"],
 $isEH:true},
 CV:{
 "^":"Tp:13;a",
-$1:[function(a){return J.cI(this.a.ck)},"$1",null,2,0,null,139,"call"],
+$1:[function(a){return J.cI(this.a.ck)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 Vq:{
 "^":"Tp:13;a",
-$1:[function(a){return J.cI(this.a.ck)},"$1",null,2,0,null,139,"call"],
+$1:[function(a){return J.cI(this.a.ck)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 xh:{
@@ -12614,9 +12676,9 @@
 "^":"V33;iI,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,104,105],
-pA:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,20,97],
-j9:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,20,97],
+vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+pA:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,20,98],
+j9:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,20,98],
 static:{as:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12680,7 +12742,7 @@
 $isRw:true,
 static:{"^":"Uj",QM:function(a){return $.Iu().to(0,a,new N.aO(a))}}},
 aO:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
@@ -12723,23 +12785,23 @@
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e431())
+N.QM("").gSZ().yI(new F.e433())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
 z=J.UQ($.Si(),"google")
 y=$.Ib()
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e432())},
-e431:{
-"^":"Tp:159;",
+$.Ib().MM.ml(G.vN()).ml(new F.e434())},
+e433:{
+"^":"Tp:160;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,158,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,159,"call"],
 $isEH:true},
-e432:{
+e434:{
 "^":"Tp:13;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
@@ -12830,7 +12892,7 @@
 W1:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,110,1,101,102],
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,111,1,102,103],
 ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
 static:{ZC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -12979,7 +13041,7 @@
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 gBk:function(a){return a.Wx},
 sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,160,1,101,102],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,161,1,102,103],
 static:{zC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -13055,23 +13117,23 @@
 z=a.di
 if(z==null){this.Hq(a)
 return}a.o1=P.rT(z,this.gWE(a))},"$0","gWE",0,0,18],
-wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gRh",6,0,160,2,101,102],
+wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gRh",6,0,161,2,102,103],
 XD:[function(a,b){this.gi6(a).Z6
-return"#"+H.d(b)},"$1","gn0",2,0,161,162],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,163,164],
+return"#"+H.d(b)},"$1","gn0",2,0,162,163],
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,164,165],
 Ze:[function(a,b){return G.As(b)},"$1","gbJ",2,0,15,16],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,165,166],
-i5:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,165,166],
+uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,166,167],
+i5:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,166,167],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,165,166],
-RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,165,166],
-ze:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,165,166],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,165,166],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,165,166],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,166,167],
+RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,166,167],
+ze:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,166,167],
+wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,166,167],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,166,167],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,165,166],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,165,166],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,165,166],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,166,167],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,166,167],
+AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,166,167],
 static:{EE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -13109,7 +13171,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,119],
+return!0}return!1},"$0","gDx",0,0,120],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -13156,14 +13218,14 @@
 z=new O.YC(z)
 return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
 YC:{
-"^":"Tp:167;a",
+"^":"Tp:168;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
 a.RK(b,new O.aR(z))},
 $isEH:true},
 aR:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:[function(){this.a.a=!1
 O.N0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -13173,12 +13235,12 @@
 return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
 $isEH:true},
 HF:{
-"^":"Tp:70;c,d,e,f",
+"^":"Tp:71;c,d,e,f",
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 hw:{
-"^":"Tp:168;UI",
+"^":"Tp:169;UI",
 $4:[function(a,b,c,d){if(d==null)return d
 return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
 $isEH:true},
@@ -13456,7 +13518,7 @@
 this.gme(a).push(b)},
 $isd3:true},
 X6:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
 y=$.cp().jD(z,a)
@@ -13641,7 +13703,7 @@
 if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,119],
+return!0}return!1},"$0","gL6",0,0,120],
 $iswn:true,
 static:{ch:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -13678,7 +13740,7 @@
 "^":"ark+Pi;",
 $isd3:true},
 OA:{
-"^":"Tp:70;a",
+"^":"Tp:71;a",
 $0:function(){this.a.iT=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
@@ -13749,11 +13811,11 @@
 return y}}},
 zT:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,21,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a,b){return{func:"VfV",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){var z=this.a
 z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
 $isEH:true}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
@@ -13787,7 +13849,7 @@
 if(a==null)return
 z=b
 if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$isGD){z=a
-y=H.RB(z,"$isHX",[P.qU,null],"$asHX")
+y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
 z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
@@ -13799,7 +13861,7 @@
 z=x.$1(z)
 return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.Jk(a)
 v=$.mX().F1(z,C.OV)
-if(!(v!=null&&v.fY===C.WH&&!v.Fo))throw w}else throw w}}z=$.YV()
+if(!(v!=null&&v.fY===C.hU&&!v.Fo))throw w}else throw w}}z=$.YV()
 if(z.mL(C.D8))z.kS("can't get "+H.d(b)+" in "+H.d(a))
 return},
 iu:function(a,b,c){var z,y,x
@@ -13807,7 +13869,7 @@
 z=b
 if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
 return!0}}else if(!!J.x(b).$isGD){z=a
-y=H.RB(z,"$isHX",[P.qU,null],"$asHX")
+y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
 z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
@@ -13928,14 +13990,14 @@
 $isEH:true},
 f7:{
 "^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isGD?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,152,"call"],
+$1:[function(a){return!!J.x(a).$isGD?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,153,"call"],
 $isEH:true},
 TV:{
 "^":"Tv;OK",
 gPu:function(){return!1},
 static:{"^":"qa"}},
 YJG:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true},
 ww:{
@@ -14045,7 +14107,7 @@
 b.nf(this.gTT(this))},
 we:[function(a,b){var z=J.x(b)
 if(!!z.$iswn)this.wq(b.gQV())
-if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,169,91],
+if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,170,92],
 wq:function(a){var z,y
 if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
 z=this.HN
@@ -14064,7 +14126,7 @@
 t9:[function(a){var z,y
 for(z=this.yj,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 if(y.ga8())y.tF()}this.op=!0
-P.rb(this.gTh(this))},"$1","gCP",2,0,20,170],
+P.rb(this.gTh(this))},"$1","gCP",2,0,20,171],
 static:{"^":"xG",SE:function(a,b){var z,y
 z=$.xG
 if(z!=null){y=z.kTd
@@ -14083,8 +14145,8 @@
 x.FV(0,z)
 return x}return a},"$1","Ft",2,0,13,21],
 Qe:{
-"^":"Tp:78;a",
-$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,129,64,"call"],
+"^":"Tp:79;a",
+$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,130,64,"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 YG:function(a,b,c){if(a==null||$.AM()==null)return
@@ -14108,7 +14170,7 @@
 z=$.Mg().ep.t(0,a)
 if(z==null)return!1
 y=J.rY(z)
-return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","Xm",2,0,62,63],
+return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,62,63],
 Ad:function(a,b){$.Ej().u(0,a,b)
 H.Go(J.UQ($.Si(),"Polymer"),"$isr7").PO([a])},
 h6:function(a,b){var z,y,x,w
@@ -14179,7 +14241,7 @@
 s=this.Q7
 if(s!=null&&s.x4(0,t))continue
 r=$.mX().CV(z,u)
-if(r==null||r.fY===C.WH||r.V5){window
+if(r==null||r.fY===C.hU||r.V5){window
 s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
 if(typeof console!="undefined")console.warn(s)
 continue}s=this.Q7
@@ -14272,11 +14334,11 @@
 $1:function(a){return a.gvn()},
 $isEH:true},
 eY:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){if(C.n7.x4(0,a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
 $isEH:true},
 BO:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).kJ(b,"{{")
@@ -14292,11 +14354,11 @@
 $1:function(a){return J.RF(a,this.a)},
 $isEH:true},
 XUG:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){return[]},
 $isEH:true},
 Tj:{
-"^":"Tp:171;a",
+"^":"Tp:172;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 Li:{
@@ -14337,7 +14399,7 @@
 J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 li:{
-"^":"Tp:175;a,b,c",
+"^":"Tp:176;a,b,c",
 $3:[function(a,b,c){var z,y,x,w
 z=this.c
 y=this.b.Y2(null,b,z)
@@ -14345,7 +14407,7 @@
 w=H.VM(new W.Ov(0,x.DK,x.Ph,W.aF(y),x.Sg),[H.Kp(x,0)])
 w.Zz()
 if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,172,173,174,"call"],
+return new A.d6(w,z)},"$3",null,6,0,null,173,174,175,"call"],
 $isEH:true},
 d6:{
 "^":"Yj;Jq,ED",
@@ -14439,7 +14501,7 @@
 z=this.er(a)
 y=this.gUj(a)
 x=!!J.x(b).$isvy?b:M.SB(b)
-w=J.Yb(x,a,y==null&&J.Xp(x)==null?J.du(a.IX):y)
+w=J.Yb(x,a,y==null&&J.fx(x)==null?J.du(a.IX):y)
 v=$.vH().t(0,w)
 u=v!=null?v.gu2():v
 a.Sa.push(u)
@@ -14468,7 +14530,7 @@
 x=J.x(v)
 u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.eP))&&w!=null?J.Jk(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,176],
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,177],
 B2:function(a,b){var z=a.IX.gNF()
 if(z==null)return
 return z.t(0,b)},
@@ -14537,14 +14599,14 @@
 for(y=H.VM(new P.fG(z),[H.Kp(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.Kp(y,0)]);y.G();){v=y.fD
 x.yN(a,v)
 this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.qz(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gnu",6,0,177],
+FQ:[function(a,b,c,d){J.Me(c,new A.qz(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gnu",6,0,178],
 HT:[function(a,b){var z,y,x,w,v
 for(z=J.mY(b);z.G();){y=z.gl()
 if(!J.x(y).$isqI)continue
 x=y.oc
 w=$.Mg().ep.t(0,x)
 v=a.IX.gBj()
-if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gqY",2,0,178,170],
+if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gqY",2,0,179,171],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.JR(a.IX)
 if(z==null)return
@@ -14564,7 +14626,7 @@
 a.q9=v}v.u(0,x,w)}},
 rB:[function(a,b){var z,y
 for(z=J.mY(b);z.G();){y=z.gl()
-if(y!=null)J.yd(y)}},"$1","ghb",2,0,179],
+if(y!=null)J.yd(y)}},"$1","ghb",2,0,180],
 iQ:function(a,b){var z=a.q9.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -14612,17 +14674,17 @@
 $1:[function(a){return},"$1",null,2,0,null,14,"call"],
 $isEH:true},
 Sv:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){var z=J.Vs(this.a)
 if(z.x4(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
 z.t(0,a)},
 $isEH:true},
 Te4:{
-"^":"Tp:70;b",
+"^":"Tp:71;b",
 $0:function(){return this.b},
 $isEH:true},
 qz:{
-"^":"Tp:78;a,b,c,d,e,f",
+"^":"Tp:79;a,b,c,d,e,f",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=this.b
 y=J.UQ(z,a)
@@ -14638,16 +14700,16 @@
 for(w=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;w.G();){p=w.gl()
 if(!q.h(0,p))continue
 s.rJ(t,v,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,92,57,"call"],
+$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,93,57,"call"],
 $isEH:true},
 Y0:{
 "^":"Tp:13;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,180,"call"],
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,181,"call"],
 $isEH:true},
 SX:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){var z,y
 z=this.a
 y=J.Ei(z).t(0,a)
@@ -14665,7 +14727,7 @@
 v=w.$1(z)
 z=this.dY
 if(z==null?v!=null:z!==v)J.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,178,170],
+return}}},"$1","gXQ",2,0,179,171],
 TR:function(a,b){return J.mu(this.q0,b)},
 gP:function(a){return J.Vm(this.q0)},
 sP:function(a,b){J.ta(this.q0,b)
@@ -14697,24 +14759,24 @@
 z.Ws()}return},"$1",null,2,0,null,14,"call"],
 $isEH:true},
 mS:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 hp:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:[function(){var z=$.iF().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"Tp:183;a,b",
+"^":"Tp:184;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
 if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.vE().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,181,56,182,"call"],
+return this.b.qP([b,c],a)},"$3",null,6,0,null,182,56,183,"call"],
 $isEH:true},
 zR:{
-"^":"Tp:70;c,d,e,f",
+"^":"Tp:71;c,d,e,f",
 $0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=this.c
 y=this.d
@@ -14731,7 +14793,7 @@
 t.I9()
 s=J.RE(z)
 r=s.Wk(z,"template")
-if(r!=null)J.Co(!!J.x(r).$isvy?r:M.SB(r),v)
+if(r!=null)J.NA(!!J.x(r).$isvy?r:M.SB(r),v)
 t.Mi()
 t.f6()
 t.OL()
@@ -14768,7 +14830,7 @@
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 Md:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){var z=J.UQ(P.HU(document.createElement("polymer-element",null)),"__proto__")
 return!!J.x(z).$isKV?P.HU(z):z},
 $isEH:true}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
@@ -14776,17 +14838,17 @@
 q6:{
 "^":"wc;Hf,ro,dUC,pt,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gk8:function(a){return J.ZH(a.Hf)},
-gzH:function(a){return J.Xp(a.Hf)},
-szH:function(a,b){J.Co(a.Hf,b)},
+gG5:function(a){return J.fx(a.Hf)},
+sG5:function(a,b){J.NA(a.Hf,b)},
 V1:function(a){return J.Z8(a.Hf)},
-gUj:function(a){return J.Xp(a.Hf)},
+gUj:function(a){return J.fx(a.Hf)},
 ZK:function(a,b,c){return J.Yb(a.Hf,b,c)},
 ea:function(a,b,c,d){return A.zs.prototype.ea.call(this,a,b===a?J.ZH(a.Hf):b,c,d)},
 dX:function(a){var z
 this.Pa(a)
 a.Hf=M.SB(a)
 z=T.GF(null,C.qY)
-J.Co(a.Hf,new Y.zp(a,z,null))
+J.NA(a.Hf,new Y.zp(a,z,null))
 $.iF().MM.ml(new Y.zl(a))},
 $isDT:true,
 $isvy:true,
@@ -14838,26 +14900,26 @@
 return y}catch(x){H.Ru(x)
 return a}},
 lP:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a},
 $isEH:true},
 Uf:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a},
 $isEH:true},
 Ra:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){var z,y
 try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
 wJY:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
 zOQ:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return H.BU(a,null,new Z.fT(b))},
 $isEH:true},
 fT:{
@@ -14865,7 +14927,7 @@
 $1:function(a){return this.a},
 $isEH:true},
 W6o:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return H.RR(a,new Z.Lf(b))},
 $isEH:true},
 Lf:{
@@ -14888,7 +14950,7 @@
 $isEH:true},
 k9:{
 "^":"Tp:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,129,"call"],
+$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,130,"call"],
 $isEH:true},
 QB:{
 "^":"VE;VA,jw,iX,WK,cJ",
@@ -14947,33 +15009,33 @@
 x.FV(0,C.va)
 return new T.QB(b,x,z,y,null)}}},
 qb:{
-"^":"Tp:184;b,c,d",
+"^":"Tp:185;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
 z.WK.u(0,b,this.c)
 y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
 z.iX.u(0,b,y)
 z=T.kR()
-return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,172,173,174,"call"],
+return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,173,174,175,"call"],
 $isEH:true},
 Xyb:{
-"^":"Tp:184;e,f",
+"^":"Tp:185;e,f",
 $3:[function(a,b,c){var z,y
 z=this.e
 y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
 z.iX.u(0,b,y)
 if(c===!0)return T.jF(this.f,y,null)
 z=T.kR()
-return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,172,173,174,"call"],
+return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,173,174,175,"call"],
 $isEH:true},
 Ddj:{
-"^":"Tp:184;a,UI,bK",
+"^":"Tp:185;a,UI,bK",
 $3:[function(a,b,c){var z,y
 z=this.UI.ey(b,a)
 if(c===!0)return T.jF(this.bK,z,this.a.a)
 y=this.a.a
 if(y==null)y=T.kR()
-return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,172,173,174,"call"],
+return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,173,174,175,"call"],
 $isEH:true},
 Wb:{
 "^":"Tp:13;a,b",
@@ -14982,7 +15044,7 @@
 y=this.b
 x=z.iX.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.dZ(a,z.jw)}else return z.ey(y,a)},"$1",null,2,0,null,172,"call"],
+return K.dZ(a,z.jw)}else return z.ey(y,a)},"$1",null,2,0,null,173,"call"],
 $isEH:true},
 uKo:{
 "^":"Tp:13;c,d,e",
@@ -14992,7 +15054,7 @@
 x=z.iX.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.fO(y).t1(w,a)},"$1",null,2,0,null,172,"call"],
+else return z.fO(y).t1(w,a)},"$1",null,2,0,null,173,"call"],
 $isEH:true},
 tI:{
 "^":"Yj;IM,eI,kG,Tu,T7,z0,IZ",
@@ -15002,7 +15064,7 @@
 z=this.IZ
 y=this.bh(a)
 this.IZ=y
-if(b!==!0&&this.Tu!=null&&!J.xC(z,y))this.tC(this.IZ)},function(a){return this.b9(a,!1)},"bU","$2$skipChanges","$1","gNB",2,3,185,186,64,187],
+if(b!==!0&&this.Tu!=null&&!J.xC(z,y))this.tC(this.IZ)},function(a){return this.b9(a,!1)},"bU","$2$skipChanges","$1","gNB",2,3,186,187,64,188],
 gP:function(a){if(this.Tu!=null)return this.IZ
 return T.jF(this.kG,this.IM,this.eI)},
 sP:function(a,b){var z,y,x,w,v
@@ -15046,8 +15108,8 @@
 x=new H.XO(v,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
 pI:{
-"^":"Tp:78;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.z0)+"': "+H.d(a),b)},"$2",null,4,0,null,1,152,"call"],
+"^":"Tp:79;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.z0)+"': "+H.d(a),b)},"$2",null,4,0,null,1,153,"call"],
 $isEH:true},
 yy:{
 "^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
@@ -15062,7 +15124,7 @@
 fg:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.ls,z.DA,a)},"$1",null,2,0,null,92,"call"],
+z.DA=F.Wi(z,C.ls,z.DA,a)},"$1",null,2,0,null,93,"call"],
 $isEH:true,
 $signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
@@ -15093,67 +15155,67 @@
 if(y.x4(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
 y=x}return y},
 w10:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.ew(a,b)},
 $isEH:true},
 w11:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.bI(a,b)},
 $isEH:true},
 w12:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 w13:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.X9(a,b)},
 $isEH:true},
 w14:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.hh(a,b)},
 $isEH:true},
 w15:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w16:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w17:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a==null?b==null:a===b},
 $isEH:true},
 w18:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a==null?b!=null:a!==b},
 $isEH:true},
 w19:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.z8(a,b)},
 $isEH:true},
 w20:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 w21:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 w22:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
 w23:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
 w24:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
 w25:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.$1(a)
@@ -15177,8 +15239,8 @@
 t1:function(a,b){if(J.xC(a,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
 return new K.PO(this,a,b)},
 $isGK:true,
-$isHX:true,
-$asHX:function(){return[P.qU,P.a]}},
+$isCo:true,
+$asCo:function(){return[P.qU,P.a]}},
 nk:{
 "^":"GK;k8>",
 t:function(a,b){var z,y
@@ -15404,7 +15466,7 @@
 $isIp:true},
 Hv:{
 "^":"Tp:13;",
-$1:[function(a){return a.gzo()},"$1",null,2,0,null,92,"call"],
+$1:[function(a){return a.gzo()},"$1",null,2,0,null,93,"call"],
 $isEH:true},
 ev:{
 "^":"Ay0;Rl>,Hu,mm,uy,zo,P0",
@@ -15414,7 +15476,7 @@
 $isMm:true,
 $isIp:true},
 Ku:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){J.kW(a,J.A6(b).gzo(),b.gv4().gzo())
 return a},
 $isEH:true},
@@ -15445,11 +15507,11 @@
 $isIp:true},
 V8:{
 "^":"Tp:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.GC(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,180,"call"],
+$1:[function(a){if(J.nE1(a,new K.GC(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
 GC:{
 "^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,82,"call"],
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 mv:{
 "^":"Ay0;wz<,Hu,mm,uy,zo,P0",
@@ -15515,11 +15577,11 @@
 $isIp:true},
 fk:{
 "^":"Tp:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.WKb(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,180,"call"],
+$1:[function(a){if(J.nE1(a,new K.WKb(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
 WKb:{
 "^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,82,"call"],
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 iT:{
 "^":"Ay0;Tf<,Jn<,Hu,mm,uy,zo,P0",
@@ -15537,19 +15599,19 @@
 $isIp:true},
 tE:{
 "^":"Tp:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.GST(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,180,"call"],
+$1:[function(a){if(J.nE1(a,new K.zw(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
-GST:{
+zw:{
 "^":"Tp:13;d",
-$1:[function(a){return a.vP(this.d)},"$1",null,2,0,null,82,"call"],
+$1:[function(a){return a.vP(this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 na:{
 "^":"Tp:13;e,f,UI",
-$1:[function(a){if(J.nE1(a,new K.zw(this.UI))===!0)this.e.po(this.f)},"$1",null,2,0,null,180,"call"],
+$1:[function(a){if(J.nE1(a,new K.ey(this.UI))===!0)this.e.po(this.f)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
-zw:{
+ey:{
 "^":"Tp:13;bK",
-$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,82,"call"],
+$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 c3:{
 "^":"Ay0;Tf<,re<,Hu,mm,uy,zo,P0",
@@ -15577,12 +15639,12 @@
 $1:[function(a){return a.gzo()},"$1",null,2,0,null,46,"call"],
 $isEH:true},
 Sr:{
-"^":"Tp:188;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.ho(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,180,"call"],
+"^":"Tp:189;a,b,c",
+$1:[function(a){if(J.nE1(a,new K.ho(this.c))===!0)this.a.po(this.b)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
 ho:{
 "^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,82,"call"],
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 B03:{
 "^":"a;G1>",
@@ -15609,7 +15671,7 @@
 return 536870911&a+((16383&a)<<15>>>0)},
 tu:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,189,1,46]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,190,1,46]},
 Ip:{
 "^":"a;",
 $isIp:true},
@@ -15787,7 +15849,7 @@
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isNb:true},
 xs:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return U.C0C(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
@@ -15806,8 +15868,8 @@
 GI:function(a){return this.lx(a,null)},
 Te:function(){if(this.vi.lo==null){this.rp.toString
 return C.OL}var z=this.Yq()
-return z==null?null:this.G5(z,0)},
-G5:function(a,b){var z,y,x,w,v,u
+return z==null?null:this.mi(z,0)},
+mi:function(a,b){var z,y,x,w,v,u
 for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.rD()
 this.rp.toString
 a=new U.Nb(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
@@ -15857,7 +15919,7 @@
 w=v}else w=!1
 else w=!1
 if(!w)break
-x=this.G5(x,this.vi.lo.gP9())}y=y.gP(z)
+x=this.mi(x,this.vi.lo.gP9())}y=y.gP(z)
 this.rp.toString
 return new U.uku(y,a,x)},
 Yq:function(){var z,y,x,w
@@ -15875,10 +15937,10 @@
 z=new U.no(x)
 z.$builtinTypeInfo=[null]
 this.Bp()
-return z}else{w=this.G5(this.LL(),11)
+return z}else{w=this.mi(this.LL(),11)
 y.toString
 return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
-w=this.G5(this.LL(),11)
+w=this.mi(this.LL(),11)
 this.rp.toString
 return new U.cJ(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LL()},
 LL:function(){var z,y
@@ -15973,7 +16035,7 @@
 return y},
 xJ:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-RS:[function(a){return H.VM(new K.Bt(a),[null])},"$1","y8",2,0,66,67],
+C7:[function(a){return H.VM(new K.Bt(a),[null])},"$1","pg",2,0,66,67],
 Aep:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
@@ -16112,7 +16174,7 @@
 "^":"",
 P55:{
 "^":"a;",
-DV:[function(a){return J.NV(a,this)},"$1","gay",2,0,190,152]},
+DV:[function(a){return J.NV(a,this)},"$1","gay",2,0,191,153]},
 cfS:{
 "^":"P55;",
 xn:function(a){},
@@ -16175,7 +16237,7 @@
 rA:[function(a,b){this.mC(a)},"$1","gRq",2,0,20,57],
 DJ:[function(a,b){if(b==null)return"min-width:32px;"
 else if(J.xC(b,0))return"min-width:32px; background-color:red"
-return"min-width:32px; background-color:green"},"$1","gfq",2,0,15,191],
+return"min-width:32px; background-color:green"},"$1","gfq",2,0,15,192],
 mC:function(a){var z,y,x
 if(a.Oq!=null)return
 if(J.iS(a.oX)!==!0){a.Oq=J.SK(a.oX).ml(new T.Es(a))
@@ -16265,8 +16327,8 @@
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-pA:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,20,97],
-j9:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,20,97],
+pA:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,20,98],
+j9:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,20,98],
 static:{dI:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -16283,6 +16345,7 @@
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
+Xm:[function(a,b){return J.FW(J.O6(a),J.O6(b))},"$2","E0",4,0,68],
 Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q
 if(b==null)return
 z=J.U6(b)
@@ -16315,7 +16378,7 @@
 t.$builtinTypeInfo=[z]
 t=new Q.wn(null,null,t,null,null)
 t.$builtinTypeInfo=[z]
-s=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.dy(null,null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Code":z=[]
 z.$builtinTypeInfo=[D.Fc]
@@ -16453,10 +16516,10 @@
 if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
 this.mQ=x
 this.bF(0,a,y)},
-Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gLc",2,0,161,192],
+Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gLc",2,0,162,193],
 $isaf:true},
 Bf:{
-"^":"Tp:194;a",
+"^":"Tp:195;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -16464,25 +16527,25 @@
 y=this.a
 if(!J.xC(z,y.mQ))return D.Nl(y.P3,a)
 y.eC(a)
-return y},"$1",null,2,0,null,193,"call"],
+return y},"$1",null,2,0,null,194,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:70;b",
+"^":"Tp:71;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 boh:{
 "^":"a;",
 O5:function(a){J.Me(a,new D.P5())},
-Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,195]},
+Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,196]},
 P5:{
 "^":"Tp:13;",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,196,"call"],
+z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,197,"call"],
 $isEH:true},
 Rv:{
-"^":"Tp:194;a",
+"^":"Tp:195;a",
 $1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,193,"call"],
+z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,194,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -16493,7 +16556,7 @@
 giR:function(){var z=this.z7
 return z.gUQ(z)},
 gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,161,192],
+Mq:[function(a){return H.d(a)},"$1","gLc",2,0,162,193],
 gYe:function(a){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
@@ -16540,7 +16603,7 @@
 return this.B7(z).ml(new D.it(this,y))}x=this.Qy.t(0,a)
 if(x!=null)return J.cI(x)
 return this.jU(a).ml(new D.lb(this,a))},
-Ym:[function(a,b){return b},"$2","gcO",4,0,78],
+Ym:[function(a,b){return b},"$2","gcO",4,0,79],
 ng:function(a){var z,y,x
 z=null
 try{y=new P.c5(this.gcO())
@@ -16598,12 +16661,12 @@
 z=D.Nl(a,this.a.a)
 y=this.b.Rk
 if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)},"$1",null,2,0,null,197,"call"],
+y.Iv(z)},"$1",null,2,0,null,198,"call"],
 $isEH:true},
 MZ:{
 "^":"Tp:13;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,139,"call"],
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 it:{
 "^":"Tp:13;a,b",
@@ -16614,21 +16677,21 @@
 else return a.cv(z)},"$1",null,2,0,null,7,"call"],
 $isEH:true},
 lb:{
-"^":"Tp:194;c,d",
+"^":"Tp:195;c,d",
 $1:[function(a){var z,y
 z=this.c
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.d,new D.QZ(y))
-return y},"$1",null,2,0,null,193,"call"],
+return y},"$1",null,2,0,null,194,"call"],
 $isEH:true},
 QZ:{
-"^":"Tp:70;e",
+"^":"Tp:71;e",
 $0:function(){return this.e},
 $isEH:true},
 zA:{
 "^":"Tp:13;a",
 $1:[function(a){var z=this.a
-return z.N7(z.ng(a))},"$1",null,2,0,null,142,"call"],
+return z.N7(z.ng(a))},"$1",null,2,0,null,143,"call"],
 $isEH:true},
 tm:{
 "^":"Tp:13;b",
@@ -16646,14 +16709,14 @@
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,85,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,86,"call"],
 $isEH:true},
 hc:{
 "^":"Tp:13;",
 $1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Yu:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){J.cI(b)},
 $isEH:true},
 ER:{
@@ -16752,7 +16815,7 @@
 gA6:function(){return this.EY},
 gaj:function(){return this.eU},
 gMN:function(){return this.yP},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,161,192],
+Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,162,193],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -16774,7 +16837,7 @@
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,198,199],
+if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,199,200],
 Nze:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
@@ -16784,7 +16847,7 @@
 if(J.xC(x.gdN(),"Object")&&J.xC(x.gi2(),!1)){w=this.Wm
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,200,201],
+this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,201,202],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -16884,8 +16947,8 @@
 this.yv=F.Wi(this,C.yh,this.yv,y)
 y=this.tW
 y.V1(y)
-for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
-y.GT(y,new D.hU())},
+y.FV(0,z.t(b,"libraries"))
+y.GT(y,D.E0())},
 m7:function(){return this.P3.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
 aU:function(a,b){this.FF=0
 this.bj=a
@@ -16940,34 +17003,30 @@
 a.Oo.V1(0)}},
 $isEH:true},
 KQ:{
-"^":"Tp:194;a,b",
+"^":"Tp:195;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,193,"call"],
+return y},"$1",null,2,0,null,194,"call"],
 $isEH:true},
 Ea:{
-"^":"Tp:70;c",
+"^":"Tp:71;c",
 $0:function(){return this.c},
 $isEH:true},
 Qq:{
 "^":"Tp:13;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,202,"call"],
-$isEH:true},
-hU:{
-"^":"Tp:78;",
-$2:function(a,b){return J.FW(J.O6(a),J.O6(b))},
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,203,"call"],
 $isEH:true},
 AP:{
-"^":"Tp:194;a",
+"^":"Tp:195;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.GH
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,155,"call"],
+return y},"$1",null,2,0,null,156,"call"],
 $isEH:true},
 vO:{
 "^":"af;RF,P3,r0,mQ,kT,bN,t7,VR,AP,fn",
@@ -17003,7 +17062,7 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 HC:[function(a){var z=this.RF
-return z.HC(z)},"$0","gDx",0,0,119],
+return z.HC(z)},"$0","gDx",0,0,120],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
@@ -17140,19 +17199,26 @@
 D.kT(b,J.aT(this.P3))
 y=this.Bm
 y.V1(y)
-y.FV(0,z.t(b,"imports"))
+w=J.dF(z.t(b,"imports")).br(0)
+H.rd(w,D.E0())
+y.FV(0,w)
 y=this.XR
 y.V1(y)
-y.FV(0,z.t(b,"scripts"))
+w=J.dF(z.t(b,"scripts")).br(0)
+H.rd(w,D.E0())
+y.FV(0,w)
 y=this.DD
 y.V1(y)
 y.FV(0,z.t(b,"classes"))
+y.GT(y,D.E0())
 y=this.Z3
 y.V1(y)
 y.FV(0,z.t(b,"variables"))
+y.GT(y,D.E0())
 y=this.mu
 y.V1(y)
-y.FV(0,z.t(b,"functions"))},
+y.FV(0,z.t(b,"functions"))
+y.GT(y,D.E0())},
 $isU4:true},
 T5W:{
 "^":"af+boh;"},
@@ -17180,7 +17246,7 @@
 x.rT=F.Wi(x,C.hN,x.rT,y)},
 static:{"^":"jZx,xxx,qWF,oQ,S1O,wXu,WVi,Whu"}},
 dy:{
-"^":"cOr;Gz,ar,x8,Lh,vY,u0,J1,E8,qG,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,t7,VR,AP,fn",
+"^":"cOr;Gz,ar,x8,Lh,vY,u0,J1,E8,qG,TX,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,t7,VR,AP,fn",
 gHt:function(a){return this.Gz},
 sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
 gIs:function(a){return this.ar},
@@ -17191,6 +17257,8 @@
 gi2:function(){return this.J1},
 gVF:function(){return this.qG},
 sVF:function(a){this.qG=F.Wi(this,C.z6,this.qG,a)},
+gej:function(){return this.TX},
+sej:function(a){this.TX=F.Wi(this,C.Fe,this.TX,a)},
 gkc:function(a){return this.yv},
 skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
 gJL:function(){var z,y
@@ -17231,15 +17299,20 @@
 this.E8=F.Wi(this,C.Ih,this.E8,y)
 y=z.t(b,"tokenPos")
 this.qG=F.Wi(this,C.z6,this.qG,y)
+y=z.t(b,"endTokenPos")
+this.TX=F.Wi(this,C.Fe,this.TX,y)
 y=this.S5
 y.V1(y)
 y.FV(0,z.t(b,"subclasses"))
+y.GT(y,D.E0())
 y=this.tJ
 y.V1(y)
 y.FV(0,z.t(b,"fields"))
+y.GT(y,D.E0())
 y=this.mu
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
+y.GT(y,D.E0())
 y=z.t(b,"super")
 y=F.Wi(this,C.Cw,this.x8,y)
 this.x8=y
@@ -17383,7 +17456,7 @@
 z=this.LR
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,203],
+return y.bu(z)},"$0","gkA",0,0,204],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -17403,18 +17476,18 @@
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,203],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,204],
 io:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
 if(J.xC(z.gfF(),z.gPl()))return""
-return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,204,72],
+return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,205,73],
 HU:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-return D.dJ(z.gPl(),a.glt())+" ("+H.d(z.gPl())+")"},"$1","gGK",2,0,204,72],
+return D.dJ(z.gPl(),a.glt())+" ("+H.d(z.gPl())+")"},"$1","gGK",2,0,205,73],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -17442,7 +17515,7 @@
 WAE:{
 "^":"a;uX",
 bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
+static:{"^":"Oci,l8R,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
@@ -17474,7 +17547,7 @@
 gM8:function(){return!0},
 tx:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,205,206],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,206,207],
 OF:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.MO
@@ -17586,13 +17659,13 @@
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.gUH())},"$1",null,2,0,null,207,"call"],
+J.SK(y).ml(z.gUH())},"$1",null,2,0,null,208,"call"],
 $isEH:true},
 Cq:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:function(a,b){return J.bI(b.gAv(),a.gAv())},
 $isEH:true},
-l8R:{
+M9x:{
 "^":"a;uX",
 bu:function(a){return this.uX},
 static:{"^":"Cnk,lTU,FJy,wr",B4:function(a){var z=J.x(a)
@@ -17654,7 +17727,7 @@
 "^":"af+Pi;",
 $isd3:true},
 Qf:{
-"^":"Tp:78;a,b",
+"^":"Tp:79;a,b",
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
@@ -17757,9 +17830,9 @@
 else this.JS.u(0,y,x)
 return z.MM},
 W4X:[function(a){this.CS()
-this.t3()},"$1","gxb",2,0,208,2],
+this.t3()},"$1","gxb",2,0,209,2],
 Wp:[function(a){this.CS()
-this.t3()},"$1","gpU",2,0,20,209],
+this.t3()},"$1","gpU",2,0,20,210],
 ML:[function(a){var z,y
 z=this.N
 y=Date.now()
@@ -17769,7 +17842,7 @@
 y=this.eG.MM
 if(y.Gv===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(this)}},"$1","gqM",2,0,20,209],
+y.OH(this)}},"$1","gqM",2,0,20,210],
 SS:[function(a){var z,y,x,w,v
 z=C.xr.kV(J.Qd(a))
 if(z==null){N.QM("").YX("WebSocketVM got empty message")
@@ -17783,7 +17856,7 @@
 if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
 return}y=v.gmh().MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(w)},"$1","ga9",2,0,210,2],
+y.OH(w)},"$1","ga9",2,0,211,2],
 z1:function(a){a.aN(0,new U.Fw(this))
 a.V1(0)},
 CS:function(){var z=this.S3
@@ -17801,10 +17874,10 @@
 if(!J.Vr(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.N.gw8()))
 this.S3.u(0,a,b)
 y=this.N.gA9()===!0?C.xr.KP(P.EF(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.EF(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.EF(["seq",a,"request",z.gjO(b)],null,null))
-this.bs.send(y)},"$2","gkB",4,0,211],
+this.bs.send(y)},"$2","gkB",4,0,212],
 $isKM:true},
 Fw:{
-"^":"Tp:212;a",
+"^":"Tp:213;a",
 $2:function(a,b){var z,y
 z=b.gmh()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
@@ -17826,7 +17899,7 @@
 z=this.S3
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,73],
+J.KD(v,w)},"$1","gVx",2,0,20,74],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -18015,7 +18088,7 @@
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
 RC:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,110,1,213,102],
+a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,111,1,214,103],
 static:{Sm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -18050,7 +18123,7 @@
 "^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
 gZI:function(){return this.fY===C.nU},
 gUd:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.WH},
+gUA:function(){return this.fY===C.hU},
 giO:function(a){var z=this.oc
 return z.giO(z)},
 n:function(a,b){if(b==null)return!1
@@ -18157,12 +18230,12 @@
 if(y==null){if(!this.AZ)return!1
 throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
 UK:function(a,b){var z=this.F1(a,b)
-return z!=null&&z.fY===C.WH&&!z.Fo},
+return z!=null&&z.fY===C.hU&&!z.Fo},
 n6:function(a,b){var z,y
 z=this.WF.t(0,a)
 if(z==null){if(!this.AZ)return!1
 throw H.b(O.lA("declarations for "+H.d(a)))}y=z.t(0,b)
-return y!=null&&y.fY===C.WH&&y.Fo},
+return y!=null&&y.fY===C.hU&&y.Fo},
 CV:function(a,b){var z=this.F1(a,b)
 if(z==null){if(!this.AZ)return
 throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
@@ -18193,7 +18266,7 @@
 z.Ut(a)
 return z}}},
 m8:{
-"^":"Tp:78;a",
+"^":"Tp:79;a",
 $2:function(a,b){this.a.Nz.u(0,b,a)},
 $isEH:true},
 tk:{
@@ -18225,7 +18298,7 @@
 "^":"V51;ju,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
 gtN:function(a){return a.ju},
 stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-pA:[function(a,b){J.cI(a.ju).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.ju).YM(b)},"$1","gvC",2,0,20,98],
 static:{HI:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -18235,8 +18308,8 @@
 a.XN=!1
 a.Xy=z
 a.ZQ=y
-C.wB.ZL(a)
-C.wB.XI(a)
+C.uC.ZL(a)
+C.uC.XI(a)
 return a}}},
 V51:{
 "^":"uL+Pi;",
@@ -18266,7 +18339,7 @@
 z=b.appendChild(J.Ha(c,a,!1))
 for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.JW(w):null,e,f,g,null)
 if(d.ghK()){M.SB(z).bt(a)
-if(f!=null)J.Co(M.SB(z),f)}M.mV(z,d,e,g)
+if(f!=null)J.NA(M.SB(z),f)}M.mV(z,d,e,g)
 return z},
 tA:function(a){var z
 for(;z=J.TmB(a),z!=null;a=z);return a},
@@ -18481,7 +18554,7 @@
 return x.ad(x,new M.y4(a))}},h5:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 Ufa:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -18646,8 +18719,8 @@
 r.Ci=null
 return s},
 gk8:function(a){return this.Q2},
-gzH:function(a){return this.nF},
-szH:function(a,b){var z
+gG5:function(a){return this.nF},
+sG5:function(a,b){var z
 if(this.nF!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
 this.nF=b
 this.VZ=null
@@ -18765,7 +18838,7 @@
 "^":"Tp:13;a",
 $1:[function(a){var z=this.a
 J.Vs(z.rF).MW.setAttribute("ref",a)
-z.aX()},"$1",null,2,0,null,214,"call"],
+z.aX()},"$1",null,2,0,null,215,"call"],
 $isEH:true},
 yi:{
 "^":"Tp:20;",
@@ -18773,15 +18846,15 @@
 $isEH:true},
 MdQ:{
 "^":"Tp:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,129,"call"],
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,130,"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:78;",
+"^":"Tp:79;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).aX()},"$2",null,4,0,null,170,14,"call"],
+for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).aX()},"$2",null,4,0,null,171,14,"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:70;",
+"^":"Tp:71;",
 $0:function(){var z=document.createDocumentFragment()
 $.vH().u(0,z,new M.Fi([],null,null,null))
 return z},
@@ -18793,7 +18866,7 @@
 $1:function(a){return this.c.US(a,this.a,this.b)},
 $isEH:true},
 Uk:{
-"^":"Tp:78;a,b,c,d",
+"^":"Tp:79;a,b,c,d",
 $2:function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
@@ -18888,7 +18961,7 @@
 Q.Y5(s,this.S6,a)
 z=u.nF
 if(!this.Wv){this.Wv=!0
-r=J.Xp(!!J.x(u.rF).$isDT?u.rF:u)
+r=J.fx(!!J.x(u.rF).$isDT?u.rF:u)
 if(r!=null){this.eY=r.Mn.CE(t)
 this.TC=null}}q=P.YM(P.N3R(),null,null,null,null)
 for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
@@ -18916,7 +18989,7 @@
 f=this.xS(h-1)
 e=J.TmB(u.rF)
 C.Nm.xe(this.Rj,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Kp(u,0),H.Kp(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,215,216],
+e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Kp(u,0),H.Kp(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,216,217],
 Ep:[function(a){var z,y,x
 z=$.vH()
 z.toString
@@ -18924,7 +18997,7 @@
 x=(y==null?null:H.of(y,z.J4())).gu2()
 z=new H.a7(x,x.length,0,null)
 z.$builtinTypeInfo=[H.Kp(x,0)]
-for(;z.G();)J.yd(z.lo)},"$1","gMR",2,0,217],
+for(;z.G();)J.yd(z.lo)},"$1","gMR",2,0,218],
 Ke:function(){var z=this.VC
 if(z==null)return
 z.ed()
@@ -18999,7 +19072,7 @@
 x=z.length
 w=C.jn.cU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","geb",2,0,218,21],
+return y+H.d(z[w])},"$1","geb",2,0,219,21],
 Xb:[function(a){var z,y,x,w,v,u,t,s
 z=this.iB
 if(0>=z.length)return H.e(z,0)
@@ -19010,7 +19083,7 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,219,220],
+y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,220,221],
 l3:function(a,b){this.UV=this.iB.length===5?this.geb():this.gqt()},
 static:{"^":"rz5,xN8,t3a,epG,oM,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
@@ -19061,7 +19134,7 @@
 y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
 z.swv(0,y)}w=J.Vs(d).MW.getAttribute("href")
-$.mf.Z6.bo(0,w)},"$3","gkD",6,0,160,2,101,173],
+$.mf.Z6.bo(0,w)},"$3","gkD",6,0,161,2,102,174],
 MeB:[function(a,b,c,d){var z,y,x,w
 z=$.mf.m2
 y=a.P5
@@ -19069,8 +19142,8 @@
 x.Rz(0,y)
 z.XT()
 z.XT()
-w=z.Ys.IU+".history"
-$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,160,2,101,173],
+w=z.wu.IU+".history"
+$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,161,2,102,174],
 static:{fXx:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -19105,9 +19178,9 @@
 x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.mf.Z6.bo(0,"#/vm")},"$3","gMt",6,0,110,1,101,102],
+$.mf.Z6.bo(0,"#/vm")},"$3","gMt",6,0,111,1,102,103],
 qf:[function(a,b,c,d){J.Kr(b)
-this.Vf(a)},"$3","gzG",6,0,110,1,101,102],
+this.Vf(a)},"$3","gzG",6,0,111,1,102,103],
 Vf:function(a){G.FI(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
 Kq:function(a){var z=P.ii(0,0,0,0,0,1)
 a.di=this.ct(a,C.O9,a.di,z)},
@@ -19143,7 +19216,7 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,221,"call"],
+J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,222,"call"],
 $isEH:true},
 oU:{
 "^":"Tp:13;b",
@@ -19152,7 +19225,7 @@
 "^":"",
 I5:{
 "^":"xI;tY,Pe,AP,fn,di,o1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{pn:function(a){var z,y
+static:{vC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -19172,7 +19245,7 @@
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-pA:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,20,97],
+pA:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,20,98],
 static:{oH:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -19301,6 +19374,8 @@
 W.Hy.$isHy=true
 W.Hy.$isea=true
 W.Hy.$isa=true
+P.xu.$isQV=true
+P.xu.$isa=true
 P.a2.$isa2=true
 P.a2.$isa=true
 W.fJ.$isa=true
@@ -19470,7 +19545,6 @@
 J.CN=function(a){return J.RE(a).gd0(a)}
 J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
 J.Cm=function(a){return J.RE(a).gvC(a)}
-J.Co=function(a,b){return J.RE(a).szH(a,b)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
 J.DB=function(a){return J.RE(a).gn0(a)}
 J.DF=function(a,b){return J.RE(a).soc(a,b)}
@@ -19557,6 +19631,7 @@
 J.Mx=function(a){return J.RE(a).gks(a)}
 J.Mz=function(a){return J.RE(a).goE(a)}
 J.N1=function(a){return J.RE(a).Es(a)}
+J.NA=function(a,b){return J.RE(a).sG5(a,b)}
 J.NB=function(a){return J.RE(a).gHo(a)}
 J.NC=function(a){return J.RE(a).gHy(a)}
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
@@ -19661,7 +19736,6 @@
 J.XJ=function(a){return J.RE(a).gRY(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
 J.Xi=function(a){return J.RE(a).gr9(a)}
-J.Xp=function(a){return J.RE(a).gzH(a)}
 J.YH=function(a){return J.RE(a).gpM(a)}
 J.YQ=function(a){return J.RE(a).gPL(a)}
 J.Yb=function(a,b,c){return J.RE(a).ZK(a,b,c)}
@@ -19708,6 +19782,7 @@
 J.cs=function(a){return J.RE(a).gwJ(a)}
 J.d5=function(a){return J.Wx(a).gKy(a)}
 J.d7=function(a){return J.RE(a).giG(a)}
+J.dF=function(a){return J.w1(a).zH(a)}
 J.dY=function(a){return J.RE(a).ga4(a)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
@@ -19730,6 +19805,7 @@
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fv=function(a,b){return J.RE(a).sUx(a,b)}
 J.fw=function(a){return J.RE(a).gEl(a)}
+J.fx=function(a){return J.RE(a).gG5(a)}
 J.fy=function(a){return J.RE(a).gIF(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
@@ -19897,7 +19973,7 @@
 C.Gkp=Y.q6.prototype
 C.Mw=B.G6.prototype
 C.HR=A.wM.prototype
-C.YZ=Q.eW.prototype
+C.YZz=Q.eW.prototype
 C.RD=O.eo.prototype
 C.ka=Z.aC.prototype
 C.tWO=O.VY.prototype
@@ -19966,7 +20042,7 @@
 C.t5=W.BH3.prototype
 C.BH=V.F1.prototype
 C.Pfz=Z.uL.prototype
-C.Sx=J.Ai.prototype
+C.Sx=J.iCW.prototype
 C.Ki=A.xc.prototype
 C.Fa=T.ov.prototype
 C.Wa=A.kn.prototype
@@ -19977,7 +20053,7 @@
 C.HRc=Q.xI.prototype
 C.zb=Q.CY.prototype
 C.dX=K.nm.prototype
-C.wB=X.uw.prototype
+C.uC=X.uw.prototype
 C.OKl=A.G1.prototype
 C.vB=J.kdQ.prototype
 C.hj=V.D2.prototype
@@ -20002,7 +20078,7 @@
 C.Z7=new D.WAE("Tag")
 C.nU=new A.iYn(0)
 C.BM=new A.iYn(1)
-C.WH=new A.iYn(2)
+C.hU=new A.iYn(2)
 C.hf=new H.IN("label")
 C.Gh=H.IL('qU')
 C.B10=new K.vly()
@@ -20024,19 +20100,19 @@
 C.UL=new H.IN("profileChanged")
 C.yQP=H.IL('EH')
 C.dn=I.uL([])
-C.mM=new A.ES(C.UL,C.WH,!1,C.yQP,!1,C.dn)
+C.mM=new A.ES(C.UL,C.hU,!1,C.yQP,!1,C.dn)
 C.Ql=new H.IN("hasClass")
 C.HL=H.IL('a2')
 C.J19=new K.nd()
 C.esx=I.uL([C.B10,C.J19])
 C.TJ=new A.ES(C.Ql,C.BM,!1,C.HL,!1,C.esx)
 C.TU=new H.IN("endPosChanged")
-C.Cp=new A.ES(C.TU,C.WH,!1,C.yQP,!1,C.dn)
+C.Cp=new A.ES(C.TU,C.hU,!1,C.yQP,!1,C.dn)
 C.ne=new H.IN("exception")
 C.SNu=H.IL('EP')
 C.rZ=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.ucP)
 C.Wm=new H.IN("refChanged")
-C.QW=new A.ES(C.Wm,C.WH,!1,C.yQP,!1,C.dn)
+C.QW=new A.ES(C.Wm,C.hU,!1,C.yQP,!1,C.dn)
 C.UY=new H.IN("result")
 C.SmN=H.IL('af')
 C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
@@ -20056,9 +20132,9 @@
 C.a2p=H.IL('bv')
 C.xY=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.esx)
 C.bz=new H.IN("isolateChanged")
-C.Bk=new A.ES(C.bz,C.WH,!1,C.yQP,!1,C.dn)
+C.Bk=new A.ES(C.bz,C.hU,!1,C.yQP,!1,C.dn)
 C.CG=new H.IN("posChanged")
-C.Ml=new A.ES(C.CG,C.WH,!1,C.yQP,!1,C.dn)
+C.Ml=new A.ES(C.CG,C.hU,!1,C.yQP,!1,C.dn)
 C.yh=new H.IN("error")
 C.oUD=H.IL('N7')
 C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
@@ -20073,7 +20149,7 @@
 C.He=new H.IN("hideTagsChecked")
 C.oV=new A.ES(C.He,C.BM,!1,C.HL,!1,C.esx)
 C.ba=new H.IN("pollPeriodChanged")
-C.kQ=new A.ES(C.ba,C.WH,!1,C.yQP,!1,C.dn)
+C.kQ=new A.ES(C.ba,C.hU,!1,C.yQP,!1,C.dn)
 C.zz=new H.IN("timeSpan")
 C.lS=new A.ES(C.zz,C.BM,!1,C.Gh,!1,C.esx)
 C.AO=new H.IN("qualifiedName")
@@ -20083,13 +20159,13 @@
 C.kw=new H.IN("trace")
 C.oC=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.ucP)
 C.qX=new H.IN("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.WH,!1,C.yQP,!1,C.dn)
+C.dO=new A.ES(C.qX,C.hU,!1,C.yQP,!1,C.dn)
 C.UX=new H.IN("msg")
 C.Pt=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.ucP)
 C.pO=new H.IN("functionChanged")
-C.au=new A.ES(C.pO,C.WH,!1,C.yQP,!1,C.dn)
+C.au=new A.ES(C.pO,C.hU,!1,C.yQP,!1,C.dn)
 C.rP=new H.IN("mapChanged")
-C.Nt=new A.ES(C.rP,C.WH,!1,C.yQP,!1,C.dn)
+C.Nt=new A.ES(C.rP,C.hU,!1,C.yQP,!1,C.dn)
 C.bk=new H.IN("checked")
 C.Ud=new A.ES(C.bk,C.BM,!1,C.HL,!1,C.ucP)
 C.kV=new H.IN("link")
@@ -20150,7 +20226,7 @@
 C.pH=new H.IN("small")
 C.Fk=new A.ES(C.pH,C.BM,!1,C.HL,!1,C.ucP)
 C.ox=new H.IN("countersChanged")
-C.Rh=new A.ES(C.ox,C.WH,!1,C.yQP,!1,C.dn)
+C.Rh=new A.ES(C.ox,C.hU,!1,C.yQP,!1,C.dn)
 C.XM=new H.IN("path")
 C.Tt=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.ucP)
 C.bJ=new H.IN("counters")
@@ -20161,7 +20237,7 @@
 C.Ys=new H.IN("pad")
 C.Ce=new A.ES(C.Ys,C.BM,!1,C.HL,!1,C.ucP)
 C.N8=new H.IN("scriptChanged")
-C.qE=new A.ES(C.N8,C.WH,!1,C.yQP,!1,C.dn)
+C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.dn)
 C.YT=new H.IN("expr")
 C.eP=H.IL('dynamic')
 C.LC=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.ucP)
@@ -20170,7 +20246,7 @@
 C.ak=new H.IN("hasParent")
 C.yI=new A.ES(C.ak,C.BM,!1,C.HL,!1,C.esx)
 C.xS=new H.IN("tagSelectorChanged")
-C.bB=new A.ES(C.xS,C.WH,!1,C.yQP,!1,C.dn)
+C.bB=new A.ES(C.xS,C.hU,!1,C.yQP,!1,C.dn)
 C.jU=new H.IN("file")
 C.bw=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.ucP)
 C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
@@ -20193,15 +20269,15 @@
 C.aP=new H.IN("active")
 C.xD=new A.ES(C.aP,C.BM,!1,C.HL,!1,C.ucP)
 C.Gn=new H.IN("objectChanged")
-C.az=new A.ES(C.Gn,C.WH,!1,C.yQP,!1,C.dn)
+C.az=new A.ES(C.Gn,C.hU,!1,C.yQP,!1,C.dn)
 C.vp=new H.IN("list")
 C.o0=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.ucP)
 C.i4=new H.IN("code")
 C.pM=H.IL('kx')
 C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
 C.kG=new H.IN("classTable")
-C.rX=H.IL('UC')
-C.Pr=new A.ES(C.kG,C.BM,!1,C.rX,!1,C.esx)
+C.m7I=H.IL('UC')
+C.Pr=new A.ES(C.kG,C.BM,!1,C.m7I,!1,C.esx)
 C.TN=new H.IN("lastServiceGC")
 C.Gj=new A.ES(C.TN,C.BM,!1,C.Gh,!1,C.esx)
 C.zd=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.ucP)
@@ -20218,7 +20294,7 @@
 C.WQ=new H.IN("field")
 C.ah=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.ucP)
 C.r1=new H.IN("expandChanged")
-C.nP=new A.ES(C.r1,C.WH,!1,C.yQP,!1,C.dn)
+C.nP=new A.ES(C.r1,C.hU,!1,C.yQP,!1,C.dn)
 C.Mc=new H.IN("flagList")
 C.f0=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.ucP)
 C.fn=new H.IN("instance")
@@ -20250,7 +20326,7 @@
 C.i3=H.VM(new W.FkO("input"),[W.ea])
 C.LF=H.VM(new W.FkO("load"),[W.kf])
 C.ph=H.VM(new W.FkO("message"),[W.Hy])
-C.uh=H.VM(new W.FkO("mousedown"),[W.AjY])
+C.Whw=H.VM(new W.FkO("mousedown"),[W.AjY])
 C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
 C.JL=H.VM(new W.FkO("open"),[W.ea])
 C.yf=H.VM(new W.FkO("popstate"),[W.f5])
@@ -20424,7 +20500,7 @@
 C.lx=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.Y1)
 C.CM=new H.Px(0,{},C.dn)
 C.MEG=I.uL(["enumerate"])
-C.va=new H.Px(1,{enumerate:K.y8()},C.MEG)
+C.va=new H.Px(1,{enumerate:K.pg()},C.MEG)
 C.tq=H.IL('Bo')
 C.uwj=H.IL('wA')
 C.wE=I.uL([C.uwj])
@@ -20432,10 +20508,10 @@
 C.uDk=H.IL('hG')
 C.tmF=I.uL([C.uDk])
 C.aj=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.tmF,null)
-C.wj=new D.l8R("Internal")
-C.Cn=new D.l8R("Listening")
-C.lT=new D.l8R("Normal")
-C.FJ=new D.l8R("Pipe")
+C.wj=new D.M9x("Internal")
+C.Cn=new D.M9x("Listening")
+C.lT=new D.M9x("Normal")
+C.FJ=new D.M9x("Pipe")
 C.BE=new H.IN("averageCollectionPeriodInMillis")
 C.IH=new H.IN("address")
 C.j2=new H.IN("app")
@@ -20463,6 +20539,7 @@
 C.f4=new H.IN("descriptors")
 C.aK=new H.IN("doAction")
 C.GP=new H.IN("element")
+C.Fe=new H.IN("endTokenPos")
 C.tP=new H.IN("entry")
 C.Zb=new H.IN("eval")
 C.u7=new H.IN("evalNow")
@@ -20618,7 +20695,7 @@
 C.Dl=H.IL('F1')
 C.Jf=H.IL('Mb')
 C.UJ=H.IL('oa')
-C.E0=H.IL('aI')
+C.uh=H.IL('aI')
 C.Y3=H.IL('CY')
 C.lU=H.IL('Hl')
 C.kq=H.IL('Nn')
@@ -20681,7 +20758,7 @@
 C.FG=H.IL('qh')
 C.bC=H.IL('D2')
 C.a8=H.IL('Zx')
-C.Fe=H.IL('zt')
+C.YZ=H.IL('zt')
 C.NR=H.IL('nm')
 C.DD=H.IL('Zn')
 C.qF=H.IL('mO')
@@ -20756,11 +20833,11 @@
 $.vU=null
 $.xV=null
 $.rK=!1
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.z1},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.Ir},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.BL,X.Nr,{created:X.Ak},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.dF},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.pn},C.jA,R.Eg,{created:R.Nd},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.lW},C.vu,X.uw,{created:X.HI},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.RP},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.NI},C.a8,A.Zx,{created:A.zC},C.NR,K.nm,{created:K.ant},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.nX,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.jRi,H.we,{"":H.ic},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.tX},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJm},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.nv},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.oS},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
+$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.z1},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.Ir},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.BL,X.Nr,{created:X.Ak},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Nd},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.lW},C.vu,X.uw,{created:X.HI},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.RP},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.NI},C.a8,A.Zx,{created:A.zC},C.NR,K.nm,{created:K.ant},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.nX,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.jRi,H.we,{"":H.ic},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.tX},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJm},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.nv},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.oS},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
 I.$lazy($,"globalWindow","UW","My",function(){return $.jk().window})
 I.$lazy($,"globalWorker","u9","rm",function(){return $.jk().Worker})
-I.$lazy($,"globalPostMessageDefined","Wdn","ey",function(){return $.jk().postMessage!==void 0})
+I.$lazy($,"globalPostMessageDefined","WH","wB",function(){return $.jk().postMessage!==void 0})
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
@@ -20800,7 +20877,7 @@
 I.$lazy($,"_ShadowCss","qP","AM",function(){var z=$.Kc()
 return z!=null?J.UQ(z,"ShadowCSS"):null})
 I.$lazy($,"_sheetLog","dz","QJ",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.Xm())})
+I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
 I.$lazy($,"_ATTRIBUTES_REGEX","mD","aQ",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Si(),"Platform")})
 I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
@@ -20831,8 +20908,8 @@
 I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.functionAliases={Sa:222}
-init.metadata=["sender","e","event","uri","onError",{func:"pd",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Cu",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"b1",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.dl,P.qK,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.qK,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"Ls",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"ie",ret:{func:"l4",args:[null]},args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"Ls",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"Ls",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"as",ret:P.Xa,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.dl,P.qK,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aYy,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.GD]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable","invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message","key","val",{func:"Ls",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"uC",args:[U.Z5,U.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"lv",args:[P.GD,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Ve",ret:P.KN,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"QO",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Yi",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"la",ret:P.QV,args:[P.qU]}]},"s",{func:"S0",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"xc",ret:P.a2,args:[P.qU]},"type",{func:"B4",args:[P.qK,P.dl]},{func:"Zg",args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"K7",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.Yj]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Qc",args:[U.Ip]},"hits","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer",{func:"I6a",ret:P.qU},{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"JQ",void:true,args:[W.BI]},"Event",{func:"WEz",void:true,args:[W.Hy]},{func:"T2",void:true,args:[P.qU,U.U2]},{func:"px",args:[P.qU,U.U2]},"details","ref",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"xh",void:true,args:[W.Aj]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
+init.functionAliases={Sa:223}
+init.metadata=["sender","e","event","uri","onError",{func:"pd",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Cu",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"b1",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.dl,P.qK,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.qK,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"Ls",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"ie",ret:{func:"l4",args:[null]},args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"Ls",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"Ls",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"as",ret:P.Xa,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.dl,P.qK,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aYy,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.GD]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Hc",ret:P.KN,args:[D.af,D.af]},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message","key","val",{func:"Ls",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"uC",args:[U.Z5,U.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"lv",args:[P.GD,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Ve",ret:P.KN,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"QO",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Yi",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"la",ret:P.QV,args:[P.qU]}]},"s",{func:"S0",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"xc",ret:P.a2,args:[P.qU]},"type",{func:"B4",args:[P.qK,P.dl]},{func:"Zg",args:[P.dl,P.qK,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"K7",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.Yj]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Qc",args:[U.Ip]},"hits","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer",{func:"I6a",ret:P.qU},{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"JQ",void:true,args:[W.BI]},"Event",{func:"WEz",void:true,args:[W.Hy]},{func:"T2",void:true,args:[P.qU,U.U2]},{func:"px",args:[P.qU,U.U2]},"details","ref",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"xh",void:true,args:[W.Aj]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
index 4429b3e..296ff9d 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
@@ -8,6 +8,7 @@
 <link rel="import" href="library_ref.html">
 <link rel="import" href="nav_bar.html">
 <link rel="import" href="observatory_element.html">
+<link rel="import" href="script_inset.html">
 <link rel="import" href="script_ref.html">
 
 <polymer-element name="class-view" extends="observatory-element">
@@ -186,6 +187,11 @@
     <div class="content">
       <eval-box callback="{{ eval }}"></eval-box>
     </div>
+
+    <hr>
+    <script-inset script="{{ cls.script }}" pos="{{ cls.tokenPos }}" endPos="{{ cls.endTokenPos }}">
+    </script-inset>
+
     <br><br><br><br>
     <br><br><br><br>
   </template>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
index d54eaae..c85d64f 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
@@ -81,6 +81,12 @@
                   <div class="memberName">[{{ element['index']}}]</div>
                   <div class="memberValue">
                     <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                    <template if="{{ element['parentField'] != null }}">
+                      in <field-ref ref="{{ element['parentField'] }}"></field-ref>
+                    </template>
+                    <template if="{{ element['parentListIndex'] != null }}">
+                      at list index {{ element['parentListIndex'] }} of
+                    </template>
                   </div>
                   </div>
                 </template>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.html b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
index 4429b3e..296ff9d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -8,6 +8,7 @@
 <link rel="import" href="library_ref.html">
 <link rel="import" href="nav_bar.html">
 <link rel="import" href="observatory_element.html">
+<link rel="import" href="script_inset.html">
 <link rel="import" href="script_ref.html">
 
 <polymer-element name="class-view" extends="observatory-element">
@@ -186,6 +187,11 @@
     <div class="content">
       <eval-box callback="{{ eval }}"></eval-box>
     </div>
+
+    <hr>
+    <script-inset script="{{ cls.script }}" pos="{{ cls.tokenPos }}" endPos="{{ cls.endTokenPos }}">
+    </script-inset>
+
     <br><br><br><br>
     <br><br><br><br>
   </template>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index d54eaae..c85d64f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -81,6 +81,12 @@
                   <div class="memberName">[{{ element['index']}}]</div>
                   <div class="memberValue">
                     <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                    <template if="{{ element['parentField'] != null }}">
+                      in <field-ref ref="{{ element['parentField'] }}"></field-ref>
+                    </template>
+                    <template if="{{ element['parentListIndex'] != null }}">
+                      at list index {{ element['parentListIndex'] }} of
+                    </template>
                   </div>
                   </div>
                 </template>
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index 0f517ec..0f90c0d 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -1124,6 +1124,7 @@
   @observable bool isImplemented;
 
   @observable int tokenPos;
+  @observable int endTokenPos;
 
   @observable ServiceMap error;
 
@@ -1177,6 +1178,7 @@
     isImplemented = map['implemented'];
 
     tokenPos = map['tokenPos'];
+    endTokenPos = map['endTokenPos'];
 
     subClasses.clear();
     subClasses.addAll(map['subclasses']);
diff --git a/runtime/bin/vmservice/client/tests/ui/retainingPath.dart b/runtime/bin/vmservice/client/tests/ui/retainingPath.dart
new file mode 100644
index 0000000..452bd8c
--- /dev/null
+++ b/runtime/bin/vmservice/client/tests/ui/retainingPath.dart
@@ -0,0 +1,31 @@
+/*
+0.
+dart --observe retainingPath.dart
+1.
+isolate 'root'
+2.
+library 'retainingPath.dart'
+3.
+class 'Foo'
+4.
+under 'instances', find 'strongly reachable' list; it should contain 2 elements, one of which should have a field containing "87"
+5.
+instance "87"
+6.
+find 'retaining path'; it should have length 4, and be annotated as follows:
+ "87" in var a
+ Foo in var b
+ Foo at list index 5 of
+ _List(10)
+*/
+class Foo {
+  var a;
+  var b;
+  Foo(this.a, this.b);
+}
+
+main() {
+  var list = new List<Foo>(10);
+  list[5] = new Foo(42.toString(), new Foo(87.toString(), 17.toString()));
+  while (true) {}
+}
diff --git a/runtime/bin/vmservice/client/tests/ui/retainingPath.txt b/runtime/bin/vmservice/client/tests/ui/retainingPath.txt
new file mode 100644
index 0000000..e4666a8
--- /dev/null
+++ b/runtime/bin/vmservice/client/tests/ui/retainingPath.txt
@@ -0,0 +1,18 @@
+0.
+dart --observe retainingPath.dart
+1.
+isolate 'root'
+2.
+library 'retainingPath.dart'
+3.
+class 'Foo'
+4.
+under 'instances', find 'strongly reachable' list; it should contain 2 elements, one of which should have a field containing "87"
+5.
+instance "87"
+6.
+find 'retaining path'; it should have length 4, and be annotated as follows:
+ "87" in var a
+ Foo in var b
+ Foo at list index 5 of
+ _List(10)
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 2fcd44b..658a3f1 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -176,18 +176,29 @@
     ThrowIsolateSpawnException(msg);
   }
 
-  // Try to create a SendPort for the new isolate.
+  // The result of spawning an Isolate is an array with 3 elements:
+  // [main_port, pause_capability, terminate_capability]
+  const Array& result = Array::Handle(Array::New(3));
+
+  // Create a SendPort for the new isolate.
+  Isolate* spawned_isolate = state->isolate();
   const SendPort& port = SendPort::Handle(
-      SendPort::New(state->isolate()->main_port()));
+      SendPort::New(spawned_isolate->main_port()));
+  result.SetAt(0, port);
+  Capability& capability = Capability::Handle();
+  capability = Capability::New(spawned_isolate->pause_capability());
+  result.SetAt(1, capability);  // pauseCapability
+  capability = Capability::New(spawned_isolate->terminate_capability());
+  result.SetAt(2, capability);  // terminateCapability
 
   // Start the new isolate if it is already marked as runnable.
-  MutexLocker ml(state->isolate()->mutex());
-  state->isolate()->set_spawn_state(state);
-  if (state->isolate()->is_runnable()) {
-    state->isolate()->Run();
+  MutexLocker ml(spawned_isolate->mutex());
+  spawned_isolate->set_spawn_state(state);
+  if (spawned_isolate->is_runnable()) {
+    spawned_isolate->Run();
   }
 
-  return port.raw();
+  return result.raw();
 }
 
 
@@ -230,6 +241,24 @@
 }
 
 
+DEFINE_NATIVE_ENTRY(Isolate_sendOOB, 2) {
+  GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(Array, msg, arguments->NativeArgAt(1));
+
+  // Make sure to route this request to the isolate library OOB mesage handler.
+  msg.SetAt(0, Smi::Handle(Smi::New(Message::kIsolateLibOOBMsg)));
+
+  uint8_t* data = NULL;
+  MessageWriter writer(&data, &allocator);
+  writer.WriteMessage(msg);
+
+  PortMap::PostMessage(new Message(port.Id(),
+                                   data, writer.BytesWritten(),
+                                   Message::kOOBPriority));
+  return Object::null();
+}
+
+
 DEFINE_NATIVE_ENTRY(Isolate_mainPort, 0) {
   // The control port is being accessed as a regular port from Dart code. This
   // is most likely due to the _startIsolate code in dart:isolate. Account for
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index acf9968..00b26e0 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -12,12 +12,10 @@
 }
 
 patch class Capability {
-  /* patch */ factory Capability() {
-    throw new UnimplementedError();
-  }
+  /* patch */ factory Capability() = _CapabilityImpl;
 }
 
-class _CapabilityImpl {
+class _CapabilityImpl implements Capability {
   factory _CapabilityImpl() native "CapabilityImpl_factory";
 }
 
@@ -231,14 +229,18 @@
     // `paused` isn't handled yet.
     try {
       // The VM will invoke [_startIsolate] with entryPoint as argument.
-      SendPort controlPort = _spawnFunction(entryPoint);
+      List spawnData = _spawnFunction(entryPoint);
+      assert(spawnData.length == 3);
+      SendPort controlPort = spawnData[0];
       RawReceivePort readyPort = new RawReceivePort();
       controlPort.send([readyPort.sendPort, message]);
       Completer completer = new Completer<Isolate>.sync();
       readyPort.handler = (readyMessage) {
         assert(readyMessage == 'started');
         readyPort.close();
-        completer.complete(new Isolate(controlPort));
+        completer.complete(new Isolate(controlPort,
+                                       pauseCapability: spawnData[1],
+                                       terminateCapability: spawnData[2]));
       };
       return completer.future;
     } catch (e, st) {
@@ -251,14 +253,18 @@
     // `paused` isn't handled yet.
     try {
       // The VM will invoke [_startIsolate] and not `main`.
-      SendPort controlPort = _spawnUri(uri.toString());
+      List spawnData = _spawnUri(uri.toString());
+      assert(spawnData.length == 3);
+      SendPort controlPort = spawnData[0];
       RawReceivePort readyPort = new RawReceivePort();
       controlPort.send([readyPort.sendPort, args, message]);
       Completer completer = new Completer<Isolate>.sync();
       readyPort.handler = (readyMessage) {
         assert(readyMessage == 'started');
         readyPort.close();
-        completer.complete(new Isolate(controlPort));
+        completer.complete(new Isolate(controlPort,
+                                       pauseCapability: spawnData[1],
+                                       terminateCapability: spawnData[2]));
       };
       return completer.future;
     } catch (e, st) {
@@ -270,17 +276,35 @@
   static final RawReceivePort _self = _mainPort;
   static RawReceivePort get _mainPort native "Isolate_mainPort";
 
-  static SendPort _spawnFunction(Function topLevelFunction)
+  // TODO(iposva): Cleanup to have only one definition.
+  // These values need to be kept in sync with the class IsolateMessageHandler
+  // in vm/isolate.cc.
+  static const _PAUSE = 1;
+  static const _RESUME = 2;
+
+  static List _spawnFunction(Function topLevelFunction)
       native "Isolate_spawnFunction";
 
-  static SendPort _spawnUri(String uri) native "Isolate_spawnUri";
+  static List _spawnUri(String uri) native "Isolate_spawnUri";
+
+  static void _sendOOB(port, msg) native "Isolate_sendOOB";
 
   /* patch */ void _pause(Capability resumeCapability) {
-    throw new UnsupportedError("pause");
+    var msg = new List(4)
+        ..[0] = 0  // Make room for OOM message type.
+        ..[1] = _PAUSE
+        ..[2] = pauseCapability
+        ..[3] = resumeCapability;
+    _sendOOB(controlPort, msg);
   }
 
   /* patch */ void resume(Capability resumeCapability) {
-    throw new UnsupportedError("resume");
+    var msg = new List(4)
+        ..[0] = 0  // Make room for OOM message type.
+        ..[1] = _RESUME
+        ..[2] = pauseCapability
+        ..[3] = resumeCapability;
+    _sendOOB(controlPort, msg);
   }
 
   /* patch */ void addOnExitListener(SendPort responsePort) {
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 13bb7a9..b1206cd 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -4,8 +4,7 @@
 
 // VM-specific implementation of the dart:mirrors library.
 
-import "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
-import "dart:_internal" show LRUMap;
+import "dart:collection";
 
 final emptyList = new UnmodifiableListView([]);
 final emptyMap = new UnmodifiableMapView({});
@@ -299,15 +298,21 @@
     return identityHashCode(_reflectee) ^ 0x36363636;
   }
 
-  static var _getFieldClosures = new LRUMap.withShift(7);
-  static var _setFieldClosures = new LRUMap.withShift(7);
-  static var _getFieldCallCounts = new LRUMap.withShift(8);
-  static var _setFieldCallCounts = new LRUMap.withShift(8);
+  // TODO(18445): Use an LRU cache.
+  static var _getFieldClosures = new HashMap();
+  static var _setFieldClosures = new HashMap();
+  static var _getFieldCallCounts = new HashMap();
+  static var _setFieldCallCounts = new HashMap();
   static const _closureThreshold = 20;
+  static const _cacheSizeLimit = 255;
 
   _getFieldSlow(unwrapped) {
     // Slow path factored out to give the fast path a better chance at being
     // inlined.
+    if (_getFieldCallCounts.length == 2 * _cacheSizeLimit) {
+      // Prevent unbounded cache growth.
+      _getFieldCallCounts = new HashMap();
+    }
     var callCount = _getFieldCallCounts[unwrapped];
     if (callCount == null) {
       callCount = 0;
@@ -326,7 +331,12 @@
         var privateKey = unwrapped.substring(atPosition);
         f = _eval('(x) => x.$withoutKey', privateKey);
       }
+      if (_getFieldClosures.length == _cacheSizeLimit) {
+        // Prevent unbounded cache growth.
+        _getFieldClosures = new HashMap();
+      }
       _getFieldClosures[unwrapped] = f;
+      _getFieldCallCounts.remove(unwrapped);  // We won't look for this again.
       return reflect(f(_reflectee));
     }
     var result = reflect(_invokeGetter(_reflectee, unwrapped));
@@ -345,6 +355,9 @@
   _setFieldSlow(unwrapped, arg) {
     // Slow path factored out to give the fast path a better chance at being
     // inlined.
+    if (_setFieldCallCounts.length == 2 * _cacheSizeLimit) {
+      _setFieldCallCounts = new HashMap();
+    }
     var callCount = _setFieldCallCounts[unwrapped];
     if (callCount == null) {
       callCount = 0;
@@ -363,7 +376,12 @@
         var privateKey = unwrapped.substring(atPosition);
         f = _eval('(x, v) => x.$withoutKey = v', privateKey);
       }
+      if (_setFieldClosures.length == _cacheSizeLimit) {
+        // Prevent unbounded cache growth.
+        _setFieldClosures = new HashMap();
+      }
       _setFieldClosures[unwrapped] = f;
+      _setFieldCallCounts.remove(unwrapped);
       return reflect(f(_reflectee, arg));
     }
     _invokeSetter(_reflectee, unwrapped, arg);
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index 1920a76..0df6950 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -16,11 +16,6 @@
     return new _Int8Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Int8List.view(ByteBuffer buffer,
-                                    [int offsetInBytes = 0, int length]) {
-    return new _Int8ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -33,11 +28,6 @@
     return new _Uint8Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Uint8List.view(ByteBuffer buffer,
-                                     [int offsetInBytes = 0, int length]) {
-    return new _Uint8ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -50,12 +40,6 @@
     return new _Uint8ClampedArray(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Uint8ClampedList.view(ByteBuffer buffer,
-                                            [int offsetInBytes = 0,
-                                             int length]) {
-    return new _Uint8ClampedArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -68,11 +52,6 @@
     return new _Int16Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Int16List.view(ByteBuffer buffer,
-                                     [int offsetInBytes = 0, int length]) {
-    return new _Int16ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -85,11 +64,6 @@
     return new _Uint16Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Uint16List.view(ByteBuffer buffer,
-                                      [int offsetInBytes = 0, int length]) {
-    return new _Uint16ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -102,11 +76,6 @@
     return new _Int32Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Int32List.view(ByteBuffer buffer,
-                                     [int offsetInBytes = 0, int length]) {
-    return new _Int32ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -119,11 +88,6 @@
     return new _Uint32Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Uint32List.view(ByteBuffer buffer,
-                                      [int offsetInBytes = 0, int length]) {
-    return new _Uint32ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -136,11 +100,6 @@
     return new _Int64Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Int64List.view(ByteBuffer buffer,
-                                     [int offsetInBytes = 0, int length]) {
-    return new _Int64ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -153,11 +112,6 @@
     return new _Uint64Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Uint64List.view(ByteBuffer buffer,
-                                      [int offsetInBytes = 0, int length]) {
-    return new _Uint64ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -170,11 +124,6 @@
     return new _Float32Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Float32List.view(ByteBuffer buffer,
-                                       [int offsetInBytes = 0, int length]) {
-    return new _Float32ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -187,13 +136,9 @@
     return new _Float64Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Float64List.view(ByteBuffer buffer,
-                                       [int offsetInBytes = 0, int length]) {
-    return new _Float64ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
+
 patch class Float32x4List {
   /* patch */ factory Float32x4List(int length) {
     return new _Float32x4Array(length);
@@ -203,11 +148,6 @@
     return new _Float32x4Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Float32x4List.view(ByteBuffer buffer,
-                                         [int offsetInBytes = 0, int length]) {
-    return new _Float32x4ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -221,13 +161,8 @@
         ..setRange(0, elements.length, elements);
   }
 
-  /* patch */ factory Int32x4List.view(ByteBuffer buffer,
-                                        [int offsetInBytes = 0, int length]) {
-    return new _Int32x4ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
-
 patch class Float64x2List {
   /* patch */ factory Float64x2List(int length) {
     return new _Float64x2Array(length);
@@ -237,11 +172,6 @@
     return new _Float64x2Array(elements.length)
         ..setRange(0, elements.length, elements);
   }
-
-  /* patch */ factory Float64x2List.view(ByteBuffer buffer,
-                                         [int offsetInBytes = 0, int length]) {
-    return new _Float64x2ArrayView(buffer, offsetInBytes, length);
-  }
 }
 
 
@@ -302,14 +232,6 @@
     return new _ByteDataView(list, 0, length);
   }
 
-  /* patch */ factory ByteData.view(ByteBuffer buffer,
-                                    [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = buffer.lengthInBytes - offsetInBytes;
-    }
-    return new _ByteDataView(buffer._data, offsetInBytes, length);
-  }
-
   // Called directly from C code.
   factory ByteData._view(TypedData typedData, int offsetInBytes, int length) {
     return new _ByteDataView(typedData, offsetInBytes, length);
@@ -621,6 +543,122 @@
   int get hashCode => _data.hashCode;
   bool operator==(Object other) =>
       (other is _ByteBuffer) && identical(_data, other._data);
+
+  ByteData asByteData([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = this.lengthInBytes - offsetInBytes;
+    }
+    return new _ByteDataView(this._data, offsetInBytes, length);
+  }
+
+  Int8List asInt8List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = this.lengthInBytes - offsetInBytes;
+    }
+    return new _Int8ArrayView(this, offsetInBytes, length);
+  }
+
+  Uint8List asUint8List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = this.lengthInBytes - offsetInBytes;
+    }
+    return new _Uint8ArrayView(this, offsetInBytes, length);
+  }
+
+  Uint8ClampedList asUint8ClampedList([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = this.lengthInBytes - offsetInBytes;
+    }
+    return new _Uint8ClampedArrayView(this, offsetInBytes, length);
+  }
+
+  Int16List asInt16List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Int16List.BYTES_PER_ELEMENT;
+    }
+    return new _Int16ArrayView(this, offsetInBytes, length);
+  }
+
+  Uint16List asUint16List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Uint16List.BYTES_PER_ELEMENT;
+    }
+    return new _Uint16ArrayView(this, offsetInBytes, length);
+  }
+
+  Int32List asInt32List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Int32List.BYTES_PER_ELEMENT;
+    }
+    return new _Int32ArrayView(this, offsetInBytes, length);
+  }
+
+  Uint32List asUint32List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Uint32List.BYTES_PER_ELEMENT;
+    }
+    return new _Uint32ArrayView(this, offsetInBytes, length);
+  }
+
+  Int64List asInt64List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Int64List.BYTES_PER_ELEMENT;
+    }
+    return new _Int64ArrayView(this, offsetInBytes, length);
+  }
+
+  Uint64List asUint64List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Uint64List.BYTES_PER_ELEMENT;
+    }
+    return new _Uint64ArrayView(this, offsetInBytes, length);
+  }
+
+  Float32List asFloat32List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Float32List.BYTES_PER_ELEMENT;
+    }
+    return new _Float32ArrayView(this, offsetInBytes, length);
+  }
+
+  Float64List asFloat64List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Float64List.BYTES_PER_ELEMENT;
+    }
+    return new _Float64ArrayView(this, offsetInBytes, length);
+  }
+
+  Float32x4List asFloat32x4List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Float32x4List.BYTES_PER_ELEMENT;
+    }
+    return new _Float32x4ArrayView(this, offsetInBytes, length);
+  }
+
+  Int32x4List asInt32x4List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Int32x4List.BYTES_PER_ELEMENT;
+    }
+    return new _Int32x4ArrayView(this, offsetInBytes, length);
+  }
+
+  Float64x2List asFloat64x2List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+               Float64x2List.BYTES_PER_ELEMENT;
+    }
+    return new _Float64x2ArrayView(this, offsetInBytes, length);
+  }
 }
 
 
@@ -695,14 +733,6 @@
     return _new(length);
   }
 
-  factory _Int8Array.view(ByteBuffer buffer,
-                          [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = buffer.lengthInBytes - offsetInBytes;
-    }
-    return new _Int8ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   // Method(s) implementing List interface.
 
@@ -749,14 +779,6 @@
     return _new(length);
   }
 
-  factory _Uint8Array.view(ByteBuffer buffer,
-                           [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = buffer.lengthInBytes - offsetInBytes;
-    }
-    return new _Uint8ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   // Methods implementing List interface.
   int operator[](int index) {
@@ -801,14 +823,6 @@
     return _new(length);
   }
 
-  factory _Uint8ClampedArray.view(ByteBuffer buffer,
-                                  [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = buffer.lengthInBytes - offsetInBytes;
-    }
-    return new _Uint8ClampedArrayView(buffer, offsetInBytes, length);
-  }
-
   // Methods implementing List interface.
 
   int operator[](int index) {
@@ -854,15 +868,6 @@
     return _new(length);
   }
 
-  factory _Int16Array.view(ByteBuffer buffer,
-                           [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-               Int16List.BYTES_PER_ELEMENT;
-    }
-    return new _Int16ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   // Method(s) implementing List interface.
 
@@ -917,15 +922,6 @@
     return _new(length);
   }
 
-  factory _Uint16Array.view(ByteBuffer buffer,
-                            [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-                Uint16List.BYTES_PER_ELEMENT;
-    }
-    return new _Uint16ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   // Method(s) implementing the List interface.
 
@@ -980,15 +976,6 @@
     return _new(length);
   }
 
-  factory _Int32Array.view(ByteBuffer buffer,
-                           [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-                Int32List.BYTES_PER_ELEMENT;
-    }
-    return new _Int32ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   // Method(s) implementing the List interface.
 
@@ -1043,15 +1030,6 @@
     return _new(length);
   }
 
-  factory _Uint32Array.view(ByteBuffer buffer,
-                            [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-                Uint32List.BYTES_PER_ELEMENT;
-    }
-    return new _Uint32ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   // Method(s) implementing the List interface.
 
@@ -1106,15 +1084,6 @@
     return _new(length);
   }
 
-  factory _Int64Array.view(ByteBuffer buffer,
-                           [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-                Int32List.BYTES_PER_ELEMENT;
-    }
-    return new _Int64ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   // Method(s) implementing the List interface.
 
@@ -1169,15 +1138,6 @@
     return _new(length);
   }
 
-  factory _Uint64Array.view(ByteBuffer buffer,
-                            [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-               Uint64List.BYTES_PER_ELEMENT;
-    }
-    return new _Uint64ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   // Method(s) implementing the List interface.
 
@@ -1232,15 +1192,6 @@
     return _new(length);
   }
 
-  factory _Float32Array.view(ByteBuffer buffer,
-                             [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-               Float32List.BYTES_PER_ELEMENT;
-    }
-    return new _Float32ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   // Method(s) implementing the List interface.
 
@@ -1295,15 +1246,6 @@
     return _new(length);
   }
 
-  factory _Float64Array.view(ByteBuffer buffer,
-                             [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-               Float64List.BYTES_PER_ELEMENT;
-    }
-    return new _Float64ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   // Method(s) implementing the List interface.
 
@@ -1358,15 +1300,6 @@
     return _new(length);
   }
 
-  factory _Float32x4Array.view(ByteBuffer buffer,
-                               [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-               Float32x4List.BYTES_PER_ELEMENT;
-    }
-    return new _Float32x4ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   Float32x4 operator[](int index) {
     if (index < 0 || index >= length) {
@@ -1419,15 +1352,6 @@
     return _new(length);
   }
 
-  factory _Int32x4Array.view(ByteBuffer buffer,
-                              [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-               Int32x4List.BYTES_PER_ELEMENT;
-    }
-    return new _Int32x4ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   Int32x4 operator[](int index) {
     if (index < 0 || index >= length) {
@@ -1480,15 +1404,6 @@
     return _new(length);
   }
 
-  factory _Float64x2Array.view(ByteBuffer buffer,
-                               [int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (buffer.lengthInBytes - offsetInBytes) ~/
-               Float64x2List.BYTES_PER_ELEMENT;
-    }
-    return new _Float64x2ArrayView(buffer, offsetInBytes, length);
-  }
-
 
   Float64x2 operator[](int index) {
     if (index < 0 || index >= length) {
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index c94b9f5..e2924f9 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -1615,7 +1615,8 @@
   if (object != R0) {
     mov(R0, Operand(object));
   }
-  BranchLink(&StubCode::UpdateStoreBufferLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  BranchLink(&stub_code->UpdateStoreBufferLabel());
   PopList(regs);
   Bind(&done);
 }
@@ -3167,10 +3168,11 @@
 
 void Assembler::Stop(const char* message) {
   if (FLAG_print_stop_message) {
+    StubCode* stub_code = Isolate::Current()->stub_code();
     PushList((1 << R0) | (1 << IP) | (1 << LR));  // Preserve R0, IP, LR.
     LoadImmediate(R0, reinterpret_cast<int32_t>(message));
     // PrintStopMessage() preserves all registers.
-    BranchLink(&StubCode::PrintStopMessageLabel());  // Passing message in R0.
+    BranchLink(&stub_code->PrintStopMessageLabel());  // Passing message in R0.
     PopList((1 << R0) | (1 << IP) | (1 << LR));  // Restore R0, IP, LR.
   }
   // Emit the message address before the svc instruction, so that we can
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index c6d4457..8581049 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -51,9 +51,10 @@
     object_pool_index_table_.Insert(ObjIndexPair(Bool::False().raw(), 2));
 
     const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift));
+    StubCode* stub_code = Isolate::Current()->stub_code();
 
-    if (StubCode::UpdateStoreBuffer_entry() != NULL) {
-      FindExternalLabel(&StubCode::UpdateStoreBufferLabel(), kNotPatchable);
+    if (stub_code->UpdateStoreBuffer_entry() != NULL) {
+      FindExternalLabel(&stub_code->UpdateStoreBufferLabel(), kNotPatchable);
     } else {
       object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
@@ -978,7 +979,8 @@
   if (object != R0) {
     mov(R0, object);
   }
-  BranchLink(&StubCode::UpdateStoreBufferLabel(), PP);
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  BranchLink(&stub_code->UpdateStoreBufferLabel(), PP);
   Pop(LR);
   if (value != R0) {
     // Restore R0.
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index 6c36ecf..c5e13fc 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2141,7 +2141,8 @@
   if (object != EAX) {
     movl(EAX, object);
   }
-  call(&StubCode::UpdateStoreBufferLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  call(&stub_code->UpdateStoreBufferLabel());
   if (value != EAX) popl(EAX);  // Restore EAX.
   Bind(&done);
 }
@@ -2509,9 +2510,10 @@
 
 void Assembler::Stop(const char* message) {
   if (FLAG_print_stop_message) {
+    StubCode* stub_code = Isolate::Current()->stub_code();
     pushl(EAX);  // Preserve EAX.
     movl(EAX, Immediate(reinterpret_cast<int32_t>(message)));
-    call(&StubCode::PrintStopMessageLabel());  // Passing message in EAX.
+    call(&stub_code->PrintStopMessageLabel());  // Passing message in EAX.
     popl(EAX);  // Restore EAX.
   } else {
     // Emit the message address as immediate operand in the test instruction.
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index d3f92fb..c6bcd89 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -575,7 +575,8 @@
   if (object != T0) {
     mov(T0, object);
   }
-  BranchLink(&StubCode::UpdateStoreBufferLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  BranchLink(&stub_code->UpdateStoreBufferLabel());
   lw(RA, Address(SP, 0 * kWordSize));
   if (value != T0) {
     // Restore T0.
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index f15fab1..161f4f6 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -28,7 +28,8 @@
       comments_() {
   // Far branching mode is only needed and implemented for MIPS and ARM.
   ASSERT(!use_far_branches);
-  if (Isolate::Current() != Dart::vm_isolate()) {
+  Isolate* isolate = Isolate::Current();
+  if (isolate != Dart::vm_isolate()) {
     object_pool_ = GrowableObjectArray::New(Heap::kOld);
 
     // These objects and labels need to be accessible through every pool-pointer
@@ -48,8 +49,9 @@
 
     const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift));
 
-    if (StubCode::UpdateStoreBuffer_entry() != NULL) {
-      FindExternalLabel(&StubCode::UpdateStoreBufferLabel(), kNotPatchable);
+    StubCode* stub_code = isolate->stub_code();
+    if (stub_code->UpdateStoreBuffer_entry() != NULL) {
+      FindExternalLabel(&stub_code->UpdateStoreBufferLabel(), kNotPatchable);
     } else {
       object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
@@ -2707,7 +2709,8 @@
   if (object != RAX) {
     movq(RAX, object);
   }
-  Call(&StubCode::UpdateStoreBufferLabel(), PP);
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  Call(&stub_code->UpdateStoreBufferLabel(), PP);
   if (value != RAX) popq(RAX);
   Bind(&done);
 }
diff --git a/runtime/vm/block_scheduler.cc b/runtime/vm/block_scheduler.cc
index 2533757..1e2dd98 100644
--- a/runtime/vm/block_scheduler.cc
+++ b/runtime/vm/block_scheduler.cc
@@ -21,7 +21,8 @@
     // Assume everything was visited once.
     return 1;
   }
-  uword pc = unoptimized_code.GetPcForDeoptId(deopt_id, PcDescriptors::kDeopt);
+  const uword pc =
+      unoptimized_code.GetPcForDeoptId(deopt_id, RawPcDescriptors::kDeopt);
   Array& array = Array::Handle();
   array ^= CodePatcher::GetEdgeCounterAt(pc, unoptimized_code);
   ASSERT(!array.IsNull());
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 9cd3460..a69539a 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -289,6 +289,7 @@
   V(Isolate_mainPort, 0)                                                       \
   V(Isolate_spawnFunction, 1)                                                  \
   V(Isolate_spawnUri, 1)                                                       \
+  V(Isolate_sendOOB, 2)                                                       \
   V(Mirrors_evalInLibraryWithPrivateKey, 2)                                    \
   V(Mirrors_makeLocalClassMirror, 1)                                           \
   V(Mirrors_makeLocalTypeMirror, 1)                                            \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index d70e8c1..4b6ffcc 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -725,6 +725,7 @@
                                              const TypeArguments& arguments,
                                              Error* bound_error) {
   if (!cls.is_type_finalized()) {
+    FinalizeTypeParameters(cls);
     FinalizeUpperBounds(cls);
   }
   // Note that when finalizing a type, we need to verify the bounds in both
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index b889912..3e5eaa3 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -6,7 +6,7 @@
 
 namespace dart {
 
-void DescriptorList::AddDescriptor(PcDescriptors::Kind kind,
+void DescriptorList::AddDescriptor(RawPcDescriptors::Kind kind,
                                    intptr_t pc_offset,
                                    intptr_t deopt_id,
                                    intptr_t token_index,
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index 9f066d9..dda6b0b 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -17,7 +17,7 @@
  public:
   struct PcDesc {
     intptr_t pc_offset;        // PC offset value of the descriptor.
-    PcDescriptors::Kind kind;  // Descriptor kind (kDeopt, kOther).
+    RawPcDescriptors::Kind kind;  // Descriptor kind (kDeopt, kOther).
     intptr_t deopt_id;         // Deoptimization id.
     intptr_t data;             // Token position or deopt reason.
     intptr_t try_index;        // Try block index of PC or deopt array index.
@@ -41,7 +41,7 @@
   intptr_t PcOffset(intptr_t index) const {
     return list_[index].pc_offset;
   }
-  PcDescriptors::Kind Kind(intptr_t index) const {
+  RawPcDescriptors::Kind Kind(intptr_t index) const {
     return list_[index].kind;
   }
   intptr_t DeoptId(intptr_t index) const {
@@ -57,7 +57,7 @@
     return list_[index].try_index;
   }
 
-  void AddDescriptor(PcDescriptors::Kind kind,
+  void AddDescriptor(RawPcDescriptors::Kind kind,
                      intptr_t pc_offset,
                      intptr_t deopt_id,
                      intptr_t token_index,
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index 3dd4b98..564a018 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -257,9 +257,11 @@
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   int call_count = 0;
-  for (int i = 0; i < descriptors.Length(); ++i) {
-    if (descriptors.DescriptorKind(i) == PcDescriptors::kUnoptStaticCall) {
-      stackmap_table_builder->AddEntry(descriptors.PC(i) - code.EntryPoint(),
+  PcDescriptors::Iterator iter(descriptors);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    if (rec.kind() == RawPcDescriptors::kUnoptStaticCall) {
+      stackmap_table_builder->AddEntry(rec.pc - code.EntryPoint(),
                                        stack_bitmap,
                                        0);
       ++call_count;
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 6ee1098..0bde868 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -70,6 +70,11 @@
 DEFINE_FLAG(charp, deoptimize_filter, NULL,
             "Deoptimize in named function on stack overflow checks");
 
+#ifdef DEBUG
+DEFINE_FLAG(charp, gc_at_instance_allocation, NULL,
+            "Perform a GC before allocation of instances of "
+            "the specified class");
+#endif
 
 DEFINE_RUNTIME_ENTRY(TraceFunctionEntry, 1) {
   const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
@@ -141,7 +146,20 @@
 // Return value: newly allocated object.
 DEFINE_RUNTIME_ENTRY(AllocateObject, 2) {
   const Class& cls = Class::CheckedHandle(arguments.ArgAt(0));
+
+#ifdef DEBUG
+  if (FLAG_gc_at_instance_allocation != NULL) {
+    const String& name = String::Handle(cls.Name());
+    if (String::EqualsIgnoringPrivateKey(
+            name,
+            String::Handle(String::New(FLAG_gc_at_instance_allocation)))) {
+      Isolate::Current()->heap()->CollectAllGarbage();
+    }
+  }
+#endif
+
   const Instance& instance = Instance::Handle(Instance::New(cls));
+
   arguments.SetReturn(instance);
   if (cls.NumTypeArguments() == 0) {
     // No type arguments required for a non-parameterized type.
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index c4ba10b..e02fee9 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -40,7 +40,8 @@
                                                          1));
 
   __ LoadObject(R5, ic_data, PP);
-  ExternalLabel target_label(StubCode::OneArgCheckInlineCacheEntryPoint());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  ExternalLabel target_label(stub_code->OneArgCheckInlineCacheEntryPoint());
   __ BranchLinkPatchable(&target_label);
   __ ret();
 }
diff --git a/runtime/vm/code_patcher_arm_test.cc b/runtime/vm/code_patcher_arm_test.cc
index 9dfa92d..1603e7c 100644
--- a/runtime/vm/code_patcher_arm_test.cc
+++ b/runtime/vm/code_patcher_arm_test.cc
@@ -40,7 +40,8 @@
                                                          1));
 
   __ LoadObject(R5, ic_data);
-  ExternalLabel target_label(StubCode::OneArgCheckInlineCacheEntryPoint());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  ExternalLabel target_label(stub_code->OneArgCheckInlineCacheEntryPoint());
   __ BranchLinkPatchable(&target_label);
   __ Ret();
 }
diff --git a/runtime/vm/code_patcher_ia32_test.cc b/runtime/vm/code_patcher_ia32_test.cc
index a1b7789..c0321e8 100644
--- a/runtime/vm/code_patcher_ia32_test.cc
+++ b/runtime/vm/code_patcher_ia32_test.cc
@@ -40,7 +40,8 @@
                                                          1));
 
   __ LoadObject(ECX, ic_data);
-  ExternalLabel target_label(StubCode::OneArgCheckInlineCacheEntryPoint());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  ExternalLabel target_label(stub_code->OneArgCheckInlineCacheEntryPoint());
   __ call(&target_label);
   __ ret();
 }
diff --git a/runtime/vm/code_patcher_mips_test.cc b/runtime/vm/code_patcher_mips_test.cc
index 286d756..3c73a3c 100644
--- a/runtime/vm/code_patcher_mips_test.cc
+++ b/runtime/vm/code_patcher_mips_test.cc
@@ -40,7 +40,8 @@
                                                          1));
 
   __ LoadObject(S5, ic_data);
-  ExternalLabel target_label(StubCode::OneArgCheckInlineCacheEntryPoint());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  ExternalLabel target_label(stub_code->OneArgCheckInlineCacheEntryPoint());
   __ BranchLinkPatchable(&target_label);
   __ Ret();
 }
diff --git a/runtime/vm/code_patcher_x64_test.cc b/runtime/vm/code_patcher_x64_test.cc
index 9ba8d1f..f6ad37f 100644
--- a/runtime/vm/code_patcher_x64_test.cc
+++ b/runtime/vm/code_patcher_x64_test.cc
@@ -40,7 +40,8 @@
                                                          1));
 
   __ LoadObject(RBX, ic_data, PP);
-  ExternalLabel target_label(StubCode::OneArgCheckInlineCacheEntryPoint());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  ExternalLabel target_label(stub_code->OneArgCheckInlineCacheEntryPoint());
   __ CallPatchable(&target_label);
   __ ret();
 }
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 9c2822a..60a66ab 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -639,9 +639,9 @@
 
   OS::Print("Pointer offsets for function: {\n");
   // Pointer offsets are stored in descending order.
+  Object& obj = Object::Handle();
   for (intptr_t i = code.pointer_offsets_length() - 1; i >= 0; i--) {
     const uword addr = code.GetPointerOffsetAt(i) + code.EntryPoint();
-    Object& obj = Object::Handle();
     obj = *reinterpret_cast<RawObject**>(addr);
     OS::Print(" %d : %#" Px " '%s'\n",
               code.GetPointerOffsetAt(i), addr, obj.ToCString());
diff --git a/runtime/vm/coverage.cc b/runtime/vm/coverage.cc
index 4572eb8..ed72bb0 100644
--- a/runtime/vm/coverage.cc
+++ b/runtime/vm/coverage.cc
@@ -90,16 +90,18 @@
   const intptr_t end_pos = function.end_token_pos();
   intptr_t last_line = -1;
   intptr_t last_count = 0;
-  for (int j = 0; j < descriptors.Length(); j++) {
+  PcDescriptors::Iterator iter(descriptors);
+  while (iter.HasNext()) {
     HANDLESCOPE(isolate);
-    PcDescriptors::Kind kind = descriptors.DescriptorKind(j);
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    RawPcDescriptors::Kind kind = rec.kind();
     // Only IC based calls have counting.
-    if ((kind == PcDescriptors::kIcCall) ||
-        (kind == PcDescriptors::kUnoptStaticCall)) {
-      intptr_t deopt_id = descriptors.DeoptId(j);
+    if ((kind == RawPcDescriptors::kIcCall) ||
+        (kind == RawPcDescriptors::kUnoptStaticCall)) {
+      intptr_t deopt_id = rec.deopt_id;
       const ICData* ic_data= (*ic_data_array)[deopt_id];
       if (!ic_data->IsNull()) {
-        intptr_t token_pos = descriptors.TokenPos(j);
+        intptr_t token_pos = rec.token_pos;
         // Filter out descriptors that do not map to tokens in the source code.
         if (token_pos < begin_pos ||
             token_pos > end_pos) {
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index dc7443b..7a5ce32 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -55,7 +55,7 @@
   }
   // Now Call the invoke stub which will invoke the dart function.
   invokestub entrypoint = reinterpret_cast<invokestub>(
-      StubCode::InvokeDartCodeEntryPoint());
+      isolate->stub_code()->InvokeDartCodeEntryPoint());
   const Code& code = Code::Handle(isolate, function.CurrentCode());
   ASSERT(!code.IsNull());
   ASSERT(Isolate::Current()->no_callback_scope_depth() == 0);
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 057e8f3..c1ef49a 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -180,7 +180,7 @@
       code_(Code::ZoneHandle(code.raw())),
       function_(Function::ZoneHandle(code.function())),
       token_pos_(-1),
-      pc_desc_index_(-1),
+      desc_rec_(NULL),
       line_number_(-1),
       column_number_(-1),
       context_level_(-1),
@@ -359,10 +359,12 @@
   if (token_pos_ < 0) {
     token_pos_ = Scanner::kNoSourcePos;
     GetPcDescriptors();
-    for (intptr_t i = 0; i < pc_desc_.Length(); i++) {
-      if (pc_desc_.PC(i) == pc_) {
-        pc_desc_index_ = i;
-        token_pos_ = pc_desc_.TokenPos(i);
+    PcDescriptors::Iterator iter(pc_desc_);
+    while (iter.HasNext()) {
+      const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+      if (rec.pc == pc_) {
+        desc_rec_ = &rec;
+        token_pos_ = rec.token_pos;
         break;
       }
     }
@@ -371,20 +373,11 @@
 }
 
 
-intptr_t ActivationFrame::PcDescIndex() {
-  if (pc_desc_index_ < 0) {
-    TokenPos();  // Sets pc_desc_index_ as a side effect.
-  }
-  return pc_desc_index_;
-}
-
-
 intptr_t ActivationFrame::TryIndex() {
-  intptr_t desc_index = PcDescIndex();
-  if (desc_index < 0) {
+  if (desc_rec_ == NULL) {
     return -1;
   } else {
-    return pc_desc_.TryIndex(desc_index);
+    return desc_rec_->try_index;
   }
 }
 
@@ -431,11 +424,10 @@
   if (context_level_ < 0 && !ctx_.IsNull()) {
     ASSERT(!code_.is_optimized());
     context_level_ = 0;
-    intptr_t pc_desc_idx = PcDescIndex();
     // TODO(hausner): What to do if there is no descriptor entry
     // for the code position of the frame? For now say we are at context
     // level 0.
-    if (pc_desc_idx < 0) {
+    if (desc_rec_ == NULL) {
       return context_level_;
     }
     ASSERT(!pc_desc_.IsNull());
@@ -929,38 +921,34 @@
 }
 
 
-static bool IsSafeDescKind(PcDescriptors::Kind kind) {
-  return ((kind == PcDescriptors::kIcCall) ||
-          (kind == PcDescriptors::kOptStaticCall) ||
-          (kind == PcDescriptors::kUnoptStaticCall) ||
-          (kind == PcDescriptors::kClosureCall) ||
-          (kind == PcDescriptors::kRuntimeCall));
+static bool IsSafeDescKind(int8_t kind) {
+  return ((kind == RawPcDescriptors::kIcCall) ||
+          (kind == RawPcDescriptors::kOptStaticCall) ||
+          (kind == RawPcDescriptors::kUnoptStaticCall) ||
+          (kind == RawPcDescriptors::kClosureCall) ||
+          (kind == RawPcDescriptors::kRuntimeCall));
 }
 
 
-static bool IsSafePoint(const PcDescriptors& desc, intptr_t i) {
-  return IsSafeDescKind(desc.DescriptorKind(i)) &&
-         (desc.TokenPos(i) != Scanner::kNoSourcePos);
+static bool IsSafePoint(const RawPcDescriptors::PcDescriptorRec& rec) {
+  return IsSafeDescKind(rec.kind()) && (rec.token_pos != Scanner::kNoSourcePos);
 }
 
 
-CodeBreakpoint::CodeBreakpoint(const Code& code, intptr_t pc_desc_index)
+CodeBreakpoint::CodeBreakpoint(const Code& code,
+                               const RawPcDescriptors::PcDescriptorRec& rec)
     : code_(code.raw()),
-      pc_desc_index_(pc_desc_index),
-      pc_(0),
+      token_pos_(rec.token_pos),
+      pc_(rec.pc),
       line_number_(-1),
       is_enabled_(false),
       src_bpt_(NULL),
-      next_(NULL) {
-  saved_value_ = 0;
+      next_(NULL),
+      breakpoint_kind_(rec.kind()),
+      saved_value_(0) {
   ASSERT(!code.IsNull());
-  PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
-  ASSERT(pc_desc_index < desc.Length());
-  token_pos_ = desc.TokenPos(pc_desc_index);
   ASSERT(token_pos_ > 0);
-  pc_ = desc.PC(pc_desc_index);
   ASSERT(pc_ != 0);
-  breakpoint_kind_ = desc.DescriptorKind(pc_desc_index);
   ASSERT(IsSafeDescKind(breakpoint_kind_));
 }
 
@@ -974,7 +962,7 @@
   pc_ = 0ul;
   src_bpt_ = NULL;
   next_ = NULL;
-  breakpoint_kind_ = PcDescriptors::kOther;
+  breakpoint_kind_ = RawPcDescriptors::kOther;
 #endif
 }
 
@@ -1214,16 +1202,18 @@
   DeoptimizeWorld();
   ASSERT(!target_function.HasOptimizedCode());
   PcDescriptors& desc = PcDescriptors::Handle(isolate, code.pc_descriptors());
-  for (intptr_t i = 0; i < desc.Length(); i++) {
-    if (IsSafePoint(desc, i)) {
-      CodeBreakpoint* bpt = GetCodeBreakpoint(desc.PC(i));
+  PcDescriptors::Iterator iter(desc);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    if (IsSafePoint(rec)) {
+      CodeBreakpoint* bpt = GetCodeBreakpoint(rec.pc);
       if (bpt != NULL) {
         // There is already a breakpoint for this address. Make sure
         // it is enabled.
         bpt->Enable();
         continue;
       }
-      bpt = new CodeBreakpoint(code, i);
+      bpt = new CodeBreakpoint(code, rec);
       RegisterCodeBreakpoint(bpt);
       bpt->Enable();
     }
@@ -1263,10 +1253,10 @@
   bool is_closure_call = false;
   const PcDescriptors& pc_desc =
       PcDescriptors::Handle(isolate, code.pc_descriptors());
-
-  for (int i = 0; i < pc_desc.Length(); i++) {
-    if (pc_desc.PC(i) == pc &&
-        pc_desc.DescriptorKind(i) == PcDescriptors::kClosureCall) {
+  PcDescriptors::Iterator iter(pc_desc);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    if ((rec.pc == pc) && (rec.kind() == RawPcDescriptors::kClosureCall)) {
       is_closure_call = true;
       break;
     }
@@ -1556,15 +1546,18 @@
   Code& code = Code::Handle(func.unoptimized_code());
   ASSERT(!code.IsNull());
   PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
-  intptr_t best_fit_index = -1;
   intptr_t best_fit_pos = INT_MAX;
+  const RawPcDescriptors::PcDescriptorRec* best_fit_rec = NULL;
   uword lowest_pc = kUwordMax;
-  intptr_t lowest_pc_index = -1;
+  const RawPcDescriptors::PcDescriptorRec* lowest_pc_rec = NULL;
 
-  for (intptr_t i = 0; i < desc.Length(); i++) {
-    intptr_t desc_token_pos = desc.TokenPos(i);
+  const RawPcDescriptors::PcDescriptorRec* rec = NULL;
+  PcDescriptors::Iterator iter(desc);
+  while (iter.HasNext()) {
+    rec = &iter.Next();
+    intptr_t desc_token_pos = rec->token_pos;
     ASSERT(desc_token_pos >= 0);
-    if (IsSafePoint(desc, i)) {
+    if (IsSafePoint(*rec)) {
       if ((desc_token_pos < requested_token_pos) ||
           (desc_token_pos > last_token_pos)) {
         // This descriptor is outside the desired token range.
@@ -1574,24 +1567,24 @@
         // So far, this descriptor has the lowest token position after
         // the first acceptable token position.
         best_fit_pos = desc_token_pos;
-        best_fit_index = i;
+        best_fit_rec = rec;
       }
-      if (desc.PC(i) < lowest_pc) {
+      if (rec->pc < lowest_pc) {
         // This descriptor so far has the lowest code address.
-        lowest_pc = desc.PC(i);
-        lowest_pc_index = i;
+        lowest_pc = rec->pc;
+        lowest_pc_rec = rec;
       }
     }
   }
-  if (lowest_pc_index >= 0) {
+  if (lowest_pc_rec != NULL) {
     // We found the pc descriptor that has the lowest execution address.
     // This is the first possible breakpoint after the requested token
     // position. We use this instead of the nearest PC descriptor
     // measured in token index distance.
-    best_fit_index = lowest_pc_index;
+    best_fit_rec = lowest_pc_rec;
   }
-  if (best_fit_index >= 0) {
-    return desc.TokenPos(best_fit_index);
+  if (best_fit_rec != NULL) {
+    return best_fit_rec->token_pos;
   }
   // We didn't find a safe point in the given token range. Try and find
   // a safe point in the remaining source code of the function.
@@ -1610,26 +1603,27 @@
   ASSERT(!code.IsNull());
   PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
   uword lowest_pc = kUwordMax;
-  intptr_t lowest_pc_index = -1;
   // Find the safe point with the lowest compiled code address
   // that maps to the token position of the source breakpoint.
-  for (intptr_t i = 0; i < desc.Length(); i++) {
-    intptr_t desc_token_pos = desc.TokenPos(i);
-    if ((desc_token_pos == bpt->token_pos_) && IsSafePoint(desc, i)) {
-      if (desc.PC(i) < lowest_pc) {
-        // This descriptor so far has the lowest code address.
-        lowest_pc = desc.PC(i);
-        lowest_pc_index = i;
+  PcDescriptors::Iterator iter(desc);
+  const RawPcDescriptors::PcDescriptorRec* lowest_rec = NULL;
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    intptr_t desc_token_pos = rec.token_pos;
+    if ((desc_token_pos == bpt->token_pos_) && IsSafePoint(rec)) {
+      if (rec.pc < lowest_pc) {
+        lowest_pc = rec.pc;
+        lowest_rec = &rec;
       }
     }
   }
-  if (lowest_pc_index < 0) {
+  if (lowest_rec == NULL) {
     return;
   }
-  CodeBreakpoint* code_bpt = GetCodeBreakpoint(desc.PC(lowest_pc_index));
+  CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_rec->pc);
   if (code_bpt == NULL) {
     // No code breakpoint for this code exists; create one.
-    code_bpt = new CodeBreakpoint(code, lowest_pc_index);
+    code_bpt = new CodeBreakpoint(code, *lowest_rec);
     RegisterCodeBreakpoint(code_bpt);
   }
   code_bpt->set_src_bpt(bpt);
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index d75f597..a8833d6 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -79,7 +79,8 @@
 // function gets compiled as a regular function and as a closure.
 class CodeBreakpoint {
  public:
-  CodeBreakpoint(const Code& code, intptr_t pc_desc_index);
+  CodeBreakpoint(const Code& code,
+                 const RawPcDescriptors::PcDescriptorRec& rec);
   ~CodeBreakpoint();
 
   RawFunction* function() const;
@@ -105,13 +106,11 @@
 
   void set_next(CodeBreakpoint* value) { next_ = value; }
   CodeBreakpoint* next() const { return this->next_; }
-  intptr_t pc_desc_index() const { return pc_desc_index_; }
 
   void PatchCode();
   void RestoreCode();
 
   RawCode* code_;
-  intptr_t pc_desc_index_;
   intptr_t token_pos_;
   uword pc_;
   intptr_t line_number_;
@@ -120,7 +119,7 @@
   SourceBreakpoint* src_bpt_;
   CodeBreakpoint* next_;
 
-  PcDescriptors::Kind breakpoint_kind_;
+  RawPcDescriptors::Kind breakpoint_kind_;
   uword saved_value_;
 
   friend class Debugger;
@@ -191,7 +190,6 @@
                                  intptr_t frame_ctx_level,
                                  intptr_t var_ctx_level);
 
-  intptr_t PcDescIndex();
   intptr_t TryIndex();
   void GetPcDescriptors();
   void GetVarDescriptors();
@@ -214,7 +212,8 @@
   const Code& code_;
   const Function& function_;
   intptr_t token_pos_;
-  intptr_t pc_desc_index_;
+  const RawPcDescriptors::PcDescriptorRec* desc_rec_;
+
   intptr_t line_number_;
   intptr_t column_number_;
   intptr_t context_level_;
diff --git a/runtime/vm/debugger_arm.cc b/runtime/vm/debugger_arm.cc
index a345836..65458fa 100644
--- a/runtime/vm/debugger_arm.cc
+++ b/runtime/vm/debugger_arm.cc
@@ -45,10 +45,10 @@
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
-      case PcDescriptors::kIcCall:
-      case PcDescriptors::kUnoptStaticCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall: {
+      case RawPcDescriptors::kIcCall:
+      case RawPcDescriptors::kUnoptStaticCall:
+      case RawPcDescriptors::kRuntimeCall:
+      case RawPcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(pc_, code,
                                        StubCode::BreakpointRuntimeEntryPoint());
@@ -69,10 +69,10 @@
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
-      case PcDescriptors::kIcCall:
-      case PcDescriptors::kUnoptStaticCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall: {
+      case RawPcDescriptors::kIcCall:
+      case RawPcDescriptors::kUnoptStaticCall:
+      case RawPcDescriptors::kClosureCall:
+      case RawPcDescriptors::kRuntimeCall: {
         CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
         break;
       }
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
index 1288643..3fb7b88 100644
--- a/runtime/vm/debugger_arm64.cc
+++ b/runtime/vm/debugger_arm64.cc
@@ -52,10 +52,10 @@
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
-      case PcDescriptors::kIcCall:
-      case PcDescriptors::kUnoptStaticCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall: {
+      case RawPcDescriptors::kIcCall:
+      case RawPcDescriptors::kUnoptStaticCall:
+      case RawPcDescriptors::kRuntimeCall:
+      case RawPcDescriptors::kClosureCall: {
         int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
         ASSERT((offset > 0) && ((offset & 0x7) == 0));
         saved_value_ = static_cast<uword>(offset);
@@ -80,10 +80,10 @@
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
-      case PcDescriptors::kIcCall:
-      case PcDescriptors::kUnoptStaticCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall: {
+      case RawPcDescriptors::kIcCall:
+      case RawPcDescriptors::kUnoptStaticCall:
+      case RawPcDescriptors::kClosureCall:
+      case RawPcDescriptors::kRuntimeCall: {
         CodePatcher::SetPoolOffsetAt(pc_, static_cast<int32_t>(saved_value_));
         break;
       }
diff --git a/runtime/vm/debugger_ia32.cc b/runtime/vm/debugger_ia32.cc
index 594113e..470c333 100644
--- a/runtime/vm/debugger_ia32.cc
+++ b/runtime/vm/debugger_ia32.cc
@@ -49,10 +49,10 @@
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
-      case PcDescriptors::kIcCall:
-      case PcDescriptors::kUnoptStaticCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall: {
+      case RawPcDescriptors::kIcCall:
+      case RawPcDescriptors::kUnoptStaticCall:
+      case RawPcDescriptors::kRuntimeCall:
+      case RawPcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(pc_, code,
                                        StubCode::BreakpointRuntimeEntryPoint());
@@ -73,10 +73,10 @@
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
-      case PcDescriptors::kIcCall:
-      case PcDescriptors::kUnoptStaticCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall: {
+      case RawPcDescriptors::kIcCall:
+      case RawPcDescriptors::kUnoptStaticCall:
+      case RawPcDescriptors::kClosureCall:
+      case RawPcDescriptors::kRuntimeCall: {
         CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
         break;
       }
diff --git a/runtime/vm/debugger_mips.cc b/runtime/vm/debugger_mips.cc
index 570d4d0..b54a5e9 100644
--- a/runtime/vm/debugger_mips.cc
+++ b/runtime/vm/debugger_mips.cc
@@ -45,10 +45,10 @@
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
-      case PcDescriptors::kIcCall:
-      case PcDescriptors::kUnoptStaticCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall: {
+      case RawPcDescriptors::kIcCall:
+      case RawPcDescriptors::kUnoptStaticCall:
+      case RawPcDescriptors::kRuntimeCall:
+      case RawPcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(pc_, code,
                                        StubCode::BreakpointRuntimeEntryPoint());
@@ -69,10 +69,10 @@
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
-      case PcDescriptors::kIcCall:
-      case PcDescriptors::kUnoptStaticCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall: {
+      case RawPcDescriptors::kIcCall:
+      case RawPcDescriptors::kUnoptStaticCall:
+      case RawPcDescriptors::kClosureCall:
+      case RawPcDescriptors::kRuntimeCall: {
         CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
         break;
       }
diff --git a/runtime/vm/debugger_x64.cc b/runtime/vm/debugger_x64.cc
index 171a0b3..97fd052 100644
--- a/runtime/vm/debugger_x64.cc
+++ b/runtime/vm/debugger_x64.cc
@@ -54,10 +54,10 @@
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
-      case PcDescriptors::kIcCall:
-      case PcDescriptors::kUnoptStaticCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall: {
+      case RawPcDescriptors::kIcCall:
+      case RawPcDescriptors::kUnoptStaticCall:
+      case RawPcDescriptors::kRuntimeCall:
+      case RawPcDescriptors::kClosureCall: {
         int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
         ASSERT((offset > 0) && ((offset % 8) == 7));
         saved_value_ = static_cast<uword>(offset);
@@ -82,10 +82,10 @@
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
-      case PcDescriptors::kIcCall:
-      case PcDescriptors::kUnoptStaticCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall: {
+      case RawPcDescriptors::kIcCall:
+      case RawPcDescriptors::kUnoptStaticCall:
+      case RawPcDescriptors::kClosureCall:
+      case RawPcDescriptors::kRuntimeCall: {
         CodePatcher::SetPoolOffsetAt(pc_, static_cast<int32_t>(saved_value_));
         break;
       }
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 2f365fb..ccd7316 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -568,11 +568,11 @@
     code ^= deopt_context->ObjectAt(object_table_index_);
     ASSERT(!code.IsNull());
     uword continue_at_pc = code.GetPcForDeoptId(deopt_id_,
-                                                PcDescriptors::kDeopt);
+                                                RawPcDescriptors::kDeopt);
     ASSERT(continue_at_pc != 0);
     *dest_addr = continue_at_pc;
 
-    uword pc = code.GetPcForDeoptId(deopt_id_, PcDescriptors::kIcCall);
+    uword pc = code.GetPcForDeoptId(deopt_id_, RawPcDescriptors::kIcCall);
     if (pc != 0) {
       // If the deoptimization happened at an IC call, update the IC data
       // to avoid repeated deoptimization at the same site next time around.
@@ -1256,7 +1256,7 @@
   *code ^= object_table.At(ret_address_instr->object_table_index());
   ASSERT(!code->IsNull());
   uword res = code->GetPcForDeoptId(ret_address_instr->deopt_id(),
-                                    PcDescriptors::kDeopt);
+                                    RawPcDescriptors::kDeopt);
   ASSERT(res != 0);
   return res;
 }
@@ -1394,7 +1394,7 @@
   // TODO(vegorov): verify after deoptimization targets as well.
 #ifdef DEBUG
   ASSERT(Isolate::IsDeoptAfter(deopt_id) ||
-         (code.GetPcForDeoptId(deopt_id, PcDescriptors::kDeopt) != 0));
+         (code.GetPcForDeoptId(deopt_id, RawPcDescriptors::kDeopt) != 0));
 #endif
   const intptr_t object_table_index = FindOrAddObjectInTable(code);
   ASSERT(dest_index == FrameSize());
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index de0cbed..406e2d3 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -610,7 +610,7 @@
     range->set_assigned_location(Location::Constant(constant->value()));
     range->set_spill_slot(Location::Constant(constant->value()));
   }
-  AssignSafepoints(range);
+  AssignSafepoints(defn, range);
   range->finger()->Initialize(range);
   UsePosition* use =
       range->finger()->FirstRegisterBeneficialUse(block->start_pos());
@@ -783,7 +783,7 @@
 
     // All phi resolution moves are connected. Phi's live range is
     // complete.
-    AssignSafepoints(range);
+    AssignSafepoints(phi, range);
 
     CompleteRange(range, RegisterKindForResult(phi));
 
@@ -994,7 +994,6 @@
 
 
 void FlowGraphAllocator::ProcessOneOutput(BlockEntryInstr* block,
-                                          Instruction* current,
                                           intptr_t pos,
                                           Location* out,
                                           Definition* def,
@@ -1103,8 +1102,8 @@
     range->AddUse(pos, out);
   }
 
-  AssignSafepoints(range);
-  CompleteRange(range, RegisterKindForResult(current));
+  AssignSafepoints(def, range);
+  CompleteRange(range, RegisterKindForResult(def));
 }
 
 
@@ -1301,14 +1300,14 @@
       ASSERT(input->HasPairRepresentation());
       // Each element of the pair is assigned it's own virtual register number
       // and is allocated its own LiveRange.
-      ProcessOneOutput(block, current, pos,  // BlockEntry, Instruction, seq.
+      ProcessOneOutput(block, pos,  // BlockEntry, seq.
                        pair->SlotAt(0), def,  // (output) Location, Definition.
                        def->ssa_temp_index(),  // (output) virtual register.
                        true,  // output mapped to first input.
                        in_pair->SlotAt(0), input,  // (input) Location, Def.
                        input->ssa_temp_index(),  // (input) virtual register.
                        interference_set);
-      ProcessOneOutput(block, current, pos,
+      ProcessOneOutput(block, pos,
                        pair->SlotAt(1), def,
                        ToSecondPairVreg(def->ssa_temp_index()),
                        true,
@@ -1318,13 +1317,13 @@
     } else {
       // Each element of the pair is assigned it's own virtual register number
       // and is allocated its own LiveRange.
-      ProcessOneOutput(block, current, pos,
+      ProcessOneOutput(block, pos,
                        pair->SlotAt(0), def,
                        def->ssa_temp_index(),
                        false,            // output is not mapped to first input.
                        NULL, NULL, -1,   // First input not needed.
                        interference_set);
-      ProcessOneOutput(block, current, pos,
+      ProcessOneOutput(block, pos,
                        pair->SlotAt(1), def,
                        ToSecondPairVreg(def->ssa_temp_index()),
                        false,
@@ -1336,7 +1335,7 @@
       Location* in_ref = locs->in_slot(0);
       Definition* input = current->InputAt(0)->definition();
       ASSERT(!in_ref->IsPairLocation());
-      ProcessOneOutput(block, current, pos,  // BlockEntry, Instruction, seq.
+      ProcessOneOutput(block, pos,  // BlockEntry, Instruction, seq.
                        out, def,  // (output) Location, Definition.
                        def->ssa_temp_index(),  // (output) virtual register.
                        true,  // output mapped to first input.
@@ -1344,7 +1343,7 @@
                        input->ssa_temp_index(),  // (input) virtual register.
                        interference_set);
     } else {
-      ProcessOneOutput(block, current, pos,
+      ProcessOneOutput(block, pos,
                        out, def,
                        def->ssa_temp_index(),
                        false,            // output is not mapped to first input.
@@ -2463,14 +2462,23 @@
 }
 
 
-void FlowGraphAllocator::AssignSafepoints(LiveRange* range) {
+void FlowGraphAllocator::AssignSafepoints(Definition* defn,
+                                          LiveRange* range) {
   for (intptr_t i = safepoints_.length() - 1; i >= 0; i--) {
-    Instruction* instr = safepoints_[i];
+    Instruction* safepoint_instr = safepoints_[i];
+    if (safepoint_instr == defn) {
+      // The value is not live until after the definition is fully executed,
+      // don't assign the safepoint inside the definition itself to
+      // definition's liverange.
+      continue;
+    }
 
-    const intptr_t pos = instr->lifetime_position();
+    const intptr_t pos = safepoint_instr->lifetime_position();
     if (range->End() <= pos) break;
 
-    if (range->Contains(pos)) range->AddSafepoint(pos, instr->locs());
+    if (range->Contains(pos)) {
+      range->AddSafepoint(pos, safepoint_instr->locs());
+    }
   }
 }
 
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h
index e795552b..51fe05f 100644
--- a/runtime/vm/flow_graph_allocator.h
+++ b/runtime/vm/flow_graph_allocator.h
@@ -116,7 +116,6 @@
                        intptr_t vreg,
                        RegisterSet* live_registers);
   void ProcessOneOutput(BlockEntryInstr* block,
-                        Instruction* current,
                         intptr_t pos,
                         Location* out,
                         Definition* def,
@@ -143,7 +142,7 @@
   intptr_t NumberOfRegisters() const { return number_of_registers_; }
 
   // Find all safepoints that are covered by this live range.
-  void AssignSafepoints(LiveRange* range);
+  void AssignSafepoints(Definition* defn, LiveRange* range);
 
   void PrepareForAllocation(Location::Kind register_kind,
                             intptr_t number_of_registers,
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index a96024a..467567b 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -1016,7 +1016,7 @@
   if ((node->token_pos() != Scanner::kNoSourcePos) &&
       !function.is_native() && FLAG_enable_debugger) {
     AddInstruction(new(I) DebugStepCheckInstr(node->token_pos(),
-                                              PcDescriptors::kRuntimeCall));
+                                              RawPcDescriptors::kRuntimeCall));
   }
 
   if (FLAG_enable_type_checks) {
@@ -3119,8 +3119,8 @@
   if (node->value()->IsLiteralNode() ||
       node->value()->IsLoadLocalNode()) {
     if (FLAG_enable_debugger) {
-      AddInstruction(new(I) DebugStepCheckInstr(node->token_pos(),
-                                                PcDescriptors::kRuntimeCall));
+      AddInstruction(new(I) DebugStepCheckInstr(
+          node->token_pos(), RawPcDescriptors::kRuntimeCall));
     }
   }
 
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 66d3c95..4eab3f0 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -274,14 +274,14 @@
   if (!is_optimizing()) {
     if (FLAG_enable_type_checks && instr->IsAssertAssignable()) {
       AssertAssignableInstr* assert = instr->AsAssertAssignable();
-      AddCurrentDescriptor(PcDescriptors::kDeopt,
+      AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                            assert->deopt_id(),
                            assert->token_pos());
     } else if (instr->CanBecomeDeoptimizationTarget() && !instr->IsGoto()) {
       // Instructions that can be deoptimization targets need to record kDeopt
       // PcDescriptor corresponding to their deopt id. GotoInstr records its
       // own so that it can control the placement.
-      AddCurrentDescriptor(PcDescriptors::kDeopt,
+      AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                            instr->deopt_id(),
                            Scanner::kNoSourcePos);
     }
@@ -487,7 +487,7 @@
 
 
 // Uses current pc position and try-index.
-void FlowGraphCompiler::AddCurrentDescriptor(PcDescriptors::Kind kind,
+void FlowGraphCompiler::AddCurrentDescriptor(RawPcDescriptors::Kind kind,
                                              intptr_t deopt_id,
                                              intptr_t token_pos) {
   pc_descriptors_list()->AddDescriptor(kind,
@@ -832,10 +832,11 @@
   ASSERT(!ic_data.IsNull());
   ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0));
   uword label_address = 0;
+  StubCode* stub_code = isolate()->stub_code();
   if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) {
     if (ic_data.IsClosureCall()) {
       // This IC call may be closure call only.
-      label_address = StubCode::ClosureCallInlineCacheEntryPoint();
+      label_address = stub_code->ClosureCallInlineCacheEntryPoint();
       ExternalLabel target_label(label_address);
       EmitInstanceCall(&target_label,
                        ICData::ZoneHandle(ic_data.AsUnaryClassChecks()),
@@ -849,14 +850,14 @@
            || flow_graph().IsCompiledForOsr());
     switch (ic_data.NumArgsTested()) {
       case 1:
-        label_address = StubCode::OneArgOptimizedCheckInlineCacheEntryPoint();
+        label_address = stub_code->OneArgOptimizedCheckInlineCacheEntryPoint();
         break;
       case 2:
-        label_address = StubCode::TwoArgsOptimizedCheckInlineCacheEntryPoint();
+        label_address = stub_code->TwoArgsOptimizedCheckInlineCacheEntryPoint();
         break;
       case 3:
         label_address =
-            StubCode::ThreeArgsOptimizedCheckInlineCacheEntryPoint();
+            stub_code->ThreeArgsOptimizedCheckInlineCacheEntryPoint();
         break;
       default:
         UNIMPLEMENTED();
@@ -880,13 +881,13 @@
 
   switch (ic_data.NumArgsTested()) {
     case 1:
-      label_address = StubCode::OneArgCheckInlineCacheEntryPoint();
+      label_address = stub_code->OneArgCheckInlineCacheEntryPoint();
       break;
     case 2:
-      label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint();
+      label_address = stub_code->TwoArgsCheckInlineCacheEntryPoint();
       break;
     case 3:
-      label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint();
+      label_address = stub_code->ThreeArgsCheckInlineCacheEntryPoint();
       break;
     default:
       UNIMPLEMENTED();
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index a5f2e4f..215eee7 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -301,13 +301,13 @@
 
   void GenerateCall(intptr_t token_pos,
                     const ExternalLabel* label,
-                    PcDescriptors::Kind kind,
+                    RawPcDescriptors::Kind kind,
                     LocationSummary* locs);
 
   void GenerateDartCall(intptr_t deopt_id,
                         intptr_t token_pos,
                         const ExternalLabel* label,
-                        PcDescriptors::Kind kind,
+                        RawPcDescriptors::Kind kind,
                         LocationSummary* locs);
 
   void GenerateAssertAssignable(intptr_t token_pos,
@@ -415,7 +415,7 @@
                            const Array& handler_types,
                            bool needs_stacktrace);
   void SetNeedsStacktrace(intptr_t try_index);
-  void AddCurrentDescriptor(PcDescriptors::Kind kind,
+  void AddCurrentDescriptor(RawPcDescriptors::Kind kind,
                             intptr_t deopt_id,
                             intptr_t token_pos);
 
@@ -472,11 +472,11 @@
     return *deopt_id_to_ic_data_;
   }
 
+  Isolate* isolate() const { return isolate_; }
+
  private:
   friend class CheckStackOverflowSlowPath;  // For pending_deoptimization_env_.
 
-  Isolate* isolate() const { return isolate_; }
-
   void EmitFrameEntry();
 
   void AddStaticCallTarget(const Function& function);
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 7a4b4d9..ddd63cb 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -171,7 +171,8 @@
 
   ASSERT(deopt_env() != NULL);
 
-  __ BranchLink(&StubCode::DeoptimizeLabel());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  __ BranchLink(&stub_code->DeoptimizeLabel());
   set_pc_offset(assem->CodeSize());
 #undef __
 }
@@ -208,18 +209,19 @@
   ASSERT(temp_reg == kNoRegister);  // Unused on ARM.
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(SubtypeTestCache::New());
+  StubCode* stub_code = isolate()->stub_code();
   __ LoadObject(R2, type_test_cache);
   if (test_kind == kTestTypeOneArg) {
     ASSERT(type_arguments_reg == kNoRegister);
     __ LoadImmediate(R1, reinterpret_cast<intptr_t>(Object::null()));
-    __ BranchLink(&StubCode::Subtype1TestCacheLabel());
+    __ BranchLink(&stub_code->Subtype1TestCacheLabel());
   } else if (test_kind == kTestTypeTwoArgs) {
     ASSERT(type_arguments_reg == kNoRegister);
     __ LoadImmediate(R1, reinterpret_cast<intptr_t>(Object::null()));
-    __ BranchLink(&StubCode::Subtype2TestCacheLabel());
+    __ BranchLink(&stub_code->Subtype2TestCacheLabel());
   } else if (test_kind == kTestTypeThreeArgs) {
     ASSERT(type_arguments_reg == R1);
-    __ BranchLink(&StubCode::Subtype3TestCacheLabel());
+    __ BranchLink(&stub_code->Subtype3TestCacheLabel());
   } else {
     UNREACHABLE();
   }
@@ -593,7 +595,7 @@
     // Generate runtime call.
     // Load instantiator (R2) and its type arguments (R1).
     __ ldm(IA, SP,  (1 << R1) | (1 << R2));
-    __ PushObject(Object::ZoneHandle());  // Make room for the result.
+    __ PushObject(Object::null_object());  // Make room for the result.
     __ Push(R0);  // Push the instance.
     __ PushObject(type);  // Push the type.
     // Push instantiator (R2) and its type arguments (R1).
@@ -659,7 +661,7 @@
 
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
-    __ PushObject(Object::ZoneHandle());  // Make room for the result.
+    __ PushObject(Object::null_object());  // Make room for the result.
     __ Push(R0);  // Push the source object.
     __ PushObject(dst_name);  // Push the name of the destination.
     __ PushObject(dst_type);  // Push the type of the destination.
@@ -685,7 +687,7 @@
   __ Bind(&runtime_call);
   // Load instantiator (R2) and its type arguments (R1).
   __ ldm(IA, SP,  (1 << R1) | (1 << R2));
-  __ PushObject(Object::ZoneHandle());  // Make room for the result.
+  __ PushObject(Object::null_object());  // Make room for the result.
   __ Push(R0);  // Push the source object.
   __ PushObject(dst_type);  // Push the type of the destination.
   // Push instantiator (R2) and its type arguments (R1).
@@ -894,13 +896,14 @@
   __ Bind(&wrong_num_arguments);
   if (function.IsClosureFunction()) {
     // Invoke noSuchMethod function passing "call" as the original name.
+    StubCode* stub_code = isolate()->stub_code();
     const int kNumArgsChecked = 1;
     const ICData& ic_data = ICData::ZoneHandle(
         ICData::New(function, Symbols::Call(), Object::empty_array(),
                     Isolate::kNoDeoptId, kNumArgsChecked));
     __ LoadObject(R5, ic_data);
     __ LeaveDartFrame();  // The arguments are still on the stack.
-    __ Branch(&StubCode::CallNoSuchMethodFunctionLabel());
+    __ Branch(&stub_code->CallNoSuchMethodFunctionLabel());
     // The noSuchMethod call may return to the caller, but not here.
     __ bkpt(0);
   } else if (check_correct_named_args) {
@@ -961,6 +964,7 @@
       function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
     const Register function_reg = R6;
+    StubCode* stub_code = isolate()->stub_code();
 
     // The pool pointer is not setup before entering the Dart frame.
     // Preserve PP of caller.
@@ -989,7 +993,7 @@
     }
     __ CompareImmediate(R7, threshold);
     ASSERT(function_reg == R6);
-    __ Branch(&StubCode::OptimizeFunctionLabel(), GE);
+    __ Branch(&stub_code->OptimizeFunctionLabel(), GE);
   } else if (!flow_graph().IsCompiledForOsr()) {
     entry_patch_pc_offset_ = assembler()->CodeSize();
   }
@@ -1026,6 +1030,7 @@
   const int num_fixed_params = function.num_fixed_parameters();
   const int num_copied_params = parsed_function().num_copied_params();
   const int num_locals = parsed_function().num_stack_locals();
+  StubCode* stub_code = isolate()->stub_code();
 
   // We check the number of passed arguments when we have to copy them due to
   // the presence of optional parameters.
@@ -1064,7 +1069,7 @@
                         Isolate::kNoDeoptId, kNumArgsChecked));
         __ LoadObject(R5, ic_data);
         __ LeaveDartFrame();  // The arguments are still on the stack.
-        __ Branch(&StubCode::CallNoSuchMethodFunctionLabel());
+        __ Branch(&stub_code->CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
         __ bkpt(0);
       } else {
@@ -1095,18 +1100,18 @@
   // Emit function patching code. This will be swapped with the first 3
   // instructions at entry point.
   patch_code_pc_offset_ = assembler()->CodeSize();
-  __ BranchPatchable(&StubCode::FixCallersTargetLabel());
+  __ BranchPatchable(&stub_code->FixCallersTargetLabel());
 
   if (is_optimizing()) {
     lazy_deopt_pc_offset_ = assembler()->CodeSize();
-    __ Branch(&StubCode::DeoptimizeLazyLabel());
+    __ Branch(&stub_code->DeoptimizeLazyLabel());
   }
 }
 
 
 void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
                                      const ExternalLabel* label,
-                                     PcDescriptors::Kind kind,
+                                     RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
   __ BranchLinkPatchable(label);
   AddCurrentDescriptor(kind, Isolate::kNoDeoptId, token_pos);
@@ -1117,7 +1122,7 @@
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          intptr_t token_pos,
                                          const ExternalLabel* label,
-                                         PcDescriptors::Kind kind,
+                                         RawPcDescriptors::Kind kind,
                                          LocationSummary* locs) {
   __ BranchLinkPatchable(label);
   AddCurrentDescriptor(kind, deopt_id, token_pos);
@@ -1130,7 +1135,8 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt,
+        deopt_id_after, token_pos);
   }
 }
 
@@ -1141,7 +1147,7 @@
                                             intptr_t argument_count,
                                             LocationSummary* locs) {
   __ CallRuntime(entry, argument_count);
-  AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id, token_pos);
   RecordSafepoint(locs);
   if (deopt_id != Isolate::kNoDeoptId) {
     // Marks either the continuation point in unoptimized code or the
@@ -1152,7 +1158,7 @@
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(PcDescriptors::kDeopt,
+      AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                            deopt_id_after,
                            token_pos);
     }
@@ -1196,7 +1202,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    target_label,
-                   PcDescriptors::kIcCall,
+                   RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1214,7 +1220,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    target_label,
-                   PcDescriptors::kIcCall,
+                   RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 #if defined(DEBUG)
@@ -1277,7 +1283,8 @@
   __ LoadObject(R4, arguments_descriptor);
   __ AddImmediate(R1, Instructions::HeaderSize() - kHeapObjectTag);
   __ blx(R1);
-  AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther,
+      Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
   __ Drop(argument_count);
@@ -1291,10 +1298,11 @@
     LocationSummary* locs,
     const ICData& ic_data) {
   uword label_address = 0;
+  StubCode* stub_code = isolate()->stub_code();
   if (ic_data.NumArgsTested() == 0) {
-    label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
+    label_address = stub_code->ZeroArgsUnoptimizedStaticCallEntryPoint();
   } else if (ic_data.NumArgsTested() == 2) {
-    label_address = StubCode::TwoArgsUnoptimizedStaticCallEntryPoint();
+    label_address = stub_code->TwoArgsUnoptimizedStaticCallEntryPoint();
   } else {
     UNIMPLEMENTED();
   }
@@ -1304,7 +1312,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    &target_label,
-                   PcDescriptors::kUnoptStaticCall,
+                   RawPcDescriptors::kUnoptStaticCall,
                    locs);
   __ Drop(argument_count);
 #if defined(DEBUG)
@@ -1320,13 +1328,14 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
+  StubCode* stub_code = isolate()->stub_code();
   __ LoadObject(R4, arguments_descriptor);
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
   GenerateDartCall(deopt_id,
                    token_pos,
-                   &StubCode::CallStaticFunctionLabel(),
-                   PcDescriptors::kOptStaticCall,
+                   &stub_code->CallStaticFunctionLabel(),
+                   RawPcDescriptors::kOptStaticCall,
                    locs);
   AddStaticCallTarget(function);
   __ Drop(argument_count);
@@ -1338,18 +1347,19 @@
                                                     bool needs_number_check,
                                                     intptr_t token_pos) {
   if (needs_number_check) {
+    StubCode* stub_code = isolate()->stub_code();
     ASSERT(!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint());
     __ Push(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
       __ BranchLinkPatchable(
-          &StubCode::OptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
       __ BranchLinkPatchable(
-          &StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
-      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                            Isolate::kNoDeoptId,
                            token_pos);
     }
@@ -1367,19 +1377,20 @@
                                                   bool needs_number_check,
                                                   intptr_t token_pos) {
   if (needs_number_check) {
+    StubCode* stub_code = isolate()->stub_code();
     __ Push(left);
     __ Push(right);
     if (is_optimizing()) {
       __ BranchLinkPatchable(
-          &StubCode::OptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
       __ LoadImmediate(R4, 0);
       __ LoadImmediate(R5, 0);
       __ BranchLinkPatchable(
-          &StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
-      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                            Isolate::kNoDeoptId,
                            token_pos);
     }
@@ -1488,6 +1499,8 @@
   const Array& arguments_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
                                                  argument_names));
+  StubCode* stub_code = isolate()->stub_code();
+
   __ LoadObject(R4, arguments_descriptor);
   for (intptr_t i = 0; i < len; i++) {
     const bool is_last_check = (i == (len - 1));
@@ -1502,8 +1515,8 @@
     // that we can record the outgoing edges to other code.
     GenerateDartCall(deopt_id,
                      token_index,
-                     &StubCode::CallStaticFunctionLabel(),
-                     PcDescriptors::kOptStaticCall,
+                     &stub_code->CallStaticFunctionLabel(),
+                     RawPcDescriptors::kOptStaticCall,
                      locs);
     const Function& function = *sorted[i].target;
     AddStaticCallTarget(function);
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 4b81587..786c164 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -163,7 +163,8 @@
 
   ASSERT(deopt_env() != NULL);
 
-  __ BranchLink(&StubCode::DeoptimizeLabel(), PP);
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  __ BranchLink(&stub_code->DeoptimizeLabel(), PP);
   set_pc_offset(assem->CodeSize());
 #undef __
 }
@@ -199,18 +200,19 @@
   ASSERT(temp_reg == kNoRegister);  // Unused on ARM.
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(SubtypeTestCache::New());
+  StubCode* stub_code = isolate()->stub_code();
   __ LoadObject(R2, type_test_cache, PP);
   if (test_kind == kTestTypeOneArg) {
     ASSERT(type_arguments_reg == kNoRegister);
     __ LoadObject(R1, Object::null_object(), PP);
-    __ BranchLink(&StubCode::Subtype1TestCacheLabel(), PP);
+    __ BranchLink(&stub_code->Subtype1TestCacheLabel(), PP);
   } else if (test_kind == kTestTypeTwoArgs) {
     ASSERT(type_arguments_reg == kNoRegister);
     __ LoadObject(R1, Object::null_object(), PP);
-    __ BranchLink(&StubCode::Subtype2TestCacheLabel(), PP);
+    __ BranchLink(&stub_code->Subtype2TestCacheLabel(), PP);
   } else if (test_kind == kTestTypeThreeArgs) {
     ASSERT(type_arguments_reg == R1);
-    __ BranchLink(&StubCode::Subtype3TestCacheLabel(), PP);
+    __ BranchLink(&stub_code->Subtype3TestCacheLabel(), PP);
   } else {
     UNREACHABLE();
   }
@@ -586,7 +588,7 @@
     // Load instantiator (R2) and its type arguments (R1).
     __ ldr(R1, Address(SP, 0 * kWordSize));
     __ ldr(R2, Address(SP, 1 * kWordSize));
-    __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+    __ PushObject(Object::null_object(), PP);  // Make room for the result.
     __ Push(R0);  // Push the instance.
     __ PushObject(type, PP);  // Push the type.
     // Push instantiator (R2) and its type arguments (R1).
@@ -654,7 +656,7 @@
 
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
-    __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+    __ PushObject(Object::null_object(), PP);  // Make room for the result.
     __ Push(R0);  // Push the source object.
     __ PushObject(dst_name, PP);  // Push the name of the destination.
     __ PushObject(dst_type, PP);  // Push the type of the destination.
@@ -682,7 +684,7 @@
   // Load instantiator (R2) and its type arguments (R1).
   __ ldr(R1, Address(SP));
   __ ldr(R2, Address(SP, 1 * kWordSize));
-  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ PushObject(Object::null_object(), PP);  // Make room for the result.
   __ Push(R0);  // Push the source object.
   __ PushObject(dst_type, PP);  // Push the type of the destination.
   // Push instantiator (R2) and its type arguments (R1).
@@ -893,13 +895,14 @@
   __ Bind(&wrong_num_arguments);
   if (function.IsClosureFunction()) {
     // Invoke noSuchMethod function passing "call" as the original name.
+    StubCode* stub_code = isolate()->stub_code();
     const int kNumArgsChecked = 1;
     const ICData& ic_data = ICData::ZoneHandle(
         ICData::New(function, Symbols::Call(), Object::empty_array(),
                     Isolate::kNoDeoptId, kNumArgsChecked));
     __ LoadObject(R5, ic_data, PP);
     __ LeaveDartFrame();  // The arguments are still on the stack.
-    __ BranchPatchable(&StubCode::CallNoSuchMethodFunctionLabel());
+    __ BranchPatchable(&stub_code->CallNoSuchMethodFunctionLabel());
     // The noSuchMethod call may return to the caller, but not here.
     __ brk(0);
   } else if (check_correct_named_args) {
@@ -961,6 +964,7 @@
       function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
     const Register function_reg = R6;
+    StubCode* stub_code = isolate()->stub_code();
     new_pp = R13;
 
     // Set up pool pointer in new_pp.
@@ -988,7 +992,7 @@
     ASSERT(function_reg == R6);
     Label dont_optimize;
     __ b(&dont_optimize, LT);
-    __ Branch(&StubCode::OptimizeFunctionLabel(), new_pp);
+    __ Branch(&stub_code->OptimizeFunctionLabel(), new_pp);
     __ Bind(&dont_optimize);
   } else if (!flow_graph().IsCompiledForOsr()) {
     // We have to load the PP here too because a load of an external label
@@ -1033,6 +1037,7 @@
   const int num_fixed_params = function.num_fixed_parameters();
   const int num_copied_params = parsed_function().num_copied_params();
   const int num_locals = parsed_function().num_stack_locals();
+  StubCode* stub_code = isolate()->stub_code();
 
   // We check the number of passed arguments when we have to copy them due to
   // the presence of optional parameters.
@@ -1071,7 +1076,7 @@
                         Isolate::kNoDeoptId, kNumArgsChecked));
         __ LoadObject(R5, ic_data, PP);
         __ LeaveDartFrame();  // The arguments are still on the stack.
-        __ BranchPatchable(&StubCode::CallNoSuchMethodFunctionLabel());
+        __ BranchPatchable(&stub_code->CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
         __ brk(0);
       } else {
@@ -1103,18 +1108,18 @@
   // Emit function patching code. This will be swapped with the first 3
   // instructions at entry point.
   patch_code_pc_offset_ = assembler()->CodeSize();
-  __ BranchPatchable(&StubCode::FixCallersTargetLabel());
+  __ BranchPatchable(&stub_code->FixCallersTargetLabel());
 
   if (is_optimizing()) {
     lazy_deopt_pc_offset_ = assembler()->CodeSize();
-  __ BranchPatchable(&StubCode::DeoptimizeLazyLabel());
+  __ BranchPatchable(&stub_code->DeoptimizeLazyLabel());
   }
 }
 
 
 void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
                                      const ExternalLabel* label,
-                                     PcDescriptors::Kind kind,
+                                     RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
   __ BranchLinkPatchable(label);
   AddCurrentDescriptor(kind, Isolate::kNoDeoptId, token_pos);
@@ -1125,7 +1130,7 @@
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          intptr_t token_pos,
                                          const ExternalLabel* label,
-                                         PcDescriptors::Kind kind,
+                                         RawPcDescriptors::Kind kind,
                                          LocationSummary* locs) {
   __ BranchLinkPatchable(label);
   AddCurrentDescriptor(kind, deopt_id, token_pos);
@@ -1138,7 +1143,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
 }
 
@@ -1149,7 +1154,7 @@
                                             intptr_t argument_count,
                                             LocationSummary* locs) {
   __ CallRuntime(entry, argument_count);
-  AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id, token_pos);
   RecordSafepoint(locs);
   if (deopt_id != Isolate::kNoDeoptId) {
     // Marks either the continuation point in unoptimized code or the
@@ -1160,7 +1165,7 @@
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
+      AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
     }
   }
 }
@@ -1202,7 +1207,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    target_label,
-                   PcDescriptors::kIcCall,
+                   RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1220,7 +1225,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    target_label,
-                   PcDescriptors::kIcCall,
+                   RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 #if defined(DEBUG)
@@ -1283,7 +1288,8 @@
   __ LoadObject(R4, arguments_descriptor, PP);
   __ AddImmediate(R1, R1, Instructions::HeaderSize() - kHeapObjectTag, PP);
   __ blr(R1);
-  AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther,
+      Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
   __ Drop(argument_count);
@@ -1297,10 +1303,11 @@
     LocationSummary* locs,
     const ICData& ic_data) {
   uword label_address = 0;
+  StubCode* stub_code = isolate()->stub_code();
   if (ic_data.NumArgsTested() == 0) {
-    label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
+    label_address = stub_code->ZeroArgsUnoptimizedStaticCallEntryPoint();
   } else if (ic_data.NumArgsTested() == 2) {
-    label_address = StubCode::TwoArgsUnoptimizedStaticCallEntryPoint();
+    label_address = stub_code->TwoArgsUnoptimizedStaticCallEntryPoint();
   } else {
     UNIMPLEMENTED();
   }
@@ -1310,7 +1317,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    &target_label,
-                   PcDescriptors::kUnoptStaticCall,
+                   RawPcDescriptors::kUnoptStaticCall,
                    locs);
 #if defined(DEBUG)
   __ LoadImmediate(R5, kInvalidObjectPointer, kNoPP);
@@ -1326,13 +1333,14 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
+  StubCode* stub_code = isolate()->stub_code();
   __ LoadObject(R4, arguments_descriptor, PP);
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
   GenerateDartCall(deopt_id,
                    token_pos,
-                   &StubCode::CallStaticFunctionLabel(),
-                   PcDescriptors::kOptStaticCall,
+                   &stub_code->CallStaticFunctionLabel(),
+                   RawPcDescriptors::kOptStaticCall,
                    locs);
   AddStaticCallTarget(function);
   __ Drop(argument_count);
@@ -1344,18 +1352,19 @@
                                                     bool needs_number_check,
                                                     intptr_t token_pos) {
   if (needs_number_check) {
+    StubCode* stub_code = isolate()->stub_code();
     ASSERT(!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint());
     __ Push(reg);
     __ PushObject(obj, PP);
     if (is_optimizing()) {
       __ BranchLinkPatchable(
-          &StubCode::OptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
       __ BranchLinkPatchable(
-          &StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
-      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                            Isolate::kNoDeoptId,
                            token_pos);
     }
@@ -1373,19 +1382,20 @@
                                                   bool needs_number_check,
                                                   intptr_t token_pos) {
   if (needs_number_check) {
+    StubCode* stub_code = isolate()->stub_code();
     __ Push(left);
     __ Push(right);
     if (is_optimizing()) {
       __ BranchLinkPatchable(
-          &StubCode::OptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
       __ LoadImmediate(R4, 0, kNoPP);
       __ LoadImmediate(R5, 0, kNoPP);
       __ BranchLinkPatchable(
-          &StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
-      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                            Isolate::kNoDeoptId,
                            token_pos);
     }
@@ -1475,6 +1485,8 @@
   const Array& arguments_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
                                                  argument_names));
+  StubCode* stub_code = isolate()->stub_code();
+
   __ LoadObject(R4, arguments_descriptor, PP);
   for (intptr_t i = 0; i < len; i++) {
     const bool is_last_check = (i == (len - 1));
@@ -1489,8 +1501,8 @@
     // that we can record the outgoing edges to other code.
     GenerateDartCall(deopt_id,
                      token_index,
-                     &StubCode::CallStaticFunctionLabel(),
-                     PcDescriptors::kOptStaticCall,
+                     &stub_code->CallStaticFunctionLabel(),
+                     RawPcDescriptors::kOptStaticCall,
                      locs);
     const Function& function = *sorted[i].target;
     AddStaticCallTarget(function);
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 25d3fd9..473f96f 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -167,7 +167,8 @@
 
   ASSERT(deopt_env() != NULL);
 
-  __ call(&StubCode::DeoptimizeLabel());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  __ call(&stub_code->DeoptimizeLabel());
   set_pc_offset(assem->CodeSize());
   __ int3();
 #undef __
@@ -205,20 +206,21 @@
       SubtypeTestCache::ZoneHandle(SubtypeTestCache::New());
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  StubCode* stub_code = isolate()->stub_code();
   __ LoadObject(temp_reg, type_test_cache);
   __ pushl(temp_reg);  // Subtype test cache.
   __ pushl(instance_reg);  // Instance.
   if (test_kind == kTestTypeOneArg) {
     ASSERT(type_arguments_reg == kNoRegister);
     __ pushl(raw_null);
-    __ call(&StubCode::Subtype1TestCacheLabel());
+    __ call(&stub_code->Subtype1TestCacheLabel());
   } else if (test_kind == kTestTypeTwoArgs) {
     ASSERT(type_arguments_reg == kNoRegister);
     __ pushl(raw_null);
-    __ call(&StubCode::Subtype2TestCacheLabel());
+    __ call(&stub_code->Subtype2TestCacheLabel());
   } else if (test_kind == kTestTypeThreeArgs) {
     __ pushl(type_arguments_reg);
-    __ call(&StubCode::Subtype3TestCacheLabel());
+    __ call(&stub_code->Subtype3TestCacheLabel());
   } else {
     UNREACHABLE();
   }
@@ -603,7 +605,7 @@
     // Generate runtime call.
     __ movl(EDX, Address(ESP, 0));  // Get instantiator type arguments.
     __ movl(ECX, Address(ESP, kWordSize));  // Get instantiator.
-    __ PushObject(Object::ZoneHandle());  // Make room for the result.
+    __ PushObject(Object::null_object());  // Make room for the result.
     __ pushl(EAX);  // Push the instance.
     __ PushObject(type);  // Push the type.
     __ pushl(ECX);  // Instantiator.
@@ -675,7 +677,7 @@
 
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
-    __ PushObject(Object::ZoneHandle());  // Make room for the result.
+    __ PushObject(Object::null_object());  // Make room for the result.
     __ pushl(EAX);  // Push the source object.
     __ PushObject(dst_name);  // Push the name of the destination.
     __ PushObject(dst_type);  // Push the type of the destination.
@@ -701,7 +703,7 @@
   __ Bind(&runtime_call);
   __ movl(EDX, Address(ESP, 0));  // Get instantiator type arguments.
   __ movl(ECX, Address(ESP, kWordSize));  // Get instantiator.
-  __ PushObject(Object::ZoneHandle());  // Make room for the result.
+  __ PushObject(Object::null_object());  // Make room for the result.
   __ pushl(EAX);  // Push the source object.
   __ PushObject(dst_type);  // Push the type of the destination.
   __ pushl(ECX);  // Instantiator.
@@ -917,13 +919,14 @@
   __ Bind(&wrong_num_arguments);
   if (function.IsClosureFunction()) {
     // Invoke noSuchMethod function passing "call" as the original name.
+    StubCode* stub_code = isolate()->stub_code();
     const int kNumArgsChecked = 1;
     const ICData& ic_data = ICData::ZoneHandle(
         ICData::New(function, Symbols::Call(), Object::empty_array(),
                     Isolate::kNoDeoptId, kNumArgsChecked));
     __ LoadObject(ECX, ic_data);
     __ LeaveFrame();  // The arguments are still on the stack.
-    __ jmp(&StubCode::CallNoSuchMethodFunctionLabel());
+    __ jmp(&stub_code->CallNoSuchMethodFunctionLabel());
     // The noSuchMethod call may return to the caller, but not here.
     __ int3();
   } else if (check_correct_named_args) {
@@ -984,6 +987,7 @@
   if (CanOptimizeFunction() &&
       function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
+    StubCode* stub_code = isolate()->stub_code();
     const Register function_reg = EDI;
     __ LoadObject(function_reg, function);
 
@@ -1001,7 +1005,7 @@
               Immediate(FLAG_optimization_counter_threshold));
     }
     ASSERT(function_reg == EDI);
-    __ j(GREATER_EQUAL, &StubCode::OptimizeFunctionLabel());
+    __ j(GREATER_EQUAL, &stub_code->OptimizeFunctionLabel());
   } else if (!flow_graph().IsCompiledForOsr()) {
     entry_patch_pc_offset_ = assembler()->CodeSize();
   }
@@ -1031,6 +1035,7 @@
   const int num_fixed_params = function.num_fixed_parameters();
   const int num_copied_params = parsed_function().num_copied_params();
   const int num_locals = parsed_function().num_stack_locals();
+  StubCode* stub_code = isolate()->stub_code();
 
   // We check the number of passed arguments when we have to copy them due to
   // the presence of optional parameters.
@@ -1070,7 +1075,7 @@
                         Isolate::kNoDeoptId, kNumArgsChecked));
         __ LoadObject(ECX, ic_data);
         __ LeaveFrame();  // The arguments are still on the stack.
-        __ jmp(&StubCode::CallNoSuchMethodFunctionLabel());
+        __ jmp(&stub_code->CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
         __ int3();
       } else {
@@ -1104,18 +1109,18 @@
   // Emit function patching code. This will be swapped with the first 5 bytes
   // at entry point.
   patch_code_pc_offset_ = assembler()->CodeSize();
-  __ jmp(&StubCode::FixCallersTargetLabel());
+  __ jmp(&stub_code->FixCallersTargetLabel());
 
   if (is_optimizing()) {
     lazy_deopt_pc_offset_ = assembler()->CodeSize();
-    __ jmp(&StubCode::DeoptimizeLazyLabel());
+    __ jmp(&stub_code->DeoptimizeLazyLabel());
   }
 }
 
 
 void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
                                      const ExternalLabel* label,
-                                     PcDescriptors::Kind kind,
+                                     RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
   __ call(label);
   AddCurrentDescriptor(kind, Isolate::kNoDeoptId, token_pos);
@@ -1126,7 +1131,7 @@
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          intptr_t token_pos,
                                          const ExternalLabel* label,
-                                         PcDescriptors::Kind kind,
+                                         RawPcDescriptors::Kind kind,
                                          LocationSummary* locs) {
   __ call(label);
   AddCurrentDescriptor(kind, deopt_id, token_pos);
@@ -1139,7 +1144,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
 }
 
@@ -1150,7 +1155,7 @@
                                             intptr_t argument_count,
                                             LocationSummary* locs) {
   __ CallRuntime(entry, argument_count);
-  AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id, token_pos);
   RecordSafepoint(locs);
   if (deopt_id != Isolate::kNoDeoptId) {
     // Marks either the continuation point in unoptimized code or the
@@ -1161,7 +1166,7 @@
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
+      AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
     }
   }
 }
@@ -1174,10 +1179,11 @@
     LocationSummary* locs,
     const ICData& ic_data) {
   uword label_address = 0;
+  StubCode* stub_code = isolate()->stub_code();
   if (ic_data.NumArgsTested() == 0) {
-    label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
+    label_address = stub_code->ZeroArgsUnoptimizedStaticCallEntryPoint();
   } else if (ic_data.NumArgsTested() == 2) {
-    label_address = StubCode::TwoArgsUnoptimizedStaticCallEntryPoint();
+    label_address = stub_code->TwoArgsUnoptimizedStaticCallEntryPoint();
   } else {
     UNIMPLEMENTED();
   }
@@ -1187,7 +1193,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    &target_label,
-                   PcDescriptors::kUnoptStaticCall,
+                   RawPcDescriptors::kUnoptStaticCall,
                    locs);
   __ Drop(argument_count);
 #if defined(DEBUG)
@@ -1230,7 +1236,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    target_label,
-                   PcDescriptors::kIcCall,
+                   RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1248,7 +1254,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    target_label,
-                   PcDescriptors::kIcCall,
+                   RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 #if defined(DEBUG)
@@ -1311,7 +1317,8 @@
   __ LoadObject(EDX, arguments_descriptor);
   __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ call(EBX);
-  AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther,
+      Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
   __ Drop(argument_count);
@@ -1325,13 +1332,14 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
+  StubCode* stub_code = isolate()->stub_code();
   __ LoadObject(EDX, arguments_descriptor);
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
   GenerateDartCall(deopt_id,
                    token_pos,
-                   &StubCode::CallStaticFunctionLabel(),
-                   PcDescriptors::kOptStaticCall,
+                   &stub_code->CallStaticFunctionLabel(),
+                   RawPcDescriptors::kOptStaticCall,
                    locs);
   AddStaticCallTarget(function);
   __ Drop(argument_count);
@@ -1352,15 +1360,16 @@
   }
 
   if (needs_number_check) {
+    StubCode* stub_code = isolate()->stub_code();
     __ pushl(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
-      __ call(&StubCode::OptimizedIdenticalWithNumberCheckLabel());
+      __ call(&stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
-      __ call(&StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+      __ call(&stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
-      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                            Isolate::kNoDeoptId,
                            token_pos);
     }
@@ -1378,17 +1387,18 @@
                                                   bool needs_number_check,
                                                   intptr_t token_pos) {
   if (needs_number_check) {
+    StubCode* stub_code = isolate()->stub_code();
     __ pushl(left);
     __ pushl(right);
     if (is_optimizing()) {
-      __ call(&StubCode::OptimizedIdenticalWithNumberCheckLabel());
+      __ call(&stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
       __ movl(EDX, Immediate(0));
       __ movl(ECX, Immediate(0));
-      __ call(&StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+      __ call(&stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
-      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                            Isolate::kNoDeoptId,
                            token_pos);
     }
@@ -1485,6 +1495,8 @@
   const Array& arguments_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
                                                  argument_names));
+  StubCode* stub_code = isolate()->stub_code();
+
   __ LoadObject(EDX, arguments_descriptor);
   for (intptr_t i = 0; i < len; i++) {
     const bool is_last_check = (i == (len - 1));
@@ -1499,8 +1511,8 @@
     // that we can record the outgoing edges to other code.
     GenerateDartCall(deopt_id,
                      token_index,
-                     &StubCode::CallStaticFunctionLabel(),
-                     PcDescriptors::kOptStaticCall,
+                     &stub_code->CallStaticFunctionLabel(),
+                     RawPcDescriptors::kOptStaticCall,
                      locs);
     const Function& function = *sorted[i].target;
     AddStaticCallTarget(function);
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index d86d744..8041aa5 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -167,7 +167,8 @@
 
   ASSERT(deopt_env() != NULL);
 
-  __ BranchLink(&StubCode::DeoptimizeLabel());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  __ BranchLink(&stub_code->DeoptimizeLabel());
   set_pc_offset(assem->CodeSize());
 #undef __
 }
@@ -204,18 +205,19 @@
   ASSERT(temp_reg == kNoRegister);  // Unused on MIPS.
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(SubtypeTestCache::New());
+  StubCode* stub_code = isolate()->stub_code();
   __ LoadObject(A2, type_test_cache);
   if (test_kind == kTestTypeOneArg) {
     ASSERT(type_arguments_reg == kNoRegister);
     __ LoadImmediate(A1, reinterpret_cast<int32_t>(Object::null()));
-    __ BranchLink(&StubCode::Subtype1TestCacheLabel());
+    __ BranchLink(&stub_code->Subtype1TestCacheLabel());
   } else if (test_kind == kTestTypeTwoArgs) {
     ASSERT(type_arguments_reg == kNoRegister);
     __ LoadImmediate(A1, reinterpret_cast<int32_t>(Object::null()));
-    __ BranchLink(&StubCode::Subtype2TestCacheLabel());
+    __ BranchLink(&stub_code->Subtype2TestCacheLabel());
   } else if (test_kind == kTestTypeThreeArgs) {
     ASSERT(type_arguments_reg == A1);
-    __ BranchLink(&StubCode::Subtype3TestCacheLabel());
+    __ BranchLink(&stub_code->Subtype3TestCacheLabel());
   } else {
     UNREACHABLE();
   }
@@ -591,7 +593,7 @@
     __ lw(A2, Address(SP, 1 * kWordSize));
 
     __ addiu(SP, SP, Immediate(-6 * kWordSize));
-    __ LoadObject(TMP, Object::ZoneHandle());
+    __ LoadObject(TMP, Object::null_object());
     __ sw(TMP, Address(SP, 5 * kWordSize));  // Make room for the result.
     __ sw(A0, Address(SP, 4 * kWordSize));  // Push the instance.
     __ LoadObject(TMP, type);
@@ -664,7 +666,7 @@
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
     __ addiu(SP, SP, Immediate(-4 * kWordSize));
-    __ LoadObject(TMP, Object::ZoneHandle());
+    __ LoadObject(TMP, Object::null_object());
     __ sw(TMP, Address(SP, 3 * kWordSize));  // Make room for the result.
     __ sw(A0, Address(SP, 2 * kWordSize));  // Push the source object.
     __ LoadObject(TMP, dst_name);
@@ -699,7 +701,7 @@
   __ lw(A2, Address(SP, 1 * kWordSize));
 
   __ addiu(SP, SP, Immediate(-7 * kWordSize));
-  __ LoadObject(TMP, Object::ZoneHandle());
+  __ LoadObject(TMP, Object::null_object());
   __ sw(TMP, Address(SP, 6 * kWordSize));  // Make room for the result.
   __ sw(A0, Address(SP, 5 * kWordSize));  // Push the source object.
   __ LoadObject(TMP, dst_type);
@@ -914,13 +916,14 @@
   __ Bind(&wrong_num_arguments);
   if (function.IsClosureFunction()) {
     // Invoke noSuchMethod function passing "call" as the original name.
+    StubCode* stub_code = isolate()->stub_code();
     const int kNumArgsChecked = 1;
     const ICData& ic_data = ICData::ZoneHandle(
         ICData::New(function, Symbols::Call(), Object::empty_array(),
                     Isolate::kNoDeoptId, kNumArgsChecked));
     __ LoadObject(S5, ic_data);
     __ LeaveDartFrame();  // The arguments are still on the stack.
-    __ Branch(&StubCode::CallNoSuchMethodFunctionLabel());
+    __ Branch(&stub_code->CallNoSuchMethodFunctionLabel());
     // The noSuchMethod call may return to the caller, but not here.
     __ break_(0);
   } else if (check_correct_named_args) {
@@ -984,6 +987,7 @@
       function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
     const Register function_reg = T0;
+    StubCode* stub_code = isolate()->stub_code();
 
     __ GetNextPC(T2, TMP);
 
@@ -1020,7 +1024,7 @@
     __ BranchSignedLess(T1, threshold, &dont_branch);
 
     ASSERT(function_reg == T0);
-    __ Branch(&StubCode::OptimizeFunctionLabel());
+    __ Branch(&stub_code->OptimizeFunctionLabel());
 
     __ Bind(&dont_branch);
 
@@ -1060,6 +1064,7 @@
   const int num_fixed_params = function.num_fixed_parameters();
   const int num_copied_params = parsed_function().num_copied_params();
   const int num_locals = parsed_function().num_stack_locals();
+  StubCode* stub_code = isolate()->stub_code();
 
   // We check the number of passed arguments when we have to copy them due to
   // the presence of optional parameters.
@@ -1099,7 +1104,7 @@
                         Isolate::kNoDeoptId, kNumArgsChecked));
         __ LoadObject(S5, ic_data);
         __ LeaveDartFrame();  // The arguments are still on the stack.
-        __ Branch(&StubCode::CallNoSuchMethodFunctionLabel());
+        __ Branch(&stub_code->CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
         __ break_(0);
       } else {
@@ -1131,18 +1136,18 @@
   // Emit function patching code. This will be swapped with the first 5 bytes
   // at entry point.
   patch_code_pc_offset_ = assembler()->CodeSize();
-  __ BranchPatchable(&StubCode::FixCallersTargetLabel());
+  __ BranchPatchable(&stub_code->FixCallersTargetLabel());
 
   if (is_optimizing()) {
     lazy_deopt_pc_offset_ = assembler()->CodeSize();
-    __ Branch(&StubCode::DeoptimizeLazyLabel());
+    __ Branch(&stub_code->DeoptimizeLazyLabel());
   }
 }
 
 
 void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
                                      const ExternalLabel* label,
-                                     PcDescriptors::Kind kind,
+                                     RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
   __ BranchLinkPatchable(label);
   AddCurrentDescriptor(kind, Isolate::kNoDeoptId, token_pos);
@@ -1153,7 +1158,7 @@
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          intptr_t token_pos,
                                          const ExternalLabel* label,
-                                         PcDescriptors::Kind kind,
+                                         RawPcDescriptors::Kind kind,
                                          LocationSummary* locs) {
   __ BranchLinkPatchable(label);
   AddCurrentDescriptor(kind, deopt_id, token_pos);
@@ -1166,7 +1171,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(PcDescriptors::kDeopt,
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                          deopt_id_after,
                          token_pos);
   }
@@ -1179,7 +1184,7 @@
                                             intptr_t argument_count,
                                             LocationSummary* locs) {
   __ CallRuntime(entry, argument_count);
-  AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id, token_pos);
   RecordSafepoint(locs);
   if (deopt_id != Isolate::kNoDeoptId) {
     // Marks either the continuation point in unoptimized code or the
@@ -1190,7 +1195,7 @@
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(PcDescriptors::kDeopt,
+      AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                            deopt_id_after,
                            token_pos);
     }
@@ -1234,7 +1239,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    target_label,
-                   PcDescriptors::kIcCall,
+                   RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1253,7 +1258,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    target_label,
-                   PcDescriptors::kIcCall,
+                   RawPcDescriptors::kIcCall,
                    locs);
   __ TraceSimMsg("InstanceCall return");
   __ Drop(argument_count);
@@ -1319,7 +1324,8 @@
   __ LoadObject(S4, arguments_descriptor);
   __ AddImmediate(T1, Instructions::HeaderSize() - kHeapObjectTag);
   __ jalr(T1);
-  AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther,
+      Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
   __ Drop(argument_count);
@@ -1333,10 +1339,11 @@
     LocationSummary* locs,
     const ICData& ic_data) {
   uword label_address = 0;
+  StubCode* stub_code = isolate()->stub_code();
   if (ic_data.NumArgsTested() == 0) {
-    label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
+    label_address = stub_code->ZeroArgsUnoptimizedStaticCallEntryPoint();
   } else if (ic_data.NumArgsTested() == 2) {
-    label_address = StubCode::TwoArgsUnoptimizedStaticCallEntryPoint();
+    label_address = stub_code->TwoArgsUnoptimizedStaticCallEntryPoint();
   } else {
     UNIMPLEMENTED();
   }
@@ -1346,7 +1353,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    &target_label,
-                   PcDescriptors::kUnoptStaticCall,
+                   RawPcDescriptors::kUnoptStaticCall,
                    locs);
 #if defined(DEBUG)
   __ LoadImmediate(S4, kInvalidObjectPointer);
@@ -1362,14 +1369,15 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
+  StubCode* stub_code = isolate()->stub_code();
   __ TraceSimMsg("StaticCall");
   __ LoadObject(S4, arguments_descriptor);
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
   GenerateDartCall(deopt_id,
                    token_pos,
-                   &StubCode::CallStaticFunctionLabel(),
-                   PcDescriptors::kOptStaticCall,
+                   &stub_code->CallStaticFunctionLabel(),
+                   RawPcDescriptors::kOptStaticCall,
                    locs);
   AddStaticCallTarget(function);
   __ Drop(argument_count);
@@ -1382,6 +1390,7 @@
                                                     intptr_t token_pos) {
   __ TraceSimMsg("EqualityRegConstCompare");
   if (needs_number_check) {
+    StubCode* stub_code = isolate()->stub_code();
     ASSERT(!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint());
     __ addiu(SP, SP, Immediate(-2 * kWordSize));
     __ sw(reg, Address(SP, 1 * kWordSize));
@@ -1389,13 +1398,13 @@
     __ sw(TMP, Address(SP, 0 * kWordSize));
     if (is_optimizing()) {
       __ BranchLinkPatchable(
-          &StubCode::OptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
       __ BranchLinkPatchable(
-          &StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
-      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                            Isolate::kNoDeoptId,
                            token_pos);
     }
@@ -1415,20 +1424,21 @@
   __ TraceSimMsg("EqualityRegRegCompare");
   __ Comment("EqualityRegRegCompare");
   if (needs_number_check) {
+    StubCode* stub_code = isolate()->stub_code();
     __ addiu(SP, SP, Immediate(-2 * kWordSize));
     __ sw(left, Address(SP, 1 * kWordSize));
     __ sw(right, Address(SP, 0 * kWordSize));
     if (is_optimizing()) {
       __ BranchLinkPatchable(
-          &StubCode::OptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
       __ LoadImmediate(S4, 0);
       __ LoadImmediate(S5, 0);
       __ BranchLinkPatchable(
-          &StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+          &stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
-      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                            Isolate::kNoDeoptId,
                            token_pos);
     }
@@ -1545,6 +1555,8 @@
   const Array& arguments_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
                                                  argument_names));
+  StubCode* stub_code = isolate()->stub_code();
+
   __ TraceSimMsg("EmitTestAndCall");
   __ Comment("EmitTestAndCall");
   __ LoadObject(S4, arguments_descriptor);
@@ -1560,8 +1572,8 @@
     // that we can record the outgoing edges to other code.
     GenerateDartCall(deopt_id,
                      token_index,
-                     &StubCode::CallStaticFunctionLabel(),
-                     PcDescriptors::kOptStaticCall,
+                     &stub_code->CallStaticFunctionLabel(),
+                     RawPcDescriptors::kOptStaticCall,
                      locs);
     const Function& function = *sorted[i].target;
     AddStaticCallTarget(function);
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index f183de6..a601029 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -165,7 +165,8 @@
 
   ASSERT(deopt_env() != NULL);
 
-  __ Call(&StubCode::DeoptimizeLabel(), PP);
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  __ Call(&stub_code->DeoptimizeLabel(), PP);
   set_pc_offset(assem->CodeSize());
   __ int3();
 #undef __
@@ -199,20 +200,21 @@
     Label* is_not_instance_lbl) {
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(SubtypeTestCache::New());
+  StubCode* stub_code = isolate()->stub_code();
   __ LoadObject(temp_reg, type_test_cache, PP);
   __ pushq(temp_reg);  // Subtype test cache.
   __ pushq(instance_reg);  // Instance.
   if (test_kind == kTestTypeOneArg) {
     ASSERT(type_arguments_reg == kNoRegister);
     __ PushObject(Object::null_object(), PP);
-    __ Call(&StubCode::Subtype1TestCacheLabel(), PP);
+    __ Call(&stub_code->Subtype1TestCacheLabel(), PP);
   } else if (test_kind == kTestTypeTwoArgs) {
     ASSERT(type_arguments_reg == kNoRegister);
     __ PushObject(Object::null_object(), PP);
-    __ Call(&StubCode::Subtype2TestCacheLabel(), PP);
+    __ Call(&stub_code->Subtype2TestCacheLabel(), PP);
   } else if (test_kind == kTestTypeThreeArgs) {
     __ pushq(type_arguments_reg);
-    __ Call(&StubCode::Subtype3TestCacheLabel(), PP);
+    __ Call(&stub_code->Subtype3TestCacheLabel(), PP);
   } else {
     UNREACHABLE();
   }
@@ -592,7 +594,7 @@
     // Generate runtime call.
     __ movq(RDX, Address(RSP, 0));  // Get instantiator type arguments.
     __ movq(RCX, Address(RSP, kWordSize));  // Get instantiator.
-    __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+    __ PushObject(Object::null_object(), PP);  // Make room for the result.
     __ pushq(RAX);  // Push the instance.
     __ PushObject(type, PP);  // Push the type.
     __ pushq(RCX);  // TODO(srdjan): Pass instantiator instead of null.
@@ -662,7 +664,7 @@
 
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
-    __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+    __ PushObject(Object::null_object(), PP);  // Make room for the result.
     __ pushq(RAX);  // Push the source object.
     __ PushObject(dst_name, PP);  // Push the name of the destination.
     __ PushObject(dst_type, PP);  // Push the type of the destination.
@@ -688,7 +690,7 @@
   __ Bind(&runtime_call);
   __ movq(RDX, Address(RSP, 0));  // Get instantiator type arguments.
   __ movq(RCX, Address(RSP, kWordSize));  // Get instantiator.
-  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ PushObject(Object::null_object(), PP);  // Make room for the result.
   __ pushq(RAX);  // Push the source object.
   __ PushObject(dst_type, PP);  // Push the type of the destination.
   __ pushq(RCX);  // Instantiator.
@@ -906,13 +908,14 @@
   __ Bind(&wrong_num_arguments);
   if (function.IsClosureFunction()) {
     // Invoke noSuchMethod function passing "call" as the original name.
+    StubCode* stub_code = isolate()->stub_code();
     const int kNumArgsChecked = 1;
     const ICData& ic_data = ICData::ZoneHandle(
         ICData::New(function, Symbols::Call(), Object::empty_array(),
                     Isolate::kNoDeoptId, kNumArgsChecked));
     __ LoadObject(RBX, ic_data, PP);
     __ LeaveDartFrame();  // The arguments are still on the stack.
-    __ jmp(&StubCode::CallNoSuchMethodFunctionLabel());
+    __ jmp(&stub_code->CallNoSuchMethodFunctionLabel());
     // The noSuchMethod call may return to the caller, but not here.
     __ int3();
   } else if (check_correct_named_args) {
@@ -974,6 +977,7 @@
   if (CanOptimizeFunction() &&
       function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
+    StubCode* stub_code = isolate()->stub_code();
     const Register function_reg = RDI;
     new_pp = R13;
     new_pc = R12;
@@ -1015,7 +1019,7 @@
           Immediate(FLAG_optimization_counter_threshold));
     }
     ASSERT(function_reg == RDI);
-    __ J(GREATER_EQUAL, &StubCode::OptimizeFunctionLabel(), R13);
+    __ J(GREATER_EQUAL, &stub_code->OptimizeFunctionLabel(), R13);
   } else if (!flow_graph().IsCompiledForOsr()) {
     // We have to load the PP here too because a load of an external label
     // may be patched at the AddCurrentDescriptor below.
@@ -1068,6 +1072,7 @@
   const int num_fixed_params = function.num_fixed_parameters();
   const int num_copied_params = parsed_function().num_copied_params();
   const int num_locals = parsed_function().num_stack_locals();
+  StubCode* stub_code = isolate()->stub_code();
 
   // We check the number of passed arguments when we have to copy them due to
   // the presence of optional parameters.
@@ -1107,7 +1112,7 @@
                         Isolate::kNoDeoptId, kNumArgsChecked));
         __ LoadObject(RBX, ic_data, PP);
         __ LeaveDartFrame();  // The arguments are still on the stack.
-        __ jmp(&StubCode::CallNoSuchMethodFunctionLabel());
+        __ jmp(&stub_code->CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
         __ int3();
       } else {
@@ -1141,18 +1146,18 @@
   patch_code_pc_offset_ = assembler()->CodeSize();
   // This is patched up to a point in FrameEntry where the PP for the
   // current function is in R13 instead of PP.
-  __ JmpPatchable(&StubCode::FixCallersTargetLabel(), R13);
+  __ JmpPatchable(&stub_code->FixCallersTargetLabel(), R13);
 
   if (is_optimizing()) {
     lazy_deopt_pc_offset_ = assembler()->CodeSize();
-    __ Jmp(&StubCode::DeoptimizeLazyLabel(), PP);
+    __ Jmp(&stub_code->DeoptimizeLazyLabel(), PP);
   }
 }
 
 
 void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
                                      const ExternalLabel* label,
-                                     PcDescriptors::Kind kind,
+                                     RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
   __ Call(label, PP);
   AddCurrentDescriptor(kind, Isolate::kNoDeoptId, token_pos);
@@ -1163,7 +1168,7 @@
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          intptr_t token_pos,
                                          const ExternalLabel* label,
-                                         PcDescriptors::Kind kind,
+                                         RawPcDescriptors::Kind kind,
                                          LocationSummary* locs) {
   __ CallPatchable(label);
   AddCurrentDescriptor(kind, deopt_id, token_pos);
@@ -1176,7 +1181,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
 }
 
@@ -1187,7 +1192,7 @@
                                             intptr_t argument_count,
                                             LocationSummary* locs) {
   __ CallRuntime(entry, argument_count);
-  AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id, token_pos);
   RecordSafepoint(locs);
   if (deopt_id != Isolate::kNoDeoptId) {
     // Marks either the continuation point in unoptimized code or the
@@ -1198,7 +1203,7 @@
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
+      AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
     }
   }
 }
@@ -1211,10 +1216,11 @@
     LocationSummary* locs,
     const ICData& ic_data) {
   uword label_address = 0;
+  StubCode* stub_code = isolate()->stub_code();
   if (ic_data.NumArgsTested() == 0) {
-    label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
+    label_address = stub_code->ZeroArgsUnoptimizedStaticCallEntryPoint();
   } else if (ic_data.NumArgsTested() == 2) {
-    label_address = StubCode::TwoArgsUnoptimizedStaticCallEntryPoint();
+    label_address = stub_code->TwoArgsUnoptimizedStaticCallEntryPoint();
   } else {
     UNIMPLEMENTED();
   }
@@ -1224,7 +1230,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    &target_label,
-                   PcDescriptors::kUnoptStaticCall,
+                   RawPcDescriptors::kUnoptStaticCall,
                    locs);
   __ Drop(argument_count);
 #if defined(DEBUG)
@@ -1267,7 +1273,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    target_label,
-                   PcDescriptors::kIcCall,
+                   RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 }
@@ -1285,7 +1291,7 @@
   GenerateDartCall(deopt_id,
                    token_pos,
                    target_label,
-                   PcDescriptors::kIcCall,
+                   RawPcDescriptors::kIcCall,
                    locs);
   __ Drop(argument_count);
 #if defined(DEBUG)
@@ -1347,7 +1353,8 @@
   __ AddImmediate(
       RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag), PP);
   __ call(RCX);
-  AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
+  AddCurrentDescriptor(RawPcDescriptors::kOther,
+      Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
   __ Drop(argument_count);
@@ -1361,13 +1368,14 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
+  StubCode* stub_code = isolate()->stub_code();
   __ LoadObject(R10, arguments_descriptor, PP);
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
   GenerateDartCall(deopt_id,
                    token_pos,
-                   &StubCode::CallStaticFunctionLabel(),
-                   PcDescriptors::kOptStaticCall,
+                   &stub_code->CallStaticFunctionLabel(),
+                   RawPcDescriptors::kOptStaticCall,
                    locs);
   AddStaticCallTarget(function);
   __ Drop(argument_count);
@@ -1388,15 +1396,16 @@
   }
 
   if (needs_number_check) {
+    StubCode* stub_code = isolate()->stub_code();
     __ pushq(reg);
     __ PushObject(obj, PP);
     if (is_optimizing()) {
-      __ CallPatchable(&StubCode::OptimizedIdenticalWithNumberCheckLabel());
+      __ CallPatchable(&stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
-      __ CallPatchable(&StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+      __ CallPatchable(&stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
-      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                            Isolate::kNoDeoptId,
                            token_pos);
     }
@@ -1414,17 +1423,18 @@
                                                   bool needs_number_check,
                                                   intptr_t token_pos) {
   if (needs_number_check) {
+    StubCode* stub_code = isolate()->stub_code();
     __ pushq(left);
     __ pushq(right);
     if (is_optimizing()) {
-      __ CallPatchable(&StubCode::OptimizedIdenticalWithNumberCheckLabel());
+      __ CallPatchable(&stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
       __ movq(R10, Immediate(0));
       __ movq(RBX, Immediate(0));
-      __ CallPatchable(&StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+      __ CallPatchable(&stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
-      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+      AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                            Isolate::kNoDeoptId,
                            token_pos);
     }
@@ -1478,6 +1488,8 @@
   const Array& arguments_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
                                                  argument_names));
+  StubCode* stub_code = isolate()->stub_code();
+
   __ LoadObject(R10, arguments_descriptor, PP);
   for (intptr_t i = 0; i < len; i++) {
     const bool is_last_check = (i == (len - 1));
@@ -1492,8 +1504,8 @@
     // that we can record the outgoing edges to other code.
     GenerateDartCall(deopt_id,
                      token_index,
-                     &StubCode::CallStaticFunctionLabel(),
-                     PcDescriptors::kOptStaticCall,
+                     &stub_code->CallStaticFunctionLabel(),
+                     RawPcDescriptors::kOptStaticCall,
                      locs);
     const Function& function = *sorted[i].target;
     AddStaticCallTarget(function);
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index e037d49..c11fe36 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -1019,6 +1019,14 @@
         target ^= alloc->closure_function().raw();
         ASSERT(target.signature_class() == alloc->cls().raw());
       }
+      ConstantInstr* constant =
+          call->ArgumentAt(0)->OriginalDefinition()->AsConstant();
+      if ((constant != NULL) &&
+          constant->value().IsInstance() &&
+          Instance::Cast(constant->value()).IsClosure()) {
+        target ^= Closure::function(Instance::Cast(constant->value()));
+      }
+
       if (target.IsNull()) {
         TRACE_INLINING(OS::Print("     Bailout: non-closure operator\n"));
         continue;
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 1160b9f..3eddfed 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -7687,7 +7687,6 @@
   GrowableArray<BlockEntryInstr*> ignored;
   ConstantPropagator cp(graph, ignored);
   cp.Analyze();
-  cp.VisitBranches();
   cp.Transform();
   cp.EliminateRedundantBranches();
 }
@@ -7832,14 +7831,20 @@
   // might be analyzing it because the constant value of one of its inputs
   // has changed.)
   if (reachable_->Contains(instr->GetBlock()->preorder_number())) {
-    const Object& value = instr->comparison()->constant_value();
-    if (IsNonConstant(value)) {
-      SetReachable(instr->true_successor());
-      SetReachable(instr->false_successor());
-    } else if (value.raw() == Bool::True().raw()) {
-      SetReachable(instr->true_successor());
-    } else if (!IsUnknown(value)) {  // Any other constant.
-      SetReachable(instr->false_successor());
+    if (instr->constant_target() != NULL) {
+      ASSERT((instr->constant_target() == instr->true_successor()) ||
+             (instr->constant_target() == instr->false_successor()));
+      SetReachable(instr->constant_target());
+    } else {
+      const Object& value = instr->comparison()->constant_value();
+      if (IsNonConstant(value)) {
+        SetReachable(instr->true_successor());
+        SetReachable(instr->false_successor());
+      } else if (value.raw() == Bool::True().raw()) {
+        SetReachable(instr->true_successor());
+      } else if (!IsUnknown(value)) {  // Any other constant.
+        SetReachable(instr->false_successor());
+      }
     }
   }
 }
@@ -8935,46 +8940,6 @@
 }
 
 
-void ConstantPropagator::VisitBranches() {
-  GraphEntryInstr* entry = graph_->graph_entry();
-  reachable_->Add(entry->preorder_number());
-  block_worklist_.Add(entry);
-
-  while (!block_worklist_.is_empty()) {
-    BlockEntryInstr* block = block_worklist_.RemoveLast();
-    if (block->IsGraphEntry()) {
-      // TODO(fschneider): Improve this approximation. Catch entries are only
-      // reachable if a call in the corresponding try-block is reachable.
-      for (intptr_t i = 0; i < block->SuccessorCount(); ++i) {
-        SetReachable(block->SuccessorAt(i));
-      }
-      continue;
-    }
-    Instruction* last = block->last_instruction();
-    if (last->IsGoto()) {
-      SetReachable(last->AsGoto()->successor());
-    } else if (last->IsBranch()) {
-      BranchInstr* branch = last->AsBranch();
-      // The current block must be reachable.
-      ASSERT(reachable_->Contains(branch->GetBlock()->preorder_number()));
-      if (branch->constant_target() != NULL) {
-        // Found constant target computed by range analysis.
-        if (branch->constant_target() == branch->true_successor()) {
-          SetReachable(branch->true_successor());
-        } else {
-          ASSERT(branch->constant_target() == branch->false_successor());
-          SetReachable(branch->false_successor());
-        }
-      } else {
-        // No new information: Assume both targets are reachable.
-        SetReachable(branch->true_successor());
-        SetReachable(branch->false_successor());
-      }
-    }
-  }
-}
-
-
 static bool IsEmptyBlock(BlockEntryInstr* block) {
   return block->next()->IsGoto() &&
       (!block->IsJoinEntry() || (block->AsJoinEntry()->phis() == NULL));
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 5b05ea7..7f0e220 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -331,7 +331,6 @@
 
  private:
   void Analyze();
-  void VisitBranches();
   void Transform();
   void EliminateRedundantBranches();
 
diff --git a/runtime/vm/instructions_arm64_test.cc b/runtime/vm/instructions_arm64_test.cc
index fb97900..cff233a 100644
--- a/runtime/vm/instructions_arm64_test.cc
+++ b/runtime/vm/instructions_arm64_test.cc
@@ -16,7 +16,8 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ BranchLinkPatchable(&StubCode::InvokeDartCodeLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ BranchLinkPatchable(&stub_code->InvokeDartCodeLabel());
   __ ret();
 }
 
@@ -27,14 +28,16 @@
   // before the end of the code buffer.
   CallPattern call(test->entry() + test->code().Size() - Instr::kInstrSize,
                    test->code());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             call.TargetAddress());
 }
 
 
 ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ BranchPatchable(&StubCode::InvokeDartCodeLabel());
-  __ BranchPatchable(&StubCode::AllocateArrayLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ BranchPatchable(&stub_code->InvokeDartCodeLabel());
+  __ BranchPatchable(&stub_code->AllocateArrayLabel());
 }
 
 
@@ -45,21 +48,22 @@
       VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
                              instrs.size(),
                              VirtualMemory::kReadWrite);
+  StubCode* stub_code = Isolate::Current()->stub_code();
   EXPECT(status);
   JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
                     test->code());
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump2.TargetAddress());
   uword target1 = jump1.TargetAddress();
   uword target2 = jump2.TargetAddress();
   jump1.SetTargetAddress(target2);
   jump2.SetTargetAddress(target1);
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
 }
 
diff --git a/runtime/vm/instructions_arm_test.cc b/runtime/vm/instructions_arm_test.cc
index a723258..4f8f2f3 100644
--- a/runtime/vm/instructions_arm_test.cc
+++ b/runtime/vm/instructions_arm_test.cc
@@ -16,7 +16,8 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ BranchLinkPatchable(&StubCode::InvokeDartCodeLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ BranchLinkPatchable(&stub_code->InvokeDartCodeLabel());
   __ Ret();
 }
 
@@ -27,14 +28,16 @@
   // before the end of the code buffer.
   CallPattern call(test->entry() + test->code().Size() - Instr::kInstrSize,
                    test->code());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             call.TargetAddress());
 }
 
 
 ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ BranchPatchable(&StubCode::InvokeDartCodeLabel());
-  __ BranchPatchable(&StubCode::AllocateArrayLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ BranchPatchable(&stub_code->InvokeDartCodeLabel());
+  __ BranchPatchable(&stub_code->AllocateArrayLabel());
 }
 
 
@@ -45,21 +48,22 @@
       VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
                              instrs.size(),
                              VirtualMemory::kReadWrite);
+  StubCode* stub_code = Isolate::Current()->stub_code();
   EXPECT(status);
   JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
                     test->code());
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump2.TargetAddress());
   uword target1 = jump1.TargetAddress();
   uword target2 = jump2.TargetAddress();
   jump1.SetTargetAddress(target2);
   jump2.SetTargetAddress(target1);
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
 }
 
@@ -67,9 +71,10 @@
 #if defined(USING_SIMULATOR)
 ASSEMBLER_TEST_GENERATE(JumpARMv6, assembler) {
   // ARMv7 is the default.
+  StubCode* stub_code = Isolate::Current()->stub_code();
   HostCPUFeatures::set_arm_version(ARMv6);
-  __ BranchPatchable(&StubCode::InvokeDartCodeLabel());
-  __ BranchPatchable(&StubCode::AllocateArrayLabel());
+  __ BranchPatchable(&stub_code->InvokeDartCodeLabel());
+  __ BranchPatchable(&stub_code->AllocateArrayLabel());
   HostCPUFeatures::set_arm_version(ARMv7);
 }
 
@@ -82,21 +87,22 @@
       VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
                              instrs.size(),
                              VirtualMemory::kReadWrite);
+  StubCode* stub_code = Isolate::Current()->stub_code();
   EXPECT(status);
   JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
                     test->code());
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump2.TargetAddress());
   uword target1 = jump1.TargetAddress();
   uword target2 = jump2.TargetAddress();
   jump1.SetTargetAddress(target2);
   jump2.SetTargetAddress(target1);
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
   HostCPUFeatures::set_arm_version(ARMv7);
 }
diff --git a/runtime/vm/instructions_ia32_test.cc b/runtime/vm/instructions_ia32_test.cc
index 43c804c..416c1c3 100644
--- a/runtime/vm/instructions_ia32_test.cc
+++ b/runtime/vm/instructions_ia32_test.cc
@@ -17,21 +17,24 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ call(&StubCode::InvokeDartCodeLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ call(&stub_code->InvokeDartCodeLabel());
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(Call, test) {
+  StubCode* stub_code = Isolate::Current()->stub_code();
   CallPattern call(test->entry());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             call.TargetAddress());
 }
 
 
 ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ jmp(&StubCode::InvokeDartCodeLabel());
-  __ jmp(&StubCode::AllocateArrayLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ jmp(&stub_code->InvokeDartCodeLabel());
+  __ jmp(&stub_code->AllocateArrayLabel());
   __ ret();
 }
 
@@ -39,25 +42,26 @@
 ASSEMBLER_TEST_RUN(Jump, test) {
   const Code& code = test->code();
   const Instructions& instrs = Instructions::Handle(code.instructions());
+  StubCode* stub_code = Isolate::Current()->stub_code();
   bool status =
       VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
                              instrs.size(),
                              VirtualMemory::kReadWrite);
   EXPECT(status);
   JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
                     test->code());
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump2.TargetAddress());
   uword target1 = jump1.TargetAddress();
   uword target2 = jump2.TargetAddress();
   jump1.SetTargetAddress(target2);
   jump2.SetTargetAddress(target1);
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
 }
 
diff --git a/runtime/vm/instructions_mips_test.cc b/runtime/vm/instructions_mips_test.cc
index 365395e..6d44ef8 100644
--- a/runtime/vm/instructions_mips_test.cc
+++ b/runtime/vm/instructions_mips_test.cc
@@ -15,7 +15,8 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ BranchLinkPatchable(&StubCode::InvokeDartCodeLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ BranchLinkPatchable(&stub_code->InvokeDartCodeLabel());
   __ Ret();
 }
 
@@ -27,14 +28,16 @@
   // return jump.
   CallPattern call(test->entry() + test->code().Size() - (2*Instr::kInstrSize),
                    test->code());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             call.TargetAddress());
 }
 
 
 ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ BranchPatchable(&StubCode::InvokeDartCodeLabel());
-  __ BranchPatchable(&StubCode::AllocateArrayLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ BranchPatchable(&stub_code->InvokeDartCodeLabel());
+  __ BranchPatchable(&stub_code->AllocateArrayLabel());
 }
 
 
@@ -45,21 +48,22 @@
       VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
                              instrs.size(),
                              VirtualMemory::kReadWrite);
+  StubCode* stub_code = Isolate::Current()->stub_code();
   EXPECT(status);
   JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
                     test->code());
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump2.TargetAddress());
   uword target1 = jump1.TargetAddress();
   uword target2 = jump2.TargetAddress();
   jump1.SetTargetAddress(target2);
   jump2.SetTargetAddress(target1);
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
 }
 
diff --git a/runtime/vm/instructions_x64_test.cc b/runtime/vm/instructions_x64_test.cc
index c217775..409d2e7 100644
--- a/runtime/vm/instructions_x64_test.cc
+++ b/runtime/vm/instructions_x64_test.cc
@@ -15,14 +15,16 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ call(&StubCode::InvokeDartCodeLabel());
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ call(&stub_code->InvokeDartCodeLabel());
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(Call, test) {
+  StubCode* stub_code = Isolate::Current()->stub_code();
   CallPattern call(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             call.TargetAddress());
 }
 
@@ -35,8 +37,9 @@
   __ pushq(PP);
   __ LoadPoolPointer(PP);
   prologue_code_size = assembler->CodeSize();
-  __ JmpPatchable(&StubCode::InvokeDartCodeLabel(), PP);
-  __ JmpPatchable(&StubCode::AllocateArrayLabel(), PP);
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ JmpPatchable(&stub_code->InvokeDartCodeLabel(), PP);
+  __ JmpPatchable(&stub_code->AllocateArrayLabel(), PP);
   __ popq(PP);
   __ ret();
 }
@@ -46,6 +49,7 @@
   ASSERT(prologue_code_size != -1);
   const Code& code = test->code();
   const Instructions& instrs = Instructions::Handle(code.instructions());
+  StubCode* stub_code = Isolate::Current()->stub_code();
   bool status =
       VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
                              instrs.size(),
@@ -53,20 +57,20 @@
   EXPECT(status);
   JumpPattern jump1(test->entry() + prologue_code_size, test->code());
   jump1.IsValid();
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2((test->entry() +
                      jump1.pattern_length_in_bytes() + prologue_code_size),
                     test->code());
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump2.TargetAddress());
   uword target1 = jump1.TargetAddress();
   uword target2 = jump2.TargetAddress();
   jump1.SetTargetAddress(target2);
   jump2.SetTargetAddress(target1);
-  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+  EXPECT_EQ(stub_code->AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
+  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
 }
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 2007daa..552fcfa 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -2054,7 +2054,7 @@
 void JoinEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_,
                                    Scanner::kNoSourcePos);
   }
@@ -2292,7 +2292,7 @@
   } else {
     // Unoptimized code.
     ASSERT(!HasICData());
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id(),
                                    token_pos());
     compiler->GenerateInstanceCall(deopt_id(),
@@ -2355,7 +2355,7 @@
   if (!compiler->is_optimizing()) {
     // Some static calls can be optimized by the optimizing compiler (e.g. sqrt)
     // and therefore need a deoptimization descriptor.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id(),
                                    token_pos());
   }
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 20a8439..de943f0 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -3884,7 +3884,7 @@
 class DebugStepCheckInstr : public TemplateInstruction<0> {
  public:
   DebugStepCheckInstr(intptr_t token_pos,
-                      PcDescriptors::Kind stub_kind)
+                      RawPcDescriptors::Kind stub_kind)
       : token_pos_(token_pos),
         stub_kind_(stub_kind) {
   }
@@ -3900,7 +3900,7 @@
 
  private:
   const intptr_t token_pos_;
-  const PcDescriptors::Kind stub_kind_;
+  const RawPcDescriptors::Kind stub_kind_;
 
   DISALLOW_COPY_AND_ASSIGN(DebugStepCheckInstr);
 };
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 65a494f..be5b506 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -219,7 +219,7 @@
   __ LoadImmediate(R5, 0);
   __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag);
   __ blx(R2);
-  compiler->AddCurrentDescriptor(PcDescriptors::kClosureCall,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kClosureCall,
                                  deopt_id(),
                                  token_pos());
   compiler->RecordSafepoint(locs());
@@ -231,7 +231,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_after,
                                    token_pos());
   }
@@ -913,7 +913,7 @@
   const Register result = locs()->out(0).reg();
 
   // Push the result place holder initialized to NULL.
-  __ PushObject(Object::ZoneHandle());
+  __ PushObject(Object::null_object());
   // Pass a pointer to the first argument in R2.
   if (!function().HasOptionalParameters()) {
     __ AddImmediate(R2, FP, (kParamEndSlotFromFp +
@@ -928,9 +928,10 @@
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
   const bool is_leaf_call =
     (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
+  StubCode* stub_code = compiler->isolate()->stub_code();
   const ExternalLabel* stub_entry;
   if (is_bootstrap_native() || is_leaf_call) {
-    stub_entry = &StubCode::CallBootstrapCFunctionLabel();
+    stub_entry = &stub_code->CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
         entry, Simulator::kBootstrapNativeCall, function().NumParameters());
@@ -939,7 +940,7 @@
     // In the case of non bootstrap native methods the CallNativeCFunction
     // stub generates the redirection address when running under the simulator
     // and hence we do not change 'entry' here.
-    stub_entry = &StubCode::CallNativeCFunctionLabel();
+    stub_entry = &stub_code->CallNativeCFunctionLabel();
 #if defined(USING_SIMULATOR)
     if (!function().IsNativeAutoSetupScope()) {
       entry = Simulator::RedirectExternalReference(
@@ -951,7 +952,7 @@
   __ LoadImmediate(R1, argc_tag);
   compiler->GenerateCall(token_pos(),
                          stub_entry,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
   __ Pop(result);
 }
@@ -1918,20 +1919,23 @@
       : instruction_(instruction), cls_(cls) { }
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
+
     __ Comment("StoreInstanceFieldSlowPath");
     __ Bind(entry_label());
 
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(cls_));
+        Code::Handle(isolate, stub_code->GetAllocationStubForClass(cls_));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    locs->live_registers()->Remove(locs->temp(0));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->temp(0).reg(), R0);
     compiler->RestoreLiveRegisters(locs);
@@ -2363,7 +2367,7 @@
       Label slow_path, done;
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
-      __ PushObject(Object::ZoneHandle());  // Make room for the result.
+      __ PushObject(Object::null_object());  // Make room for the result.
       __ Push(kLengthReg);  // length.
       __ Push(kElemTypeReg);
       compiler->GenerateRuntimeCall(token_pos(),
@@ -2378,9 +2382,10 @@
     }
   }
 
+  StubCode* stub_code = compiler->isolate()->stub_code();
   compiler->GenerateCall(token_pos(),
-                         &StubCode::AllocateArrayLabel(),
-                         PcDescriptors::kOther,
+                         &stub_code->AllocateArrayLabel(),
+                         RawPcDescriptors::kOther,
                          locs());
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
@@ -2394,18 +2399,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxDoubleSlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& double_class = compiler->double_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(double_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(double_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->out(0).reg(), R0);
     compiler->RestoreLiveRegisters(locs);
@@ -2426,18 +2434,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxFloat32x4SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& float32x4_class = compiler->float32x4_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(float32x4_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ mov(locs->out(0).reg(), Operand(R0));
     compiler->RestoreLiveRegisters(locs);
@@ -2458,18 +2469,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxFloat64x2SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& float64x2_class = compiler->float64x2_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(float64x2_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ mov(locs->out(0).reg(), Operand(R0));
     compiler->RestoreLiveRegisters(locs);
@@ -2651,7 +2665,7 @@
 
   // 'instantiator_reg' is the instantiator TypeArguments object (or null).
   // A runtime call to instantiate the type is required.
-  __ PushObject(Object::ZoneHandle());  // Make room for the result.
+  __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type());
   __ Push(instantiator_reg);  // Push instantiator type arguments.
   compiler->GenerateRuntimeCall(token_pos(),
@@ -2720,7 +2734,7 @@
   __ Bind(&slow_case);
   // Instantiate non-null type arguments.
   // A runtime call to instantiate the type arguments is required.
-  __ PushObject(Object::ZoneHandle());  // Make room for the result.
+  __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type_arguments());
   __ Push(instantiator_reg);  // Push instantiator type arguments.
   compiler->GenerateRuntimeCall(token_pos(),
@@ -2751,10 +2765,11 @@
   ASSERT(locs()->out(0).reg() == R0);
 
   __ LoadImmediate(R1, num_context_variables());
-  const ExternalLabel label(StubCode::AllocateContextEntryPoint());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  const ExternalLabel label(stub_code->AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
 }
 
@@ -2775,7 +2790,7 @@
   const Register context_value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
 
-  __ PushObject(Object::ZoneHandle());  // Make room for the result.
+  __ PushObject(Object::null_object());  // Make room for the result.
   __ Push(context_value);
   compiler->GenerateRuntimeCall(token_pos(),
                                 deopt_id(),
@@ -2869,7 +2884,7 @@
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
-      compiler->AddCurrentDescriptor(PcDescriptors::kOsrEntry,
+      compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
                                      instruction_->deopt_id(),
                                      0);  // No token position.
     }
@@ -3694,18 +3709,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxInt32x4SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& int32x4_class = compiler->int32x4_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(int32x4_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ mov(locs->out(0).reg(), Operand(R0));
     compiler->RestoreLiveRegisters(locs);
@@ -5913,19 +5931,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxIntegerSlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& mint_class =
-        Class::ZoneHandle(Isolate::Current()->object_store()->mint_class());
+        Class::ZoneHandle(isolate->object_store()->mint_class());
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(mint_class));
+        Code::Handle(isolate, stub_code->GetAllocationStubForClass(mint_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ mov(locs->out(0).reg(), Operand(R0));
     compiler->RestoreLiveRegisters(locs);
@@ -6261,7 +6281,7 @@
     // On ARM the deoptimization descriptor points after the edge counter
     // code so that we can reuse the same pattern matching code as at call
     // sites, which matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_,
                                    Scanner::kNoSourcePos);
   }
@@ -6287,7 +6307,7 @@
     // points after the edge counter code so that we can reuse the same
     // pattern matching code as at call sites, which matches backwards from
     // the end of the pattern.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    GetDeoptId(),
                                    Scanner::kNoSourcePos);
   }
@@ -6417,11 +6437,14 @@
 
 
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
+  Isolate* isolate = compiler->isolate();
+  StubCode* stub_code = isolate->stub_code();
+  const Code& stub = Code::Handle(isolate,
+                                  stub_code->GetAllocationStubForClass(cls()));
   const ExternalLabel label(stub.EntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
   __ Drop(ArgumentCount());  // Discard arguments.
 }
@@ -6429,7 +6452,8 @@
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  const ExternalLabel label(StubCode::DebugStepCheckEntryPoint());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  const ExternalLabel label(stub_code->DebugStepCheckEntryPoint());
   __ LoadImmediate(R4, 0);
   __ LoadImmediate(R5, 0);
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 3334c82..4029e04 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -214,7 +214,7 @@
   __ LoadImmediate(R5, 0, PP);
   __ AddImmediate(R2, R2, Instructions::HeaderSize() - kHeapObjectTag, PP);
   __ blr(R2);
-  compiler->AddCurrentDescriptor(PcDescriptors::kClosureCall,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kClosureCall,
                                  deopt_id(),
                                  token_pos());
   compiler->RecordSafepoint(locs());
@@ -226,7 +226,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_after,
                                    token_pos());
   }
@@ -758,7 +758,7 @@
   const Register result = locs()->out(0).reg();
 
   // Push the result place holder initialized to NULL.
-  __ PushObject(Object::ZoneHandle(), PP);
+  __ PushObject(Object::null_object(), PP);
   // Pass a pointer to the first argument in R2.
   if (!function().HasOptionalParameters()) {
     __ AddImmediate(R2, FP, (kParamEndSlotFromFp +
@@ -773,9 +773,10 @@
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
   const bool is_leaf_call =
     (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
+  StubCode* stub_code = compiler->isolate()->stub_code();
   const ExternalLabel* stub_entry;
   if (is_bootstrap_native() || is_leaf_call) {
-    stub_entry = &StubCode::CallBootstrapCFunctionLabel();
+    stub_entry = &stub_code->CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
         entry, Simulator::kBootstrapNativeCall, function().NumParameters());
@@ -784,7 +785,7 @@
     // In the case of non bootstrap native methods the CallNativeCFunction
     // stub generates the redirection address when running under the simulator
     // and hence we do not change 'entry' here.
-    stub_entry = &StubCode::CallNativeCFunctionLabel();
+    stub_entry = &stub_code->CallNativeCFunctionLabel();
 #if defined(USING_SIMULATOR)
     if (!function().IsNativeAutoSetupScope()) {
       entry = Simulator::RedirectExternalReference(
@@ -796,7 +797,7 @@
   __ LoadImmediate(R1, argc_tag, PP);
   compiler->GenerateCall(token_pos(),
                          stub_entry,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
   __ Pop(result);
 }
@@ -1606,20 +1607,23 @@
       : instruction_(instruction), cls_(cls) { }
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
+
     __ Comment("StoreInstanceFieldSlowPath");
     __ Bind(entry_label());
 
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(cls_));
+        Code::Handle(isolate, stub_code->GetAllocationStubForClass(cls_));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    locs->live_registers()->Remove(locs->temp(0));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ mov(locs->temp(0).reg(), R0);
     compiler->RestoreLiveRegisters(locs);
@@ -1962,9 +1966,10 @@
   // Allocate the array.  R2 = length, R1 = element type.
   ASSERT(locs()->in(kElementTypePos).reg() == R1);
   ASSERT(locs()->in(kLengthPos).reg() == R2);
+  StubCode* stub_code = compiler->isolate()->stub_code();
   compiler->GenerateCall(token_pos(),
-                         &StubCode::AllocateArrayLabel(),
-                         PcDescriptors::kOther,
+                         &stub_code->AllocateArrayLabel(),
+                         RawPcDescriptors::kOther,
                          locs());
   ASSERT(locs()->out(0).reg() == R0);
 }
@@ -1978,18 +1983,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxDoubleSlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& double_class = compiler->double_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(double_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(double_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ mov(locs->out(0).reg(), R0);
     compiler->RestoreLiveRegisters(locs);
@@ -2010,18 +2018,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxFloat32x4SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& float32x4_class = compiler->float32x4_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(float32x4_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ mov(locs->out(0).reg(), R0);
     compiler->RestoreLiveRegisters(locs);
@@ -2042,18 +2053,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxFloat64x2SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& float64x2_class = compiler->float64x2_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(float64x2_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ mov(locs->out(0).reg(), R0);
     compiler->RestoreLiveRegisters(locs);
@@ -2227,7 +2241,7 @@
 
   // 'instantiator_reg' is the instantiator TypeArguments object (or null).
   // A runtime call to instantiate the type is required.
-  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ PushObject(Object::null_object(), PP);  // Make room for the result.
   __ PushObject(type(), PP);
   __ Push(instantiator_reg);  // Push instantiator type arguments.
   compiler->GenerateRuntimeCall(token_pos(),
@@ -2295,7 +2309,7 @@
   __ Bind(&slow_case);
   // Instantiate non-null type arguments.
   // A runtime call to instantiate the type arguments is required.
-  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ PushObject(Object::null_object(), PP);  // Make room for the result.
   __ PushObject(type_arguments(), PP);
   __ Push(instantiator_reg);  // Push instantiator type arguments.
   compiler->GenerateRuntimeCall(token_pos(),
@@ -2326,10 +2340,11 @@
   ASSERT(locs()->out(0).reg() == R0);
 
   __ LoadImmediate(R1, num_context_variables(), PP);
-  const ExternalLabel label(StubCode::AllocateContextEntryPoint());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  const ExternalLabel label(stub_code->AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
 }
 
@@ -2350,7 +2365,7 @@
   const Register context_value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
 
-  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ PushObject(Object::null_object(), PP);  // Make room for the result.
   __ Push(context_value);
   compiler->GenerateRuntimeCall(token_pos(),
                                 deopt_id(),
@@ -2442,7 +2457,7 @@
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
-      compiler->AddCurrentDescriptor(PcDescriptors::kOsrEntry,
+      compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
                                      instruction_->deopt_id(),
                                      0);  // No token position.
     }
@@ -3197,18 +3212,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxInt32x4SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& int32x4_class = compiler->int32x4_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(int32x4_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ mov(locs->out(0).reg(), R0);
     compiler->RestoreLiveRegisters(locs);
@@ -5168,7 +5186,7 @@
     // On ARM64 the deoptimization descriptor points after the edge counter
     // code so that we can reuse the same pattern matching code as at call
     // sites, which matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_,
                                    Scanner::kNoSourcePos);
   }
@@ -5194,7 +5212,7 @@
     // points after the edge counter code so that we can reuse the same
     // pattern matching code as at call sites, which matches backwards from
     // the end of the pattern.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    GetDeoptId(),
                                    Scanner::kNoSourcePos);
   }
@@ -5332,11 +5350,14 @@
 
 
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
+  Isolate* isolate = compiler->isolate();
+  StubCode* stub_code = isolate->stub_code();
+  const Code& stub = Code::Handle(isolate,
+                                  stub_code->GetAllocationStubForClass(cls()));
   const ExternalLabel label(stub.EntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
   __ Drop(ArgumentCount());  // Discard arguments.
 }
@@ -5344,7 +5365,8 @@
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  const ExternalLabel label(StubCode::DebugStepCheckEntryPoint());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  const ExternalLabel label(stub_code->DebugStepCheckEntryPoint());
   __ LoadImmediate(R4, 0, kNoPP);
   __ LoadImmediate(R5, 0, kNoPP);
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index ea956ee..e1d3215 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -800,9 +800,10 @@
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
   const bool is_leaf_call =
       (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
+  StubCode* stub_code = compiler->isolate()->stub_code();
 
   // Push the result place holder initialized to NULL.
-  __ PushObject(Object::ZoneHandle());
+  __ PushObject(Object::null_object());
   // Pass a pointer to the first argument in EAX.
   if (!function().HasOptionalParameters()) {
     __ leal(EAX, Address(EBP, (kParamEndSlotFromFp +
@@ -813,11 +814,11 @@
   __ movl(ECX, Immediate(reinterpret_cast<uword>(native_c_function())));
   __ movl(EDX, Immediate(argc_tag));
   const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ?
-      &StubCode::CallBootstrapCFunctionLabel() :
-      &StubCode::CallNativeCFunctionLabel();
+      &stub_code->CallBootstrapCFunctionLabel() :
+      &stub_code->CallNativeCFunctionLabel();
   compiler->GenerateCall(token_pos(),
                          stub_entry,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
   __ popl(result);
 }
@@ -1709,16 +1710,19 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("StoreInstanceFieldSlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(cls_));
+        Code::Handle(isolate,
+                     isolate->stub_code()->GetAllocationStubForClass(cls_));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    locs->live_registers()->Remove(locs->temp(0));
+
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->temp(0).reg(), EAX);
     compiler->RestoreLiveRegisters(locs);
@@ -2167,7 +2171,7 @@
       Label slow_path, done;
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
-      __ PushObject(Object::ZoneHandle());  // Make room for the result.
+      __ PushObject(Object::null_object());  // Make room for the result.
       __ pushl(kLengthReg);
       __ pushl(kElemTypeReg);
       compiler->GenerateRuntimeCall(token_pos(),
@@ -2183,9 +2187,10 @@
   }
 
   __ Bind(&slow_path);
+  StubCode* stub_code = compiler->isolate()->stub_code();
   compiler->GenerateCall(token_pos(),
-                         &StubCode::AllocateArrayLabel(),
-                         PcDescriptors::kOther,
+                         &stub_code->AllocateArrayLabel(),
+                         RawPcDescriptors::kOther,
                          locs());
   __ Bind(&done);
   ASSERT(locs()->out(0).reg() == kResultReg);
@@ -2200,18 +2205,20 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxDoubleSlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& double_class = compiler->double_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(double_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(double_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
-
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->out(0).reg(), EAX);
     compiler->RestoreLiveRegisters(locs);
@@ -2232,18 +2239,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxFloat32x4SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& float32x4_class = compiler->float32x4_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(float32x4_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->out(0).reg(), EAX);
     compiler->RestoreLiveRegisters(locs);
@@ -2264,18 +2274,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxFloat64x2SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& float64x2_class = compiler->float64x2_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(float64x2_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->out(0).reg(), EAX);
     compiler->RestoreLiveRegisters(locs);
@@ -2455,7 +2468,7 @@
 
   // 'instantiator_reg' is the instantiator TypeArguments object (or null).
   // A runtime call to instantiate the type is required.
-  __ PushObject(Object::ZoneHandle());  // Make room for the result.
+  __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type());
   __ pushl(instantiator_reg);  // Push instantiator type arguments.
   compiler->GenerateRuntimeCall(token_pos(),
@@ -2527,7 +2540,7 @@
   __ Bind(&slow_case);
   // Instantiate non-null type arguments.
   // A runtime call to instantiate the type arguments is required.
-  __ PushObject(Object::ZoneHandle());  // Make room for the result.
+  __ PushObject(Object::null_object());  // Make room for the result.
   __ PushObject(type_arguments());
   __ pushl(instantiator_reg);  // Push instantiator type arguments.
   compiler->GenerateRuntimeCall(token_pos(),
@@ -2573,15 +2586,16 @@
     __ Bind(entry_label());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
 
     __ movl(EDX, Immediate(instruction_->num_context_variables()));
-    const ExternalLabel label(StubCode::AllocateContextEntryPoint());
+    StubCode* stub_code = compiler->isolate()->stub_code();
+    const ExternalLabel label(stub_code->AllocateContextEntryPoint());
     compiler->GenerateCall(instruction_->token_pos(),
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     ASSERT(instruction_->locs()->out(0).reg() == EAX);
     compiler->RestoreLiveRegisters(instruction_->locs());
@@ -2668,10 +2682,11 @@
   ASSERT(locs()->out(0).reg() == EAX);
 
   __ movl(EDX, Immediate(num_context_variables()));
-  const ExternalLabel label(StubCode::AllocateContextEntryPoint());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  const ExternalLabel label(stub_code->AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
 }
 
@@ -2692,7 +2707,7 @@
   Register context_value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
 
-  __ PushObject(Object::ZoneHandle());  // Make room for the result.
+  __ PushObject(Object::null_object());  // Make room for the result.
   __ pushl(context_value);
   compiler->GenerateRuntimeCall(token_pos(),
                                 deopt_id(),
@@ -2779,7 +2794,7 @@
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
-      compiler->AddCurrentDescriptor(PcDescriptors::kOsrEntry,
+      compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
                                      instruction_->deopt_id(),
                                      0);  // No token position.
     }
@@ -3607,18 +3622,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxInt32x4SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& int32x4_class = compiler->int32x4_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(int32x4_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->out(0).reg(), EAX);
     compiler->RestoreLiveRegisters(locs);
@@ -5688,19 +5706,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxIntegerSlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& mint_class =
-        Class::ZoneHandle(Isolate::Current()->object_store()->mint_class());
+        Class::ZoneHandle(isolate, isolate->object_store()->mint_class());
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(mint_class));
+        Code::Handle(isolate, stub_code->GetAllocationStubForClass(mint_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->out(0).reg(), EAX);
     compiler->RestoreLiveRegisters(locs);
@@ -6035,7 +6055,7 @@
     // The deoptimization descriptor points after the edge counter code for
     // uniformity with ARM and MIPS, where we can reuse pattern matching
     // code that matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_,
                                    Scanner::kNoSourcePos);
   }
@@ -6061,7 +6081,7 @@
     // after the edge counter for uniformity with ARM and MIPS, where we can
     // reuse pattern matching that matches backwards from the end of the
     // pattern.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    GetDeoptId(),
                                    Scanner::kNoSourcePos);
   }
@@ -6266,7 +6286,7 @@
   __ xorl(ECX, ECX);
   __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ call(EBX);
-  compiler->AddCurrentDescriptor(PcDescriptors::kClosureCall,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kClosureCall,
                                  deopt_id(),
                                  token_pos());
   compiler->RecordSafepoint(locs());
@@ -6278,7 +6298,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_after,
                                    token_pos());
   }
@@ -6315,11 +6335,14 @@
 
 
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
+  Isolate* isolate = compiler->isolate();
+  StubCode* stub_code = isolate->stub_code();
+  const Code& stub = Code::Handle(isolate,
+                                  stub_code->GetAllocationStubForClass(cls()));
   const ExternalLabel label(stub.EntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
   __ Drop(ArgumentCount());  // Discard arguments.
 }
@@ -6327,7 +6350,8 @@
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  const ExternalLabel label(StubCode::DebugStepCheckEntryPoint());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  const ExternalLabel label(stub_code->DebugStepCheckEntryPoint());
   __ movl(EDX, Immediate(0));
   __ movl(ECX, Immediate(0));
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index b41b223..032933b 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -239,7 +239,7 @@
   __ lw(T2, FieldAddress(T0, Function::instructions_offset()));
   __ AddImmediate(T2, Instructions::HeaderSize() - kHeapObjectTag);
   __ jalr(T2);
-  compiler->AddCurrentDescriptor(PcDescriptors::kClosureCall,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kClosureCall,
                                  deopt_id(),
                                  token_pos());
   compiler->RecordSafepoint(locs());
@@ -251,7 +251,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_after,
                                    token_pos());
   }
@@ -868,7 +868,7 @@
   Register result = locs()->out(0).reg();
 
   // Push the result place holder initialized to NULL.
-  __ PushObject(Object::ZoneHandle());
+  __ PushObject(Object::null_object());
   // Pass a pointer to the first argument in A2.
   if (!function().HasOptionalParameters()) {
     __ AddImmediate(A2, FP, (kParamEndSlotFromFp +
@@ -883,9 +883,10 @@
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
   const bool is_leaf_call =
     (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
+  StubCode* stub_code = compiler->isolate()->stub_code();
   const ExternalLabel* stub_entry;
   if (is_bootstrap_native() || is_leaf_call) {
-    stub_entry = &StubCode::CallBootstrapCFunctionLabel();
+    stub_entry = &stub_code->CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
         entry, Simulator::kBootstrapNativeCall, function().NumParameters());
@@ -894,7 +895,7 @@
     // In the case of non bootstrap native methods the CallNativeCFunction
     // stub generates the redirection address when running under the simulator
     // and hence we do not change 'entry' here.
-    stub_entry = &StubCode::CallNativeCFunctionLabel();
+    stub_entry = &stub_code->CallNativeCFunctionLabel();
 #if defined(USING_SIMULATOR)
     if (!function().IsNativeAutoSetupScope()) {
       entry = Simulator::RedirectExternalReference(
@@ -906,7 +907,7 @@
   __ LoadImmediate(A1, argc_tag);
   compiler->GenerateCall(token_pos(),
                          stub_entry,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
   __ Pop(result);
 }
@@ -1722,19 +1723,22 @@
       : instruction_(instruction), cls_(cls) { }
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
+
     __ Comment("StoreInstanceFieldSlowPath");
     __ Bind(entry_label());
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(cls_));
+        Code::Handle(isolate, stub_code->GetAllocationStubForClass(cls_));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    locs->live_registers()->Remove(locs->temp(0));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ mov(locs->temp(0).reg(), V0);
     compiler->RestoreLiveRegisters(locs);
@@ -2095,7 +2099,7 @@
       Label slow_path, done;
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
-      __ PushObject(Object::ZoneHandle());  // Make room for the result.
+      __ PushObject(Object::null_object());  // Make room for the result.
       __ Push(kLengthReg);  // length.
       __ Push(kElemTypeReg);
       compiler->GenerateRuntimeCall(token_pos(),
@@ -2111,9 +2115,10 @@
   }
 
   __ Bind(&slow_path);
+  StubCode* stub_code = compiler->isolate()->stub_code();
   compiler->GenerateCall(token_pos(),
-                         &StubCode::AllocateArrayLabel(),
-                         PcDescriptors::kOther,
+                         &stub_code->AllocateArrayLabel(),
+                         RawPcDescriptors::kOther,
                          locs());
   __ Bind(&done);
   ASSERT(locs()->out(0).reg() == kResultReg);
@@ -2128,18 +2133,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxDoubleSlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& double_class = compiler->double_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(double_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(double_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     if (locs->out(0).reg() != V0) {
       __ mov(locs->out(0).reg(), V0);
@@ -2272,7 +2280,7 @@
   // 'instantiator_reg' is the instantiator TypeArguments object (or null).
   // A runtime call to instantiate the type is required.
   __ addiu(SP, SP, Immediate(-3 * kWordSize));
-  __ LoadObject(TMP, Object::ZoneHandle());
+  __ LoadObject(TMP, Object::null_object());
   __ sw(TMP, Address(SP, 2 * kWordSize));  // Make room for the result.
   __ LoadObject(TMP, type());
   __ sw(TMP, Address(SP, 1 * kWordSize));
@@ -2346,7 +2354,7 @@
   // Instantiate non-null type arguments.
   // A runtime call to instantiate the type arguments is required.
   __ addiu(SP, SP, Immediate(-3 * kWordSize));
-  __ LoadObject(TMP, Object::ZoneHandle());
+  __ LoadObject(TMP, Object::null_object());
   __ sw(TMP, Address(SP, 2 * kWordSize));  // Make room for the result.
   __ LoadObject(TMP, type_arguments());
   __ sw(TMP, Address(SP, 1 * kWordSize));
@@ -2385,10 +2393,11 @@
 
   __ TraceSimMsg("AllocateContextInstr");
   __ LoadImmediate(temp, num_context_variables());
-  const ExternalLabel label(StubCode::AllocateContextEntryPoint());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  const ExternalLabel label(stub_code->AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
 }
 
@@ -2412,7 +2421,7 @@
   __ TraceSimMsg("CloneContextInstr");
 
   __ addiu(SP, SP, Immediate(-2 * kWordSize));
-  __ LoadObject(TMP, Object::ZoneHandle());  // Make room for the result.
+  __ LoadObject(TMP, Object::null_object());  // Make room for the result.
   __ sw(TMP, Address(SP, 1 * kWordSize));
   __ sw(context_value, Address(SP, 0 * kWordSize));
 
@@ -2513,7 +2522,7 @@
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
-      compiler->AddCurrentDescriptor(PcDescriptors::kOsrEntry,
+      compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
                                      instruction_->deopt_id(),
                                      0);  // No token position.
     }
@@ -4510,7 +4519,7 @@
     // On MIPS the deoptimization descriptor points after the edge counter
     // code so that we can reuse the same pattern matching code as at call
     // sites, which matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_,
                                    Scanner::kNoSourcePos);
   }
@@ -4537,7 +4546,7 @@
     // points after the edge counter code so that we can reuse the same
     // pattern matching code as at call sites, which matches backwards from
     // the end of the pattern.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    GetDeoptId(),
                                    Scanner::kNoSourcePos);
   }
@@ -4679,11 +4688,14 @@
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("AllocateObjectInstr");
   __ Comment("AllocateObjectInstr");
-  const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
+  Isolate* isolate = compiler->isolate();
+  StubCode* stub_code = isolate->stub_code();
+  const Code& stub = Code::Handle(isolate,
+                                  stub_code->GetAllocationStubForClass(cls()));
   const ExternalLabel label(stub.EntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
   __ Drop(ArgumentCount());  // Discard arguments.
 }
@@ -4691,7 +4703,8 @@
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  const ExternalLabel label(StubCode::DebugStepCheckEntryPoint());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  const ExternalLabel label(stub_code->DebugStepCheckEntryPoint());
   __ LoadImmediate(S4, 0);
   __ LoadImmediate(S5, 0);
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 069af17..119976e 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -727,9 +727,10 @@
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
   const bool is_leaf_call =
     (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
+  StubCode* stub_code = compiler->isolate()->stub_code();
 
   // Push the result place holder initialized to NULL.
-  __ PushObject(Object::ZoneHandle(), PP);
+  __ PushObject(Object::null_object(), PP);
   // Pass a pointer to the first argument in RAX.
   if (!function().HasOptionalParameters()) {
     __ leaq(RAX, Address(RBP, (kParamEndSlotFromFp +
@@ -743,11 +744,11 @@
   __ LoadImmediate(
       R10, Immediate(argc_tag), PP);
   const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ?
-      &StubCode::CallBootstrapCFunctionLabel() :
-      &StubCode::CallNativeCFunctionLabel();
+      &stub_code->CallBootstrapCFunctionLabel() :
+      &stub_code->CallNativeCFunctionLabel();
   compiler->GenerateCall(token_pos(),
                          stub_entry,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
   __ popq(result);
 }
@@ -1550,17 +1551,19 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("StoreInstanceFieldSlowPath");
     __ Bind(entry_label());
-    const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(cls_));
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
+    const Code& stub = Code::Handle(isolate,
+                                    stub_code->GetAllocationStubForClass(cls_));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    locs->live_registers()->Remove(locs->temp(0));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->temp(0).reg(), RAX);
     compiler->RestoreLiveRegisters(locs);
@@ -2001,7 +2004,7 @@
       Label slow_path, done;
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
-      __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+      __ PushObject(Object::null_object(), PP);  // Make room for the result.
       __ pushq(kLengthReg);
       __ pushq(kElemTypeReg);
       compiler->GenerateRuntimeCall(token_pos(),
@@ -2017,9 +2020,10 @@
   }
 
   __ Bind(&slow_path);
+  StubCode* stub_code = compiler->isolate()->stub_code();
   compiler->GenerateCall(token_pos(),
-                         &StubCode::AllocateArrayLabel(),
-                         PcDescriptors::kOther,
+                         &stub_code->AllocateArrayLabel(),
+                         RawPcDescriptors::kOther,
                          locs());
   __ Bind(&done);
   ASSERT(locs()->out(0).reg() == kResultReg);
@@ -2034,18 +2038,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxDoubleSlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& double_class = compiler->double_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(double_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(double_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->out(0).reg(), RAX);
     compiler->RestoreLiveRegisters(locs);
@@ -2066,18 +2073,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxFloat32x4SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& float32x4_class = compiler->float32x4_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(float32x4_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->out(0).reg(), RAX);
     compiler->RestoreLiveRegisters(locs);
@@ -2098,18 +2108,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxFloat64x2SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& float64x2_class = compiler->float64x2_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(float64x2_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->out(0).reg(), RAX);
     compiler->RestoreLiveRegisters(locs);
@@ -2286,7 +2299,7 @@
 
   // 'instantiator_reg' is the instantiator TypeArguments object (or null).
   // A runtime call to instantiate the type is required.
-  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ PushObject(Object::null_object(), PP);  // Make room for the result.
   __ PushObject(type(), PP);
   __ pushq(instantiator_reg);  // Push instantiator type arguments.
   compiler->GenerateRuntimeCall(token_pos(),
@@ -2357,7 +2370,7 @@
   __ Bind(&slow_case);
   // Instantiate non-null type arguments.
   // A runtime call to instantiate the type arguments is required.
-  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ PushObject(Object::null_object(), PP);  // Make room for the result.
   __ PushObject(type_arguments(), PP);
   __ pushq(instantiator_reg);  // Push instantiator type arguments.
   compiler->GenerateRuntimeCall(token_pos(),
@@ -2387,12 +2400,13 @@
 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(locs()->temp(0).reg() == R10);
   ASSERT(locs()->out(0).reg() == RAX);
+  StubCode* stub_code = compiler->isolate()->stub_code();
 
   __ LoadImmediate(R10, Immediate(num_context_variables()), PP);
-  const ExternalLabel label(StubCode::AllocateContextEntryPoint());
+  const ExternalLabel label(stub_code->AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
 }
 
@@ -2413,7 +2427,7 @@
   Register context_value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
 
-  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ PushObject(Object::null_object(), PP);  // Make room for the result.
   __ pushq(context_value);
   compiler->GenerateRuntimeCall(token_pos(),
                                 deopt_id(),
@@ -2506,7 +2520,7 @@
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
-      compiler->AddCurrentDescriptor(PcDescriptors::kOsrEntry,
+      compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
                                      instruction_->deopt_id(),
                                      0);  // No token position.
     }
@@ -3428,18 +3442,21 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     __ Comment("BoxInt32x4SlowPath");
     __ Bind(entry_label());
+    Isolate* isolate = compiler->isolate();
+    StubCode* stub_code = isolate->stub_code();
     const Class& int32x4_class = compiler->int32x4_class();
     const Code& stub =
-        Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
+        Code::Handle(isolate,
+                     stub_code->GetAllocationStubForClass(int32x4_class));
     const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
-    locs->live_registers()->Remove(locs->out(0));
+    ASSERT(!locs->live_registers()->Contains(locs->out(0)));
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
                            &label,
-                           PcDescriptors::kOther,
+                           RawPcDescriptors::kOther,
                            locs);
     __ MoveRegister(locs->out(0).reg(), RAX);
     compiler->RestoreLiveRegisters(locs);
@@ -5604,7 +5621,7 @@
     // The deoptimization descriptor points after the edge counter code for
     // uniformity with ARM and MIPS, where we can reuse pattern matching
     // code that matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_,
                                    Scanner::kNoSourcePos);
   }
@@ -5630,7 +5647,7 @@
     // after the edge counter for uniformity with ARM and MIPS, where we can
     // reuse pattern matching that matches backwards from the end of the
     // pattern.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    GetDeoptId(),
                                    Scanner::kNoSourcePos);
   }
@@ -5772,7 +5789,7 @@
   __ xorq(RBX, RBX);
   __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ call(RCX);
-  compiler->AddCurrentDescriptor(PcDescriptors::kClosureCall,
+  compiler->AddCurrentDescriptor(RawPcDescriptors::kClosureCall,
                                  deopt_id(),
                                  token_pos());
   compiler->RecordSafepoint(locs());
@@ -5784,7 +5801,7 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id_after,
                                    token_pos());
   }
@@ -5821,11 +5838,14 @@
 
 
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
+  Isolate* isolate = compiler->isolate();
+  StubCode* stub_code = isolate->stub_code();
+  const Code& stub = Code::Handle(isolate,
+                                  stub_code->GetAllocationStubForClass(cls()));
   const ExternalLabel label(stub.EntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
-                         PcDescriptors::kOther,
+                         RawPcDescriptors::kOther,
                          locs());
   __ Drop(ArgumentCount());  // Discard arguments.
 }
@@ -5833,7 +5853,8 @@
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  const ExternalLabel label(StubCode::DebugStepCheckEntryPoint());
+  StubCode* stub_code = compiler->isolate()->stub_code();
+  const ExternalLabel label(stub_code->DebugStepCheckEntryPoint());
   __ movq(R10, Immediate(0));
   __ movq(RBX, Immediate(0));
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 18ab3ee..e1e527f 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -83,6 +83,13 @@
                                          const UnhandledException& error);
 
  private:
+  // Keep in sync with isolate_patch.dart.
+  enum {
+    kPauseMsg = 1,
+    kResumeMsg
+  };
+
+  void HandleLibMessage(const Array& message);
   bool ProcessUnhandledException(const Object& message, const Error& result);
   RawFunction* ResolveCallbackFunction();
   Isolate* isolate_;
@@ -102,6 +109,51 @@
 }
 
 
+// Isolate library OOB messages are fixed sized arrays which have the
+// following format:
+// [ OOB dispatch, Isolate library dispatch, <message specific data> ]
+void IsolateMessageHandler::HandleLibMessage(const Array& message) {
+  if (message.Length() < 2) return;
+  const Object& type = Object::Handle(I, message.At(1));
+  if (!type.IsSmi()) return;
+  const Smi& msg_type = Smi::Cast(type);
+  switch (msg_type.Value()) {
+    case kPauseMsg: {
+      // [ OOB, kPauseMsg, pause capability, resume capability ]
+      if (message.Length() != 4) return;
+      Object& obj = Object::Handle(I, message.At(2));
+      if (!obj.IsCapability()) return;
+      if (!I->VerifyPauseCapability(Capability::Cast(obj))) return;
+      obj = message.At(3);
+      if (!obj.IsCapability()) return;
+      if (I->AddResumeCapability(Capability::Cast(obj))) {
+        increment_paused();
+      }
+      break;
+    }
+    case kResumeMsg: {
+      // [ OOB, kResumeMsg, pause capability, resume capability ]
+      if (message.Length() != 4) return;
+      Object& obj = Object::Handle(I, message.At(2));
+      if (!obj.IsCapability()) return;
+      if (!I->VerifyPauseCapability(Capability::Cast(obj))) return;
+      obj = message.At(3);
+      if (!obj.IsCapability()) return;
+      if (I->RemoveResumeCapability(Capability::Cast(obj))) {
+        decrement_paused();
+      }
+      break;
+    }
+#if defined(DEBUG)
+    // Malformed OOB messages are silently ignored in release builds.
+    default:
+      UNREACHABLE();
+      break;
+#endif  // defined(DEBUG)
+  }
+}
+
+
 void IsolateMessageHandler::MessageNotify(Message::Priority priority) {
   if (priority >= Message::kOOBPriority) {
     // Handle out of band messages even if the isolate is busy.
@@ -129,6 +181,7 @@
   if (!message->IsOOB()) {
     msg_handler = DartLibraryCalls::LookupHandler(message->dest_port());
     if (msg_handler.IsError()) {
+      delete message;
       return ProcessUnhandledException(Object::null_instance(),
                                        Error::Cast(msg_handler));
     }
@@ -149,6 +202,7 @@
   const Object& msg_obj = Object::Handle(I, reader.ReadObject());
   if (msg_obj.IsError()) {
     // An error occurred while reading the message.
+    delete message;
     return ProcessUnhandledException(Object::null_instance(),
                                      Error::Cast(msg_obj));
   }
@@ -166,17 +220,32 @@
 
   bool success = true;
   if (message->IsOOB()) {
-    ASSERT(msg.IsArray());
-    const Object& oob_tag = Object::Handle(I, Array::Cast(msg).At(0));
-    ASSERT(oob_tag.IsSmi());
-    switch (Smi::Cast(oob_tag).Value()) {
-      case Message::kServiceOOBMsg: {
-        Service::HandleIsolateMessage(I, msg);
-        break;
-      }
-      default: {
-        UNREACHABLE();
-        break;
+    // OOB messages are expected to be fixed length arrays where the first
+    // element is a Smi describing the OOB destination. Messages that do not
+    // confirm to this layout are silently ignored.
+    if (msg.IsArray()) {
+      const Array& oob_msg = Array::Cast(msg);
+      if (oob_msg.Length() > 0) {
+        const Object& oob_tag = Object::Handle(I, oob_msg.At(0));
+        if (oob_tag.IsSmi()) {
+          switch (Smi::Cast(oob_tag).Value()) {
+            case Message::kServiceOOBMsg: {
+              Service::HandleIsolateMessage(I, oob_msg);
+              break;
+            }
+            case Message::kIsolateLibOOBMsg: {
+              HandleLibMessage(oob_msg);
+              break;
+            }
+#if defined(DEBUG)
+            // Malformed OOB messages are silently ignored in release builds.
+            default: {
+              UNREACHABLE();
+              break;
+            }
+#endif  // defined(DEBUG)
+          }
+        }
       }
     }
   } else {
@@ -320,6 +389,8 @@
       name_(NULL),
       start_time_(OS::GetCurrentTimeMicros()),
       main_port_(0),
+      pause_capability_(0),
+      terminate_capability_(0),
       heap_(NULL),
       object_store_(NULL),
       top_context_(Context::null()),
@@ -463,6 +534,9 @@
   // main thread.
   result->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(&result));
   result->set_main_port(PortMap::CreatePort(result->message_handler()));
+  result->set_pause_capability(result->random()->NextUInt64());
+  result->set_terminate_capability(result->random()->NextUInt64());
+
   result->BuildName(name_prefix);
 
   result->debugger_ = new Debugger();
@@ -593,6 +667,61 @@
 }
 
 
+bool Isolate::VerifyPauseCapability(const Capability& capability) const {
+  return !capability.IsNull() && (pause_capability() == capability.Id());
+}
+
+
+bool Isolate::AddResumeCapability(const Capability& capability) {
+  // Ensure a limit for the number of resume capabilities remembered.
+  static const intptr_t kMaxResumeCapabilities = kSmiMax / (6*kWordSize);
+
+  const GrowableObjectArray& caps = GrowableObjectArray::Handle(
+      this, object_store()->resume_capabilities());
+  Capability& current = Capability::Handle(this);
+  intptr_t insertion_index = -1;
+  for (intptr_t i = 0; i < caps.Length(); i++) {
+    current ^= caps.At(i);
+    if (current.IsNull()) {
+      if (insertion_index < 0) {
+        insertion_index = i;
+      }
+    } else if (current.Id() == capability.Id()) {
+      return false;
+    }
+  }
+  if (insertion_index < 0) {
+    if (caps.Length() >= kMaxResumeCapabilities) {
+      // Cannot grow the array of resume capabilities beyond its max. Additional
+      // pause requests are ignored. In practice will never happen as we will
+      // run out of memory beforehand.
+      return false;
+    }
+    caps.Add(capability);
+  } else {
+    caps.SetAt(insertion_index, capability);
+  }
+  return true;
+}
+
+
+bool Isolate::RemoveResumeCapability(const Capability& capability) {
+  const GrowableObjectArray& caps = GrowableObjectArray::Handle(
+       this, object_store()->resume_capabilities());
+  Capability& current = Capability::Handle(this);
+  for (intptr_t i = 0; i < caps.Length(); i++) {
+    current ^= caps.At(i);
+    if (!current.IsNull() && (current.Id() == capability.Id())) {
+      // Remove the matching capability from the list.
+      current = Capability::null();
+      caps.SetAt(i, current);
+      return true;
+    }
+  }
+  return false;
+}
+
+
 static void StoreError(Isolate* isolate, const Object& obj) {
   ASSERT(obj.IsError());
   isolate->object_store()->set_sticky_error(Error::Cast(obj));
@@ -772,7 +901,7 @@
   void VisitHandle(uword addr) {
     FinalizablePersistentHandle* handle =
         reinterpret_cast<FinalizablePersistentHandle*>(addr);
-    handle->UpdateUnreachable(isolate());
+    handle->UpdateUnreachable(I);
   }
 
  private:
@@ -1212,7 +1341,7 @@
       return LanguageError::New(msg);
     }
   } else {
-    lib = isolate()->object_store()->root_library();
+    lib = I->object_store()->root_library();
   }
   ASSERT(!lib.IsNull());
 
@@ -1254,7 +1383,7 @@
 
 
 void IsolateSpawnState::Cleanup() {
-  SwitchIsolateScope switch_scope(isolate());
+  SwitchIsolateScope switch_scope(I);
   Dart::ShutdownIsolate();
 }
 
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index ff2c815..041be06 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -25,6 +25,7 @@
 class AbstractType;
 class ApiState;
 class Array;
+class Capability;
 class Class;
 class Code;
 class CodeIndexTable;
@@ -165,6 +166,12 @@
     ASSERT(main_port_ == 0);  // Only set main port once.
     main_port_ = port;
   }
+  void set_pause_capability(uint64_t value) { pause_capability_ = value; }
+  uint64_t pause_capability() const { return pause_capability_; }
+  void set_terminate_capability(uint64_t value) {
+    terminate_capability_ = value;
+  }
+  uint64_t terminate_capability() const { return terminate_capability_; }
 
   Heap* heap() const { return heap_; }
   void set_heap(Heap* value) { heap_ = value; }
@@ -354,6 +361,13 @@
     return resume_request;
   }
 
+  // Verify that the sender has the capability to pause this isolate.
+  bool VerifyPauseCapability(const Capability& capability) const;
+  // Returns true if the capability was added or removed from this isolate's
+  // list of pause events.
+  bool AddResumeCapability(const Capability& capability);
+  bool RemoveResumeCapability(const Capability& capability);
+
   Random* random() { return &random_; }
 
   Simulator* simulator() const { return simulator_; }
@@ -593,6 +607,8 @@
   char* name_;
   int64_t start_time_;
   Dart_Port main_port_;
+  uint64_t pause_capability_;
+  uint64_t terminate_capability_;
   Heap* heap_;
   ObjectStore* object_store_;
   RawContext* top_context_;
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 91ed897..9b5b841 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -445,6 +445,17 @@
     }
   }
 
+  bool Contains(Location loc) {
+    if (loc.IsRegister()) {
+      return ContainsRegister(loc.reg());
+    } else if (loc.IsFpuRegister()) {
+      return ContainsFpuRegister(loc.fpu_reg());
+    } else {
+      UNREACHABLE();
+      return false;
+    }
+  }
+
   void DebugPrint() {
     for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) {
       Register r = static_cast<Register>(i);
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index ec88e1b..d162fbd 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -34,6 +34,7 @@
       oob_queue_(new MessageQueue()),
       control_ports_(0),
       live_ports_(0),
+      paused_(0),
       pause_on_start_(false),
       pause_on_exit_(false),
       paused_on_exit_(false),
@@ -126,7 +127,7 @@
 Message* MessageHandler::DequeueMessage(Message::Priority min_priority) {
   // TODO(turnidge): Add assert that monitor_ is held here.
   Message* message = oob_queue_->Dequeue();
-  if (message == NULL && min_priority < Message::kOOBPriority) {
+  if ((message == NULL) && (min_priority < Message::kOOBPriority)) {
     message = queue_->Dequeue();
   }
   return message;
@@ -137,9 +138,8 @@
                                     bool allow_multiple_normal_messages) {
   // TODO(turnidge): Add assert that monitor_ is held here.
   bool result = true;
-  Message::Priority min_priority = (allow_normal_messages
-                                    ? Message::kNormalPriority
-                                    : Message::kOOBPriority);
+  Message::Priority min_priority = (allow_normal_messages && !paused()) ?
+      Message::kNormalPriority : Message::kOOBPriority;
   Message* message = DequeueMessage(min_priority);
   while (message != NULL) {
     if (FLAG_trace_isolates) {
@@ -165,11 +165,17 @@
       // If we hit an error, we're done processing messages.
       break;
     }
-    if (!allow_multiple_normal_messages &&
-        saved_priority == Message::kNormalPriority) {
-      // Some callers want to process only one normal message and then quit.
+    // Some callers want to process only one normal message and then quit. At
+    // the same time it is OK to process multiple OOB messages.
+    if ((saved_priority == Message::kNormalPriority) &&
+        !allow_multiple_normal_messages) {
       break;
     }
+
+    // Reevaluate the minimum allowable priority as the paused state might
+    // have changed as part of handling the message.
+    min_priority = (allow_normal_messages && !paused()) ?
+        Message::kNormalPriority : Message::kOOBPriority;
     message = DequeueMessage(min_priority);
   }
   return result;
@@ -216,6 +222,8 @@
     }
 
     if (start_callback_) {
+      // Release the monitor_ temporarily while we call the start callback.
+      // The monitor was acquired with the MonitorLocker above.
       monitor_.Exit();
       ok = start_callback_(callback_data_);
       ASSERT(Isolate::Current() == NULL);
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 26507de..94e72e0 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -71,6 +71,11 @@
     return control_ports_;
   }
 
+  bool paused() const { return paused_ > 0; }
+
+  void increment_paused() { paused_++; }
+  void decrement_paused() { ASSERT(paused_ > 0); paused_--; }
+
   bool pause_on_start() const {
     return pause_on_start_;
   }
@@ -164,6 +169,7 @@
   MessageQueue* oob_queue_;
   intptr_t control_ports_;  // The number of open control ports usually 0 or 1.
   intptr_t live_ports_;  // The number of open ports, including control ports.
+  intptr_t paused_;  // The number of pause messages received.
   bool pause_on_start_;
   bool pause_on_exit_;
   bool paused_on_exit_;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 1c14142..ce4f450 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -3252,6 +3252,32 @@
 }
 
 
+intptr_t Class::ComputeEndTokenPos() const {
+  // Return the begin token for synthetic classes.
+  if (IsSignatureClass() || IsMixinApplication() || IsTopLevel()) {
+    return token_pos();
+  }
+  const Script& scr = Script::Handle(script());
+  ASSERT(!scr.IsNull());
+  const TokenStream& tkns = TokenStream::Handle(scr.tokens());
+  TokenStream::Iterator tkit(
+      tkns, token_pos(), TokenStream::Iterator::kNoNewlines);
+  intptr_t level = 0;
+  while (tkit.CurrentTokenKind() != Token::kEOS) {
+    if (tkit.CurrentTokenKind() == Token::kLBRACE) {
+      level++;
+    } else if (tkit.CurrentTokenKind() == Token::kRBRACE) {
+      if (--level == 0) {
+        return tkit.CurrentPosition();
+      }
+    }
+    tkit.Advance();
+  }
+  UNREACHABLE();
+  return 0;
+}
+
+
 void Class::set_is_implemented() const {
   set_state_bits(ImplementedBit::update(true, raw_ptr()->state_bits_));
 }
@@ -4008,6 +4034,7 @@
   if (!script.IsNull()) {
     jsobj.AddProperty("script", script);
     jsobj.AddProperty("tokenPos", token_pos());
+    jsobj.AddProperty("endTokenPos", ComputeEndTokenPos());
   }
   {
     JSONArray interfaces_array(&jsobj, "interfaces");
@@ -6406,7 +6433,9 @@
 // Construct fingerprint from token stream. The token stream contains also
 // arguments.
 int32_t Function::SourceFingerprint() const {
-  uint32_t result = String::Handle(Signature()).Hash();
+  uint32_t result = IsImplicitClosureFunction()
+      ? String::Handle(Function::Handle(parent_function()).Signature()).Hash()
+      : String::Handle(Signature()).Hash();
   TokenStream::Iterator tokens_iterator(TokenStream::Handle(
       Script::Handle(script()).tokens()), token_pos());
   Object& obj = Object::Handle();
@@ -8413,8 +8442,8 @@
 
 
 void Library::SetLoadError() const {
-  // Should not be already loaded or just allocated.
-  ASSERT(LoadInProgress() || LoadRequested());
+  // Should not be already successfully loaded or just allocated.
+  ASSERT(LoadInProgress() || LoadRequested() || LoadError());
   raw_ptr()->load_state_ = RawLibrary::kLoadError;
 }
 
@@ -10166,16 +10195,16 @@
 }
 
 
-const char* PcDescriptors::KindAsStr(intptr_t index) const {
-  switch (DescriptorKind(index)) {
-    case PcDescriptors::kDeopt:           return "deopt        ";
-    case PcDescriptors::kIcCall:          return "ic-call      ";
-    case PcDescriptors::kOptStaticCall:   return "opt-call     ";
-    case PcDescriptors::kUnoptStaticCall: return "unopt-call   ";
-    case PcDescriptors::kClosureCall:     return "closure-call ";
-    case PcDescriptors::kRuntimeCall:     return "runtime-call ";
-    case PcDescriptors::kOsrEntry:        return "osr-entry    ";
-    case PcDescriptors::kOther:           return "other        ";
+const char* PcDescriptors::KindAsStr(RawPcDescriptors::Kind kind) {
+  switch (kind) {
+    case RawPcDescriptors::kDeopt:           return "deopt        ";
+    case RawPcDescriptors::kIcCall:          return "ic-call      ";
+    case RawPcDescriptors::kOptStaticCall:   return "opt-call     ";
+    case RawPcDescriptors::kUnoptStaticCall: return "unopt-call   ";
+    case RawPcDescriptors::kClosureCall:     return "closure-call ";
+    case RawPcDescriptors::kRuntimeCall:     return "runtime-call ";
+    case RawPcDescriptors::kOsrEntry:        return "osr-entry    ";
+    case RawPcDescriptors::kOther:           return "other        ";
   }
   UNREACHABLE();
   return "";
@@ -10204,25 +10233,29 @@
       "%#-*" Px "\t%s\t%" Pd "\t\t%" Pd "\t%" Pd "\n";
   // First compute the buffer size required.
   intptr_t len = 1;  // Trailing '\0'.
-  for (intptr_t i = 0; i < Length(); i++) {
+  Iterator iter(*this);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
     len += OS::SNPrint(NULL, 0, kFormat, addr_width,
-                       PC(i),
-                       KindAsStr(i),
-                       DeoptId(i),
-                       TokenPos(i),
-                       TryIndex(i));
+                       rec.pc,
+                       KindAsStr(rec.kind()),
+                       rec.deopt_id,
+                       rec.token_pos,
+                       rec.try_index);
   }
   // Allocate the buffer.
   char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len);
   // Layout the fields in the buffer.
   intptr_t index = 0;
-  for (intptr_t i = 0; i < Length(); i++) {
+  Iterator iter2(*this);
+  while (iter2.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter2.Next();
     index += OS::SNPrint((buffer + index), (len - index), kFormat, addr_width,
-                         PC(i),
-                         KindAsStr(i),
-                         DeoptId(i),
-                         TokenPos(i),
-                         TryIndex(i));
+                         rec.pc,
+                         KindAsStr(rec.kind()),
+                         rec.deopt_id,
+                         rec.token_pos,
+                         rec.try_index);
   }
   return buffer;
 }
@@ -10235,13 +10268,15 @@
   // generate an ID. Currently we only print PcDescriptors inline with a Code.
   jsobj->AddProperty("id", "");
   JSONArray members(jsobj, "members");
-  for (intptr_t i = 0; i < Length(); i++) {
+  Iterator iter(*this);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
     JSONObject descriptor(&members);
-    descriptor.AddPropertyF("pc", "%" Px "", PC(i));
-    descriptor.AddProperty("kind", KindAsStr(i));
-    descriptor.AddProperty("deoptId", DeoptId(i));
-    descriptor.AddProperty("tokenPos", TokenPos(i));
-    descriptor.AddProperty("tryIndex", TryIndex(i));
+    descriptor.AddPropertyF("pc", "%" Px "", rec.pc);
+    descriptor.AddProperty("kind", KindAsStr(rec.kind()));
+    descriptor.AddProperty("deoptId",  static_cast<intptr_t>(rec.deopt_id));
+    descriptor.AddProperty("tokenPos",  static_cast<intptr_t>(rec.token_pos));
+    descriptor.AddProperty("tryIndex",  static_cast<intptr_t>(rec.try_index));
   }
 }
 
@@ -10268,17 +10303,21 @@
     return;
   }
   // Only check ids for unoptimized code that is optimizable.
-  if (!function.IsOptimizable()) return;
-  for (intptr_t i = 0; i < Length(); i++) {
-    PcDescriptors::Kind kind = DescriptorKind(i);
+  if (!function.IsOptimizable()) {
+    return;
+  }
+  Iterator iter(*this);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    RawPcDescriptors::Kind kind = rec.kind();
     // 'deopt_id' is set for kDeopt and kIcCall and must be unique for one kind.
     intptr_t deopt_id = Isolate::kNoDeoptId;
-    if ((DescriptorKind(i) != PcDescriptors::kDeopt) ||
-        (DescriptorKind(i) != PcDescriptors::kIcCall)) {
+    if ((kind != RawPcDescriptors::kDeopt) ||
+        (kind != RawPcDescriptors::kIcCall)) {
       continue;
     }
 
-    deopt_id = DeoptId(i);
+    deopt_id = rec.deopt_id;
     if (Isolate::IsDeoptAfter(deopt_id)) {
       // TODO(vegorov): some instructions contain multiple calls and have
       // multiple "after" targets recorded. Right now it is benign but might
@@ -10286,10 +10325,12 @@
       continue;
     }
 
-    for (intptr_t k = i + 1; k < Length(); k++) {
-      if (kind == DescriptorKind(k)) {
+    Iterator nested(iter);
+    while (iter.HasNext()) {
+      const RawPcDescriptors::PcDescriptorRec& nested_rec = nested.Next();
+      if (kind == nested_rec.kind()) {
         if (deopt_id != Isolate::kNoDeoptId) {
-          ASSERT(DeoptId(k) != deopt_id);
+          ASSERT(nested_rec.deopt_id != deopt_id);
         }
       }
     }
@@ -10298,10 +10339,12 @@
 }
 
 
-uword PcDescriptors::GetPcForKind(Kind kind) const {
-  for (intptr_t i = 0; i < Length(); i++) {
-    if (DescriptorKind(i) == kind) {
-      return PC(i);
+uword PcDescriptors::GetPcForKind(RawPcDescriptors::Kind kind) const {
+  Iterator iter(*this);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    if (rec.kind() == kind) {
+      return rec.pc;
     }
   }
   return 0;
@@ -11798,24 +11841,26 @@
 
 
 intptr_t Code::GetTokenIndexOfPC(uword pc) const {
-  intptr_t token_pos = -1;
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
-  for (intptr_t i = 0; i < descriptors.Length(); i++) {
-    if (descriptors.PC(i) == pc) {
-      token_pos = descriptors.TokenPos(i);
-      break;
+  PcDescriptors::Iterator iter(descriptors);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    if (rec.pc == pc) {
+      return rec.token_pos;
     }
   }
-  return token_pos;
+  return -1;
 }
 
 
-uword Code::GetPcForDeoptId(intptr_t deopt_id, PcDescriptors::Kind kind) const {
+uword Code::GetPcForDeoptId(intptr_t deopt_id,
+                            RawPcDescriptors::Kind kind) const {
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
-  for (intptr_t i = 0; i < descriptors.Length(); i++) {
-    if ((descriptors.DeoptId(i) == deopt_id) &&
-        (descriptors.DescriptorKind(i) == kind)) {
-      uword pc = descriptors.PC(i);
+  PcDescriptors::Iterator iter(descriptors);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    if ((rec.deopt_id == deopt_id) && (rec.kind() == kind)) {
+      uword pc = rec.pc;
       ASSERT(ContainsInstructionAt(pc));
       return pc;
     }
@@ -11826,10 +11871,11 @@
 
 intptr_t Code::GetDeoptIdForOsr(uword pc) const {
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
-  for (intptr_t i = 0; i < descriptors.Length(); ++i) {
-    if ((descriptors.PC(i) == pc) &&
-        (descriptors.DescriptorKind(i) == PcDescriptors::kOsrEntry)) {
-      return descriptors.DeoptId(i);
+  PcDescriptors::Iterator iter(descriptors);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    if ((rec.pc == pc) && (rec.kind() == RawPcDescriptors::kOsrEntry)) {
+      return rec.deopt_id;
     }
   }
   return Isolate::kNoDeoptId;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 7eeb868..3d6006e 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -748,6 +748,8 @@
   intptr_t token_pos() const { return raw_ptr()->token_pos_; }
   void set_token_pos(intptr_t value) const;
 
+  intptr_t ComputeEndTokenPos() const;
+
   // This class represents the signature class of a closure function if
   // signature_function() is not null.
   // The associated function may be a closure function (with code) or a
@@ -2434,8 +2436,8 @@
     };
 
     Iterator(const TokenStream& tokens,
-                   intptr_t token_pos,
-                   Iterator::StreamType stream_type = kNoNewlines);
+             intptr_t token_pos,
+             Iterator::StreamType stream_type = kNoNewlines);
 
     void SetStream(const TokenStream& tokens, intptr_t token_pos);
     bool IsValid() const;
@@ -2983,50 +2985,15 @@
 
 class PcDescriptors : public Object {
  public:
-  enum Kind {
-    kDeopt,            // Deoptimization continuation point.
-    kIcCall,           // IC call.
-    kOptStaticCall,    // Call directly to known target, e.g. static call.
-    kUnoptStaticCall,  // Call to a known target via a stub.
-    kClosureCall,      // Closure call.
-    kRuntimeCall,      // Runtime call.
-    kOsrEntry,         // OSR entry point in unoptimized code.
-    kOther
-  };
-
-  intptr_t Length() const;
-
-  uword PC(intptr_t index) const {
-    ASSERT(index < Length());
-    return raw_ptr()->data()[index].pc;
-  }
-  PcDescriptors::Kind DescriptorKind(intptr_t index) const {
-    ASSERT(index < Length());
-    return static_cast<PcDescriptors::Kind>(raw_ptr()->data()[index].kind);
-  }
-  intptr_t DeoptId(intptr_t index) const {
-    ASSERT(index < Length());
-    return raw_ptr()->data()[index].deopt_id;
-  }
-  intptr_t TokenPos(intptr_t index) const {
-    ASSERT(index < Length());
-    return raw_ptr()->data()[index].token_pos;
-  }
-  intptr_t TryIndex(intptr_t index) const {
-    ASSERT(index < Length());
-    return raw_ptr()->data()[index].try_index;
-  }
-  const char* KindAsStr(intptr_t index) const;
-
   void AddDescriptor(intptr_t index,
                      uword pc,
-                     PcDescriptors::Kind kind,
+                     RawPcDescriptors::Kind kind,
                      int64_t deopt_id,
                      int64_t token_pos,  // Or deopt reason.
                      intptr_t try_index) const {  // Or deopt index.
-    RawPcDescriptors::PcDescriptorRec* rec = &raw_ptr()->data()[index];
+    RawPcDescriptors::PcDescriptorRec* rec = recAt(index);
     rec->pc = pc;
-    rec->kind = kind;
+    rec->kind_ = kind;
     ASSERT(Utils::IsInt(32, deopt_id));
     rec->deopt_id = deopt_id;
     ASSERT(Utils::IsInt(32, token_pos));
@@ -3053,7 +3020,7 @@
   static RawPcDescriptors* New(intptr_t num_descriptors);
 
   // Returns 0 if not found.
-  uword GetPcForKind(Kind kind) const;
+  uword GetPcForKind(RawPcDescriptors::Kind kind) const;
 
   // Verify (assert) assumptions about pc descriptors in debug mode.
   void Verify(const Function& function) const;
@@ -3065,7 +3032,38 @@
   // We would have a VisitPointers function here to traverse the
   // pc descriptors table to visit objects if any in the table.
 
+  class Iterator : ValueObject {
+   public:
+    explicit Iterator(const PcDescriptors& descriptors)
+        : descriptors_(descriptors), current_ix_(0) {}
+
+    // For nested iterations, starting at element after.
+    explicit Iterator(const Iterator& iter)
+        : ValueObject(),
+          descriptors_(iter.descriptors_),
+          current_ix_(iter.current_ix_) {}
+
+    bool HasNext() { return current_ix_ < descriptors_.Length(); }
+
+    const RawPcDescriptors::PcDescriptorRec& Next() {
+      ASSERT(HasNext());
+      return *descriptors_.recAt(current_ix_++);
+    }
+
+   private:
+    const PcDescriptors& descriptors_;
+    intptr_t current_ix_;
+  };
+
  private:
+  static const char* KindAsStr(RawPcDescriptors::Kind kind);
+
+  intptr_t Length() const;
+
+  RawPcDescriptors::PcDescriptorRec* recAt(intptr_t ix) const {
+    ASSERT(ix < Length());
+    return &raw_ptr()->data()[ix];
+  }
   void SetLength(intptr_t value) const;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object);
@@ -3682,7 +3680,7 @@
   uword GetLazyDeoptPc() const;
 
   // Find pc, return 0 if not found.
-  uword GetPcForDeoptId(intptr_t deopt_id, PcDescriptors::Kind kind) const;
+  uword GetPcForDeoptId(intptr_t deopt_id, RawPcDescriptors::Kind kind) const;
   intptr_t GetDeoptIdForOsr(uword pc) const;
 
   // Returns true if there is an object in the code between 'start_offset'
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 154e742..c0f6715 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -20,9 +20,7 @@
 // its children are processed, to give the visitor a complete chain of parents.
 //
 // TODO(koda): Potential optimizations:
-// - Linked chunks instead of std::vector.
-// - Use smi/heap tag bit instead of full-word sentinel.
-// - Extend RawObject with incremental iteration (one child at a time).
+// - Use tag bits for compact Node and sentinel representations.
 class ObjectGraph::Stack : public ObjectPointerVisitor {
  public:
   explicit Stack(Isolate* isolate)
@@ -33,7 +31,10 @@
     for (RawObject** current = first; current <= last; ++current) {
       if ((*current)->IsHeapObject() && !(*current)->IsMarked()) {
         (*current)->SetMarkBit();
-        data_.Add(*current);
+        Node node;
+        node.ptr = current;
+        node.obj = *current;
+        data_.Add(node);
       }
     }
   }
@@ -41,15 +42,18 @@
   // Traverses the object graph from the current state.
   void TraverseGraph(ObjectGraph::Visitor* visitor) {
     while (!data_.is_empty()) {
-      RawObject* obj = data_.Last();
-      if (obj == kSentinel) {
+      Node node = data_.Last();
+      if (node.ptr == kSentinel) {
         data_.RemoveLast();
         // The node below the sentinel has already been visited.
         data_.RemoveLast();
         continue;
       }
+      RawObject* obj = node.obj;
       ASSERT(obj->IsHeapObject());
-      data_.Add(kSentinel);
+      Node sentinel;
+      sentinel.ptr = kSentinel;
+      data_.Add(sentinel);
       StackIterator it(this, data_.length() - 2);
       switch (visitor->VisitObject(&it)) {
         case ObjectGraph::Visitor::kProceed:
@@ -64,32 +68,70 @@
   }
 
  private:
-  static RawObject* const kSentinel;
+  struct Node {
+    RawObject** ptr;  // kSentinel for the sentinel node.
+    RawObject* obj;
+  };
+
+  static RawObject** const kSentinel;
   static const intptr_t kInitialCapacity = 1024;
-  GrowableArray<RawObject*> data_;
+  static const intptr_t kNoParent = -1;
+
+  intptr_t Parent(intptr_t index) const {
+    // The parent is just below the next sentinel.
+    for (intptr_t i = index; i >= 1; --i) {
+      if (data_[i].ptr == kSentinel) {
+        return i - 1;
+      }
+    }
+    return kNoParent;
+  }
+
+  GrowableArray<Node> data_;
   friend class StackIterator;
   DISALLOW_COPY_AND_ASSIGN(Stack);
 };
 
 
-// We only visit heap objects, so any Smi works as the sentinel.
-RawObject* const ObjectGraph::Stack::kSentinel = Smi::New(0);
+RawObject** const ObjectGraph::Stack::kSentinel = NULL;
 
 
 RawObject* ObjectGraph::StackIterator::Get() const {
-  return stack_->data_[index_];
+  return stack_->data_[index_].obj;
 }
 
 
 bool ObjectGraph::StackIterator::MoveToParent() {
-  // The parent is just below the next sentinel.
-  for (int i = index_; i >= 1; --i) {
-    if (stack_->data_[i] == Stack::kSentinel) {
-      index_ = i - 1;
-      return true;
-    }
+  intptr_t parent = stack_->Parent(index_);
+  if (parent == Stack::kNoParent) {
+    return false;
+  } else {
+    index_ = parent;
+    return true;
   }
-  return false;
+}
+
+
+intptr_t ObjectGraph::StackIterator::OffsetFromParentInWords() const {
+  intptr_t parent_index = stack_->Parent(index_);
+  if (parent_index == Stack::kNoParent) {
+    return -1;
+  }
+  Stack::Node parent = stack_->data_[parent_index];
+  uword parent_start = RawObject::ToAddr(parent.obj);
+  Stack::Node child = stack_->data_[index_];
+  ASSERT(child.obj == *child.ptr);
+  uword child_ptr_addr = reinterpret_cast<uword>(child.ptr);
+  intptr_t offset = child_ptr_addr - parent_start;
+  if (offset > 0 && offset < parent.obj->Size()) {
+    ASSERT(Utils::IsAligned(offset, kWordSize));
+    return offset >> kWordSizeLog2;
+  } else {
+    // Some internal VM objects visit pointers not contained within the parent.
+    // For instance, RawCode::VisitCodePointers visits pointers in instructions.
+    ASSERT(!parent.obj->IsDartInstance());
+    return -1;
+  }
 }
 
 
@@ -224,10 +266,15 @@
     } else {
       HANDLESCOPE(Isolate::Current());
       Object& current = Object::Handle();
+      Smi& offset_from_parent = Smi::Handle();
       do {
-        if (!path_.IsNull() && length_ < path_.Length()) {
+        intptr_t obj_index = length_ * 2;
+        intptr_t offset_index = obj_index + 1;
+        if (!path_.IsNull() && offset_index < path_.Length()) {
           current = it->Get();
-          path_.SetAt(length_, current);
+          path_.SetAt(obj_index, current);
+          offset_from_parent = Smi::New(it->OffsetFromParentInWords());
+          path_.SetAt(offset_index, offset_from_parent);
         }
         ++length_;
       } while (it->MoveToParent());
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index cc0d11a..580698d 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -27,6 +27,8 @@
     RawObject* Get() const;
     // Returns false if there is no parent.
     bool MoveToParent();
+    // Offset into parent for the pointer to current object. -1 if no parent.
+    intptr_t OffsetFromParentInWords() const;
    private:
     StackIterator(const Stack* stack, intptr_t index)
         : stack_(stack), index_(index) { }
@@ -69,9 +71,10 @@
   intptr_t SizeRetainedByClass(intptr_t class_id);
 
   // Finds some retaining path from the isolate roots to 'obj'. Populates the
-  // provided array, starting 'obj' itself, up to the smaller of the length of
-  // the array and the length of the path. Returns the length of the path. A
-  // null input array behaves like a zero-length input array.
+  // provided array with pairs of (object, offset from parent in words),
+  // starting with 'obj' itself, as far as there is room. Returns the number
+  // of objects on the full path. A null input array behaves like a zero-length
+  // input array. The 'offset' of a root is -1.
   //
   // To break the trivial path, the handle 'obj' is temporarily cleared during
   // the search, but restored before returning. If no path is found (i.e., the
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
index 72ab50f..9ccd9f9 100644
--- a/runtime/vm/object_graph_test.cc
+++ b/runtime/vm/object_graph_test.cc
@@ -45,14 +45,14 @@
   //  +   +
   //  |   v
   //  +-->d
-  Array& a = Array::Handle(Array::New(2, Heap::kNew));
+  Array& a = Array::Handle(Array::New(12, Heap::kNew));
   Array& b = Array::Handle(Array::New(2, Heap::kOld));
   Array& c = Array::Handle(Array::New(0, Heap::kOld));
   Array& d = Array::Handle(Array::New(0, Heap::kOld));
-  a.SetAt(0, b);
+  a.SetAt(10, b);
   b.SetAt(0, c);
   b.SetAt(1, d);
-  a.SetAt(1, d);
+  a.SetAt(11, d);
   intptr_t a_size = a.raw()->Size();
   intptr_t b_size = b.raw()->Size();
   intptr_t c_size = c.raw()->Size();
@@ -93,7 +93,7 @@
   }
   {
     // Get hold of c again.
-    b ^= a.At(0);
+    b ^= a.At(10);
     c ^= b.At(0);
     b = Array::null();
     ObjectGraph graph(isolate);
@@ -111,17 +111,26 @@
     }
     {
       HANDLESCOPE(isolate);
-      Array& path = Array::Handle(Array::New(3, Heap::kNew));
+      Array& path = Array::Handle(Array::New(6, Heap::kNew));
       intptr_t length = graph.RetainingPath(&c, path);
       EXPECT_LE(3, length);
       Array& expected_c = Array::Handle();
       expected_c ^= path.At(0);
+      // c is the first element in b.
+      Smi& offset_from_parent = Smi::Handle();
+      offset_from_parent ^= path.At(1);
+      EXPECT_EQ(Array::element_offset(0),
+                offset_from_parent.Value() * kWordSize);
       Array& expected_b = Array::Handle();
-      expected_b ^= path.At(1);
+      expected_b ^= path.At(2);
+      // b is the element with index 10 in a.
+      offset_from_parent ^= path.At(3);
+      EXPECT_EQ(Array::element_offset(10),
+                offset_from_parent.Value() * kWordSize);
       Array& expected_a = Array::Handle();
-      expected_a ^= path.At(2);
+      expected_a ^= path.At(4);
       EXPECT(expected_c.raw() == c.raw());
-      EXPECT(expected_b.raw() == a.At(0));
+      EXPECT(expected_b.raw() == a.At(10));
       EXPECT(expected_a.raw() == a.raw());
     }
   }
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 1c779f5..d7386d6 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -65,6 +65,7 @@
     libraries_(GrowableObjectArray::null()),
     pending_classes_(GrowableObjectArray::null()),
     pending_functions_(GrowableObjectArray::null()),
+    resume_capabilities_(GrowableObjectArray::null()),
     sticky_error_(Error::null()),
     unhandled_exception_handler_(String::null()),
     empty_context_(Context::null()),
@@ -109,6 +110,8 @@
   ASSERT(this->pending_functions() == GrowableObjectArray::null());
   this->pending_functions_ = GrowableObjectArray::New();
 
+  this->resume_capabilities_ = GrowableObjectArray::New();
+
   Object& result = Object::Handle();
   const Library& library = Library::Handle(Library::CoreLibrary());
 
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index dbd6122..b3129a1 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -347,6 +347,10 @@
     return pending_functions_;
   }
 
+  RawGrowableObjectArray* resume_capabilities() const {
+    return resume_capabilities_;
+  }
+
   RawError* sticky_error() const { return sticky_error_; }
   void set_sticky_error(const Error& value) {
     ASSERT(!value.IsNull());
@@ -485,6 +489,7 @@
   RawGrowableObjectArray* libraries_;
   RawGrowableObjectArray* pending_classes_;
   RawGrowableObjectArray* pending_functions_;
+  RawGrowableObjectArray* resume_capabilities_;
   RawError* sticky_error_;
   RawString* unhandled_exception_handler_;
   RawContext* empty_context_;
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 5ccc8d4..a80c496 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -221,6 +221,35 @@
 }
 
 
+TEST_CASE(Class_ComputeEndTokenPos) {
+  const char* kScript =
+  "\n"
+  "class A {\n"
+  "  /**\n"
+  "   * Description of foo().\n"
+  "   */\n"
+  "  foo(a) { return '''\"}'''; }\n"
+  "  // }\n"
+  "  var bar = '\\'}';\n"
+  "  var baz = \"${foo('}')}\";\n"
+  "}\n";
+  Dart_Handle lib_h = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib_h);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(lib_h);
+  EXPECT(!lib.IsNull());
+  const Class& cls = Class::Handle(
+      lib.LookupClass(String::Handle(String::New("A"))));
+  EXPECT(!cls.IsNull());
+  const intptr_t end_token_pos = cls.ComputeEndTokenPos();
+  const Script& scr = Script::Handle(cls.script());
+  intptr_t line;
+  intptr_t col;
+  scr.GetTokenLocation(end_token_pos, &line, &col);
+  EXPECT(line == 10 && col == 1);
+}
+
+
 TEST_CASE(InstanceClass) {
   // Allocate the class first.
   String& class_name = String::Handle(Symbols::New("EmptyClass"));
@@ -2700,12 +2729,12 @@
   // Add PcDescriptors to the code.
   PcDescriptors& descriptors = PcDescriptors::Handle();
   descriptors ^= PcDescriptors::New(kNumEntries);
-  descriptors.AddDescriptor(0, 10, PcDescriptors::kOther, 1, 20, 1);
-  descriptors.AddDescriptor(1, 20, PcDescriptors::kDeopt, 2, 30, 0);
-  descriptors.AddDescriptor(2, 30, PcDescriptors::kOther, 3, 40, 1);
-  descriptors.AddDescriptor(3, 10, PcDescriptors::kOther, 4, 40, 2);
-  descriptors.AddDescriptor(4, 10, PcDescriptors::kOther, 5, 80, 3);
-  descriptors.AddDescriptor(5, 80, PcDescriptors::kOther, 6, 150, 3);
+  descriptors.AddDescriptor(0, 10, RawPcDescriptors::kOther, 1, 20, 1);
+  descriptors.AddDescriptor(1, 20, RawPcDescriptors::kDeopt, 2, 30, 0);
+  descriptors.AddDescriptor(2, 30, RawPcDescriptors::kOther, 3, 40, 1);
+  descriptors.AddDescriptor(3, 10, RawPcDescriptors::kOther, 4, 40, 2);
+  descriptors.AddDescriptor(4, 10, RawPcDescriptors::kOther, 5, 80, 3);
+  descriptors.AddDescriptor(5, 80, RawPcDescriptors::kOther, 6, 150, 3);
 
   extern void GenerateIncrement(Assembler* assembler);
   Assembler _assembler_;
@@ -2716,16 +2745,30 @@
 
   // Verify the PcDescriptor entries by accessing them.
   const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors());
-  EXPECT_EQ(kNumEntries, pc_descs.Length());
-  EXPECT_EQ(1, pc_descs.TryIndex(0));
-  EXPECT_EQ(static_cast<uword>(10), pc_descs.PC(0));
-  EXPECT_EQ(1, pc_descs.DeoptId(0));
-  EXPECT_EQ(20, pc_descs.TokenPos(0));
-  EXPECT_EQ(3, pc_descs.TryIndex(5));
-  EXPECT_EQ(static_cast<uword>(80), pc_descs.PC(5));
-  EXPECT_EQ(150, pc_descs.TokenPos(5));
-  EXPECT_EQ(PcDescriptors::kOther, pc_descs.DescriptorKind(0));
-  EXPECT_EQ(PcDescriptors::kDeopt, pc_descs.DescriptorKind(1));
+  PcDescriptors::Iterator iter(pc_descs);
+  const RawPcDescriptors::PcDescriptorRec& rec0 = iter.Next();
+  const RawPcDescriptors::PcDescriptorRec& rec1 = iter.Next();
+  const RawPcDescriptors::PcDescriptorRec& rec2 = iter.Next();
+  const RawPcDescriptors::PcDescriptorRec& rec3 = iter.Next();
+  const RawPcDescriptors::PcDescriptorRec& rec4 = iter.Next();
+  const RawPcDescriptors::PcDescriptorRec& rec5 = iter.Next();
+  ASSERT(!iter.HasNext());
+
+  EXPECT_EQ(1, rec0.try_index);
+  EXPECT_EQ(static_cast<uword>(10), rec0.pc);
+  EXPECT_EQ(1, rec0.deopt_id);
+  EXPECT_EQ(20, rec0.token_pos);
+
+  EXPECT_EQ(3, rec5.try_index);
+  EXPECT_EQ(static_cast<uword>(80), rec5.pc);
+  EXPECT_EQ(150, rec5.token_pos);
+  EXPECT_EQ(RawPcDescriptors::kOther, rec0.kind());
+  EXPECT_EQ(RawPcDescriptors::kDeopt, rec1.kind());
+
+  EXPECT_EQ(30, rec1.token_pos);
+  EXPECT_EQ(40, rec2.token_pos);
+  EXPECT_EQ(40, rec3.token_pos);
+  EXPECT_EQ(80, rec4.token_pos);
 }
 
 
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index e4c6236..a82fff7 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -1329,7 +1329,7 @@
     intptr_t index = i - desc.PositionalCount();
     p.name = &String::ZoneHandle(I, desc.NameAt(index));
     p.type = &Type::ZoneHandle(I, Type::DynamicType());
-    p.default_value = &Object::ZoneHandle();
+    p.default_value = &Object::null_object();
     params.parameters->Add(p);
     params.num_optional_parameters++;
     params.has_optional_named_parameters = true;
@@ -1697,7 +1697,7 @@
         params->has_optional_named_parameters) {
       // Implicit default value is null.
       params->num_optional_parameters++;
-      parameter.default_value = &Object::ZoneHandle();
+      parameter.default_value = &Object::null_object();
     } else {
       params->num_fixed_parameters++;
       ASSERT(params->num_optional_parameters == 0);
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 6dc181c..9d39c33 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -902,18 +902,33 @@
 
 
 class RawPcDescriptors : public RawObject {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors);
-
-  intptr_t length_;  // Number of descriptors.
+ public:
+  enum Kind {
+    kDeopt,            // Deoptimization continuation point.
+    kIcCall,           // IC call.
+    kOptStaticCall,    // Call directly to known target, e.g. static call.
+    kUnoptStaticCall,  // Call to a known target via a stub.
+    kClosureCall,      // Closure call.
+    kRuntimeCall,      // Runtime call.
+    kOsrEntry,         // OSR entry point in unoptimized code.
+    kOther
+  };
 
   struct PcDescriptorRec {
     uword pc;
     int32_t deopt_id;
     int32_t token_pos;  // Or deopt reason.
     int16_t try_index;  // Or deopt index.
-    int8_t kind;
+    int8_t kind_;
+
+    Kind kind() const { return static_cast<Kind>(kind_); }
   };
 
+ private:
+  RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors);
+
+  intptr_t length_;  // Number of descriptors.
+
   // Variable length data follows here.
   PcDescriptorRec* data() { OPEN_ARRAY_START(PcDescriptorRec, intptr_t); }
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index d5811c0..16fbe84 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -2528,15 +2528,26 @@
                                     intptr_t object_id,
                                     intptr_t tags,
                                     Snapshot::Kind kind) {
-  UNIMPLEMENTED();
-  return Capability::null();
+  uint64_t id = reader->Read<uint64_t>();
+
+  Capability& result = Capability::ZoneHandle(reader->isolate(),
+                                              Capability::New(id));
+  reader->AddBackRef(object_id, &result, kIsDeserialized);
+  return result.raw();
 }
 
 
 void RawCapability::WriteTo(SnapshotWriter* writer,
                             intptr_t object_id,
                             Snapshot::Kind kind) {
-  UNIMPLEMENTED();
+  // Write out the serialization header value for this object.
+  writer->WriteInlinedObjectHeader(object_id);
+
+  // Write out the class and tags information.
+  writer->WriteIndexedObject(kCapabilityCid);
+  writer->WriteTags(writer->GetObjectTags(this));
+
+  writer->Write<uint64_t>(ptr()->id_);
 }
 
 
@@ -2586,7 +2597,7 @@
   writer->WriteIndexedObject(kSendPortCid);
   writer->WriteTags(writer->GetObjectTags(this));
 
-  writer->Write(ptr()->id_);
+  writer->Write<uint64_t>(ptr()->id_);
 }
 
 
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index c4ca102..0928897 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -675,27 +675,25 @@
 }
 
 
-void Service::HandleIsolateMessage(Isolate* isolate, const Instance& msg) {
+void Service::HandleIsolateMessage(Isolate* isolate, const Array& msg) {
   ASSERT(isolate != NULL);
   ASSERT(!msg.IsNull());
-  ASSERT(msg.IsArray());
 
   {
     StackZone zone(isolate);
     HANDLESCOPE(isolate);
 
-    const Array& message = Array::Cast(msg);
     // Message is a list with five entries.
-    ASSERT(message.Length() == 5);
+    ASSERT(msg.Length() == 5);
 
     Instance& reply_port = Instance::Handle(isolate);
     GrowableObjectArray& path = GrowableObjectArray::Handle(isolate);
     Array& option_keys = Array::Handle(isolate);
     Array& option_values = Array::Handle(isolate);
-    reply_port ^= message.At(1);
-    path ^= message.At(2);
-    option_keys ^= message.At(3);
-    option_values ^= message.At(4);
+    reply_port ^= msg.At(1);
+    path ^= msg.At(2);
+    option_keys ^= msg.At(3);
+    option_values ^= msg.At(4);
 
     ASSERT(!path.IsNull());
     ASSERT(!option_keys.IsNull());
@@ -934,6 +932,54 @@
 }
 
 
+static bool HandleRetainingPath(Isolate* isolate,
+                                Object* obj,
+                                intptr_t limit,
+                                JSONStream* js) {
+  ObjectGraph graph(isolate);
+  Array& path = Array::Handle(Array::New(limit * 2));
+  intptr_t length = graph.RetainingPath(obj, path);
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "RetainingPath");
+  jsobj.AddProperty("id", "retaining_path");
+  jsobj.AddProperty("length", length);
+  JSONArray elements(&jsobj, "elements");
+  Object& element = Object::Handle();
+  Object& parent = Object::Handle();
+  Smi& offset_from_parent = Smi::Handle();
+  Class& parent_class = Class::Handle();
+  Array& parent_field_map = Array::Handle();
+  Field& field = Field::Handle();
+  limit = Utils::Minimum(limit, length);
+  for (intptr_t i = 0; i < limit; ++i) {
+    JSONObject jselement(&elements);
+    element = path.At(i * 2);
+    jselement.AddProperty("index", i);
+    jselement.AddProperty("value", element);
+    // Interpret the word offset from parent as list index or instance field.
+    // TODO(koda): User-friendly interpretation for map entries.
+    offset_from_parent ^= path.At((i * 2) + 1);
+    int parent_i = i + 1;
+    if (parent_i < limit) {
+      parent = path.At(parent_i * 2);
+      if (parent.IsArray()) {
+        intptr_t element_index = offset_from_parent.Value() -
+            (Array::element_offset(0) >> kWordSizeLog2);
+        jselement.AddProperty("parentListIndex", element_index);
+      } else if (parent.IsInstance()) {
+        parent_class ^= parent.clazz();
+        parent_field_map = parent_class.OffsetToFieldMap();
+        intptr_t offset = offset_from_parent.Value();
+        if (offset > 0 && offset < parent_field_map.Length()) {
+          field ^= parent_field_map.At(offset);
+          jselement.AddProperty("parentField", field);
+        }
+      }
+    }
+  }
+  return true;
+}
+
 // Takes an Object* only because RetainingPath temporarily clears it.
 static bool HandleInstanceCommands(Isolate* isolate,
                                    Object* obj,
@@ -992,22 +1038,7 @@
                  js->num_arguments());
       return true;
     }
-    ObjectGraph graph(isolate);
-    Array& path = Array::Handle(Array::New(limit));
-    intptr_t length = graph.RetainingPath(obj, path);
-    JSONObject jsobj(js);
-    jsobj.AddProperty("type", "RetainingPath");
-    jsobj.AddProperty("id", "retaining_path");
-    jsobj.AddProperty("length", length);
-    JSONArray elements(&jsobj, "elements");
-    for (intptr_t i = 0; i < path.Length() && i < length; ++i) {
-      JSONObject jselement(&elements);
-      Object& element = Object::Handle();
-      element = path.At(i);
-      jselement.AddProperty("index", i);
-      jselement.AddProperty("value", element);
-    }
-    return true;
+    return HandleRetainingPath(isolate, obj, limit, js);
   }
 
   PrintError(js, "unrecognized action '%s'\n", action);
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 2ee5ad4..ebfa89e 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -16,6 +16,7 @@
 class Instance;
 class Isolate;
 class JSONStream;
+class Array;
 class RawInstance;
 class String;
 
@@ -25,7 +26,7 @@
   static void HandleRootMessage(const Instance& message);
 
   // Handles a message which is directed to a particular isolate.
-  static void HandleIsolateMessage(Isolate* isolate, const Instance& message);
+  static void HandleIsolateMessage(Isolate* isolate, const Array& message);
 
   static Isolate* GetServiceIsolate(void* callback_data);
   static bool SendIsolateStartupMessage();
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 51a19aa..e2fec2a 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -89,7 +89,7 @@
 };
 
 
-static RawInstance* Eval(Dart_Handle lib, const char* expr) {
+static RawArray* Eval(Dart_Handle lib, const char* expr) {
   Dart_Handle expr_val = Dart_EvaluateExpr(lib, NewString(expr));
   EXPECT_VALID(expr_val);
   Isolate* isolate = Isolate::Current();
@@ -107,7 +107,7 @@
 }
 
 
-static RawInstance* EvalF(Dart_Handle lib, const char* fmt, ...) {
+static RawArray* EvalF(Dart_Handle lib, const char* fmt, ...) {
   Isolate* isolate = Isolate::Current();
 
   va_list args;
@@ -181,7 +181,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
 
   // Get the isolate summary.
   service_msg = Eval(lib, "[0, port, [], [], []]");
@@ -232,7 +232,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
 
   // Get the stacktrace.
   service_msg = Eval(lib, "[0, port, ['stacktrace'], [], []]");
@@ -272,7 +272,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
 
   // Add a breakpoint.
   const String& url = String::Handle(String::New(TestCase::url()));
@@ -380,7 +380,7 @@
   EXPECT_VALID(valid_id);
   EXPECT_VALID(Dart_SetField(lib, NewString("validId"), valid_id));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
 
   // null
   service_msg = Eval(lib, "[0, port, ['objects', 'null'], [], []]");
@@ -608,6 +608,119 @@
 }
 
 
+TEST_CASE(Service_RetainingPath) {
+  const char* kScript =
+      "var port;\n"    // Set to our mock port by C++.
+      "var id0;\n"     // Set to an object id by C++.
+      "var id1;\n"     // Ditto.
+      "var idElem;\n"  // Ditto.
+      "class Foo {\n"
+      "  String f0;\n"
+      "  String f1;\n"
+      "}\n"
+      "Foo foo;\n"
+      "List<String> lst;\n"
+      "main() {\n"
+      "  foo = new Foo();\n"
+      "  lst = new List<String>(100);\n"
+      "}\n";
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+  const Class& class_foo = Class::Handle(GetClass(lib, "Foo"));
+  EXPECT(!class_foo.IsNull());
+  Dart_Handle foo = Dart_GetField(h_lib, NewString("foo"));
+  Dart_Handle lst = Dart_GetField(h_lib, NewString("lst"));
+  const intptr_t kElemIndex = 42;
+  {
+    Dart_EnterScope();
+    ObjectIdRing* ring = isolate->object_id_ring();
+    {
+      const String& foo0 = String::Handle(String::New("foo0", Heap::kOld));
+      Dart_Handle h_foo0 = Api::NewHandle(isolate, foo0.raw());
+      EXPECT_VALID(Dart_SetField(foo, NewString("f0"), h_foo0));
+      Dart_Handle id0 = Dart_NewInteger(ring->GetIdForObject(foo0.raw()));
+      EXPECT_VALID(id0);
+      EXPECT_VALID(Dart_SetField(h_lib, NewString("id0"), id0));
+    }
+    {
+      const String& foo1 = String::Handle(String::New("foo1", Heap::kOld));
+      Dart_Handle h_foo1 = Api::NewHandle(isolate, foo1.raw());
+      EXPECT_VALID(Dart_SetField(foo, NewString("f1"), h_foo1));
+      Dart_Handle id1 = Dart_NewInteger(ring->GetIdForObject(foo1.raw()));
+      EXPECT_VALID(id1);
+      EXPECT_VALID(Dart_SetField(h_lib, NewString("id1"), id1));
+    }
+    {
+      const String& elem = String::Handle(String::New("elem", Heap::kOld));
+      Dart_Handle h_elem = Api::NewHandle(isolate, elem.raw());
+      EXPECT_VALID(Dart_ListSetAt(lst, kElemIndex, h_elem));
+      Dart_Handle idElem = Dart_NewInteger(ring->GetIdForObject(elem.raw()));
+      EXPECT_VALID(idElem);
+      EXPECT_VALID(Dart_SetField(h_lib, NewString("idElem"), idElem));
+    }
+    Dart_ExitScope();
+  }
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  Array& service_msg = Array::Handle();
+
+  // Retaining path to 'foo0', limit 2.
+  service_msg = Eval(
+      h_lib,
+      "[0, port, ['objects', '$id0', 'retaining_path'], ['limit'], ['2']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(
+      handler.msg(),
+      "{\"type\":\"RetainingPath\",\"id\":\"retaining_path\",\"length\":2,"
+      "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\"");
+  ExpectSubstringF(handler.msg(), "\"parentField\":{\"type\":\"@Field\"");
+  ExpectSubstringF(handler.msg(), "\"name\":\"f0\"");
+  ExpectSubstringF(handler.msg(),
+      "{\"index\":1,\"value\":{\"type\":\"@Instance\"");
+
+  // Retaining path to 'foo1', limit 2.
+  service_msg = Eval(
+      h_lib,
+      "[0, port, ['objects', '$id1', 'retaining_path'], ['limit'], ['2']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(
+      handler.msg(),
+      "{\"type\":\"RetainingPath\",\"id\":\"retaining_path\",\"length\":2,"
+      "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\"");
+  ExpectSubstringF(handler.msg(), "\"parentField\":{\"type\":\"@Field\"");
+  ExpectSubstringF(handler.msg(), "\"name\":\"f1\"");
+  ExpectSubstringF(handler.msg(),
+      "{\"index\":1,\"value\":{\"type\":\"@Instance\"");
+
+  // Retaining path to 'elem', limit 2.
+  service_msg = Eval(
+      h_lib,
+      "[0, port, ['objects', '$idElem', 'retaining_path'], ['limit'], ['2']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(
+      handler.msg(),
+      "{\"type\":\"RetainingPath\",\"id\":\"retaining_path\",\"length\":2,"
+      "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\"");
+  ExpectSubstringF(handler.msg(), "\"parentListIndex\":%" Pd, kElemIndex);
+  ExpectSubstringF(handler.msg(),
+      "{\"index\":1,\"value\":{\"type\":\"@Array\"");
+}
+
+
 TEST_CASE(Service_Libraries) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
@@ -641,7 +754,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
 
   // Request library.
   service_msg = EvalF(h_lib,
@@ -707,7 +820,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
 
   // Request an invalid class id.
   service_msg = Eval(h_lib, "[0, port, ['classes', '999999'], [], []]");
@@ -727,6 +840,8 @@
   ExpectSubstringF(handler.msg(),
                    "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid);
   ExpectSubstringF(handler.msg(), "\"allocationStats\":");
+  ExpectSubstringF(handler.msg(), "\"tokenPos\":");
+  ExpectSubstringF(handler.msg(), "\"endTokenPos\":");
 
   // Evaluate an expression from class A.
   service_msg = EvalF(h_lib,
@@ -890,7 +1005,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
 
   // Request the class A over the service.
   service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid);
@@ -996,7 +1111,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
 
   // Request an invalid code object.
   service_msg = Eval(h_lib, "[0, port, ['code', '0'], [], []]");
@@ -1100,7 +1215,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(lib, "[0, port, ['vm'], [], []]");
 
   Service::HandleRootMessage(service_msg);
@@ -1132,7 +1247,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(lib, "[0, port, ['flags'], [], []]");
 
   // Make sure we can get the FlagList.
@@ -1181,7 +1296,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(h_lib, "[0, port, ['scripts', 'test-lib'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1224,7 +1339,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(h_lib, "[0, port, ['coverage'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1263,7 +1378,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(
       h_lib, "[0, port, ['scripts', 'test-lib', 'coverage'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -1317,7 +1432,7 @@
   OS::SNPrint(buf, sizeof(buf),
               "[0, port, ['libraries', '%" Pd "', 'coverage'], [], []]", i);
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(h_lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1379,7 +1494,7 @@
   OS::SNPrint(buf, sizeof(buf),
               "[0, port, ['classes', '%" Pd "', 'coverage'], [], []]", i);
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(h_lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1420,7 +1535,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(h_lib, "[0, port, ['allocationprofile'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1487,7 +1602,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(lib, "[0, port, ['heapmap'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1515,7 +1630,7 @@
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   const String& str = String::Handle(String::New("foobar", Heap::kOld));
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   // Note: If we ever introduce old space compaction, this test might fail.
   uword start_addr = RawObject::ToAddr(str.raw());
   // Expect to find 'str', also from internal addresses.
@@ -1592,7 +1707,7 @@
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(lib, "[0, port, ['alpha'], [], []]");
   Service::HandleRootMessage(service_msg);
   handler.HandleNextMessage();
@@ -1629,7 +1744,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(lib, "[0, port, ['alpha'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1670,7 +1785,7 @@
   EXPECT_VALID(port);
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
-  Instance& service_msg = Instance::Handle();
+  Array& service_msg = Array::Handle();
   service_msg = Eval(h_lib, "[0, port, ['profile'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index a8e4e17..4946642 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -269,12 +269,13 @@
   intptr_t token_pos = -1;
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
-  for (intptr_t i = 0; i < descriptors.Length(); i++) {
-    if (descriptors.PC(i) == pc) {
-      token_pos = descriptors.TokenPos(i);
-      break;
-    } else if ((token_pos <= 0) && (descriptors.PC(i) > pc)) {
-      token_pos = descriptors.TokenPos(i);
+  PcDescriptors::Iterator iter(descriptors);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    if (rec.pc == pc) {
+      return rec.token_pos;
+    } else if ((token_pos <= 0) && (rec.pc > pc)) {
+      token_pos = rec.token_pos;
     }
   }
   return token_pos;
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 0c59612..692a358 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -224,11 +224,11 @@
   REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(isolate);
   PcDescriptors& descriptors = reused_pc_descriptors_handle.Handle();
   descriptors = code.pc_descriptors();
-  const intptr_t len = descriptors.Length();
-  for (intptr_t i = 0; i < len; i++) {
-    if ((static_cast<uword>(descriptors.PC(i)) == pc()) &&
-        (descriptors.TryIndex(i) != -1)) {
-      const intptr_t try_index = descriptors.TryIndex(i);
+  PcDescriptors::Iterator iter(descriptors);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    if ((rec.pc == pc()) && (rec.try_index != -1)) {
+      const intptr_t try_index = rec.try_index;
       RawExceptionHandlers::HandlerInfo handler_info;
       handlers.GetHandlerInfo(try_index, &handler_info);
       *handler_pc = handler_info.handler_pc;
@@ -249,9 +249,11 @@
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   ASSERT(!descriptors.IsNull());
-  for (int i = 0; i < descriptors.Length(); i++) {
-    if (static_cast<uword>(descriptors.PC(i)) == pc()) {
-      return descriptors.TokenPos(i);
+  PcDescriptors::Iterator iter(descriptors);
+  while (iter.HasNext()) {
+    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    if (rec.pc == pc()) {
+      return rec.token_pos;
     }
   }
   return -1;
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 14b19bc..060fac9 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -96,9 +96,9 @@
 
 
 bool StubCode::InInvocationStubForIsolate(Isolate* isolate, uword pc) {
-  StubEntry* invoke_dart_entry = isolate->stub_code()->InvokeDartCode_entry_;
-  uword entry = invoke_dart_entry->EntryPoint();
-  uword size = invoke_dart_entry->Size();
+  StubCode* stub_code = isolate->stub_code();
+  uword entry = stub_code->InvokeDartCodeEntryPoint();
+  uword size = stub_code->InvokeDartCodeSize();
   return (pc >= entry) && (pc < (entry + size));
 }
 
@@ -142,16 +142,22 @@
 
 
 const char* StubCode::NameOfStub(uword entry_point) {
-#define STUB_CODE_TESTER(name) \
+#define VM_STUB_CODE_TESTER(name)                                              \
   if ((name##_entry() != NULL) && (entry_point == name##EntryPoint())) {       \
     return ""#name;                                                            \
   }
+  VM_STUB_CODE_LIST(VM_STUB_CODE_TESTER);
 
-  VM_STUB_CODE_LIST(STUB_CODE_TESTER);
+#define STUB_CODE_TESTER(name)                                                 \
+  if ((isolate->stub_code()->name##_entry() != NULL) &&                        \
+      (entry_point == isolate->stub_code()->name##EntryPoint())) {             \
+    return ""#name;                                                            \
+  }
   Isolate* isolate = Isolate::Current();
   if ((isolate != NULL) && (isolate->stub_code() != NULL)) {
     STUB_CODE_LIST(STUB_CODE_TESTER);
   }
+#undef VM_STUB_CODE_TESTER
 #undef STUB_CODE_TESTER
   return NULL;
 }
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index cdd7971..a01faa7 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -140,16 +140,16 @@
 
   // Define the per-isolate stub code accessors.
 #define STUB_CODE_ACCESSOR(name)                                               \
-  static StubEntry* name##_entry() {                                           \
-    return Isolate::Current()->stub_code()->name##_entry_;                     \
+  StubEntry* name##_entry() {                                                  \
+    return name##_entry_;                                                      \
   }                                                                            \
-  static const ExternalLabel& name##Label() {                                  \
+  const ExternalLabel& name##Label() {                                         \
     return name##_entry()->label();                                            \
   }                                                                            \
-  static uword name##EntryPoint() {                                            \
+  uword name##EntryPoint() {                                                   \
     return name##_entry()->EntryPoint();                                       \
   }                                                                            \
-  static intptr_t name##Size() {                                               \
+  intptr_t name##Size() {                                                      \
     return name##_entry()->Size();                                             \
   }
   STUB_CODE_LIST(STUB_CODE_ACCESSOR);
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 91b2a3b..8c19a34 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -400,11 +400,12 @@
 //   R2: smi-tagged argument count, may be zero.
 //   FP[kParamEndSlotFromFp + 1]: last argument.
 static void PushArgumentsArray(Assembler* assembler) {
+  StubCode* stub_code = Isolate::Current()->stub_code();
   // Allocate array to store arguments of caller.
   __ LoadImmediate(R1, reinterpret_cast<intptr_t>(Object::null()));
   // R1: null element type for raw Array.
   // R2: smi-tagged argument count, may be zero.
-  __ BranchLink(&StubCode::AllocateArrayLabel());
+  __ BranchLink(&stub_code->AllocateArrayLabel());
   // R0: newly allocated array.
   // R2: smi-tagged argument count, may be zero (was preserved by the stub).
   __ Push(R0);  // Array is in R0 and on top of stack.
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 8f7b793..49a1be2 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -425,11 +425,12 @@
 //   R2: smi-tagged argument count, may be zero.
 //   FP[kParamEndSlotFromFp + 1]: last argument.
 static void PushArgumentsArray(Assembler* assembler) {
+  StubCode* stub_code = Isolate::Current()->stub_code();
   // Allocate array to store arguments of caller.
   __ LoadObject(R1, Object::null_object(), PP);
   // R1: null element type for raw Array.
   // R2: smi-tagged argument count, may be zero.
-  __ BranchLink(&StubCode::AllocateArrayLabel(), PP);
+  __ BranchLink(&stub_code->AllocateArrayLabel(), PP);
   // R0: newly allocated array.
   // R2: smi-tagged argument count, may be zero (was preserved by the stub).
   __ Push(R0);  // Array is in R0 and on top of stack.
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index fa12a56..1011567 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -44,12 +44,11 @@
   const int argc = 2;
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
-  const Object& result = Object::ZoneHandle();
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   ASSERT(context.isolate() == Isolate::Current());
   __ EnterDartFrame(0);
   __ LoadObject(CTX, context, PP);
-  __ PushObject(result, PP);  // Push Null object for return value.
+  __ PushObject(Object::null_object(), PP);  // Push Null obj for return value.
   __ PushObject(smi1, PP);  // Push argument 1 smi1.
   __ PushObject(smi2, PP);  // Push argument 2 smi2.
   ASSERT(kTestSmiSubRuntimeEntry.argument_count() == argc);
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index 490b0d3..5fa5b2a 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -44,12 +44,11 @@
   const int argc = 2;
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
-  const Object& result = Object::ZoneHandle();
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   ASSERT(context.isolate() == Isolate::Current());
   __ EnterDartFrame(0);
   __ LoadObject(CTX, context);
-  __ PushObject(result);  // Push Null object for return value.
+  __ PushObject(Object::null_object());  // Push Null object for return value.
   __ PushObject(smi1);  // Push argument 1 smi1.
   __ PushObject(smi2);  // Push argument 2 smi2.
   ASSERT(kTestSmiSubRuntimeEntry.argument_count() == argc);
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index e5b1bb9..54eba9c 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -404,10 +404,11 @@
 static void PushArgumentsArray(Assembler* assembler) {
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  StubCode* stub_code = Isolate::Current()->stub_code();
 
   // Allocate array to store arguments of caller.
   __ movl(ECX, raw_null);  // Null element type for raw Array.
-  __ call(&StubCode::AllocateArrayLabel());
+  __ call(&stub_code->AllocateArrayLabel());
   __ SmiUntag(EDX);
   // EAX: newly allocated array.
   // EDX: length of the array (was preserved by the stub).
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index 796ed75..baf8f15 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -44,12 +44,11 @@
   const int argc = 2;
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
-  const Object& result = Object::ZoneHandle();
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   ASSERT(context.isolate() == Isolate::Current());
   __ enter(Immediate(0));
   __ LoadObject(CTX, context);
-  __ PushObject(result);  // Push Null object for return value.
+  __ PushObject(Object::null_object());  // Push Null object for return value.
   __ PushObject(smi1);  // Push argument 1 smi1.
   __ PushObject(smi2);  // Push argument 2 smi2.
   ASSERT(kTestSmiSubRuntimeEntry.argument_count() == argc);
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 5c9a554a..775330a 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -442,12 +442,13 @@
 //   A1: Smi-tagged argument count, may be zero.
 //   FP[kParamEndSlotFromFp + 1]: Last argument.
 static void PushArgumentsArray(Assembler* assembler) {
+  StubCode* stub_code = Isolate::Current()->stub_code();
   __ TraceSimMsg("PushArgumentsArray");
   // Allocate array to store arguments of caller.
   __ LoadImmediate(A0, reinterpret_cast<intptr_t>(Object::null()));
   // A0: Null element type for raw Array.
   // A1: Smi-tagged argument count, may be zero.
-  __ BranchLink(&StubCode::AllocateArrayLabel());
+  __ BranchLink(&stub_code->AllocateArrayLabel());
   __ TraceSimMsg("PushArgumentsArray return");
   // V0: newly allocated array.
   // A1: Smi-tagged argument count, may be zero (was preserved by the stub).
diff --git a/runtime/vm/stub_code_mips_test.cc b/runtime/vm/stub_code_mips_test.cc
index a5dd2f1..00c5112 100644
--- a/runtime/vm/stub_code_mips_test.cc
+++ b/runtime/vm/stub_code_mips_test.cc
@@ -44,12 +44,11 @@
   const int argc = 2;
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
-  const Object& result = Object::ZoneHandle();
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   ASSERT(context.isolate() == Isolate::Current());
   __ EnterDartFrame(0);
   __ LoadObject(CTX, context);
-  __ PushObject(result);  // Push Null object for return value.
+  __ PushObject(Object::null_object());  // Push Null object for return value.
   __ PushObject(smi1);  // Push argument 1 smi1.
   __ PushObject(smi2);  // Push argument 2 smi2.
   ASSERT(kTestSmiSubRuntimeEntry.argument_count() == argc);
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index e13b54f..d1127e1 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -358,10 +358,12 @@
 //   R10: smi-tagged argument count, may be zero.
 //   RBP[kParamEndSlotFromFp + 1]: last argument.
 static void PushArgumentsArray(Assembler* assembler) {
+  StubCode* stub_code = Isolate::Current()->stub_code();
+
   __ LoadObject(R12, Object::null_object(), PP);
   // Allocate array to store arguments of caller.
   __ movq(RBX, R12);  // Null element type for raw Array.
-  __ call(&StubCode::AllocateArrayLabel());
+  __ call(&stub_code->AllocateArrayLabel());
   __ SmiUntag(R10);
   // RAX: newly allocated array.
   // R10: length of the array (was preserved by the stub).
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index 56b56fc..fb70f91 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -44,12 +44,11 @@
   const int argc = 2;
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
-  const Object& result = Object::ZoneHandle();
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   ASSERT(context.isolate() == Isolate::Current());
   __ EnterStubFrame(true);
   __ LoadObject(CTX, context, PP);
-  __ PushObject(result, PP);  // Push Null object for return value.
+  __ PushObject(Object::null_object(), PP);  // Push Null obj for return value.
   __ PushObject(smi1, PP);  // Push argument 1 smi1.
   __ PushObject(smi2, PP);  // Push argument 2 smi2.
   ASSERT(kTestSmiSubRuntimeEntry.argument_count() == argc);
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index baca26b..9687918 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -84,11 +84,15 @@
   final TypedElement variableElement;
 
   ClosureFieldElement(String name,
-                     this.variableElement,
-                     ClosureClassElement enclosing)
+                      this.variableElement,
+                      ClosureClassElement enclosing)
       : super(name, ElementKind.FIELD, enclosing);
 
-  ClosureClassElement get closureClass => enclosingElement;
+  /// Use [closureClass] instead.
+  @deprecated
+  get enclosingElement => super.enclosingElement;
+
+  ClosureClassElement get closureClass => super.enclosingElement;
 
   bool get hasNode => false;
 
@@ -207,6 +211,12 @@
                   BoxElement enclosingBox)
       : super(name, ElementKind.FIELD, enclosingBox);
 
+  /// Use [box] instead.
+  @deprecated
+  get enclosingElement;
+
+  BoxElement get box => super.enclosingElement;
+
   DartType computeType(Compiler compiler) => type;
 
   DartType get type => variableElement.type;
@@ -248,7 +258,11 @@
     functionSignatureCache = other.functionSignature;
   }
 
-  ClosureClassElement get closureClass => enclosingElement;
+  /// Use [closureClass] instead.
+  @deprecated
+  get enclosingElement => super.enclosingElement;
+
+  ClosureClassElement get closureClass => super.enclosingElement;
 
   bool get hasNode => expression.hasNode;
 
@@ -436,9 +450,9 @@
           fieldCaptures.add(updatedElement);
         } else {
           // A boxed element.
-          freeVariableMapping[fromElement] = updatedElement;
-          Element boxElement = updatedElement.enclosingElement;
-          assert(boxElement is BoxElement);
+          BoxFieldElement boxFieldElement = updatedElement;
+          freeVariableMapping[fromElement] = boxFieldElement;
+          BoxElement boxElement = boxFieldElement.box;
           boxes.add(boxElement);
         }
       });
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 0893a20..18aaff0 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -239,10 +239,14 @@
         TreeElementMapping treeElements = new TreeElementMapping(element);
         new tree.StatementRewriter().rewrite(definition);
         compiler.tracer.traceGraph('Statement rewriter', definition);
+        new tree.CopyPropagator().rewrite(definition);
+        compiler.tracer.traceGraph('Copy propagation', definition);
         new tree.LoopRewriter().rewrite(definition);
         compiler.tracer.traceGraph('Loop rewriter', definition);
         new tree.LogicalRewriter().rewrite(definition);
         compiler.tracer.traceGraph('Logical rewriter', definition);
+        new dart_codegen.UnshadowParameters().unshadow(definition);
+        compiler.tracer.traceGraph('Unshadow parameters', definition);
         Node node = dart_codegen.emit(element, treeElements, definition);
         return new ElementAst.internal(node, treeElements);
       }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
index f3177ae..9d02580 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
@@ -20,7 +20,7 @@
 frontend.FunctionExpression emit(FunctionElement element,
                                  dart2js.TreeElementMapping treeElements,
                                  tree.FunctionDefinition definition) {
-  FunctionExpression fn = new ASTEmitter().emit(element, definition);
+  FunctionExpression fn = new ASTEmitter().emit(definition);
   return new TreePrinter(treeElements).makeExpression(fn);
 }
 
@@ -37,12 +37,11 @@
   /// Maps local constants to their name.
   Map<VariableElement, String> constantNames = <VariableElement, String>{};
 
-  /// Maps variables to their declarations.
-  Map<tree.Variable, VariableDeclaration> variableDeclarations =
-      <tree.Variable, VariableDeclaration>{};
+  /// Variables that have had their declaration created.
+  Set<tree.Variable> declaredVariables = new Set<tree.Variable>();
 
   /// Variable names that have already been used. Used to avoid name clashes.
-  Set<String> usedVariableNames = new Set<String>();
+  Set<String> usedVariableNames;
 
   /// Statements emitted by the most recent call to [visitStatement].
   List<Statement> statementBuffer = <Statement>[];
@@ -66,23 +65,39 @@
   /// initializer.
   tree.Statement firstStatement;
 
-  FunctionExpression emit(FunctionElement element,
-                          tree.FunctionDefinition definition) {
-    functionElement = element;
+  /// Emitter for the enclosing function, or null if the current function is
+  /// not a local function.
+  ASTEmitter parent;
 
-    Parameters parameters = emitParameters(definition.parameters);
+  ASTEmitter() : usedVariableNames = new Set<String>();
+
+  ASTEmitter.inner(ASTEmitter parent)
+      : this.parent = parent,
+        usedVariableNames = parent.usedVariableNames;
+
+  FunctionExpression emit(tree.FunctionDefinition definition) {
+    functionElement = definition.element;
+
+    Parameters parameters = emitRootParameters(definition);
+
+    // Declare parameters.
+    for (tree.Variable param in definition.parameters) {
+      variableNames[param] = param.element.name;
+      usedVariableNames.add(param.element.name);
+      declaredVariables.add(param);
+    }
+
     firstStatement = definition.body;
     visitStatement(definition.body);
     removeTrailingReturn();
-    Statement body = new Block(statementBuffer);
 
     // Some of the variable declarations have already been added
     // if their first assignment could be pulled into the initializer.
     // Add the remaining variable declarations now.
     for (tree.Variable variable in variableNames.keys) {
-      if (variable.element is ParameterElement) continue;
-      if (variableDeclarations.containsKey(variable)) continue;
-      addDeclaration(variable);
+      if (!declaredVariables.contains(variable)) {
+        addDeclaration(variable);
+      }
     }
 
     // Add constant declarations.
@@ -104,24 +119,24 @@
     if (variables.length > 0) {
       bodyParts.add(new VariableDeclarations(variables));
     }
-    bodyParts.add(body);
+    bodyParts.addAll(statementBuffer);
 
-    FunctionType functionType = element.type;
+    FunctionType functionType = functionElement.type;
 
     return new FunctionExpression(
         parameters,
         new Block(bodyParts),
-        name: element.name,
+        name: functionElement.name,
         returnType: emitOptionalType(functionType.returnType))
-        ..element = element;
+        ..element = functionElement;
   }
 
   void addDeclaration(tree.Variable variable, [Expression initializer]) {
-    assert(!variableDeclarations.containsKey(variable));
+    assert(!declaredVariables.contains(variable));
     String name = getVariableName(variable);
     VariableDeclaration decl = new VariableDeclaration(name, initializer);
     decl.element = variable.element;
-    variableDeclarations[variable] = decl;
+    declaredVariables.add(variable);
     variables.add(decl);
   }
 
@@ -143,10 +158,7 @@
     if (element.functionSignature != null) {
       FunctionSignature signature = element.functionSignature;
       TypeAnnotation returnType = emitOptionalType(signature.type.returnType);
-      Parameters innerParameters = new Parameters(
-          signature.requiredParameters.mapToList(emitParameterFromElement),
-          signature.optionalParameters.mapToList(emitParameterFromElement),
-          signature.optionalParametersAreNamed);
+      Parameters innerParameters = emitParameters(signature);
       return new Parameter.function(name, returnType, innerParameters)
                  ..element = element;
     } else {
@@ -156,19 +168,35 @@
     }
   }
 
-  Parameter emitParameter(tree.Variable param) {
-    return emitParameterFromElement(param.element, getVariableName(param));
+  Parameters emitParameters(FunctionSignature signature) {
+    return new Parameters(
+        signature.requiredParameters.mapToList(emitParameterFromElement),
+        signature.optionalParameters.mapToList(emitParameterFromElement),
+        signature.optionalParametersAreNamed);
   }
 
-  Parameters emitParameters(List<tree.Variable> params) {
-    return new Parameters(params.map(emitParameter).toList(growable:false));
+  /// Emits parameters that are not nested inside other parameters.
+  /// Root parameters can have default values, while inner parameters cannot.
+  Parameters emitRootParameters(tree.FunctionDefinition function) {
+    FunctionSignature signature = function.element.functionSignature;
+    List<ConstExp> defaults = function.defaultParameterValues;
+    List<Parameter> required =
+        signature.requiredParameters.mapToList(emitParameterFromElement);
+    List<Parameter> optional = new List<Parameter>(defaults.length);
+    for (int i = 0; i < defaults.length; i++) {
+      ParameterElement element = signature.orderedOptionalParameters[i];
+      optional[i] = emitParameterFromElement(element);
+      Expression constant = emitConstant(defaults[i]);
+      if (!isNullLiteral(constant)) {
+        optional[i].defaultValue = constant;
+      }
+    }
+    return new Parameters(required, optional,
+        signature.optionalParametersAreNamed);
   }
 
   /// True if the two expressions are a reference to the same variable.
   bool isSameVariable(Receiver e1, Receiver e2) {
-    // TODO(asgerf): Using the annotated element isn't the best way to do this
-    // since elements are supposed to go away from codegen when we discard the
-    // old backend.
     return e1 is Identifier &&
            e2 is Identifier &&
            e1.element is VariableElement &&
@@ -233,10 +261,23 @@
   /// Generates a name for the given variable and synthesizes an element for it,
   /// if necessary.
   String getVariableName(tree.Variable variable) {
+    // If the variable belongs to an enclosing function, ask the parent emitter
+    // for the variable name.
+    if (variable.host.element != functionElement) {
+      return parent.getVariableName(variable);
+    }
+
+    // Get the name if we already have one.
     String name = variableNames[variable];
     if (name != null) {
       return name;
     }
+
+    // Synthesize a variable name that isn't used elsewhere.
+    // The [usedVariableNames] set is shared between nested emitters,
+    // so this also prevents clash with variables in an enclosing/inner scope.
+    // The renaming phase after codegen will further prefix local variables
+    // so they cannot clash with top-level variables or fields.
     String prefix = variable.element == null ? 'v' : variable.element.name;
     int counter = 0;
     name = variable.element == null ? '$prefix$counter' : variable.element.name;
@@ -259,6 +300,10 @@
   }
 
   String getConstantName(VariableElement element) {
+    assert(element.kind == ElementKind.VARIABLE);
+    if (element.enclosingElement != functionElement) {
+      return parent.getConstantName(element);
+    }
     String name = constantNames[element];
     if (name != null) {
       return name;
@@ -274,18 +319,54 @@
     return name;
   }
 
+  bool isNullLiteral(Expression exp) => exp is Literal && exp.value.isNull;
+
   void visitAssign(tree.Assign stmt) {
+    // Try to emit a local function declaration. This is useful for functions
+    // that may occur in expression context, but could not be inlined anywhere.
+    if (stmt.variable.element is FunctionElement &&
+        stmt.definition is tree.FunctionExpression &&
+        !declaredVariables.contains(stmt.variable)) {
+      tree.FunctionExpression functionExp = stmt.definition;
+      FunctionExpression function = makeSubFunction(functionExp.definition);
+      FunctionDeclaration decl = new FunctionDeclaration(function);
+      statementBuffer.add(decl);
+      declaredVariables.add(stmt.variable);
+      visitStatement(stmt.next);
+      return;
+    }
+
     bool isFirstOccurrence = (variableNames[stmt.variable] == null);
+    bool isDeclaredHere = stmt.variable.host.element == functionElement;
     String name = getVariableName(stmt.variable);
     Expression definition = visitExpression(stmt.definition);
-    if (firstStatement == stmt && isFirstOccurrence) {
+
+    // Try to pull into initializer.
+    if (firstStatement == stmt && isFirstOccurrence && isDeclaredHere) {
+      if (isNullLiteral(definition)) definition = null;
       addDeclaration(stmt.variable, definition);
       firstStatement = stmt.next;
-    } else {
-      statementBuffer.add(new ExpressionStatement(makeAssignment(
-          visitVariable(stmt.variable),
-          definition)));
+      visitStatement(stmt.next);
+      return;
     }
+
+    // Emit a variable declaration if we are required to do so.
+    // This is to ensure that a fresh closure variable is created.
+    if (stmt.isDeclaration) {
+      assert(isFirstOccurrence);
+      assert(isDeclaredHere);
+      if (isNullLiteral(definition)) definition = null;
+      VariableDeclaration decl = new VariableDeclaration(name, definition)
+                                     ..element = stmt.variable.element;
+      declaredVariables.add(stmt.variable);
+      statementBuffer.add(new VariableDeclarations([decl]));
+      visitStatement(stmt.next);
+      return;
+    }
+
+    statementBuffer.add(new ExpressionStatement(makeAssignment(
+        visitVariable(stmt.variable),
+        definition)));
     visitStatement(stmt.next);
   }
 
@@ -331,10 +412,6 @@
   }
 
   void visitWhileTrue(tree.WhileTrue stmt) {
-    List<Expression> updates = stmt.updates.reversed
-                                           .map(visitExpression)
-                                           .toList(growable:false);
-
     List<Statement> savedBuffer = statementBuffer;
     tree.Statement savedFallthrough = fallthrough;
     statementBuffer = <Statement>[];
@@ -342,7 +419,8 @@
 
     visitStatement(stmt.body);
     Statement body = new Block(statementBuffer);
-    Statement statement = new For(null, null, updates, body);
+    Statement statement = new While(new Literal(new dart2js.TrueConstant()),
+                                    body);
     if (usedLabels.remove(stmt.label.name)) {
       statement = new LabeledStatement(stmt.label.name, statement);
     }
@@ -354,9 +432,6 @@
 
   void visitWhileCondition(tree.WhileCondition stmt) {
     Expression condition = visitExpression(stmt.condition);
-    List<Expression> updates = stmt.updates.reversed
-                                           .map(visitExpression)
-                                           .toList(growable:false);
 
     List<Statement> savedBuffer = statementBuffer;
     tree.Statement savedFallthrough = fallthrough;
@@ -366,12 +441,7 @@
     visitStatement(stmt.body);
     Statement body = new Block(statementBuffer);
     Statement statement;
-    if (updates.isEmpty) {
-      // while(E) is the same as for(;E;), but the former is nicer
-      statement = new While(condition, body);
-    } else {
-      statement = new For(null, condition, updates, body);
-    }
+    statement = new While(condition, body);
     if (usedLabels.remove(stmt.label.name)) {
       statement = new LabeledStatement(stmt.label.name, statement);
     }
@@ -392,8 +462,8 @@
   }
 
   Expression visitReifyTypeVar(tree.ReifyTypeVar exp) {
-    return new ReifyTypeVar(exp.element.name)
-               ..element = exp.element;
+    return new ReifyTypeVar(exp.typeVariable.name)
+               ..element = exp.typeVariable;
   }
 
   Expression visitLiteralList(tree.LiteralList exp) {
@@ -538,6 +608,25 @@
                ..element = exp.element;
   }
 
+  FunctionExpression makeSubFunction(tree.FunctionDefinition function) {
+    return new ASTEmitter.inner(this).emit(function);
+  }
+
+  Expression visitFunctionExpression(tree.FunctionExpression exp) {
+    return makeSubFunction(exp.definition)..name = null;
+  }
+
+  void visitFunctionDeclaration(tree.FunctionDeclaration node) {
+    assert(variableNames[node.variable] == null);
+    String name = getVariableName(node.variable);
+    FunctionExpression inner = makeSubFunction(node.definition);
+    inner.name = name;
+    FunctionDeclaration decl = new FunctionDeclaration(inner);
+    declaredVariables.add(node.variable);
+    statementBuffer.add(decl);
+    visitStatement(node.next);
+  }
+
   TypeAnnotation emitType(DartType type) {
     if (type is GenericType) {
       return new TypeAnnotation(
@@ -554,9 +643,8 @@
       return new TypeAnnotation("dynamic")
           ..dartType = type;
     } else if (type is MalformedType) {
-      // treat malformed types as dynamic
-      return new TypeAnnotation("dynamic")
-          ..dartType = const DynamicType();
+      return new TypeAnnotation(type.name)
+          ..dartType = type;
     } else {
       throw "Unsupported type annotation: $type";
     }
@@ -636,9 +724,13 @@
   }
 
   Expression visitVariable(VariableConstExp exp) {
-    String name = parent.getConstantName(exp.element);
+    Element element = exp.element;
+    if (element.kind != ElementKind.VARIABLE) {
+      return new Identifier(element.name)..element = element;
+    }
+    String name = parent.getConstantName(element);
     return new Identifier(name)
-               ..element = exp.element;
+               ..element = element;
   }
 
   Expression visitFunction(FunctionConstExp exp) {
@@ -647,3 +739,56 @@
   }
 
 }
+
+/// Moves function parameters into a separate variable if one of its uses is
+/// shadowed by an inner function parameter.
+/// This artifact is necessary because function parameters cannot be renamed.
+class UnshadowParameters extends tree.RecursiveVisitor {
+
+  /// Maps parameter names to their bindings.
+  Map<String, tree.Variable> environment = <String, tree.Variable>{};
+
+  /// Parameters that are currently shadowed by another parameter.
+  Set<tree.Variable> shadowedParameters = new Set<tree.Variable>();
+
+  /// Parameters that are used in a context where it is shadowed.
+  Set<tree.Variable> hasShadowedUse = new Set<tree.Variable>();
+
+  void unshadow(tree.FunctionDefinition definition) {
+    visitFunctionDefinition(definition);
+  }
+
+  visitFunctionDefinition(tree.FunctionDefinition definition) {
+    var oldShadow = shadowedParameters;
+    var oldEnvironment = environment;
+    environment = new Map<String, tree.Variable>.from(environment);
+    shadowedParameters = new Set<tree.Variable>.from(shadowedParameters);
+    for (tree.Variable param in definition.parameters) {
+      tree.Variable oldVariable = environment[param.element.name];
+      if (oldVariable != null) {
+        shadowedParameters.add(oldVariable);
+      }
+      environment[param.element.name] = param;
+    }
+    visitStatement(definition.body);
+    environment = oldEnvironment;
+    shadowedParameters = oldShadow;
+
+    for (int i=0; i<definition.parameters.length; i++) {
+      tree.Variable param = definition.parameters[i];
+      if (hasShadowedUse.remove(param)) {
+        tree.Variable newParam = new tree.Variable(definition, param.element);
+        definition.parameters[i] = newParam;
+        definition.body = new tree.Assign(param, newParam, definition.body);
+        newParam.writeCount = 1; // Being a parameter counts as a write.
+      }
+    }
+  }
+
+  visitVariable(tree.Variable variable) {
+    if (shadowedParameters.contains(variable)) {
+      hasShadowedUse.add(variable);
+    }
+  }
+
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
index 139b7eb..527ef26 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(asgerf): Include metadata.
-// TODO(asgerf): Include cascade operator.
 library dart_printer;
 
 import '../dart2jslib.dart' as dart2js;
@@ -240,15 +238,14 @@
 
 
 class FunctionDeclaration extends Statement {
-  final TypeAnnotation returnType;
-  final Parameters parameters;
-  final String name;
-  final Statement body;
+  final FunctionExpression function;
 
-  FunctionDeclaration(this.name,
-                      this.parameters,
-                      this.body,
-                      [ this.returnType ]);
+  TypeAnnotation get returnType => function.returnType;
+  Parameters get parameters => function.parameters;
+  String get name => function.name;
+  Statement get body => function.body;
+
+  FunctionDeclaration(this.function);
 }
 
 class Parameters extends Node {
@@ -276,7 +273,7 @@
   /// Type of parameter, or return type of function parameter.
   final TypeAnnotation type;
 
-  final Expression defaultValue;
+  Expression defaultValue;
 
   /// Parameters to function parameter. Null for non-function parameters.
   final Parameters parameters;
@@ -295,15 +292,13 @@
 
   /// True if this is a function parameter.
   bool get isFunction => parameters != null;
-
-  // TODO(asgerf): Support modifiers on parameters (final, ...).
 }
 
 // EXPRESSIONS
 
 class FunctionExpression extends Expression {
   final TypeAnnotation returnType;
-  final String name;
+  String name;
   final Parameters parameters;
   final Statement body;
 
@@ -713,7 +708,7 @@
   }
 
   void writeOperator(String operator) {
-    write(" "); // TODO(asgerf): Minimize use of whitespace.
+    write(" "); // TODO(sigurdm,kmillikin): Minimize use of whitespace.
     write(operator);
     write(" ");
   }
@@ -753,9 +748,7 @@
   /// Abusing terminology slightly, the function accepts a [Receiver] which
   /// may also be the [SuperReceiver] object.
   void writeExp(Receiver e, int minPrecedence, {beginStmt:false}) {
-    // TODO(asgerf):
-    //   Would there be a significant speedup using a Visitor or a method
-    //   on the AST instead of a chain of "if (e is T)" statements?
+    // TODO(kmillikin,sigurdm): it might be faster to use a Visitor.
     void withPrecedence(int actual, void action()) {
       if (actual < minPrecedence) {
         write("(");
@@ -787,8 +780,9 @@
           write(e.name);
         }
         writeParameters(e.parameters);
-        if (stmt is Return) { // TODO(asgerf): Print {} for "return null;"
-          write('=> '); // TODO(asgerf): Minimize use of whitespace.
+        // TODO(sigurdm,kmillikin): Print {} for "return null;"
+        if (stmt is Return) {
+          write('=> ');
           writeExp(stmt.expression, EXPRESSION);
         } else {
           writeBlock(stmt);
@@ -800,7 +794,7 @@
     } else if (e is Conditional) {
       withPrecedence(CONDITIONAL, () {
         writeExp(e.condition, LOGICAL_OR, beginStmt: beginStmt);
-        write(' ? '); // TODO(asgerf): Minimize use of whitespace.
+        write(' ? ');
         writeExp(e.thenExpression, EXPRESSION);
         write(' : ');
         writeExp(e.elseExpression, EXPRESSION);
@@ -833,7 +827,7 @@
       }
     } else if (e is LiteralList) {
       if (e.isConst) {
-        write(' const '); // TODO(asgerf): Minimize use of whitespace.
+        write(' const ');
       }
       if (e.typeArgument != null) {
         write('<');
@@ -849,7 +843,7 @@
       // are at the beginning of a statement.
       bool needParen = beginStmt;
       if (e.isConst) {
-        write(' const '); // TODO(asgerf): Minimize use of whitespace.
+        write(' const ');
         needParen = false;
       }
       if (e.typeArguments.length > 0) {
@@ -864,7 +858,7 @@
       write('{');
       writeEach(',', e.entries, (LiteralMapEntry en) {
         writeExp(en.key, EXPRESSION);
-        write(' : '); // TODO(asgerf): Minimize use of whitespace.
+        write(' : ');
         writeExp(en.value, EXPRESSION);
       });
       write('}');
@@ -873,7 +867,7 @@
       }
     } else if (e is LiteralSymbol) {
       write('#');
-      write(e.id); // TODO(asgerf): Do we need to escape something here?
+      write(e.id);
     } else if (e is LiteralType) {
       withPrecedence(TYPE_LITERAL, () {
         write(e.name);
@@ -900,7 +894,7 @@
           operand is TypeOperator && operand.operator == 'is') {
         withPrecedence(RELATIONAL, () {
           writeExp(operand.expression, BITWISE_OR, beginStmt: beginStmt);
-          write(' is!'); // TODO(asgerf): Minimize use of whitespace.
+          write(' is!');
           writeType(operand.type);
         });
       }
@@ -966,7 +960,7 @@
       });
     } else if (e is CallNew) {
       withPrecedence(CALLEE, () {
-        write(' '); // TODO(asgerf): Minimize use of whitespace.
+        write(' ');
         write(e.isConst ? 'const ' : 'new ');
         writeType(e.type);
         if (e.constructorName != null) {
@@ -1105,7 +1099,7 @@
       write(')');
       writeStatement(stmt.body, shortIf: shortIf);
     } else if (stmt is DoWhile) {
-      write('do '); // TODO(asgerf): Minimize use of whitespace.
+      write('do ');
       writeStatement(stmt.body);
       write('while(');
       writeExp(stmt.condition, EXPRESSION);
@@ -1199,7 +1193,7 @@
       writeParameters(stmt.parameters);
       Statement body = unfoldBlocks(stmt.body);
       if (body is Return) {
-        write('=> '); // TODO(asgerf): Minimize use of whitespace.
+        write('=> ');
         writeExp(body.expression, EXPRESSION);
         write(';');
       } else {
@@ -1274,7 +1268,7 @@
   /// A list of string quotings that the printer may use to quote strings.
   // Ignore multiline quotings for now. Would need to make sure that no
   // newline (potentially prefixed by whitespace) follows the quoting.
-  // TODO(asgerf): Include multiline quotation schemes.
+  // TODO(sigurdm,kmillikin): Include multiline quotation schemes.
   static const _QUOTINGS = const <tree.StringQuoting>[
       const tree.StringQuoting(characters.$DQ, raw: false, leftQuoteLength: 1),
       const tree.StringQuoting(characters.$DQ, raw: true, leftQuoteLength: 1),
@@ -1283,7 +1277,7 @@
   ];
 
   static StringLiteralOutput analyzeStringLiteral(Expression node) {
-    // TODO(asgerf): This might be a bit too expensive. Benchmark.
+    // TODO(sigurdm,kmillikin): This might be a bit too expensive. Benchmark.
     // Flatten the StringConcat tree.
     List parts = []; // Expression or int (char node)
     void collectParts(Expression e) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
index 424034a..7149db8 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
@@ -26,6 +26,9 @@
 //
 // In contrast to the CPS-based IR, non-primitive expressions can be named and
 // arguments (to calls, primitives, and blocks) can be arbitrary expressions.
+//
+// Additionally, variables are considered in scope within inner functions;
+// closure variables are thus handled directly instead of using ref cells.
 
 /**
  * The base class of all Tree nodes.
@@ -82,13 +85,24 @@
  * Variables are [Expression]s.
  */
 class Variable extends Expression {
+  /// Function that declares this variable.
+  FunctionDefinition host;
+
   /// Element used for synthesizing a name for the variable.
   /// Different variables may have the same element. May be null.
   Element element;
 
   int readCount = 0;
 
-  Variable(this.element);
+  /// Number of places where this variable occurs as:
+  /// - left-hand of an [Assign]
+  /// - left-hand of a [FunctionDeclaration]
+  /// - parameter in a [FunctionDefinition]
+  int writeCount = 0;
+
+  Variable(this.host, this.element) {
+    assert(host != null);
+  }
 
   accept(ExpressionVisitor visitor) => visitor.visitVariable(this);
 }
@@ -140,14 +154,14 @@
 
   InvokeSuperMethod(this.selector, this.arguments) ;
 
-  accept(Visitor visitor) => visitor.visitInvokeSuperMethod(this);
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeSuperMethod(this);
 }
 
 /**
  * Call to a factory or generative constructor.
  */
 class InvokeConstructor extends Expression implements Invoke {
-  final GenericType type;
+  final DartType type;
   final FunctionElement target;
   final List<Expression> arguments;
   final Selector selector;
@@ -188,15 +202,15 @@
 }
 
 class This extends Expression {
-  accept(Visitor visitor) => visitor.visitThis(this);
+  accept(ExpressionVisitor visitor) => visitor.visitThis(this);
 }
 
 class ReifyTypeVar extends Expression {
-  TypeVariableElement element;
+  TypeVariableElement typeVariable;
 
-  ReifyTypeVar(this.element);
+  ReifyTypeVar(this.typeVariable);
 
-  accept(Visitor visitor) => visitor.visitReifyTypeVar(this);
+  accept(ExpressionVisitor visitor) => visitor.visitReifyTypeVar(this);
 }
 
 class LiteralList extends Expression {
@@ -264,6 +278,33 @@
   accept(ExpressionVisitor visitor) => visitor.visitNot(this);
 }
 
+class FunctionExpression extends Expression {
+  final FunctionDefinition definition;
+
+  FunctionExpression(this.definition) {
+    assert(definition.element.functionSignature.type.returnType.treatAsDynamic);
+  }
+
+  accept(ExpressionVisitor visitor) => visitor.visitFunctionExpression(this);
+}
+
+/// Declares a local function.
+/// Used for functions that may not occur in expression context due to
+/// being recursive or having a return type.
+/// The [variable] must not occur as the left-hand side of an [Assign] or
+/// any other [FunctionDeclaration].
+class FunctionDeclaration extends Statement {
+  Variable variable;
+  final FunctionDefinition definition;
+  Statement next;
+
+  FunctionDeclaration(this.variable, this.definition, this.next) {
+    ++variable.writeCount;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitFunctionDeclaration(this);
+}
+
 /// A [LabeledStatement] or [WhileTrue] or [WhileCondition].
 abstract class JumpTarget extends Statement {
   Label get label;
@@ -289,9 +330,6 @@
 
 /// A [WhileTrue] or [WhileCondition] loop.
 abstract class Loop extends JumpTarget {
-  /// When a [Continue] to a loop is executed, all update expressions are
-  /// evaluated right-to-left before control resumes at the head of the loop.
-  List<Expression> get updates;
 }
 
 /**
@@ -300,7 +338,6 @@
 class WhileTrue extends Loop {
   final Label label;
   Statement body;
-  final List<Expression> updates = <Expression>[];
 
   WhileTrue(this.label, this.body) {
     assert(label.binding == null);
@@ -328,10 +365,9 @@
   Expression condition;
   Statement body;
   Statement next;
-  final List<Expression> updates;
 
   WhileCondition(this.label, this.condition, this.body,
-                 this.next, this.updates) {
+                 this.next) {
     assert(label.binding == null);
     label.binding = this;
   }
@@ -386,10 +422,18 @@
  */
 class Assign extends Statement {
   Statement next;
-  final Variable variable;
+  Variable variable;
   Expression definition;
 
-  Assign(this.variable, this.definition, this.next);
+  /// If true, this declares a new copy of the closure variable.
+  /// The consequences are similar to [ir.SetClosureVariable].
+  /// All uses of the variable must be nested inside the [next] statement.
+  bool isDeclaration;
+
+  Assign(this.variable, this.definition, this.next,
+         { this.isDeclaration: false }) {
+    variable.writeCount++;
+  }
 
   bool get hasExactlyOneUse => variable.readCount == 1;
 
@@ -440,11 +484,14 @@
 }
 
 class FunctionDefinition extends Node {
+  final FunctionElement element;
   final List<Variable> parameters;
   Statement body;
   final List<ConstDeclaration> localConstants;
+  final List<ConstExp> defaultParameterValues;
 
-  FunctionDefinition(this.parameters, this.body, this.localConstants);
+  FunctionDefinition(this.element, this.parameters, this.body,
+      this.localConstants, this.defaultParameterValues);
 }
 
 abstract class ExpressionVisitor<E> {
@@ -464,6 +511,7 @@
   E visitLiteralList(LiteralList node);
   E visitLiteralMap(LiteralMap node);
   E visitTypeOperator(TypeOperator node);
+  E visitFunctionExpression(FunctionExpression node);
 }
 
 abstract class StatementVisitor<S> {
@@ -476,6 +524,7 @@
   S visitIf(If node);
   S visitWhileTrue(WhileTrue node);
   S visitWhileCondition(WhileCondition node);
+  S visitFunctionDeclaration(FunctionDeclaration node);
   S visitExpressionStatement(ExpressionStatement node);
 }
 
@@ -485,6 +534,120 @@
    S visitStatement(Statement s) => s.accept(this);
 }
 
+class RecursiveVisitor extends Visitor {
+  visitFunctionDefinition(FunctionDefinition node) {
+    visitStatement(node.body);
+  }
+
+  visitVariable(Variable node) {}
+
+  visitInvokeStatic(InvokeStatic node) {
+    node.arguments.forEach(visitExpression);
+  }
+
+  visitInvokeMethod(InvokeMethod node) {
+    visitExpression(node.receiver);
+    node.arguments.forEach(visitExpression);
+  }
+
+  visitInvokeSuperMethod(InvokeSuperMethod node) {
+    node.arguments.forEach(visitExpression);
+  }
+
+  visitInvokeConstructor(InvokeConstructor node) {
+    node.arguments.forEach(visitExpression);
+  }
+
+  visitConcatenateStrings(ConcatenateStrings node) {
+    node.arguments.forEach(visitExpression);
+  }
+
+  visitConstant(Constant node) {}
+
+  visitThis(This node) {}
+
+  visitReifyTypeVar(ReifyTypeVar node) {}
+
+  visitConditional(Conditional node) {
+    visitExpression(node.condition);
+    visitExpression(node.thenExpression);
+    visitExpression(node.elseExpression);
+  }
+
+  visitLogicalOperator(LogicalOperator node) {
+    visitExpression(node.left);
+    visitExpression(node.right);
+  }
+
+  visitNot(Not node) {
+    visitExpression(node.operand);
+  }
+
+  visitLiteralList(LiteralList node) {
+    node.values.forEach(visitExpression);
+  }
+
+  visitLiteralMap(LiteralMap node) {
+    for (int i=0; i<node.keys.length; i++) {
+      visitExpression(node.keys[i]);
+      visitExpression(node.values[i]);
+    }
+  }
+
+  visitTypeOperator(TypeOperator node) {
+    visitExpression(node.receiver);
+  }
+
+  visitFunctionExpression(FunctionExpression node) {
+    visitFunctionDefinition(node.definition);
+  }
+
+  visitLabeledStatement(LabeledStatement node) {
+    visitStatement(node.body);
+    visitStatement(node.next);
+  }
+
+  visitAssign(Assign node) {
+    visitExpression(node.definition);
+    visitVariable(node.variable);
+    visitStatement(node.next);
+  }
+
+  visitReturn(Return node) {
+    visitExpression(node.value);
+  }
+
+  visitBreak(Break node) {}
+
+  visitContinue(Continue node) {}
+
+  visitIf(If node) {
+    visitExpression(node.condition);
+    visitStatement(node.thenStatement);
+    visitStatement(node.elseStatement);
+  }
+
+  visitWhileTrue(WhileTrue node) {
+    visitStatement(node.body);
+  }
+
+  visitWhileCondition(WhileCondition node) {
+    visitExpression(node.condition);
+    visitStatement(node.body);
+    visitStatement(node.next);
+  }
+
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    visitFunctionDefinition(node.definition);
+    visitStatement(node.next);
+  }
+
+  visitExpressionStatement(ExpressionStatement node) {
+    visitExpression(node.expression);
+    visitStatement(node.next);
+  }
+}
+
 /**
  * Builder translates from CPS-based IR to direct-style Tree.
  *
@@ -524,6 +687,10 @@
   final Map<Element, List<Variable>> element2variables =
       <Element,List<Variable>>{};
 
+  /// Like [element2variables], except for closure variables. Closure variables
+  /// are not subject to SSA, so at most one variable is used per element.
+  final Map<Element, Variable> element2closure = <Element, Variable>{};
+
   // Continuations with more than one use are replaced with Tree labels.  This
   // is the mapping from continuations to labels.
   final Map<ir.Continuation, Label> labels = <ir.Continuation, Label>{};
@@ -531,25 +698,43 @@
   FunctionDefinition function;
   ir.Continuation returnContinuation;
 
-  /// Variable used in [buildPhiAssignments] as a temporary when swapping
-  /// variables.
-  final Variable tempVar = new Variable(null);
+  Builder parent;
 
   Builder(this.compiler);
 
+  Builder.inner(Builder parent)
+      : this.parent = parent,
+        compiler = parent.compiler;
+
+  /// Variable used in [buildPhiAssignments] as a temporary when swapping
+  /// variables.
+  Variable phiTempVar;
+
+  Variable getClosureVariable(Element element) {
+    if (element.enclosingElement != function.element) {
+      return parent.getClosureVariable(element);
+    }
+    Variable variable = element2closure[element];
+    if (variable == null) {
+      variable = new Variable(function, element);
+      element2closure[element] = variable;
+    }
+    return variable;
+  }
+
   /// Obtains the variable representing the given primitive. Returns null for
   /// primitives that have no reference and do not need a variable.
   Variable getVariable(ir.Primitive primitive) {
     if (primitive.registerIndex == null) {
       return null; // variable is unused
     }
-    List<Variable> variables = element2variables[primitive.element];
+    List<Variable> variables = element2variables[primitive.hint];
     if (variables == null) {
       variables = <Variable>[];
-      element2variables[primitive.element] = variables;
+      element2variables[primitive.hint] = variables;
     }
     while (variables.length <= primitive.registerIndex) {
-      variables.add(new Variable(primitive.element));
+      variables.add(new Variable(function, primitive.hint));
     }
     return variables[primitive.registerIndex];
   }
@@ -652,9 +837,9 @@
         // Cycle found; store argument in a temporary variable.
         // The temporary will then be used as right-hand side when the
         // assignment gets added.
-        if (assignmentSrc[i] != tempVar) { // Only move to temporary once.
-          assignmentSrc[i] = tempVar;
-          addAssignment(tempVar, arg);
+        if (assignmentSrc[i] != phiTempVar) { // Only move to temporary once.
+          assignmentSrc[i] = phiTempVar;
+          addAssignment(phiTempVar, arg);
         }
         return;
       }
@@ -683,24 +868,40 @@
     return first;
   }
 
+  visitNode(ir.Node node) => throw "Unhandled node: $node";
+
   Expression visitFunctionDefinition(ir.FunctionDefinition node) {
-    returnContinuation = node.returnContinuation;
     List<Variable> parameters = <Variable>[];
+    function = new FunctionDefinition(node.element, parameters,
+        null, node.localConstants, node.defaultParameterValues);
+    returnContinuation = node.returnContinuation;
     for (ir.Parameter p in node.parameters) {
       Variable parameter = getVariable(p);
       assert(parameter != null);
+      ++parameter.writeCount; // Being a parameter counts as a write.
       parameters.add(parameter);
     }
-    function = new FunctionDefinition(parameters, visit(node.body),
-        node.localConstants);
+    phiTempVar = new Variable(function, null);
+    function.body = visit(node.body);
     return null;
   }
 
   Statement visitLetPrim(ir.LetPrim node) {
     Variable variable = getVariable(node.primitive);
-    return variable == null
-        ? visit(node.body)
-        : new Assign(variable, visit(node.primitive), visit(node.body));
+
+    // Don't translate unused primitives.
+    if (variable == null) return visit(node.body);
+
+    Node definition = visit(node.primitive);
+
+    // visitPrimitive returns a Statement without successor if it cannot occur
+    // in expression context (currently only the case for FunctionDeclarations).
+    if (definition is Statement) {
+      definition.next = visit(node.body);
+      return definition;
+    } else {
+      return new Assign(variable, definition, visit(node.body));
+    }
   }
 
   Statement visitLetCont(ir.LetCont node) {
@@ -726,87 +927,69 @@
     // Calls are translated to direct style.
     List<Expression> arguments = translateArguments(node.arguments);
     Expression invoke = new InvokeStatic(node.target, node.selector, arguments);
-    ir.Continuation cont = node.continuation.definition;
-    if (cont == returnContinuation) {
-      return new Return(invoke);
-    } else {
-      assert(cont.hasExactlyOneUse);
-      assert(cont.parameters.length == 1);
-      return buildContinuationAssignment(cont.parameters.single, invoke,
-          () => visit(cont.body));
-    }
+    return continueWithExpression(node.continuation, invoke);
   }
 
   Statement visitInvokeMethod(ir.InvokeMethod node) {
     Expression receiver = getVariableReference(node.receiver);
     List<Expression> arguments = translateArguments(node.arguments);
     Expression invoke = new InvokeMethod(receiver, node.selector, arguments);
-    ir.Continuation cont = node.continuation.definition;
-    if (cont == returnContinuation) {
-      return new Return(invoke);
-    } else {
-      assert(cont.hasExactlyOneUse);
-      assert(cont.parameters.length == 1);
-      return buildContinuationAssignment(cont.parameters.single, invoke,
-          () => visit(cont.body));
-    }
+    return continueWithExpression(node.continuation, invoke);
   }
 
   Statement visitInvokeSuperMethod(ir.InvokeSuperMethod node) {
     List<Expression> arguments = translateArguments(node.arguments);
     Expression invoke = new InvokeSuperMethod(node.selector, arguments);
-    ir.Continuation cont = node.continuation.definition;
-    if (cont == returnContinuation) {
-      return new Return(invoke);
-    } else {
-      assert(cont.hasExactlyOneUse);
-      assert(cont.parameters.length == 1);
-      return buildContinuationAssignment(cont.parameters.single, invoke,
-          () => visit(cont.body));
-    }
+    return continueWithExpression(node.continuation, invoke);
   }
 
   Statement visitConcatenateStrings(ir.ConcatenateStrings node) {
     List<Expression> arguments = translateArguments(node.arguments);
     Expression concat = new ConcatenateStrings(arguments);
-    ir.Continuation cont = node.continuation.definition;
+    return continueWithExpression(node.continuation, concat);
+  }
+
+  Statement continueWithExpression(ir.Reference continuation,
+                                   Expression expression) {
+    ir.Continuation cont = continuation.definition;
     if (cont == returnContinuation) {
-      return new Return(concat);
+      return new Return(expression);
     } else {
       assert(cont.hasExactlyOneUse);
       assert(cont.parameters.length == 1);
-      return buildContinuationAssignment(cont.parameters.single, concat,
+      return buildContinuationAssignment(cont.parameters.single, expression,
           () => visit(cont.body));
     }
   }
 
+  Expression visitGetClosureVariable(ir.GetClosureVariable node) {
+    return getClosureVariable(node.variable);
+  }
+
+  Statement visitSetClosureVariable(ir.SetClosureVariable node) {
+    Variable variable = getClosureVariable(node.variable);
+    Expression value = getVariableReference(node.value);
+    return new Assign(variable, value, visit(node.body),
+                      isDeclaration: node.isDeclaration);
+  }
+
+  Statement visitDeclareFunction(ir.DeclareFunction node) {
+    Variable variable = getClosureVariable(node.variable);
+    FunctionDefinition function = makeSubFunction(node.definition);
+    return new FunctionDeclaration(variable, function, visit(node.body));
+  }
+
   Statement visitAsCast(ir.AsCast node) {
     Expression receiver = getVariableReference(node.receiver);
     Expression concat = new TypeOperator(receiver, node.type, "as");
-    ir.Continuation cont = node.continuation.definition;
-    if (cont == returnContinuation) {
-      return new Return(concat);
-    } else {
-      assert(cont.hasExactlyOneUse);
-      assert(cont.parameters.length == 1);
-      return buildContinuationAssignment(cont.parameters.single, concat,
-          () => visit(cont.body));
-    }
+    return continueWithExpression(node.continuation, concat);
   }
 
   Statement visitInvokeConstructor(ir.InvokeConstructor node) {
     List<Expression> arguments = translateArguments(node.arguments);
     Expression invoke =
         new InvokeConstructor(node.type, node.target, node.selector, arguments);
-    ir.Continuation cont = node.continuation.definition;
-    if (cont == returnContinuation) {
-      return new Return(invoke);
-    } else {
-      assert(cont.hasExactlyOneUse);
-      assert(cont.parameters.length == 1);
-      return buildContinuationAssignment(cont.parameters.single, invoke,
-          () => visit(cont.body));
-    }
+    return continueWithExpression(node.continuation, invoke);
   }
 
   Statement visitInvokeContinuation(ir.InvokeContinuation node) {
@@ -870,7 +1053,7 @@
   }
 
   Expression visitReifyTypeVar(ir.ReifyTypeVar node) {
-    return new ReifyTypeVar(node.element);
+    return new ReifyTypeVar(node.typeVariable);
   }
 
   Expression visitLiteralList(ir.LiteralList node) {
@@ -886,6 +1069,23 @@
         translateArguments(node.values));
   }
 
+  FunctionDefinition makeSubFunction(ir.FunctionDefinition function) {
+    return new Builder.inner(this).build(function);
+  }
+
+  Node visitCreateFunction(ir.CreateFunction node) {
+    FunctionDefinition def = makeSubFunction(node.definition);
+    FunctionSignature signature = node.definition.element.functionSignature;
+    bool hasReturnType = !signature.type.returnType.treatAsDynamic;
+    if (hasReturnType) {
+      // This function cannot occur in expression context.
+      // The successor will be filled in by visitLetPrim.
+      return new FunctionDeclaration(getVariable(node), def, null);
+    } else {
+      return new FunctionExpression(def);
+    }
+  }
+
   Expression visitIsCheck(ir.IsCheck node) {
     return new TypeOperator(getVariableReference(node.receiver),
                             node.type,
@@ -911,6 +1111,7 @@
   }
 }
 
+
 /**
  * Performs the following transformations on the tree:
  * - Assignment propagation
@@ -1123,6 +1324,17 @@
     return node;
   }
 
+  Expression visitFunctionExpression(FunctionExpression node) {
+    new StatementRewriter().rewrite(node.definition);
+    return node;
+  }
+
+  Statement visitFunctionDeclaration(FunctionDeclaration node) {
+    new StatementRewriter().rewrite(node.definition);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
   Statement visitReturn(Return node) {
     node.value = visitExpression(node.value);
     return node;
@@ -1303,6 +1515,7 @@
     if (s is Assign && t is Assign && s.variable == t.variable) {
       Statement next = combineStatements(s.next, t.next);
       if (next != null) {
+        --t.variable.writeCount; // Two assignments become one.
         return new Assign(s.variable,
                           combine(s.definition, t.definition),
                           next);
@@ -1443,6 +1656,194 @@
   }
 }
 
+/// Eliminates moving assignments, such as w := v, by assigning directly to w
+/// at the definition of v.
+///
+/// This compensates for suboptimal register allocation, and merges closure
+/// variables with local temporaries that were left behind when translating
+/// out of CPS (where closure variables live in a separate space).
+class CopyPropagator extends RecursiveVisitor {
+
+  /// After visitStatement returns, [move] maps a variable v to an
+  /// assignment A of form w := v, under the following conditions:
+  /// - there are no uses of w before A
+  /// - A is the only use of v
+  Map<Variable, Assign> move = <Variable, Assign>{};
+
+  /// Like [move], except w is the key instead of v.
+  Map<Variable, Assign> inverseMove = <Variable, Assign>{};
+
+  /// The function currently being rewritten.
+  FunctionElement functionElement;
+
+  void rewrite(FunctionDefinition function) {
+    functionElement = function.element;
+    visitFunctionDefinition(function);
+  }
+
+  void visitFunctionDefinition(FunctionDefinition function) {
+    assert(functionElement == function.element);
+    function.body = visitStatement(function.body);
+
+    // Try to propagate moving assignments into function parameters.
+    // For example:
+    // foo(x) {
+    //   var v1 = x;
+    //   BODY
+    // }
+    //   ==>
+    // foo(v1) {
+    //   BODY
+    // }
+
+    // Variables must not occur more than once in the parameter list, so
+    // invalidate all moving assignments that would propagate a parameter
+    // into another parameter. For example:
+    // foo(x,y) {
+    //   y = x;
+    //   BODY
+    // }
+    // Cannot declare function as foo(x,x)!
+    function.parameters.forEach(visitVariable);
+
+    // Now do the propagation.
+    for (int i=0; i<function.parameters.length; i++) {
+      Variable param = function.parameters[i];
+      Variable replacement = copyPropagateVariable(param);
+      replacement.element = param.element; // Preserve parameter name.
+      function.parameters[i] = replacement;
+    }
+  }
+
+  Statement visitBasicBlock(Statement node) {
+    node = visitStatement(node);
+    move.clear();
+    inverseMove.clear();
+    return node;
+  }
+
+  void visitVariable(Variable variable) {
+    // We have found a use of w.
+    // Remove assignments of form w := v from the move maps.
+    Assign movingAssignment = inverseMove.remove(variable);
+    if (movingAssignment != null) {
+      move.remove(movingAssignment.definition);
+    }
+  }
+
+  /**
+   * Called when a definition of [v] is encountered.
+   * Attempts to propagate the assignment through a moving assignment.
+   * Returns the variable to be assigned into, defaulting to [v] itself if
+   * no optimization could be performed.
+   */
+  Variable copyPropagateVariable(Variable v) {
+    Assign movingAssign = move[v];
+    if (movingAssign != null) {
+      // We found the pattern:
+      //   v := EXPR
+      //   BLOCK   (does not use w)
+      //   w := v  (only use of v)
+      //
+      // Rewrite to:
+      //   w := EXPR
+      //   BLOCK
+      //   w := w  (to be removed later)
+      Variable w = movingAssign.variable;
+
+      // Make w := w.
+      // We can't remove the statement from here because we don't have
+      // parent pointers. So just make it a no-op so it can be removed later.
+      movingAssign.definition = w;
+
+      // The intermediate variable 'v' should now be orphaned, so don't bother
+      // updating its read/write counters.
+      // Due to the nop trick, the variable 'w' now has one additional read
+      // and write.
+      ++w.writeCount;
+      ++w.readCount;
+
+      // Make w := EXPR
+      return w;
+    }
+    return v;
+  }
+
+  Statement visitAssign(Assign node) {
+    node.next = visitStatement(node.next);
+    node.variable = copyPropagateVariable(node.variable);
+    visitExpression(node.definition);
+    visitVariable(node.variable);
+
+    // If this is a moving assignment w := v, with this being the only use of v,
+    // try to propagate it backwards.  Do not propagate assignments where w
+    // is from an outer function scope.
+    if (node.definition is Variable) {
+      Variable def = node.definition;
+      if (def.readCount == 1 &&
+          node.variable.host.element == functionElement) {
+        move[node.definition] = node;
+        inverseMove[node.variable] = node;
+      }
+    }
+
+    return node;
+  }
+
+  Statement visitLabeledStatement(LabeledStatement node) {
+    node.next = visitBasicBlock(node.next);
+    node.body = visitStatement(node.body);
+    return node;
+  }
+
+  Statement visitReturn(Return node) {
+    visitExpression(node.value);
+    return node;
+  }
+
+  Statement visitBreak(Break node) {
+    return node;
+  }
+
+  Statement visitContinue(Continue node) {
+    return node;
+  }
+
+  Statement visitIf(If node) {
+    visitExpression(node.condition);
+    node.thenStatement = visitBasicBlock(node.thenStatement);
+    node.elseStatement = visitBasicBlock(node.elseStatement);
+    return node;
+  }
+
+  Statement visitWhileTrue(WhileTrue node) {
+    node.body = visitBasicBlock(node.body);
+    return node;
+  }
+
+  Statement visitWhileCondition(WhileCondition node) {
+    throw "WhileCondition before LoopRewriter";
+  }
+
+  Statement visitFunctionDeclaration(FunctionDeclaration node) {
+    new CopyPropagator().rewrite(node.definition);
+    node.next = visitStatement(node.next);
+    node.variable = copyPropagateVariable(node.variable);
+    return node;
+  }
+
+  Statement visitExpressionStatement(ExpressionStatement node) {
+    node.next = visitStatement(node.next);
+    visitExpression(node.expression);
+    return node;
+  }
+
+  void visitFunctionExpression(FunctionExpression node) {
+    new CopyPropagator().rewrite(node.definition);
+  }
+
+}
+
 /// Rewrites [WhileTrue] statements with an [If] body into a [WhileCondition],
 /// in situations where only one of the branches contains a [Continue] to the
 /// loop. Schematically:
@@ -1466,7 +1867,7 @@
 ///
 /// Note that the above pattern needs no iteration since nested ifs
 /// have been collapsed previously in the [StatementRewriter] phase.
-class LoopRewriter extends StatementVisitor<Statement> {
+class LoopRewriter extends RecursiveVisitor {
 
   Set<Label> usedContinueLabels = new Set<Label>();
 
@@ -1481,11 +1882,19 @@
   }
 
   Statement visitAssign(Assign node) {
+    // Clean up redundant assignments left behind in the previous phase.
+    if (node.variable == node.definition) {
+      --node.variable.readCount;
+      --node.variable.writeCount;
+      return visitStatement(node.next);
+    }
+    visitExpression(node.definition);
     node.next = visitStatement(node.next);
     return node;
   }
 
   Statement visitReturn(Return node) {
+    visitExpression(node.value);
     return node;
   }
 
@@ -1499,6 +1908,7 @@
   }
 
   Statement visitIf(If node) {
+    visitExpression(node.condition);
     node.thenStatement = visitStatement(node.thenStatement);
     node.elseStatement = visitStatement(node.elseStatement);
     return node;
@@ -1518,16 +1928,14 @@
             node.label,
             body.condition,
             body.thenStatement,
-            body.elseStatement,
-            node.updates);
+            body.elseStatement);
       } else if (!thenHasContinue && elseHasContinue) {
         node.label.binding = null;
         return new WhileCondition(
             node.label,
             new Not(body.condition),
             body.elseStatement,
-            body.thenStatement,
-            node.updates);
+            body.thenStatement);
       }
     } else {
       node.body = visitStatement(node.body);
@@ -1538,28 +1946,28 @@
 
   Statement visitWhileCondition(WhileCondition node) {
     // Note: not reachable but the implementation is trivial
+    visitExpression(node.condition);
     node.body = visitStatement(node.body);
     node.next = visitStatement(node.next);
     return node;
   }
 
   Statement visitExpressionStatement(ExpressionStatement node) {
+    visitExpression(node.expression);
     node.next = visitStatement(node.next);
-    // for (;;) { ... E; continue* L ... }
-    //   ==>
-    // for(;;E) { ... continue* L ... }
-    if (node.next is Continue) {
-      Continue jump = node.next;
-      if (jump.target.useCount == 1) {
-        Loop target = jump.target.binding;
-        target.updates.add(node.expression);
-        return jump; // Return the continue statement.
-        // NOTE: The pattern may reclick in an enclosing expression statement.
-      }
-    }
     return node;
   }
 
+  Statement visitFunctionDeclaration(FunctionDeclaration node) {
+    new LoopRewriter().rewrite(node.definition);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  void visitFunctionExpression(FunctionExpression node) {
+    new LoopRewriter().rewrite(node.definition);
+  }
+
 }
 
 
@@ -1709,7 +2117,6 @@
   }
 
   Statement visitExpressionStatement(ExpressionStatement node) {
-    // TODO(asgerf): in non-checked mode we can remove Not from the expression.
     node.expression = visitExpression(node.expression);
     node.next = visitStatement(node.next);
     return node;
@@ -1774,6 +2181,17 @@
     return node;
   }
 
+  Expression visitFunctionExpression(FunctionExpression node) {
+    new LogicalRewriter().rewrite(node.definition);
+    return node;
+  }
+
+  Statement visitFunctionDeclaration(FunctionDeclaration node) {
+    new LogicalRewriter().rewrite(node.definition);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
   Expression visitNot(Not node) {
     return toBoolean(makeCondition(node.operand, false, liftNots: false));
   }
@@ -1992,3 +2410,4 @@
     }
   }
 }
+
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
index 0d604cb..cc15a54 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
@@ -326,8 +326,11 @@
       }
     } else if (exp is CallMethod) {
       precedence = CALLEE;
+      tree.Node receiver = exp.object is This
+          ? null
+          : makeExp(exp.object, PRIMARY, beginStmt: beginStmt);
       result = new tree.Send(
-          makeExp(exp.object, PRIMARY, beginStmt: beginStmt),
+          receiver,
           makeIdentifier(exp.methodName),
           argList(exp.arguments.map(makeArgument)));
     } else if (exp is CallNew) {
@@ -370,9 +373,10 @@
           colon);
     } else if (exp is FieldExpression) {
       precedence = PRIMARY;
-      result = new tree.Send(
-          makeExp(exp.object, PRIMARY, beginStmt: beginStmt),
-          makeIdentifier(exp.fieldName));
+      tree.Node receiver = exp.object is This
+          ? null
+          : makeExp(exp.object, PRIMARY, beginStmt: beginStmt);
+      result = new tree.Send(receiver, makeIdentifier(exp.fieldName));
     } else if (exp is FunctionExpression) {
       precedence = PRIMARY;
       if (beginStmt && exp.name != null) {
@@ -679,14 +683,16 @@
           forToken,
           inToken);
     } else if (stmt is FunctionDeclaration) {
-      return new tree.FunctionDeclaration(new tree.FunctionExpression(
+      tree.FunctionExpression function = new tree.FunctionExpression(
           stmt.name != null ? makeIdentifier(stmt.name) : null,
           makeParameters(stmt.parameters),
           makeFunctionBody(stmt.body),
           stmt.returnType != null ? makeType(stmt.returnType) : null,
-          makeEmptyModifiers(), // TODO(asgerf): Function modifiers?
+          makeEmptyModifiers(),
           null,  // initializers
-          null)); // get/set
+          null);  // get/set
+      setElement(function, stmt.function.element, stmt);
+      return new tree.FunctionDeclaration(function);
     } else if (stmt is If) {
       if (stmt.elseStatement == null || isEmptyStatement(stmt.elseStatement)) {
         tree.Node node = new tree.If(
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
index c3ea178..c78d458 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
@@ -135,6 +135,11 @@
     _addStatement(node);
     visitStatement(node.next);
   }
+
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    _addStatement(node);
+    visitStatement(node.next);
+  }
 }
 
 class TreeTracer extends TracerUtil with StatementVisitor {
@@ -250,6 +255,10 @@
     printStatement(null, expr(node.expression));
   }
 
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    printStatement(null, 'function ${node.definition.element.name}');
+  }
+
   String expr(Expression e) {
     return e.accept(new SubexpressionVisitor(names));
   }
@@ -338,7 +347,7 @@
   }
 
   String visitReifyTypeVar(ReifyTypeVar node) {
-    return "typevar [${node.element.name}]";
+    return "typevar [${node.typeVariable.name}]";
   }
 
   bool usesInfixNotation(Expression node) {
@@ -378,6 +387,10 @@
     return '!$operand';
   }
 
+  String visitFunctionExpression(FunctionExpression node) {
+    return "function ${node.definition.element.name}";
+  }
+
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/dart_types.dart b/sdk/lib/_internal/compiler/implementation/dart_types.dart
index 02bf04b..93f3854 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_types.dart
@@ -1299,7 +1299,7 @@
   static ClassElement getClassContext(DartType type) {
     TypeVariableType typeVariable = type.typeVariableOccurrence;
     if (typeVariable == null) return null;
-    return typeVariable.element.enclosingElement;
+    return typeVariable.element.typeDeclaration;
   }
 
   /**
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index ddf061c..dffcbb9 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -57,6 +57,8 @@
     TreeElements,
     AnalyzableElementX;
 
+import "dart:math" show min;
+
 /// A "hunk" of the program that will be loaded whenever one of its [imports]
 /// are loaded.
 ///
@@ -564,9 +566,21 @@
 
     void computeOutputUnitName(OutputUnit outputUnit) {
       if (generatedNames[outputUnit] != null) return;
-      String suggestedName = outputUnit.imports.map((import) {
+      Iterable<String> importNames = outputUnit.imports.map((import) {
         return importDeferName[import];
-      }).join('_');
+      });
+      String suggestedName = importNames.join('_');
+      // Avoid the name getting too long.
+      // Try to abbreviate the prefix-names
+      if (suggestedName.length > 15) {
+        suggestedName = importNames.map((name) {
+          return name.substring(0, min(2, name.length));
+        }).join('_');
+      }
+      // If this is still too long, truncate the whole name.
+      if (suggestedName.length > 15) {
+        suggestedName = suggestedName.substring(0, 15);
+      }
       outputUnit.name = makeUnique(suggestedName, usedOutputUnitNames);
       generatedNames[outputUnit] = outputUnit.name;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 6f8a817..06195fe 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -511,8 +511,8 @@
     }
     if (element.isConstructor) {
       nameString = element.name == ""
-          ? "${element.enclosingElement.name}"
-          : "${element.enclosingElement.name}.${element.name}";
+          ? "${element.enclosingClass.name}"
+          : "${element.enclosingClass.name}.${element.name}";
       kindString = "constructor";
     }
     List contents = [];
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index d54aea2..572d8b1 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -900,6 +900,14 @@
 
 abstract class ParameterElement extends VariableElement
     implements FunctionTypedElement {
+  /// Use [functionDeclaration] instead.
+  @deprecated
+  get enclosingElement;
+
+  /// The function, typedef or inline function-typed parameter on which
+  /// this parameter is declared.
+  FunctionTypedElement get functionDeclaration;
+
   VariableDefinitions get node;
 }
 
@@ -1011,6 +1019,10 @@
   /// Class `E` has a synthesized constructor, `E.c`, whose defining constructor
   /// is `C.c`.
   ConstructorElement get definingConstructor;
+
+  /// Use [enclosingClass] instead.
+  @deprecated
+  get enclosingElement;
 }
 
 abstract class ConstructorBodyElement extends FunctionElement {
@@ -1220,6 +1232,14 @@
 /// The [Element] for a type variable declaration on a generic class or typedef.
 abstract class TypeVariableElement extends Element
     implements AstElement, TypedElement {
+
+  /// Use [typeDeclaration] instead.
+  @deprecated
+  get enclosingElement;
+
+  /// The class or typedef on which this type variable is defined.
+  TypeDeclarationElement get typeDeclaration;
+
   /// The [type] defined by the type variable.
   TypeVariableType get type;
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index d9a4459..df5a2b3 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -1323,13 +1323,15 @@
   FunctionSignature functionSignatureCache;
 
   ParameterElementX(ElementKind elementKind,
-                    Element enclosingElement,
+                    FunctionTypedElement enclosingElement,
                     this.definitions,
                     Identifier identifier,
                     this.initializer)
       : this.identifier = identifier,
         super(identifier.source, elementKind, enclosingElement);
 
+  FunctionTypedElement get functionDeclaration => enclosingElement;
+
   Modifiers get modifiers => definitions.modifiers;
 
   Token get position => identifier.getBeginToken();
@@ -1663,6 +1665,8 @@
   }
 
   ConstructorElement get definingConstructor => null;
+
+  ClassElement get enclosingClass => enclosingElement;
 }
 
 class DeferredLoaderGetterElementX extends FunctionElementX {
@@ -2525,9 +2529,11 @@
   TypeVariableType typeCache;
   DartType boundCache;
 
-  TypeVariableElementX(String name, Element enclosing, this.node)
+  TypeVariableElementX(String name, TypeDeclarationElement enclosing, this.node)
     : super(name, ElementKind.TYPE_VARIABLE, enclosing);
 
+  TypeDeclarationElement get typeDeclaration => enclosingElement;
+
   TypeVariableType computeType(compiler) => type;
 
   TypeVariableType get type {
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
index ab4bb45..af4c8c6 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -2230,7 +2230,8 @@
   }
 
   @override
-  void setDefaultTypeOfParameter(Element parameter, ConcreteType type) {
+  void setDefaultTypeOfParameter(ParameterElement parameter,
+                                 ConcreteType type) {
     // We handle default parameters our own way in associateArguments
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
index 397444a..25fd0b4 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -159,7 +159,7 @@
   /**
    * Records the default type of parameter [parameter].
    */
-  void setDefaultTypeOfParameter(Element parameter, T type);
+  void setDefaultTypeOfParameter(ParameterElement parameter, T type);
 
   /**
    * Returns the type of [element].
@@ -471,7 +471,7 @@
 
     FunctionElement function = analyzedElement;
     FunctionSignature signature = function.functionSignature;
-    signature.forEachOptionalParameter((element) {
+    signature.forEachOptionalParameter((ParameterElement element) {
       ast.Expression defaultValue = element.initializer;
       T type = (defaultValue == null) ? types.nullType : visit(defaultValue);
       inferrer.setDefaultTypeOfParameter(element, type);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index 2b92fb5..3443e4a 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -871,14 +871,15 @@
     }
   }
 
-  void setDefaultTypeOfParameter(Element parameter, TypeInformation type) {
-    assert(parameter.enclosingElement.isImplementation);
+  void setDefaultTypeOfParameter(ParameterElement parameter,
+                                 TypeInformation type) {
+    assert(parameter.functionDeclaration.isImplementation);
     TypeInformation existing = defaultTypeOfParameter[parameter];
     defaultTypeOfParameter[parameter] = type;
     TypeInformation info = types.getInferredTypeOf(parameter);
     if (!info.abandonInferencing && existing != null && existing != type) {
       // Replace references to [existing] to use [type] instead.
-      if (parameter.enclosingElement.isInstanceMember) {
+      if (parameter.functionDeclaration.isInstanceMember) {
         ParameterAssignments assignments = info.assignments;
         int count = assignments.assignments[existing];
         if (count == null) return;
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index b9f33613..8be198d 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -100,10 +100,6 @@
 
     if (!compiler.backend.shouldOutput(function)) return false;
 
-    // TODO(kmillikin): support functions with optional parameters.
-    FunctionSignature signature = function.functionSignature;
-    if (signature.optionalParameterCount > 0) return false;
-
     // TODO(kmillikin): support getters and setters and static class members.
     // With the current Dart Tree emitter they just require recognizing them
     // and generating the correct syntax.
@@ -112,7 +108,7 @@
     // TODO(lry): support native functions (also in [visitReturn]).
     if (function.isNative) return false;
 
-    // TODO(asgerf): support syntax for redirecting factory constructors
+    // TODO(kmillikin,sigurdm): support syntax for redirecting factory
     if (function is ConstructorElement && function.isRedirectingFactory) {
       return false;
     }
@@ -206,6 +202,9 @@
 
   final List<ConstDeclaration> localConstants;
 
+  FunctionElement currentFunction;
+  final DetectClosureVariables closureLocals;
+
   /// Construct a top-level visitor.
   IrBuilder(TreeElements elements, Compiler compiler, this.sourceFile)
       : returnContinuation = new ir.Continuation.retrn(),
@@ -215,6 +214,7 @@
         assignedVars = <ir.Primitive>[],
         index2variable = <Element>[],
         localConstants = <ConstDeclaration>[],
+        closureLocals = new DetectClosureVariables(elements),
         super(elements, compiler) {
           constantBuilder = new ConstExpBuilder(this);
         }
@@ -233,6 +233,8 @@
         index2variable = new List<Element>.from(parent.index2variable),
         constantBuilder = parent.constantBuilder,
         localConstants = parent.localConstants,
+        currentFunction = parent.currentFunction,
+        closureLocals = parent.closureLocals,
         super(parent.elements, parent.compiler);
 
   /**
@@ -246,26 +248,42 @@
 
   ir.FunctionDefinition buildFunctionInternal(FunctionElement element) {
     assert(invariant(element, element.isImplementation));
+    currentFunction = element;
     ast.FunctionExpression function = element.node;
     assert(function != null);
     assert(!function.modifiers.isExternal);
     assert(elements[function] != null);
 
+    closureLocals.visit(function);
+
     root = current = null;
 
     FunctionSignature signature = element.functionSignature;
-    signature.orderedForEachParameter((parameterElement) {
+    signature.orderedForEachParameter((ParameterElement parameterElement) {
       ir.Parameter parameter = new ir.Parameter(parameterElement);
       parameters.add(parameter);
-      variableIndex[parameterElement] = assignedVars.length;
-      assignedVars.add(parameter);
-      index2variable.add(parameterElement);
+      if (isClosureVariable(parameterElement)) {
+        add(new ir.SetClosureVariable(parameterElement, parameter));
+      } else {
+        variableIndex[parameterElement] = assignedVars.length;
+        assignedVars.add(parameter);
+        index2variable.add(parameterElement);
+      }
+    });
+
+    List<ConstExp> defaults = new List<ConstExp>();
+    signature.orderedOptionalParameters.forEach((ParameterElement element) {
+      if (element.initializer != null) {
+        defaults.add(constantBuilder.visit(element.initializer));
+      } else {
+        defaults.add(new PrimitiveConstExp(constantSystem.createNull()));
+      }
     });
 
     visit(function.body);
     ensureReturn(function);
-    return new ir.FunctionDefinition(returnContinuation, parameters, root,
-        localConstants);
+    return new ir.FunctionDefinition(element, returnContinuation, parameters,
+        root, localConstants, defaults);
   }
 
   ConstantSystem get constantSystem => compiler.backend.constantSystem;
@@ -515,6 +533,17 @@
 
   ir.Primitive visitFor(ast.For node) {
     assert(isOpen);
+    // TODO(kmillikin,sigurdm): Handle closure variables declared in a for-loop.
+    if (node.initializer is ast.VariableDefinitions) {
+      ast.VariableDefinitions definitions = node.initializer;
+      for (ast.Node definition in definitions.definitions.nodes) {
+        Element element = elements[definition];
+        if (isClosureVariable(element)) {
+          return giveup(definition, 'Closure variable in for loop initializer');
+        }
+      }
+    }
+
     // For loops use three named continuations: the entry to the condition,
     // the entry to the body, and the loop exit (break).  The CPS translation
     // of [[for (initializer; condition; update) body; successor]] is:
@@ -731,28 +760,30 @@
     } else {
       for (ast.Node definition in node.definitions.nodes) {
         Element element = elements[definition];
+        ir.Primitive initialValue;
         // Definitions are either SendSets if there is an initializer, or
         // Identifiers if there is no initializer.
         if (definition is ast.SendSet) {
           assert(!definition.arguments.isEmpty);
           assert(definition.arguments.tail.isEmpty);
-          ir.Primitive initialValue = visit(definition.arguments.head);
+          initialValue = visit(definition.arguments.head);
+        } else {
+          assert(definition is ast.Identifier);
+          // The initial value is null.
+          // TODO(kmillikin): Consider pooling constants.
+          initialValue = makePrimConst(constantSystem.createNull());
+          add(new ir.LetPrim(initialValue));
+        }
+        if (isClosureVariable(element)) {
+          add(new ir.SetClosureVariable(element, initialValue,
+                                          isDeclaration: true));
+        } else {
           // In case a primitive was introduced for the initializer expression,
           // use this variable element to help derive a good name for it.
           initialValue.useElementAsHint(element);
           variableIndex[element] = assignedVars.length;
           assignedVars.add(initialValue);
           index2variable.add(element);
-        } else {
-          assert(definition is ast.Identifier);
-          // The initial value is null.
-          // TODO(kmillikin): Consider pooling constants.
-          ir.Constant constant = makePrimConst(constantSystem.createNull());
-          constant.useElementAsHint(element);
-          add(new ir.LetPrim(constant));
-          variableIndex[element] = assignedVars.length;
-          assignedVars.add(constant);
-          index2variable.add(element);
         }
       }
     }
@@ -959,6 +990,14 @@
     return visit(node.expression);
   }
 
+  ir.Primitive continueWithExpression(ir.Expression build(ir.Continuation k)) {
+    ir.Parameter v = new ir.Parameter(null);
+    ir.Continuation k = new ir.Continuation([v]);
+    ir.Expression expression = build(k);
+    add(new ir.LetCont(k, expression));
+    return v;
+  }
+
   ir.Primitive translateClosureCall(ir.Primitive receiver,
                                     Selector closureSelector,
                                     ast.NodeList arguments) {
@@ -968,12 +1007,8 @@
                      closureSelector.argumentCount,
                      closureSelector.namedArguments);
     List<ir.Primitive> args = arguments.nodes.mapToList(visit, growable:false);
-    ir.Parameter v = new ir.Parameter(null);
-    ir.Continuation k = new ir.Continuation([v]);
-    ir.Expression invoke =
-        new ir.InvokeMethod(receiver, namedCallSelector, k, args);
-    add(new ir.LetCont(k, invoke));
-    return v;
+    return continueWithExpression(
+        (k) => new ir.InvokeMethod(receiver, namedCallSelector, k, args));
   }
 
   ir.Primitive visitClosureSend(ast.Send node) {
@@ -982,6 +1017,9 @@
     ir.Primitive closureTarget;
     if (element == null) {
       closureTarget = visit(node.selector);
+    } else if (isClosureVariable(element)) {
+      closureTarget = new ir.GetClosureVariable(element);
+      add(new ir.LetPrim(closureTarget));
     } else {
       assert(Elements.isLocal(element));
       closureTarget = lookupLocal(element);
@@ -1020,12 +1058,8 @@
     for (ast.Node n in node.arguments) {
       arguments.add(visit(n));
     }
-    ir.Parameter v = new ir.Parameter(null);
-    ir.Continuation k = new ir.Continuation([v]);
-    ir.Expression invoke =
-        createDynamicInvoke(node, selector, receiver, k, arguments);
-    add(new ir.LetCont(k, invoke));
-    return v;
+    return continueWithExpression(
+        (k) => createDynamicInvoke(node, selector, receiver, k, arguments));
   }
 
   _GetterElements translateGetter(ast.Send node, Selector selector) {
@@ -1034,18 +1068,14 @@
     ir.Primitive receiver;
     ir.Primitive index;
 
-    if (Elements.isErroneousElement(element)) {
-      giveup(node, 'Erroneous element on GetterSend');
-      return null;
-    }
-
     if (element != null && element.isConst) {
       // Reference to constant local, top-level or static field
-
       result = translateConstant(node);
+    } else if (isClosureVariable(element)) {
+      result = new ir.GetClosureVariable(element);
+      add(new ir.LetPrim(result));
     } else if (Elements.isLocal(element)) {
       // Reference to local variable
-
       result = lookupLocal(element);
     } else if (element == null ||
                Elements.isInstanceField(element) ||
@@ -1064,31 +1094,21 @@
         arguments.add(index);
       }
 
-      ir.Parameter v = new ir.Parameter(null);
-      ir.Continuation k = new ir.Continuation([v]);
       assert(selector.kind == SelectorKind.GETTER ||
              selector.kind == SelectorKind.INDEX);
-      ir.Expression invoke =
-          createDynamicInvoke(node, selector, receiver, k, arguments);
-      add(new ir.LetCont(k, invoke));
-      result = v;
-    } else if (element.isField || element.isGetter ||
-        // Access to a static field or getter (non-static case handled above).
-        // Even if there is only a setter, we compile as if it was a getter,
-        // so the vm can fail at runtime.
-
-        element.isSetter) {
-      ir.Parameter v = new ir.Parameter(null);
-      ir.Continuation k = new ir.Continuation([v]);
+      result = continueWithExpression(
+          (k) => createDynamicInvoke(node, selector, receiver, k, arguments));
+    } else if (element.isField || element.isGetter || element.isErroneous ||
+               element.isSetter) {
+      // Access to a static field or getter (non-static case handled above).
+      // Even if there is only a setter, we compile as if it was a getter,
+      // so the vm can fail at runtime.
       assert(selector.kind == SelectorKind.GETTER ||
              selector.kind == SelectorKind.SETTER);
-      ir.Expression invoke =
-          new ir.InvokeStatic(element, selector, k, []);
-      add(new ir.LetCont(k, invoke));
-      result = v;
+      result = continueWithExpression(
+          (k) => new ir.InvokeStatic(element, selector, k, []));
     } else if (Elements.isStaticOrTopLevelFunction(element)) {
       // Convert a top-level or static function to a function object.
-
       result = translateConstant(node);
     } else {
       throw "Unexpected SendSet getter: $node, $element";
@@ -1244,7 +1264,6 @@
     }
     if (op.source == "is") {
       DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
-      if (type.isMalformed) return giveup(node, "Malformed type for is");
       ir.Primitive receiver = visit(node.receiver);
       ir.IsCheck isCheck = new ir.IsCheck(receiver, type);
       add(new ir.LetPrim(isCheck));
@@ -1252,15 +1271,11 @@
     }
     if (op.source == "as") {
       DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
-      if (type.isMalformed) return giveup(node, "Malformed type for as");
       ir.Primitive receiver = visit(node.receiver);
-      ir.Parameter v = new ir.Parameter(null);
-      ir.Continuation k = new ir.Continuation([v]);
-      ir.AsCast asCast = new ir.AsCast(receiver, type, k);
-      add(new ir.LetCont(k, asCast));
-      return v;
+      return continueWithExpression(
+          (k) => new ir.AsCast(receiver, type, k));
     }
-    return giveup(node);
+    compiler.internalError(node, "Unknown operator '${op.source}'");
   }
 
   // Build(StaticSend(f, arguments), C) = C[C'[InvokeStatic(f, xs)]]
@@ -1268,29 +1283,17 @@
   ir.Primitive visitStaticSend(ast.Send node) {
     assert(isOpen);
     Element element = elements[node];
-    // TODO(lry): support constructors / factory calls.
-    if (element.isConstructor) return giveup(node, 'StaticSend: constructor');
+    assert(!element.isConstructor);
     // TODO(lry): support foreign functions.
     if (element.isForeign(compiler)) return giveup(node, 'StaticSend: foreign');
-    // TODO(lry): for elements that could not be resolved emit code to throw a
-    // [NoSuchMethodError].
-    if (element.isErroneous) return giveup(node, 'StaticSend: erroneous');
-    // TODO(lry): generate IR for object identicality.
-    if (element == compiler.identicalFunction) {
-      return giveup(node, 'StaticSend: identical');
-    }
 
     Selector selector = elements.getSelector(node);
 
     // TODO(lry): support default arguments, need support for locals.
     List<ir.Definition> arguments = node.arguments.mapToList(visit,
                                                              growable:false);
-    ir.Parameter v = new ir.Parameter(null);
-    ir.Continuation k = new ir.Continuation([v]);
-    ir.Expression invoke =
-        new ir.InvokeStatic(element, selector, k, arguments);
-    add(new ir.LetCont(k, invoke));
-    return v;
+    return continueWithExpression(
+        (k) => new ir.InvokeStatic(element, selector, k, arguments));
   }
 
   ir.Primitive visitSuperSend(ast.Send node) {
@@ -1311,8 +1314,8 @@
     // If the user is trying to invoke the type literal or variable,
     // it must be treated as a function call.
     if (node.argumentsNode != null) {
-      // TODO(sigurdm): Change this to match proposed semantics of issue #19725.
-      return visitDynamicSend(node);
+      // TODO(sigurdm): Handle this to match proposed semantics of issue #19725.
+      return giveup(node, 'Type literal invoked as function');
     }
 
     DartType type = elements.getTypeLiteralType(node);
@@ -1325,6 +1328,13 @@
     }
   }
 
+  /// True if [element] is a local variable, local function, or parameter that
+  /// is accessed from an inner function. Recursive self-references in a local
+  /// function count as closure accesses.
+  bool isClosureVariable(Element element) {
+    return closureLocals.isClosureVariable(element);
+  }
+
   ir.Primitive visitSendSet(ast.SendSet node) {
     assert(isOpen);
     Element element = elements[node];
@@ -1386,33 +1396,27 @@
     }
 
     // Set the value
-    if (Elements.isLocal(element)) {
+    if (isClosureVariable(element)) {
+      add(new ir.SetClosureVariable(element, valueToStore));
+    } else if (Elements.isLocal(element)) {
       valueToStore.useElementAsHint(element);
       assignedVars[variableIndex[element]] = valueToStore;
-    } else if (Elements.isStaticOrTopLevel(element)) {
-      assert(element.isField || element.isSetter);
-      ir.Parameter v = new ir.Parameter(null);
-      ir.Continuation k = new ir.Continuation([v]);
+    } else if ((!node.isSuperCall && Elements.isErroneousElement(element)) ||
+                Elements.isStaticOrTopLevel(element)) {
+      assert(element.isErroneous || element.isField || element.isSetter);
       Selector selector = elements.getSelector(node);
-      ir.InvokeStatic invoke =
-          new ir.InvokeStatic(element, selector, k, [valueToStore]);
-      add(new ir.LetCont(k, invoke));
+      continueWithExpression(
+          (k) => new ir.InvokeStatic(element, selector, k, [valueToStore]));
     } else {
-      if (element != null && Elements.isUnresolved(element)) {
-        return giveup(node, 'SendSet: non-local, non-static, unresolved');
-      }
       // Setter or index-setter invocation
-      ir.Parameter v = new ir.Parameter(null);
-      ir.Continuation k = new ir.Continuation([v]);
       Selector selector = elements.getSelector(node);
       assert(selector.kind == SelectorKind.SETTER ||
           selector.kind == SelectorKind.INDEX);
       List<ir.Definition> arguments = selector.isIndexSet
           ? [index, valueToStore]
           : [valueToStore];
-      ir.Expression invoke =
-          createDynamicInvoke(node, selector, receiver, k, arguments);
-      add(new ir.LetCont(k, invoke));
+      continueWithExpression(
+          (k) => createDynamicInvoke(node, selector, receiver, k, arguments));
     }
 
     if (node.isPostfix) {
@@ -1429,32 +1433,21 @@
       return translateConstant(node);
     }
     FunctionElement element = elements[node.send];
-    if (Elements.isUnresolved(element)) {
-      return giveup(node, 'NewExpression: unresolved constructor');
-    }
     Selector selector = elements.getSelector(node.send);
     ast.Node selectorNode = node.send.selector;
-    GenericType type = elements.getType(node);
+    DartType type = elements.getType(node);
     List<ir.Primitive> args =
         node.send.arguments.mapToList(visit, growable:false);
-    ir.Parameter v = new ir.Parameter(null);
-    ir.Continuation k = new ir.Continuation([v]);
-    ir.InvokeConstructor invoke =
-        new ir.InvokeConstructor(type, element,selector, k, args);
-    add(new ir.LetCont(k, invoke));
-    return v;
+    return continueWithExpression(
+        (k) => new ir.InvokeConstructor(type, element,selector, k, args));
   }
 
   ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) {
     assert(isOpen);
     ir.Primitive first = visit(node.first);
     ir.Primitive second = visit(node.second);
-    ir.Parameter v = new ir.Parameter(null);
-    ir.Continuation k = new ir.Continuation([v]);
-    ir.ConcatenateStrings concat =
-        new ir.ConcatenateStrings(k, [first, second]);
-    add(new ir.LetCont(k, concat));
-    return v;
+    return continueWithExpression(
+        (k) => new ir.ConcatenateStrings(k, [first, second]));
   }
 
   ir.Primitive visitStringInterpolation(ast.StringInterpolation node) {
@@ -1467,11 +1460,8 @@
       arguments.add(visit(part.expression));
       arguments.add(visitLiteralString(part.string));
     }
-    ir.Parameter v = new ir.Parameter(null);
-    ir.Continuation k = new ir.Continuation([v]);
-    ir.ConcatenateStrings concat = new ir.ConcatenateStrings(k, arguments);
-    add(new ir.LetCont(k, concat));
-    return v;
+    return continueWithExpression(
+        (k) => new ir.ConcatenateStrings(k, arguments));
   }
 
   ir.Primitive translateConstant(ast.Node node, [Constant value]) {
@@ -1484,9 +1474,38 @@
     return primitive;
   }
 
+  ir.FunctionDefinition makeSubFunction(ast.FunctionExpression node) {
+    return new IrBuilder(elements, compiler, sourceFile)
+           .buildFunctionInternal(elements[node]);
+  }
+
+  ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
+    FunctionElement element = elements[node];
+    ir.FunctionDefinition inner = makeSubFunction(node);
+    ir.CreateFunction prim = new ir.CreateFunction(inner);
+    add(new ir.LetPrim(prim));
+    return prim;
+  }
+
+  ir.Primitive visitFunctionDeclaration(ast.FunctionDeclaration node) {
+    FunctionElement element = elements[node.function];
+    ir.FunctionDefinition inner = makeSubFunction(node.function);
+    if (isClosureVariable(element)) {
+      add(new ir.DeclareFunction(element, inner));
+    } else {
+      ir.CreateFunction prim = new ir.CreateFunction(inner);
+      add(new ir.LetPrim(prim));
+      variableIndex[element] = assignedVars.length;
+      assignedVars.add(prim);
+      index2variable.add(element);
+      prim.useElementAsHint(element);
+    }
+    return null;
+  }
+
   static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
 
-  ir.Primitive giveup(ast.Node node, [String reason]) {
+  dynamic giveup(ast.Node node, [String reason]) {
     throw ABORT_IRNODE_BUILDER;
   }
 
@@ -1662,3 +1681,45 @@
   }
 
 }
+
+/// Classifies local variables and local functions as 'closure variables'.
+/// A closure variable is one that is accessed from an inner function nested
+/// one or more levels inside the one that declares it.
+class DetectClosureVariables extends ast.Visitor {
+  final TreeElements elements;
+  DetectClosureVariables(this.elements);
+
+  FunctionElement currentFunction;
+  Set<Element> usedFromClosure = new Set<Element>();
+  Set<FunctionElement> recursiveFunctions = new Set<FunctionElement>();
+
+  bool isClosureVariable(Element element) => usedFromClosure.contains(element);
+
+  void markAsClosureVariable(Element element) {
+    usedFromClosure.add(element);
+  }
+
+  visit(ast.Node node) => node.accept(this);
+
+  visitNode(ast.Node node) {
+    node.visitChildren(this);
+  }
+
+  visitSend(ast.Send node) {
+    Element element = elements[node];
+    if (Elements.isLocal(element) &&
+        !element.isConst &&
+        element.enclosingElement != currentFunction) {
+      markAsClosureVariable(element);
+    }
+    node.visitChildren(this);
+  }
+
+  visitFunctionExpression(ast.FunctionExpression node) {
+    FunctionElement oldFunction = currentFunction;
+    currentFunction = elements[node];
+    visit(node.body);
+    currentFunction = oldFunction;
+  }
+
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index b5d25d3..3f0fa78 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -49,12 +49,16 @@
   }
 }
 
-/// A pure expression that cannot throw or diverge.
+/// An expression that cannot throw or diverge and has no side-effects.
 /// All primitives are named using the identity of the [Primitive] object.
+///
+/// Primitives may allocate objects, this is not considered side-effect here.
+///
+/// Although primitives may not mutate state, they may depend on state.
 abstract class Primitive extends Definition {
   /// The [VariableElement] or [ParameterElement] from which the primitive
   /// binding originated.
-  Element element;
+  Element hint;
 
   /// Register in which the variable binding this primitive can be allocated.
   /// Separate register spaces are used for primitives with different [element].
@@ -65,8 +69,8 @@
   ///
   /// Has no effect if this primitive already has a non-null [element].
   void useElementAsHint(Element hint) {
-    if (element == null) {
-      element = hint;
+    if (this.hint == null) {
+      this.hint = hint;
     }
   }
 }
@@ -145,7 +149,7 @@
                List<Definition> args)
       : continuation = new Reference(cont),
         arguments = _referenceList(args) {
-    assert(selector.name == target.name);
+    assert(target.isErroneous || selector.name == target.name);
   }
 
   accept(Visitor visitor) => visitor.visitInvokeStatic(this);
@@ -205,7 +209,7 @@
 /// Non-const call to a constructor. The [target] may be a generative
 /// constructor, factory, or redirecting factory.
 class InvokeConstructor extends Expression implements Invoke {
-  final GenericType type;
+  final DartType type;
   final FunctionElement target;
   final Reference continuation;
   final List<Reference> arguments;
@@ -225,8 +229,9 @@
                     List<Definition> args)
       : continuation = new Reference(cont),
         arguments = _referenceList(args) {
-    assert(target.isConstructor);
-    assert(type.element == target.enclosingElement);
+    assert(target.isErroneous || target.isConstructor);
+    assert(target.isErroneous || type.isDynamic ||
+           type.element == target.enclosingElement);
   }
 
   accept(Visitor visitor) => visitor.visitInvokeConstructor(this);
@@ -256,6 +261,88 @@
   accept(Visitor visitor) => visitor.visitConcatenateStrings(this);
 }
 
+/// Gets the value from a closure variable. The identity of the variable is
+/// determined by an [Element].
+///
+/// Closure variables can be seen as ref cells that are not first-class values.
+/// A [LetPrim] with a [GetClosureVariable] can then be seen as:
+///
+///   let prim p = ![variable] in [body]
+///
+class GetClosureVariable extends Primitive {
+  final Element variable;
+
+  GetClosureVariable(this.variable) {
+    assert(variable != null);
+  }
+
+  accept(Visitor visitor) => visitor.visitGetClosureVariable(this);
+}
+
+/// Assign or declare a closure variable. The identity of the variable is
+/// determined by an [Element].
+///
+/// Closure variables can be seen as ref cells that are not first-class values.
+/// If [isDeclaration], this can seen as a let binding:
+///
+///   let [variable] = ref [value] in [body]
+///
+/// And otherwise, it can be seen as a dereferencing assignment:
+///
+///   { ![variable] := [value]; [body] }
+///
+/// Closure variables without a declaring [SetClosureVariable] are implicitly
+/// declared at the entry to the [variable]'s enclosing function.
+class SetClosureVariable extends Expression {
+  final Element variable;
+  final Reference value;
+  Expression body;
+
+  /// If true, this declares a new copy of the closure variable. If so, all
+  /// uses of the closure variable must occur in the [body].
+  ///
+  /// There can be at most one declaration per closure variable. If there is no
+  /// declaration, only one copy exists (per function execution). It is best to
+  /// avoid declaring closure variables if it is not necessary.
+  final bool isDeclaration;
+
+  SetClosureVariable(this.variable, Primitive value,
+                      {this.isDeclaration : false })
+      : this.value = new Reference(value) {
+    assert(variable != null);
+  }
+
+  accept(Visitor visitor) => visitor.visitSetClosureVariable(this);
+
+  Expression plug(Expression expr) {
+    assert(body == null);
+    return body = expr;
+  }
+}
+
+/// Create a potentially recursive function and store it in a closure variable.
+/// The function can access itself using [GetClosureVariable] on [variable].
+/// There must not exist a [SetClosureVariable] to [variable].
+///
+/// This can be seen as a let rec binding:
+///
+///   let rec [variable] = [definition] in [body]
+///
+class DeclareFunction extends Expression {
+  final Element variable;
+  final FunctionDefinition definition;
+  Expression body;
+
+  DeclareFunction(this.variable, this.definition);
+
+  Expression plug(Expression expr) {
+    assert(body == null);
+    return body = expr;
+  }
+
+  accept(Visitor visitor) => visitor.visitDeclareFunction(this);
+}
+
 /// Invoke a continuation in tail position.
 class InvokeContinuation extends Expression {
   final Reference continuation;
@@ -319,9 +406,9 @@
 /// Reify the given type variable as a [Type].
 /// This depends on the current binding of 'this'.
 class ReifyTypeVar extends Primitive {
-  final TypeVariableElement element;
+  final TypeVariableElement typeVariable;
 
-  ReifyTypeVar(this.element);
+  ReifyTypeVar(this.typeVariable);
 
   dart2js.Constant get constant => null;
 
@@ -351,6 +438,15 @@
   accept(Visitor visitor) => visitor.visitLiteralMap(this);
 }
 
+/// Create a non-recursive function.
+class CreateFunction extends Primitive {
+  final FunctionDefinition definition;
+
+  CreateFunction(this.definition);
+
+  accept(Visitor visitor) => visitor.visitCreateFunction(this);
+}
+
 class IsCheck extends Primitive {
   final Reference receiver;
   final DartType type;
@@ -365,7 +461,7 @@
 
 class Parameter extends Primitive {
   Parameter(Element element) {
-    super.element = element;
+    super.hint = element;
   }
 
   accept(Visitor visitor) => visitor.visitParameter(this);
@@ -391,13 +487,18 @@
 /// A function definition, consisting of parameters and a body.  The parameters
 /// include a distinguished continuation parameter.
 class FunctionDefinition extends Node {
+  final FunctionElement element;
   final Continuation returnContinuation;
   final List<Parameter> parameters;
   final Expression body;
   final List<ConstDeclaration> localConstants;
 
-  FunctionDefinition(this.returnContinuation, this.parameters, this.body,
-      this.localConstants);
+  /// Values for optional parameters.
+  final List<ConstExp> defaultParameterValues;
+
+  FunctionDefinition(this.element, this.returnContinuation,
+      this.parameters, this.body, this.localConstants,
+      this.defaultParameterValues);
 
   accept(Visitor visitor) => visitor.visitFunctionDefinition(this);
 }
@@ -429,6 +530,8 @@
   T visitConcatenateStrings(ConcatenateStrings node) => visitExpression(node);
   T visitBranch(Branch node) => visitExpression(node);
   T visitAsCast(AsCast node) => visitExpression(node);
+  T visitSetClosureVariable(SetClosureVariable node) => visitExpression(node);
+  T visitDeclareFunction(DeclareFunction node) => visitExpression(node);
 
   // Definitions.
   T visitLiteralList(LiteralList node) => visitPrimitive(node);
@@ -437,6 +540,8 @@
   T visitConstant(Constant node) => visitPrimitive(node);
   T visitThis(This node) => visitPrimitive(node);
   T visitReifyTypeVar(ReifyTypeVar node) => visitPrimitive(node);
+  T visitCreateFunction(CreateFunction node) => visitPrimitive(node);
+  T visitGetClosureVariable(GetClosureVariable node) => visitPrimitive(node);
   T visitParameter(Parameter node) => visitPrimitive(node);
   T visitContinuation(Continuation node) => visitDefinition(node);
 
@@ -460,8 +565,8 @@
   String visitFunctionDefinition(FunctionDefinition node) {
     names[node.returnContinuation] = 'return';
     String parameters = node.parameters
-        .map((p) {
-          String name = p.element.name;
+        .map((Parameter p) {
+          String name = p.hint.name;
           names[p] = name;
           return name;
         })
@@ -481,7 +586,7 @@
     String cont = newContinuationName();
     names[node.continuation] = cont;
     String parameters = node.continuation.parameters
-        .map((p) {
+        .map((Parameter p) {
           String name = newValueName();
           names[p] = name;
           return ' $name';
@@ -563,7 +668,12 @@
   }
 
   String visitReifyTypeVar(ReifyTypeVar node) {
-    return '(ReifyTypeVar ${node.element.name})';
+    return '(ReifyTypeVar ${node.typeVariable.name})';
+  }
+
+  String visitCreateFunction(CreateFunction node) {
+    String function = visit(node.definition);
+    return '(CreateFunction ${node.definition.element} $function)';
   }
 
   String visitParameter(Parameter node) {
@@ -576,6 +686,22 @@
     return '(Unexpected Continuation)';
   }
 
+  String visitGetClosureVariable(GetClosureVariable node) {
+    return '(GetClosureVariable ${node.variable.name})';
+  }
+
+  String visitSetClosureVariable(SetClosureVariable node) {
+    String value = names[node.value.definition];
+    String body = visit(node.body);
+    return '(SetClosureVariable ${node.variable.name} $value $body)';
+  }
+
+  String visitDeclareFunction(DeclareFunction node) {
+    String function = visit(node.definition);
+    String body = visit(node.body);
+    return '(DeclareFunction ${node.variable} = $function in $body)';
+  }
+
   String visitIsTrue(IsTrue node) {
     String value = names[node.value.definition];
     return '(IsTrue $value)';
@@ -624,15 +750,15 @@
 
   void allocate(Primitive primitive) {
     if (primitive.registerIndex == null) {
-      primitive.registerIndex = getRegisterArray(primitive.element).makeIndex();
+      primitive.registerIndex = getRegisterArray(primitive.hint).makeIndex();
     }
   }
 
   void release(Primitive primitive) {
     // Do not share indices for temporaries as this may obstruct inlining.
-    if (primitive.element == null) return;
+    if (primitive.hint == null) return;
     if (primitive.registerIndex != null) {
-      getRegisterArray(primitive.element).releaseIndex(primitive.registerIndex);
+      getRegisterArray(primitive.hint).releaseIndex(primitive.registerIndex);
     }
   }
 
@@ -714,6 +840,23 @@
   void visitReifyTypeVar(ReifyTypeVar node) {
   }
 
+  void visitCreateFunction(CreateFunction node) {
+    new RegisterAllocator().visit(node.definition);
+  }
+
+  void visitGetClosureVariable(GetClosureVariable node) {
+  }
+
+  void visitSetClosureVariable(SetClosureVariable node) {
+    visit(node.body);
+    visitReference(node.value);
+  }
+
+  void visitDeclareFunction(DeclareFunction node) {
+    new RegisterAllocator().visit(node.definition);
+    visit(node.body);
+  }
+
   void visitParameter(Parameter node) {
     throw "Parameters should not be visited by RegisterAllocator";
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
index 5f48fd7..f167ba7 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
@@ -194,6 +194,21 @@
     printStmt(dummy, "Branch $condition ($trueCont, $falseCont)");
   }
 
+  visitSetClosureVariable(ir.SetClosureVariable node) {
+    String dummy = names.name(node);
+    String variable = node.variable.name;
+    String value = formatReference(node.value);
+    printStmt(dummy, 'SetClosureVariable $variable = $value');
+    visit(node.body);
+  }
+
+  visitDeclareFunction(ir.DeclareFunction node) {
+    String dummy = names.name(node);
+    String variable = node.variable.name;
+    printStmt(dummy, 'DeclareFunction $variable');
+    visit(node.body);
+  }
+
   String formatReference(ir.Reference ref) {
     ir.Definition target = ref.definition;
     if (target is ir.Continuation && target.body == null) {
@@ -226,9 +241,19 @@
   }
 
   visitReifyTypeVar(ir.ReifyTypeVar node) {
-    return "ReifyTypeVar ${node.element.name}";
+    return "ReifyTypeVar ${node.typeVariable.name}";
   }
 
+  visitCreateFunction(ir.CreateFunction node) {
+    return "CreateFunction ${node.definition.element.name}";
+  }
+
+  visitGetClosureVariable(ir.GetClosureVariable node) {
+    String variable = node.variable.name;
+    return 'GetClosureVariable $variable';
+  }
+
+
   visitCondition(ir.Condition c) {}
   visitExpression(ir.Expression e) {}
   visitPrimitive(ir.Primitive p) {}
@@ -318,39 +343,39 @@
     visit(exp.body);
   }
 
-  visitInvokeStatic(ir.InvokeStatic exp) {
-    ir.Definition target = exp.continuation.definition;
+  void addEdgeToContinuation(ir.Reference continuation) {
+    ir.Definition target = continuation.definition;
     if (target is ir.Continuation && target.body != null) {
       current_block.addEdgeTo(getBlock(target));
     }
   }
 
+  visitInvokeStatic(ir.InvokeStatic exp) {
+    addEdgeToContinuation(exp.continuation);
+  }
+
   visitInvokeMethod(ir.InvokeMethod exp) {
-    ir.Definition target = exp.continuation.definition;
-    if (target is ir.Continuation && target.body != null) {
-      current_block.addEdgeTo(getBlock(target));
-    }
+    addEdgeToContinuation(exp.continuation);
   }
 
   visitInvokeConstructor(ir.InvokeConstructor exp) {
-    ir.Definition target = exp.continuation.definition;
-    if (target is ir.Continuation && target.body != null) {
-      current_block.addEdgeTo(getBlock(target));
-    }
+    addEdgeToContinuation(exp.continuation);
   }
 
   visitConcatenateStrings(ir.ConcatenateStrings exp) {
-    ir.Definition target = exp.continuation.definition;
-    if (target is ir.Continuation && target.body != null) {
-      current_block.addEdgeTo(getBlock(target));
-    }
+    addEdgeToContinuation(exp.continuation);
   }
 
   visitInvokeContinuation(ir.InvokeContinuation exp) {
-    ir.Definition target = exp.continuation.definition;
-    if (target is ir.Continuation && target.body != null) {
-      current_block.addEdgeTo(getBlock(target));
-    }
+    addEdgeToContinuation(exp.continuation);
+  }
+
+  visitSetClosureVariable(ir.SetClosureVariable exp) {
+    visit(exp.body);
+  }
+
+  visitDeclareFunction(ir.DeclareFunction exp) {
+    visit(exp.body);
   }
 
   visitBranch(ir.Branch exp) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index e9797e7..4e2e8f8 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -273,6 +273,14 @@
   /// dart:mirrors has been loaded.
   FunctionElement preserveMetadataMarker;
 
+  /// Holds the method "preserveUris" in js_mirrors when
+  /// dart:mirrors has been loaded.
+  FunctionElement preserveUrisMarker;
+
+  /// Holds the method "preserveLibraryNames" in js_mirrors when
+  /// dart:mirrors has been loaded.
+  FunctionElement preserveLibraryNamesMarker;
+
   /// Holds the method "requiresPreamble" in _js_helper.
   FunctionElement requiresPreambleMarker;
 
@@ -286,6 +294,12 @@
   /// program, this variable will stil be false.
   bool hasRetainedMetadata = false;
 
+  /// True if a call to preserveUris has been seen.
+  bool mustRetainUris = false;
+
+  /// True if a call to preserveLibraryNames has been seen.
+  bool mustRetainLibraryNames = false;
+
   /// True if a call to preserveNames has been seen.
   bool mustPreserveNames = false;
 
@@ -376,12 +390,17 @@
     return constantCompilerTask.jsConstantCompiler;
   }
 
-  // TODO(karlklose): split into findHelperFunction and findHelperClass and
+  // TODO(karlklose): Split into findHelperFunction and findHelperClass and
   // add a check that the element has the expected kind.
-  Element findHelper(String name)
-      => jsHelperLibrary.findLocal(name);
-  Element findInterceptor(String name)
-      => interceptorsLibrary.findLocal(name);
+  Element findHelper(String name) => find(jsHelperLibrary, name);
+  Element findInterceptor(String name) => find(interceptorsLibrary, name);
+
+  Element find(LibraryElement library, String name) {
+    Element element = library.findLocal(name);
+    assert(invariant(library, element != null,
+        message: "Element '$name' not found in '${library.canonicalUri}'."));
+    return element;
+  }
 
   bool isForeign(Element element) => element.library == foreignLibrary;
 
@@ -407,7 +426,8 @@
 
   bool invokedReflectively(Element element) {
     if (element.isParameter || element.isFieldParameter) {
-      if (invokedReflectively(element.enclosingElement)) return true;
+      ParameterElement parameter = element;
+      if (invokedReflectively(parameter.functionDeclaration)) return true;
     }
 
     if (element.isField) {
@@ -780,7 +800,6 @@
       // Because we cannot enqueue elements at the time of emission,
       // we make sure they are always generated.
       enqueue(enqueuer, findHelper('isJsIndexable'), registry);
-      enqueue(enqueuer, findInterceptor('dispatchPropertyName'), registry);
     }
 
     customElementsAnalysis.registerInstantiatedClass(cls, enqueuer);
@@ -934,12 +953,12 @@
       for (String name in const [START_ROOT_ISOLATE,
                                  '_currentIsolate',
                                  '_callInIsolate']) {
-        Element element = isolateHelperLibrary.find(name);
+        Element element = find(isolateHelperLibrary, name);
         enqueuer.addToWorkList(element);
         compiler.globalDependencies.registerDependency(element);
       }
     } else {
-      enqueuer.addToWorkList(isolateHelperLibrary.find(START_ROOT_ISOLATE));
+      enqueuer.addToWorkList(find(isolateHelperLibrary, START_ROOT_ISOLATE));
     }
   }
 
@@ -1447,6 +1466,10 @@
       mustPreserveNames = true;
     } else if (element == preserveMetadataMarker) {
       mustRetainMetadata = true;
+    } else if (element == preserveUrisMarker) {
+      mustRetainUris = true;
+    } else if (element == preserveLibraryNamesMarker) {
+      mustRetainLibraryNames = true;
     } else if (element == getIsolateAffinityTagMarker) {
       needToInitializeIsolateAffinityTag = true;
     } else if (element.isDeferredLoaderGetter) {
@@ -1525,7 +1548,7 @@
   void initializeHelperClasses() {
     final List missingHelperClasses = [];
     ClassElement lookupHelperClass(String name) {
-      ClassElement result = jsHelperLibrary.find(name);
+      ClassElement result = findHelper(name);
       if (result == null) {
         missingHelperClasses.add(name);
       }
@@ -1545,17 +1568,16 @@
     return super.onLibraryScanned(library, loader).then((_) {
       Uri uri = library.canonicalUri;
 
-      // TODO(johnniwinther): Assert that the elements are found.
       VariableElement findVariable(String name) {
-        return library.find(name);
+        return find(library, name);
       }
 
       FunctionElement findMethod(String name) {
-        return library.find(name);
+        return find(library, name);
       }
 
       ClassElement findClass(String name) {
-        return library.find(name);
+        return find(library, name);
       }
 
       if (uri == DART_INTERCEPTORS) {
@@ -1589,7 +1611,7 @@
         jsMutableIndexableClass = findClass('JSMutableIndexable');
       } else if (uri == DART_JS_HELPER) {
         initializeHelperClasses();
-        assertMethod = jsHelperLibrary.find('assertHelper');
+        assertMethod = findHelper('assertHelper');
 
         typeLiteralClass = findClass('TypeImpl');
         constMapLiteralClass = findClass('ConstantMap');
@@ -1602,14 +1624,16 @@
         noInlineClass = findClass('NoInline');
         irRepresentationClass = findClass('IrRepresentation');
 
-        getIsolateAffinityTagMarker = library.find('getIsolateAffinityTag');
+        getIsolateAffinityTagMarker = findMethod('getIsolateAffinityTag');
 
-        requiresPreambleMarker = library.find('requiresPreamble');
+        requiresPreambleMarker = findMethod('requiresPreamble');
       } else if (uri == DART_JS_MIRRORS) {
-        disableTreeShakingMarker = library.find('disableTreeShaking');
-        preserveMetadataMarker = library.find('preserveMetadata');
+        disableTreeShakingMarker = find(library, 'disableTreeShaking');
+        preserveMetadataMarker = find(library, 'preserveMetadata');
+        preserveUrisMarker = find(library, 'preserveUris');
+        preserveLibraryNamesMarker = find(library, 'preserveLibraryNames');
       } else if (uri == DART_JS_NAMES) {
-        preserveNamesMarker = library.find('preserveNames');
+        preserveNamesMarker = find(library, 'preserveNames');
       } else if (uri == DART_HTML) {
         htmlLibraryIsLoaded = true;
       }
@@ -1633,6 +1657,8 @@
     // [LinkedHashMap] is reexported from dart:collection and can therefore not
     // be loaded from dart:core in [onLibraryScanned].
     mapLiteralClass = compiler.coreLibrary.find('LinkedHashMap');
+    assert(invariant(compiler.coreLibrary, mapLiteralClass != null,
+        message: "Element 'LinkedHashMap' not found in 'dart:core'."));
 
     implementationClasses = <ClassElement, ClassElement>{};
     implementationClasses[compiler.intClass] = jsIntClass;
@@ -1820,9 +1846,7 @@
       // Do not process internal classes.
       if (cls.library.isInternalLibrary || cls.isInjected) continue;
       if (referencedFromMirrorSystem(cls)) {
-        Set<Name> memberNames = new LinkedHashSet<Name>(
-            equals: (Name a, Name b) => a.isSimilarTo(b),
-            hashCode: (Name a) => a.similarHashCode);
+        Set<Name> memberNames = new Set<Name>();
         // 1) the class (should be live)
         assert(invariant(cls, resolution.isLive(cls)));
         reflectableMembers.add(cls);
@@ -2193,14 +2217,15 @@
     }
     if (type is FunctionType) {
       registerBackendStaticInvocation(
-          backend.findHelper('functionTypeTestMetaHelper'), registry);
+          backend.find(backend.jsHelperLibrary, 'functionTypeTestMetaHelper'),
+          registry);
     }
     if (type.element != null && type.element.isNative) {
       // We will neeed to add the "$is" and "$as" properties on the
       // JavaScript object prototype, so we make sure
       // [:defineProperty:] is compiled.
       registerBackendStaticInvocation(
-          backend.findHelper('defineProperty'), registry);
+          backend.find(backend.jsHelperLibrary, 'defineProperty'), registry);
     }
   }
 
@@ -2256,7 +2281,7 @@
   void onConstantMap(Registry registry) {
     assert(registry.isForResolution);
     void enqueue(String name) {
-      Element e = backend.findHelper(name);
+      Element e = backend.find(backend.jsHelperLibrary, name);
       registerBackendInstantiation(e, registry);
     }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 48bc147..d875829 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -361,7 +361,7 @@
   }
 
   List<jsAst.Statement> generateParameterStubStatements(
-      Element member,
+      FunctionElement member,
       bool isInterceptedMethod,
       String invocationName,
       List<jsAst.Parameter> stubParameters,
@@ -376,7 +376,7 @@
     // must be turned into a JS call to:
     //   foo(null, y).
 
-    ClassElement classElement = member.enclosingElement;
+    ClassElement classElement = member.enclosingClass;
 
     List<jsAst.Statement> statements = <jsAst.Statement>[];
     potentiallyConvertDartClosuresToJs(statements, member, stubParameters);
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
index a9c70c9..21bdcc3 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -146,7 +146,7 @@
     compiler.resolverWorld.isChecks.forEach((DartType type) {
       if (type.isTypeVariable) {
         TypeVariableElement variable = type.element;
-        classesUsingTypeVariableTests.add(variable.enclosingElement);
+        classesUsingTypeVariableTests.add(variable.typeDeclaration);
       }
     });
     // Add is-checks that result from classes using type variables in checks.
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
index 8f904af..a9e66df 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -596,7 +596,7 @@
 
     Substitution substitution =
         backend.rti.computeSubstitution(
-            cls, element.enclosingElement, alwaysGenerateFunction: true);
+            cls, element.typeDeclaration, alwaysGenerateFunction: true);
     if (substitution != null) {
       jsAst.Expression typeArguments =
           js(r'#.apply(null, this.$builtinTypeInfo)',
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index 5fc4ba0..56b6ce4 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -1299,10 +1299,17 @@
   }
 
   void writeLibraryDescriptors(LibraryElement library) {
-    var uri = library.canonicalUri;
-    if (uri.scheme == 'file' && compiler.outputUri != null) {
-      uri = relativize(compiler.outputUri, library.canonicalUri, false);
+    var uri = "";
+    if (!compiler.enableMinification || backend.mustRetainUris) {
+      uri = library.canonicalUri;
+      if (uri.scheme == 'file' && compiler.outputUri != null) {
+        uri = relativize(compiler.outputUri, library.canonicalUri, false);
+      }
     }
+    String libraryName =
+        (!compiler.enableMinification || backend.mustRetainLibraryNames) ?
+        library.getLibraryName() :
+        "";
     Map<OutputUnit, ClassBuilder> descriptors =
         elementDescriptors[library];
 
@@ -1320,7 +1327,7 @@
           outputBuffers.putIfAbsent(outputUnit, () => new CodeBuffer());
       int sizeBefore = outputBuffer.length;
       outputBuffers[outputUnit]
-          ..write('["${library.getLibraryName()}",$_')
+          ..write('["$libraryName",$_')
           ..write('"${uri}",$_')
           ..write(metadata == null ? "" : jsAst.prettyPrint(metadata, compiler))
           ..write(',$_')
@@ -1603,10 +1610,10 @@
         }
       }
 
-      emitMain(mainBuffer);
       jsAst.FunctionDeclaration precompiledFunctionAst =
           buildPrecompiledFunction();
       emitInitFunction(mainBuffer);
+      emitMain(mainBuffer);
       if (!compiler.deferredLoadTask.splitProgram) {
         mainBuffer.add('})()\n');
       } else {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
index e93400c..e7abe4c 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
@@ -330,7 +330,7 @@
   Dart2JsDeclarationMirror get owner {
     if (_owner == null) {
       _owner = mirrorSystem._getTypeDeclarationMirror(
-          _type.element.enclosingElement);
+          _type.element.typeDeclaration);
     }
     return _owner;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index e484a72..cd55006 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -525,8 +525,6 @@
           world, backend.findHelper(name), compiler.globalDependencies);
     }
 
-    staticUse('dynamicFunction');
-    staticUse('dynamicSetMetadata');
     staticUse('defineProperty');
     staticUse('toStringForNativeObject');
     staticUse('hashCodeForNativeObject');
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index b60dfc7..b07f71f 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -1953,7 +1953,7 @@
  * Do not subclass or instantiate this class outside this library
  * except for testing.
  */
-class ResolverVisitor extends MappingVisitor<Element> {
+class ResolverVisitor extends MappingVisitor<ResolutionResult> {
   /**
    * The current enclosing element for the visited AST nodes.
    *
@@ -2109,7 +2109,7 @@
     return new ErroneousElementX(kind, arguments, name, enclosingElement);
   }
 
-  Element visitIdentifier(Identifier node) {
+  ResolutionResult visitIdentifier(Identifier node) {
     if (node.isThis()) {
       if (!inInstanceContext) {
         error(node, MessageKind.NO_INSTANCE_AVAILABLE, {'name': node});
@@ -2152,19 +2152,16 @@
         ClassElement classElement = element;
         classElement.ensureResolved(compiler);
       }
-      return registry.useElement(node, element);
+      return new ElementResult(registry.useElement(node, element));
     }
   }
 
-  Element visitTypeAnnotation(TypeAnnotation node) {
+  ResolutionResult visitTypeAnnotation(TypeAnnotation node) {
     DartType type = resolveTypeAnnotation(node);
-    if (type != null) {
-      if (inCheckContext) {
-        registry.registerIsCheck(type);
-      }
-      return type.element;
+    if (inCheckContext) {
+      registry.registerIsCheck(type);
     }
-    return null;
+    return new TypeResult(type);
   }
 
   bool isNamedConstructor(Send node) => node.receiver != null;
@@ -2254,9 +2251,9 @@
   visitIn(Node node, Scope nestedScope) {
     Scope oldScope = scope;
     scope = nestedScope;
-    Element element = visit(node);
+    ResolutionResult result = visit(node);
     scope = oldScope;
-    return element;
+    return result;
   }
 
   /**
@@ -2348,7 +2345,7 @@
     visitIn(node.elsePart, new BlockScope(scope));
   }
 
-  Element resolveSend(Send node) {
+  ResolutionResult resolveSend(Send node) {
     Selector selector = resolveSelector(node, null);
     if (node.isSuperCall) registry.registerSuperUse(node);
 
@@ -2366,9 +2363,7 @@
                 {'argumentCount': selector.namedArgumentCount});
         }
         registry.registerAssert(node);
-        // TODO(johnniwinther): Return a marker to indicated that this is
-        // a call to assert.
-        return null;
+        return const AssertResult();
       }
 
       return node.selector.accept(this);
@@ -2376,7 +2371,7 @@
 
     var oldCategory = allowedCategory;
     allowedCategory |= ElementCategory.PREFIX | ElementCategory.SUPER;
-    Element resolvedReceiver = visit(node.receiver);
+    ResolutionResult resolvedReceiver = visit(node.receiver);
     allowedCategory = oldCategory;
 
     Element target;
@@ -2418,10 +2413,11 @@
         registry.registerDynamicInvocation(selector);
         registry.registerSuperNoSuchMethod();
       }
-    } else if (Elements.isUnresolved(resolvedReceiver)) {
+    } else if (resolvedReceiver == null ||
+               Elements.isUnresolved(resolvedReceiver.element)) {
       return null;
-    } else if (resolvedReceiver.isClass) {
-      ClassElement receiverClass = resolvedReceiver;
+    } else if (resolvedReceiver.element.isClass) {
+      ClassElement receiverClass = resolvedReceiver.element;
       receiverClass.ensureResolved(compiler);
       if (node.isOperator) {
         // When the resolved receiver is a class, we can have two cases:
@@ -2447,18 +2443,18 @@
         MessageKind kind = (target == null)
             ? MessageKind.MEMBER_NOT_FOUND
             : MessageKind.MEMBER_NOT_STATIC;
-        return warnAndCreateErroneousElement(node, name, kind,
-                                             {'className': receiverClass.name,
-                                              'memberName': name});
+        return new ElementResult(warnAndCreateErroneousElement(
+            node, name, kind,
+            {'className': receiverClass.name, 'memberName': name}));
       }
-    } else if (identical(resolvedReceiver.kind, ElementKind.PREFIX)) {
-      PrefixElement prefix = resolvedReceiver;
+    } else if (resolvedReceiver.element.isPrefix) {
+      PrefixElement prefix = resolvedReceiver.element;
       target = prefix.lookupLocalMember(name);
       if (Elements.isUnresolved(target)) {
         registry.registerThrowNoSuchMethod();
-        return warnAndCreateErroneousElement(
+        return new ElementResult(warnAndCreateErroneousElement(
             node, name, MessageKind.NO_SUCH_LIBRARY_MEMBER,
-            {'libraryName': prefix.name, 'memberName': name});
+            {'libraryName': prefix.name, 'memberName': name}));
       } else if (target.isAmbiguous) {
         registry.registerThrowNoSuchMethod();
         AmbiguousElement ambiguous = target;
@@ -2466,13 +2462,13 @@
                                                ambiguous.messageKind,
                                                ambiguous.messageArguments);
         ambiguous.diagnose(enclosingElement, compiler);
-        return target;
+        return new ElementResult(target);
       } else if (target.kind == ElementKind.CLASS) {
         ClassElement classElement = target;
         classElement.ensureResolved(compiler);
       }
     }
-    return target;
+    return new ElementResult(target);
   }
 
   static Selector computeSendSelector(Send node,
@@ -2575,17 +2571,19 @@
     sendIsMemberAccess = oldSendIsMemberAccess;
   }
 
-  visitSend(Send node) {
+  ResolutionResult visitSend(Send node) {
     bool oldSendIsMemberAccess = sendIsMemberAccess;
     sendIsMemberAccess = node.isPropertyAccess || node.isCall;
-    Element target;
+    ResolutionResult result;
     if (node.isLogicalAnd) {
-      target = doInPromotionScope(node.receiver, () => resolveSend(node));
+      result = doInPromotionScope(node.receiver, () => resolveSend(node));
     } else {
-      target = resolveSend(node);
+      result = resolveSend(node);
     }
     sendIsMemberAccess = oldSendIsMemberAccess;
 
+    Element target = result != null ? result.element : null;
+
     if (target != null
         && target == compiler.mirrorSystemGetNameFunction
         && !compiler.mirrorUsageAnalyzerTask.hasMirrorUsage(enclosingElement)) {
@@ -2727,7 +2725,7 @@
     if (node.isPropertyAccess && Elements.isStaticOrTopLevelFunction(target)) {
       registry.registerGetOfStaticFunction(target.declaration);
     }
-    return node.isPropertyAccess ? target : null;
+    return node.isPropertyAccess ? new ElementResult(target) : null;
   }
 
   /// Callback for native enqueuer to parse a type.  Returns [:null:] on error.
@@ -2741,17 +2739,18 @@
     return cls.computeType(compiler);
   }
 
-  visitSendSet(SendSet node) {
+  ResolutionResult visitSendSet(SendSet node) {
     bool oldSendIsMemberAccess = sendIsMemberAccess;
     sendIsMemberAccess = node.isPropertyAccess || node.isCall;
-    Element target = resolveSend(node);
+    ResolutionResult result = resolveSend(node);
     sendIsMemberAccess = oldSendIsMemberAccess;
+    Element target = result != null ? result.element : null;
     Element setter = target;
     Element getter = target;
     String operatorName = node.assignmentOperator.source;
     String source = operatorName;
     bool isComplex = !identical(source, '=');
-    if (!(registry.isAssert(node) || Elements.isUnresolved(target))) {
+    if (!(result is AssertResult || Elements.isUnresolved(target))) {
       if (target.isAbstractField) {
         AbstractFieldElement field = target;
         setter = field.setter;
@@ -2838,7 +2837,7 @@
     }
 
     registerSend(selector, setter);
-    return registry.useElement(node, setter);
+    return new ElementResult(registry.useElement(node, setter));
   }
 
   void registerSend(Selector selector, Element target) {
@@ -2989,7 +2988,7 @@
 
     registry.registerStaticUse(redirectionTarget);
     registry.registerInstantiatedClass(
-        redirectionTarget.enclosingElement.declaration);
+        redirectionTarget.enclosingClass.declaration);
     if (isSymbolConstructor) {
       registry.registerSymbolConstructor();
     }
@@ -3059,7 +3058,7 @@
     sendIsMemberAccess = oldSendIsMemberAccess;
   }
 
-  visitNewExpression(NewExpression node) {
+  ResolutionResult visitNewExpression(NewExpression node) {
     Node selector = node.send.selector;
     FunctionElement constructor = resolveConstructor(node);
     final bool isSymbolConstructor = constructor == compiler.symbolConstructor;
@@ -3068,7 +3067,9 @@
     Selector callSelector = resolveSelector(node.send, constructor);
     resolveArguments(node.send.argumentsNode);
     registry.useElement(node.send, constructor);
-    if (Elements.isUnresolved(constructor)) return constructor;
+    if (Elements.isUnresolved(constructor)) {
+      return new ElementResult(constructor);
+    }
     if (!callSelector.applies(constructor, compiler)) {
       registry.registerThrowNoSuchMethod();
     }
@@ -3202,7 +3203,7 @@
   }
 
   ConstructorElement resolveRedirectingFactory(Return node,
-                                            {bool inConstContext: false}) {
+                                               {bool inConstContext: false}) {
     return node.accept(new ConstructorResolver(compiler, this,
                                                inConstContext: inConstContext));
   }
@@ -3213,7 +3214,6 @@
     DartType type = typeResolver.resolveTypeAnnotation(
         this, node, malformedIsError: malformedIsError,
         deferredIsMalformed: deferredIsMalformed);
-    if (type == null) return null;
     if (inCheckContext) {
       registry.registerIsCheck(type);
       registry.registerRequiredType(type, enclosingElement);
@@ -4707,3 +4707,45 @@
     return _treeElements;
   }
 }
+
+/// The result of resolving a node.
+abstract class ResolutionResult {
+  Element get element;
+}
+
+/// The result for the resolution of a node that points to an [Element].
+class ElementResult implements ResolutionResult {
+  final Element element;
+
+  // TODO(johnniwinther): Remove this factory constructor when `null` is never
+  // passed as an element result.
+  factory ElementResult(Element element) {
+    return element != null ? new ElementResult.internal(element) : null;
+  }
+
+  ElementResult.internal(this.element);
+
+  String toString() => 'ElementResult($element)';
+}
+
+/// The result for the resolution of a node that points to an [DartType].
+class TypeResult implements ResolutionResult {
+  final DartType type;
+
+  TypeResult(this.type) {
+    assert(type != null);
+  }
+
+  Element get element => type.element;
+
+  String toString() => 'TypeResult($type)';
+}
+
+/// The result for the resolution of the `assert` method.
+class AssertResult implements ResolutionResult {
+  const AssertResult();
+
+  Element get element => null;
+
+  String toString() => 'AssertResult()';
+}
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
index ed1dc5c..97b9ec0 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
@@ -9,7 +9,7 @@
  */
 class SignatureResolver extends MappingVisitor<ParameterElementX> {
   final ResolverVisitor resolver;
-  final Element enclosingElement;
+  final FunctionTypedElement enclosingElement;
   final Scope scope;
   final MessageKind defaultValuesError;
   Link<Element> optionalParameters = const Link<Element>();
@@ -19,7 +19,7 @@
   VariableDefinitions currentDefinitions;
 
   SignatureResolver(Compiler compiler,
-                    Element enclosingElement,
+                    FunctionTypedElement enclosingElement,
                     ResolutionRegistry registry,
                     {this.defaultValuesError})
       : this.enclosingElement = enclosingElement,
@@ -243,7 +243,7 @@
   static FunctionSignature analyze(Compiler compiler,
                                    NodeList formalParameters,
                                    Node returnNode,
-                                   Element element,
+                                   FunctionTypedElement element,
                                    ResolutionRegistry registry,
                                    {MessageKind defaultValuesError}) {
     SignatureResolver visitor = new SignatureResolver(compiler, element,
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index d391d10..fc62167 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -392,14 +392,13 @@
       builder.add(fieldGet);
       return fieldGet;
     } else if (isBoxed(element)) {
-      Element redirect = redirectionMapping[element];
+      BoxFieldElement redirect = redirectionMapping[element];
       // In the function that declares the captured variable the box is
       // accessed as direct local. Inside the nested closure the box is
       // accessed through a closure-field.
       // Calling [readLocal] makes sure we generate the correct code to get
       // the box.
-      assert(redirect.enclosingElement is BoxElement);
-      HInstruction box = readLocal(redirect.enclosingElement);
+      HInstruction box = readLocal(redirect.box);
       HInstruction lookup = new HFieldGet(
           redirect, box, builder.getTypeOfCapturedVariable(redirect));
       builder.add(lookup);
@@ -447,13 +446,12 @@
     if (isAccessedDirectly(element)) {
       directLocals[element] = value;
     } else if (isBoxed(element)) {
-      Element redirect = redirectionMapping[element];
+      BoxFieldElement redirect = redirectionMapping[element];
       // The box itself could be captured, or be local. A local variable that
       // is captured will be boxed, but the box itself will be a local.
       // Inside the closure the box is stored in a closure-field and cannot
       // be accessed directly.
-      assert(redirect.enclosingElement is BoxElement);
-      HInstruction box = readLocal(redirect.enclosingElement);
+      HInstruction box = readLocal(redirect.box);
       builder.add(new HFieldSet(redirect, box, value));
     } else {
       assert(isUsedInTry(element));
@@ -1385,7 +1383,7 @@
   TypeMask getTypeOfThis() {
     TypeMask result = cachedTypeOfThis;
     if (result == null) {
-      Element element = localsHandler.closureData.thisElement;
+      ThisElement element = localsHandler.closureData.thisElement;
       ClassElement cls = element.enclosingElement.enclosingClass;
       if (compiler.world.isUsedAsMixin(cls)) {
         // If the enclosing class is used as a mixin, [:this:] can be
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
index f580029..15f460b 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
@@ -774,7 +774,7 @@
       relational.block.rewrite(
           relational, graph.addConstantBool(true, compiler));
       relational.block.remove(relational);
-    } else if (reverseOperation(operation).apply(leftRange, rightRange)) {
+    } else if (negateOperation(operation).apply(leftRange, rightRange)) {
       relational.block.rewrite(
           relational, graph.addConstantBool(false, compiler));
       relational.block.remove(relational);
@@ -885,7 +885,7 @@
     return newInstruction;
   }
 
-  static BinaryOperation reverseOperation(BinaryOperation operation) {
+  static BinaryOperation negateOperation(BinaryOperation operation) {
     if (operation == const LessOperation()) {
       return const GreaterEqualOperation();
     } else if (operation == const LessEqualOperation()) {
@@ -899,6 +899,20 @@
     }
   }
 
+  static BinaryOperation flipOperation(BinaryOperation operation) {
+    if (operation == const LessOperation()) {
+      return const GreaterOperation();
+    } else if (operation == const LessEqualOperation()) {
+      return const GreaterEqualOperation();
+    } else if (operation == const GreaterOperation()) {
+      return const LessOperation();
+    } else if (operation == const GreaterEqualOperation()) {
+      return const LessEqualOperation();
+    } else {
+      return null;
+    }
+  }
+
   Range computeConstrainedRange(BinaryOperation operation,
                                 Range leftRange,
                                 Range rightRange) {
@@ -932,7 +946,7 @@
     Range rightRange = ranges[right];
     Range leftRange = ranges[left];
     Operation operation = condition.operation(constantSystem);
-    Operation reverse = reverseOperation(operation);
+    Operation mirrorOp = flipOperation(operation);
     // Only update the true branch if this block is the only
     // predecessor.
     if (branch.trueBranch.predecessors.length == 1) {
@@ -946,7 +960,7 @@
         ranges[instruction] = range;
       }
 
-      range = computeConstrainedRange(reverse, rightRange, leftRange);
+      range = computeConstrainedRange(mirrorOp, rightRange, leftRange);
       if (rightRange != range) {
         HInstruction instruction =
             createRangeConversion(branch.trueBranch.first, right);
@@ -958,6 +972,8 @@
     // predecessor.
     if (branch.falseBranch.predecessors.length == 1) {
       assert(branch.falseBranch.predecessors[0] == branch.block);
+      Operation reverse = negateOperation(operation);
+      Operation reversedMirror = flipOperation(reverse);
       // Update the false branch to use narrower ranges for [left] and
       // [right].
       Range range = computeConstrainedRange(reverse, leftRange, rightRange);
@@ -967,7 +983,7 @@
         ranges[instruction] = range;
       }
 
-      range = computeConstrainedRange(operation, rightRange, leftRange);
+      range = computeConstrainedRange(reversedMirror, rightRange, leftRange);
       if (rightRange != range) {
         HInstruction instruction =
             createRangeConversion(branch.falseBranch.first, right);
diff --git a/sdk/lib/_internal/lib/interceptors.dart b/sdk/lib/_internal/lib/interceptors.dart
index 1477ea0..32355ae 100644
--- a/sdk/lib/_internal/lib/interceptors.dart
+++ b/sdk/lib/_internal/lib/interceptors.dart
@@ -392,7 +392,11 @@
 /**
  * Interceptor for unclassified JavaScript objects, typically objects with a
  * non-trivial prototype chain.
+ *
+ * This class also serves as a fallback for unknown JavaScript exceptions.
  */
 class UnknownJavaScriptObject extends JavaScriptObject {
   const UnknownJavaScriptObject();
+
+  String toString() => JS('String', 'String(#)', this);
 }
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index 4cbdaf9..b4a250d 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -64,6 +64,14 @@
 /// preserved at runtime.
 preserveMetadata() {}
 
+/// No-op method that is called to inform the compiler that the compiler must
+/// preserve the URIs.
+preserveUris() {}
+
+/// No-op method that is called to inform the compiler that the compiler must
+/// preserve the library names.
+preserveLibraryNames() {}
+
 String getName(Symbol symbol) {
   preserveNames();
   return n(symbol);
@@ -278,7 +286,7 @@
 
 class JsLibraryMirror extends JsDeclarationMirror with JsObjectMirror
     implements LibraryMirror {
-  final Uri uri;
+  final Uri _uri;
   final List<String> _classes;
   final List<String> _functions;
   final List _metadata;
@@ -297,17 +305,24 @@
   UnmodifiableListView<InstanceMirror> _cachedMetadata;
 
   JsLibraryMirror(Symbol simpleName,
-                  this.uri,
+                  this._uri,
                   this._classes,
                   this._functions,
                   this._metadata,
                   this._compactFieldSpecification,
                   this._isRoot,
                   this._globalObject)
-      : super(simpleName);
+      : super(simpleName) {
+    preserveLibraryNames();
+  }
 
   String get _prettyName => 'LibraryMirror';
 
+  Uri get uri {
+    preserveUris();
+    return _uri;
+  }
+
   Symbol get qualifiedName => simpleName;
 
   List<JsMethodMirror> get _methods => _functionMirrors;
diff --git a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
index 6f21c8d..814dbbe 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -24,7 +24,7 @@
 
 /// The set of all valid configuration options for this transformer.
 final _validOptions = new Set<String>.from([
-  'commandLineOptions', 'checked', 'minify', 'verbose', 'environment',
+  'commandLineOptions', 'checked', 'csp', 'minify', 'verbose', 'environment',
   'analyzeAll', 'suppressWarnings', 'suppressHints', 'suppressPackageWarnings',
   'terse'
 ]);
@@ -135,6 +135,7 @@
     return Chain.track(dart.compile(
         entrypoint, provider,
         commandLineOptions: _configCommandLineOptions,
+        csp: _configBool('csp'),
         checked: _configBool('checked'),
         minify: _configBool(
             'minify', defaultsTo: _settings.mode == BarbackMode.RELEASE),
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 6b04354..5f0df64 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -25,7 +25,6 @@
 import 'command/version.dart';
 import 'entrypoint.dart';
 import 'exceptions.dart';
-import 'exit_codes.dart' as exit_codes;
 import 'log.dart' as log;
 import 'global_packages.dart';
 import 'system_cache.dart';
@@ -68,7 +67,7 @@
   /// [commands].
   static void usageErrorWithCommands(Map<String, PubCommand> commands,
                                 String message) {
-    throw new UsageException(message, _listCommands(commands));
+    throw new UsageException(message)..bindUsage(_listCommands(commands));
   }
 
   /// Writes [commands] in a nicely formatted list to [buffer].
@@ -191,7 +190,10 @@
       entrypoint = new Entrypoint(path.current, cache);
     }
 
-    return syncFuture(onRun);
+    return syncFuture(onRun).catchError((error) {
+      if (error is UsageException) error.bindUsage(_getUsage());
+      throw error;
+    });
   }
 
   /// Override this to perform the specific command.
@@ -214,13 +216,6 @@
     log.message('$description\n\n${_getUsage()}');
   }
 
-  // TODO(rnystrom): Use this in other places handle usage failures.
-  /// Throw a [UsageException] for a usage error of this command with
-  /// [message].
-  void usageError(String message) {
-    throw new UsageException(message, _getUsage());
-  }
-
   /// Parses a user-supplied integer [intString] named [name].
   ///
   /// If the parsing fails, prints a usage message and exits.
@@ -232,6 +227,11 @@
     }
   }
 
+  /// Fails with a usage error [message] for this command.
+  void usageError(String message) {
+    throw new UsageException(message)..bindUsage(_getUsage());
+  }
+
   /// Generates a string of usage information for this command.
   String _getUsage() {
     var buffer = new StringBuffer();
diff --git a/sdk/lib/_internal/pub/lib/src/command/global.dart b/sdk/lib/_internal/pub/lib/src/command/global.dart
index aa1ee24..8c2105c 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global.dart
@@ -7,6 +7,7 @@
 import '../command.dart';
 import 'global_activate.dart';
 import 'global_deactivate.dart';
+import 'global_run.dart';
 
 /// Handles the `global` pub command.
 class GlobalCommand extends PubCommand {
@@ -15,6 +16,7 @@
 
   final subcommands = {
     "activate": new GlobalActivateCommand(),
-    "deactivate": new GlobalDeactivateCommand()
+    "deactivate": new GlobalDeactivateCommand(),
+    "run": new GlobalRunCommand()
   };
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_run.dart b/sdk/lib/_internal/pub/lib/src/command/global_run.dart
new file mode 100644
index 0000000..bdffb93
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/command/global_run.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.command.global_run;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+import 'package:stack_trace/stack_trace.dart';
+
+import '../barback/asset_environment.dart';
+import '../command.dart';
+import '../entrypoint.dart';
+import '../executable.dart';
+import '../exit_codes.dart' as exit_codes;
+import '../io.dart';
+import '../log.dart' as log;
+import '../utils.dart';
+
+/// Handles the `global run` pub command.
+class GlobalRunCommand extends PubCommand {
+  bool get requiresEntrypoint => false;
+  bool get takesArguments => true;
+  bool get allowTrailingOptions => false;
+  String get description =>
+      "Run an executable from a globally activated package.";
+  String get usage => "pub global run <package> <executable> [args...]";
+
+  Future onRun() {
+    if (commandOptions.rest.isEmpty) {
+      usageError("Must specify a package and executable to run.");
+    }
+
+    if (commandOptions.rest.length == 1) {
+      usageError("Must specify an executable to run.");
+    }
+
+    var package = commandOptions.rest[0];
+    var executable = commandOptions.rest[1];
+    var args = commandOptions.rest.skip(2);
+
+    return globals.find(package).then((entrypoint) {
+      return runExecutable(entrypoint, package, executable, args);
+    }).then(flushThenExit);
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
index 5561d44..8294594 100644
--- a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
@@ -36,7 +36,7 @@
     // Include the local paths to all locked packages.
     var packages = {};
     var futures = [];
-    entrypoint.loadLockFile().packages.forEach((name, package) {
+    entrypoint.lockFile.packages.forEach((name, package) {
       var source = entrypoint.cache.sources[package.source];
       futures.add(source.getDirectory(package).then((packageDir) {
         packages[name] = path.join(packageDir, "lib");
diff --git a/sdk/lib/_internal/pub/lib/src/command/run.dart b/sdk/lib/_internal/pub/lib/src/command/run.dart
index 5973ca7..5d8aaa9 100644
--- a/sdk/lib/_internal/pub/lib/src/command/run.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/run.dart
@@ -13,13 +13,12 @@
 
 import '../barback/asset_environment.dart';
 import '../command.dart';
+import '../executable.dart';
 import '../exit_codes.dart' as exit_codes;
 import '../io.dart';
 import '../log.dart' as log;
 import '../utils.dart';
 
-final _arrow = getSpecial('\u2192', '=>');
-
 /// Handles the `run` pub command.
 class RunCommand extends PubCommand {
   bool get takesArguments => true;
@@ -32,109 +31,20 @@
       usageError("Must specify an executable to run.");
     }
 
-    // Unless the user overrides the verbosity, we want to filter out the
-    // normal pub output shown while loading the environment.
-    if (log.verbosity == log.Verbosity.NORMAL) {
-      log.verbosity = log.Verbosity.WARNING;
-    }
-
     var environment;
     var package = entrypoint.root.name;
-    var rootDir;
-    var scriptPath;
-    var args;
-    return AssetEnvironment.create(entrypoint, BarbackMode.RELEASE,
-        WatcherType.NONE, useDart2JS: false)
-          .then((_environment) {
-      environment = _environment;
+    var executable = commandOptions.rest[0];
+    var args = commandOptions.rest.skip(1).toList();
 
-      // Show in-progress errors, but not results. Those get handled
-      // implicitly by getAllAssets().
-      environment.barback.errors.listen((error) {
-        log.error(log.red("Build error:\n$error"));
-      });
+    // A command like "foo:bar" runs the "bar" script from the "foo" package.
+    // If there is no colon prefix, default to the root package.
+    if (executable.contains(":")) {
+      var components = split1(executable, ":");
+      package = components[0];
+      executable = components[1];
+    }
 
-      var script = commandOptions.rest[0];
-      args = commandOptions.rest.skip(1).toList();
-
-      // A command like "foo:bar" runs the "bar" script from the "foo" package.
-      // If there is no colon prefix, default to the root package.
-      if (script.contains(":")) {
-        var components = split1(script, ":");
-        package = components[0];
-        script = components[1];
-
-        var dep = entrypoint.root.immediateDependencies.firstWhere(
-            (dep) => dep.name == package, orElse: () => null);
-        if (dep == null) {
-          if (environment.graph.packages.containsKey(package)) {
-            dataError('Package "$package" is not an immediate dependency.\n'
-                'Cannot run executables in transitive dependencies.');
-          } else {
-            dataError('Could not find package "$package". Did you forget to '
-                'add a dependency?');
-          }
-        }
-      }
-
-      // If the command has a path separator, then it's a path relative to the
-      // root of the package. Otherwise, it's implicitly understood to be in
-      // "bin".
-      var parts = path.split(script);
-      if (parts.length > 1) {
-        if (package != entrypoint.root.name) {
-          usageError("Can not run an executable in a subdirectory of a "
-              "dependency.");
-        }
-
-        scriptPath = "${path.url.joinAll(parts.skip(1))}.dart";
-        rootDir = parts.first;
-      } else {
-        scriptPath = "$script.dart";
-        rootDir = "bin";
-      }
-
-      if (package == entrypoint.root.name) {
-        // Serve the entire root-most directory containing the entrypoint. That
-        // ensures that, for example, things like `import '../../utils.dart';`
-        // will work from within some deeply nested script.
-        return environment.serveDirectory(rootDir);
-      } else {
-        // For other packages, always use the "bin" directory.
-        return environment.servePackageBinDirectory(package);
-      }
-    }).then((server) {
-      // Try to make sure the entrypoint script exists (or is generated) before
-      // we spawn the process to run it.
-      return environment.barback.getAssetById(
-          new AssetId(package, path.url.join(rootDir, scriptPath))).then((_) {
-
-        // Run in checked mode.
-        // TODO(rnystrom): Make this configurable.
-        var mode = "--checked";
-        args = [mode, server.url.resolve(scriptPath).toString()]..addAll(args);
-
-        return Process.start(Platform.executable, args).then((process) {
-          // Note: we're not using process.std___.pipe(std___) here because
-          // that prevents pub from also writing to the output streams.
-          process.stderr.listen(stderr.add);
-          process.stdout.listen(stdout.add);
-          stdin.listen(process.stdin.add);
-
-          return process.exitCode;
-        }).then(flushThenExit);
-      }).catchError((error, stackTrace) {
-        if (error is! AssetNotFoundException) throw error;
-
-        var message = "Could not find ${path.join(rootDir, scriptPath)}";
-        if (package != entrypoint.root.name) {
-          message += " in package $package";
-        }
-
-        log.error("$message.");
-        log.fine(new Chain.forTrace(stackTrace));
-        return flushThenExit(exit_codes.NO_INPUT);
-      });
-    });
+    return runExecutable(entrypoint, package, executable, args)
+        .then(flushThenExit);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index 9a26e1c..50bdd2c 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -59,6 +59,7 @@
 Future compile(String entrypoint, CompilerProvider provider, {
     Iterable<String> commandLineOptions,
     bool checked: false,
+    bool csp: false,
     bool minify: true,
     bool verbose: false,
     Map<String, String> environment,
@@ -73,6 +74,7 @@
   return syncFuture(() {
     var options = <String>['--categories=Client,Server'];
     if (checked) options.add('--enable-checked-mode');
+    if (csp) options.add('--csp');
     if (minify) options.add('--minify');
     if (verbose) options.add('--verbose');
     if (analyzeAll) options.add('--analyze-all');
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 51f05a7..c866d60 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -43,17 +43,36 @@
   /// the network.
   final SystemCache cache;
 
+  /// The lockfile for the entrypoint.
+  ///
+  /// If not provided to the entrypoint, it will be laoded lazily from disc.
+  LockFile _lockFile;
+
   /// Loads the entrypoint from a package at [rootDir].
   Entrypoint(String rootDir, SystemCache cache)
       : root = new Package.load(null, rootDir, cache.sources),
         cache = cache;
 
-  // TODO(rnystrom): Make this path configurable.
+  /// Creates an entrypoint given package and lockfile objects.
+  Entrypoint.inMemory(this.root, this._lockFile, this.cache);
+
   /// The path to the entrypoint's "packages" directory.
   String get packagesDir => path.join(root.dir, 'packages');
 
   /// `true` if the entrypoint package currently has a lock file.
-  bool get lockFileExists => entryExists(lockFilePath);
+  bool get lockFileExists => _lockFile != null || entryExists(lockFilePath);
+
+  LockFile get lockFile {
+    if (_lockFile != null) return _lockFile;
+
+    if (!lockFileExists) {
+      _lockFile = new LockFile.empty();
+    } else {
+      _lockFile = new LockFile.load(lockFilePath, cache.sources);
+    }
+
+    return _lockFile;
+  }
 
   /// The path to the entrypoint package's lockfile.
   String get lockFilePath => path.join(root.dir, 'pubspec.lock');
@@ -73,7 +92,7 @@
   Future acquireDependencies({List<String> useLatest, bool isUpgrade: false,
       bool dryRun: false}) {
     return syncFuture(() {
-      return resolveVersions(cache.sources, root, lockFile: loadLockFile(),
+      return resolveVersions(cache.sources, root, lockFile: lockFile,
           useLatest: useLatest, upgradeAll: isUpgrade && useLatest.isEmpty);
     }).then((result) {
       if (!result.succeeded) throw result.error;
@@ -111,15 +130,6 @@
     return source.get(id, packageDir).then((_) => source.resolveId(id));
   }
 
-  /// Loads the list of concrete package versions from the `pubspec.lock`, if it
-  /// exists.
-  ///
-  /// If it doesn't, this completes to an empty [LockFile].
-  LockFile loadLockFile() {
-    if (!lockFileExists) return new LockFile.empty();
-    return new LockFile.load(lockFilePath, cache.sources);
-  }
-
   /// Determines whether or not the lockfile is out of date with respect to the
   /// pubspec.
   ///
@@ -174,8 +184,6 @@
   /// pubspec.
   Future _ensureLockFileIsUpToDate() {
     return syncFuture(() {
-      var lockFile = loadLockFile();
-
       // If we don't have a current lock file, we definitely need to install.
       if (!_isLockFileUpToDate(lockFile)) {
         if (lockFileExists) {
@@ -214,7 +222,6 @@
   /// and up to date.
   Future<PackageGraph> loadPackageGraph() {
     return _ensureLockFileIsUpToDate().then((_) {
-      var lockFile = loadLockFile();
       return Future.wait(lockFile.packages.values.map((id) {
         var source = cache.sources[id.source];
         return source.getDirectory(id)
@@ -229,9 +236,9 @@
 
   /// Saves a list of concrete package versions to the `pubspec.lock` file.
   void _saveLockFile(List<PackageId> packageIds) {
-    var lockFile = new LockFile(packageIds);
+    _lockFile = new LockFile(packageIds);
     var lockFilePath = path.join(root.dir, 'pubspec.lock');
-    writeTextFile(lockFilePath, lockFile.serialize(root.dir, cache.sources));
+    writeTextFile(lockFilePath, _lockFile.serialize(root.dir, cache.sources));
   }
 
   /// Creates a self-referential symlink in the `packages` directory that allows
diff --git a/sdk/lib/_internal/pub/lib/src/exceptions.dart b/sdk/lib/_internal/pub/lib/src/exceptions.dart
index af09a0c..7bbbb34 100644
--- a/sdk/lib/_internal/pub/lib/src/exceptions.dart
+++ b/sdk/lib/_internal/pub/lib/src/exceptions.dart
@@ -51,12 +51,25 @@
 /// A class for command usage exceptions.
 class UsageException extends ApplicationException {
   /// The command usage information.
-  final String usage;
+  String _usage;
 
-  UsageException(String message, this.usage)
+  UsageException(String message)
       : super(message);
 
-  String toString() => "$message\n\n$usage";
+  String toString() {
+    if (_usage == null) return message;
+    return "$message\n\n$_usage";
+  }
+
+  /// Attach usage information to the exception.
+  ///
+  /// This is done after the exception is created so that code outside of the
+  /// command can still generate usage errors.
+  void bindUsage(String usage) {
+    // Only bind if not already bound.
+    if (_usage != null) return;
+    _usage = usage;
+  }
 }
 
 /// A class for errors in a command's input data.
diff --git a/sdk/lib/_internal/pub/lib/src/executable.dart b/sdk/lib/_internal/pub/lib/src/executable.dart
new file mode 100644
index 0000000..ab63765
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/executable.dart
@@ -0,0 +1,125 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.executable;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+import 'package:stack_trace/stack_trace.dart';
+
+import 'barback/asset_environment.dart';
+import 'barback/barback_server.dart';
+import 'entrypoint.dart';
+import 'exit_codes.dart' as exit_codes;
+import 'log.dart' as log;
+import 'utils.dart';
+
+/// Runs [executable] from [package] reachable from [entrypoint].
+///
+/// The executable string is a relative Dart file path using native path
+/// separators without a trailing ".dart" extension. It is contained within
+/// [package], which should either be the entrypoint package or an immediate
+/// dependency of it.
+///
+/// Arguments from [args] will be passed to the spawned Dart application.
+///
+/// Returns the exit code of the spawned app.
+Future<int> runExecutable(Entrypoint entrypoint, String package,
+    String executable, Iterable<String> args) {
+  // If the command has a path separator, then it's a path relative to the
+  // root of the package. Otherwise, it's implicitly understood to be in
+  // "bin".
+  var rootDir = "bin";
+  var parts = p.split(executable);
+  if (parts.length > 1) {
+    if (package != entrypoint.root.name) {
+      usageError("Cannot run an executable in a subdirectory of a dependency.");
+    }
+
+    rootDir = parts.first;
+  } else {
+    executable = p.join("bin", executable);
+  }
+
+  // Unless the user overrides the verbosity, we want to filter out the
+  // normal pub output shown while loading the environment.
+  if (log.verbosity == log.Verbosity.NORMAL) {
+    log.verbosity = log.Verbosity.WARNING;
+  }
+
+  var environment;
+  return AssetEnvironment.create(entrypoint, BarbackMode.RELEASE,
+      WatcherType.NONE, useDart2JS: false).then((_environment) {
+    environment = _environment;
+
+    environment.barback.errors.listen((error) {
+      log.error(log.red("Build error:\n$error"));
+    });
+
+    if (package == entrypoint.root.name) {
+      // Serve the entire root-most directory containing the entrypoint. That
+      // ensures that, for example, things like `import '../../utils.dart';`
+      // will work from within some deeply nested script.
+      return environment.serveDirectory(rootDir);
+    }
+
+    // Make sure the dependency exists.
+    var dep = entrypoint.root.immediateDependencies.firstWhere(
+        (dep) => dep.name == package, orElse: () => null);
+    if (dep == null) {
+      if (environment.graph.packages.containsKey(package)) {
+        dataError('Package "$package" is not an immediate dependency.\n'
+            'Cannot run executables in transitive dependencies.');
+      } else {
+        dataError('Could not find package "$package". Did you forget to '
+            'add a dependency?');
+      }
+    }
+
+    // For other packages, always use the "bin" directory.
+    return environment.servePackageBinDirectory(package);
+  }).then((server) {
+    // Try to make sure the entrypoint script exists (or is generated) before
+    // we spawn the process to run it.
+    var assetPath = "${p.url.joinAll(p.split(executable))}.dart";
+    var id = new AssetId(server.package, assetPath);
+    return environment.barback.getAssetById(id).then((_) {
+      var vmArgs = [];
+
+      // Run in checked mode.
+      // TODO(rnystrom): Make this configurable.
+      vmArgs.add("--checked");
+
+      // Get the URL of the executable, relative to the server's root directory.
+      var relativePath = p.url.relative(assetPath,
+          from: p.url.joinAll(p.split(server.rootDirectory)));
+      vmArgs.add(server.url.resolve(relativePath).toString());
+      vmArgs.addAll(args);
+
+      return Process.start(Platform.executable, vmArgs).then((process) {
+        // Note: we're not using process.std___.pipe(std___) here because
+        // that prevents pub from also writing to the output streams.
+        process.stderr.listen(stderr.add);
+        process.stdout.listen(stdout.add);
+        stdin.listen(process.stdin.add);
+
+        return process.exitCode;
+      });
+    }).catchError((error, stackTrace) {
+      if (error is! AssetNotFoundException) throw error;
+
+      var message = "Could not find ${log.bold(executable + ".dart")}";
+      if (package != entrypoint.root.name) {
+        message += " in package ${log.bold(server.package)}";
+      }
+
+      log.error("$message.");
+      log.fine(new Chain.forTrace(stackTrace));
+      return exit_codes.NO_INPUT;
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/lib/src/global_packages.dart b/sdk/lib/_internal/pub/lib/src/global_packages.dart
index eb4864f..3798146 100644
--- a/sdk/lib/_internal/pub/lib/src/global_packages.dart
+++ b/sdk/lib/_internal/pub/lib/src/global_packages.dart
@@ -10,6 +10,7 @@
 
 import 'package:path/path.dart' as p;
 
+import 'entrypoint.dart';
 import 'io.dart';
 import 'lock_file.dart';
 import 'log.dart' as log;
@@ -50,13 +51,11 @@
   /// Finds the latest version of the hosted package with [name] that matches
   /// [constraint] and makes it the active global version.
   Future activate(String name, VersionConstraint constraint) {
-    var lockFilePath = p.join(_directory, name + ".lock");
-
     // See if we already have it activated.
     var lockFile;
     var currentVersion;
     try {
-      lockFile = new LockFile.load(lockFilePath, cache.sources);
+      lockFile = new LockFile.load(_getLockFilePath(name), cache.sources);
       currentVersion = lockFile.packages[name].version;
 
       // Pull the root package out of the lock file so the solver doesn't see
@@ -66,7 +65,7 @@
       log.message("Package ${log.bold(name)} is already active at "
           "version ${log.bold(currentVersion)}.");
     } on IOException catch (error) {
-      // If we couldn't read the lock and version file, it's not activated.
+      // If we couldn't read the lock file, it's not activated.
       lockFile = new LockFile.empty();
     }
 
@@ -98,7 +97,7 @@
       lockFile.packages[name] = id;
 
       ensureDir(_directory);
-      writeTextFile(lockFilePath,
+      writeTextFile(_getLockFilePath(name),
           lockFile.serialize(cache.rootDir, cache.sources));
 
       log.message("Activated ${log.bold(package.name)} ${package.version}.");
@@ -123,6 +122,35 @@
     }
   }
 
+  /// Finds the active packge with [name].
+  ///
+  /// Returns an [Entrypoint] loaded with the active package if found.
+  Future<Entrypoint> find(String name) {
+    var lockFile;
+    var version;
+    return syncFuture(() {
+      try {
+        lockFile = new LockFile.load(_getLockFilePath(name), cache.sources);
+        version = lockFile.packages[name].version;
+      } on IOException catch (error) {
+        // If we couldn't read the lock file, it's not activated.
+        dataError("No active package ${log.bold(name)}.");
+      }
+    }).then((_) {
+      // Load the package from the cache.
+      var id = new PackageId(name, _source.name, version, name);
+      return _source.getDirectory(id);
+    }).then((dir) {
+      return new Package.load(name, dir, cache.sources);
+    }).then((package) {
+      // Pull the root package out of the lock file so the solver doesn't see
+      // it.
+      lockFile.packages.remove(name);
+
+      return new Entrypoint.inMemory(package, lockFile, cache);
+    });
+  }
+
   /// Picks the best version of [package] to activate that meets [constraint].
   ///
   /// If [version] is not `null`, this tries to maintain that version if
@@ -149,4 +177,7 @@
       return versions.last;
     });
   }
+
+  /// Gets the path to the lock file for an activated package with [name].
+  String _getLockFilePath(name) => p.join(_directory, name + ".lock");
 }
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index b3d585d..68c0c74 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -845,6 +845,7 @@
 /// failed because of invalid input data.
 ///
 /// This will report the error and cause pub to exit with [exit_codes.DATA].
-void dataError(String message) {
-  throw new DataException(message);
-}
+void dataError(String message) => throw new DataException(message);
+
+/// Throw a [UsageException] for a usage error of a command with [message].
+void usageError(String message) => throw new UsageException(message);
diff --git a/sdk/lib/_internal/pub/lib/src/validator/dependency.dart b/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
index c341e33..ac66d32 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
@@ -75,10 +75,9 @@
 
   /// Warn that dependencies should have version constraints.
   void _warnAboutNoConstraint(PackageDep dep) {
-    var lockFile = entrypoint.loadLockFile();
     var message = 'Your dependency on "${dep.name}" should have a version '
         'constraint.';
-    var locked = lockFile.packages[dep.name];
+    var locked = entrypoint.lockFile.packages[dep.name];
     if (locked != null) {
       message = '$message For example:\n'
         '\n'
@@ -107,7 +106,7 @@
   /// Warn that dependencies should have lower bounds on their constraints.
   void _warnAboutNoConstraintLowerBound(PackageDep dep) {
     var message = 'Your dependency on "${dep.name}" should have a lower bound.';
-    var locked = entrypoint.loadLockFile().packages[dep.name];
+    var locked = entrypoint.lockFile.packages[dep.name];
     if (locked != null) {
       var constraint;
       if (locked.version == (dep.constraint as VersionRange).max) {
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index 4a1b1cc..f9df64b 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -4,9 +4,6 @@
 
 test/serve/web_socket/url_to_asset_id_test: Pass, Slow
 
-test/global/deactivate/unexpected_arguments_test: RuntimeError # Issue 19784
-test/global/deactivate/missing_package_arg_test: RuntimeError # Issue 19784
-
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart ]
 *: Skip
diff --git a/sdk/lib/_internal/pub/test/build/outputs_results_to_json_test.dart b/sdk/lib/_internal/pub/test/build/outputs_results_to_json_test.dart
index c641f18..0099f0d 100644
--- a/sdk/lib/_internal/pub/test/build/outputs_results_to_json_test.dart
+++ b/sdk/lib/_internal/pub/test/build/outputs_results_to_json_test.dart
@@ -45,6 +45,15 @@
               },
               'assetId': {'package': 'myapp', 'path': 'web/main.dart'},
               'message': contains(r'to compile myapp|web/main.dart.')
+            },
+            {
+              'level': 'Fine',
+              'transformer': {
+                'name': 'Dart2JS',
+                'primaryInput': {'package': 'myapp', 'path': 'web/main.dart'}
+              },
+              'assetId': {'package': 'myapp', 'path': 'web/main.dart'},
+              'message': contains(r'Took')
             }
           ]
         });
diff --git a/sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart b/sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart
index 397cb47..4bf175a 100644
--- a/sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart
@@ -18,6 +18,7 @@
           "\$dart2js": {
             "commandLineOptions": ["--enable-diagnostic-colors"],
             "checked": true,
+            "csp": true,
             "minify": true,
             "verbose": true,
             "environment": {"name": "value"},
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/missing_package_arg_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/missing_package_arg_test.dart
index 33a2a1b..8cf9fc3 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/missing_package_arg_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/missing_package_arg_test.dart
@@ -14,6 +14,8 @@
 
             Usage: pub global deactivate <package>
             -h, --help    Print usage information for this command.
+
+            Run "pub help" to see global options.
             """,
         exitCode: exit_codes.USAGE);
   });
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/unexpected_arguments_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/unexpected_arguments_test.dart
index 9057ebf..a2563b5 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/unexpected_arguments_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/unexpected_arguments_test.dart
@@ -14,6 +14,8 @@
 
             Usage: pub global deactivate <package>
             -h, --help    Print usage information for this command.
+
+            Run "pub help" to see global options.
             """,
         exitCode: exit_codes.USAGE);
   });
diff --git a/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart b/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
new file mode 100644
index 0000000..791b099
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('fails if no executable was given', () {
+    schedulePub(args: ["global", "run", "pkg"],
+        error: """
+            Must specify an executable to run.
+
+            Usage: pub global run <package> <executable> [args...]
+            -h, --help    Print usage information for this command.
+
+            Run "pub help" to see global options.
+            """,
+        exitCode: exit_codes.USAGE);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/run/missing_package_arg_test.dart b/sdk/lib/_internal/pub/test/global/run/missing_package_arg_test.dart
new file mode 100644
index 0000000..dac0523
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/run/missing_package_arg_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('fails if no package was given', () {
+    schedulePub(args: ["global", "run"],
+        error: """
+            Must specify a package and executable to run.
+
+            Usage: pub global run <package> <executable> [args...]
+            -h, --help    Print usage information for this command.
+
+            Run "pub help" to see global options.
+            """,
+        exitCode: exit_codes.USAGE);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart b/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart
new file mode 100644
index 0000000..714b222
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as p;
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('errors if the script does not exist.', () {
+    servePackages([packageMap("foo", "1.0.0")]);
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    var pub = pubRun(global: true, args: ["foo", "script"]);
+    pub.stderr.expect("Could not find ${p.join("bin", "script.dart")}.");
+    pub.shouldExit(exit_codes.NO_INPUT);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart b/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart
new file mode 100644
index 0000000..217758f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('runs a script in an activated package', () {
+    servePackages([
+      packageMap("foo", "1.0.0")
+    ], contents: [
+      d.dir("bin", [
+        d.file("script.dart", "main(args) => print('ok');")
+      ])
+    ]);
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    var pub = pubRun(global: true, args: ["foo", "script"]);
+    pub.stdout.expect("ok");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/run/runs_transformer_test.dart b/sdk/lib/_internal/pub/test/global/run/runs_transformer_test.dart
new file mode 100644
index 0000000..79a181c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/run/runs_transformer_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class DartTransformer extends Transformer {
+  DartTransformer.asPlugin();
+
+  String get allowedExtensions => '.in';
+
+  void apply(Transform transform) {
+    transform.addOutput(new Asset.fromString(
+        new AssetId("foo", "bin/script.dart"),
+        "void main() => print('generated');"));
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('runs a global script generated by a transformer', () {
+      makeGlobalPackage("foo", "1.0.0", [
+        d.pubspec({
+          "name": "foo",
+          "version": "1.0.0",
+          "transformers": ["foo/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", TRANSFORMER),
+          d.file("primary.in", "")
+        ])])
+      ], pkg: ['barback']);
+
+      var pub = pubRun(global: true, args: ["foo", "script"]);
+
+      pub.stdout.expect("generated");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart b/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart
new file mode 100644
index 0000000..4787812
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('errors if the package is not activated', () {
+    servePackages([]);
+
+    schedulePub(args: ["global", "run", "foo", "bar"],
+        error: startsWith("No active package foo."),
+        exitCode: exit_codes.DATA);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/app_can_read_from_stdin_test.dart b/sdk/lib/_internal/pub/test/run/app_can_read_from_stdin_test.dart
index 3dbb7031..3a31604 100644
--- a/sdk/lib/_internal/pub/test/run/app_can_read_from_stdin_test.dart
+++ b/sdk/lib/_internal/pub/test/run/app_can_read_from_stdin_test.dart
@@ -4,12 +4,12 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 const SCRIPT = """
 import 'dart:io';
 
 main() {
+  print("started");
   var line1 = stdin.readLineSync();
   print("between");
   var line2 = stdin.readLineSync();
@@ -30,6 +30,7 @@
 
     var pub = pubRun(args: ["script"]);
 
+    pub.stdout.expect("started");
     pub.writeLine("first");
     pub.stdout.expect("between");
     pub.writeLine("second");
diff --git a/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart b/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart
index d47b950..1b3fd2a 100644
--- a/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart
+++ b/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart
@@ -6,7 +6,6 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 const SCRIPT = """
 import "package:myapp/lib.dart";
@@ -69,8 +68,7 @@
 
       createLockFile('myapp', pkg: ['barback']);
 
-      var pub = pubRun(args: ["script"],
-          transformers: ["myapp/src/transformer"]);
+      var pub = pubRun(args: ["script"]);
 
       // Note that the info log is only displayed here because the test
       // harness runs pub in verbose mode. By default, only the warning would
diff --git a/sdk/lib/_internal/pub/test/run/does_not_run_on_transformer_error_test.dart b/sdk/lib/_internal/pub/test/run/does_not_run_on_transformer_error_test.dart
index 8634e1e..3ae0a1e 100644
--- a/sdk/lib/_internal/pub/test/run/does_not_run_on_transformer_error_test.dart
+++ b/sdk/lib/_internal/pub/test/run/does_not_run_on_transformer_error_test.dart
@@ -4,7 +4,6 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 const SCRIPT = """
 main() {
@@ -51,8 +50,7 @@
 
       createLockFile('myapp', pkg: ['barback']);
 
-      var pub = pubRun(args: ["script"],
-          transformers: ["myapp/src/transformer"]);
+      var pub = pubRun(args: ["script"]);
 
       pub.stderr.expect("[Error from Failing]:");
       pub.stderr.expect("myapp|bin/script.dart.");
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_only_transitive_dependency_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_only_transitive_dependency_test.dart
index ca9493f..c644b53 100644
--- a/sdk/lib/_internal/pub/test/run/errors_if_only_transitive_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/run/errors_if_only_transitive_dependency_test.dart
@@ -5,7 +5,6 @@
 import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
index 44de5f4..fcb2093 100644
--- a/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
@@ -22,7 +22,7 @@
 
     schedulePub(args: ["run", "foo:sub/dir"],
         error: """
-Can not run an executable in a subdirectory of a dependency.
+Cannot run an executable in a subdirectory of a dependency.
 
 Usage: pub run <executable> [args...]
 -h, --help    Print usage information for this command.
diff --git a/sdk/lib/_internal/pub/test/run/includes_parent_directories_of_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/includes_parent_directories_of_entrypoint_test.dart
index f938d30..8169689 100644
--- a/sdk/lib/_internal/pub/test/run/includes_parent_directories_of_entrypoint_test.dart
+++ b/sdk/lib/_internal/pub/test/run/includes_parent_directories_of_entrypoint_test.dart
@@ -6,7 +6,6 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 const SCRIPT = r"""
 import '../../a.dart';
diff --git a/sdk/lib/_internal/pub/test/run/nonexistent_dependency_test.dart b/sdk/lib/_internal/pub/test/run/nonexistent_dependency_test.dart
index 10eb68b..4ecb666 100644
--- a/sdk/lib/_internal/pub/test/run/nonexistent_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/run/nonexistent_dependency_test.dart
@@ -5,7 +5,6 @@
 import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/run/nonexistent_script_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/nonexistent_script_in_dependency_test.dart
index 8379a86..88fdfc0 100644
--- a/sdk/lib/_internal/pub/test/run/nonexistent_script_in_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/run/nonexistent_script_in_dependency_test.dart
@@ -7,7 +7,6 @@
 import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/run/nonexistent_script_test.dart b/sdk/lib/_internal/pub/test/run/nonexistent_script_test.dart
index 03e9d9d..ce385fc 100644
--- a/sdk/lib/_internal/pub/test/run/nonexistent_script_test.dart
+++ b/sdk/lib/_internal/pub/test/run/nonexistent_script_test.dart
@@ -7,7 +7,6 @@
 import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/run/passes_along_arguments_test.dart b/sdk/lib/_internal/pub/test/run/passes_along_arguments_test.dart
index 888319e..711d64b 100644
--- a/sdk/lib/_internal/pub/test/run/passes_along_arguments_test.dart
+++ b/sdk/lib/_internal/pub/test/run/passes_along_arguments_test.dart
@@ -4,7 +4,6 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 const SCRIPT = """
 main(List<String> args) {
diff --git a/sdk/lib/_internal/pub/test/run/runs_a_generated_script_test.dart b/sdk/lib/_internal/pub/test/run/runs_a_generated_script_test.dart
index daedf25..cd29aa7 100644
--- a/sdk/lib/_internal/pub/test/run/runs_a_generated_script_test.dart
+++ b/sdk/lib/_internal/pub/test/run/runs_a_generated_script_test.dart
@@ -4,7 +4,6 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 const TRANSFORMER = """
 import 'dart:async';
@@ -41,8 +40,7 @@
 
       createLockFile('myapp', pkg: ['barback']);
 
-      var pub = pubRun(args: ["script"],
-          transformers: ["myapp/src/transformer"]);
+      var pub = pubRun(args: ["script"]);
 
       pub.stdout.expect("generated");
       pub.shouldExit();
diff --git a/sdk/lib/_internal/pub/test/run/runs_app_in_directory_in_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/runs_app_in_directory_in_entrypoint_test.dart
index 9eea7b6..b742c6a 100644
--- a/sdk/lib/_internal/pub/test/run/runs_app_in_directory_in_entrypoint_test.dart
+++ b/sdk/lib/_internal/pub/test/run/runs_app_in_directory_in_entrypoint_test.dart
@@ -6,7 +6,6 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/run/runs_app_in_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/runs_app_in_entrypoint_test.dart
index f9a0209..e3cb233 100644
--- a/sdk/lib/_internal/pub/test/run/runs_app_in_entrypoint_test.dart
+++ b/sdk/lib/_internal/pub/test/run/runs_app_in_entrypoint_test.dart
@@ -4,7 +4,6 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 const SCRIPT = """
 import 'dart:io';
diff --git a/sdk/lib/_internal/pub/test/run/runs_named_app_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dependency_test.dart
index d8b3425..3ccfa90 100644
--- a/sdk/lib/_internal/pub/test/run/runs_named_app_in_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dependency_test.dart
@@ -4,7 +4,6 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/run/runs_named_app_in_dev_dependency_test.dart b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dev_dependency_test.dart
index 65c75b9..6c3c1e7 100644
--- a/sdk/lib/_internal/pub/test/run/runs_named_app_in_dev_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dev_dependency_test.dart
@@ -4,7 +4,6 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/run/runs_transformer_in_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/runs_transformer_in_entrypoint_test.dart
index d777d61..07df36f 100644
--- a/sdk/lib/_internal/pub/test/run/runs_transformer_in_entrypoint_test.dart
+++ b/sdk/lib/_internal/pub/test/run/runs_transformer_in_entrypoint_test.dart
@@ -5,7 +5,6 @@
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import '../serve/utils.dart';
-import 'utils.dart';
 
 const SCRIPT = """
 const TOKEN = "hi";
@@ -33,8 +32,7 @@
 
       createLockFile('myapp', pkg: ['barback']);
 
-      var pub = pubRun(args: ["hi"],
-          transformers: ["myapp/src/transformer"]);
+      var pub = pubRun(args: ["hi"]);
 
       pub.stdout.expect("(hi, transformed)");
       pub.shouldExit();
diff --git a/sdk/lib/_internal/pub/test/run/utils.dart b/sdk/lib/_internal/pub/test/run/utils.dart
deleted file mode 100644
index 6535b33..0000000
--- a/sdk/lib/_internal/pub/test/run/utils.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:scheduled_test/scheduled_process.dart';
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../test_pub.dart';
-
-/// Schedules starting the "pub run" process and validates the expected startup
-/// output.
-///
-/// if [transformers] is given, it should contain a list of transformer IDs
-/// (like "myapp/src/transformer") and this will validate that the output for
-/// loading those is shown.
-///
-/// Returns the `pub run` process.
-ScheduledProcess pubRun({Iterable<String> args,
-  Iterable<String> transformers}) {
-  var pub = startPub(args: ["run"]..addAll(args));
-
-  // This isn't normally printed, but the pub test infrastructure runs pub in
-  // verbose mode, which enables this.
-  pub.stdout.expect(startsWith("Loading source assets"));
-
-  if (transformers != null) {
-    for (var transformer in transformers) {
-      pub.stdout.expect(startsWith("Loading $transformer transformers"));
-    }
-  }
-  return pub;
-}
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 1f7d94c..0650075 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -225,7 +225,11 @@
 /// If [replace] is false, subsequent calls to [servePackages] will add to the
 /// set of packages that are being served. Previous packages will continue to be
 /// served. Otherwise, the previous packages will no longer be served.
-void servePackages(List<Map> pubspecs, {bool replace: false}) {
+///
+/// If [contents] is given, its contents are added to every served
+/// package.
+void servePackages(List<Map> pubspecs, {bool replace: false,
+    Iterable<d.Descriptor> contents}) {
   if (_servedPackages == null || _servedPackageDir == null) {
     _servedPackages = <String, List<Map>>{};
     _servedApiPackageDir = d.dir('packages', []);
@@ -246,11 +250,11 @@
     return awaitObject(pubspecs).then((resolvedPubspecs) {
       if (replace) _servedPackages.clear();
 
-      for (var spec in resolvedPubspecs) {
-        var name = spec['name'];
-        var version = spec['version'];
+      for (var pubspec in resolvedPubspecs) {
+        var name = pubspec['name'];
+        var version = pubspec['version'];
         var versions = _servedPackages.putIfAbsent(name, () => []);
-        versions.add(spec);
+        versions.add(pubspec);
       }
 
       _servedApiPackageDir.contents.clear();
@@ -273,10 +277,17 @@
         _servedPackageDir.contents.add(d.dir(name, [
           d.dir('versions', _servedPackages[name].map((pubspec) {
             var version = pubspec['version'];
-            return d.tar('$version.tar.gz', [
-              d.file('pubspec.yaml', JSON.encode(pubspec)),
-              d.libDir(name, '$name $version')
-            ]);
+
+            var archiveContents = [
+                d.file('pubspec.yaml', JSON.encode(pubspec)),
+                d.libDir(name, '$name $version')
+            ];
+
+            if (contents != null) {
+              archiveContents.addAll(contents);
+            }
+
+            return d.tar('$version.tar.gz', archiveContents);
           }))
         ]));
       }
@@ -377,6 +388,25 @@
       warning: warning, exitCode: exitCode);
 }
 
+/// Schedules starting the "pub [global] run" process and validates the
+/// expected startup output.
+///
+/// If [global] is `true`, this invokes "pub global run", otherwise it does
+/// "pub run".
+///
+/// Returns the `pub run` process.
+ScheduledProcess pubRun({bool global: false, Iterable<String> args}) {
+  var pubArgs = global ? ["global", "run"] : ["run"];
+  pubArgs.addAll(args);
+  var pub = startPub(args: pubArgs);
+
+  // Loading sources and transformers isn't normally printed, but the pub test
+  // infrastructure runs pub in verbose mode, which enables this.
+  pub.stdout.expect(consumeWhile(startsWith("Loading")));
+
+  return pub;
+}
+
 /// Defines an integration test.
 ///
 /// The [body] should schedule a series of operations which will be run
@@ -670,6 +700,42 @@
   }
 }
 
+/// Schedules activating a global package [package] without running
+/// "pub global activate".
+///
+/// This is useful because global packages must be hosted, but the test hosted
+/// server doesn't serve barback. The other parameters here follow
+/// [createLockFile].
+void makeGlobalPackage(String package, String version,
+    Iterable<d.Descriptor> contents, {Iterable<String> pkg,
+    Map<String, String> hosted}) {
+  // Start the server so we know what port to use in the cache directory name.
+  servePackages([]);
+
+  // Create the package in the hosted cache.
+  d.hostedCache([
+    d.dir("$package-$version", contents)
+  ]).create();
+
+  var lockFile = _createLockFile(pkg: pkg, hosted: hosted);
+
+  // Add the root package to the lockfile.
+  var id = new PackageId(package, "hosted", new Version.parse(version),
+      package);
+  lockFile.packages[package] = id;
+
+  // Write the lockfile to the global cache.
+  var sources = new SourceRegistry();
+  sources.register(new HostedSource());
+  sources.register(new PathSource());
+
+  d.dir(cachePath, [
+    d.dir("global_packages", [
+      d.file("$package.lock", lockFile.serialize(null, sources))
+    ])
+  ]).create();
+}
+
 /// Creates a lock file for [package] without running `pub get`.
 ///
 /// [sandbox] is a list of path dependencies to be found in the sandbox
@@ -681,6 +747,27 @@
 /// hosted packages.
 void createLockFile(String package, {Iterable<String> sandbox,
     Iterable<String> pkg, Map<String, String> hosted}) {
+  var lockFile = _createLockFile(sandbox: sandbox, pkg: pkg, hosted: hosted);
+
+  var sources = new SourceRegistry();
+  sources.register(new HostedSource());
+  sources.register(new PathSource());
+
+  d.file(path.join(package, 'pubspec.lock'),
+      lockFile.serialize(null, sources)).create();
+}
+
+/// Creates a lock file for [package] without running `pub get`.
+///
+/// [sandbox] is a list of path dependencies to be found in the sandbox
+/// directory. [pkg] is a list of packages in the Dart repo's "pkg" directory;
+/// each package listed here and all its dependencies will be linked to the
+/// version in the Dart repo.
+///
+/// [hosted] is a list of package names to version strings for dependencies on
+/// hosted packages.
+LockFile _createLockFile({Iterable<String> sandbox,
+Iterable<String> pkg, Map<String, String> hosted}) {
   var dependencies = {};
 
   if (sandbox != null) {
@@ -732,12 +819,7 @@
     });
   }
 
-  var sources = new SourceRegistry();
-  sources.register(new HostedSource());
-  sources.register(new PathSource());
-
-  d.file(path.join(package, 'pubspec.lock'),
-      lockFile.serialize(null, sources)).create();
+  return lockFile;
 }
 
 /// Uses [client] as the mock HTTP client for this test.
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index e4cb604..2fcf01a 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -12293,10 +12293,10 @@
  *
  * Custom events can be declared as:
  *
- *    class DataGenerator {
- *      static EventStreamProvider<Event> dataEvent =
- *          new EventStreamProvider('data');
- *    }
+ *     class DataGenerator {
+ *       static EventStreamProvider<Event> dataEvent =
+ *           new EventStreamProvider('data');
+ *     }
  *
  * Then listeners should access the event with:
  *
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 839930e..cc653f7 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -12526,10 +12526,10 @@
  *
  * Custom events can be declared as:
  *
- *    class DataGenerator {
- *      static EventStreamProvider<Event> dataEvent =
- *          new EventStreamProvider('data');
- *    }
+ *     class DataGenerator {
+ *       static EventStreamProvider<Event> dataEvent =
+ *           new EventStreamProvider('data');
+ *     }
  *
  * Then listeners should access the event with:
  *
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index d838dc5..2d41870 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -13,7 +13,6 @@
 part 'iterable.dart';
 part 'list.dart';
 part 'lists.dart';
-part 'lru.dart';
 part 'print.dart';
 part 'sort.dart';
 part 'symbol.dart';
diff --git a/sdk/lib/internal/internal_sources.gypi b/sdk/lib/internal/internal_sources.gypi
index acdf220..17cc287 100644
--- a/sdk/lib/internal/internal_sources.gypi
+++ b/sdk/lib/internal/internal_sources.gypi
@@ -10,7 +10,6 @@
     'iterable.dart',
     'list.dart',
     'lists.dart',
-    'lru.dart',
     'print.dart',
     'sort.dart',
     'symbol.dart',
diff --git a/sdk/lib/internal/lru.dart b/sdk/lib/internal/lru.dart
deleted file mode 100644
index 8f8a64a..0000000
--- a/sdk/lib/internal/lru.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart._internal;
-
-class LRUAssociation<K,V> {
-  K key;
-  V value;
-  LRUAssociation previous;
-  LRUAssociation next;
-
-  void insertBetween(before, after) {
-    after.previous = this;
-    before.next = this;
-    this.next = after;
-    this.previous = before;
-  }
-
-  void remove() {
-    var after = next;
-    var before = previous;
-    after.previous = before;
-    before.next = after;
-  }
-}
-
-/**
- * A map with a fixed capacity that evicts associations when capacity is reached
- * on a least-recently-used basis. Implemented as an open addressing hash table
- * with doubly-linked entries forming the LRU queue.
- */
-class LRUMap<K,V> {
-  final LRUAssociation<K,V> _head;
-  final List _table;
-  final int _mask;
-  final int _capacity;  // Max number of associations before we start evicting.
-  int _size = 0;  // Current number of associations.
-
-  /**
-   * Create an LRUMap whose capacity is 75% of 2^shift.
-   */
-  LRUMap.withShift(int shift)
-      : this._mask = (1 << shift) - 1
-      , this._capacity = (1 << shift) * 3 ~/ 4
-      , this._table = new List(1 << shift)
-      , this._head = new LRUAssociation() {
-    // The scheme used here for handling collisions relies on there always
-    // being at least one empty slot.
-    if (shift < 1) throw new Exception("LRUMap requires a shift >= 1");
-    assert(_table.length > _capacity);
-    _head.insertBetween(_head, _head);
-  }
-
-  int _scanFor(K key) {
-    var start = key.hashCode & _mask;
-    var index = start;
-    do {
-      var assoc = _table[index];
-      if (null == assoc || assoc.key == key) {
-        return index;
-      }
-      index = (index + 1) & _mask;
-    } while (index != start);
-    // Should never happen because we start evicting associations before the
-    // table is full.
-    throw new Exception("Internal error: LRUMap table full");
-  }
-
-  void _fixCollisionsAfter(start) {
-    var assoc;
-    var index = (start + 1) & _mask;
-    while (null != (assoc = _table[index])) {
-      var newIndex = _scanFor(assoc.key);
-      if (newIndex != index) {
-        assert(_table[newIndex] == null);
-        _table[newIndex] = assoc;
-        _table[index] = null;
-      }
-      index = (index + 1) & _mask;
-    }
-  }
-
-  operator []=(K key, V value) {
-    int index = _scanFor(key);
-    var assoc = _table[index];
-    if (null != assoc) {
-      // Existing key, replace value.
-      assert(assoc.key == key);
-      assoc.value = value;
-      assoc.remove();
-      assoc.insertBetween(_head, _head.next);
-    } else {
-      // New key.
-      var newAssoc;
-      if (_size == _capacity) {
-        // Knock out the oldest association.
-        var lru = _head.previous;
-        lru.remove();
-        index = _scanFor(lru.key);
-        _table[index] = null;
-        _fixCollisionsAfter(index);
-        index = _scanFor(key);
-        newAssoc = lru;  // Recycle the association.
-      } else {
-        newAssoc = new LRUAssociation();
-        _size++;
-      }
-      newAssoc.key = key;
-      newAssoc.value = value;
-      newAssoc.insertBetween(_head, _head.next);
-      _table[index] = newAssoc;
-    }
-  }
-
-  V operator [](K key) {
-    var index = _scanFor(key);
-    var assoc = _table[index];
-    if (null == assoc) return null;
-    // Move to front of LRU queue.
-    assoc.remove();
-    assoc.insertBetween(_head, _head.next);
-    return assoc.value;
-  }
-}
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index b995137b..896b1e4 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -1237,6 +1237,34 @@
   int maxConnectionsPerHost;
 
   /**
+   * Get and set whether the body of a response will be automatically
+   * uncompressed.
+   *
+   * The body of an HTTP response can be compressed. In most
+   * situations providing the un-compressed body is most
+   * convenient. Therefore the default behavior is to un-compress the
+   * body. However in some situations (e.g. implementing a transparent
+   * proxy) keeping the uncompressed stream is required.
+   *
+   * NOTE: Headers in from the response is never modified. This means
+   * that when automatic un-compression is turned on the value of the
+   * header `Content-Length` will reflect the length of the original
+   * compressed body. Likewise the header `Content-Encoding` will also
+   * have the original value indicating compression.
+   *
+   * NOTE: Automatic un-compression is only performed if the
+   * `Content-Encoding` header value is `gzip`.
+   *
+   * This value affects all responses produced by this client after the
+   * value is changed.
+   *
+   * To disable, set to `false`.
+   *
+   * Default is `true`.
+   */
+  bool autoUncompress;
+
+  /**
    * Set and get the default value of the `User-Agent` header for all requests
    * generated by this [HttpClient]. The default value is
    * `Dart/<version> (dart:io)`.
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart
index 5e94813..f621fff 100644
--- a/sdk/lib/io/http_headers.dart
+++ b/sdk/lib/io/http_headers.dart
@@ -42,27 +42,31 @@
 
   void add(String name, value) {
     _checkMutable();
-    _addAll(name.toLowerCase(), value);
+    _addAll(_validateField(name), value);
   }
 
   void _addAll(String name, value) {
-    if (value is List) {
-      value.forEach((v) => _add(name, v));
+    assert(name == _validateField(name));
+    if (value is Iterable) {
+      for (var v in value) {
+        _add(name, _validateValue(v));
+      }
     } else {
-      _add(name, value);
+      _add(name, _validateValue(value));
     }
   }
 
   void set(String name, Object value) {
     _checkMutable();
-    name = name.toLowerCase();
+    name = _validateField(name);
     _headers.remove(name);
     _addAll(name, value);
   }
 
   void remove(String name, Object value) {
     _checkMutable();
-    name = name.toLowerCase();
+    name = _validateField(name);
+    value = _validateValue(value);
     List<String> values = _headers[name];
     if (values != null) {
       int index = values.indexOf(value);
@@ -75,7 +79,7 @@
 
   void removeAll(String name) {
     _checkMutable();
-    name = name.toLowerCase();
+    name = _validateField(name);
     _headers.remove(name);
   }
 
@@ -250,7 +254,7 @@
 
   // [name] must be a lower-case version of the name.
   void _add(String name, value) {
-    assert(name == name.toLowerCase());
+    assert(name == _validateField(name));
     // Use the length as index on what method to call. This is notable
     // faster than computing hash and looking up in a hash-map.
     switch (name.length) {
@@ -399,13 +403,15 @@
     }
     if (value is DateTime) {
       values.add(HttpDate.format(value));
+    } else if (value is String) {
+      values.add(value);
     } else {
-      values.add(value.toString());
+      values.add(_validateValue(value.toString()));
     }
   }
 
   void _set(String name, String value) {
-    assert(name == name.toLowerCase());
+    assert(name == _validateField(name));
     List<String> values = new List<String>();
     _headers[name] = values;
     values.add(value);
@@ -562,6 +568,27 @@
     }
     return cookies;
   }
+
+  static String _validateField(String field) {
+    for (var i = 0; i < field.length; i++) {
+      if (!_HttpParser._isTokenChar(field.codeUnitAt(i))) {
+        throw new FormatException(
+            "Invalid HTTP header field name: ${JSON.encode(field)}");
+      }
+    }
+    return field.toLowerCase();
+  }
+
+  static _validateValue(value) {
+    if (value is! String) return value;
+    for (var i = 0; i < value.length; i++) {
+      if (!_HttpParser._isValueChar(value.codeUnitAt(i))) {
+        throw new FormatException(
+            "Invalid HTTP header field value: ${JSON.encode(value)}");
+      }
+    }
+    return value;
+  }
 }
 
 
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index b0a1d8f..7b80d6a 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -270,7 +270,8 @@
       return new Stream.fromIterable([]).listen(null, onDone: onDone);
     }
     var stream = _incoming;
-    if (headers.value(HttpHeaders.CONTENT_ENCODING) == "gzip") {
+    if (_httpClient.autoUncompress &&
+        headers.value(HttpHeaders.CONTENT_ENCODING) == "gzip") {
       stream = stream.transform(GZIP.decoder);
     }
     return stream.listen(onData,
@@ -1650,6 +1651,8 @@
 
   int maxConnectionsPerHost;
 
+  bool autoUncompress = true;
+
   String userAgent = _getHttpVersion();
 
   void set idleTimeout(Duration timeout) {
diff --git a/sdk/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart
index 258bfc6..d941aa4 100644
--- a/sdk/lib/io/http_parser.dart
+++ b/sdk/lib/io/http_parser.dart
@@ -912,10 +912,15 @@
     _index = null;
   }
 
-  bool _isTokenChar(int byte) {
+  static bool _isTokenChar(int byte) {
     return byte > 31 && byte < 128 && !_Const.SEPARATOR_MAP[byte];
   }
 
+  static bool _isValueChar(int byte) {
+    return (byte > 31 && byte < 128) || (byte == _CharCode.SP) ||
+        (byte == _CharCode.HT);
+  }
+
   static List<String> _tokenizeFieldValue(String headerValue) {
     List<String> tokens = new List<String>();
     int start = 0;
diff --git a/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart b/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart
index c9c0257..7738754 100644
--- a/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart
+++ b/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart
@@ -40,6 +40,52 @@
   final int lengthInBytes;
 
   Type get runtimeType => ByteBuffer;
+
+  Uint8List asUint8List([int offsetInBytes = 0, int length]) {
+    return new NativeUint8List.view(this, offsetInBytes, length);
+  }
+  Int8List asInt8List([int offsetInBytes = 0, int length]) {
+    return new NativeInt8List.view(this, offsetInBytes, length);
+  }
+  Uint8ClampedList asUint8ClampedList([int offsetInBytes = 0, int length]) {
+    return new NativeUint8ClampedList.view(this, offsetInBytes, length);
+  }
+  Uint16List asUint16List([int offsetInBytes = 0, int length]) {
+    return new NativeUint16List.view(this, offsetInBytes, length);
+  }
+  Int16List asInt16List([int offsetInBytes = 0, int length]) {
+    return new NativeInt16List.view(this, offsetInBytes, length);
+  }
+  Uint32List asUint32List([int offsetInBytes = 0, int length]) {
+    return new NativeUint32List.view(this, offsetInBytes, length);
+  }
+  Int32List asInt32List([int offsetInBytes = 0, int length]) {
+    return new NativeInt32List.view(this, offsetInBytes, length);
+  }
+  Uint64List asUint64List([int offsetInBytes = 0, int length]) {
+    throw new UnsupportedError("Uint64List not supported by dart2js.");
+  }
+  Int64List asInt64List([int offsetInBytes = 0, int length]) {
+    throw new UnsupportedError("Int64List not supported by dart2js.");
+  }
+  Int32x4List asInt32x4List([int offsetInBytes = 0, int length]) {
+    throw new UnimplementedError();
+  }
+  Float32List asFloat32List([int offsetInBytes = 0, int length]) {
+    return new NativeFloat32List.view(this, offsetInBytes, length);
+  }
+  Float64List asFloat64List([int offsetInBytes = 0, int length]) {
+    return new NativeFloat64List.view(this, offsetInBytes, length);
+  }
+  Float32x4List asFloat32x4List([int offsetInBytes = 0, int length]) {
+    throw new UnimplementedError();
+  }
+  Float64x2List asFloat64x2List([int offsetInBytes = 0, int length]) {
+    throw new UnimplementedError();
+  }
+  ByteData asByteData([int offsetInBytes = 0, int length]) {
+    return new NativeByteData.view(this, offsetInBytes, length);
+  }
 }
 
 class NativeTypedData implements TypedData native "ArrayBufferView" {
diff --git a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
index a2764d7..2c104de 100644
--- a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
+++ b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
@@ -24,6 +24,67 @@
  */
 abstract class ByteBuffer {
   int get lengthInBytes;
+
+  /**
+   * Creates a new [Uint8List] view of this buffer.
+   */
+  Uint8List asUint8List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Int8List] view of this buffer.
+   */
+  Int8List asInt8List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Uint8Clamped] view of this buffer.
+   */
+  Uint8ClampedList asUint8ClampedList([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Uint16List] view of this buffer.
+   */
+  Uint16List asUint16List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Int16List] view of this buffer.
+   */
+  Int16List asInt16List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Uint32List] view of this buffer.
+   */
+  Uint32List asUint32List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Int32List] view of this buffer.
+   */
+  Int32List asInt32List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Uint64List] view of this buffer.
+   */
+  Uint64List asUint64List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Int64List] view of this buffer.
+   */
+  Int64List asInt64List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Int32x4List] view of this buffer.
+   */
+  Int32x4List asInt32x4List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Float32List] view of this buffer.
+   */
+  Float32List asFloat32List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Float64List] view of this buffer.
+   */
+  Float64List asFloat64List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Float32x4List] view of this buffer.
+   */
+  Float32x4List asFloat32x4List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Float64x2List] view of this buffer.
+   */
+  Float64x2List asFloat64x2List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [ByteData] view of this buffer.
+   */
+  ByteData asByteData([int offsetInBytes = 0, int length]);
 }
 
 
@@ -94,7 +155,7 @@
    */
   factory ByteData.view(ByteBuffer buffer,
                         [int offsetInBytes = 0, int length]) =>
-      new NativeByteData.view(buffer, offsetInBytes, length);
+      buffer.asByteData(offsetInBytes, length);
 
   int get elementSizeInBytes => 1;
 
@@ -371,7 +432,7 @@
    */
   factory Float32List.view(ByteBuffer buffer,
                            [int offsetInBytes = 0, int length]) =>
-      new NativeFloat32List.view(buffer, offsetInBytes, length);
+      buffer.asFloat32List(offsetInBytes, length);
 
   static const int BYTES_PER_ELEMENT = 4;
 }
@@ -414,7 +475,7 @@
    */
   factory Float64List.view(ByteBuffer buffer,
                            [int offsetInBytes = 0, int length]) =>
-      new NativeFloat64List.view(buffer, offsetInBytes, length);
+      buffer.asFloat64List(offsetInBytes, length);
 
   static const int BYTES_PER_ELEMENT = 8;
 }
@@ -456,7 +517,7 @@
    */
   factory Int16List.view(ByteBuffer buffer,
                          [int offsetInBytes = 0, int length]) =>
-      new NativeInt16List.view(buffer, offsetInBytes, length);
+      buffer.asInt16List(offsetInBytes, length);
 
   static const int BYTES_PER_ELEMENT = 2;
 }
@@ -498,7 +559,7 @@
    */
   factory Int32List.view(ByteBuffer buffer,
                          [int offsetInBytes = 0, int length]) =>
-      new NativeInt32List.view(buffer, offsetInBytes, length);
+      buffer.asInt32List(offsetInBytes, length);
 
   static const int BYTES_PER_ELEMENT = 4;
 }
@@ -536,8 +597,8 @@
    * the length of [buffer].
    */
   factory Int8List.view(ByteBuffer buffer,
-                        [int offsetInBytes = 0, int length])
-      => new NativeInt8List.view(buffer, offsetInBytes, length);
+                        [int offsetInBytes = 0, int length]) =>
+      buffer.asInt8List(offsetInBytes, length);
 
   static const int BYTES_PER_ELEMENT = 1;
 }
@@ -579,7 +640,7 @@
    */
   factory Uint16List.view(ByteBuffer buffer,
                           [int offsetInBytes = 0, int length]) =>
-      new NativeUint16List.view(buffer, offsetInBytes, length);
+      buffer.asUint16List(offsetInBytes, length);
 
   static const int BYTES_PER_ELEMENT = 2;
 }
@@ -621,7 +682,7 @@
    */
   factory Uint32List.view(ByteBuffer buffer,
                           [int offsetInBytes = 0, int length]) =>
-      new NativeUint32List.view(buffer, offsetInBytes, length);
+      buffer.asUint32List(offsetInBytes, length);
 
   static const int BYTES_PER_ELEMENT = 4;
 }
@@ -661,7 +722,7 @@
    */
   factory Uint8ClampedList.view(ByteBuffer buffer,
                                 [int offsetInBytes = 0, int length]) =>
-      new NativeUint8ClampedList.view(buffer, offsetInBytes, length);
+      buffer.asUint8ClampedList(offsetInBytes, length);
 
   static const int BYTES_PER_ELEMENT = 1;
 }
@@ -700,7 +761,7 @@
    */
   factory Uint8List.view(ByteBuffer buffer,
                          [int offsetInBytes = 0, int length]) =>
-      new NativeUint8List.view(buffer, offsetInBytes, length);
+      buffer.asUint8List(offsetInBytes, length);
 
   static const int BYTES_PER_ELEMENT = 1;
 }
@@ -892,7 +953,7 @@
    */
   Float32x4List.view(ByteBuffer buffer,
                      [int byteOffset = 0, int length])
-      : _storage = new Float32List.view(buffer, byteOffset,
+      : _storage = buffer.asFloat32List(byteOffset,
                                         length != null ? length * 4 : null);
 
   static const int BYTES_PER_ELEMENT = 16;
@@ -995,9 +1056,8 @@
    */
   factory Int32x4List.fromList(List<Int32x4> list) {
     if (list is Int32x4List) {
-      Int32x4List nativeList = list as Int32x4List;
       return new Int32x4List._externalStorage(
-          new Uint32List.fromList(nativeList._storage));
+          new Uint32List.fromList(list._storage));
     } else {
       return new Int32x4List._slowFromList(list);
     }
@@ -1020,7 +1080,7 @@
    */
   Int32x4List.view(ByteBuffer buffer,
                      [int byteOffset = 0, int length])
-      : _storage = new Uint32List.view(buffer, byteOffset,
+      : _storage = buffer.asUint32List(byteOffset,
                                        length != null ? length * 4 : null);
 
   static const int BYTES_PER_ELEMENT = 16;
@@ -1144,7 +1204,7 @@
    */
   Float64x2List.view(ByteBuffer buffer,
                      [int byteOffset = 0, int length])
-      : _storage = new Float64List.view(buffer, byteOffset,
+      : _storage = buffer.asFloat64List(byteOffset,
                                         length != null ? length * 2 : null);
 
   static const int BYTES_PER_ELEMENT = 16;
diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart
index 66a86bc..665de4b 100644
--- a/sdk/lib/typed_data/typed_data.dart
+++ b/sdk/lib/typed_data/typed_data.dart
@@ -17,6 +17,66 @@
    */
   int get lengthInBytes;
 
+  /**
+   * Creates a new [Uint8List] view of this buffer.
+   */
+  Uint8List asUint8List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Int8List] view of this buffer.
+   */
+  Int8List asInt8List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Uint8Clamped] view of this buffer.
+   */
+  Uint8ClampedList asUint8ClampedList([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Uint16List] view of this buffer.
+   */
+  Uint16List asUint16List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Int16List] view of this buffer.
+   */
+  Int16List asInt16List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Uint32List] view of this buffer.
+   */
+  Uint32List asUint32List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Int32List] view of this buffer.
+   */
+  Int32List asInt32List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Uint64List] view of this buffer.
+   */
+  Uint64List asUint64List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Int64List] view of this buffer.
+   */
+  Int64List asInt64List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Int32x4List] view of this buffer.
+   */
+  Int32x4List asInt32x4List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Float32List] view of this buffer.
+   */
+  Float32List asFloat32List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Float64List] view of this buffer.
+   */
+  Float64List asFloat64List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Float32x4List] view of this buffer.
+   */
+  Float32x4List asFloat32x4List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [Float64x2List] view of this buffer.
+   */
+  Float64x2List asFloat64x2List([int offsetInBytes = 0, int length]);
+  /**
+   * Creates a new [ByteData] view of this buffer.
+   */
+  ByteData asByteData([int offsetInBytes = 0, int length]);
 }
 
 
@@ -102,8 +162,10 @@
    * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
    * the length of [buffer].
    */
-  external factory ByteData.view(ByteBuffer buffer,
-                                 [int offsetInBytes = 0, int length]);
+  factory ByteData.view(ByteBuffer buffer,
+                        [int offsetInBytes = 0, int length]) {
+    return buffer.asByteData(offsetInBytes, length);
+  }
 
   /**
    * Returns the (possibly negative) integer represented by the byte at the
@@ -381,8 +443,10 @@
    * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
    * the length of [buffer].
    */
-  external factory Int8List.view(ByteBuffer buffer,
-                                 [int offsetInBytes = 0, int length]);
+  factory Int8List.view(ByteBuffer buffer,
+                        [int offsetInBytes = 0, int length]) {
+    return buffer.asInt8List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 1;
 }
@@ -418,8 +482,10 @@
    * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
    * the length of [buffer].
    */
-  external factory Uint8List.view(ByteBuffer buffer,
-                                  [int offsetInBytes = 0, int length]);
+  factory Uint8List.view(ByteBuffer buffer,
+                         [int offsetInBytes = 0, int length]) {
+    return buffer.asUint8List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 1;
 }
@@ -456,8 +522,10 @@
    * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
    * the length of [buffer].
    */
-  external factory Uint8ClampedList.view(ByteBuffer buffer,
-                                         [int offsetInBytes = 0, int length]);
+  factory Uint8ClampedList.view(ByteBuffer buffer,
+                                [int offsetInBytes = 0, int length]) {
+    return buffer.asUint8ClampedList(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 1;
 }
@@ -496,8 +564,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Int16List.view(ByteBuffer buffer,
-                                  [int offsetInBytes = 0, int length]);
+  factory Int16List.view(ByteBuffer buffer,
+                         [int offsetInBytes = 0, int length]) {
+    return buffer.asInt16List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 2;
 }
@@ -536,8 +606,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Uint16List.view(ByteBuffer buffer,
-                                   [int offsetInBytes = 0, int length]);
+  factory Uint16List.view(ByteBuffer buffer,
+                          [int offsetInBytes = 0, int length]) {
+    return buffer.asUint16List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 2;
 }
@@ -576,8 +648,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Int32List.view(ByteBuffer buffer,
-                                  [int offsetInBytes = 0, int length]);
+  factory Int32List.view(ByteBuffer buffer,
+                         [int offsetInBytes = 0, int length]) {
+    return buffer.asInt32List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 4;
 }
@@ -616,8 +690,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Uint32List.view(ByteBuffer buffer,
-                                   [int offsetInBytes = 0, int length]);
+  factory Uint32List.view(ByteBuffer buffer,
+                          [int offsetInBytes = 0, int length]) {
+    return buffer.asUint32List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 4;
 }
@@ -656,8 +732,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Int64List.view(ByteBuffer buffer,
-                                  [int offsetInBytes = 0, int length]);
+  factory Int64List.view(ByteBuffer buffer,
+                         [int offsetInBytes = 0, int length]) {
+    return buffer.asInt64List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 8;
 }
@@ -697,8 +775,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Uint64List.view(ByteBuffer buffer,
-                                   [int offsetInBytes = 0, int length]);
+  factory Uint64List.view(ByteBuffer buffer,
+                          [int offsetInBytes = 0, int length]) {
+    return buffer.asUint64List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 8;
 }
@@ -738,8 +818,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Float32List.view(ByteBuffer buffer,
-                                    [int offsetInBytes = 0, int length]);
+  factory Float32List.view(ByteBuffer buffer,
+                           [int offsetInBytes = 0, int length]) {
+    return buffer.asFloat32List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 4;
 }
@@ -779,8 +861,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Float64List.view(ByteBuffer buffer,
-                                    [int offsetInBytes = 0, int length]);
+  factory Float64List.view(ByteBuffer buffer,
+                           [int offsetInBytes = 0, int length]) {
+    return buffer.asFloat64List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 8;
 }
@@ -819,8 +903,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Float32x4List.view(ByteBuffer buffer,
-                                      [int offsetInBytes = 0, int length]);
+  factory Float32x4List.view(ByteBuffer buffer,
+                             [int offsetInBytes = 0, int length]) {
+    return buffer.asFloat32x4List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 16;
 }
@@ -859,8 +945,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Int32x4List.view(ByteBuffer buffer,
-                                      [int offsetInBytes = 0, int length]);
+  factory Int32x4List.view(ByteBuffer buffer,
+                             [int offsetInBytes = 0, int length]) {
+    return buffer.asInt32x4List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 16;
 }
@@ -899,8 +987,10 @@
    * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
    * [BYTES_PER_ELEMENT].
    */
-  external factory Float64x2List.view(ByteBuffer buffer,
-                                      [int offsetInBytes = 0, int length]);
+  factory Float64x2List.view(ByteBuffer buffer,
+                             [int offsetInBytes = 0, int length]) {
+    return buffer.asFloat64x2List(offsetInBytes, length);
+  }
 
   static const int BYTES_PER_ELEMENT = 16;
 }
diff --git a/site/try/bugs/single_line_delete.dart b/site/try/bugs/single_line_delete.dart
new file mode 100644
index 0000000..7971d7f
--- /dev/null
+++ b/site/try/bugs/single_line_delete.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+var greeting = "Hello, World!";
+
+void main() {
+  // Put cursor at end of previous line. Hit backspace.
+  // 1. Ensure this triggers a single-line change.
+  // 2. Ensure the cursor position is correct.
+  // Then restore the file and place the cursor at the end of the file. Delete
+  // each character in the file by holding down backspace. Verify that there
+  // are no exceptions and that the entire buffer is deleted.
+  // Then restore the file and place the cursor before the semicolon on the
+  // first line. Hit delete and verify that a character is deleted.
+  print(greeting);
+}
diff --git a/site/try/index.html b/site/try/index.html
index 969e2f1..d07a01f 100644
--- a/site/try/index.html
+++ b/site/try/index.html
@@ -236,7 +236,7 @@
         <div id="settings-body">
         </div>
         <div>
-          <a href="#" class="btn btn-primary" id="settings-done">Done</a>
+          <a href="#" class="btn btn-primary" id="settings-done">Close</a>
         </div>
       </div>
     </div>
diff --git a/site/try/src/compilation.dart b/site/try/src/compilation.dart
index d9b28af..0fcc793 100644
--- a/site/try/src/compilation.dart
+++ b/site/try/src/compilation.dart
@@ -139,8 +139,7 @@
   }
 
   onFail(_) {
-    // TODO(ahe): Call interaction.onCompilationFailed().
-    interaction.consolePrintLine('Compilation failed');
+    interaction.onCompilationFailed();
   }
 
   onDone(_) {
@@ -256,6 +255,6 @@
   }
 
   onCrash(data) {
-    interaction.consolePrintLine(data);
+    interaction.onCompilerCrash(data);
   }
 }
diff --git a/site/try/src/decoration.dart b/site/try/src/decoration.dart
index 663aeea..994a3dd 100644
--- a/site/try/src/decoration.dart
+++ b/site/try/src/decoration.dart
@@ -9,6 +9,9 @@
 import 'shadow_root.dart' show
     setShadowRoot;
 
+import 'editor.dart' show
+    diagnostic;
+
 class Decoration {
   final String color;
   final bool bold;
@@ -65,11 +68,7 @@
     if (kind == 'error') {
       tip = error(message);
     }
-    return element..append(
-        new AnchorElement()
-            ..classes.add('diagnostic')
-            ..nodes.addAll(nodes)
-            ..append(tip));
+    return element..append(diagnostic(nodes, tip));
   }
 }
 
diff --git a/site/try/src/editor.dart b/site/try/src/editor.dart
index 615a853..e8523d5 100644
--- a/site/try/src/editor.dart
+++ b/site/try/src/editor.dart
@@ -164,7 +164,7 @@
         Element parent = node.parent;
         if (parent.classes.contains("diagnostic") &&
             !interaction.oldDiagnostics.contains(parent)) {
-          Element other = parent.lastChild;
+          Element other = parent.firstChild;
           other.remove();
           SpanElement wrapper = new SpanElement();
           wrapper.style
@@ -232,17 +232,6 @@
       mainEditorPane, childList: true, characterData: true, subtree: true);
 }
 
-void inlineChildren(Element element) {
-  if (element == null) return;
-  var parent = element.parentNode;
-  if (parent == null) return;
-  for (Node child in new List.from(element.nodes)) {
-    child.remove();
-    parent.insertBefore(child, element);
-  }
-  element.remove();
-}
-
 Decoration getDecoration(Token token) {
   if (token is ErrorToken) {
     isMalformedInput = true;
@@ -268,12 +257,15 @@
   return currentTheme.foreground;
 }
 
-diagnostic(text, tip) {
-  if (text is String) {
-    text = new Text(text);
+diagnostic(content, tip) {
+  if (content is String) {
+    content = new Text(content);
+  }
+  if (content is! List) {
+    content = [content];
   }
   return new AnchorElement()
       ..classes.add('diagnostic')
-      ..append(text)
-      ..append(tip);
+      ..append(tip) // Should be first for better Firefox editing.
+      ..nodes.addAll(content);
 }
diff --git a/site/try/src/extract_theme.dart b/site/try/src/extract_theme.dart
index 8a79516..1487c9b 100644
--- a/site/try/src/extract_theme.dart
+++ b/site/try/src/extract_theme.dart
@@ -6,9 +6,9 @@
 
 StringBuffer themes = new StringBuffer();
 
-void main() {
+void main(List<String> arguments) {
   print('part of trydart.themes;\n');
-  new Options().arguments.forEach(extractTheme);
+  arguments.forEach(extractTheme);
   print('''
 /// List of known themes. The default is the first theme.
 const List<Theme> THEMES = const <Theme> [
diff --git a/site/try/src/html_to_text.dart b/site/try/src/html_to_text.dart
index aa8710d..79660cb 100644
--- a/site/try/src/html_to_text.dart
+++ b/site/try/src/html_to_text.dart
@@ -8,16 +8,21 @@
     max;
 
 import 'dart:html' show
+    CharacterData,
     Element,
     Node,
     NodeFilter,
     ShadowRoot,
-    Text,
     TreeWalker;
 
 import 'selection.dart' show
     TrySelection;
 
+import 'shadow_root.dart' show
+    WALKER_NEXT,
+    WALKER_SKIP_NODE,
+    walkNodes;
+
 /// Returns true if [node] is a block element, that is, not inline.
 bool isBlockElement(Node node) {
   if (node is! Element) return false;
@@ -30,24 +35,6 @@
   return element.getComputedStyle().display != 'inline';
 }
 
-/// Position [walker] at the last predecessor (that is, child of child of
-/// child...) of [node]. The next call to walker.nextNode will return the first
-/// node after [node].
-void skip(Node node, TreeWalker walker) {
-  if (walker.nextSibling() != null) {
-    walker.previousNode();
-    return;
-  }
-  for (Node current = walker.nextNode();
-       current != null;
-       current = walker.nextNode()) {
-    if (!node.contains(current)) {
-      walker.previousNode();
-      return;
-    }
-  }
-}
-
 /// Writes the text of [root] to [buffer]. Keeps track of [selection] and
 /// returns the new anchorOffset from beginning of [buffer] or -1 if the
 /// selection isn't in [root].
@@ -56,34 +43,30 @@
                TrySelection selection,
                {bool treatRootAsInline: false}) {
   int selectionOffset = -1;
-  TreeWalker walker = new TreeWalker(root, NodeFilter.SHOW_ALL);
-
-  for (Node node = root; node != null; node = walker.nextNode()) {
+  walkNodes(root, (Node node) {
+    if (selection.anchorNode == node) {
+      selectionOffset = selection.anchorOffset + buffer.length;
+    }
     switch (node.nodeType) {
       case Node.CDATA_SECTION_NODE:
       case Node.TEXT_NODE:
-        if (selection.anchorNode == node) {
-          selectionOffset = selection.anchorOffset + buffer.length;
-        }
-        Text text = node;
+        CharacterData text = node;
         buffer.write(text.data.replaceAll('\xA0', ' '));
         break;
 
       default:
-        if (!ShadowRoot.supported &&
-            node is Element &&
-            node.getAttribute('try-dart-shadow-root') != null) {
-          skip(node, walker);
-        } else if (node.nodeName == 'BR') {
+        if (node.nodeName == 'BR') {
           buffer.write('\n');
         } else if (node != root && isBlockElement(node)) {
           selectionOffset =
               max(selectionOffset, htmlToText(node, buffer, selection));
-          skip(node, walker);
+          return WALKER_SKIP_NODE;
         }
         break;
     }
-  }
+
+    return WALKER_NEXT;
+  });
 
   if (!treatRootAsInline && isBlockElement(root)) {
     buffer.write('\n');
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index 6d3aaeb..97c06d4 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -104,6 +104,8 @@
 /// finished quickly.  The purpose is to reduce flicker in the UI.
 const Duration SLOW_COMPILE = const Duration(seconds: 1);
 
+const int TAB_WIDTH = 2;
+
 /**
  * UI interaction manager for the entire application.
  */
@@ -234,6 +236,7 @@
   void onKeyUp(KeyboardEvent event) => state.onKeyUp(event);
 
   void onMutation(List<MutationRecord> mutations, MutationObserver observer) {
+    workAroundFirefoxBug();
     try {
       try {
         return state.onMutation(mutations, observer);
@@ -306,7 +309,6 @@
   void set state(InteractionState newState);
 
   void onStateChanged(InteractionState previous) {
-    print('State change ${previous.runtimeType} -> ${runtimeType}.');
   }
 
   void transitionToInitialState() {
@@ -334,15 +336,30 @@
 
   void onKeyUp(KeyboardEvent event) {
     if (computeHasModifier(event)) {
-      print('onKeyUp (modified)');
       onModifiedKeyUp(event);
     } else {
-      print('onKeyUp (unmodified)');
       onUnmodifiedKeyUp(event);
     }
   }
 
   void onModifiedKeyUp(KeyboardEvent event) {
+    if (event.getModifierState("Shift")) return onShiftedKeyUp(event);
+    switch (event.keyCode) {
+      case KeyCode.S:
+        // Disable Ctrl-S, Cmd-S, etc. We have observed users hitting these
+        // keys often when using Try Dart and getting frustrated.
+        event.preventDefault();
+        // TODO(ahe): Consider starting a compilation.
+        break;
+    }
+  }
+
+  void onShiftedKeyUp(KeyboardEvent event) {
+    switch (event.keyCode) {
+      case KeyCode.TAB:
+        event.preventDefault();
+        break;
+    }
   }
 
   void onUnmodifiedKeyUp(KeyboardEvent event) {
@@ -373,6 +390,16 @@
         }
         break;
       }
+      case KeyCode.TAB: {
+        Selection selection = window.getSelection();
+        if (isCollapsed(selection)) {
+          event.preventDefault();
+          Text text = new Text(' ' * TAB_WIDTH);
+          selection.getRangeAt(0).insertNode(text);
+          selection.collapse(text, TAB_WIDTH);
+        }
+        break;
+      }
     }
 
     // This is a hack to get Safari (iOS) to send mutation events on
@@ -384,8 +411,6 @@
   }
 
   void onMutation(List<MutationRecord> mutations, MutationObserver observer) {
-    print('onMutation');
-
     removeCodeCompletion();
 
     Selection selection = window.getSelection();
@@ -427,7 +452,11 @@
 
         node.parent.insertAllBefore(nodes, node);
         node.remove();
-        trySelection.adjust(selection);
+        if (mainEditorPane.contains(trySelection.anchorNode)) {
+          // Sometimes the anchor node is removed by the above call. This has
+          // only been observed in Firefox, and is hard to reproduce.
+          trySelection.adjust(selection);
+        }
 
         // TODO(ahe): We know almost exactly what has changed.  It could be
         // more efficient to only communicate what changed.
@@ -637,11 +666,6 @@
     }
   }
 
-  /// Called when an exception occurs in an iframe.
-  void onErrorMessage(ErrorMessage message) {
-    outputDiv.appendText('$message\n');
-  }
-
   /// Called when an iframe is modified.
   void onScrollHeightMessage(int scrollHeight) {
     window.console.log('scrollHeight = $scrollHeight');
@@ -680,6 +704,7 @@
   }
 
   void onCompilationFailed() {
+    consolePrintLine('Compilation failed.');
   }
 
   void onCompilationDone() {
@@ -1173,9 +1198,18 @@
     }
   }
   if (!record.removedNodes.isEmpty) {
-    normalizedNodes.add(findLine(record.target));
+    var first = record.removedNodes.first;
+    var line = findLine(record.target);
+
+    if (first is Text && first.data=="\n" && line.nextNode != null) {
+      normalizedNodes.add(line.nextNode);
+    }
+    normalizedNodes.add(line);
   }
-  if (record.type == "characterData") {
+  if (record.type == "characterData" && record.target.parent != null) {
+    // At least Firefox sends a "characterData" record whose target is the
+    // deleted text node. It also sends a record where "removedNodes" isn't
+    // empty whose target is the parent (which we are interested in).
     normalizedNodes.add(findLine(record.target));
   }
 }
@@ -1228,3 +1262,23 @@
       message == "Compiling..." ||
       message.startsWith('Compiled ');
 }
+
+void workAroundFirefoxBug() {
+  Selection selection = window.getSelection();
+  if (!isCollapsed(selection)) return;
+  Node node = selection.anchorNode;
+  int offset = selection.anchorOffset;
+  if (selection.anchorNode is Element && selection.anchorOffset != 0) {
+    // In some cases, Firefox reports the wrong anchorOffset (always seems to
+    // be 6) when anchorNode is an Element. Moving the cursor back and forth
+    // adjusts the anchorOffset.
+    // Safari can also reach this code, but the offset isn't wrong, just
+    // inconsistent.  After moving the cursor back and forth, Safari will make
+    // the offset relative to a text node.
+    selection
+        ..modify('move', 'backward', 'character')
+        ..modify('move', 'forward', 'character');
+    print('Selection adjusted $node@$offset -> '
+          '${selection.anchorNode}@${selection.anchorOffset}.');
+  }
+}
diff --git a/site/try/src/selection.dart b/site/try/src/selection.dart
index 641eb74..c0d606e 100644
--- a/site/try/src/selection.dart
+++ b/site/try/src/selection.dart
@@ -6,12 +6,18 @@
 
 import 'dart:html' show
     CharacterData,
+    Element,
     Node,
     NodeFilter,
     Selection,
     Text,
     TreeWalker;
 
+import 'shadow_root.dart' show
+    WALKER_NEXT,
+    WALKER_RETURN,
+    walkNodes;
+
 import 'decoration.dart';
 
 class TrySelection {
@@ -70,18 +76,23 @@
     if (anchorOffset == -1) return -1;
 
     int offset = 0;
-    TreeWalker walker = new TreeWalker(root, NodeFilter.SHOW_TEXT);
-    for (Node node = walker.nextNode();
-         node != null;
-         node = walker.nextNode()) {
-      CharacterData text = node;
-      if (anchorNode == text) {
-        return anchorOffset + offset;
+    bool found = false;
+    walkNodes(root, (Node node) {
+      if (anchorNode == node) {
+        offset += anchorOffset;
+        found = true;
+        return WALKER_RETURN;
       }
-      offset += text.data.length;
-    }
-
-    return -1;
+      switch (node.nodeType) {
+        case Node.CDATA_SECTION_NODE:
+        case Node.TEXT_NODE:
+          CharacterData text = node;
+          offset += text.data.length;
+          break;
+      }
+      return WALKER_NEXT;
+    });
+    return found ? offset : -1;
   }
 }
 
diff --git a/site/try/src/shadow_root.dart b/site/try/src/shadow_root.dart
index b14afc6..2b9ba1d 100644
--- a/site/try/src/shadow_root.dart
+++ b/site/try/src/shadow_root.dart
@@ -12,6 +12,10 @@
 import 'html_to_text.dart' show
     htmlToText;
 
+const int WALKER_NEXT = 0;
+const int WALKER_RETURN = 1;
+const int WALKER_SKIP_NODE = 2;
+
 void setShadowRoot(Element node, text) {
   if (text is String) {
     text = new Text(text);
@@ -53,3 +57,47 @@
       node, buffer, new TrySelection.empty(node), treatRootAsInline: true);
   return '$buffer';
 }
+
+/// Position [walker] at the last predecessor (that is, child of child of
+/// child...) of [node]. The next call to walker.nextNode will return the first
+/// node after [node].
+void skip(Node node, TreeWalker walker) {
+  if (walker.nextSibling() != null) {
+    walker.previousNode();
+    return;
+  }
+  for (Node current = walker.nextNode();
+       current != null;
+       current = walker.nextNode()) {
+    if (!node.contains(current)) {
+      walker.previousNode();
+      return;
+    }
+  }
+}
+
+/// Call [f] on each node in [root] in same order as [TreeWalker].  Skip any
+/// nodes used to implement shadow root polyfill.
+void walkNodes(Node root, int f(Node node)) {
+  TreeWalker walker = new TreeWalker(root, NodeFilter.SHOW_ALL);
+
+  for (Node node = root; node != null; node = walker.nextNode()) {
+    if (!ShadowRoot.supported &&
+        node is Element &&
+        node.getAttribute('try-dart-shadow-root') != null) {
+      skip(node, walker);
+    }
+    int action = f(node);
+    switch (action) {
+      case WALKER_RETURN:
+        return;
+      case WALKER_SKIP_NODE:
+        skip(node, walker);
+        break;
+      case WALKER_NEXT:
+        break;
+      default:
+        throw 'Unexpected action returned from [f]: $action';
+    }
+  }
+}
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 413c31b..c234ae3 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -150,7 +150,7 @@
 LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Document/title-property-creates-title-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Document/title-property-set-multiple-times_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/title-with-multiple-children_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/title-with-multiple-children_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Element/class-name_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Element/client-rect-list-argument_t01: RuntimeError # co19-roll r706: Please triage this failure.
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 8498895..b174280 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -467,3 +467,4 @@
 LibTest/math/log_A01_t01: Pass, Fail # co19 issue 44.
 LibTest/html/Element/getBoundingClientRect_A01_t02: RuntimeError # Issue 19127.
 LayoutTests/fast/dom/HTMLLinkElement/prefetch-beforeload_t01: Pass, Fail # Issue 19274.
+WebPlatformTest/dom/nodes/Node-parentNode_t01: Skip # Times out.  Issue 19127.
diff --git a/tests/compiler/dart2js/bad_output_io_test.dart b/tests/compiler/dart2js/bad_output_io_test.dart
index fc2cf34..913614b 100644
--- a/tests/compiler/dart2js/bad_output_io_test.dart
+++ b/tests/compiler/dart2js/bad_output_io_test.dart
@@ -48,6 +48,10 @@
   String prefixMessage(String message, Diagnostic kind) {
     return message;
   }
+
+  int fatalCount;
+
+  int throwOnErrorCount;
 }
 
 testOutputProvider(script, libraryRoot, packageRoot, inputProvider, handler,
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index e416907..c84f1d8 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -46,8 +46,6 @@
 
 Future<String> compile(String code,
                        {String entry: 'main',
-                        String coreSource: DEFAULT_CORELIB,
-                        String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
                         bool enableTypeAssertions: false,
                         bool minify: false,
                         bool analyzeAll: false,
@@ -55,11 +53,9 @@
                         void check(String generated)}) {
   MockCompiler compiler = new MockCompiler.internal(
       enableTypeAssertions: enableTypeAssertions,
-      coreSource: coreSource,
       // Type inference does not run when manually
       // compiling a method.
       disableTypeInference: true,
-      interceptorsSource: interceptorsSource,
       enableMinification: minify,
       disableInlining: disableInlining);
   return compiler.init().then((_) {
@@ -92,7 +88,7 @@
 MockCompiler compilerFor(String code, Uri uri,
                          {bool analyzeAll: false,
                           bool analyzeOnly: false,
-                          String coreSource: DEFAULT_CORELIB,
+                          Map<String, String> coreSource,
                           bool disableInlining: true,
                           bool minify: false,
                           int expectedErrors,
@@ -110,7 +106,7 @@
 }
 
 Future<String> compileAll(String code,
-                          {String coreSource: DEFAULT_CORELIB,
+                          {Map<String, String> coreSource,
                           bool disableInlining: true,
                           bool minify: false,
                           int expectedErrors,
@@ -158,8 +154,13 @@
   });
 }
 
-lego.Element findElement(compiler, String name) {
-  var element = compiler.mainApp.find(name);
+lego.Element findElement(compiler, String name, [Uri library]) {
+  lego.LibraryElement lib = compiler.mainApp;
+  if (library != null) {
+    lib = compiler.libraryLoader.lookupLibrary(library);
+    Expect.isNotNull(lib, 'Could not locate library $library.');
+  }
+  var element = lib.find(name);
   Expect.isNotNull(element, 'Could not locate $name.');
   return element;
 }
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 87c39ea..6f3aab0 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -5,14 +5,11 @@
 import 'dart:async';
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import 'package:compiler/implementation/source_file.dart';
 import 'package:compiler/implementation/types/types.dart';
 import 'package:compiler/implementation/inferrer/concrete_types_inferrer.dart';
 
-import "parser_helper.dart";
 import "compiler_helper.dart";
 import "type_mask_test_helper.dart";
-import 'dart:mirrors';
 
 /**
  * Finds the node corresponding to the last occurence of the substring
@@ -66,8 +63,8 @@
     map = inferrer.baseTypes.mapBaseType;
     nullType = const NullBaseType();
     functionType = inferrer.baseTypes.functionBaseType;
-    Element mainElement = compiler.mainApp.find('main');
-    ast = mainElement.parseNode(compiler);
+    FunctionElement mainElement = compiler.mainApp.find('main');
+    ast = mainElement.node;
   }
 
   BaseType base(String className) {
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index 00be18d..ecc0a00 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -671,7 +671,7 @@
     FunctionElement mainElement = compiler.mainApp.find(leg.Compiler.MAIN);
     compiler.processQueue(compiler.enqueuer.resolution, mainElement);
     PlaceholderCollector collector = collectPlaceholders(compiler, mainElement);
-    FunctionExpression mainNode = mainElement.parseNode(compiler);
+    FunctionExpression mainNode = mainElement.node;
     Block body = mainNode.body;
     FunctionDeclaration functionDeclaration = body.statements.nodes.head;
     FunctionExpression fooNode = functionDeclaration.function;
diff --git a/tests/compiler/dart2js/dart_printer_test.dart b/tests/compiler/dart2js/dart_printer_test.dart
index 857da91..bba37f4 100644
--- a/tests/compiler/dart2js/dart_printer_test.dart
+++ b/tests/compiler/dart2js/dart_printer_test.dart
@@ -591,13 +591,14 @@
     push(statement);
   }
 
-  // TODO(kmillikin,asgerf): this code is currently untested.
   endFunctionDeclaration(Token end) {
     Statement body = pop();
     Parameters parameters = pop();
     String name = pop(asName);
     TypeAnnotation returnType = popTypeAnnotation();
-    push(new FunctionDeclaration(name, parameters, body, returnType));
+    push(new FunctionDeclaration(new FunctionExpression(parameters, body,
+        name: name,
+        returnType: returnType)));
   }
 
   endFunctionBody(int count, Token begin, Token end) {
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index c81b99f..27c2c61 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -59,9 +59,9 @@
     return super.onLibrariesLoaded(loadedLibraries);

   }

 

-  TreeElements analyzeElement(Element element) {

+  void analyzeElement(Element element) {

     test('Compiler.analyzeElement');

-    return super.analyzeElement(element);

+    super.analyzeElement(element);

   }

 

   void codegen(CodegenWorkItem work, CodegenEnqueuer world) {

diff --git a/tests/compiler/dart2js/find_my_name_test.dart b/tests/compiler/dart2js/find_my_name_test.dart
index 4fbdfb0..bd46c30 100644
--- a/tests/compiler/dart2js/find_my_name_test.dart
+++ b/tests/compiler/dart2js/find_my_name_test.dart
@@ -7,6 +7,7 @@
 import "package:compiler/implementation/elements/elements.dart";
 import "mock_compiler.dart";
 import "parser_helper.dart";
+import 'package:compiler/implementation/elements/modelx.dart';
 
 String TEST_0 = '''
 class Foo {
@@ -34,7 +35,7 @@
 
 testClass(String code, MockCompiler compiler) {
   int skip = code.indexOf('{');
-  ClassElement cls = parseUnit(code, compiler, compiler.mainApp).head;
+  ClassElementX cls = parseUnit(code, compiler, compiler.mainApp).head;
   cls.parseNode(compiler);
   cls.forEachLocalMember((Element e) {
     String name = e.name;
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index 8a89f9c..5540986 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -170,7 +170,8 @@
     Map copiedLibraries = {};
     cachedCompiler.libraryLoader.libraries.forEach((library) {
       if (library.isPlatformLibrary) {
-        compiler.libraryLoader.mapLibrary(library);
+        var libraryLoader = compiler.libraryLoader;
+        libraryLoader.mapLibrary(library);
         compiler.onLibraryCreated(library);
         compiler.onLibraryScanned(library, null);
         if (library.isPatched) {
diff --git a/tests/compiler/dart2js/mirror_private_name_inheritance_test.dart b/tests/compiler/dart2js/mirror_private_name_inheritance_test.dart
new file mode 100644
index 0000000..6277637
--- /dev/null
+++ b/tests/compiler/dart2js/mirror_private_name_inheritance_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that final fields in @MirrorsUsed are still inferred.
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import 'memory_compiler.dart' show compilerFor;
+import 'compiler_helper.dart' show findElement;
+
+const MEMORY_SOURCE_FILES = const <String, String> {
+  'main.dart': """
+@MirrorsUsed(targets: 'Super')
+import 'dart:mirrors';
+import 'lib.dart';
+
+
+class Subclass extends Super {
+  int _private;
+
+  int magic() => _private++;
+}
+
+main() {
+  var objects = [new Super(), new Subclass()];
+}
+""",
+  'lib.dart': """
+class Super {
+  int _private;
+
+  int magic() => _private++;
+}
+"""
+};
+
+void main() {
+  var compiler = compilerFor(MEMORY_SOURCE_FILES);
+  asyncTest(() => compiler.runCompiler(Uri.parse('memory:main.dart')).then((_) {
+
+    var superclass = findElement(compiler, 'Super', Uri.parse('memory:lib.dart'));
+    var subclass = findElement(compiler, 'Subclass');
+    var oracle = compiler.backend.isAccessibleByReflection;
+    print(superclass.lookupMember('_private'));
+    Expect.isTrue(oracle(superclass.lookupMember('_private')));
+    Expect.isFalse(oracle(subclass.lookupMember('_private')));
+  }));
+}
diff --git a/tests/compiler/dart2js/mirrors_helper.dart b/tests/compiler/dart2js/mirrors_helper.dart
index aca1317..30910d5 100644
--- a/tests/compiler/dart2js/mirrors_helper.dart
+++ b/tests/compiler/dart2js/mirrors_helper.dart
@@ -68,7 +68,7 @@
   void set _privateSetter(value) => _privateField = value;
   void _privateMethod() {}
   _PrivateClass._privateConstructor();
-  factory _PrivateClass._privateFactoryConstructor() => new _PrivateClass();
+  factory _PrivateClass._privateFactoryConstructor() => null;
 }
 
 const metadata = const Metadata(null);
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index fa83024a..c68c58c 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -31,6 +31,8 @@
     show DeferredLoadTask,
          OutputUnit;
 
+import 'mock_libraries.dart';
+
 class WarningMessage {
   Spannable node;
   Message message;
@@ -39,231 +41,8 @@
   toString() => message.toString();
 }
 
-const String DEFAULT_HELPERLIB = r'''
-  const patch = 0;
-  wrapException(x) { return x; }
-  iae(x) { throw x; } ioore(x) { throw x; }
-  guard$array(x) { return x; }
-  guard$num(x) { return x; }
-  guard$string(x) { return x; }
-  guard$stringOrArray(x) { return x; }
-  makeLiteralMap(List keyValuePairs) {}
-  setRuntimeTypeInfo(a, b) {}
-  getRuntimeTypeInfo(a) {}
-  stringTypeCheck(x) {}
-  stringTypeCast(x) {}
-  propertyTypeCast(x) {}
-  boolConversionCheck(x) {}
-  abstract class JavaScriptIndexingBehavior {}
-  class JSInvocationMirror {}
-  abstract class BoundClosure extends Closure {
-    var self;
-    var target;
-    var receiver;
-  }
-  abstract class Closure implements Function { }
-  class ConstantMap {}
-  class ConstantStringMap {}
-  class TypeImpl {}
-  S() {}
-  throwCyclicInit() {}
-  throwExpression(e) {}
-  unwrapException(e) {}
-  assertHelper(a) {}
-  isJsIndexable(a, b) {}
-  createRuntimeType(a) {}
-  createInvocationMirror(a0, a1, a2, a3, a4, a5) {}
-  throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {}
-  throwAbstractClassInstantiationError(className) {}
-  boolTypeCheck(value) {}
-  propertyTypeCheck(value, property) {}
-  interceptedTypeCheck(value, property) {}
-  functionSubtypeCast(Object object, String signatureName,
-                      String contextName, var context) {}
-  checkFunctionSubtype(var target, String signatureName,
-                       String contextName, var context,
-                       var typeArguments) {}
-  computeSignature(var signature, var context, var contextName) {}
-  getRuntimeTypeArguments(target, substitutionName) {}
-  voidTypeCheck(value) {}''';
-
-const String FOREIGN_LIBRARY = r'''
-  dynamic JS(String typeDescription, String codeTemplate,
-    [var arg0, var arg1, var arg2, var arg3, var arg4, var arg5, var arg6,
-     var arg7, var arg8, var arg9, var arg10, var arg11]) {}''';
-
-const String DEFAULT_INTERCEPTORSLIB = r'''
-  class Interceptor {
-    toString() {}
-    bool operator==(other) => identical(this, other);
-    get hashCode => throw "Interceptor.hashCode not implemented.";
-    noSuchMethod(im) { throw im; }
-  }
-  abstract class JSIndexable {
-    get length;
-    operator[](index);
-  }
-  abstract class JSMutableIndexable extends JSIndexable {}
-  class JSArray<E> extends Interceptor implements List<E>, JSIndexable {
-    JSArray();
-    factory JSArray.typed(a) => a;
-    var length;
-    operator[](index) => this[index];
-    operator[]=(index, value) { this[index] = value; }
-    add(value) { this[length + 1] = value; }
-    insert(index, value) {}
-    E get first => this[0];
-    E get last => this[0];
-    E get single => this[0];
-    E removeLast() => this[0];
-    E removeAt(index) => this[0];
-    E elementAt(index) => this[0];
-    E singleWhere(f) => this[0];
-  }
-  class JSMutableArray extends JSArray implements JSMutableIndexable {}
-  class JSFixedArray extends JSMutableArray {}
-  class JSExtendableArray extends JSMutableArray {}
-  class JSString extends Interceptor implements String, JSIndexable {
-    var length;
-    operator[](index) {}
-    toString() {}
-    operator+(other) => this;
-  }
-  class JSPositiveInt extends JSInt {}
-  class JSUInt32 extends JSPositiveInt {}
-  class JSUInt31 extends JSUInt32 {}
-  class JSNumber extends Interceptor implements num {
-    // All these methods return a number to please type inferencing.
-    operator-() => (this is JSInt) ? 42 : 42.2;
-    operator +(other) => (this is JSInt) ? 42 : 42.2;
-    operator -(other) => (this is JSInt) ? 42 : 42.2;
-    operator ~/(other) => _tdivFast(other);
-    operator /(other) => (this is JSInt) ? 42 : 42.2;
-    operator *(other) => (this is JSInt) ? 42 : 42.2;
-    operator %(other) => (this is JSInt) ? 42 : 42.2;
-    operator <<(other) => _shlPositive(other);
-    operator >>(other) {
-      return _shrBothPositive(other) + _shrReceiverPositive(other) +
-        _shrOtherPositive(other);
-    }
-    operator |(other) => 42;
-    operator &(other) => 42;
-    operator ^(other) => 42;
-
-    operator >(other) => true;
-    operator >=(other) => true;
-    operator <(other) => true;
-    operator <=(other) => true;
-    operator ==(other) => true;
-    get hashCode => throw "JSNumber.hashCode not implemented.";
-
-    // We force side effects on _tdivFast to mimic the shortcomings of
-    // the effect analysis: because the `_tdivFast` implementation of
-    // the core library has calls that may not already be analyzed,
-    // the analysis will conclude that `_tdivFast` may have side
-    // effects.
-    _tdivFast(other) => new List()..length = 42;
-    _shlPositive(other) => 42;
-    _shrBothPositive(other) => 42;
-    _shrReceiverPositive(other) => 42;
-    _shrOtherPositive(other) => 42;
-
-    abs() => (this is JSInt) ? 42 : 42.2;
-    remainder(other) => (this is JSInt) ? 42 : 42.2;
-    truncate() => 42;
-  }
-  class JSInt extends JSNumber implements int {
-  }
-  class JSDouble extends JSNumber implements double {
-  }
-  class JSNull extends Interceptor {
-    bool operator==(other) => identical(null, other);
-    get hashCode => throw "JSNull.hashCode not implemented.";
-    String toString() => 'Null';
-    Type get runtimeType => null;
-    noSuchMethod(x) => super.noSuchMethod(x);
-  }
-  class JSBool extends Interceptor implements bool {
-  }
-  abstract class JSFunction extends Interceptor implements Function {
-  }
-  class ObjectInterceptor {
-  }
-  getInterceptor(x) {}
-  getNativeInterceptor(x) {}
-  var dispatchPropertyName;
-  var mapTypeToInterceptor;
-  getDispatchProperty(o) {}
-  initializeDispatchProperty(f,p,i) {}
-  initializeDispatchPropertyCSP(f,p,i) {}
-''';
-
-const String DEFAULT_CORELIB = r'''
-  print(var obj) {}
-  abstract class num {}
-  abstract class int extends num { }
-  abstract class double extends num {
-    static var NAN = 0;
-    static parse(s) {}
-  }
-  class bool {}
-  class String implements Pattern {}
-  class Object {
-    const Object();
-    operator ==(other) { return true; }
-    get hashCode => throw "Object.hashCode not implemented.";
-    String toString() { return null; }
-    noSuchMethod(im) { throw im; }
-  }
-  class Null {}
-  abstract class StackTrace {}
-  class Type {}
-  class Function {}
-  class List<E> {
-    var length;
-    List([length]);
-    List.filled(length, element);
-    E get first => null;
-    E get last => null;
-    E get single => null;
-    E removeLast() => null;
-    E removeAt(i) => null;
-    E elementAt(i) => null;
-    E singleWhere(f) => null;
-  }
-  abstract class Map<K,V> {}
-  class LinkedHashMap {
-    factory LinkedHashMap._empty() => null;
-    factory LinkedHashMap._literal(elements) => null;
-  }
-  class DateTime {
-    DateTime(year);
-    DateTime.utc(year);
-  }
-  abstract class Pattern {}
-  bool identical(Object a, Object b) { return true; }
-  const proxy = 0;''';
-
 final Uri PATCH_CORE = new Uri(scheme: 'patch', path: 'core');
 
-const String PATCH_CORE_SOURCE = r'''
-import 'dart:_js_helper';
-import 'dart:_interceptors';
-import 'dart:_isolate_helper';
-''';
-
-const String DEFAULT_ISOLATE_HELPERLIB = r'''
-  var startRootIsolate;
-  var _currentIsolate;
-  var _callInIsolate;
-  class _WorkerBase {}''';
-
-const String DEFAULT_MIRRORS = r'''
-class Comment {}
-class MirrorSystem {}
-class MirrorsUsed {}
-''';
-
 class MockCompiler extends Compiler {
   api.DiagnosticHandler diagnosticHandler;
   List<WarningMessage> warnings;
@@ -280,8 +59,7 @@
   Node parsedTree;
 
   MockCompiler.internal(
-      {String coreSource: DEFAULT_CORELIB,
-       String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
+      {Map<String, String> coreSource,
        bool enableTypeAssertions: false,
        bool enableMinification: false,
        bool enableConcreteTypeInference: false,
@@ -313,15 +91,20 @@
 
     clearMessages();
 
-    registerSource(Compiler.DART_CORE, coreSource);
-    registerSource(PATCH_CORE, PATCH_CORE_SOURCE);
+    registerSource(Compiler.DART_CORE,
+                   buildLibrarySource(DEFAULT_CORE_LIBRARY, coreSource));
+    registerSource(PATCH_CORE, DEFAULT_PATCH_CORE_SOURCE);
 
-    registerSource(JavaScriptBackend.DART_JS_HELPER, DEFAULT_HELPERLIB);
-    registerSource(JavaScriptBackend.DART_FOREIGN_HELPER, FOREIGN_LIBRARY);
-    registerSource(JavaScriptBackend.DART_INTERCEPTORS, interceptorsSource);
+    registerSource(JavaScriptBackend.DART_JS_HELPER,
+                   buildLibrarySource(DEFAULT_JS_HELPER_LIBRARY));
+    registerSource(JavaScriptBackend.DART_FOREIGN_HELPER,
+                   buildLibrarySource(DEFAULT_FOREIGN_HELPER_LIBRARY));
+    registerSource(JavaScriptBackend.DART_INTERCEPTORS,
+                   buildLibrarySource(DEFAULT_INTERCEPTORS_LIBRARY));
     registerSource(JavaScriptBackend.DART_ISOLATE_HELPER,
-                   DEFAULT_ISOLATE_HELPERLIB);
-    registerSource(Compiler.DART_MIRRORS, DEFAULT_MIRRORS);
+                   buildLibrarySource(DEFAULT_ISOLATE_HELPER_LIBRARY));
+    registerSource(Compiler.DART_MIRRORS,
+                   buildLibrarySource(DEFAULT_MIRRORS_LIBRARY));
   }
 
   /// Initialize the mock compiler with an empty main library.
@@ -603,4 +386,6 @@
   get node => null;
 
   parseNode(_) => null;
+
+  bool get hasNode => false;
 }
diff --git a/tests/compiler/dart2js/mock_libraries.dart b/tests/compiler/dart2js/mock_libraries.dart
new file mode 100644
index 0000000..77aa0f7
--- /dev/null
+++ b/tests/compiler/dart2js/mock_libraries.dart
@@ -0,0 +1,337 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file

+// for details. All rights reserved. Use of this source code is governed by a

+// BSD-style license that can be found in the LICENSE file.

+

+// Library for creating mock versions of platform and internal libraries.

+

+library mock_libraries;

+

+String buildLibrarySource(

+    Map<String, String> elementMap,

+    [Map<String, String> additionalElementMap = const <String, String>{}]) {

+  Map<String, String> map = new Map<String, String>.from(elementMap);

+  if (additionalElementMap != null) {

+    map.addAll(additionalElementMap);

+  }

+  StringBuffer sb = new StringBuffer();

+  map.values.forEach((String element) {

+    sb.write('$element\n');

+  });

+  return sb.toString();

+}

+

+const Map<String, String> DEFAULT_CORE_LIBRARY = const <String, String>{

+  'bool': 'class bool {}',

+  'DateTime': r'''

+      class DateTime {

+        DateTime(year);

+        DateTime.utc(year);

+      }''',

+  'double': r'''

+      abstract class double extends num {

+        static var NAN = 0;

+        static parse(s) {}

+      }''',

+  'Function': 'class Function {}',

+  'identical': 'bool identical(Object a, Object b) { return true; }',

+  'int': 'abstract class int extends num { }',

+  'LinkedHashMap': r'''

+      class LinkedHashMap {

+        factory LinkedHashMap._empty() => null;

+        factory LinkedHashMap._literal(elements) => null;

+      }''',

+  'List': r'''

+      class List<E> {

+        var length;

+        List([length]);

+        List.filled(length, element);

+        E get first => null;

+        E get last => null;

+        E get single => null;

+        E removeLast() => null;

+        E removeAt(i) => null;

+        E elementAt(i) => null;

+        E singleWhere(f) => null;

+      }''',

+  'Map': 'abstract class Map<K,V> {}',

+  'Null': 'class Null {}',

+  'num': 'abstract class num {}',

+  'print': 'print(var obj) {}',

+  'proxy': 'const proxy = 0;',

+  'Object': r'''

+      class Object {

+        const Object();

+        operator ==(other) { return true; }

+        get hashCode => throw "Object.hashCode not implemented.";

+        String toString() { return null; }

+        noSuchMethod(im) { throw im; }

+      }''',

+  'StackTrace': 'abstract class StackTrace {}',

+  'String': 'class String implements Pattern {}',

+  'Type': 'class Type {}',

+  'Pattern': 'abstract class Pattern {}',

+};

+

+const String DEFAULT_PATCH_CORE_SOURCE = r'''

+import 'dart:_js_helper';

+import 'dart:_interceptors';

+import 'dart:_isolate_helper';

+''';

+

+const Map<String, String> DEFAULT_JS_HELPER_LIBRARY = const <String, String>{

+  'assertHelper': 'assertHelper(a) {}',

+  'assertIsSubtype': 'assertIsSubtype(subtype, supertype, message) {}',

+  'assertSubtype': 'assertSubtype(object, isField, checks, asField) {}',

+  'assertSubtypeOfRuntimeType': 'assertSubtypeOfRuntimeType(object, type) {}',

+  'boolConversionCheck': 'boolConversionCheck(x) {}',

+  'boolTypeCast': 'boolTypeCast(value) {}',

+  'boolTypeCheck': 'boolTypeCheck(value) {}',

+  'BoundClosure': r'''abstract class BoundClosure extends Closure {

+    var self;

+    var target;

+    var receiver;

+  }''',

+  'buildFunctionType':

+      r'''buildFunctionType(returnType, parameterTypes,

+                            optionalParameterTypes) {}''',

+  'buildInterfaceType': 'buildInterfaceType(rti, typeArguments) {}',

+  'buildNamedFunctionType':

+      r'''buildNamedFunctionType(returnType, parameterTypes,

+                                 namedParameters) {}''',

+  'checkFunctionSubtype':

+      r'''checkFunctionSubtype(var target, String signatureName,

+                               String contextName, var context,

+                               var typeArguments) {}''',

+  'checkMalformedType': 'checkMalformedType(value, message) {}',

+  'Closure': 'abstract class Closure implements Function { }',

+  'closureFromTearOff':

+      r'''closureFromTearOff(receiver, functions, reflectionInfo,

+                             isStatic, jsArguments, name) {}''',

+  'computeSignature':

+      'computeSignature(var signature, var context, var contextName) {}',

+  'ConstantMap': 'class ConstantMap {}',

+  'ConstantProtoMap': 'class ConstantProtoMap {}',

+  'ConstantStringMap': 'class ConstantStringMap {}',

+  'copyTypeArguments': 'copyTypeArguments(source, target) {}',

+  'createInvocationMirror': 'createInvocationMirror(a0, a1, a2, a3, a4, a5) {}',

+  'createRuntimeType': 'createRuntimeType(a) {}',

+  'doubleTypeCast': 'doubleTypeCast(value) {}',

+  'doubleTypeCheck': 'doubleTypeCheck(value) {}',

+  'functionSubtypeCast':

+      r'''functionSubtypeCast(Object object, String signatureName,

+                              String contextName, var context) {}''',

+  'functionTypeTestMetaHelper': r'''

+      functionTypeTestMetaHelper() {

+        buildFunctionType(null, null, null);

+        buildNamedFunctionType(null, null, null);

+        buildInterfaceType(null, null);

+      }''',

+  'getFallThroughError': 'getFallThroughError() {}',

+  'getIsolateAffinityTag': 'getIsolateAffinityTag(_) {}',

+  'getRuntimeTypeArgument':

+      'getRuntimeTypeArgument(target, substitutionName, index) {}',

+  'getRuntimeTypeArguments':

+      'getRuntimeTypeArguments(target, substitutionName) {}',

+  'getRuntimeTypeInfo': 'getRuntimeTypeInfo(a) {}',

+  'getTraceFromException': 'getTraceFromException(exception) {}',

+  'getTypeArgumentByIndex': 'getTypeArgumentByIndex(target, index) {}',

+  'GeneralConstantMap': 'class GeneralConstantMap {}',

+  'iae': 'iae(x) { throw x; } ioore(x) { throw x; }',

+  'interceptedTypeCast': 'interceptedTypeCast(value, property) {}',

+  'interceptedTypeCheck': 'interceptedTypeCheck(value, property) {}',

+  'intTypeCast': 'intTypeCast(value) {}',

+  'intTypeCheck': 'intTypeCheck(value) {}',

+  'IrRepresentation': 'class IrRepresentation {}',

+  'isJsIndexable': 'isJsIndexable(a, b) {}',

+  'JavaScriptIndexingBehavior': 'abstract class JavaScriptIndexingBehavior {}',

+  'JSInvocationMirror': 'class JSInvocationMirror {}',

+  'listSuperNativeTypeCast': 'listSuperNativeTypeCast(value) {}',

+  'listSuperNativeTypeCheck': 'listSuperNativeTypeCheck(value) {}',

+  'listSuperTypeCast': 'listSuperTypeCast(value) {}',

+  'listSuperTypeCheck': 'listSuperTypeCheck(value) {}',

+  'listTypeCast': 'listTypeCast(value) {}',

+  'listTypeCheck': 'listTypeCheck(value) {}',

+  'makeLiteralMap': 'makeLiteralMap(List keyValuePairs) {}',

+  'NoInline': 'class NoInline {}',

+  'NoSideEffects': 'class NoSideEffects {}',

+  'NoThrows': 'class NoThrows {}',

+  'numberOrStringSuperNativeTypeCast':

+      'numberOrStringSuperNativeTypeCast(value) {}',

+  'numberOrStringSuperNativeTypeCheck':

+      'numberOrStringSuperNativeTypeCheck(value) {}',

+  'numberOrStringSuperTypeCast': 'numberOrStringSuperTypeCast(value) {}',

+  'numberOrStringSuperTypeCheck': 'numberOrStringSuperTypeCheck(value) {}',

+  'numTypeCast': 'numTypeCast(value) {}',

+  'numTypeCheck': 'numTypeCheck(value) {}',

+  'patch': 'const patch = 0;',

+  'propertyTypeCast': 'propertyTypeCast(x) {}',

+  'propertyTypeCheck': 'propertyTypeCheck(value, property) {}',

+  'requiresPreamble': 'requiresPreamble() {}',

+  'RuntimeFunctionType': 'class RuntimeFunctionType {}',

+  'RuntimeTypePlain': 'class RuntimeTypePlain {}',

+  'runtimeTypeToString': 'runtimeTypeToString(type, {onTypeVariable(i)}) {}',

+  'S': 'S() {}',

+  'setRuntimeTypeInfo': 'setRuntimeTypeInfo(a, b) {}',

+  'stringSuperNativeTypeCast': 'stringSuperNativeTypeCast(value) {}',

+  'stringSuperNativeTypeCheck': 'stringSuperNativeTypeCheck(value) {}',

+  'stringSuperTypeCast': 'stringSuperTypeCast(value) {}',

+  'stringSuperTypeCheck': 'stringSuperTypeCheck(value) {}',

+  'stringTypeCast': 'stringTypeCast(x) {}',

+  'stringTypeCheck': 'stringTypeCheck(x) {}',

+  'subtypeCast': 'subtypeCast(object, isField, checks, asField) {}',

+  'subtypeOfRuntimeTypeCast': 'subtypeOfRuntimeTypeCast(object, type) {}',

+  'throwAbstractClassInstantiationError':

+      'throwAbstractClassInstantiationError(className) {}',

+  'throwCyclicInit': 'throwCyclicInit() {}',

+  'throwExpression': 'throwExpression(e) {}',

+  'throwNoSuchMethod':

+      'throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {}',

+  'throwRuntimeError': 'throwRuntimeError(message) {}',

+  'throwTypeError': 'throwTypeError(message) {}',

+  'TypeImpl': 'class TypeImpl {}',

+  'TypeVariable': 'class TypeVariable {}',

+  'unwrapException': 'unwrapException(e) {}',

+  'voidTypeCheck': 'voidTypeCheck(value) {}',

+  'wrapException': 'wrapException(x) { return x; }',

+};

+

+const Map<String, String> DEFAULT_FOREIGN_HELPER_LIBRARY

+    = const <String, String>{

+  'JS': r'''

+      dynamic JS(String typeDescription, String codeTemplate,

+        [var arg0, var arg1, var arg2, var arg3, var arg4, var arg5, var arg6,

+         var arg7, var arg8, var arg9, var arg10, var arg11]) {}''',

+};

+

+const Map<String, String> DEFAULT_INTERCEPTORS_LIBRARY = const <String, String>{

+  'findIndexForNativeSubclassType':

+      'findIndexForNativeSubclassType(type) {}',

+  'getDispatchProperty': 'getDispatchProperty(o) {}',

+  'getInterceptor': 'getInterceptor(x) {}',

+  'getNativeInterceptor': 'getNativeInterceptor(x) {}',

+  'initializeDispatchProperty': 'initializeDispatchProperty(f,p,i) {}',

+  'initializeDispatchPropertyCSP': 'initializeDispatchPropertyCSP(f,p,i) {}',

+  'interceptedNames': 'var interceptedNames;',

+  'Interceptor': r'''

+      class Interceptor {

+        toString() {}

+        bool operator==(other) => identical(this, other);

+        get hashCode => throw "Interceptor.hashCode not implemented.";

+        noSuchMethod(im) { throw im; }

+      }''',

+  'JSArray': r'''

+          class JSArray<E> extends Interceptor implements List<E>, JSIndexable {

+            JSArray();

+            factory JSArray.typed(a) => a;

+            var length;

+            operator[](index) => this[index];

+            operator[]=(index, value) { this[index] = value; }

+            add(value) { this[length + 1] = value; }

+            insert(index, value) {}

+            E get first => this[0];

+            E get last => this[0];

+            E get single => this[0];

+            E removeLast() => this[0];

+            E removeAt(index) => this[0];

+            E elementAt(index) => this[0];

+            E singleWhere(f) => this[0];

+          }''',

+  'JSBool': 'class JSBool extends Interceptor implements bool {}',

+  'JSDouble': 'class JSDouble extends JSNumber implements double {}',

+  'JSExtendableArray': 'class JSExtendableArray extends JSMutableArray {}',

+  'JSFixedArray': 'class JSFixedArray extends JSMutableArray {}',

+  'JSFunction':

+      'abstract class JSFunction extends Interceptor implements Function {}',

+  'JSIndexable': r'''

+      abstract class JSIndexable {

+        get length;

+        operator[](index);

+      }''',

+  'JSInt': r'''

+       class JSInt extends JSNumber implements int {

+         operator~() => this;

+       }''',

+  'JSMutableArray':

+      'class JSMutableArray extends JSArray implements JSMutableIndexable {}',

+  'JSMutableIndexable':

+      'abstract class JSMutableIndexable extends JSIndexable {}',

+      'JSPositiveInt': 'class JSPositiveInt extends JSInt {}',

+  'JSNull': r'''

+      class JSNull extends Interceptor {

+        bool operator==(other) => identical(null, other);

+        get hashCode => throw "JSNull.hashCode not implemented.";

+        String toString() => 'Null';

+        Type get runtimeType => null;

+        noSuchMethod(x) => super.noSuchMethod(x);

+      }''',

+  'JSNumber': r'''

+      class JSNumber extends Interceptor implements num {

+        // All these methods return a number to please type inferencing.

+        operator-() => (this is JSInt) ? 42 : 42.2;

+        operator +(other) => (this is JSInt) ? 42 : 42.2;

+        operator -(other) => (this is JSInt) ? 42 : 42.2;

+        operator ~/(other) => _tdivFast(other);

+        operator /(other) => (this is JSInt) ? 42 : 42.2;

+        operator *(other) => (this is JSInt) ? 42 : 42.2;

+        operator %(other) => (this is JSInt) ? 42 : 42.2;

+        operator <<(other) => _shlPositive(other);

+        operator >>(other) {

+          return _shrBothPositive(other) + _shrReceiverPositive(other) +

+            _shrOtherPositive(other);

+        }

+        operator |(other) => 42;

+        operator &(other) => 42;

+        operator ^(other) => 42;

+    

+        operator >(other) => true;

+        operator >=(other) => true;

+        operator <(other) => true;

+        operator <=(other) => true;

+        operator ==(other) => true;

+        get hashCode => throw "JSNumber.hashCode not implemented.";

+    

+        // We force side effects on _tdivFast to mimic the shortcomings of

+        // the effect analysis: because the `_tdivFast` implementation of

+        // the core library has calls that may not already be analyzed,

+        // the analysis will conclude that `_tdivFast` may have side

+        // effects.

+        _tdivFast(other) => new List()..length = 42;

+        _shlPositive(other) => 42;

+        _shrBothPositive(other) => 42;

+        _shrReceiverPositive(other) => 42;

+        _shrOtherPositive(other) => 42;

+    

+        abs() => (this is JSInt) ? 42 : 42.2;

+        remainder(other) => (this is JSInt) ? 42 : 42.2;

+        truncate() => 42;

+      }''',

+  'JSString': r'''

+      class JSString extends Interceptor implements String, JSIndexable {

+        var split;

+        var length;

+        operator[](index) {}

+        toString() {}

+        operator+(other) => this;

+      }''',

+  'JSUInt31': 'class JSUInt31 extends JSUInt32 {}',

+  'JSUInt32': 'class JSUInt32 extends JSPositiveInt {}',

+  'mapTypeToInterceptor': 'var mapTypeToInterceptor;',

+  'ObjectInterceptor': 'class ObjectInterceptor {}',

+  'PlainJavaScriptObject': 'class PlainJavaScriptObject {}',

+  'UnknownJavaScriptObject': 'class UnknownJavaScriptObject {}',

+};

+

+const Map<String, String> DEFAULT_ISOLATE_HELPER_LIBRARY =

+    const <String, String>{

+  'startRootIsolate': 'var startRootIsolate;',

+  '_currentIsolate': 'var _currentIsolate;',

+  '_callInIsolate': 'var _callInIsolate;',

+  '_WorkerBase': 'class _WorkerBase {}',

+};

+

+const Map<String, String> DEFAULT_MIRRORS_LIBRARY = const <String, String>{

+  'Comment': 'class Comment {}',

+  'MirrorSystem': 'class MirrorSystem {}',

+  'MirrorsUsed': 'class MirrorsUsed {}',

+};

+

diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index 27abe72..1c27681 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -13,8 +13,7 @@
 import "package:compiler/implementation/util/util.dart";
 
 import "package:compiler/implementation/elements/modelx.dart"
-    show CompilationUnitElementX,
-         LibraryElementX;
+    show CompilationUnitElementX, ElementX, LibraryElementX;
 
 import "package:compiler/implementation/dart2jslib.dart";
 
@@ -94,7 +93,7 @@
   parseBodyCode(text, (parser, tokens) => parser.parseStatement(tokens));
 
 Node parseFunction(String text, Compiler compiler) {
-  Element element = parseUnit(text, compiler, compiler.mainApp).head;
+  ElementX element = parseUnit(text, compiler, compiler.mainApp).head;
   Expect.isNotNull(element);
   Expect.equals(ElementKind.FUNCTION, element.kind);
   return element.parseNode(compiler);
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index a016613..3da4a32 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -8,22 +8,22 @@
 import "package:compiler/implementation/dart2jslib.dart";
 import "package:compiler/implementation/elements/elements.dart";
 import "package:compiler/implementation/tree/tree.dart";
-import "package:compiler/implementation/util/util.dart";
 import "mock_compiler.dart";
-import "parser_helper.dart";
+import "mock_libraries.dart";
+import 'package:compiler/implementation/elements/modelx.dart';
 
 Future<Compiler> applyPatch(String script, String patch,
                             {bool analyzeAll: false, bool analyzeOnly: false}) {
-  String core = "$DEFAULT_CORELIB\n$script";
+  Map<String, String> core = <String, String>{'script': script};
   MockCompiler compiler = new MockCompiler.internal(coreSource: core,
                                                     analyzeAll: analyzeAll,
                                                     analyzeOnly: analyzeOnly);
   var uri = Uri.parse("patch:core");
-  compiler.registerSource(uri, "$PATCH_CORE_SOURCE\n$patch");
+  compiler.registerSource(uri, "$DEFAULT_PATCH_CORE_SOURCE\n$patch");
   return compiler.init().then((_) => compiler);
 }
 
-void expectHasBody(compiler, Element element) {
+void expectHasBody(compiler, ElementX element) {
     var node = element.parseNode(compiler);
     Expect.isNotNull(node, "Element isn't parseable, when a body was expected");
     Expect.isNotNull(node.body);
@@ -33,7 +33,7 @@
     Expect.notEquals(node.body.getBeginToken(), node.body.getEndToken());
 }
 
-void expectHasNoBody(compiler, Element element) {
+void expectHasNoBody(compiler, ElementX element) {
     var node = element.parseNode(compiler);
     Expect.isNotNull(node, "Element isn't parseable, when a body was expected");
     Expect.isFalse(node.hasBody());
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 0bd931a..76ff4bb 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -39,7 +39,8 @@
 Future testLocals(List variables) {
   return MockCompiler.create((MockCompiler compiler) {
     ResolverVisitor visitor = compiler.resolverVisitor();
-    Element element = visitor.visit(createLocals(variables));
+    ResolutionResult result = visitor.visit(createLocals(variables));
+    Element element = result != null ? result.element : null;
     // A VariableDefinitions does not have an element.
     Expect.equals(null, element);
     Expect.equals(variables.length, map(visitor).length);
@@ -47,7 +48,9 @@
     for (final variable in variables) {
       final name = variable[0];
       Identifier id = buildIdentifier(name);
-      final VariableElement variableElement = visitor.visit(id);
+      ResolutionResult result = visitor.visit(id);
+      final VariableElement variableElement =
+          result != null ? result.element : null;
       MethodScope scope = visitor.scope;
       Expect.equals(variableElement, scope.elements[name]);
     }
@@ -311,7 +314,7 @@
   return MockCompiler.create((MockCompiler compiler) {
     ResolverVisitor visitor = compiler.resolverVisitor();
     Node tree = parseStatement("if (true) { var a = 1; var b = 2; }");
-    Element element = visitor.visit(tree);
+    ResolutionResult element = visitor.visit(tree);
     Expect.equals(null, element);
     MethodScope scope = visitor.scope;
     Expect.equals(0, scope.elements.length);
@@ -326,7 +329,7 @@
   return MockCompiler.create((MockCompiler compiler) {
     ResolverVisitor visitor = compiler.resolverVisitor();
     Node tree = parseStatement("{ var a = 1; if (true) { a; } }");
-    Element element = visitor.visit(tree);
+    ResolutionResult element = visitor.visit(tree);
     Expect.equals(null, element);
     MethodScope scope = visitor.scope;
     Expect.equals(0, scope.elements.length);
@@ -340,7 +343,7 @@
   return MockCompiler.create((MockCompiler compiler) {
     ResolverVisitor visitor = compiler.resolverVisitor();
     Node tree = parseStatement("{ var a = 1; if (true) { var a = 1; } }");
-    Element element = visitor.visit(tree);
+    ResolutionResult element = visitor.visit(tree);
     Expect.equals(null, element);
     MethodScope scope = visitor.scope;
     Expect.equals(0, scope.elements.length);
@@ -355,7 +358,7 @@
     ResolverVisitor visitor = compiler.resolverVisitor();
     If tree =
         parseStatement("if (true) { var a = 1; a; } else { var a = 2; a;}");
-    Element element = visitor.visit(tree);
+    ResolutionResult element = visitor.visit(tree);
     Expect.equals(null, element);
     MethodScope scope = visitor.scope;
     Expect.equals(0, scope.elements.length);
@@ -679,7 +682,7 @@
     {List expectedWarnings: const [],
      List expectedErrors: const [],
      List expectedInfos: const [],
-     String corelib: DEFAULT_CORELIB}) {
+     Map<String, String> corelib}) {
   MockCompiler compiler = new MockCompiler.internal(coreSource: corelib);
   return compiler.init().then((_) {
     compiler.parseScript(script);
@@ -915,28 +918,13 @@
     },
     () {
       String script = "";
-      final String CORELIB_WITH_INVALID_OBJECT =
-          '''print(var obj) {}
-             class int {}
-             class double {}
-             class bool {}
-             class String {}
-             class num {}
-             class Function {}
-             class List<E> {}
-             class Map {}
-             class Closure {}
-             class Null {}
-             class StackTrace {}
-             class Dynamic_ {}
-             class Type {}
-             class Object { Object() : super(); }
-             const proxy = 0;''';
+      final INVALID_OBJECT =
+          const { 'Object': 'class Object { Object() : super(); }' };
       return resolveConstructor(script,
           "Object o = new Object();", "Object", "", 1,
           expectedWarnings: [],
           expectedErrors: [MessageKind.SUPER_INITIALIZER_IN_OBJECT],
-          corelib: CORELIB_WITH_INVALID_OBJECT);
+          corelib: INVALID_OBJECT);
     },
   ], (f) => f());
 }
diff --git a/tests/compiler/dart2js/size_test.dart b/tests/compiler/dart2js/size_test.dart
index e6f7b25..423b5c2 100644
--- a/tests/compiler/dart2js/size_test.dart
+++ b/tests/compiler/dart2js/size_test.dart
@@ -8,24 +8,22 @@
 
 const String TEST = "main() => [];";
 
-const String DEFAULT_CORELIB_WITH_LIST = r'''
-  class Object {
-    Object();
-  }
-  class bool {}
-  abstract class List {}
-  class num {}
-  class int {}
-  class double {}
-  class String {}
-  class Function {}
-  class Null {}
-  class Type {}
-  class Map {}
-  class StackTrace {}
-  identical(a, b) => true;
-  const proxy = 0;
-''';
+const Map<String, String> DEFAULT_CORELIB_WITH_LIST = const <String, String>{
+  'Object': 'class Object { Object(); }',
+  'bool': 'class bool {}',
+  'List': 'abstract class List {}',
+  'num': 'class num {}',
+  'int': 'class int {}',
+  'double': 'class double {}',
+  'String': 'class String {}',
+  'Function': 'class Function {}',
+  'Null': 'class Null {}',
+  'Type': 'class Type {}',
+  'Map': 'class Map {}',
+  'StackTrace': 'class StackTrace {}',
+  'identical': 'identical(a, b) => true;',
+  'proxy': 'const proxy = 0;',
+};
 
 main() {
   asyncTest(() => compileAll(TEST, coreSource: DEFAULT_CORELIB_WITH_LIST).
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 55b31ba..6515eee 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -13,7 +13,7 @@
 import 'parser_helper.dart';
 
 import 'package:compiler/implementation/elements/modelx.dart'
-  show ElementX, CompilationUnitElementX, FunctionElementX;
+  show ClassElementX, CompilationUnitElementX, ElementX, FunctionElementX;
 
 import 'package:compiler/implementation/dart2jslib.dart';
 
@@ -1997,54 +1997,42 @@
 Node parseExpression(String text) =>
   parseBodyCode(text, (parser, token) => parser.parseExpression(token));
 
-const String NUM_SOURCE = '''
-abstract class num {
-  num operator +(num other);
-  num operator -(num other);
-  num operator *(num other);
-  num operator %(num other);
-  double operator /(num other);
-  int operator ~/(num other);
-  num operator -();
-  bool operator <(num other);
-  bool operator <=(num other);
-  bool operator >(num other);
-  bool operator >=(num other);
-}
-''';
-
-const String INT_SOURCE = '''
-abstract class int extends num {
-  int operator &(int other);
-  int operator |(int other);
-  int operator ^(int other);
-  int operator ~();
-  int operator <<(int shiftAmount);
-  int operator >>(int shiftAmount);
-  int operator -();
-}
-''';
-
-const String STRING_SOURCE = '''
-class String implements Pattern {
-  String operator +(String other) => this;
-}
-''';
+const Map<String, String> ALT_SOURCE = const <String, String>{
+  'num': r'''
+      abstract class num {
+        num operator +(num other);
+        num operator -(num other);
+        num operator *(num other);
+        num operator %(num other);
+        double operator /(num other);
+        int operator ~/(num other);
+        num operator -();
+        bool operator <(num other);
+        bool operator <=(num other);
+        bool operator >(num other);
+        bool operator >=(num other);
+      }
+      ''',
+  'int': r'''
+      abstract class int extends num {
+        int operator &(int other);
+        int operator |(int other);
+        int operator ^(int other);
+        int operator ~();
+        int operator <<(int shiftAmount);
+        int operator >>(int shiftAmount);
+        int operator -();
+      }
+      ''',
+  'String': r'''
+      class String implements Pattern {
+        String operator +(String other) => this;
+      }
+      ''',
+};
 
 Future setup(test(MockCompiler compiler)) {
-  RegExp classNum = new RegExp(r'abstract class num {}');
-  Expect.isTrue(DEFAULT_CORELIB.contains(classNum));
-  RegExp classInt = new RegExp(r'abstract class int extends num { }');
-  Expect.isTrue(DEFAULT_CORELIB.contains(classInt));
-  RegExp classString = new RegExp('class String implements Pattern {}');
-  Expect.isTrue(DEFAULT_CORELIB.contains(classString));
-
-  String CORE_SOURCE = DEFAULT_CORELIB
-      .replaceAll(classNum, NUM_SOURCE)
-      .replaceAll(classInt, INT_SOURCE)
-      .replaceAll(classString, STRING_SOURCE);
-
-  MockCompiler compiler = new MockCompiler.internal(coreSource: CORE_SOURCE);
+  MockCompiler compiler = new MockCompiler.internal(coreSource: ALT_SOURCE);
   return compiler.init().then((_) => test(compiler));
 }
 
@@ -2068,7 +2056,7 @@
     Link<Element> topLevelElements =
         parseUnit(text, compiler, library).reverse();
 
-    Element element = null;
+    ElementX element = null;
     Node node;
     TreeElements mapping;
     // Resolve all declarations and members.
@@ -2077,7 +2065,7 @@
          elements = elements.tail) {
       element = elements.head;
       if (element.isClass) {
-        ClassElement classElement = element;
+        ClassElementX classElement = element;
         classElement.ensureResolved(compiler);
         classElement.forEachLocalMember((Element e) {
           if (!e.isSynthesized) {
diff --git a/tests/compiler/dart2js/uri_retention_test.dart b/tests/compiler/dart2js/uri_retention_test.dart
new file mode 100644
index 0000000..fcdcdcc
--- /dev/null
+++ b/tests/compiler/dart2js/uri_retention_test.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.test.uri_retention_test;
+
+import 'dart:async';
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+
+import 'memory_compiler.dart' show
+    compilerFor;
+
+Future<String> compileSources(sources, {bool minify}) {
+  var compiler = compilerFor(sources, options: minify ? ['--minify'] : []);
+  return compiler.runCompiler(Uri.parse('memory:main.dart')).then((_) {
+    return compiler.assembledCode;
+  });
+}
+
+Future test(sources, { bool libName, bool fileName }) {
+  return compileSources(sources, minify: false).then((output) {
+    // Unminified the sources should always contain the library name and the
+    // file name.
+    Expect.isTrue(output.contains("main_lib"));
+    Expect.isTrue(output.contains("main.dart"));
+  }).then((_) {
+    compileSources(sources, minify: true).then((output) {
+      Expect.equals(libName, output.contains("main_lib"));
+      Expect.equals(fileName, output.contains("main.dart"));
+    });
+  });
+}
+
+void main() {
+  asyncTest(() {
+    return new Future.value()
+      .then((_) => test(MEMORY_SOURCE_FILES1, libName: false, fileName: false))
+      .then((_) => test(MEMORY_SOURCE_FILES2, libName: true, fileName: false))
+      .then((_) => test(MEMORY_SOURCE_FILES3, libName: true, fileName: true));
+  });
+}
+
+const MEMORY_SOURCE_FILES1 = const <String, String> {
+  'main.dart': """
+library main_lib;
+
+class A {
+  final uri = "foo";
+}
+
+main() {
+  print(Uri.base);
+  print(new A().uri);
+}
+""",
+};
+
+
+// Requires the library name, but not the URIs.
+const MEMORY_SOURCE_FILES2 = const <String, String> {
+  'main.dart': """
+library main_lib;
+
+@MirrorsUsed(targets: 'main_lib')
+import 'dart:mirrors';
+import 'file2.dart';
+
+class A {
+}
+
+main() {
+  print(Uri.base);
+  // Unfortunately we can't use new B().uri yet, because that would require
+  // some type-feedback to know that the '.uri' is not the one from the library.
+  print(new B());
+  print(reflectClass(A).declarations.length);
+}
+""",
+    'file2.dart': """
+library other_lib;
+
+class B {
+  final uri = "xyz";
+}
+""",
+};
+
+// Requires the uri (and will contain the library-name, too).
+const MEMORY_SOURCE_FILES3 = const <String, String> {
+  'main.dart': """
+library main_lib;
+
+@MirrorsUsed(targets: 'main_lib')
+import 'dart:mirrors';
+
+main() {
+  print(currentMirrorSystem().findLibrary(#main_lib).uri);
+}
+""",
+};
diff --git a/tests/compiler/dart2js/value_range_test.dart b/tests/compiler/dart2js/value_range_test.dart
index c77437b..0cdb5de 100644
--- a/tests/compiler/dart2js/value_range_test.dart
+++ b/tests/compiler/dart2js/value_range_test.dart
@@ -261,97 +261,9 @@
 // TODO(ahe): It would probably be better if this test used the real
 // core library sources, as its purpose is to detect failure to
 // optimize fixed-sized arrays.
-const String DEFAULT_CORELIB_WITH_LIST_INTERFACE = r'''
-  print(var obj) {}
-  abstract class num {}
-  abstract class int extends num { }
-  abstract class double extends num { }
-  class bool {}
-  class String {}
-  class Object {
-    Object();
-  }
-  class Type {}
-  class Function {}
-  class List {
-    List([int length]);
-  }
-  abstract class Map {}
-  class Closure {}
-  class Null {}
-  class Dynamic_ {}
-  class StackTrace {}
-  bool identical(Object a, Object b) {}
-  const proxy = 0;''';
-
-const String INTERCEPTORSLIB_WITH_MEMBERS = r'''
-  class Interceptor {
-    toString() {}
-    bool operator==(other) => identical(this, other);
-    noSuchMethod(im) { throw im; }
-  }
-  abstract class JSIndexable {
-    get length;
-  }
-  abstract class JSMutableIndexable extends JSIndexable {}
-  class JSArray implements JSIndexable {
-    JSArray() {}
-    JSArray.typed(a) => a;
-    var length;
-    var removeLast;
-    operator[] (_) {}
-  }
-  class JSMutableArray extends JSArray implements JSMutableIndexable {}
-  class JSFixedArray extends JSMutableArray {}
-  class JSExtendableArray extends JSMutableArray {}
-  class JSString implements JSIndexable {
-    var length;
-  }
-  class JSNumber {
-    operator +(other) {}
-    operator -(other) {}
-    operator ~/(other) {}
-    operator /(other) {}
-    operator *(other) {}
-    operator <<(other) {}
-    operator >>(other) {}
-    operator |(other) {}
-    operator &(other) {}
-    operator ^(other) {}
-    operator <(other) {}
-    operator >(other) {}
-    operator <=(other) {}
-    operator >=(other) {}
-    operator ==(other) {}
-  }
-  class JSInt extends JSNumber {
-    operator~() => this;
-  }
-  class JSDouble extends JSNumber {
-  }
-  class JSNull {
-    bool operator==(other) => identical(null, other);
-    get hashCode => throw "JSNull.hashCode not implemented.";
-    String toString() => 'Null';
-    Type get runtimeType => Null;
-    noSuchMethod(x) => super.noSuchMethod(x);
-  }
-  class JSBool {
-  }
-  class JSFunction {
-  }
-  class ObjectInterceptor {
-  }
-  class JSPositiveInt extends JSInt {}
-  class JSUInt32 extends JSPositiveInt {}
-  class JSUInt31 extends JSUInt32 {}
-  getInterceptor(x) {}''';
-
 Future expect(String code, int kind) {
   return compile(
       code,
-      coreSource: DEFAULT_CORELIB_WITH_LIST_INTERFACE,
-      interceptorsSource: INTERCEPTORSLIB_WITH_MEMBERS,
       check: (String generated) {
     switch (kind) {
       case REMOVED:
diff --git a/tests/html/html.status b/tests/html/html.status
index 5c904b4..5d43a77 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -56,7 +56,8 @@
 element_offset_test/offset: Skip # Issue 17550
 indexeddb_1_test/functional: RuntimeError # Issue 19127. Actually a timeout, but do not skip.
 mouse_event_test: Skip # Times out. Issue 19127
-request_animation_frame_test: Timeout # Issue 19127. Do not skip, for stability.
+request_animation_frame_test: Skip # Times out, and also passes while taking 4.00 minutes. Issue 19127.
+transition_event_test/functional: RuntimeError # Issue 19127
 xhr_test/xhr: RuntimeError # Issue 19127
 
 [ $compiler == none && $runtime == drt && $system == windows ]
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 96060d7..3718278 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -13,7 +13,6 @@
 serialization_test: SkipByDesign # Tests dart2js-specific serialization code
 compile_time_error_test/01: Skip # Issue 12587
 capability_test: Fail     # Not implemented yet
-pause_test: Fail          # Not implemented yet
 start_paused_test: Fail   # Not implemented yet
 ondone_test: Fail         # Not implemented yet
 ping_test: Fail           # Not implemented yet
@@ -26,6 +25,9 @@
 handle_error2_test: Fail  # Not implemented yet
 handle_error3_test: Fail  # Not implemented yet
 
+[ $compiler == none && $runtime == ContentShellOnAndroid ]
+*: Skip # Isolate tests are timing out flakily on Android content_shell.  Issue 19795
+
 [ $compiler == dart2js && $jscl ]
 browser/*: SkipByDesign  # Browser specific tests
 
@@ -79,6 +81,9 @@
 [ $jscl || $runtime == ie9 ]
 spawn_uri_multi_test/none: RuntimeError # http://dartbug.com/13544
 
+[ ($compiler == none || $compiler == dart2dart) && ($runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
+pause_test: Fail         # Not implemented yet
+
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 nested_spawn2_test: Skip # Issue 19127: This test is timing out.
 
diff --git a/tests/language/closure_variable_shadow_test.dart b/tests/language/closure_variable_shadow_test.dart
new file mode 100644
index 0000000..8f774b4
--- /dev/null
+++ b/tests/language/closure_variable_shadow_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// The intermediate variable 'y' must either be preserved 
+// or parameters must be renamed.
+
+foo(x) {
+    var y = x;
+    bar(x) {
+        return y - x;
+    }
+    return bar;
+}
+
+main() {
+    Expect.equals(-10, foo(10)(20));
+}
diff --git a/tests/language/deferred_inheritance_constraints_lib.dart b/tests/language/deferred_inheritance_constraints_lib.dart
new file mode 100644
index 0000000..87ed283
--- /dev/null
+++ b/tests/language/deferred_inheritance_constraints_lib.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Foo {}
+class Foo2 {}
\ No newline at end of file
diff --git a/tests/language/deferred_inheritance_constraints_test.dart b/tests/language/deferred_inheritance_constraints_test.dart
new file mode 100644
index 0000000..8fb023c
--- /dev/null
+++ b/tests/language/deferred_inheritance_constraints_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "deferred_inheritance_constraints_lib.dart" deferred as lib;
+
+class Foo {}
+class Foo2 extends D {}
+ 
+class A extends 
+  lib. /// extends: compile-time error
+  Foo {} 
+class B implements 
+  lib. /// implements: compile-time error
+  Foo {}
+class C1 {}
+class C = C1 with 
+  lib. /// mixin: compile-time error
+  Foo; 
+
+class D { 
+  D() ;
+  factory D.factory() = 
+    lib. /// redirecting_constructor: static type warning, runtime error
+    Foo2;
+}
+
+void main() {
+  new A();
+  new B();
+  new C();
+  new D.factory();
+}
\ No newline at end of file
diff --git a/tests/language/language.status b/tests/language/language.status
index 482b4ba..d951097 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -124,7 +124,6 @@
 closure7_test: Skip # Times out. Issue 19127
 abstract_exact_selector_test/01: Skip # Times out. Issue 19127
 function_subtype_local1_test: Skip # Times out. Issue 19127
-mixin_type_parameters_errors_test/02: Timeout # Times out. Do not skip, or more tests fail. Issue 19127
 
 [ $compiler == none && $runtime == vm && $arch == mips && $checked ]
 generic_instanceof3_test: Pass, Crash # Issue 17440.
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 0751709..7c9aa07 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -180,8 +180,13 @@
 closure_call_wrong_argument_count_negative_test: Skip
 label_test: Skip
 
-[ $compiler == dart2dart && $builder_tag == new_backend ]
-type_variable_conflict2_test/01: Fail # Issue 19725
+[ $compiler == dart2dart && $builder_tag == new_backend && $minified == false ]
+dynamic_test: RuntimeError # Issue 19751
+
+[ $compiler == dart2dart && $builder_tag == new_backend && $minified == false ]
+# This test happens not to fail in minified, because the type-argument is
+# renamed, but the unresolved reference to it is not.
+type_variable_conflict2_test/04: Fail # Issue 19725
 
 [ $compiler == dart2dart ]
 type_variable_conflict2_test/02: MissingCompileTimeError # Issue 19725
diff --git a/tests/language/range_analysis3_test.dart b/tests/language/range_analysis3_test.dart
new file mode 100644
index 0000000..5628e46
--- /dev/null
+++ b/tests/language/range_analysis3_test.dart
@@ -0,0 +1,210 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+confuse(x) {
+  if (new DateTime.now().millisecondsSinceEpoch == 0) {
+    return confuse(x + 1);
+  } else if (new DateTime.now().millisecondsSinceEpoch == 0) {
+    return confuse(x - 1);
+  }
+  return x;
+}
+
+test1() {
+  int x = 0;
+  // Give x a range of -1 to 0.
+  if (confuse(0) == 1) x = -1;
+
+  int y = 0;
+  // Give y a range of 0 to 1.
+  if (confuse(0) == 1) y = 1;
+
+  var zero = 0;
+
+  var status = "bad";
+  if (x < zero) {
+    Expect.fail("unreachable");
+  } else {
+    // Dart2js must not conclude that zero has a range of [-1, 0].
+    if (y <= zero) {
+      status = "good";
+    }
+  }
+  Expect.equals("good", status);
+}
+
+test2() {
+  int x = 0;
+  // Give x a range of -1 to 0.
+  if (confuse(0) == 1) x = -1;
+
+  int y = 0;
+  // Give y a range of -1 to 1.
+  if (confuse(0) == 1) y = 1;
+  if (confuse(1) == 2) y = -1;
+
+  var status = "good";
+  if (x < y) {
+    Expect.fail("unreachable");
+  } else {
+    // Dart2js must not conclude that y has a range of [-1, -1].
+    if (y == -1) {
+      status = "bad";
+    }
+  }
+  Expect.equals("good", status);
+}
+
+test3a() {
+  int x = 0;
+  // Give x a range of -1 to 1.
+  if (confuse(0) == 1) x = -1;
+  if (confuse(1) == 2) x = 1;
+
+  int y = 0;
+  // Give y a range of -1 to 1.
+  if (confuse(0) == 1) y = 1;
+  if (confuse(1) == 2) y = -1;
+
+  var status = "good";
+  if (x < y) {
+    Expect.fail("unreachable");
+  } else {
+    // Test that the range-analysis does not lose a value.
+    if (x <= -1) status = "bad";
+    if (x >= 1) status = "bad";
+    if (x < 0) status = "bad";
+    if (x > 0) status = "bad";
+    if (-1 >= x) status = "bad";
+    if (1 <= x) status = "bad";
+    if (0 > x) status = "bad";
+    if (0 < x) status = "bad";
+    if (y <= -1) status = "bad";
+    if (y >= 1) status = "bad";
+    if (y < 0) status = "bad";
+    if (y > 0) status = "bad";
+    if (-1 >= y) status = "bad";
+    if (1 <= y) status = "bad";
+    if (0 > y) status = "bad";
+    if (0 < y) status = "bad";
+  }
+  Expect.equals("good", status);
+}
+
+test3b() {
+  int x = 0;
+  // Give x a range of -2 to 0.
+  if (confuse(0) == 1) x = -2;
+
+  int y = 0;
+  // Give y a range of -1 to 1.
+  if (confuse(0) == 1) y = 1;
+  if (confuse(1) == 2) y = -1;
+
+  var status = "good";
+  if (x < y) {
+    Expect.fail("unreachable");
+  } else {
+    // Test that the range-analysis does not lose a value.
+    if (x <= -1) status = "bad";
+    if (x >= 1) status = "bad";
+    if (x < 0) status = "bad";
+    if (x > 0) status = "bad";
+    if (-1 >= x) status = "bad";
+    if (1 <= x) status = "bad";
+    if (0 > x) status = "bad";
+    if (0 < x) status = "bad";
+    if (y <= -1) status = "bad";
+    if (y >= 1) status = "bad";
+    if (y < 0) status = "bad";
+    if (y > 0) status = "bad";
+    if (-1 >= y) status = "bad";
+    if (1 <= y) status = "bad";
+    if (0 > y) status = "bad";
+    if (0 < y) status = "bad";
+  }
+  Expect.equals("good", status);
+}
+
+test4a() {
+  int x = -1;
+  // Give x a range of -1 to 1.
+  if (confuse(0) == 1) x = 1;
+
+  int y = 0;
+  // Give y a range of -1 to 1.
+  if (confuse(0) == 1) y = 1;
+  if (confuse(1) == 2) y = -1;
+
+  var status = "good";
+  if (x < y) {
+    // Test that the range-analysis does not lose a value.
+    if (x <= -2) status = "bad";
+    if (x >= 0) status = "bad";
+    if (x < -1) status = "bad";
+    if (x > -1) status = "bad";
+    if (-2 >= x) status = "bad";
+    if (0 <= x) status = "bad";
+    if (-1 > x) status = "bad";
+    if (-1 < x) status = "bad";
+    if (y <= -1) status = "bad";
+    if (y >= 1) status = "bad";
+    if (y < 0) status = "bad";
+    if (y > 0) status = "bad";
+    if (-1 >= y) status = "bad";
+    if (1 <= y) status = "bad";
+    if (0 > y) status = "bad";
+    if (0 < y) status = "bad";
+  } else {
+    Expect.fail("unreachable");
+  }
+  Expect.equals("good", status);
+}
+
+test4b() {
+  int x = -1;
+  // Give x a range of -2 to 0.
+  if (confuse(0) == 1) x = -2;
+  if (confuse(1) == 2) x = 0;
+
+  int y = 0;
+  // Give y a range of -1 to 1.
+  if (confuse(0) == 1) y = 1;
+  if (confuse(1) == 2) y = -1;
+
+  var status = "good";
+  if (x < y) {
+    // Test that the range-analysis does not lose a value.
+    if (x <= -2) status = "bad";
+    if (x >= 0) status = "bad";
+    if (x < -1) status = "bad";
+    if (x > -1) status = "bad";
+    if (-2 >= x) status = "bad";
+    if (0 <= x) status = "bad";
+    if (-1 > x) status = "bad";
+    if (-1 < x) status = "bad";
+    if (y <= -1) status = "bad";
+    if (y >= 1) status = "bad";
+    if (y < 0) status = "bad";
+    if (y > 0) status = "bad";
+    if (-1 >= y) status = "bad";
+    if (1 <= y) status = "bad";
+    if (0 > y) status = "bad";
+    if (0 < y) status = "bad";
+  } else {
+    Expect.fail("unreachable");
+  }
+  Expect.equals("good", status);
+}
+
+main() {
+  test1();
+  test2();
+  test3a();
+  test3b();
+  test4a();
+  test4b();
+}
\ No newline at end of file
diff --git a/tests/language/rewrite_implicit_this_test.dart b/tests/language/rewrite_implicit_this_test.dart
new file mode 100644
index 0000000..5d81669
--- /dev/null
+++ b/tests/language/rewrite_implicit_this_test.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+String toplevel = 'A';
+
+class Foo {
+    String x = 'x';
+
+    easy(z) {
+        return x + y + z; /// 01: static type warning
+    }
+
+    // Shadow the 'y' field in various ways
+    shadow_y_parameter(y) {
+        return x + this.y + y; /// 01: continued
+    }
+
+    shadow_y_local(z) {
+        var y = z;
+        return x + this.y + y; /// 01: continued
+    }
+
+    shadow_y_capturedLocal(z) {
+        var y = z;
+        foo() {
+            return x + this.y + y; /// 01: continued
+        }
+        return foo();
+    }
+
+    shadow_y_closureParam(z) {
+        foo(y) {
+            return x + this.y + y; /// 01: continued
+        }
+        return foo(z);
+    }
+
+    shadow_y_localInsideClosure(z) {
+        foo() {
+            var y = z;
+            return x + this.y + y; /// 01: continued
+        }
+        return foo();
+    }
+
+    // Shadow the 'x' field in various ways
+    shadow_x_parameter(x) {
+        return this.x + y + x; /// 01: continued
+    }
+
+    shadow_x_local(z) {
+        var x = z;
+        return this.x + y + x; /// 01: continued
+    }
+
+    shadow_x_capturedLocal(z) {
+        var x = z;
+        foo() {
+            return this.x + y + x; /// 01: continued
+        }
+        return foo();
+    }
+
+    shadow_x_closureParam(z) {
+        foo(x) {
+            return this.x + y + x; /// 01: continued
+        }
+        return foo(z);
+    }
+
+    shadow_x_localInsideClosure(z) {
+        foo() {
+            var x = z;
+            return this.x + y + x; /// 01: continued
+        }
+        return foo();
+    }
+
+    shadow_x_toplevel() {
+        return x + this.y + toplevel + this.toplevel; /// 01: continued
+    }
+    
+}
+
+class Sub extends Foo {
+    String y = 'y';
+    String toplevel = 'B';
+}
+
+main() {
+    Expect.equals('xyz', new Sub().easy('z')); /// 01: continued
+    Expect.equals('xyz', new Sub().shadow_y_parameter('z')); /// 01: continued
+    Expect.equals('xyz', new Sub().shadow_y_local('z')); /// 01: continued
+    Expect.equals('xyz', new Sub().shadow_y_capturedLocal('z')); /// 01: continued
+    Expect.equals('xyz', new Sub().shadow_y_closureParam('z')); /// 01: continued
+    Expect.equals('xyz', new Sub().shadow_y_localInsideClosure('z')); /// 01: continued
+    Expect.equals('xyz', new Sub().shadow_x_parameter('z')); /// 01: continued
+    Expect.equals('xyz', new Sub().shadow_x_local('z')); /// 01: continued
+    Expect.equals('xyz', new Sub().shadow_x_capturedLocal('z')); /// 01: continued
+    Expect.equals('xyz', new Sub().shadow_x_closureParam('z')); /// 01: continued
+    Expect.equals('xyz', new Sub().shadow_x_localInsideClosure('z')); /// 01: continued
+
+    Expect.equals('xyAB', new Sub().shadow_x_toplevel()); /// 01: continued
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 16dfa08..9edc720 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -69,7 +69,6 @@
 mirrors/library_imports_prefixed_test: RuntimeError # Issue 6490
 mirrors/library_imports_prefixed_show_hide_test: RuntimeError # Issue 6490
 mirrors/library_uri_io_test: Skip # Not intended for dart2js as it uses dart:io.
-mirrors/lru_test: Skip # dart2js_native/lru_test is used instead
 mirrors/metadata_allowed_values_test/01: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/05: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/10: MissingCompileTimeError # Issue 14548
@@ -208,6 +207,7 @@
 [ $runtime == ff ]
 # FF setTimeout can fire early: https://bugzilla.mozilla.org/show_bug.cgi?id=291386
 convert/streamed_conversion_utf8_decode_test: Pass, Slow  # Issue 12029
+convert/streamed_conversion_utf8_encode_test: Pass, Slow # Issue 12029
 mirrors/mirrors_reader_test: Timeout, Slow, RuntimeError # Issue 16589
 
 [ $runtime == ie9 ]
@@ -270,6 +270,9 @@
 async/timer_cancel2_test: Pass, Timeout # Issue 13719: Please triage this failure.
 
 [$compiler == none && $runtime == ContentShellOnAndroid ]
+async/stream_timeout_test: RuntimeError, Pass # Issue 19127
+convert/streamed_conversion_utf8_encode_test: Skip # Times out or passes. Issue 19127
+convert/streamed_conversion_utf8_decode_test: Skip # Times out or passes. Issue 19127
 mirrors/lazy_static_test: Skip # Times out. Issue 19127
 mirrors/mirrors_reader_test: Skip # Times out. Issue 19127
 
diff --git a/tests/lib/mirrors/lru_expect.dart b/tests/lib/mirrors/lru_expect.dart
deleted file mode 100644
index a048fcb..0000000
--- a/tests/lib/mirrors/lru_expect.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-
-expect(lruMapFactory) {
-  Expect.throws(() => lruMapFactory(0), (e) => e is Exception);
-
-  for (int shift = 1; shift < 5; shift++) {
-    var map = lruMapFactory(shift);
-    var capacity = (1 << shift) * 3 ~/ 4;
-    for (int value = 0; value < 100; value++) {
-      var key = "$value";
-      map[key] = value;
-      Expect.equals(value, map[key]);
-    }
-    for (int value = 0; value < 100 - capacity - 1; value++) {
-      var key = "$value";
-      Expect.equals(null, map[key]);
-    }
-    for (int value = 100 - capacity; value < 100; value++) {
-      var key = "$value";
-      Expect.equals(value, map[key]);
-    }
-  }
-}
diff --git a/tests/lib/mirrors/lru_test.dart b/tests/lib/mirrors/lru_test.dart
deleted file mode 100644
index 1a0c8fd..0000000
--- a/tests/lib/mirrors/lru_test.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-import "lru_expect.dart";
-
-newLRUMapWithShift(int shift) {
-  var lib = currentMirrorSystem().libraries[Uri.parse("dart:_internal")];
-  var cls = lib.declarations[#LRUMap];
-  return cls.newInstance(#withShift, [shift]).reflectee;
-}
-
-main() {
-  expect(newLRUMapWithShift);
-}
diff --git a/tests/standalone/io/http_compression_test.dart b/tests/standalone/io/http_compression_test.dart
index b5addc7..83e2fae 100644
--- a/tests/standalone/io/http_compression_test.dart
+++ b/tests/standalone/io/http_compression_test.dart
@@ -11,7 +11,7 @@
 import 'dart:io';
 import 'dart:typed_data';
 
-void testServerCompress() {
+void testServerCompress({bool clientAutoUncompress: true}) {
   void test(List<int> data) {
     HttpServer.bind("127.0.0.1", 0).then((server) {
       server.listen((request) {
@@ -19,6 +19,7 @@
         request.response.close();
       });
       var client = new HttpClient();
+      client.autoUncompress = clientAutoUncompress;
       client.get("127.0.0.1", server.port, "/")
           .then((request) {
             request.headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip,deflate");
@@ -32,7 +33,11 @@
                   list.addAll(b);
                   return list;
                 }).then((list) {
-                  Expect.listEquals(data, list);
+                  if (clientAutoUncompress) {
+                    Expect.listEquals(data, list);
+                  } else {
+                    Expect.listEquals(data, GZIP.decode(list));
+                  }
                   server.close();
                   client.close();
                 });
@@ -89,5 +94,6 @@
 
 void main() {
   testServerCompress();
+  testServerCompress(clientAutoUncompress: false);
   testAcceptEncodingHeader();
 }
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index 6b4c1f1..ad891b1 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -462,6 +462,43 @@
   HttpHeaders.REQUEST_HEADERS.forEach((x) => null);
 }
 
+void testInvalidFieldName() {
+  void test(String field) {
+    _HttpHeaders headers = new _HttpHeaders("1.1");
+    Expect.throws(() => headers.add(field, "value"),
+                  (e) => e is FormatException);
+    Expect.throws(() => headers.set(field, "value"),
+                  (e) => e is FormatException);
+    Expect.throws(() => headers.remove(field, "value"),
+                  (e) => e is FormatException);
+    Expect.throws(() => headers.removeAll(field),
+                  (e) => e is FormatException);
+  }
+  test('\r');
+  test('\n');
+  test(',');
+  test('test\x00');
+}
+
+void testInvalidFieldValue() {
+  void test(value, {bool remove: true}) {
+    _HttpHeaders headers = new _HttpHeaders("1.1");
+    Expect.throws(() => headers.add("field", value),
+                  (e) => e is FormatException);
+    Expect.throws(() => headers.set("field", value),
+                  (e) => e is FormatException);
+    if (remove) {
+      Expect.throws(() => headers.remove("field", value),
+                    (e) => e is FormatException);
+    }
+  }
+  test('\r');
+  test('\n');
+  test('test\x00');
+  // Test we handle other types correctly.
+  test(new StringBuffer('\x00'), remove: false);
+}
+
 main() {
   testMultiValue();
   testDate();
@@ -475,4 +512,6 @@
   testCookie();
   testInvalidCookie();
   testHeaderLists();
+  testInvalidFieldName();
+  testInvalidFieldValue();
 }
diff --git a/tests/standalone/slowpath_safepoints_test.dart b/tests/standalone/slowpath_safepoints_test.dart
new file mode 100644
index 0000000..254ad76
--- /dev/null
+++ b/tests/standalone/slowpath_safepoints_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test that safepoints associated with slowpaths don't mark non-existing values
+// alive.
+// VMOptions=--optimization-counter-threshold=5 --no-inline_alloc --gc_at_instance_allocation=_Double
+
+class C {
+  final next;
+  C(this.next);
+}
+
+
+noop(a1, a2, a3, a4, a5, a6, a7, a8, a9) => 0;
+
+crash(f, i) {
+  final obj1 = new C(null);
+  final obj2 = new C(obj1);
+  final obj3 = new C(obj2);
+  final obj4 = new C(obj3);
+  final obj5 = new C(obj4);
+  final obj6 = new C(obj5);
+  final obj7 = new C(obj6);
+  final obj8 = new C(obj7);
+  final obj9 = new C(obj8);
+
+  f(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9);
+  f(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9);
+
+  final d1 = (i + 0).toDouble();
+  final d2 = (i + 1).toDouble();
+  final d3 = (i + 2).toDouble();
+  final d4 = (i + 3).toDouble();
+  final d5 = (i + 4).toDouble();
+  final d6 = (i + 5).toDouble();
+  final d7 = (i + 6).toDouble();
+  final d8 = (i + 7).toDouble();
+  final d9 = (i + 8).toDouble();
+
+  f(d1, d2, d3, d4, d5, d6, d7, d8, d9);
+  f(d1, d2, d3, d4, d5, d6, d7, d8, d9);
+}
+
+main() {
+  for (var i = 0; i < 10; i++) {
+    print(i);
+    crash(noop, 10);
+  }
+}
diff --git a/tests/standalone/typed_data_test.dart b/tests/standalone/typed_data_test.dart
index 669bee0..f3eae2f 100644
--- a/tests/standalone/typed_data_test.dart
+++ b/tests/standalone/typed_data_test.dart
@@ -303,7 +303,8 @@
 
 testViewCreation() {
   var bytes = new Uint8List(1024).buffer;
-  var view = new ByteData.view(bytes, 24);
+  var view;
+  view = new ByteData.view(bytes, 24);
   Expect.equals(1000, view.lengthInBytes);
   view = new Uint8List.view(bytes, 24);
   Expect.equals(1000, view.lengthInBytes);
@@ -327,6 +328,74 @@
   Expect.equals(1000, view.lengthInBytes);
   view = new Float64List.view(bytes, 24);
   Expect.equals(1000, view.lengthInBytes);
+  view = new Int32x4List.view(bytes, 16);
+  Expect.equals(1008, view.lengthInBytes);  // Must be 16-byte aligned.
+  view = new Float32x4List.view(bytes, 16);
+  Expect.equals(1008, view.lengthInBytes);
+  view = new Float64x2List.view(bytes, 16);
+  Expect.equals(1008, view.lengthInBytes);
+
+  view = bytes.asByteData(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asUint8List(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asInt8List(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asUint8ClampedList(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asUint16List(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asInt16List(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asUint32List(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asInt32List(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asUint64List(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asInt64List(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asFloat32List(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asFloat64List(24);
+  Expect.equals(1000, view.lengthInBytes);
+  view = bytes.asInt32x4List(16);
+  Expect.equals(1008, view.lengthInBytes);
+  view = bytes.asFloat32x4List(16);
+  Expect.equals(1008, view.lengthInBytes);
+  view = bytes.asFloat64x2List(16);
+  Expect.equals(1008, view.lengthInBytes);
+
+  view = bytes.asByteData(24, 800);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asUint8List(24, 800);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asInt8List(24, 800);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asUint8ClampedList(24, 800);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asUint16List(24, 400);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asInt16List(24, 400);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asUint32List(24, 200 );
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asInt32List(24, 200);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asUint64List(24, 100);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asInt64List(24, 100);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asFloat32List(24, 200);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asFloat64List(24, 100);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asInt32x4List(32, 50);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asFloat32x4List(32, 50);
+  Expect.equals(800, view.lengthInBytes);
+  view = bytes.asFloat64x2List(32, 50);
+  Expect.equals(800, view.lengthInBytes);
 }
 
 testWhere() {
diff --git a/tests/try/cursor_position_test.dart b/tests/try/cursor_position_test.dart
index 36ff990..52ccb03 100644
--- a/tests/try/cursor_position_test.dart
+++ b/tests/try/cursor_position_test.dart
@@ -46,6 +46,18 @@
       simulateEnterKeyDown(interaction);
     }, checkAtBeginningOfSecondLine),
 
+    new TestCase('Clear and presetup the test', () {
+      clearEditorPaneWithoutNotifications();
+      mainEditorPane.text = 'var greeting = "Hello, World!\n";';
+    }, () {
+      checkLineCount(2);
+    }),
+
+    new TestCase('Test removing a split line', () {
+      mainEditorPane.nodes.first.nodes.last.remove();
+    }, () {
+      checkLineCount(1);
+    }),
   ]);
 }
 
diff --git a/tests/try/firefox.applescript b/tests/try/firefox.applescript
new file mode 100644
index 0000000..a7f674c
--- /dev/null
+++ b/tests/try/firefox.applescript
@@ -0,0 +1,57 @@
+-- Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+-- for details. All rights reserved. Use of this source code is governed by a
+-- BSD-style license that can be found in the LICENSE file.
+
+tell application "Firefox 29" to activate
+
+delay 3.0
+
+tell application "System Events"
+        keystroke "n" using command down
+
+        delay 1.0
+
+        keystroke "l" using command down
+
+        keystroke "http://localhost:8080/"
+        -- Simulate Enter key.
+        key code 36
+
+        delay 10.0
+
+        keystroke "l" using command down
+        -- Simulate Tab key.
+        key code 48
+        key code 48
+        key code 48
+        key code 48
+
+        -- Simulate End key.
+        key code 119
+
+        -- Simulate Home key.
+        key code 115
+
+        -- Simulate Tab key.
+        key code 48
+
+        -- Simulate Cmd-Up.
+        key code 126 using command down
+
+        -- Simulate Down.
+        key code 125
+        key code 125
+        key code 125
+        key code 125
+        key code 125
+
+        -- Simulate Cmd-Right.
+        key code 124 using command down
+
+        -- Simulate Delete
+        key code 51
+
+        -- Simulate Cmd-Down.
+        -- key code 125 using command down
+
+end tell
diff --git a/tests/try/paste_content_rewriting_test.dart b/tests/try/paste_content_rewriting_test.dart
index d04e7ac..6583c75 100644
--- a/tests/try/paste_content_rewriting_test.dart
+++ b/tests/try/paste_content_rewriting_test.dart
@@ -46,9 +46,8 @@
     String key = keys.current;
     print('Checking $key');
     queryDiagnosticNodes().forEach((Node node) {
-      node.parent.insertBefore(
-          new Text('<DIAGNOSTIC>'), node.parent.firstChild);
-      node.replaceWith(new Text('</DIAGNOSTIC>'));
+      node.parent.append(new Text('</DIAGNOSTIC>'));
+      node.replaceWith(new Text('<DIAGNOSTIC>'));
       observer.takeRecords(); // Discard mutations.
     });
     Expect.stringEquals(tests[key], mainEditorPane.text);
diff --git a/tests/try/safari.applescript b/tests/try/safari.applescript
new file mode 100644
index 0000000..299bcbc
--- /dev/null
+++ b/tests/try/safari.applescript
@@ -0,0 +1,144 @@
+-- Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+-- for details. All rights reserved. Use of this source code is governed by a
+-- BSD-style license that can be found in the LICENSE file.
+
+tell application "Safari" to activate
+
+delay 3.0
+
+tell application "System Events"
+
+        keystroke "n" using command down
+
+        delay 1.0
+
+        keystroke "l" using command down
+
+        keystroke "http://localhost:8080/"
+        -- Simulate Enter key.
+        key code 36
+
+        delay 5.0
+
+        keystroke "l" using command down
+        -- Simulate Tab key.
+        key code 48
+        key code 48
+
+        delay 0.2
+
+        -- Simulate Down.
+        key code 125
+
+        delay 0.2
+
+        -- Simulate Down.
+        key code 125
+
+        delay 0.2
+
+        -- Simulate Enter key.
+        key code 36
+
+        delay 0.2
+
+        -- Simulate Tab key.
+        key code 48
+
+        -- Simulate Cmd-Up.
+        key code 126 using command down
+
+        -- Simulate Down.
+        key code 125
+        key code 125
+        key code 125
+        key code 125
+        key code 125
+
+        -- Simulate Cmd-Right.
+        key code 124 using command down
+
+        -- Simulate Delete
+        key code 51
+
+        delay 0.1
+        keystroke "a" using command down
+        delay 0.2
+        keystroke "c" using command down
+
+        delay 0.2
+        set clipboardData to (the clipboard as text)
+
+        if ("main() {" is in (clipboardData as string)) then
+                error "main() { in clipboardData"
+        end if
+
+        if ("main() " is not in (clipboardData as string)) then
+                error "main() is not in clipboardData"
+        end if
+
+        keystroke "l" using command down
+        delay 0.2
+
+        keystroke "http://localhost:8080/"
+        -- Simulate Enter key.
+        key code 36
+
+        delay 5.0
+
+        keystroke "l" using command down
+        -- Simulate Tab key.
+        key code 48
+        key code 48
+
+        delay 0.2
+
+        -- Simulate Down.
+        key code 125
+
+        delay 0.2
+
+        -- Simulate Down.
+        key code 125
+
+        delay 0.2
+
+        -- Simulate Enter key.
+        key code 36
+
+        delay 0.2
+
+        -- Simulate Tab key.
+        key code 48
+
+        -- Simulate Cmd-Down.
+        key code 125 using command down
+
+        repeat 203 times
+                -- Simulate Delete
+               key code 51
+        end repeat
+        delay 5.0
+        repeat 64 times
+                -- Simulate Delete
+               key code 51
+        end repeat
+
+
+        delay 0.1
+        keystroke "a" using command down
+        delay 0.5
+        keystroke "c" using command down
+
+        delay 0.5
+        set clipboardData to (the clipboard as text)
+
+        if ("/" is not (clipboardData as string)) then
+                error "/ is not clipboardData"
+        end if
+
+end tell
+
+tell application "Safari" to quit
+
+display notification "Test passed" with title "Safari test" sound name "Glass"
diff --git a/tests/try/try.status b/tests/try/try.status
index 5e39fca..570362d 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -6,7 +6,7 @@
 # dart2js-drt (Content Shell --dump-render-tree)
 # dart2js-chrome
 # dart2js-ff (Firefox)
-[ $compiler != dart2js || ($runtime != drt && $runtime != chrome && $runtime != ff) ]
+[ $compiler != dart2js || ($runtime != drt && $runtime != chrome && $runtime != ff && $runtime != safari) ]
 *: Skip
 
 [ $compiler == dart2js && $runtime == drt ]
@@ -14,3 +14,6 @@
 
 [ $csp ]
 end_to_end_test: Fail, OK # http://dartbug.com/17935
+
+[ $runtime == safari ]
+cursor_position_test: Fail # http://dartbug.com/19836
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index 60a5ed74..2e858f0 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -12,98 +12,19 @@
 
 import 'package:compiler/compiler.dart';
 
+import '../compiler/dart2js/mock_libraries.dart';
+
 String libProvider(Uri uri) {
   if (uri.path.endsWith("/core.dart")) {
-    return """
-library core;
-class Object {
-  Object();
-  // Note: JSNull below must reimplement all members.
-  operator==(other) {}
-  get hashCode => throw 'Object.hashCode not implemented.';
-}
-class Type {}
-class bool {}
-class num {}
-class int {}
-class double{}
-class String{}
-class Function{}
-class List<E> {}
-class Map {}
-class Closure {}
-class BoundClosure {}
-class Dynamic_ {}
-class Null {}
-class StackTrace {}
-class LinkedHashMap {
-  factory LinkedHashMap._empty() => null;
-  factory LinkedHashMap._literal(elements) => null;
-}
-identical(a, b) => true;
-getRuntimeTypeInfo(o) {}
-setRuntimeTypeInfo(o, i) {}
-eqNull(a) {}
-eqNullB(a) {}
-const proxy = 0;""";
-  } else if (uri.path.endsWith('_patch.dart')) {
-    return """
-import 'dart:_js_helper';
-import 'dart:_interceptors';
-import 'dart:_isolate_helper';""";
+    return buildLibrarySource(DEFAULT_CORE_LIBRARY);
+  } else if (uri.path.endsWith('core_patch.dart')) {
+    return DEFAULT_PATCH_CORE_SOURCE;
   } else if (uri.path.endsWith('interceptors.dart')) {
-    return """
-class Interceptor {
-  operator==(other) {}
-  get hashCode => throw 'Interceptor.hashCode not implemented.';
-}
-abstract class JSIndexable {
-  get length;
-}
-abstract class JSMutableIndexable {}
-abstract class JSArray<E> implements JSIndexable {
-  JSArray() {}
-  factory JSArray.typed(a) => a;
-  var removeLast;
-  var add;
-}
-abstract class JSMutableArray extends JSArray {}
-abstract class JSFixedArray extends JSMutableArray {}
-abstract class JSExtendableArray extends JSMutableArray {}
-class JSString implements JSIndexable {
-  var split;
-  var concat;
-  operator+(other) {}
-  var toString;
-  get length => 0;
-}
-class JSFunction {}
-class JSInt {}
-class JSPositiveInt {}
-class JSUInt31 {}
-class JSUInt32 {}
-class JSDouble {}
-class JSNumber {}
-class JSNull {
-  bool operator ==(other) => identical(null, other);
-  int get hashCode => 0;
-}
-class JSBool {}
-getInterceptor(o){}
-getDispatchProperty(o) {}
-setDispatchProperty(o, v) {}
-var mapTypeToInterceptor;""";
+    return buildLibrarySource(DEFAULT_INTERCEPTORS_LIBRARY);
   } else if (uri.path.endsWith('js_helper.dart')) {
-    return """
-library jshelper; class JSInvocationMirror {}
-class ConstantMap {} class TypeImpl {}
-createRuntimeType(String name) => null;
-class Closure {}
-class BoundClosure extends Closure {}
-const patch = 0;
-""";
+    return buildLibrarySource(DEFAULT_JS_HELPER_LIBRARY);
   } else if (uri.path.endsWith('isolate_helper.dart')) {
-    return 'library isolatehelper; class _WorkerStub {}';
+    return buildLibrarySource(DEFAULT_ISOLATE_HELPER_LIBRARY);
   } else {
     return "library lib${uri.path.replaceAll('/', '.')};";
   }
@@ -140,7 +61,7 @@
     if (code == null) {
       throw 'Compilation failed';
     }
-  }, onError: (e) {
-      throw 'Compilation failed';
+  }, onError: (e, s) {
+      throw 'Compilation failed: $e\n$s';
   }).then(asyncSuccess);
 }
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index c1815e8..550b352 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -39,7 +39,7 @@
   int errorCount = 0;
   void handler(Uri uri, int begin, int end, String message, Diagnostic kind) {
     if (uri != null) {
-      // print('$uri:$begin:$end: $kind: $message');
+      print('$uri:$begin:$end: $kind: $message');
       Expect.equals('main', uri.scheme);
       if (kind == Diagnostic.WARNING) {
         warningCount++;
@@ -48,6 +48,8 @@
       } else {
         throw kind;
       }
+    } else {
+      print('$kind: $message');
     }
   }
 
@@ -64,7 +66,7 @@
     // first time.
     Expect.equals(2 * (count - 1), warningCount);
     Expect.equals(1, errorCount);
-  }, onError: (e) {
-      throw 'Compilation failed';
+  }, onError: (e, s) {
+      throw 'Compilation failed: $e\n$s';
   }).then(asyncSuccess);
 }
diff --git a/tests/utils/source_mirrors_test.dart b/tests/utils/source_mirrors_test.dart
index c61fafb..a29da99 100644
--- a/tests/utils/source_mirrors_test.dart
+++ b/tests/utils/source_mirrors_test.dart
@@ -30,7 +30,7 @@
         print(' $name:$declaration');
       });
     });
-  }, onError: (e) {
-      throw 'Analysis failed';
+  }, onError: (e, s) {
+      throw 'Analysis failed: $e\n$s';
   }).then(asyncSuccess);
 }
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 35e6cba..a720427 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -19,4 +19,8 @@
 [ $compiler == dart2js && $mode == debug ]
 source_mirrors_test: Slow, Pass
 dummy_compiler_test: Slow, Pass
-source_mirrors_test: Slow, Pass
+
+[ $compiler == none && $runtime == ContentShellOnAndroid ]
+dummy_compiler_test: Pass, RuntimeError # http://dartbug.com/17662
+recursive_import_test: Pass, RuntimeError # http://dartbug.com/17662
+source_mirrors_test: Pass, RuntimeError # http://dartbug.com/17662
diff --git a/tools/VERSION b/tools/VERSION
index 37f941a..9d5c800 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 6
 PATCH 0
-PRERELEASE 1
-PRERELEASE_PATCH 2
+PRERELEASE 2
+PRERELEASE_PATCH 0
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 5c02fb9..fb0c1c9 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -15,6 +15,7 @@
 import re
 import shutil
 import socket
+import string
 import subprocess
 import sys
 
@@ -23,19 +24,25 @@
 DARTIUM_BUILDER = r'none-dartium-(linux|mac|windows)'
 DART2JS_BUILDER = (
     r'dart2js-(linux|mac|windows)(-(jsshell))?-(debug|release)(-(checked|host-checked))?(-(host-checked))?(-(minified))?(-(x64))?(-(batch))?-?(\d*)-?(\d*)')
-DART2JS_FULL_BUILDER = r'dart2js-full-(linux|mac|windows)(-checked)?(-minified)?-(\d+)-(\d+)'
+DART2JS_FULL_BUILDER = r'full-(linux|mac|win7|win8)(-(ie10|ie11))?(-checked)?(-minified)?-(\d+)-(\d+)'
 WEB_BUILDER = (
     r'dart2js-(ie9|ie10|ie11|ff|safari|chrome|chromeOnAndroid|safarimobilesim|opera|drt)-(win7|win8|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
 
+IE_VERSIONS = ['ie10', 'ie11']
+
 DART2JS_FULL_CONFIGURATIONS = {
   'linux' : [ ],
   'mac' : [ ],
-  'windows' : [
-    {'runtime' : 'ie9'},
-    {'runtime' : 'ie9', 'additional_flags' : ['--checked']},
-    {'runtime' : 'ff'},
+  'windows-ie10' : [
+    {'runtime' : 'ie10'},
+    {'runtime' : 'ie10', 'additional_flags' : ['--checked']},
     {'runtime' : 'chrome'},
   ],
+  'windows-ie11' : [
+    {'runtime' : 'ie11'},
+    {'runtime' : 'ie11', 'additional_flags' : ['--checked']},
+    {'runtime' : 'ff'},
+  ],
 }
 
 
@@ -57,6 +64,7 @@
   arch = None
   dart2js_full = False
   batch = False
+  builder_tag = None
 
   dart2js_pattern = re.match(DART2JS_BUILDER, builder_name)
   dart2js_full_pattern = re.match(DART2JS_FULL_BUILDER, builder_name)
@@ -78,12 +86,20 @@
     compiler = 'dart2js'
     dart2js_full = True
     system = dart2js_full_pattern.group(1)
-    if dart2js_full_pattern.group(2):
+    # windows-ie10 or windows-ie11 means a windows machine with that respective
+    # version of ie installed. There is no difference in how we handle testing.
+    # We use the builder tag to pass along this information.
+    if system.startswith('win'):
+      ie =  dart2js_full_pattern.group(3)
+      assert ie in IE_VERSIONS
+      builder_tag = 'windows-%s' % ie
+      system = 'windows'
+    if dart2js_full_pattern.group(4):
       checked = True
-    if dart2js_full_pattern.group(3):
+    if dart2js_full_pattern.group(5):
       minified = True
-    shard_index = dart2js_full_pattern.group(4)
-    total_shards = dart2js_full_pattern.group(5)
+    shard_index = dart2js_full_pattern.group(6)
+    total_shards = dart2js_full_pattern.group(7)
   elif dart2js_pattern:
     compiler = 'dart2js'
     system = dart2js_pattern.group(1)
@@ -135,7 +151,8 @@
     return None
   return bot.BuildInfo(compiler, runtime, mode, system, checked, host_checked,
                        minified, shard_index, total_shards, is_buildbot,
-                       test_set, csp, arch, dart2js_full, batch=batch)
+                       test_set, csp, arch, dart2js_full, batch=batch,
+                       builder_tag=builder_tag)
 
 
 def NeedsXterm(compiler, runtime):
@@ -341,7 +358,9 @@
     arch = build_info.arch
     mode = build_info.mode
     is_buildbot = build_info.is_buildbot
-    for configuration in DART2JS_FULL_CONFIGURATIONS[system]:
+
+    config = build_info.builder_tag if system == 'windows' else system
+    for configuration in DART2JS_FULL_CONFIGURATIONS[config]:
       additional_flags = configuration.get('additional_flags', [])
       TestCompiler(configuration['runtime'], mode, system,
                    test_flags + additional_flags, is_buildbot, arch,
diff --git a/tools/dom/templates/html/impl/impl_EventTarget.darttemplate b/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
index 5551a1e..88ad1c1 100644
--- a/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
+++ b/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
@@ -22,10 +22,10 @@
  *
  * Custom events can be declared as:
  *
- *    class DataGenerator {
- *      static EventStreamProvider<Event> dataEvent =
- *          new EventStreamProvider('data');
- *    }
+ *     class DataGenerator {
+ *       static EventStreamProvider<Event> dataEvent =
+ *           new EventStreamProvider('data');
+ *     }
  *
  * Then listeners should access the event with:
  *
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index abaf1fe..f62af46 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -91,7 +91,7 @@
     const ['safari', 'ff', 'firefox', 'chrome', 'ie9', 'ie10',
            'ie11', 'dartium'];
 
-  static const List<String> BROWSERS_WITH_WINDOW_SUPPORT = const ['ie11'];
+  static const List<String> BROWSERS_WITH_WINDOW_SUPPORT = const [];
 
   // TODO(kustermann): add standard support for chrome on android
   static bool supportedBrowser(String name) {
@@ -741,7 +741,7 @@
 
   // This is currently not used for anything except for error reporting.
   // Given the usefulness of this in debugging issues this should not be
-  // removed even when we have really stable system.
+  // removed even when we have a really stable system.
   BrowserTest lastTest;
   bool timeout = false;
   Timer nextTestTimeout;
@@ -751,7 +751,7 @@
 
 
 /**
- * Describes a single test to be run int the browser.
+ * Describes a single test to be run in the browser.
  */
 class BrowserTest {
   // TODO(ricow): Add timeout callback instead of the string passing hack.
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 25fbe3d..ee50cfa 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -1341,7 +1341,8 @@
     if (packageRoot != null) args.add(packageRoot);
     args..add('package:polymer/deploy.dart')
         ..add('--test')..add(inputFile)
-        ..add('--out')..add(outputDir);
+        ..add('--out')..add(outputDir)
+        ..add('--file-filter')..add('.svn');
 
     return CommandBuilder.instance.getProcessCommand(
         'polymer_deploy', dartVmBinaryFileName, args, environmentOverrides);