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":";;;;;;;;;;;AAUA,OAAA,SAAA,OAAA,aAEA,OAAA,SAAA,OAAA,aAEA,SAAA,GAEA,GAAA,GAAA,EAAA,SAEA,UAAA,OAAA,MAAA,GAAA,MAAA,KAAA,QAAA,SAAA,GACA,EAAA,EAAA,MAAA,KACA,EAAA,KAAA,EAAA,EAAA,IAAA,EAAA,KAAA,IAEA,IAAA,GAAA,SAAA,eACA,SAAA,cAAA,6BACA,IAAA,EAEA,IAAA,GAAA,GADA,EAAA,EAAA,WACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,QAAA,EAAA,OACA,EAAA,EAAA,MAAA,EAAA,QAAA,EAIA,GAAA,KACA,EAAA,IAAA,MAAA,KAAA,QAAA,SAAA,GACA,OAAA,SAAA,IAAA,IAMA,EAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAEA,EAAA,OADA,WAAA,EAAA,QACA,EAEA,EAAA,SAAA,YAAA,UAAA,iBAIA,EAAA,QAAA,SAAA,iBAAA,UAAA,OAAA,GACA,QAAA,KAAA,mIAOA,EAAA,WAEA,OAAA,eAAA,OAAA,iBAAA,UACA,OAAA,eAAA,MAAA,SAAA,EAAA,UAIA,EAAA,UACA,OAAA,YAAA,OAAA,cAAA,UACA,OAAA,YAAA,MAAA,QAAA,EAAA,SC/DA,EAAA,MAAA,GACA,UAWA,mBAAA,WACA,WACA,GAAA,GAAA,OAAA,eACA,EAAA,KAAA,MAAA,IAEA,EAAA,WACA,KAAA,KAAA,QAAA,IAAA,KAAA,WAAA,IAAA,KAAA,MAGA,GAAA,WACA,IAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,KAAA,KACA,IAAA,EAAA,KAAA,EACA,EAAA,GAAA,EAEA,EAAA,EAAA,KAAA,MAAA,OAAA,EAAA,GAAA,UAAA,KAGA,IAAA,SAAA,GACA,GAAA,EACA,QAAA,EAAA,EAAA,KAAA,QAAA,EAAA,KAAA,ECnCA,EAAA,GAAA,QAEA,SAAA,SAAA,GACA,KAAA,IAAA,EAAA,UAIA,OAAA,QAAA,KAsBA,SACA,QACA,YAGA,SAAA,uBAUA,QAAA,GAAA,GACA,EAAA,EAVA,GAAA,kBAAA,QAAA,SACA,kBAAA,OAAA,QACA,OAAA,CAIA,IAAA,MAOA,KACA,IAcA,OAbA,QAAA,QAAA,EAAA,GAEA,MAAA,QAAA,EAAA,GACA,EAAA,GAAA,EAEA,EAAA,GAAA,QACA,GAAA,GAEA,EAAA,KAAA,EAAA,GAEA,EAAA,OAAA,EAEA,OAAA,qBAAA,GACA,IAAA,EAAA,QACA,EAGA,OAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,GAKA,OAAA,UAAA,EAAA,GACA,MAAA,UAAA,EAAA,IAGA,GAMA,QAAA,cAIA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QAEA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,GAAA,eAEA,OAAA,KACA,MAAA,GAEA,OAAA,GAMA,QAAA,SAAA,GACA,OAAA,IAAA,IAAA,EAGA,QAAA,UAAA,GACA,OAAA,EAIA,QAAA,UAAA,GACA,MAAA,KAAA,OAAA,GAUA,QAAA,cAAA,EAAA,GACA,MAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EAAA,EACA,YAAA,IAAA,YAAA,IACA,EAGA,IAAA,GAAA,IAAA,EA0BA,QAAA,iBAAA,GACA,GAAA,SAAA,EACA,MAAA,KAEA,IAAA,GAAA,EAAA,WAAA,EAEA,QAAA,GAEA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IAEA,MAAA,EAEA,KAAA,IACA,IAAA,IAEA,MAAA,OAEA,KAAA,IACA,IAAA,GACA,IAAA,IACA,IAAA,IACA,IAAA,KACA,IAAA,OACA,IAAA,MAEA,IAAA,MACA,MAAA,KAIA,MAAA,IAAA,IAAA,KAAA,GAAA,GAAA,IAAA,IAAA,EACA,QAIA,GAAA,IAAA,IAAA,EACA,SAGA,OAyFA,QAAA,SAEA,QAAA,WAAA,GA8BA,QAAA,KAEA,KAAA,GAAA,EAAA,QAAA,CAIA,GAAA,GAAA,EAAA,EAAA,EACA,OAAA,iBAAA,GAAA,KAAA,GAEA,iBAAA,GAAA,KAAA,GACA,IACA,EAAA,EAEA,EAAA,UACA,GAPA,QAaA,IAhDA,GAGA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAHA,KAEA,EAAA,GACA,EAAA,aAGA,GACA,KAAA,WAEA,SAAA,IAGA,EAAA,KAAA,GAEA,EAAA,SAIA,OAAA,WACA,SAAA,EAEA,EAAA,EAGA,GAAA,IAwBA,GAIA,GAHA,IACA,EAAA,EAAA,GAEA,MAAA,IAAA,EAAA,GAAA,CASA,GALA,EAAA,gBAAA,GACA,EAAA,iBAAA,GACA,EAAA,EAAA,IAAA,EAAA,SAAA,QAGA,SAAA,EACA,MAOA,IALA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,KAAA,KACA,EAAA,SAAA,EAAA,GAAA,EAAA,EAAA,GACA,IAEA,cAAA,EAEA,MAAA,IAQA,QAAA,SAAA,GACA,MAAA,aAAA,KAAA,GAMA,QAAA,MAAA,EAAA,GACA,GAAA,IAAA,qBACA,KAAA,OAAA,wCAEA,GAAA,QACA,MAAA,UAAA,KAAA,MAAA,KAAA,EAAA,SAGA,SAAA,KAAA,SACA,KAAA,aAAA,KAAA,0BAOA,QAAA,SAAA,GACA,GAAA,YAAA,MACA,MAAA,EAOA,KAJA,MAAA,GAAA,GAAA,EAAA,UAEA,EAAA,IAEA,gBAAA,GAAA,CAEA,GAAA,QAAA,EAAA,QAEA,MAAA,IAAA,MAAA,EAAA,qBAIA,GAAA,OAAA,GAIA,GAAA,GAAA,UAAA,EACA,IAAA,EAEA,MAAA,EAEA,IAAA,GAAA,UAAA,EACA,KAAA,EAEA,MAAA,YAEA,IAAA,GAAA,GAAA,MAAA,EAAA,qBAIA,OAFA,WAAA,GAAA,EAEA,EAKA,QAAA,gBAAA,GACA,MAAA,SAAA,GAEA,IAAA,EAAA,IAGA,KAAA,EAAA,QAAA,KAAA,OAAA,KA0GA,QAAA,YAAA,GAEA,IADA,GAAA,GAAA,EACA,uBAAA,GAAA,EAAA,UACA,GAKA,OAHA,QAAA,0BACA,OAAA,qBAAA,GAEA,EAAA,EAGA,QAAA,eAAA,GACA,IAAA,GAAA,KAAA,GACA,OAAA,CACA,QAAA,EAGA,QAAA,aAAA,GACA,MAAA,eAAA,EAAA,QACA,cAAA,EAAA,UACA,cAAA,EAAA,SAIA,QAAA,yBAAA,EAAA,GACA,GAAA,MACA,KACA,IAEA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,IAEA,SAAA,GAAA,IAAA,EAAA,MAGA,IAAA,GAKA,IAAA,EAAA,KACA,EAAA,GAAA,GALA,EAAA,GAAA,QASA,IAAA,GAAA,KAAA,GACA,IAAA,KAGA,EAAA,GAAA,EAAA,GAQA,OAHA,OAAA,QAAA,IAAA,EAAA,SAAA,EAAA,SACA,EAAA,OAAA,EAAA,SAGA,MAAA,EAEA,QAAA,EACA,QAAA,GAOA,QAAA,eACA,IAAA,SAAA,OACA,OAAA,CAGA,KAAA,GAAA,GAAA,EAAA,EAAA,SAAA,OAAA,IAEA,SAAA,IAGA,OADA,UAAA,OAAA,GACA,EAgCA,QAAA,qBAOA,QAAA,GAAA,GACA,GAAA,EAAA,SAAA,SAAA,GACA,EAAA,OAAA,GARA,GAAA,GACA,EACA,GAAA,EACA,GAAA,CAQA,QACA,KAAA,SAAA,GACA,GAAA,EAEA,KAAA,OAAA,wBAEA,IACA,OAAA,qBAAA,GAGA,EAAA,EACA,GAAA,GAEA,QAAA,SAAA,EAAA,GACA,EAAA,EACA,EAEA,MAAA,QAAA,EAAA,GAGA,OAAA,QAAA,EAAA,IAGA,QAAA,SAAA,GACA,EAAA,EACA,OAAA,qBAAA,GACA,GAAA,GAEA,MAAA,WACA,EAAA,OAEA,OAAA,UAAA,EAAA,GACA,oBAAA,KAAA,QAiCA,QAAA,mBAAA,EAAA,EAAA,GACA,GAAA,GAAA,oBAAA,OAAA,mBAGA,OAFA,GAAA,KAAA,GACA,EAAA,QAAA,EAAA,GACA,EAOA,QAAA,kBAQA,QAAA,GAAA,EAAA,GACA,IAIA,IAAA,IACA,EAAA,IAAA,GAEA,EAAA,QAAA,GAAA,IACA,EAAA,KAAA,GAEA,OAAA,QAAA,EAAA,IAIA,EAAA,OAAA,eAAA,GAAA,IAIA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,SAAA,GAEA,EAAA,EAAA,OACA,iBAAA,EAAA,KAEA,OAAA,EAIA,OAAA,EAIA,QAAA,GAAA,GACA,IAAA,EAAA,GAAA,CAIA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GAEA,EAAA,QAAA,QACA,EAAA,gBAAA,EAKA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GAEA,EAAA,QAAA,QACA,EAAA,UA7DA,GAIA,GACA,EALA,EAAA,EAEA,KACA,KAkEA,GACA,OAAA,OACA,QAAA,EACA,KAAA,SAAA,EAAA,GAEA,IACA,EAAA,EACA,MAIA,EAAA,KAAA,GAEA,IACA,EAAA,gBAAA,IAEA,MAAA,WAGA,GAFA,MAEA,EAAA,GAAA,CAMA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,OAAA,UAAA,EAAA,GAAA,GACA,SAAA,iBAIA,GAAA,OAAA,EACA,EAAA,OAAA,EACA,EAAA,OACA,EAAA,OACA,iBAAA,KAAA,QAOA,OAAA,GAKA,QAAA,gBAAA,EAAA,GAQA,MAPA,kBAAA,gBAAA,SAAA,IAEA,gBAAA,iBAAA,OAAA,iBAEA,gBAAA,OAAA,GAEA,gBAAA,KAAA,EAAA,GACA,gBAWA,QAAA,YACA,KAAA,OAAA,SAEA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,gBAAA,OACA,KAAA,OAAA,OACA,KAAA,IAAA,iBA0EA,QAAA,UAAA,GACA,SAAA,qBACA,kBAKA,aAAA,KAAA,GAIA,QAAA,iBACA,SAAA,qBAoFA,QAAA,gBAAA,GACA,SAAA,KAAA,MACA,KAAA,OAAA,EACA,KAAA,WAAA,OA6GA,QAAA,eAAA,GACA,IAAA,MAAA,QAAA,GACA,KAAA,OAAA,kCACA,gBAAA,KAAA,KAAA,GAwDA,QAAA,cAAA,EAAA,GACA,SAAA,KAAA,MAEA,KAAA,QAAA,EACA,KAAA,MAAA,QAAA,GAEA,KAAA,gBAAA,OA0DA,QAAA,kBAAA,GACA,SAAA,KAAA,MAEA,KAAA,qBAAA,EACA,KAAA,UACA,KAAA,gBAAA,OAEA,KAAA,aA+IA,QAAA,SAAA,GAAA,MAAA,GAGA,QAAA,mBAAA,EAAA,EAAA,EACA,GAEA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,EAEA,KAAA,YAAA,GAAA,QACA,KAAA,YAAA,GAAA,QAIA,KAAA,oBAAA,EAgEA,QAAA,6BAAA,EAAA,EAAA,GAKA,IAAA,GAHA,MACA,KAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,qBAAA,EAAA,OAQA,EAAA,OAAA,KAEA,EAAA,EAAA,MAAA,EAAA,UAEA,UAAA,EAAA,OAKA,OAAA,EAAA,KAYA,EAAA,OAAA,UACA,GAAA,EAAA,YAEA,GAAA,EAAA,OAEA,EAAA,EAAA,OAAA,EAhBA,EAAA,OAAA,SACA,GAAA,EAAA,MAEA,EAAA,EAAA,OAAA,KAnBA,QAAA,MAAA,8BAAA,EAAA,MACA,QAAA,MAAA,IAmCA,IAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAEA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,MAEA,IAAA,KACA,KAAA,GAAA,KAAA,GAEA,KAAA,IAAA,IAAA,IAAA,IAAA,CAKA,GAAA,GAAA,EAAA,EAEA,GAAA,KAAA,IACA,EAAA,GAAA,GAIA,OAEA,MAAA,EACA,QAAA,EACA,QAAA,GAMA,QAAA,WAAA,EAAA,EAAA,GACA,OAEA,MAAA,EAEA,QAAA,EACA,WAAA,GAWA,QAAA,gBC55CA,QAAA,aAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,MAAA,aAAA,YAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAIA,QAAA,WAAA,EAAA,EAAA,EAAA,GAEA,MAAA,GAAA,GAAA,EAAA,EACA,GAIA,GAAA,GAAA,GAAA,EACA,EAGA,EAAA,EACA,EAAA,EACA,EAAA,EAGA,EAAA,EAGA,EAAA,EACA,EAAA,EAEA,EAAA,EAKA,QAAA,aAAA,EAAA,EAAA,EAAA,GASA,IAAA,GAPA,GAAA,UAAA,EAAA,EAAA,GAGA,GAAA,EAEA,EAAA,EAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,GAAA,GAAA,EAAA,EAGA,IAFA,EAAA,OAAA,GAEA,EAAA,CAIA,GAAA,GAAA,UAAA,EAAA,MACA,EAAA,MAAA,EAAA,QAAA,OACA,EAAA,MAEA,EAAA,MAAA,EAAA,WAEA,IAAA,GAAA,EAAA,CAGA,EAAA,OAAA,EAAA,GACA,IAGA,GAAA,EAAA,WAAA,EAAA,QAAA,OAEA,EAAA,YAAA,EAAA,WAAA,CAEA,IAAA,GAAA,EAAA,QAAA,OACA,EAAA,QAAA,OAAA,CAGA,IAAA,EAAA,YAAA,EAGA,CACA,GAAA,GAAA,EAAA,OAGA,IAAA,EAAA,MAAA,EAAA,MAAA,CAGA,GAAA,GAAA,EAAA,QAAA,MAAA,EAAA,EAAA,MAAA,EAAA,MACA,OAAA,UAAA,KAAA,MAAA,EAAA,GACA,EAAA,EAGA,GAAA,EAAA,MAAA,EAAA,QAAA,OAAA,EAAA,MAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,QAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MACA,OAAA,UAAA,KAAA,MAAA,EAAA,GAIA,EAAA,QAAA,EACA,EAAA,MAAA,EAAA,QACA,EAAA,MAAA,EAAA,WAtBA,IAAA,MAyBA,IAAA,EAAA,MAAA,EAAA,MAAA,CAIA,GAAA,EAEA,EAAA,OAAA,EAAA,EAAA,GACA,GAEA,IAAA,GAAA,EAAA,WAAA,EAAA,QAAA,MACA,GAAA,OAAA,EACA,GAAA,IAIA,GAEA,EAAA,KAAA,GAGA,QAAA,sBAAA,EAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,EAAA,MAEA,IAAA,SACA,YAAA,EAAA,EAAA,MAAA,EAAA,QAAA,QAAA,EAAA,WACA,MACA,KAAA,MAEA,IAAA,SACA,IAAA,SACA,IAAA,QAAA,EAAA,MACA,QACA,IAAA,GAAA,SAAA,EAAA,KACA,IAAA,EAAA,EACA,QACA,aAAA,EAAA,GAAA,EAAA,UAAA,EACA,MACA,SACA,QAAA,MAAA,2BAAA,KAAA,UAAA,KAMA,MAAA,GAGA,QAAA,qBAAA,EAAA,GAEA,GAAA,KAeA,OAbA,sBAAA,EAAA,GAAA,QAAA,SAAA,GACA,MAAA,IAAA,EAAA,YAAA,GAAA,EAAA,QAAA,YACA,EAAA,QAAA,KAAA,EAAA,EAAA,QACA,EAAA,KAAA,SAMA,EAAA,EAAA,OAAA,YAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WACA,EAAA,QAAA,EAAA,EAAA,QAAA,YAGA,ED5QA,GAAA,YAAA,sBAqBA,QAAA,aAgBA,YAAA,OAAA,OAAA,OAAA,SAAA,GAEA,MAAA,gBAAA,IAAA,OAAA,MAAA,IAeA,aAAA,gBACA,SAAA,GAAA,MAAA,IACA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EACA,MAAA,EACA,IAAA,GAAA,OAAA,OAAA,EAMA,OALA,QAAA,oBAAA,GAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,MAGA,GAIA,WAAA,aACA,UAAA,gBAEA,YAAA,GAAA,QAAA,IAAA,WAAA,IAAA,UAAA,MAkDA,kBACA,YAEA,IAAA,cACA,OAAA,UAAA,UACA,KAAA,iBACA,KAAA,cAIA,QACA,IAAA,UACA,KAAA,eACA,KAAA,iBAEA,KAAA,cAGA,aACA,IAAA,eAEA,OAAA,UAAA,WAIA,SACA,OAAA,UAAA,UAEA,GAAA,UAAA,UACA,QAAA,UAAA,UACA,IAAA,SAAA,QACA,KAAA,cAAA,QAEA,KAAA,gBAAA,QACA,KAAA,YAAA,SAIA,eACA,IAAA,iBACA,GAAA,YAAA,UACA,QAAA,UAAA,UACA,KAAA,gBAAA,SAAA,IACA,KAAA,gBAAA,SAAA,KAIA,WAEA,IAAA,eAAA,QACA,KAAA,SAAA,SAGA,SACA,GAAA,UAAA,UACA,QAAA,UAAA,UACA,IAAA,gBACA,KAAA,SAAA,SAIA,eAEA,KAAA,gBACA,KAAA,SAEA,QAAA,gBAAA,WAIA,eACA,KAAA,gBAEA,KAAA,SACA,QAAA,gBAAA,WAIA,cACA,IAAA,gBACA,KAAA,SAAA,UA8FA,wBAgBA,YAwCA,MAAA,IAAA,QAYA,KAAA,UAAA,cAEA,aACA,OAAA,EAEA,SAAA,WAGA,IAAA,GAFA,GAAA,GAEA,EAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CACA,GAAA,GAAA,KAAA,EAEA,IADA,QAAA,GACA,EAAA,IAAA,EAAA,EAGA,eAAA,GAMA,MAAA,IAIA,aAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CACA,GAAA,MAAA,EAEA,MACA,GAAA,EAAA,KAAA,IAGA,MAAA,IAIA,eAAA,SAAA,EAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CAGA,GAFA,IACA,EAAA,EAAA,KAAA,EAAA,MACA,SAAA,GACA,MACA,GAAA,EAAA,KAAA,MAKA,uBAAA,WAEA,GAAA,GAAA,GACA,EAAA,KACA,IAAA,iBAGA,KAFA,GACA,GADA,EAAA,EAEA,EAAA,KAAA,OAAA,EAAA,IAEA,EAAA,KAAA,GACA,GAAA,QAAA,GAAA,IAAA,EAAA,eAAA,GACA,GAAA,aAAA,EAAA,UAGA,IAAA,KAEA,IAAA,GAAA,KAAA,EAKA,OAHA,IAAA,QAAA,GAAA,IAAA,EAAA,eAAA,GAEA,GAAA,YAAA,EAAA,+BACA,GAAA,UAAA,MAAA,IAGA,aAAA,SAAA,EAAA,GACA,IAAA,KAAA,OACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,EAAA,IAAA,CACA,IAAA,SAAA,GACA,OAAA,CAEA,GAAA,EAAA,KAAA,IAIA,MAAA,UAAA,IAIA,EAAA,KAAA,IAAA,GACA,IAJA,IASA,IAAA,aAAA,GAAA,MAAA,GAAA,qBACA,aAAA,OAAA,EACA,YAAA,aAAA,YAAA,aAAA,YAGA,IAAA,wBAAA,IAsEA,YAcA,OAAA,WAAA,WACA,GAAA,IAAA,UAAA,GACA,GAAA,CASA,OAPA,QAAA,QAAA,EAAA,WAEA,cACA,GAAA,IAIA,SAAA,GACA,SAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,UAAA,EAAA,cAKA,WACA,MAAA,UAAA,GACA,SAAA,KAAA,OAKA,uBAuFA,oBAsHA,gBAaA,SAAA,EACA,OAAA,EACA,OAAA,EAEA,UAAA,EAEA,eAAA,CAaA,UAAA,WACA,KAAA,SAAA,EAAA,GAEA,GAAA,KAAA,QAAA,SACA,KAAA,OAAA,oCAQA,OALA,UAAA,MACA,KAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,WACA,KAAA,OAAA,OACA,KAAA,QAIA,MAAA,WAEA,KAAA,QAAA,SAGA,cAAA,MACA,KAAA,cACA,KAAA,OAAA,OACA,KAAA,UAAA,OACA,KAAA,QAAA,OAEA,KAAA,OAAA,SAIA,QAAA,WACA,KAAA,QAAA,QAGA,WAAA,OAIA,QAAA,SAAA,GACA,IACA,KAAA,UAAA,MAAA,KAAA,QAAA,GAEA,MAAA,GACA,SAAA,4BAAA,EACA,QAAA,MAAA,+CAEA,EAAA,OAAA,MAIA,eAAA,WAIA,MAFA,MAAA,OAAA,QAAA,GAEA,KAAA,QAMA,IAAA,mBAAA,WAEA,YACA,UAAA,mBAAA,EAEA,mBACA,gBAmBA,IAAA,6BAAA,EAEA,0BAAA,YAAA,WACA,IAEA,MADA,MAAA,qBACA,EACA,MAAA,IAEA,OAAA,KAKA,QAAA,SAAA,OAAA,aAGA,OAAA,SAAA,2BAAA,WACA,IAAA,2BAAA,CAIA,GAAA,0BAGA,WADA,MAAA,mBAKA,IAAA,iBAAA,CAIA,4BAAA,CAGA,IAAA,QAAA,EAEA,WAAA,OAEA,GAAA,CACA,SACA,QAAA,aAEA,gBACA,YAAA,CAGA,KAAA,GAAA,GAAA,EAAA,EAAA,QAAA,OAAA,IAAA,CACA,GAAA,UAAA,QAAA,EACA,UAAA,QAAA,SAIA,SAAA,WACA,YAAA,GAGA,aAAA,KAAA,WAEA,gBACA,YAAA,SACA,uBAAA,QAAA,WAGA,QAAA,0BAEA,OAAA,qBAAA,QAEA,4BAAA,KAIA,mBAEA,OAAA,SAAA,eAAA,WACA,kBAWA,eAAA,UAAA,cACA,UAAA,SAAA,UAGA,cAAA,EAGA,SAAA,WACA,WAEA,KAAA,gBAAA,kBAAA,KAAA,KAAA,OACA,KAAA,cAEA,KAAA,WAAA,KAAA,WAAA,KAAA,SAMA,WAAA,SAAA,GACA,GAAA,GAAA,MAAA,QAAA,QACA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAMA,OAHA,OAAA,QAAA,KACA,EAAA,OAAA,EAAA,QAEA,GAGA,OAAA,SAAA,GACA,GAAA,GACA,CACA,IAAA,WAAA,CAEA,IAAA,EACA,OAAA,CAGA,MACA,EAAA,4BAAA,KAAA,OAAA,EACA,OAEA,GAAA,KAAA,WACA,EAAA,wBAAA,KAAA,OAAA,KAAA,WAIA,OAAA,aAAA,IAEA,GAEA,aAEA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SACA,EAAA,UACA,EAAA,YAEA,EAAA,YACA,SAAA,GAEA,MAAA,GAAA,OAIA,IAGA,YAAA,WAEA,YACA,KAAA,gBAAA,QACA,KAAA,gBAAA,QAEA,KAAA,WAAA,QAIA,QAAA,WACA,KAAA,QAAA,SAGA,WACA,KAAA,gBAAA,SAAA,GAGA,WAAA,QAIA,eAAA,WAQA,MAPA,MAAA,gBAEA,KAAA,gBAAA,SAAA,GAEA,KAAA,WAAA,KAAA,WAAA,KAAA,QAGA,KAAA,UAaA,cAAA,UAAA,cAEA,UAAA,eAAA,UAEA,cAAA,EAEA,WAAA,SAAA,GACA,MAAA,GAAA,SAGA,OAAA,SAAA,GAEA,GAAA,EACA,IAAA,WAAA,CACA,IAAA,EACA,OAAA,CACA,GAAA,oBAAA,KAAA,OAAA,OAEA,GAAA,YAAA,KAAA,OAAA,EAAA,KAAA,OAAA,OACA,KAAA,WAAA,EAAA,KAAA,WAAA,OAIA,OAAA,IAAA,EAAA,QAGA,aACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAGA,KAAA,SAAA,KACA,IAPA,KAYA,cAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,QAAA,SAAA,GAIA,IAFA,GAAA,IAAA,EAAA,MAAA,EAAA,QAAA,QACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,YACA,EAAA,KAAA,EAAA,IACA,GAIA,OAAA,UAAA,OAAA,MAAA,EAAA,MAaA,aAAA,UAAA,cACA,UAAA,SAAA,UAGA,GAAA,QACA,MAAA,MAAA,OAIA,SAAA,WACA,aACA,KAAA,gBAAA,eAAA,KAAA,KAAA,UAEA,KAAA,OAAA,QAAA,IAKA,YAAA,WACA,KAAA,OAAA,OAGA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAMA,gBAAA,SAAA,GACA,KAAA,MAAA,eAAA,KAAA,QAAA,IAGA,OAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,MAEA,OADA,MAAA,OAAA,KAAA,MAAA,aAAA,KAAA,SACA,GAAA,aAAA,KAAA,OAAA,IAEA,GAGA,KAAA,SAAA,KAAA,OAAA,EAAA,QACA,IAIA,SAAA,SAAA,GACA,KAAA,OAEA,KAAA,MAAA,aAAA,KAAA,QAAA,KAeA,IAAA,oBAEA,kBAAA,UAAA,cACA,UAAA,SAAA,UAGA,SAAA,WACA,GAAA,WAAA,CAKA,IAAA,GAJA,GAEA,GAAA,EAEA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAGA,GADA,EAAA,KAAA,UAAA,GACA,IAAA,iBAAA,CACA,GAAA,CACA,OAIA,IACA,KAAA,gBAAA,eAAA,KAAA,IAGA,KAAA,OAAA,QAAA,KAAA,uBAGA,YAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,KAAA,UAAA,KAAA,kBAEA,KAAA,UAAA,EAAA,GAAA,OAEA,MAAA,UAAA,OAAA,EACA,KAAA,OAAA,OAAA,EAGA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAKA,QAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,iCAEA,IAAA,GAAA,QAAA,EAEA,IADA,KAAA,UAAA,KAAA,EAAA,GACA,KAAA,qBAAA,CAGA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,aAAA,KAIA,YAAA,SAAA,GACA,GAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,qCAGA,IADA,KAAA,UAAA,KAAA,iBAAA,GACA,KAAA,qBAAA,CAEA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,KAAA,KAAA,QAAA,QAGA,WAAA,WACA,GAAA,KAAA,QAAA,OACA,KAAA,OAAA,4BAEA,MAAA,OAAA,UACA,KAAA,eAGA,YAAA,WAEA,GAAA,KAAA,QAAA,UACA,KAAA,OAAA,wCAKA,OAJA,MAAA,OAAA,OACA,KAAA,WAGA,KAAA,QAGA,gBAAA,SAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,EAAA,KAAA,UAAA,GACA,IAAA,kBACA,KAAA,UAAA,EAAA,GAAA,eAAA,EAAA,IAIA,OAAA,SAAA,EAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAAA,CACA,GAEA,GAFA,EAAA,KAAA,UAAA,GACA,EAAA,KAAA,UAAA,EAAA,EAEA,IAAA,IAAA,iBAAA,CAEA,GAAA,GAAA,CACA,GAAA,KAAA,SAAA,SACA,EAAA,KAAA,KAAA,QAAA,MAEA,EAAA,qBAEA,GAAA,EAAA,aAAA,EAGA,GACA,KAAA,OAAA,EAAA,GAAA,EAIA,aAAA,EAAA,KAAA,OAAA,EAAA,MAIA,EAAA,MACA,EAAA,EAAA,GAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,EAAA,GAAA,GAGA,MAAA,IAKA,KAAA,SAAA,KAAA,OAAA,EAAA,KAAA,aACA,IALA,KA8BA,kBAAA,WACA,KAAA,SAAA,EAAA,GAOA,MALA,MAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,OAEA,KAAA,YAAA,KAAA,YAAA,KAAA,KAAA,kBAAA,OACA,KAAA,QAGA,kBAAA,SAAA,GAEA,GADA,EAAA,KAAA,YAAA,IACA,aAAA,EAAA,KAAA,QAAA,CAEA,GAAA,GAAA,KAAA,MACA,MAAA,OAAA,EACA,KAAA,UAAA,KAAA,KAAA,QAAA,KAAA,OAAA,KAIA,eAAA,WAEA,MADA,MAAA,OAAA,KAAA,YAAA,KAAA,YAAA,kBACA,KAAA,QAIA,QAAA,WAEA,MAAA,MAAA,YAAA,WAGA,SAAA,SAAA,GAEA,MADA,GAAA,KAAA,YAAA,IACA,KAAA,qBAAA,KAAA,YAAA,SAEA,KAAA,YAAA,SAAA,GAFA,QAKA,MAAA,WACA,KAAA,aACA,KAAA,YAAA,QAEA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,YAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,OAEA,KAAA,YAAA,QAIA,IAAA,sBAEA,KAAA,EACA,QAAA,EACA,UAAA,GA0FA,WAAA,EACA,YAAA,EACA,SAAA,EAEA,YAAA,CAIA,aAAA,WAeA,kBAAA,SAAA,EAAA,EAAA,EAEA,EAAA,EAAA,GASA,IAAA,GANA,GAAA,EAAA,EAAA,EAEA,EAAA,EAAA,EAAA,EACA,EAAA,GAAA,OAAA,GAGA,EAAA,EAAA,EAAA,EAAA,IAEA,EAAA,GAAA,GAAA,OAAA,GACA,EAAA,GAAA,GAAA,CAMA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,GAAA,KAAA,OAAA,EAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,EAAA,GAAA,EAAA,OACA,CACA,GAAA,GAAA,EAAA,EAAA,GAAA,GAAA,EACA,EAAA,EAAA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAKA,MAAA,IAOA,kCAAA,SAAA,GAOA,IANA,GAAA,GAAA,EAAA,OAAA,EAEA,EAAA,EAAA,GAAA,OAAA,EACA,EAAA,EAAA,GAAA,GAEA,KACA,EAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAOA,GAAA,GAAA,EAAA,CAOA,GAIA,GAJA,EAAA,EAAA,EAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,EAAA,GAAA,EAAA,EAIA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAGA,EAAA,EAAA,EAAA,EAEA,GAAA,GACA,GAAA,EACA,EAAA,KAAA,aEnrDA,EAAA,KAAA,aACA,EAAA,GDAA,IACA,KAEA,GAAA,GAEA,EAAA,KAAA,aACA,IAEA,EAAA,IAEA,EAAA,KAAA,UAEA,IACA,EAAA,ODkpDA,GAAA,KAAA,aAEA,QATA,GAAA,KAAA,UAEA,GCvoDA,OAFA,GAAA,UAEA,GAgCA,YAAA,SAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,GAAA,GAAA,EACA,EAAA,EAEA,EAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAaA,IAZA,GAAA,GAAA,GAAA,IACA,EAAA,KAAA,aAAA,EAAA,EAAA,IAEA,GAAA,EAAA,QAAA,GAAA,EAAA,SACA,EAAA,KAAA,aAAA,EAAA,EAAA,EAAA,IAEA,GAAA,EAEA,GAAA,EACA,GAAA,EACA,GAAA,EAEA,EAAA,GAAA,GAAA,EAAA,GAAA,EACA,QAGA,IAAA,GAAA,EAAA,CAEA,IADA,GAAA,GAAA,UAAA,KAAA,GACA,EAAA,GACA,EAAA,QAAA,KAAA,EAAA,KAGA,QAAA,GACA,GAAA,GAAA,EACA,OAAA,UAAA,KAAA,EAAA,GAYA,KAAA,GATA,GAAA,KAAA,kCACA,KAAA,kBAAA,EAAA,EAAA,EACA,EAAA,EAAA,IAGA,EAAA,OACA,KACA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,OAAA,EAAA,IAEA,IAAA,YACA,IAEA,EAAA,KAAA,GACA,EAAA,QAIA,IAEA,GACA,MACA,KAAA,aAEA,IAEA,EAAA,UAAA,KAAA,IAEA,EAAA,aACA,IAEA,EAAA,QAAA,KAAA,EAAA,IACA,GACA,MAEA,KAAA,UACA,IACA,EAAA,UAAA,KAAA,IAGA,EAAA,aACA,GAEA,MACA,KAAA,aACA,IACA,EAAA,UAAA,KAAA,IAGA,EAAA,QAAA,KAAA,EAAA,IACA,IASA,MAHA,IACA,EAAA,KAAA,GAEA,GAIA,aAAA,SAAA,EAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,IAAA,KAAA,OAAA,EAAA,GAAA,EAAA,IACA,MAAA,EACA,OAAA,IAGA,aAAA,SAAA,EAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,OAEA,EAAA,EAAA,OACA,EAAA,EACA,EAAA,GAAA,KAAA,OAAA,IAAA,GAAA,IAAA,KACA,GAEA,OAAA,IAKA,iBAAA,SAAA,EAAA,GACA,MAAA,MAAA,YAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAEA,EAAA,SAGA,OAAA,SAAA,EAAA,GACA,MAAA,KAAA,GAIA,IAAA,aAAA,GAAA,YA8KA,QAAA,SAAA,SACA,OAAA,SAAA,QAAA,OACA,OAAA,SAAA,kBAAA,iBACA,OAAA,SAAA,iBAAA,WAEA,OAAA,cAAA,cACA,OAAA,cAAA,iBAAA,SAAA,EAAA,GACA,MAAA,aAAA,iBAAA,EAAA,IAIA,OAAA,YAAA,YACA,OAAA,eAAA,eACA,OAAA,aAAA,aACA,OAAA,iBAAA,iBAEA,OAAA,KAAA,KACA,OAAA,kBAAA,mBACA,mBAAA,SAAA,QAAA,mBAAA,SAAA,OAAA,OAAA,MAAA,QAIA,SAAA,MAAA,QAMA,OAAA,qBAEA,SAAA,GACA,YAMA,SAAA,KAIA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QACA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,eACA,OAAA,KACA,MAAA,GACA,OAAA,GAMA,QAAA,GAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,oBEvZA,QAAA,GAAA,EAAA,GAGA,IAAA,GAFA,GAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,EAAA,EAAA,EAAA,IAGA,MAAA,GAGA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GAEA,IAAA,YACA,IAAA,SACA,IAAA,SACA,IAAA,OACA,IAAA,YAEA,IAAA,WACA,SAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAGA,MAAA,GAIA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,IAAA,GACA,MAAA,GAAA,GCnCA,QAAA,GAAA,EAAA,EAAA,GAEA,EAAA,MAAA,EACA,EAAA,EAAA,EAAA,GAUA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,OAAA,eAAA,GACA,EAAA,EAAA,IAAA,EAEA,IAAA,EACA,MAAA,EAGA,IAAA,GAAA,EAAA,GAEA,EAAA,EAAA,EAGA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,GAeA,QAAA,GAAA,GACA,MAAA,aAAA,KAAA,GAIA,QAAA,GAAA,GACA,MAAA,oBAAA,KAAA,GAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,GACA,WAAA,MAAA,MAAA,KAAA,IAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,IAAA,aAAA,EAAA,QACA,SAAA,GAAA,KAAA,KAAA,GAAA,GAGA,QAAA,GAAA,GAEA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,EACA,gCACA,WAAA,MAAA,MAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAGA,QAAA,GAAA,EAAA,GACA,IACA,MAAA,QAAA,yBAAA,EAAA,GACA,MAAA,GAKA,MAAA,IAIA,QAAA,GAAA,EAAA,EAAA,GAGA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,sBAAA,KAGA,IAAA,IAGA,EAAA,mBAAA,EAAA,kBAAA,IAAA,CAIA,GAEA,EAAA,iBAAA,EAGA,IACA,GAAA,EADA,EAAA,EAAA,EAAA,EAEA,IAAA,GAAA,kBAAA,GAAA,MACA,EAAA,GAAA,EAAA,OADA,CAMA,GAAA,GAAA,EAAA,EAEA,GADA,EACA,EAAA,sBAAA,GAGA,EAAA,IAGA,EAAA,UAAA,EAAA,OAEA,EADA,EACA,EAAA,sBAAA,GAGA,EAAA,IAGA,EAAA,EAAA,GACA,IAAA,EACA,IAAA,EACA,aAAA,EAAA,aACA,WAAA,EAAA,gBAcA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,SACA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,SACA,GAAA,SAAA,EAAA,IAAA,IAGA,EAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAGA,EAAA,EAAA,GACA,GACA,EAAA,EAAA,GAGA,EAEA,EAAA,cAAA,GAGA,EAAA,UAAA,EAIA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,IAAA,EAAA,aACA,EAUA,QAAA,GAAA,GACA,GAAA,GAAA,OAAA,eAAA,GAEA,EAAA,EAAA,GACA,EAAA,EAAA,EAIA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,GAEA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAEA,GAAA,GAAA,OAAA,OAAA,EAAA,UAKA,OAJA,GAAA,YAAA,EACA,EAAA,UAAA,EAGA,EAcA,QAAA,GAAA,GAEA,MAAA,aAAA,GAAA,aACA,YAAA,GAAA,OACA,YAAA,GAAA,OACA,YAAA,GAAA,mBACA,YAAA,GAAA,0BACA,EAAA,uBACA,YAAA,GAAA,sBAGA,QAAA,GAAA,GAEA,MAAA,IAAA,YAAA,IACA,YAAA,IACA,YAAA,IAEA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IAEA,GAEA,YAAA,IACA,GACA,YAAA,GAUA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MAGA,EAAA,EAAA,IACA,EAAA,kBACA,EAAA,gBAAA,IAAA,EAAA,IAAA,KASA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MACA,EAAA,EAAA,IACA,EAAA,MASA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GAAA,EAAA,GAAA,EASA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,GAAA,EAAA,GAAA,EAUA,QAAA,GAAA,EAAA,GACA,OAAA,IAEA,EAAA,EAAA,IACA,EAAA,SAAA,GAAA,EAAA,IACA,EAAA,gBAAA,GAUA,QAAA,GAAA,EAAA,EAAA,GAEA,EAAA,IAAA,EACA,EAAA,EAAA,UAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,WACA,MAAA,GAAA,KAAA,KAAA,MAYA,QAAA,GAAA,EAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,UAAA,GAAA,WAEA,GAAA,GAAA,EAAA,KACA,OAAA,GAAA,GAAA,MAAA,EAAA,gBHsBA,GAAA,GAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,OAAA,OAAA,MAkBA,EAAA,IExZA,EAAA,OAAA,eACA,EAAA,OAAA,oBACA,EAAA,OAAA,yBA6CA,GChDA,MAAA,OACA,cAAA,EACA,YAAA,EACA,UAAA,EAeA,GAAA,OA2BA,IAAA,GAAA,UAAA,KAAA,UAAA,WAIA,GACA,IAAA,aACA,IAAA,aACA,cAAA,EACA,YAAA,GA+KA,EAAA,OAAA,kBACA,EAAA,OAAA,YACA,EAAA,OAAA,MACA,EAAA,OAAA,KACA,EAAA,OAAA,OACA,EAAA,OAAA,MACA,EAAA,OAAA,yBACA,EAAA,OAAA,sBACA,EAAA,OAAA,mBAiGA,GACA,IAAA,OACA,cAAA,EAEA,YAAA,EC/UA,GAAA,OAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EAEA,EAAA,iBAAA,EACA,EAAA,wBAAA,EAEA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,MAAA,EACA,EAAA,qBAAA,EACA,EAAA,MAAA,EACA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,OAAA,EACA,EAAA,OAAA,EACA,EAAA,eAAA,EACA,EAAA,KAAA,EACA,EAAA,aAAA,EACA,EAAA,SAAA,GAEA,OAAA,mBAUA,SAAA,GACA,YAQA,SAAA,KACA,GAAA,CACA,IAAA,GAAA,EAAA,MAAA,EACA,KACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,KAqBA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IAEA,GAAA,EACA,EAAA,EAAA,IAtCA,GAIA,GAJA,EAAA,OAAA,iBACA,KAEA,GAAA,CAaA,IAAA,EAAA,CACA,GAAA,GAAA,EACA,EAAA,GAAA,GAAA,GACA,EAAA,SAAA,eAAA,EACA,GAAA,QAAA,GAAA,eAAA,IAEA,EAAA,WAEA,GAAA,EAAA,GAAA,EACA,EAAA,KAAA,OAKA,GAAA,OAAA,cAAA,OAAA,UAYA,GAAA,kBAAA,GC9EA,OAAA,mBAUA,SAAA,GACA,YAWA,SAAA,KACA,IAEA,EAAA,GACA,GAAA,GAMA,QAAA,KACA,GAAA,CAGA,GAGA,KAAA,GAFA,GAAA,EAAA,QACA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,GAAA,GACA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,SAGA,GASA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EAEA,KAAA,WAAA,GAAA,GAAA,SACA,KAAA,aAAA,GAAA,GAAA,SACA,KAAA,gBAAA,KAEA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KAUA,QAAA,GAAA,EAAA,GACA,KAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAEA,GAAA,QAAA,SACA,EAAA,qBAAA,KAMA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,OAAA,GACA,EAAA,EAAA,IAAA,EACA,KAAA,EACA,MACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,WAAA,GACA,EAAA,6BAOA,QAAA,GAAA,EAAA,EAAA,GAQA,IAAA,GANA,GAAA,OAAA,OAAA,MAEA,EAAA,OAAA,OAAA,MAIA,EAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAGA,KAAA,IAAA,GAAA,EAAA,YAKA,eAAA,IAAA,EAAA,YAOA,eAAA,GAAA,EAAA,kBAEA,OAAA,EAAA,WACA,KAAA,EAAA,gBAAA,QAAA,EAAA,QAKA,kBAAA,IAAA,EAAA,eAMA,cAAA,IAAA,EAAA,WAAA,CAIA,GAAA,GAAA,EAAA,QACA,GAAA,EAAA,MAAA,GAOA,eAAA,GAAA,EAAA,mBACA,kBAAA,GAAA,EAAA,yBACA,EAAA,EAAA,MAAA,EAAA,YAMA,GAAA,IAAA,CAIA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,GAAA,GAAA,EAAA,EAKA,SAAA,IAAA,aAAA,KACA,EAAA,cAAA,EAAA,KAEA,EAAA,mBAAA,EAAA,WAKA,EAAA,aACA,EAAA,WAAA,EAAA,YAGA,EAAA,eACA,EAAA,aAAA,EAAA,cAGA,EAAA,kBACA,EAAA,gBAAA,EAAA,iBAIA,EAAA,cAEA,EAAA,YAAA,EAAA,aAIA,SAAA,EAAA,KACA,EAAA,SAAA,EAAA,IAIA,EAAA,SAAA,KAAA,GAEA,GAAA,EAIA,GACA,IASA,QAAA,GAAA,GA2BA,GAzBA,KAAA,YAAA,EAAA,UACA,KAAA,UAAA,EAAA,QAWA,KAAA,WALA,cAAA,MACA,qBAAA,IAAA,mBAAA,MAIA,EAAA,YAFA,EAUA,KAAA,cADA,yBAAA,MAAA,iBAAA,KACA,IAEA,EAAA,eAGA,KAAA,aACA,EAAA,mBAAA,mBAAA,MAEA,KAAA,eAAA,EAAA,sBAEA,KAAA,IAAA,UAOA,IAJA,KAAA,gBAAA,EAAA,cACA,KAAA,oBAAA,EAAA,kBACA,KAAA,wBAAA,EAAA,sBAEA,mBAAA,GAAA,CACA,GAAA,MAAA,EAAA,iBACA,gBAAA,GAAA,gBACA,KAAA,IAAA,UAEA,MAAA,gBAAA,EAAA,KAAA,EAAA,qBAGA,MAAA,gBAAA,KAeA,QAAA,GAAA,GACA,KAAA,UAAA,EAEA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,EAIA,EAAA,KAAA,MAgFA,QAAA,GAAA,EAAA,EAAA,GAEA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BA1XA,GAAA,GAAA,EAAA,kBAEA,EAAA,EAAA,aACA,EAAA,EAAA,SAEA,EAAA,GAAA,SACA,KACA,GAAA,EAiNA,EAAA,MAAA,UAAA,MA0DA,EAAA,CAuBA,GAAA,WAGA,QAAA,SAAA,EAAA,GACA,EAAA,EAAA,EAEA,IAIA,GAJA,EAAA,GAAA,GAAA,GAKA,EAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,KAGA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,WAAA,OACA,EAAA,EAAA,GAGA,EAAA,2BAEA,EAAA,QAAA,EAOA,KAEA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GAEA,KAAA,OAAA,KAAA,KAMA,WAAA,WAEA,KAAA,OAAA,QAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,WAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,UAIA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,IAuBA,EAAA,WAOA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAKA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,MAMA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,yBAGA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAIA,IAAA,GAHA,GAAA,EAAA,GAEA,EAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,KAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,UAOA,EAAA,gBAAA,EACA,EAAA,2BAAA,EACA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,eAAA,GAGA,OAAA,mBASA,SAAA,GACA,YAgBA,SAAA,GAAA,EAAA,GAEA,KAAA,KAAA,EAGA,KAAA,OAAA,EAqBA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,aAAA,EAAA,CACA,EAAA,WAAA,CACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,WAAA,OAAA,CAGA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,IAKA,QAAA,GAAA,GAKA,GAJA,YAAA,GAAA,SAAA,OAIA,EAAA,WACA,MAAA,GAAA,UACA,IACA,GADA,EAAA,EAAA,UAMA,OAHA,GADA,EACA,EAAA,GAEA,GAAA,GAAA,EAAA,MACA,EAAA,WAAA,EA5CA,EAAA,WACA,GAAA,YACA,MAAA,MAAA,eAAA,GAAA,SAAA,WACA,EAAA,mBAAA,KAAA,KAAA,MAEA,MAGA,SAAA,SAAA,GACA,KAAA,EAAA,EAAA,EAAA,OACA,GAAA,IAAA,KACA,OAAA,CAEA,QAAA,IAkCA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,aAAA,GAGA,OAAA,mBAOA,SAAA,GACA,YA6BA,SAAA,GAAA,GACA,MAAA,aAAA,GAAA,WAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAAA,KAKA,QAAA,GAAA,EAAA,GACA,GAAA,MACA,EAAA,CAGA,KAFA,EAAA,KAAA,GAEA,GAAA,CAEA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,EAAA,OAAA,EAAA,CAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAEA,IAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,eACA,IACA,EAAA,KAAA,GAKA,EAAA,KAAA,GAKA,EAAA,EAEA,EAAA,OAAA,OAIA,IAAA,EAAA,GAAA,CACA,GAAA,EAAA,EAAA,IAAA,EAAA,GAEA,KAEA,GAAA,EAAA,KACA,EAAA,KAAA,OAIA,GAAA,EAAA,WACA,GACA,EAAA,KAAA,GAMA,MAAA,GAKA,QAAA,GAAA,GACA,IAAA,EACA,OAAA,CAEA,QAAA,EAAA,MACA,IAAA,QACA,IAAA,QACA,IAAA,SACA,IAAA,SAEA,IAAA,OACA,IAAA,QAEA,IAAA,SACA,IAAA,SACA,IAAA,cACA,OAAA,EAGA,OAAA,EAIA,QAAA,GAAA,GACA,MAAA,aAAA,mBAKA,QAAA,GAAA,GACA,MAAA,GAAA,8BAAA,GAKA,QAAA,GAAA,EAAA,GAEA,GAAA,IAAA,EAAA,OACA,MAAA,EAIA,aAAA,GAAA,SACA,EAAA,EAAA,SASA,KAAA,GANA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,KAAA,EACA,MAAA,GAGA,MAAA,GAAA,EAAA,OAAA,GAIA,QAAA,GAAA,GAEA,IADA,GAAA,MACA,EAAA,EAAA,EAAA,OAEA,EAAA,KAAA,EAEA,OAAA,GAIA,QAAA,GAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAEA,EAAA,KACA,EAAA,OAAA,GAAA,EAAA,OAAA,GAAA,CACA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,KACA,IAAA,IAAA,EAGA,KAFA,GAAA,EAMA,MAAA,GASA,QAAA,GAAA,EAAA,EAAA,GAGA,YAAA,GAAA,SACA,EAAA,EAAA,SAEA,IAMA,GANA,EAAA,EAAA,GACA,EAAA,EAAA,GAGA,EAAA,EAAA,EAAA,GAKA,EACA,EAAA,EAAA,EAGA,KACA,EAAA,EAAA,KAGA,KAAA,GAAA,GAAA,EACA,EAEA,EAAA,EAAA,OAIA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,KAAA,EAEA,MAAA,GAKA,MAAA,MAGA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,KAAA,EAAA,GAcA,QAAA,GAAA,GAEA,IAAA,EAAA,IAAA,KAEA,EAAA,IAAA,GAAA,GAEA,EAAA,EAAA,GAAA,EAAA,EAAA,SACA,GAAA,CACA,GAAA,GAAA,CAEA,MADA,GAAA,KACA,GAKA,QAAA,GAAA,EAAA,GAEA,GAAA,EAAA,IAAA,GACA,KAAA,IAAA,OAAA,oBAGA,GAAA,IAAA,GAAA,GAKA,EAAA,kBACA,IAAA,GAQA,EACA,EAEA,EAAA,EAAA,IAMA,IAAA,SAAA,IAAA,EAAA,QAAA,CACA,GAAA,GAAA,CACA,aAAA,GAAA,WAAA,EAAA,EAAA,eACA,EAAA,EACA,MAIA,IAAA,EACA,GAAA,YAAA,GAAA,OAEA,EAAA,EACA,SAIA,IAFA,EAAA,EAAA,EAAA,GAEA,SAAA,EAAA,KAAA,CACA,GAAA,GAAA,EAAA,EAAA,OAAA,EACA,aAAA,GAAA,WACA,EAAA,EAAA,aAmBA,MAbA,GAAA,IAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,IAEA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,GAIA,EAAA,IAAA,EAAA,IACA,EAAA,OAAA,EAAA,MACA,EAAA,OAAA,GAEA,EAAA;CAIA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAEA,IAAA,IACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,CAIA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IACA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,OAAA,CAGA,QAAA,EAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GAEA,GAAA,GAAA,GCn4BA,EAAA,EAAA,IAAA,CACA,OAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GAGA,IAAA,GADA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAGA,IAAA,EAAA,OAAA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,GAKA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,KAAA,EACA,OAAA,CAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAEA,IAAA,IAAA,EAAA,CAEA,GAAA,IAAA,GAEA,OAAA,CAEA,KAAA,KAEA,EAAA,QAEA,IAAA,IAAA,KAAA,EAAA,QAEA,OAAA,CAGA,IAAA,iBAAA,GAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,aAOA,IAAA,EAAA,CAIA,GAAA,YAAA,SACA,EAAA,iBAAA,CACA,GAAA,GAAA,EAAA,GAEA,EACA,EAAA,EAAA,EAAA,EACA,IAAA,IAAA,EACA,OAAA,MAEA,GAAA,IAEA,GAAA,IAAA,EAAA,IAKA,EAAA,IAAA,EAAA,EACA,IAAA,GAAA,EAAA,KAGA,GAAA,CAEA,GAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAKA,EAAA,OAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,QAEA,GAAA,MAMA,MAAA,EAAA,OAAA,IACA,EAAA,SAAA,IAAA,IACA,EAAA,SAAA,IAAA,IAKA,IAQA,GANA,kBAAA,GAAA,QACA,EAAA,QAAA,KAAA,EAAA,GAGA,EAAA,QAAA,YAAA,GAEA,EAAA,IAAA,GACA,OAAA,EAEA,MAAA,GACA,IAEA,EAAA,ICrHA,GD2HA,EAAA,QC3HA,GAAA,IAAA,EAAA,MAAA,CACA,GAAA,GAAA,EAAA,OACA,GAAA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SAEA,EAAA,KAAA,EAAA,IAMA,OAAA,EAAA,IAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,QAAA,EACA,KAAA,QAAA,QAAA,GCdA,QAAA,GAAA,EAAA,GACA,KAAA,YAAA,KCNA,MAAA,GAAA,EAAA,GAAA,QAAA,EAAA,GDQA,IAAA,GAAA,CAEA,OAAA,KAAA,iBAAA,EAAA,UAGA,KAAA,KAAA,GAFA,GAAA,GAAA,GCuBA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,cAIA,OAAA,OAAA,GACA,eAAA,MAAA,EAAA,EAAA,kBAHA,EAOA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,OAAA,GACA,EAAA,SAAA,EAAA,GACA,MAAA,aAAA,QACA,KAAA,KAAA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAMA,IAJA,EAAA,UAAA,OAAA,OAAA,EAAA,WAEA,GACA,EAAA,EAAA,UAAA,GACA,EAOA,IACA,EAAA,EAAA,EAAA,GAAA,GAAA,SACA,MAAA,GACA,EAAA,EAAA,EACA,SAAA,YAAA,IAIA,MAAA,GAoBA,QAAA,GAAA,EAAA,GACA,MAAA,YACA,UAAA,GAAA,EAAA,UAAA,GACA,IAAA,GAAA,EAAA,KACA,GAAA,GAAA,MAAA,EAAA,YAsCA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAEA,MAAA,IAAA,GAAA,EAAA,EAAA,GAGA,IAAA,GAAA,EAAA,SAAA,YAAA,IACA,EAAA,GAAA,GAEA,GAAA,EAUA,OATA,QAAA,KAAA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,MAAA,GAAA,IAAA,GACA,EAAA,GAAA,EAAA,EACA,mBAAA,IACA,EAAA,EAAA,IAEA,EAAA,KAAA,KAEA,EAAA,OAAA,GAAA,MAAA,EAAA,GACA,EA+CA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAgBA,QAAA,GAAA,GACA,MAAA,kBAAA,IACA,EACA,GAAA,EAAA,YAGA,QAAA,GAAA,GACA,OAAA,GACA,IAAA,kBACA,IAAA,0BACA,IAAA,2BACA,IAAA,wBACA,IAAA,kBACA,IAAA,8BACA,IAAA,iBACA,IAAA,6BACA,IAAA,qBACA,OAAA,EAGA,OAAA,EAYA,QAAA,GAAA,GAEA,KAAA,KAAA,EAoBA,QAAA,GAAA,GAGA,MAFA,aAAA,GAAA,aACA,EAAA,EAAA,MACA,EAAA,GAwGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAEA,IAAA,EAAA,GAAA,SAAA,EAAA,GAAA,OAAA,EACA,OAAA,CAIA,QAAA,EAIA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,WAEA,GAAA,EAAA,EAAA,GAAA,GACA,OAAA,CAEA,QAAA,EAMA,QAAA,GAAA,GACA,EAAA,EAAA,IAOA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,kBAEA,IAAA,GAAA,EAAA,GAAA,KAAA,EAAA,KAAA,EAAA,GACA,KAAA,EACA,MAAA,KAEA,IAAA,GAAA,EAAA,EAAA,MAGA,EAAA,EAAA,YAAA,EACA,OAAA,IAAA,EAEA,MAGA,EAAA,EAAA,MAAA,EAAA,GAIA,EAAA,EAAA,IAQA,QAAA,GAAA,GACA,MAAA,YACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,IAAA,EAAA,IACA,EAAA,GAAA,OAAA,MAWA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,OAAA,UAAA,GACA,GAAA,GAAA,EAAA,IAAA,KAEA,KACA,EAAA,OAAA,OAAA,MACA,EAAA,IAAA,KAAA,GAIA,IAAA,GAAA,EAAA,EAIA,IAHA,GACA,KAAA,oBAAA,EAAA,EAAA,SAAA,GAEA,kBAAA,GAAA,CACA,GAAA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,KAAA,EACA,MAAA,EAEA,EAAA,iBACA,mBAAA,GAAA,gBAAA,KACA,EAAA,YAAA,GAMA,MAAA,iBAAA,EAAA,GAAA,GACA,EAAA,IACA,MAAA,EACA,QAAA,KJ0DA,GAuPA,GAvPA,EAAA,EAAA,wBAEA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SAIA,GADA,GAAA,SACA,GAAA,UACA,EAAA,GAAA,SAEA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SAsNA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,CE5vBA,GAAA,WACA,OAAA,SAAA,GACA,MAAA,MAAA,UAAA,EAAA,SAAA,KAAA,OAAA,EAAA,MAEA,KAAA,UAAA,EAAA,SAEA,GAAA,WACA,MAAA,QAAA,KAAA,SAEA,OAAA,WACA,KAAA,QAAA,MAKA,IAAA,IAAA,OAAA,KACA,IAAA,UAAA,mBACA,aAAA,EAIA,aAAA,GEvCA,EAAA,WAEA,GAAA,UACA,MAAA,GAAA,IAAA,OAGA,GAAA,iBACA,MAAA,GAAA,IAAA,OAEA,GAAA,cACA,MAAA,GAAA,IAAA,OAEA,GAAA,QACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,GAGA,EAAA,YAEA,gBAAA,WACA,EAAA,IAAA,MAAA,IAGA,yBAAA,WACA,EAAA,IAAA,MAAA,GACA,EAAA,IAAA,MAAA,KAIA,EAAA,GAAA,EAAA,SAAA,YAAA,SA0CA,IAAA,IAAA,EAAA,UAAA,GACA,GAAA,EAAA,cAAA,GAGA,IACA,GAAA,iBACA,GAAA,GAAA,EAAA,IAAA,KAGA,OAAA,UAAA,EACA,EACA,EAAA,EAAA,MAAA,iBAeA,GAAA,GACA,eAAA,EAAA,iBAAA,KACA,IAEA,GAAA,GAEA,eAAA,EAAA,iBAAA,IACA,IAGA,GAAA,EAAA,aAAA,GAAA,IACA,GAAA,EAAA,aAAA,GAAA,IAMA,GAAA,OAAA,OAAA,MAGA,GAAA,WACA,IACA,GAAA,QAAA,WAAA,SACA,MAAA,GACA,OAAA,EAEA,OAAA,IA8BA,KAAA,GAAA,CACA,GAAA,IAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,CAEA,GAAA,GAAA,GAAA,EACA,GAAA,EAAA,KAAA,GAAA,GAGA,GAAA,GAAA,EAOA,IAAA,SAAA,SAAA,EAAA,YAAA,IAEA,GAAA,eAAA,OAAA,MAAA,SACA,GAAA,WAAA,KAAA,KAAA,OAAA,GAAA,SACA,GAAA,cAEA,QAAA,EACA,QAAA,EACA,QAAA,EACA,QAAA,EAEA,SAAA,EACA,QAAA,EACA,UAAA,EAEA,SAAA,EACA,OAAA,EAEA,cAAA,MACA,WACA,GAAA,cAAA,cAAA,MAAA,WAMA,GAAA,IAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,KAAA,aAGA,GAAA,aAAA,GACA,KAAA,KAAA,YAAA,KAIA,IACA,EAAA,GAAA,EA0BA,IAAA,IAAA,OAAA,YAeA,IAEA,mBACA,sBACA,kBAIA,KAAA,QAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,IAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EAAA,KAAA,MAAA,EAAA,SAWA,EAAA,WAEA,iBAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,KAAA,EAAA,GAAA,CAGA,GAAA,GAAA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,IAAA,KAEA,IAAA,GAOA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,OAAA,EAAA,IACA,WAPA,MACA,EAAA,MAAA,EACA,EAAA,IAAA,KAAA,EAWA,GAAA,KAAA,EAGA,IAAA,GAAA,EAAA,KACA,GAAA,kBAAA,EAAA,GAAA,KAEA,oBAAA,SAAA,EAAA,EAAA,GAEA,EAAA,QAAA,EACA,IAAA,GAAA,EAAA,IAAA,KACA,IAAA,EAAA,CAIA,IAAA,GAFA,GAAA,EAAA,GAAA,EAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,OAAA,GAAA,EAAA,GAAA,UAAA,IACA,IACA,EAAA,GAAA,UAAA,IACA,GAAA,EAEA,EAAA,GAAA,UAMA,IAAA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KACA,GAAA,qBAAA,EAAA,GAAA,MAIA,cAAA,SAAA,GAcA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,IAKA,GAAA,IAAA,GAAA,GAIA,EAAA,kBAGA,IAAA,EACA,GAAA,KAAA,KACA,EAAA,aACA,KAAA,iBAAA,EAAA,GAAA,GAKA,KACA,MAAA,GAAA,MAAA,eAAA,GACA,QACA,GACA,KAAA,oBAAA,EAAA,GAAA,MA6BA,IACA,EAAA,GAAA,EAQA,IAAA,IAAA,SAAA,gBAqFA,GAAA,iBAAA,EACA,EAAA,sBAAA,EAEA,EAAA,sBAAA,EACA,EAAA,uBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,YAAA,GACA,EAAA,SAAA,MAAA,EACA,EAAA,SAAA,YAAA,EACA,EAAA,SAAA,WAAA,GAEA,EAAA,SAAA,WAAA,GACA,EAAA,SAAA,QAAA,IAEA,OAAA,mBAWA,SAAA,GACA,YA4BA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAGA,QAAA,GAAA,GACA,KAAA,KAAA,EA0CA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UAWA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,GAAA,GAAA,EAAA,GAIA,OAFA,GAAA,OAAA,EAEA,EAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAjGA,GAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,MAEA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAIA,EAAA,OAAA,UACA,IAAA,EAAA,CAIA,GAAA,EACA,KACA,EAAA,SAAA,YAAA,cACA,MAAA,GAGA,OAGA,GAAA,IAAA,YAAA,EAaA,GAAA,WACA,GAAA,UAEA,MAAA,GAAA,KAAA,KAAA,SAIA,IAAA,IACA,cAAA,EACA,YAAA,EACA,IAAA,OAKA,UACA,UAEA,UACA,UACA,QACA,QACA,aACA,gBAEA,gBACA,sBACA,eACA,QAAA,SAAA,GACA,EAAA,IAAA,WAEA,MAAA,MAAA,KAAA,IAEA,OAAA,eAAA,EAAA,UAAA,EAAA,KAUA,EAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAmBA,EAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAIA,GAAA,iBACA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,kBACA,MAAA,GAAA,EAAA,MAAA,iBAGA,eAAA,WAMA,KAAA,IAAA,OAAA,sBAKA,EAAA,EAAA,EAAA,GAGA,EAAA,SAAA,MAAA,EACA,EAAA,SAAA,WAAA,EACA,EAAA,SAAA,UAAA,IAEA,OAAA,mBAQA,SACA,GACA,YAOA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAIA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UAUA,QAAA,GAAA,GACA,GAAA,MAAA,EACA,MAAA,EAEA,KAAA,GADA,GAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IACA,EAAA,GAAA,EAAA,EAAA,GAGA,OADA,GAAA,OAAA,EACA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,UAAA,GAAA,WACA,MAAA,GAAA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,aAlCA,GAAA,GAAA,EAAA,KAEA,GAAA,YAAA,EAYA,GAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAGA,EAAA,EAAA,UAAA,QAoBA,EAAA,SAAA,SAAA,EACA,EAAA,sBAAA,EACA,EAAA,aAAA,GAEA,OAAA,mBAUA,SAAA,GAEA,YAIA,GAAA,mBAAA,EAAA,aACA,EAAA,SAAA,eAAA,EAAA,SAAA,UAGA,OAAA,mBCrtBA,SACA,GACA,YAwBA,SAAA,GAAA,GACA,EAAA,YAAA,IAIA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,EAIA,OAFA,GAAA,GAAA,EACA,EAAA,OAAA,EACA,EAcA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,aAEA,aAAA,EACA,gBAAA,EAAA,gBACA,YAAA,EAAA,cAKA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,aAAA,IAYA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,YAAA,kBAAA,CACA,GAAA,GAAA,EAAA,EAIA,IAAA,CACA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAEA,EAAA,YAAA,EAAA,IACA,EAAA,GAAA,YAAA,CAGA,IAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,iBAAA,EAAA,EAAA,IAAA,EACA,EAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAWA,OAPA,KAEA,EAAA,aAAA,EAAA,IACA,IACA,EAAA,iBAAA,EAAA,EAAA,OAAA,IAGA,EC9GA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAkBA,OAhBA,IAGA,EAAA,YAAA,GAIA,EAAA,YAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EACA,IAEA,EAAA,aAAA,GACA,IACA,EAAA,iBAAA,GAEA,EAIA,QAAA,GAAA,GACA,GAAA,YAAA,kBACA,MAAA,GAAA,EAGA,IAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAIA,OAFA,IACA,EAAA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAEA,EAAA,KAAA,CAIA,OAFA,GAAA,OAAA,EACA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAEA,MAAA,GAKA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,kBAIA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GAAA,GAMA,QAAA,GAAA,GAEA,EAAA,EAAA,GAAA,GAAA,EAAA,OCxEA,QAAA,GAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,IAKA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAAA,cAEA,EAAA,EAAA,aAEA,KAAA,EAAA,eACA,EAAA,UAAA,GAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,OAAA,CAGA,GAAA,GAAA,EAAA,aAGA,IAAA,IAAA,EAAA,GAAA,cAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,kBAAA,EAAA,GAAA,IAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,EAAA,MAIA,IAAA,IAAA,EACA,MAAA,GAAA,EAAA,GCzCA,KAAA,GD4CA,GAAA,EAAA,EAAA,cAAA,0BC5CA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,YAAA,EAAA,EAAA,IAGA,OAAA,GAIA,QAAA,GAAA,GACA,GAAA,SAAA,EAAA,YAGA,IAFA,GAAA,GAAA,EAAA,YAEA,GAAA,CACA,GAAA,GAAA,CACA,GAAA,EAAA,aAEA,EAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,OAIA,EAAA,YAAA,EAAA,WAAA,OAGA,QAAA,GAAA,GACA,GAAA,EAAA,2BAAA,CAEA,IADA,GAAA,GAAA,EAAA,WACA,GAAA,CACA,EAAA,EAAA,aAAA,EACA,IAAA,GAAA,EAAA,YACA,EAAA,EAAA,GACA,EAAA,EAAA,UACA,IACA,EAAA,KAAA,EAAA,GACA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,KACA,EAAA,EAGA,EAAA,YAAA,EAAA,WAAA,SCpCA,KDuCA,GCxCA,GDwCA,EAAA,EAAA,GCzCA,EAAA,EAAA,WAEA,GAEA,EAAA,EAAA,YACA,EAAA,KAAA,EAAA,GAEA,EAAA,EAMA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,UAEA,OAAA,IAAA,EAAA,2BAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,WAAA,YAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EAMA,IAJA,EAAA,EADA,EACA,EAAA,KAAA,EAAA,EAAA,MAAA,GAEA,EAAA,KAAA,EAAA,MAAA,IAEA,EAAA,CACA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,GAGA,IAAA,YAAA,GAAA,oBAGA,IAAA,GAFA,GAAA,EAAA,QAEA,EAAA,EAAA,QAAA,WACA,EC7CA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,IAOA,MAAA,GAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,EAAA,KAAA,EAAA,GACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WACA,GAAA,IAAA,EACA,OAAA,CAEA,QAAA,EAeA,QAAA,GAAA,GAEA,EAAA,YAAA,IAEA,EAAA,KAAA,KAAA,GAYA,KAAA,YAAA,OAMA,KAAA,YAAA,OAQA,KAAA,WAAA,OAQA,KAAA,aAAA,OASA,KAAA,iBAAA,OAEA,KAAA,WAAA,OLtEA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,SACA,EAAA,EAAA,UACA,EAAA,EAAA,OACA,EAAA,EAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,UACA,EAAA,EAAA,MAEA,EAAA,EAAA,2BACA,EAAA,EAAA,gBACA,EAAA,EAAA,aAEA,EAAA,EAAA,OAEA,EAAA,EAAA,eACA,EAAA,EAAA,KACA,EAAA,EAAA,aACA,EAAA,EAAA,SAiBA,GAAA,EIvBA,EAAA,SAAA,WACA,EAAA,OAAA,KAAA,UAAA,UCHA,EAAA,OAAA,KA8DA,EAAA,OAAA,iBAGA,GADA,EAAA,UAAA,YAEA,EAAA,UAAA,yBACA,EAAA,EAAA,UAAA,aACA,EAAA,EAAA,UAAA,YACA,EAAA,EAAA,UAAA,aAGA,EAAA,UAAA,KAAA,UAAA,WAGA,EAAA,EACA,SAAA,EAAA,GACA,IACA,EAAA,KAAA,EAAA,GACA,MAAA,GACA,KAAA,YAAA,IACA,KAAA,KAIA,SAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAIA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,YAAA,SAAA,GACA,MAAA,MAAA,aAAA,EAAA,OAIA,aAAA,SAAA,EAAA,GACA,EAAA,EAGA,IAAA,EACA,GACA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EAEA,EAAA,EAAA,KAGA,EAAA,KAEA,EAAA,MAGA,GAAA,EAAA,EAAA,aAAA,KAGA,IAAA,GAEA,EACA,EAAA,EAAA,gBAAA,KAAA,UAEA,GAAA,KAAA,6BCrJA,EAAA,EASA,IALA,EAFA,EAEA,EAAA,GAGA,EAAA,EAAA,KAAA,EAAA,GAEA,EACA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,KAAA,KAAA,EAAA,GAAA,OACA,CACA,IACA,KAAA,YAAA,EAAA,IACA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,GAEA,SAAA,KAAA,cACA,KAAA,YAAA,KAAA,YAIA,IAAA,GAAA,EAAA,EAAA,WAAA,KAAA,IAIA,GACA,EAAA,KAAA,EACA,EAAA,KAAA,GAAA,GAEA,EAAA,KAAA,GAcA,MAVA,GAAA,KAAA,aACA,WAAA,EACA,YAAA,EACA,gBAAA,IAIA,EAAA,EAAA,MAGA,GAIA,YAAA,SAAA,GAEA,GADA,EAAA,GACA,EAAA,aAAA,KAAA,CAKA,IAAA,GAHA,IAAA,EAGA,GAFA,KAAA,WAEA,KAAA,YAAA,EACA,EAAA,EAAA,YACA,GAAA,IAAA,EAAA,CACA,GAAA,CACA,OAGA,IAAA,EAEA,KAAA,IAAA,OAAA,iBAIA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,YACA,EAAA,EAAA,eAEA,IAAA,KAAA,2BAAA,CAKA,GAAA,GAAA,KAAA,WACA,EAAA,KAAA,UAEA,EAAA,EAAA,UACA,IACA,EAAA,EAAA,GAEA,IAAA,IAEA,KAAA,YAAA,GACA,IAAA,IACA,KAAA,WAAA,GACA,IACA,EAAA,aAAA,GACA,IACA,EAAA,iBACA,GAGA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,WAIA,GAAA,MACA,EAAA,KAAA,KAAA,EAgBA,OAbA,IAEA,EAAA,KAAA,aACA,aAAA,EAAA,GAEA,YAAA,EACA,gBAAA,IAKA,EAAA,KAAA,GAEA,GAIA,aAAA,SAAA,EAAA,GACA,EAAA,EAEA,IAAA,EASA,IAPA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,IAGA,EAAA,aAAA,KAEA,KAAA,IAAA,OAAA,gBAKA,IAGA,GAHA,EAAA,EAAA,YACA,EAAA,EAAA,gBAIA,GAAA,KAAA,6BACA,EAAA,EAkDA,OAhDA,GACA,EAAA,EAAA,IAEA,IAAA,IACA,EAAA,EAAA,aACA,EAAA,EAAA,EAAA,KAAA,EAAA,IAGA,GAoBA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,KAAA,KAAA,EAAA,GACA,KAtBA,KAAA,aAAA,IACA,KAAA,YAAA,EAAA,IACA,KAAA,YAAA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,IAGA,EAAA,iBAAA,EAAA,aAEA,EAAA,YAAA,OAGA,EAAA,YACA,EAAA,KAEA,EAAA,WACA,EAAA,KAAA,GACA,IAWA,EAAA,KAAA,aACA,WAAA,EACA,aAAA,EAAA,GAEA,YAAA,EACA,gBAAA,IAIA,EAAA,GACA,EAAA,EAAA,MAEA,GASA,gBAAA,WACA,IAAA,GAAA,GAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,mBAIA,cAAA,WACA,MAAA,QAAA,KAAA,YAIA,GAAA,cAEA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,KAAA,KAAA,aAIA,GAAA,cACA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,KAAA,KAAA,aAKA,GAAA,aAEA,MAAA,UAAA,KAAA,WACA,KAAA,WAAA,EAAA,KAAA,KAAA,YAIA,GAAA,eACA,MAAA,UAAA,KAAA,aACA,KAAA,aAAA,EAAA,KAAA,KAAA,cAKA,GAAA,mBACA,MAAA,UAAA,KAAA,iBACA,KAAA,iBAAA,EAAA,KAAA,KAAA,kBAGA,GAAA,iBAGA,IADA,GAAA,GAAA,KAAA,WACA,GAAA,EAAA,WAAA,EAAA,cACA,EAAA,EAAA,UAGA,OAAA,IAGA,GAAA,eAIA,IAAA,GADA,GAAA,GACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,UAAA,EAAA,eACA,GAAA,EAAA,YAIA,OAAA,IAEA,GAAA,aAAA,GACA,GAAA,GAAA,EAAA,KAAA,WAEA,IAAA,KAAA,4BAEA,GADA,EAAA,MACA,KAAA,EAAA,CACA,GAAA,GAAA,KAAA,KAAA,cAAA,eAAA,EACA,MAAA,YAAA,QAIA,GAAA,MACA,KAAA,KAAA,YAAA,CAIA,IAAA,GAAA,EAAA,KAAA,WAEA,GAAA,KAAA,aACA,WAAA,EACA,aAAA,IAGA,EAAA,GAEA,EAAA,EAAA,OAGA,GAAA,cAIA,IAAA,GAHA,GAAA,GAAA,GAEA,EAAA,EACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAKA,OADA,GAAA,OAAA,EACA,GCxTA,UAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAIA,SAAA,SAAA,GAEA,MAAA,GAAA,KAAA,EAAA,KAGA,wBAAA,SAAA,GAKA,MAAA,GAAA,KAAA,KAAA,KACA,EAAA,KAIA,UAAA,WAOA,IAAA,GAHA,GAGA,EANA,EAAA,EAAA,KAAA,YACA,KACA,EAAA,GAIA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GACA,EAAA,WAAA,EAAA,UC9BA,GAAA,EAAA,KAAA,OAEA,GAKA,GAAA,EAAA,KACA,EAAA,KAAA,IAJA,EAAA,EAHA,KAAA,WAAA,IAYA,GAAA,EAAA,SACA,EAAA,MAAA,EACA,EAAA,IAEA,KACA,EAAA,GACA,EAAA,KACA,EAAA,WAAA,QACA,EAAA,YAMA,IAAA,EAAA,SACA,EAAA,MAAA,EACA,EAAA,OAQA,EAAA,EAAA,iBCjCA,EAAA,EAAA,EAAA,SAAA,gCACA,GAAA,UAAA,oBAEA,GAAA,UAAA,iBACA,EAAA,UAAA,EAAA,OAAA,OAAA,EAAA,WAAA,EAAA,WAEA,EAAA,UAAA,EAEA,EAAA,aAAA,EAEA,EAAA,eAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EACA,EAAA,iBAAA,EAEA,EAAA,SAAA,KAAA,GAGA,OAAA,mBAOA,SAAA,GACA,YAMA,SAAA,GAAA,EAAA,GAIA,IAFA,GAAA,GAAA,EAAA,EAAA,kBAEA,GAAA,CACA,GAAA,EAAA,QAAA,GACA,MAAA,ECzCA,IADA,EAAA,EAAA,EAAA,GAEA,MAAA,EAEA,GAAA,EAAA,mBAGA,MAAA,MAGA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,QAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,SACA,OAAA,KAAA,GAEA,IAAA,GAAA,EAAA,eAAA,ECvBA,QAAA,KACA,OAAA,EAKA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,YAAA,EAGA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,eAAA,EAIA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAAA,eAAA,GAAA,EAAA,YAAA,EAGA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,kBACA,GACA,EAAA,EAAA,EAAA,KACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,kBAEA,OAAA,GFIA,GAAA,GAAA,EAAA,SAAA,eACA,EAAA,EAAA,SAAA,SClBA,EAAA,+BCqBA,GACA,cAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAEA,iBAAA,SAAA,GACA,MAAA,GAAA,KAAA,GAAA,GAAA,EAAA,KAMA,GACA,qBAAA,SAAA,GACA,GAAA,GAAA,GAAA,EACA,OAAA,MAAA,EACA,EAAA,KAAA,EAAA,GAGA,EAAA,KAAA,EACA,EACA,EACA,EAAA,gBAIA,uBAAA,SAAA,GAIA,MAAA,MAAA,iBAAA,IAAA,IAIA,uBAAA,SAAA,EAAA,GCtEA,GAAA,GAAA,GAAA,EAEA,IAAA,KAAA,EAEA,EAAA,SACA,IAAA,MAAA,EAEA,MAAA,MAAA,EACA,EAAA,KAAA,EAAA,GAEA,EAAA,KAAA,EAAA,EAAA,EAIA,OAAA,MAAA,EACA,EAAA,KAAA,EAAA,EAAA,GAGA,EAAA,KAAA,EAAA,EAAA,EAAA,ICjBA,GAAA,uBAAA,EACA,EAAA,mBAAA,GAGA,OAAA,mBAQA,SACA,GACA,YAKA,SAAA,GAAA,GAEA,KAAA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAEA,OAAA,GAIA,QAAA,GAAA,GACA,KAAA,GAAA,EAAA,WAAA,KAAA,cAEA,EAAA,EAAA,eAEA,OAAA,GAjBA,GAAA,GAAA,EAAA,SAAA,SAsBA,GACA,GAAA,qBACA,MAAA,GAAA,KAAA,aCvCA,GAAA,oBAEA,MAAA,GAAA,KAAA,YAIA,GAAA,qBAEA,IAAA,GADA,GAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBAEA,GAGA,OAAA,IAIA,GAAA,YAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBACA,EAAA,KAAA,CAGA,OADA,GAAA,OAAA,EACA,GAGA,OAAA,WACA,GAAA,GAAA,KAAA,UAEA,IACA,EAAA,YAAA,QAKA,GACA,GAAA,sBAEA,MAAA,GAAA,KAAA,cAIA,GAAA,0BACA,MAAA,GAAA,KAAA,kBAIA,GAAA,mBAAA,EACA,EAAA,oBAAA,GAGA,OAAA,mBCxDA,SAAA,GAEA,YAaA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAXA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,gBACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAIA,EAAA,OAAA,aAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,MAGA,GAAA,aAAA,GACA,KAAA,KAAA,GAEA,GAAA,QACA,MAAA,MAAA,KAAA,MAEA,GAAA,MAAA,GAEA,GAAA,GAAA,KAAA,KAAA,IACA,GAAA,KAAA,iBAEA,SAAA,IAGA,KAAA,KAAA,KAAA,KAKA,EAAA,EAAA,UAAA,GAGA,EAAA,EAAA,EACA,SAAA,eAAA,KChDA,EAAA,SAAA,cAAA,GACA,OAAA,mBAQA,SAAA,GACA,YASA,SAAA,GAAA,GACA,MAAA,KAAA,EAKA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAdA,GAAA,GAAA,EAAA,SAAA,cAGA,GAFA,EAAA,gBAEA,EAAA,OAEA,EAAA,EAAA,gBAMA,EAAA,OAAA,IAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,UAAA,SAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,KAAA,IACA,IAAA,EAAA,EAAA,OAEA,KAAA,IAAA,OAAA,iBACA,IAAA,GAAA,EAAA,MAAA,EAAA,GACA,EAAA,EAAA,MAAA,EACA,MAAA,KAAA,CACA,IAAA,GAAA,KAAA,cAAA,eAAA,EAIA,OAHA,MAAA,YAEA,KAAA,WAAA,aAAA,EAAA,KAAA,aACA,KAIA,EAAA,EAAA,EAAA,SAAA,eAAA,KAGA,EAAA,SAAA,KAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YC9DA,SAAA,GAAA,GACA,EAAA,mCAAA,EAAA,SAGA,QAAA,GAAA,EAAA,GAEA,KAAA,KAAA,EACA,KAAA,cAAA,EAIA,EAAA,WACA,GAAA,UACA,MAAA,MAAA,KAAA,QAGA,KAAA,SAAA,GAEA,MAAA,MAAA,KAAA,KAAA,IAEA,SAAA,SAAA,GACA,MAAA,MAAA,KAAA,SAAA,IAEA,IAAA,WACA,KAAA,KAAA,IAAA,MAAA,KAAA,KAAA,WACA,EAAA,KAAA,gBAEA,OAAA,WACA,KAAA,KAAA,OAAA,MAAA,KAAA,KAAA,WACA,EAAA,KAAA,gBAGA,OAAA,WAEA,GAAA,GAAA,KAAA,KAAA,OAAA,MAAA,KAAA,KAAA,UClCA,ODmCA,GAAA,KAAA,eCnCA,GAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAMA,EAAA,SAAA,aAAA,GACA,OAAA,mBAOA,SACA,GACA,YCCA,SAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,UACA,IAAA,GAAA,EAAA,WAAA,CAGA,GAAA,GAAA,EAAA,mBAAA,EACA,GAAA,mBAAA,IACA,EAAA,cC5BA,QAAA,GAAA,EAAA,EAAA,GAKA,EAAA,EAAA,cAEA,KAAA,EACA,UAAA,KACA,SAAA,IAQA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GFGA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,SAAA,aACA,EAAA,EAAA,oBAEA,EAAA,EAAA,mBAEA,GADA,EAAA,sBACA,EAAA,iBACA,EAAA,EAAA,MAGA,GADA,EAAA,MACA,EAAA,iBAEA,EAAA,EAAA,OACA,EAAA,EAAA,SCnCA,EAAA,OAAA,QAGA,GACA,UAEA,qBACA,oBACA,yBACA,OAAA,SAAA,GACA,MAAA,GAAA,UAAA,KAKA,EAAA,EAAA,GAEA,EAAA,EAAA,UAAA,GCJA,EAAA,GAAA,QAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,iBAAA,WACA,GAAA,GAAA,GAAA,GAAA,WAAA,KACA,MAAA,KAAA,mBAAA,CAGA,IAAA,GAAA,EAAA,mBAAA,KCzBA,OAFA,GAAA,aAEA,GAKA,GAAA,cACA,MAAA,MAAA,KAAA,oBAAA,MAOA,aAAA,SAAA,EAAA,GAEA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,aAAA,EAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAIA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,gBAAA,GAEA,EAAA,KAAA,EAAA,GAEA,EAAA,KAAA,IAGA,QAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,KAAA,IAGA,GAAA,aACA,GAAA,GAAA,EAAA,IAAA,KAOA,OANA,IACA,EAAA,IAAA,KAEA,EAAA,GAAA,GAAA,EAAA,MAAA,UAAA,OAGA,GC3CA,GAAA,aAEA,MAAA,GAAA,MAAA,WAIA,GAAA,WAAA,GACA,KAAA,aAAA,QAAA,IAIA,GAAA,MACA,MAAA,GAAA,MAAA,IAIA,GAAA,IAAA,GAEA,KAAA,aAAA,KAAA,MAIA,EAAA,QAAA,SAAA,GACA,YAAA,IAEA,EAAA,UAAA,GAAA,SAAA,GACA,MAAA,MAAA,QAAA,OAMA,EAAA,UAAA,yBACA,EAAA,UAAA,uBAEA,EAAA,UAAA,kBAGA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAGA,EAAA,EAAA,EACA,SAAA,gBAAA,KAAA,MAEA,EAAA,mCAAA,EAEA,EAAA,aAAA,EACA,EAAA,SAAA,QAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YCvCA,SAAA,GAAA,GACA,OAAA,GACA,IAAA,IACA,MAAA,OAEA,KAAA,IACA,MAAA,MACA,KAAA,IACA,MAAA,MACA,KAAA,IAEA,MAAA,QACA,KAAA,OAEA,MAAA,UCpCA,QAAA,GAAA,GAEA,MAAA,GAAA,QAAA,EAAA,GAIA,QAAA,GAAA,GACA,MAAA,GAAA,QAAA,EAAA,GAKA,QAAA,GAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,KAAA,CAEA,OAAA,GCNA,QAAA,GAAA,EAAA,GACA,OAAA,EAAA,UACA,IAAA,MAAA,aAIA,IAAA,GAAA,GAHA,EAAA,EAAA,QAAA,cACA,EAAA,IAAA,EACA,EAAA,EAAA,WACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,GAAA,IAAA,EAAA,KAAA,KAAA,EAAA,EAAA,OAAA,GAGA,OADA,IAAA,IACA,EAAA,GACA,EAEA,EAAA,EAAA,GAAA,KAAA,EAAA,GAEA,KAAA,MAAA,UACA,GAAA,GAAA,EAAA,IACA,OAAA,IAAA,EAAA,EAAA,WACA,EACA,EAAA,EAEA,KAAA,MAAA,aACA,MAAA,OAAA,EAAA,KAAA,KAEA,SAEA,KADA,SAAA,MAAA,GACA,GAAA,OAAA,oBAIA,QAAA,GAAA,GACA,YAAA,GAAA,sBACA,EAAA,EAAA,QAGA,KAAA,GADA,GAAA,GACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,GAAA,EAAA,EAAA,EAEA,OAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,KACA,GAAA,YAAA,EACA,IAAA,GAAA,EAAA,EAAA,cAAA,cAAA,GACA,GAAA,UAAA,CAEA,KADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,IAUA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GCPA,QAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,EAAA,WAAA,GACA,GAAA,UAAA,CCrEA,KDuEA,GAEA,GAFA,EAAA,EAAA,SAAA,0BCvEA,EAAA,EAAA,YACA,EAAA,YAAA,EAGA,OAAA,GAAA,GAIA,QAAA,GAAA,GACA,MAAA,YAEA,MADA,GAAA,mBACA,KAAA,KAAA,IAIA,QAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAkBA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GACA,IAAA,EAAA,GACA,IAAA,SAAA,GACA,EAAA,mBACA,KAAA,KAAA,GAAA,GAGA,cAAA,EACA,YAAA,IAUA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GAEA,MAAA,WAGA,MAFA,GAAA,mBAEA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAEA,cAAA,EACA,YAAA,ILIA,GAAA,GAAA,EAAA,SAAA,QClEA,EAAA,EAAA,aACA,EAAA,EAAA,gBACA,EAAA,EAAA,MAEA,EAAA,EAAA,eACA,EAAA,EAAA,iBAEA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SASA,EAAA,cACA,EAAA,eCIA,EAAA,GAEA,OACA,OACA,KACA,MAEA,UACA,QACA,KACA,MACA,QAEA,SACA,OACA,OACA,QACA,SACA,QAEA,QAIA,EAAA,GCjDA,QACA,SACA,MAEA,SACA,UAEA,WACA,YACA,aA0DA,EAAA,OAAA,KAAA,UAAA,WAEA,EAAA,OAAA,YACA,EAAA,OAAA,mBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,aACA,MAAA,GAAA,OAEA,GAAA,WAAA,GAQA,GAAA,GAAA,EAAA,KAAA,WAIA,YAFA,KAAA,YAAA,EGzFA,IAAA,GAAA,EAAA,KAAA,WAGA,MAAA,2BACA,eAAA,GAAA,oBAEA,EAAA,KAAA,QAAA,GAEA,EAAA,KAAA,EAAA,KAAA,UAMA,GACA,eAAA,GAAA,oBAEA,EAAA,KAAA,QAAA,GAGA,KAAA,KAAA,UAAA,CFpBA,IAAA,GAAA,EAAA,KAAA,WAGA,GAAA,KAAA,aACA,WAAA,EAEA,aAAA,IAGA,EAAA,GACA,EAAA,EAAA,OAGA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,aAGA,GAAA,WAAA,GAEA,GAAA,GAAA,KAAA,UAEA,IAAA,EAAA,CACA,EAAA,0BACA,IAAA,GAAA,EAAA,EAAA,EAEA,GAAA,aAAA,EAAA,QAKA,mBAAA,SAAA,EAAA,GAEA,GAAA,GAAA,CACA,QAAA,OAAA,GAAA,eAEA,IAAA,cACA,EAAA,KAAA,WACA,EAAA,IACA,MACA,KAAA,WACA,EAAA,KAAA,WACA,EAAA,KAAA,WACA,MACA,KAAA,aACA,EAAA,KACA,EAAA,KAAA,UAEA,MACA,KAAA,YACA,EAAA,KAEA,EAAA,IACA,MACA,SAEA,OAIA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,aAAA,EAAA,OCxCA,eACA,aACA,YACA,cACA,eACA,aACA,YACA,cACA,eAEA,eACA,QAAA,IAgBA,aACA,aAEA,QAAA,IAiBA,wBACA,iBAEA,kBACA,QAAA,GAKA,EAAA,EAAA,EACA,SAAA,cAAA,MAEA,EAAA,SAAA,YAAA,EAIA,EAAA,aAAA,EAEA,EAAA,aAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YAYA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,WACA,WAAA,WACA,GAAA,GAAA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA,UACA,OAAA,IAAA,EAAA,MAKA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBAQA,SAAA,GACA,YASA,SAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,OAAA,kBAOA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,UACA,MAAA,MAAA,aAAA,WAEA,GAAA,QAAA,GACA,KAAA,aAAA,SAAA,IAGA,aAAA,SAAA,EAAA,GACA,EAAA,UAAA,aAAA,KAAA,KAAA,EAAA,GACA,WAAA,OAAA,GAAA,eACA,KAAA,0BAAA,MAOA,GACA,EAAA,EAAA,GAGA,EAAA,SAAA,mBAAA,GACA,OAAA,mBAOA,SACA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAQA,QAAA,GAAA,EAAA,GAEA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,OAEA,GAAA,KAAA,KAAA,GAEA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,MAAA,GACA,SAAA,IACA,EAAA,OAAA,GAjCA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EAEA,SAAA,cAAA,QAsBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBAOA,SAAA,GACA,YAaA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAXA,GAAA,GAAA,EAAA,SAAA,YAIA,GAHA,EAAA,MAEA,EAAA,SAAA,SACA,EAAA,iBAGA,EAAA,OAAA,iBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAKA,GACA,EAAA,EAAA,GAGA,EAAA,SAAA,kBAAA,GAEA,OAAA,mBAQA,SACA,GACA,YAgBA,SAAA,GAAA,GACA,IAAA,EAAA,YACA,MAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,KAAA,EAAA,CAKA,IADA,EAAA,EAAA,eAAA,mBAAA,IACA,EAAA,WACA,EAAA,YAAA,EAAA,UAEA,GAAA,IAAA,EAAA,GAGA,MAAA,GAGA,QAAA,GAAA,GAOA,IAJA,GAGA,GAHA,EAAA,EAAA,EAAA,eACA,EAAA,EAAA,EAAA,0BAGA,EAAA,EAAA,YAEA,EAAA,YAAA,EAEA,OAAA,GAMA,QAAA,GAAA,GAGA,GAFA,EAAA,KAAA,KAAA,IAEA,EAAA,CAEA,GAAA,GAAA,EAAA,EACA,GAAA,IAAA,KAAA,EAAA,KAtDA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,GAAA,SACA,EAAA,GAAA,SAqCA,EAAA,OAAA,mBAWA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,WACA,GAAA,WAEA,MAAA,GACA,EAAA,KAAA,KAAA,SACA,EAAA,IAAA,SASA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,oBAAA,GAEA,OAAA,mBAMA,SACA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GARA,GAAA,GAAA,EAAA,SAAA,YAEA,EAAA,EAAA,gBAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,EACA,SAAA,cAAA,UAIA,EAAA,SAAA,iBAAA,GACA,OAAA,mBAMA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GASA,QAAA,GAAA,GAEA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,SACA,GAAA,KAAA,KAAA,GAEA,EAAA,EAAA,MAEA,EAAA,aAAA,UAAA,QACA,SAAA,GAEA,EAAA,aAAA,MAAA,GAjCA,GAAA,GAAA,EAAA,SAAA,iBAEA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,EACA,SAAA,cAAA,UAqBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBAMA,SAAA,GACA,YAYA,SAAA,GAAA,GAEA,MAAA,GAAA,QAAA,OAAA,KAAA,OAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAwBA,QAAA,GAAA,EAAA,EAAA,EAAA,GAEA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAIA,IAAA,GAAA,EAAA,SAAA,cAAA,UACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,KAAA,GACA,SAAA,GACA,EAAA,aAAA,QAAA,GACA,KAAA,GACA,EAAA,aAAA,WAAA,IACA,EAAA,SAAA,KAAA,EA1DA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAUA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,QAEA,MAAA,GAAA,KAAA,cAEA,GAAA,MAAA,GAEA,KAAA,YAAA,EAAA,OAAA,KAEA,GAAA,QAEA,MAAA,GAAA,EAAA,MAAA,SAKA,EAAA,EAAA,EAEA,SAAA,cAAA,WAwBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,OAAA,GACA,OAAA,mBAMA,SACA,GACA,YAYA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAXA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,iBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,IAAA,SAAA,EAAA,GACA,gBAAA,KACA,EAAA,EAAA,IACA,EAAA,MAAA,IAAA,EAAA,GAAA,IAIA,OAAA,SAAA,GAGA,MAAA,UAAA,MAEA,GAAA,UAAA,OAAA,KAAA,OAKA,gBAAA,KACA,EAAA,EAAA,QAGA,GAAA,MAAA,OAAA,KAIA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAKA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GAEA,OAAA,mBAUA,SAAA,GACA,YAcA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAZA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,EAAA,mBAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAGA,cAAA,WACA,MAAA,GAAA,EAAA,MAAA,kBAGA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAEA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAKA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAEA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAIA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAEA,YAAA,WAEA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,QAEA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAIA,EAAA,EAAA,EAEA,SAAA,cAAA,UAEA,EAAA,SAAA,iBAAA,GAEA,OAAA,mBEroBA,SAAA,GACA,YAcA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAZA,GAAA,GAAA,EAAA,SAAA,YAEA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,mBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,uBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAKA,EAAA,EAAA,EAEA,SAAA,cAAA,UAGA,EAAA,SAAA,wBAAA,GACA,OAAA,mBAQA,SAAA,GAEA,YCvCA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GDwCA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MAEA,EAAA,EAAA,gBAEA,EAAA,EAAA,mBCrDA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,mBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WAEA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAGA,WAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,WAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,OAEA,EAAA,SAAA,oBAAA,GACA,OAAA,mBAMA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,OAAA,EAAA,WACA,IAAA,UACA,MAAA,IAAA,GAAA,EAEA,KAAA,SACA,MAAA,IAAA,GAAA,EACA,KAAA,WACA,MAAA,IAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GAnBA,GAAA,GAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,oBAEA,GADA,EAAA,MACA,EAAA,iBAEA,EAAA,OAAA,kBAcA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,GACA,EAAA,SAAA,mBAAA,GACA,OAAA,mBC1DA,SAAA,GAEA,YAGA,IAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,SAAA,YACA,EAAA,EAAA,eAEA,EAAA,6BACA,EAAA,SAAA,gBAAA,EAAA,SACA,EAAA,EAAA,GACA,EAAA,OAAA,eAAA,EAAA,WAAA,WAMA,MAAA,aAAA,IAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,UAAA,YACA,QAAA,eAAA,EAAA,UAAA,YAAA,SACA,GAAA,UAAA,UAGA,EAAA,SAAA,WAAA,GAEA,OAAA,mBAOA,SACA,GAEA,YAsBA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GArBA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,cAMA,EAAA,6BACA,EAAA,EAAA,SAAA,gBAAA,EAAA,MACA,EAAA,SAAA,gBAAA,EAAA,OACA,EAAA,EAAA,YACA,EAAA,OAAA,eAAA,EAAA,WACA,EAAA,EAAA,WAOA;EAAA,UAAA,OAAA,OAAA,GAIA,gBAAA,IACA,EAAA,EAAA,WAEA,GAAA,gBACA,MAAA,GAAA,EAAA,MAAA,eAEA,GAAA,wBACA,MAAA,GAAA,EAAA,MAAA,yBAMA,EAAA,EAAA,EAAA,GAEA,EAAA,SAAA,cAAA,GACA,OAAA,mBAQA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,KAEA,EAAA,OAAA,kBACA,KAOA,EAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAGA,GAAA,wBACA,MAAA,GAAA,KAAA,KAAA,uBAIA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAMA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,cACA,KAAA,IAAA,OAAA,oBAKA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAKA,GAAA,mBACA,MAAA,GAAA,KAAA,KAAA,kBAKA,GAAA,eACA,MAAA,GAAA,KAAA,KAAA,gBAKA,EAAA,EAAA,GAGA,EAAA,SAAA,mBAAA,IACA,OAAA,mBAMA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,KAAA,KAAA,EATA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,wBAOA,GAAA,EAAA,WACA,GAAA,UAEA,MAAA,GAAA,KAAA,KAAA,SAGA,UAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,UAAA,MAAA,KAAA,KAAA,YAGA,cAAA,WAEA,MADA,WAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,cAMA,EAAA,EAAA,EACA,SAAA,cAAA,UAAA,WAAA,OAEA,EAAA,SAAA,yBAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YAaA,SAAA,GAAA,GACA,KAAA,KAAA,EAZA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,qBAGA,IAAA,EAAA,CAOA,EAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,KAAA,KAAA,SAIA,WAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA,YAGA,cAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,aAQA,IAAA,GAAA,SAAA,KAAA,UAAA,YACA,oBAAA,KAAA,mBAAA,QAGA,GAAA,EAAA,EACA,GAGA,EAAA,SAAA,sBAAA,IACA,OAAA,mBAMA,SAAA,GACA,YAYA,SAAA,GAAA,GACA,KAAA,KAAA,EAVA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eAEA,EAAA,EAAA,KAGA,EAAA,OAAA,KAMA,GAAA,WACA,GAAA,kBACA,MAAA,GAAA,KAAA,KAAA,iBAGA,GAAA,gBACA,MAAA,GAAA,KAAA,KAAA,eAGA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAEA,SAAA,SAAA,EAAA,GACA,KAAA,KAAA,SAAA,EAAA,GAAA,IAGA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,KAAA,KAAA,eAAA,EAAA,KAGA,cAAA,SAAA,GACA,KAAA,KAAA,cAAA,EAAA,KAEA,aAAA,SAAA,GAEA,KAAA,KAAA,aAAA,EAAA,KAGA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,mBAAA,SAAA,GAEA,KAAA,KAAA,mBAAA,EAAA,KAEA,sBAAA,SAAA,EAAA,GAEA,MAAA,MAAA,KAAA,sBAAA,EAAA,EAAA,KCzUA,gBAAA,WACA,MAAA,GAAA,KAAA,KAAA,oBAGA,cAAA,WAEA,MAAA,GAAA,KAAA,KAAA,kBAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,iBAAA,SAAA,GACA,KAAA,KAAA,iBAAA,EAAA,KAGA,WAAA,WACA,MAAA,GAAA,KAAA,KAAA,eAGA,eAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,eAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GAEA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GAEA,MAAA,MAAA,KAAA,eAAA,EAAA,KAEA,SAAA,WAEA,MAAA,MAAA,KAAA,aAMA,EAAA,UAAA,2BACA,EAAA,UAAA,yBAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,yBAAA,MAKA,EAAA,OAAA,MAAA,EAAA,SAAA,eAGA,EAAA,SAAA,MAAA,GAEA,OAAA,mBAMA,SAAA,GAEA,YAEA,IAAA,GAAA,EAAA,uBACA,EAAA,EAAA,oBAEA,EAAA,EAAA,mBAEA,EAAA,EAAA,MAEA,EAAA,EAAA,eCnEA,EAAA,EAAA,SAAA,yBACA,GAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,EAGA,IAAA,GAAA,EAAA,SAAA,cAAA,IAIA,GAAA,SAAA,QAAA,EACA,EAAA,SAAA,iBAAA,GAGA,OAAA,mBAOA,SACA,GCvBA,YAoBA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,KAAA,cAAA,yBACA,GAAA,KAAA,KAAA,GAIA,EAAA,EAAA,KAEA,IAAA,GAAA,EAAA,UACA,GAAA,IAAA,KAAA,GAEA,KAAA,WACA,GAAA,GAAA,KAAA,EAAA,GAAA,IAEA,EAAA,IAAA,KAAA,GAhCA,GAAA,GAAA,EAAA,SAAA,iBAEA,EAAA,EAAA,UACA,EAAA,EAAA,iBAEA,EAAA,EAAA,aAEA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,OACA,EAAA,EAAA,aACA,EAAA,EAAA,OAEA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,aAkBA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,aACA,MAAA,GAAA,OAEA,GAAA,WAAA,GACA,EAAA,KAAA,GACA,KAAA,4BAGA,GAAA,mBACA,MAAA,GAAA,IAAA,OAAA,MAGA,GAAA,QACA,MAAA,GAAA,IAAA,OAAA,MAGA,yBAAA,WACA,MAAA,GAAA,IAAA,MAAA,4BAGA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,cAAA,EAAA,IAGA,eAAA,SAAA,GACA,MAAA,GAAA,KAAA,GACA,KACA,KAAA,cAAA,QAAA,EAAA,SAIA,EAAA,SAAA,WAAA,GAEA,OAAA,mBAMA,SAAA,GACA,YAqBA,SAAA,GAAA,GAEA,EAAA,iBAAA,EAAA,gBAEA,EAAA,aAAA,EAAA,YACA,EAAA,YAAA,EAAA,WCjFA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,IAMA,IAJA,EAAA,GAEA,EAAA,GAEA,EAYA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,iBAAA,EAAA,oBAfA,CAEA,EAAA,WAAA,EAAA,UACA,EAAA,YAAA,EAAA,aACA,EAAA,YAAA,EAAA,WAEA,IAAA,GAAA,EAAA,EAAA,UACA,KAEA,EAAA,aAAA,EAAA,aASA,EAAA,aAAA,EAAA,GAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UACA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,EACA,GAAA,GAEA,EAAA,kBACA,EAAA,gBAAA,aAAA,GACA,EAAA,cACA,EAAA,YAAA,iBAAA,GAGA,EAAA,YAAA,IACA,EAAA,WAAA,GACA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,YAAA,IAOA,QAAA,GAAA,GACA,EAAA,IAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAGA,OAFA,IACA,EAAA,IAAA,EAAA,MACA,EAIA,QAAA,GAAA,GAEA,IAAA,GADA,MAAA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAEA,OAAA,GCpFA,QAAA,KAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,cACA,IAAA,EAAA,OAIA,EAAA,SAGA,KAGA,QAAA,KACA,EAAA,KACA,IAQA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAKA,OAJA,KACA,EAAA,GAAA,GAAA,GACA,EAAA,IAAA,EAAA,IAEA,EAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GAAA,IACA,OAAA,aAAA,GACA,EAEA,KAGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,MAcA,QAAA,GAAA,GACA,KAAA,MAAA,EACA,KAAA,KAAA,EACA,KAAA,cAkEA,QAAA,GAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,uBACA,KAAA,cAAA,GA0OA,QAAA,GAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,GACA,EAAA,KAAA,MAAA,EAAA,EAAA,IAEA,EAAA,KAAA,EAGA,OAAA,GAGA,QAAA,GAAA,GACA,GAAA,YAAA,GACA,MAAA,EACA,IAAA,YAAA,GACA,MAAA,KACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EACA,MAAA,GAEA,MAAA,MAGA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,GAGA,EAAA,KAAA,GAFA,EAAA,IAAA,GAAA,IAKA,QAAA,GAAA,GACA,MAAA,GAAA,IAAA,GAGA,QAAA,GAAA,GAEA,EAAA,IAAA,EAAA,QAWA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,aAAA,SACA,KAAA,EACA,OAAA,CAIA,IADA,EAAA,EAAA,QACA,EACA,OAAA,CAEA,MAAA,YAAA,IACA,OAAA,CAEA,KAAA,EAAA,KAAA,GACA,OAAA,CAEA,KACA,MAAA,GAAA,QAAA,GACA,MAAA,GAEA,OAAA,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,OAAA,IAAA,EAAA,EAAA,OAAA,KAAA,EAGA,QAAA,GAAA,GACA,MAAA,aAAA,IACA,YAAA,GAGA,QAAA,GAAA,GACA,MAAA,GAAA,WAKA,QAAA,GAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,KAAA,EAEA,OAAA,GF7YA,GErEA,GFqEA,EAAA,EAAA,SAAA,QACA,EAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,SAAA,WAEA,GADA,EAAA,OACA,EAAA,cAEA,GADA,EAAA,MACA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,EAAA,KCfA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SC5EA,EAAA,EAAA,QACA,wBACA,2BACA,8BACA,eAIA,KAqDA,EAAA,GAAA,YACA,GAAA,OAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,GAeA,EAAA,WAEA,OAAA,SAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAGA,OAFA,MAAA,WAAA,KAAA,GAEA,GAGA,KAAA,SAAA,GACA,IAAA,KAAA,KAAA,CAcA,IAAA,GAXA,GAAA,KAAA,KAEA,EAAA,KAAA,WAEA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,SAEA,EAAA,EAAA,iBAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,IADA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,MAAA,IACA,IACA,EAAA,KAAA,KAAA,EAIA,KAAA,GADA,GAAA,EAAA,QAAA,OACA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAAA,KACA,GAAA,IAAA,IACA,EAAA,GAKA,IAAA,GAFA,GAAA,EAAA,WACA,EAAA,EAAA,IAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,KACA,EAAA,EAAA,IACA,GAAA,EAAA,EAAA,GAKA,EAAA,IAAA,GAAA,GAEA,EAAA,KAAA,GAGA,GAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,KAAA,MAYA,EAAA,WAGA,OAAA,SAAA,GACA,GAAA,KAAA,MAAA,CAGA,KAAA,sBAEA,IAAA,GAAA,KAAA,IAEA,MAAA,aAAA,EACA,IAAA,GAAA,GAAA,GAAA,GAAA,EACA,MAAA,gBAAA,EAAA,EAEA,IAAA,IAAA,CACA,IACA,EAAA,OAEA,KAAA,OAAA,IAGA,GAAA,kBACA,MAAA,GAAA,KAAA,MAAA,UAGA,WAAA,WACA,IAAA,KAAA,MAAA,CAGA,GAFA,KAAA,OAAA,EACA,EAAA,KAAA,MACA,EACA,MACA,GAAA,OAAA,GAAA,EAAA,KAKA,aAAA,SAAA,GACA,KAAA,SAAA,GACA,KAAA,uBAAA,IAGA,SAAA,SAAA,GACA,EAAA,GACA,EAAA,GAEA,EAAA,EAEA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,SAAA,EAGA,GAAA,YACA,KAAA,SAAA,EAAA,YAEA,EAAA,iBACA,KAAA,SAAA,EAAA,kBAIA,uBAAA,SAAA,GACA,GAAA,EAAA,GAAA,CAQA,IAAA,GAPA,GAAA,EAEA,EAAA,EAAA,GAEA,EAAA,EAAA,GAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,KAAA,iBAAA,EAAA,GAAA,EAIA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,GAMA,EAAA,EAAA,EAGA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,eACA,KAEA,EAAA,EAAA,GAIA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GAAA,GAKA,KAAA,uBAAA,IAIA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,uBAAA,IAKA,iBAAA,SAAA,EAAA,GACA,KAAA,YAAA,IAGA,GAAA,YAAA,GAAA,CACA,GAAA,GAAA,CACA,MAAA,0BAAA,EAAA,aAAA,UAKA,KAAA,GAHA,IAAA,EAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAEA,EAAA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,GAAA,OACA,GAAA,GAMA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,WACA,EACA,EAAA,EAAA,YACA,EAAA,EAAA,OAOA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,iBAAA,EAAA,IAKA,gBAAA,SAAA,EAAA,GAEA,IAAA,GADA,GAAA,KAAA,QAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAAA,EACA,MAAA,gBAAA,EAAA,GAGA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,OAAA,IAKA,QAAA,SAAA,GAGA,IAAA,GAFA,MACA,EAAA,EAAA,YAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,GAAA,EAAA,GAAA,CACA,KAAA,cAAA,EAEA,KAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,IACA,EAAA,KAAA,QAGA,GAAA,KAAA,EAGA,OAAA,IAOA,qBAAA,WACA,KAAA,WAAA,OAAA,OAAA,OAQA,0BAAA,SAAA,GACA,GAAA,EAAA,CAGA,GAAA,GAAA,KAAA,UAGA,SAAA,KAAA,KACA,EAAA,UAAA,GAGA,OAAA,KAAA,KACA,EAAA,IAAA,GAEA,EAAA,QAAA,uBAAA,SAAA,EAAA,GACA,EAAA,IAAA,MAMA,mBAAA,SAAA,GACA,MAAA,MAAA,WAAA,IAGA,cAAA,SAAA,GACA,EAAA,KAAA,uBAAA,MAsDA,IAAA,GAAA,iBAoEA,GAAA,UAAA,yBAAA,WACA,GAAA,GAAA,KAAA,KAAA,sBACA,OAAA,IACA,EAAA,cACA,IAGA,GAGA,EAAA,UAAA,oBACA,EAAA,UAAA,oBAAA,WAIA,MADA,KACA,EAAA,OAGA,EAAA,UAAA,8BAAA,WAEA,MADA,KACA,EAAA,WAGA,EAAA,UAAA,gBACA,EAAA,UAAA,gBAAA,WAEA,KAAA,0BAEA,IACA,GADA,EAAA,EAAA,KAEA,KACA,EAAA,EAAA,IACA,KAAA,KAAA,uBAAA,EACA,GACA,EAAA,cAGA,EAAA,mBAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EAEA,EAAA,8BAAA,EAIA,EAAA,QACA,aAAA,EACA,OAAA,IAGA,OAAA,mBAMA,SAAA,GACA,YAuBA,SAAA,GAAA,GACA,GAAA,OAAA,GAAA,CAKA,GAAA,EAAA,SAAA,GAEA,IAAA,GAAA,SAAA,GAEA,EAAA,KAAA,KAAA,GAEA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAKA,EAAA,OAAA,GAAA,EACA,SAAA,cAAA,EAAA,MAAA,EAAA,MACA,EAAA,SAAA,GAAA,GA5CA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,OACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,GACA,oBACA,sBACA,mBACA,oBACA,mBACA,oBACA,oBAEA,oBAEA,sBA6BA,GAAA,QAAA,IAEA,OAAA,mBAMA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,KAAA,KAAA,EAVA,CAAA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eAEA,EAAA,EAAA,IAGA,QAAA,UAKA,EAAA,WACA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAGA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAEA,SAAA,SAAA,GACA,KAAA,KAAA,SAAA,EAAA,KAEA,SAAA,SAAA,EAAA,GAEA,KAAA,KAAA,SAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,WAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,WAAA,KAEA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,kBAAA,SAAA,GACA,KAAA,KAAA,kBAAA,EAAA,KAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAmBA,EAAA,OAAA,UAAA,EAAA,OAAA,gBAEA,EAAA,SAAA,UAAA,GAGA,OAAA,mBAOA,SAAA,GACA,YA4BA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GACA,KAAA,WAAA,GAAA,GAAA,KAAA,MAeA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAmBA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,EAAA,KAAA,EAAA,IACA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,YACA,EAAA,UAAA,EAAA,YAEA,YAAA,IACA,EAAA,EAAA,EACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAEA,EAAA,EAAA,GCjwBA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,eACA,IACA,EAAA,UAAA,GC0LA,QAAA,GAAA,GACA,KAAA,KAAA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,MAAA,KAAA,KAAA,YFweA,GAAA,GAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KAEA,EAAA,EAAA,oBACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,mBACA,EAAA,EAAA,SAAA,WACA,EAAA,EAAA,UACA,EAAA,EAAA,UAEA,EAAA,EAAA,iBACA,EAAA,EAAA,iBACA,EAAA,EAAA,wBACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,uBAIA,GAFA,EAAA,aAEA,GAAA,SAOA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,mBAIA,EAAA,EAAA,QACA,EAAA,EAAA,SAaA,gBACA,yBACA,gBACA,kBACA,cACA,gBACA,cACA,iBACA,kBACA,QAAA,EAEA,IAAA,GAAA,SAAA,UC3uBA,EAAA,SAAA,YA6BA,IA1BA,EAAA,EAAA,WAEA,UAAA,SAAA,GAKA,MAJA,GAAA,YACA,EAAA,WAAA,YAAA,GACA,EAAA,EAAA,MAEA,GAEA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,EAAA,IAEA,WAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,EAAA,KAAA,OAEA,aAAA,WAGA,MAFA,KAEA,GAAA,GAAA,EAAA,KAAA,EAAA,SAEA,kBAAA,SAAA,GACA,MAAA,GAAA,iBAAA,KAAA,KACA,SAAA,KAAA,UAAA,OAAA,IAAA,QAIA,SAAA,gBAAA,CACA,GAAA,GAAA,SAAA,eACA,GAAA,UAAA,gBAAA,SAAA,EAAA,GCwCA,QAAA,GAAA,GACA,MAAA,QASA,KAAA,KAAA,GARA,EAEA,SAAA,cAAA,EAAA,GAEA,SAAA,cAAA,GD7CA,GAAA,GAAA,CC/BA,IDgCA,SAAA,IACA,EAAA,EAAA,UACA,EAAA,EAAA,aCzCA,EAAA,OAAA,OAAA,YAAA,YAOA,EAAA,qBAAA,IAAA,GAEA,KAAA,IAAA,OAAA,oBAWA,KAJA,GAEA,GAFA,EAAA,OAAA,eAAA,GAGA,KACA,KACA,EAAA,EAAA,qBAAA,IAAA,KAGA,EAAA,KAAA,GACA,EAAA,OAAA,eAAA,EAIA,KAAA,EAEA,KAAA,IAAA,OAAA,oBAWA,KAAA,GAFA,GAAA,OAAA,OAAA,GAEA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IACA,EAAA,OAAA,OAAA,IASA,kBACA,mBACA,mBACA,4BACA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,EACA,KAEA,EAAA,GAAA,WAIA,EAAA,eAAA,IAEA,EAAA,MAEA,EAAA,MAAA,EAAA,MAAA,cAIA,IAAA,IAAA,UAAA,EACA,KACA,EAAA,QAAA,GAeA,EAAA,UAAA,EACA,EAAA,UAAA,YAAA,EAGA,EAAA,iBAAA,IAAA,EAAA,GACA,EAAA,qBAAA,IAAA,EAAA,EAGA,GAAA,KAAA,EAAA,MACA,EAAA,EACA,OAAA,IAGA,GACA,OAAA,cAAA,OAAA,WAEA,oBAOA,GACA,OAAA,gBACA,OAAA,cAAA,OAAA,SACA,OAAA,gBACA,OAAA,kBAEA,cACA,0BACA,WACA,yBACA,uBACA,yBACA,eACA,gBACA,mBACA,cACA,gBACA,OAAA,IAEA,GACA,OAAA,cAAA,OAAA,WAEA,YACA,aACA,WACA,gBACA,yBACA,gBACA,kBACA,cACA,gBAEA,cACA,iBACA,mBACA,iBACA,oBACA,iBAGA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,WACA,GAAA,kBAEA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,GACA,GACA,EACA,GAAA,GAAA,EAAA,MAAA,gBACA,EAAA,IAAA,KAAA,GACA,IAIA,GAAA,eACA,MAAA,GAAA,EAAA,MAAA,gBAIA,EAAA,OAAA,SAAA,EACA,SAAA,eAAA,mBAAA,KAKA,OAAA,cACA,EAAA,OAAA,aAAA,GAEA,GACA,OAAA,gBACA,OAAA,cAAA,OAAA,SACA,OAAA,kBAqBA,EAAA,EAAA,sBACA,EAAA,EAAA,kBACA,EAAA,EAAA,sBACA,EAAA,EAAA,cAEA,EAAA,OAAA,kBAAA,GAEA,GACA,OAAA,oBAEA,qBACA,iBACA,qBACA,eAIA,EAAA,kBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,SAAA,GAEA,OAAA,mBAMA,SAAA,GACA,YAgBA,SAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GAhBA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBAEA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,OACA,EAAA,OAAA,iBACA,EAAA,OAAA,YAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,UAAA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,QAAA,iBAAA,EAAA,GAAA,IAIA,EAAA,UAAA,aAAA,WACA,MAAA,GAAA,MAAA,QAAA,sBAIA,QAAA,uBACA,QAAA,cAGA,mBAAA,sBAAA,iBAAA,QACA,SAAA,GACA,EAAA,UAAA,GAAA,WACA,GAAA,GAAA,EAAA,MAAA,OACA,OAAA,GAAA,GAAA,MAAA,EAAA,kBAIA,QAAA,KAGA,EAAA,EAAA,WACA,iBAAA,SAAA,EAAA,GAEA,MADA,KACA,EAAA,KAAA,EAAA,MAAA,EAAA,GACA,IAEA,aAAA,WAEA,MADA,KACA,GAAA,GAAA,EAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,GAAA,EAAA,MAAA,aAIA,EAAA,EAAA,EAAA,QAEA,EAAA,SAAA,OAAA,GAGA,OAAA,mBAQA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,OAOA,EAAA,OAAA,cAAA,OAAA,UACA,EACA,EAAA,UAAA,YAEA,GAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,GAAA,EAAA,KAGA,OAAA,mBAMA,SAAA,GACA,YA2FA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,OAAA,EACA,IAAA,EAAA,CAEA,GAAA,GAAA,SAAA,cAAA,GAEA,EAAA,EAAA,WACA,QAAA,GAAA,GAjGA,GAIA,IAJA,EAAA,cAKA,EAAA,oBAKA,KAAA,kBACA,MAAA,mBAEA,KAAA,kBACA,KAAA,kBACA,GAAA,gBACA,OAAA,oBACA,OAAA,oBACA,QAAA,0BACA,IAAA,sBAEA,QAAA,qBACA,KAAA,kBACA,SAAA,sBACA,IAAA,iBACA,IAAA,uBACA,IAAA,iBACA,GAAA,mBACA,MAAA,mBACA,SAAA,sBACA,KAAA,kBACA,KAAA,kBACA,MAAA,mBACA,SAAA,sBACA,GAAA,qBAEA,KAAA,kBACA,GAAA,gBACA,KAAA,kBACA,OAAA,oBACA,IAAA,mBACA,MAAA,mBACA,OAAA,oBACA,MAAA,mBAEA,OAAA,oBACA,GAAA,gBACA,KAAA,kBACA,IAAA,iBACA,QAAA,qBACA,KAAA,kBACA,SAAA,sBACA,KAAA,kBACA,MAAA,mBACA,OAAA,oBACA,GAAA,mBACA,SAAA,sBACA,OAAA,oBACA,OAAA,oBACA,EAAA,uBACA,MAAA,mBACA,IAAA,iBACA,SAAA,sBACA,EAAA,mBACA,OAAA,oBACA,OAAA,oBACA,OAAA,oBACA,OAAA,oBACA,KAAA,kBACA,MAAA,mBACA,MAAA,mBACA,MAAA,0BAKA,SAAA,sBACA,SAAA,sBACA,MAAA,0BAEA,KAAA,kBACA,MAAA,mBACA,GAAA,sBACA,MAAA,mBACA,GAAA,mBACA,MAAA,oBAgBA,QAAA,KAAA,GAAA,QAAA,GAEA,OAAA,oBAAA,EAAA,UAAA,QAAA,SAAA,GACA,OAAA,GAAA,EAAA,SAAA,MAGA,OAAA,mBAYA,SACA,GAyCA,QAAA,GAAA,EAAA,GACA,GAAA,GACA,EAAA,EAAA,EADA,EAAA,EAAA,iBAIA,KAFA,KACA,EAAA,EAAA,WACA,GAEA,EAAA,KAAA,GACA,EAAA,EAAA,eAEA,KAAA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAEA,GADA,EAAA,EAAA,GAAA,cAAA,GAEA,MAAA,EAIA,MAAA,GAAA,CAEA,GADA,EAAA,EAAA,EAAA,GAEA,MAAA,EAEA,GAAA,EAAA,mBAGA,MAAA,MAGA,QAAA,GAAA,EAAA,EAAA,GACA,GACA,GAAA,EAAA,EAAA,EAAA,EADA,EAAA,EAAA,iBAIA,KAFA,KACA,EAAA,EAAA,WACA,GACA,EAAA,KAAA,GAEA,EAAA,EAAA,eAEA,KAAA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAEA,IADA,EAAA,EAAA,GAAA,iBAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,KAAA,EAAA,GAGA,MAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,kBAGA,OAAA,GAtFA,OAAA,KAAA,kBAAA,aAEA,OAAA,OAAA,kBAAA,eAqBA,OAAA,eAAA,QAAA,UAAA,mBAEA,OAAA,yBAAA,QAAA,UAAA,cAEA,IAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,GAIA,QAAA,UAAA,uBAAA,QAAA,UAAA,iBAsDA,EAAA,gBAAA,SAAA,EAAA,EAAA,GACA,MAAA,GACA,EAAA,EAAA,MAEA,EAAA,EAAA,KAGA,OAAA,UC5dA,SAAA,GC0BA,QACA,GAAA,EAAA,GACA,GAAA,GAAA,EAQA,OAPA,OAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,GAAA,EAAA,YAAA,SAGA,IACA,EAAA,EAAA,QAAA,EAAA,KAEA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,cAAA,QAGA,OAFA,GAAA,YAAA,EAEA,UC7HA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,UAAA,KAAA,YAAA,EACA,IAAA,KACA,IAAA,EAAA,MAOA,IAEA,EAAA,EAAA,MAAA,SACA,MAAA,QAIA,SAAA,KAAA,kBAAA,EAGA,OADA,GAAA,WAAA,YAAA,GACA,EAMA,QAAA,KACA,EAAA,aAAA,EACA,SAAA,KAAA,YAAA,EACA,IAAA,GAAA,EAAA,gBAEA,EAAA,EAAA,cAAA,OACA,GAAA,KAAA,SAAA,QAEA,EAAA,KAAA,YAAA,GAIA,QAAA,GAAA,GACA,EAAA,aACA,IAEA,SAAA,KAAA,YAAA,GACA,EAAA,EAAA,iBACA,SAAA,KAAA,YAAA,GAOA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CAIA,GAAA,EAEA,IAAA,EAAA,MAAA,YAAA,EAAA,CAEA,GAAA,GAAA,EAAA,EACA,GAAA,SAAA,GACA,EAAA,KAAA,YAAA,EAAA,MACA,EAAA,EAAA,MAAA,SACA,EAAA,SAIA,GAAA,EAAA,GAEA,EAAA,IAaA,QAAA,GAAA,GACA,GACA,IAAA,YAAA,SAAA,eAAA,IAKA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,GAAA,aAAA,EAAA,IACA,EAAA,aAAA,EAAA,IACA,SAAA,KAAA,YAAA,GASA,QAAA,KAMA,MALA,KACA,EAAA,SAAA,cAAA,SACA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,GAEA,EF1BA,GAAA,IACA,eAAA,EACA,YAQA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,GACA,EAAA,KAAA,gBAAA,GACA,EAAA,KAAA,kBAAA,EAAA,GAGA,EAAA,EAAA,GAAA,EACA,GAAA,KAAA,aAAA,EAAA,GAEA,IACA,EAAA,aAAA,GAGA,KAAA,iBAAA,EAAA,IAOA,UAAA,SAAA,EAAA,GAEA,MAAA,MAAA,YAAA,EAAA,YAAA,IAMA,YAAA,SAAA,EAAA,GAGA,MADA,GAAA,KAAA,iBAAA,GACA,KAAA,aAAA,EAAA,IAEA,kBAAA,SAAA,EAAA,GACA,MAAA,GACA,EAAA,OAAA,EAAA,IAAA,EAEA,IAEA,gBAAA,SAAA,GACA,MAAA,IAAA,EAAA,QAAA,KAAA,GAGA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAAA,EAAA,EGpIA,OHsIA,MAAA,oBAAA,EAAA,WAAA,KAAA,kBG3IA,KAAA,aAAA,EAAA,EAAA,YAEA,KAAA,eACA,KAAA,oBAAA,EAAA,GAEA,EAAA,aAGA,aAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,WAAA,YAAA,IAGA,aAAA,SAAA,EAAA,EAAA,GCdA,GAAA,GAAA,KAAA,SAAA,IACA,KAAA,EACA,KAAA,EACA,YAAA,GAEA,EAAA,KAAA,WAAA,EACA,GAAA,WAAA,EACA,EAAA,YAAA,EAAA,UAEA,IAAA,GAAA,KAAA,SAAA,EAAA,YAIA,OAHA,KACA,EAAA,YAAA,EAAA,YAAA,OAAA,EAAA,cAEA,GAGA,WAAA,SAAA,GACA,IAAA,EACA,QAEA,IAAA,GAAA,EAAA,iBAAA,QACA,OAAA,OAAA,UAAA,OAAA,KAAA,EAAA,SAAA,GACA,OAAA,EAAA,aAAA,MAGA,oBAAA,SAAA,EAAA,GAEA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,iBAAA,KACA,SAAA,GACA,EAAA,aAAA,EAAA,MAGA,MAAA,UAAA,QAAA,KAAA,EAAA,iBAAA,YACA,SAAA,GACA,KAAA,oBAAA,EAAA,QAAA,IAEA,QAGA,iBAAA,SAAA,GAEA,MADA,GAAA,KAAA,kCAAA,GACA,KAAA,6BAAA,IAgBA,kCAAA,SAAA,GAOA,MALA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,IAAA,MAGA,EAAA,QAAA,EAAA,SAAA,EAAA,GACA,MAAA,GAAA,QAkBA,6BAAA,SAAA,GAOA,MALA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,MAGA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,EAAA,IAAA,QAAA,EAAA,GACA,OAAA,GAAA,KAYA,aAAA,SAAA,EAAA,GAEA,GAAA,GAAA,KAAA,gCAAA,EAMA,IALA,EAAA,KAAA,4BAAA,GACA,EAAA,KAAA,iBAAA,GACA,EAAA,KAAA,wBAAA,GAEA,EAAA,KAAA,mBAAA,GACA,EAAA,CACA,GAAA,GAAA,EAAA,IACA,GAAA,EAAA,SAAA,GACA,EAAA,EAAA,WAAA,EAAA,KAKA,MADA,GAAA,EAAA,KAAA,EACA,EAAA,QAgBA,gCAAA,SAAA,GAGA,IADA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,KAAA,IACA,GAAA,EAAA,GAAA,MAAA,EAAA,IAAA,MAEA,MAAA,EAAA,EAAA,KAAA,IACA,GAAA,EAAA,GAAA,QAAA,EAAA,GAAA,IAAA,QAAA,EAAA,GAAA,EAAA,IAAA,MAEA,OAAA,IAYA,iBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,eACA,KAAA,wBAmBA,wBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,sBACA,KAAA,+BAEA,iBAAA,SAAA,EAAA,EAAA,GAEA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GADA,EAAA,yBACA,EAAA,CAEA,IAAA,GAAA,GADA,EAAA,EAAA,MAAA,KAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,EAAA,OACA,EAAA,KAAA,EAAA,EAAA,EAAA,GAEA,OAAA,GAAA,KAAA,KAEA,MAAA,GAAA,KCjMA,6BAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,MAAA,GACA,KAAA,sBAAA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,KAAA,EAAA,IAAA,EAAA,GAKA,sBAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,EAAA,IAAA,GAMA,mBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,cAAA,OAAA,IACA,EAAA,EAAA,QAAA,cAAA,GAAA,IAEA,OAAA,IAGA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,ECIA,ODHA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GC9BA,GAAA,EAAA,cAAA,EAAA,OAAA,SAAA,EAAA,MAAA,QACA,GAAA,KAAA,cAAA,EAAA,aAAA,EACA,KAAA,eAAA,QACA,GAAA,KAAA,mBAAA,GAAA,cACA,IAAA,EAAA,OAAA,QAAA,WACA,GAAA,UAAA,EAAA,MAAA,UAAA,OACA,GAAA,KAAA,WAAA,EAAA,SAAA,GACA,GAAA,cAcA,KACA,EAAA,UACA,GAAA,EAAA,QAAA,QAEA,MAAA,MAIA,MAEA,GAEA,cAAA,SAAA,EAAA,EAAA,GACA,GAAA,MAAA,EAAA,EAAA,MAAA,IAaA,OAZA,GAAA,QAAA,SAAA,GACA,EAAA,EAAA,OACA,KAAA,qBAAA,EAAA,KAEA,EAAA,IAAA,EAAA,MAAA,0BACA,KAAA,yBAAA,EAAA,GACA,KAAA,mBAAA,EAAA,IAIA,EAAA,KAAA,IACA,MACA,EAAA,KAAA,OAEA,qBAAA,SAAA,EAAA,GAEA,GAAA,MAAA,QAAA,GAEA,OAAA,CAEA,IAAA,GAAA,KAAA,iBAAA,EACA,QAAA,EAAA,MAAA,ICxDA,iBAAA,SAAA,GAEA,MADA,GAAA,EAAA,QAAA,MAAA,OAAA,QAAA,MAAA,OACA,GAAA,QAAA,KAAA,EAAA,IAAA,iBAAA,MAEA,mBAAA,SAAA,EAAA,GACA,MAAA,OAAA,QAAA,GACA,KAAA,uBAAA,EAAA,GACA,KAAA,yBAAA,EAAA,IAKA,uBAAA,SAAA,EAAA,GAGA,IAAA,GAAA,GAFA,KAEA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,KAAA,KAAA,yBAAA,EAAA,GAEA,OAAA,GAAA,KAAA,OAIA,yBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,iBACA,EAAA,EAAA,QAAA,yBAAA,GAEA,EAAA,QAAA,eAAA,EAAA,MAEA,EAAA,IAAA,GN5BA,yBAAA,SAAA,EAAA,GACA,EAAA,EAAA,QAAA,mBAAA,KACA,IAAA,IAAA,IAAA,IAAA,IAAA,KACA,EAAA,EACA,EAAA,IAAA,EAAA,GAcA,OAbA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,GAAA,EAAA,IAAA,SAAA,GAIA,GAAA,GAAA,EAAA,OAAA,QAAA,eAAA,GAIA,OAHA,IAAA,EAAA,QAAA,GAAA,GAAA,EAAA,QAAA,GAAA,IACA,EAAA,EAAA,QAAA,kBAAA,KAAA,EAAA,SAEA,IACA,KAAA,KAEA,GAEA,4BAAA,SAAA,GACA,MAAA,GAAA,QAAA,mBAAA,GAAA,QACA,YAAA,IAEA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,OAIA,GAAA,MAAA,UAAA,EAAA,MAAA,QAAA,MAAA,gBACA,EAAA,EAAA,QAAA,kBAAA,aACA,EAAA,MAAA,QAAA,MAQA,IAAA,GAAA,EAAA,KACA,KAAA,GAAA,KAAA,GACA,YAAA,EAAA,KACA,GAAA,EAAA,cAGA,OAAA,IAEA,oBAAA,SAAA,EAAA,GACA,GAAA,IACA,YAAA,SACA,GAAA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,EAAA,YAAA,EAAA,KAAA,KAAA,EAAA,cACA,QAGA,iBAAA,SAAA,EAAA,GACA,EAAA,MAAA,WACA,EAAA,EAAA,GAEA,EAAA,KAMA,EAAA,oCAEA,EAAA,4DACA,EAAA,uEAEA,EAAA,sDACA,EAAA,+DAGA,EAAA,+DACA,EAAA,wEAKA,EAAA,iBAEA,EAAA,oBACA,EAAA,iDAIA,gBAAA,GAAA,QAAA,IAAA,EAAA,EAAA,OACA,sBAAA,GAAA,QAAA,IAAA,EAAA,EAAA,OACA,iBAAA,6BACA,YAAA,YACA,mBAAA,oBAEA,yBAAA,EAAA,iBACA,eAAA,GAAA,QAAA,EAAA,OAEA,sBAAA,GAAA,QAAA,EAAA,OACA,eACA,QACA,MACA,cACA,mBACA,YACA,YCjFA,IAAA,GAAA,SAAA,cAAA,SACA,GAAA,MAAA,QAAA,MA0BA,IAoDA,GApDA,EAAA,UAAA,UAAA,MAAA,UA+CA,EAAA,iBAEA,EAAA,qBACA,EAAA,SAaA,IAAA,OAAA,kBAAA,CAEA,EAAA,wCACA,IAAA,GAAA,KAAA,UACA,EAAA,EAAA,cAAA,OACA,GAAA,aAAA,IAAA,EAAA,WAAA,IAMA,SAAA,iBAAA,mBAAA,WACA,GAAA,GAAA,EAAA,WAEA,IAAA,OAAA,cAAA,YAAA,UAAA,CACA,GAAA,GAAA,wBACA,EAAA,IACA,EAAA,SAAA,EAAA,GAEA,aAAA,SAAA,0BAAA,IAAA,EAEA,YAAA,SAAA,yBAAA,IAAA,EAEA,YAAA,OAAA,mBACA,YAAA,OAAA,kBACA,EACA,GACA,KAAA,IAEA,IAAA,GAAA,YAAA,OAAA,YAEA,aAAA,OAAA,aAAA,SAAA,GAEA,IAAA,EAAA,GAAA,CAIA,GAAA,GAAA,EAAA,iBAAA,CACA,KAAA,EAAA,aAAA,GAGA,WADA,GAAA,KAAA,KAAA,EAIA,GAAA,YACA,EAAA,EAAA,cAAA,cAAA,SAEA,EAAA,YAAA,EAAA,eACA,EAAA,WAAA,EAAA,OAGA,EAAA,aAAA,GAGA,EAAA,YAAA,EAAA,UAAA,GACA,EAAA,gBAAA,EAAA,IAEA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,EAEA,EAAA,aAAA,IAEA,EAAA,aAAA,EACA,EAAA,aAAA,EAAA,GAEA,EAAA,YAAA,IAGA,EAAA,gBAAA,EACA,KAAA,oBAAA,GAEA,KAAA,aAGA,IAAA,GAAA,YAAA,OAAA,WACA,aAAA,OAAA,YAAA,SAAA,GACA,MAAA,SAAA,EAAA,WAAA,eAAA,EAAA,KACA,EAAA,aAAA,GACA,EAAA,WAEA,EAAA,KAAA,KAAA,OAWA,EAAA,UAAA,GAEA,OAAA,YAaA,WAIA,OAAA,KAAA,OAAA,OAAA,SAAA,GACA,MAAA,IAGA,iBAAA,mBAAA,WACA,GAAA,eAAA,aAAA,EAAA,CACA,GAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,MAMA,SAAA,gBAAA,SAAA,GAOA,GALA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,IAIA,EAAA,UAAA,EAAA,SAAA,CAEA,IADA,GAAA,GAAA,SAAA,yBACA,EAAA,YACA,EAAA,YAAA,EAAA,WAGA,GAAA,SAAA,EAGA,MAAA,GAAA,SAAA,EAAA,WAGA,OAAA,UAOA,SAAA,GACA,YAgCA,SAAA,GAAA,GACA,MAAA,UAAA,EAAA,GAIA,QAAA,KACA,EAAA,KAAA,MACA,KAAA,YAAA,EAKA,QAAA,GAAA,GAKA,MAJA,IAAA,GACA,EAAA,KAAA,MAGA,EAAA,cAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAGA,KAAA,GAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAGA,mBAAA,GAGA,QAAA,GAAA,GAIA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAEA,KAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAGA,mBAAA,GASA,QAAA,GAAA,EAAA,EAAA,GAEA,QAAA,GAAA,GACA,EAAA,KAAA,GAKA,GAAA,GAAA,GAAA,eACA,EAAA,EACA,EAAA,GAEA,GAAA,EACA,GAAA,EACA,IAGA,GAAA,MAAA,EAAA,EAAA,IAAA,GAAA,GAAA,KAAA,KAAA,YAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GAEA,IAAA,eACA,IAAA,IAAA,EAAA,KAAA,GAKA,CAAA,GAAA,EAKA,CACA,EAAA,kBACA,MAAA,GANA,EAAA,GACA,EAAA,WAEA,UAPA,GAAA,EAAA,cACA,EAAA,QAWA,MAEA,KAAA,SACA,GAAA,GAAA,EAAA,KAAA,GACA,GAAA,EAAA,kBAEA,CAAA,GAAA,KAAA,EAsBA,CAAA,GAAA,EAKA,CAAA,GAAA,GAAA,EACA,KAAA,EAGA,GAAA,qCAAA,EACA,MAAA,GATA,EAAA,GACA,EAAA,EACA,EAAA,WACA,UAvBA,GAFA,KAAA,QAAA,EACA,EAAA,GACA,EACA,KAAA,EAGA,GAAA,KAAA,WACA,KAAA,aAAA,GAIA,EADA,QAAA,KAAA,QACA,WACA,KAAA,aAAA,GAAA,EAAA,SAAA,KAAA,QAEA,wBACA,KAAA,YACA,wBAGA,cAcA,KAGA,KAAA,cACA,KAAA,GACA,MAAA,IAEA,EAAA,SACA,KAAA,GACA,KAAA,UAAA,IAEA,EAAA,YAGA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IAEA,KAAA,aAAA,EAAA,GAIA,MAEA,KAAA,YACA,GAAA,GAAA,EAAA,EAAA,SAIA,CACA,EAAA,UACA,UAJA,EAAA,mBACA,EAAA,KAAA,KAKA,MAEA,KAAA,wBAEA,GAAA,KAAA,GAAA,KAAA,EAAA,EAAA,GAEA,CAEA,EAAA,oBAAA,GAEA,EAAA,UACA,UANA,EAAA,0BASA,MAGA,KAAA,WAKA,GAJA,KAAA,aAAA,EAEA,QAAA,KAAA,UACA,KAAA,QAAA,EAAA,SACA,GAAA,EAAA,CACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAEA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,MACA,MAAA,GAEA,GAAA,KAAA,GAAA,MAAA,EACA,MAAA,GACA,EAAA,gCAEA,EAAA,qBAEA,IAAA,KAAA,EACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,IACA,EAAA,YACA,CAAA,GAAA,KAAA,EAQA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,IAGA,QAAA,KAAA,UAAA,EAAA,KAAA,IACA,KAAA,GAAA,KAAA,GACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,KACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QAEA,KAAA,MAAA,OAEA,EAAA,eACA,UAtBA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,OACA,KAAA,UAAA,IAEA,EAAA,WAmBA,KAGA,KAAA,iBAEA,GAAA,KAAA,GAAA,MAAA,EMthBA,CACA,QAAA,KAAA,UACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,OCJA,EAAA,eACA;SPuhBA,MAAA,GACA,EAAA,gCAKA,EADA,QAAA,KAAA,QACA,YAGA,0BO9hBA,MAGA,KAAA,wBAEA,GAAA,KAAA,EAEA,CACA,EAAA,sBAAA,GAEA,EAAA,0BACA,UALA,EAAA,wBAOA,MAEA,KAAA,yBAEA,GADA,EAAA,2BACA,KAAA,EAAA,CACA,EAAA,sBAAA,EACA,UAGA,KAEA,KAAA,2BACA,GAAA,KAAA,GAAA,MAAA,EAAA,CACA,EAAA,WACA,UAEA,EAAA,4BAAA,EAEA,MAEA,KAAA,YACA,GAAA,KAAA,EAAA,CACA,IACA,EAAA,mBACA,GAAA,OAEA,GAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,KAAA,GAAA,MAAA,GAAA,MAAA,EAKA,GAAA,KAAA,GAAA,OAAA,KAAA,UAAA,CAIA,GAAA,GAAA,EAAA,EACA,QAAA,KAAA,UAAA,KAAA,WAAA,EAAA,KAAA,WAAA,MAJA,MAAA,UAAA,OALA,GAAA,oCAWA,EAAA,OACA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CACA,GAAA,EAAA,OACA,EAAA,GACA,EAAA,MACA,UAEA,GAAA,EAEA,KAEA,KAAA,YACA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CACA,GAAA,EAAA,SAAA,EAAA,KAAA,EAAA,KAAA,KAAA,EAAA,IAAA,KAAA,EAAA,GAEA,GAAA,EAAA,OACA,EAAA,uBAEA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,uBANA,EAAA,eAQA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,EACA,EAAA,oCAEA,GAAA,CAEA,MAEA,KAAA,OACA,IAAA,WACA,GAAA,KAAA,GAAA,EAQA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CAIA,GAHA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,sBACA,EACA,KAAA,EAEA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,GACA,KAAA,EACA,GAAA,EACA,KAAA,IACA,GAAA,GAEA,GAAA,GAEA,EAAA,wCAAA,OAnBA,IAHA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,OACA,YAAA,EACA,KAAA,EAoBA,MAEA,KAAA,OACA,GAAA,QAAA,KAAA,GACA,GAAA,MACA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,GAAA,EAAA,CACA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,SAAA,EAAA,GACA,IAAA,EAAA,KAAA,WACA,KAAA,MAAA,EAAA,IAEA,EAAA,GAEA,GAAA,EACA,KAAA,EAEA,GAAA,qBACA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,EACA,EAAA,+BAAA,GAEA,EAAA,KAAA,MAEA,KAEA,KAAA,sBAKA,GAHA,MAAA,GACA,EAAA,6BACA,EAAA,gBACA,KAAA,GAAA,MAAA,EACA,QAEA,MAEA,KAAA,gBACA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,IAAA,GAAA,KAAA,GAAA,KAAA,GA+BA,KAAA,GAAA,MAAA,GAAA,MAAA,ICtLA,GAAA,EAAA,QDuJA,CACA,MAAA,GACA,EAAA,mCAEA,IAAA,IACA,EAAA,EAAA,EAAA,kBACA,EAAA,GAEA,MAAA,GACA,KAAA,MAAA,MACA,KAAA,GAAA,MAAA,GACA,KAAA,MAAA,KAAA,KAEA,KAAA,GAAA,KAAA,GAAA,MAAA,EACA,KAAA,MAAA,KAAA,IACA,KAAA,IACA,QAAA,KAAA,SAAA,GAAA,KAAA,MAAA,QAAA,GAAA,EAAA,QAAA,EAAA,KAAA,EAAA,KAAA,KAAA,EAAA,KACA,EAAA,EAAA,GAAA,KAEA,KAAA,MAAA,KAAA,IAEA,EAAA,GACA,KAAA,GACA,KAAA,OAAA,IACA,EAAA,SACA,KAAA,IAEA,KAAA,UAAA,IACA,EAAA,YCjLA,KAEA,KAAA,QAEA,GAAA,KAAA,EAIA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,QAAA,EAAA,KAHA,KAAA,UAAA,IACA,EAAA,WAIA,MAGA,KAAA,WACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,WAAA,GAMA,KAIA,QAAA,KACA,KAAA,QAAA,GACA,KAAA,YAAA,GACA,KAAA,UAAA,GACA,KAAA,UAAA,KACA,KAAA,MAAA,GACA,KAAA,MAAA,GACA,KAAA,SACA,KAAA,OAAA,GACA,KAAA,UAAA,GACA,KAAA,YAAA,EACA,KAAA,aAAA,EAKA,QAAA,GAAA,EAAA,GACA,SAAA,GAAA,YAAA,KACA,EAAA,GAAA,GAAA,OAAA,KAEA,KAAA,KAAA,EACA,EAAA,KAAA,KAEA,IAAA,GAAA,EAAA,QAAA,+BAAA,GAGA,GAAA,KAAA,KAAA,EAAA,KAAA,GRwNA,GAAA,IAAA,CACA,KAAA,EAAA,UACA,IACA,GAAA,GAAA,GAAA,KAAA,IAAA,WACA,GAAA,eAAA,EAAA,KACA,MAAA,IAIA,IAAA,EAAA,CAIA,GAAA,GAAA,OAAA,OAAA,KACA,GAAA,IAAA,GACA,EAAA,KAAA,EACA,EAAA,OAAA,GACA,EAAA,KAAA,GACA,EAAA,MAAA,IACA,EAAA,GAAA,GAEA,EAAA,IAAA,GAEA,IAAA,GAAA,OAAA,OAAA,KACA,GAAA,OAAA,IACA,EAAA,QAAA,KACA,EAAA,QAAA,KACA,EAAA,UAAA,IAqDA,IAAA,GAAA,OAEA,EAAA,WACA,EAAA,mBQxSA,GAAA,WACA,GAAA,QACA,GAAA,KAAA,WACA,MAAA,MAAA,IAEA,IAAA,GAAA,EAMA,QALA,IAAA,KAAA,WAAA,MAAA,KAAA,aACA,EAAA,KAAA,WACA,MAAA,KAAA,UAAA,IAAA,KAAA,UAAA,IAAA,KAGA,KAAA,UACA,KAAA,YAAA,KAAA,EAAA,KAAA,KAAA,IACA,KAAA,SAAA,KAAA,OAAA,KAAA,WAEA,GAAA,MAAA,GACA,EAAA,KAAA,MACA,EAAA,KAAA,KAAA,IAGA,GAAA,YACA,MAAA,MAAA,QAAA,KAEA,GAAA,UAAA,GACA,KAAA,YAEA,EAAA,KAAA,KAAA,EAAA,IAAA,iBAGA,GAAA,QACA,MAAA,MAAA,WAAA,GAAA,KAAA,MACA,KAAA,MAAA,IAAA,KAAA,MAAA,KAAA,OAEA,GAAA,MAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,MAAA,OAEA,GAAA,UAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,aAGA,GAAA,QACA,MAAA,MAAA,OAEA,GAAA,MAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,MAAA,WAAA,GAAA,KAAA,YACA,IAAA,KAAA,MAAA,KAAA,KAAA,KAAA,aAEA,GAAA,UAAA,IACA,KAAA,YAAA,KAAA,cAEA,KAAA,SACA,EAAA,KAAA,KAAA,EAAA,yBAGA,GAAA,UACA,MAAA,MAAA,aAAA,KAAA,QAAA,KAAA,KAAA,OACA,GAAA,KAAA,QAEA,GAAA,QAAA,IACA,KAAA,YAAA,KAAA,cAEA,KAAA,OAAA,IACA,KAAA,EAAA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,KAAA,KAAA,EAAA,WAGA,GAAA,QACA,MAAA,MAAA,aAAA,KAAA,WAAA,KAAA,KAAA,UACA,GAAA,KAAA,WAEA,GAAA,MAAA,GACA,KAAA,aAEA,KAAA,UAAA,IACA,KAAA,EAAA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,KAAA,KAAA,EAAA,eAKA,EAAA,IAAA,IAEA,QAWA,SAAA,GAmBA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,MACA,EAAA,EAAA,EAAA,UAAA,OAAA,IAAA,CACA,GAAA,GAAA,UAAA,EACA,KACA,IAAA,GAAA,KAAA,GACA,EAAA,EAAA,EAAA,GAEA,MAAA,KAGA,MAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,QAAA,eAAA,EAAA,EAAA,GAKA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,EACA,OAAA,IAAA,EAAA,OAAA,eAAA,GAAA,IAxCA,SAAA,UAAA,OACA,SAAA,UAAA,KAAA,SAAA,GACA,GAAA,GAAA,KACA,EAAA,MAAA,UAAA,MAAA,KAAA,UAAA,EACA,OAAA,YACA,GAAA,GAAA,EAAA,OAEA,OADA,GAAA,KAAA,MAAA,EAAA,WACA,EAAA,MAAA,EAAA,MAuCA,EAAA,MAAA,GAEA,OAAA,UAWA,SAAA,GAGA,YC3NA,SAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,gBAAA,GACA,SAAA,cAAA,GAAA,EAAA,WAAA,EAIA,IAFA,EAAA,UAAA,EAEA,EACA,IAAA,GAAA,KAAA,GACA,EAAA,aAAA,EAAA,EAAA,GAIA,OAAA,GDuNA,GAAA,GAAA,aAAA,UAAA,IACA,EAAA,aAAA,UAAA,MACA,cAAA,UAAA,IAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IACA,EAAA,KAAA,KAAA,UAAA,KAIA,aAAA,UAAA,OAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IAEA,EAAA,KAAA,KAAA,UAAA,KAGA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,UAAA,SACA,GAAA,KAAA,SAAA,IAEA,EAAA,KAAA,IAAA,GAAA,KAAA,OAAA,IAEA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,OAAA,GACA,GAAA,KAAA,IAAA,GAMA,IAAA,GAAA,WAEA,MAAA,OAAA,UAAA,MAAA,KAAA,OAGA,EAAA,OAAA,cAAA,OAAA,mBASA,IAPA,SAAA,UAAA,MAAA,EACA,EAAA,UAAA,MAAA,EACA,eAAA,UAAA,MAAA,GAKA,OAAA,YAAA,CAEA,GAAA,GAAA,KAAA,KAEA,QAAA,aAAA,IAAA,WAAA,MAAA,MAAA,MAAA,IAKA,OAAA,wBACA,OAAA,sBAAA,WACA,GAAA,GAAA,OAAA,6BACA,OAAA,wBAEA,OAAA,GACA,SAAA,GACA,MAAA,GAAA,WACA,EAAA,YAAA,UAGA,SAAA,GACA,MAAA,QAAA,WAAA,EAAA,IAAA,SAMA,OAAA,uBAEA,OAAA,qBAAA,WCvTA,MAAA,QAAA,4BACA,OAAA,yBACA,SAAA,GACA,aAAA,OAgCA,IAAA,MAEA,EAAA,WACA,EAAA,KAAA,WAEA,QAAA,QAAA,EAGA,EAAA,oBAAA,WAIA,MAHA,GAAA,oBAAA,WACA,KAAA,0CAEA,GAMA,OAAA,iBAAA,mBAAA,WACA,OAAA,UAAA,IACA,OAAA,QAAA,WACA,QAAA,MAAA,sIAQA,EAAA,UAAA,GAEA,OAAA,UAYA,SAAA,GACA,EAAA,gBAAA,EAAA,iBAAA,SAAA,GACA,MAAA,GAAA,UAEA,OAAA,UAYA,SAAA,GAGA,EAAA,IAAA,OAAA,aAGA,IAAA,EAEA,QAAA,SAAA,SAAA,EAAA,GAEA,IACA,EAAA,OAAA,KAAA,GAAA,sBAAA,MAAA,GACA,EAAA,SAAA,MAAA,GAGA,EAAA,KACA,UAAA,YAGA,EAAA,GAAA,KAAA,SAAA,MAAA,GAGA,IAAA,IACA,kBACA,SACA,WACA,yCACA,cACA,eACA,UACA,cACA,8CAEA,8BACA,UACA,cACA,yBACA,UACA,aACA,sBACA,uBACA,6BACA,UACA,aACA,kCACA,sCACA,6BACA,+BACA,8BACA,UACA,eACA,YACA,WACA,uBACA,YAEA,4BACA,YACA,WACA,KAAA,MAEA,KAEA,EAAA,WAEA,GAAA,GAAA,EAAA,SAGA,EAAA,EAAA,cAAA,UAGA,GAAA,YAAA,EAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,CACA,GAAA,GAAA,EAAA,cAAA,IACA,GAAA,KAAA,IACA,EAAA,YAAA,EAAA,UACA,EAAA,IAAA,EAEA,EAAA,QAAA,SAAA,GAEA,IADA,GAAA,GACA,EAAA,OAAA,KAAA,KAEA,EAAA,EAAA,KAEA,GAAA,EAAA,QAAA,EAAA,GACA,EAAA,kBAEA,EAAA,YAAA,EAAA,cAAA,OAAA,YAAA,KAIA,EAAA,SAAA,EAAA,GAGA,GAAA,GAAA,EAAA,QAEA,KAEA,IAAA,GAAA,GAAA,CACA,GAAA,KAAA,GAGA,IAEA,EAAA,KAAA,cAAA,SAAA,UACA,QAAA,EAAA,EAAA,EAAA,YAAA,UAGA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,SAEA,GAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,SAAA,GACA,EAAA,SAAA,GACA,MAAA,GAAA,EAAA,WAGA,EAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,GAEA,MAAA,EAEA,IAAA,GAAA,GAAA,EACA,IAAA,EAAA,WAAA,IAAA,EAAA,SAAA,CACA,GAAA,GAAA,EAAA,WAAA,cAEA,EAAA,EAAA,EAAA,EAOA,YAAA,IACA,EAAA,EAAA,uBAEA,GAAA,OACA,IAAA,GAAA,EAAA,cACA,GAAA,EAAA,SAAA,GACA,GAAA,EAAA,EAAA,EAAA,WAAA,KAEA,GAAA,GAEA,GAAA,GAAA,KACA,GAAA,aAAA,EAAA,aACA,GAAA,aAGA,CACA,GAAA,GAAA,EAAA,YAAA,MACA,GAAA,EAAA,EAAA,IAAA,EAAA,SAAA,GAGA,MAAA,IAYA,KAEA,EAAA,SAAA,GACA,GAAA,GAAA,YACA,EAAA,EAAA,WAAA,aAiBA,OAhBA,GAAA,kBAAA,EAAA,YAEA,GAAA,iBAAA,EAAA,OACA,wCAAA,EAAA,YACA,EAAA,KAAA,IAGA,GAAA,GAAA,cAEA,EAAA,YACA,EAAA,EAAA,WAAA,SAAA,GACA,GAAA,IAAA,EAAA,MAAA,EAAA,MAAA,KAAA,EAAA,MAAA,IAAA,MAGA,GAAA,aASA,WAAA,WACA,GAAA,GAAA,OAAA,KAAA,WAAA,IAAA,OAEA,EAAA,EAAA,EACA,GACA,EAAA,EAAA,kBAAA,EAAA,WAAA,IAGA,QAAA,IAAA,sBCtSA,QAAA,IAAA,QAQA,EAAA,OAAA,GAEA,OAAA,WAaA,WASA,GAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,kHAQA,IAAA,GAAA,SAAA,cAAA,OACA,GAAA,aAAA,EAAA,EAAA,aAGA,UAcA,SAAA,GAEA,QAAA,GAAA,EAAA,GAOA,MALA,GAAA,MACA,EAAA,MACA,GAAA,IAGA,EAAA,MAAA,KAAA,EAAA,IAAA,IClEA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EACA,QAAA,UAAA,QACA,IAAA,GAEA,MAEA,KAAA,GACA,EAAA,IACA,MACA,KAAA,GAEA,EAAA,EAAA,MAAA,KACA,MACA,SAEA,EAAA,EAAA,EAAA,GAIA,EAAA,GAAA,EAIA,QAAA,GAAA,GACA,MAAA,GAAA,GAKA,QAAA,GAAA,EAAA,GACA,YAAA,iBAAA,WACA,EAAA,EAAA,KAJA,GAAA,KAWA,GAAA,QAAA,EAEA,EAAA,WAAA,EACA,EAAA,MAAA,GAEA,QC5CA,SAAA,GCAA,QAAA,GAAA,GACA,EAAA,YAAA,IACA,EAAA,KAAA,GAKA,QAAA,KAEA,KAAA,EAAA,QACA,EAAA,UDRA,GAAA,GAAA,EACA,KCLA,EAAA,SAAA,eAAA,GAgBA,KAAA,OAAA,kBAAA,oBAAA,GACA,QAAA,GAAA,eAAA,IAKA,EAAA,eAAA,GAEA,UAaA,SAAA,GAgFA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAGA,OAFA,GAAA,EAAA,EAAA,EAAA,GAEA,EAAA,IAAA,EAAA,IAAA,IAIA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,MAAA,EAAA,GACA,MAAA,EAGA,IAAA,GAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,EAAA,KAAA,EAAA,EAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAEA,EAAA,WAAA,EAAA,SACA,EAAA,EAAA,GAEA,EAKA,QAAA,GAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,SACA,EAAA,EAAA,SACA,EAAA,EAAA,MAAA,KACA,EAAA,EAAA,MAAA,KACA,EAAA,QAAA,EAAA,KAAA,EAAA,IACA,EAAA,QACA,EAAA,OAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IACA,EAAA,QAAA,KAEA,OAAA,GAAA,KAAA,KAAA,EAAA,OAAA,EAAA,KA1HA,GACA,IACA,WAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,KAAA,kBAAA,EAAA,GACA,KAAA,cAAA,EAAA,EAEA,IAAA,GAAA,EAAA,iBAAA,WACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,SACA,KAAA,WAAA,EAAA,QAAA,IAMA,gBAAA,SAAA,GACA,KAAA,WAAA,EAAA,QAAA,EAAA,cAAA,UAEA,cAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,QACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,aAAA,EAAA,IAIA,aAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,YAAA,KAAA,eAAA,EAAA,YAAA,IAGA,eAAA,SAAA,EAAA,EAAA,GAEA,MADA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAGA,kBAAA,SAAA,EAAA,GACA,EAAA,eAAA,EAAA,iBACA,KAAA,yBAAA,EAAA,EAGA,IAAA,GAAA,GAAA,EAAA,iBAAA,EACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,yBAAA,EAAA,IAKA,yBAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,QAAA,SAAA,GACA,GAEA,GAFA,EAAA,EAAA,WAAA,GACA,EAAA,GAAA,EAAA,KAEA,IAAA,EAAA,OAAA,GAAA,IAGA,EAFA,UAAA,EAEA,EAAA,EAAA,GAAA,EAAA,GAEA,EAAA,EAAA,GAEA,EAAA,MAAA,OAOA,EAAA,sBACA,EAAA,qCACA,GAAA,OAAA,MAAA,SAAA,QAAA,OACA,EAAA,IAAA,EAAA,KAAA,OAAA,IACA,EAAA,QAkDA,GAAA,YAAA,GAEA,UASA,SAAA,GAuCA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,IAKA,QAAA,GAAA,GACA,MAAA,QAAA,mBACA,OAAA,kBAAA,aAAA,IACA,EAGA,QAAA,KAIA,GAAA,CAEA,IAAA,GAAA,CACA,MAEA,EAAA,KAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,EAAA,MAIA,IAAA,IAAA,CACA,GAAA,QAAA,SAAA,GAGA,GAAA,GAAA,EAAA,aAGA,GAAA,GAGA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,KAKA,GACA,IAGA,QAAA,GAAA,GACA,EAAA,OAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAEA,EAAA,QAAA,SAAA,GACA,EAAA,WAAA,GACA,EAAA,+BAiBA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EAIA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAKA,IAAA,IAAA,GAAA,EAAA,QAAA,CAIA,GAAA,GAAA,EAAA,EACA,IACA,EAAA,QAAA,MAeA,QAAA,GAAA,GACA,KAAA,UAAA,EACA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,ECnPA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,cACA,KAAA,gBACA,KAAA,gBAAA,KACA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAAA,KAAA,EAAA,OAQA,OAPA,GAAA,WAAA,EAAA,WAAA,QACA,EAAA,aAAA,EAAA,aAAA,QACA,EAAA,gBAAA,EAAA,gBACA,EAAA,YAAA,EAAA,YACA,EAAA,cAAA,EAAA,cACA,EAAA,mBAAA,EAAA,mBACA,EAAA,SAAA,EAAA,SACA,EAYA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,GAAA,GAAA,EAAA,GAQA,QAAA,GAAA,GACA,MAAA,GACA,GACA,EAAA,EAAA,GACA,EAAA,SAAA,EACA,GAGA,QAAA,KACA,EAAA,EAAA,OAQA,QAAA,GAAA,GACA,MAAA,KAAA,GAAA,IAAA,EAYA,QAAA,GAAA,EAAA,GACA,MAAA,KAAA,EACA,EAKA,GAAA,EAAA,GAEA,EAEA,KAWA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BDLA,GAAA,GAAA,GAAA,SAIA,EAAA,OAAA,cAGA,KAAA,EAAA,CACA,GAAA,MACA,EAAA,OAAA,KAAA,SACA,QAAA,iBAAA,UAAA,SAAA,GACA,GAAA,EAAA,OAAA,EAAA,CAEA,GAAA,GAAA,CACA,MACA,EAAA,QAAA,SAAA,GACA,SAIA,EAAA,SAAA,GACA,EAAA,KAAA,GACA,OAAA,YAAA,EAAA,MAKA,GAAA,IAAA,EAGA,KA6GA,EAAA,CAeA,GAAA,WACA,QAAA,SAAA,EAAA,GAKA,GAJA,EAAA,EAAA,IAIA,EAAA,YAAA,EAAA,aAAA,EAAA,eAKA,EAAA,oBAAA,EAAA,YCrVA,EAAA,iBAAA,EAAA,gBAAA,SACA,EAAA,YAIA,EAAA,wBAAA,EAAA,cAEA,KAAA,IAAA,YAIA,IAAA,GAAA,EAAA,IAAA,EACA,IAEA,EAAA,IAAA,EAAA,KAWA,KAAA,GAFA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,GAAA,WAAA,KAAA,CACA,EAAA,EAAA,GACA,EAAA,kBAEA,EAAA,QAAA,CAEA,OAWA,IACA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GACA,KAAA,OAAA,KAAA,IAKA,EAAA,gBAGA,WAAA,WACA,KAAA,OAAA,QAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,WAAA,KAAA,CACA,EAAA,kBACA,EAAA,OAAA,EAAA,EAGA,UAGA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,GAkCA,IAAA,GAAA,CA4EA,GAAA,WACA,QAAA,SAAA,GACA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,EAAA,MAOA,IAAA,EAAA,OAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EACA,IAAA,EAEA,YADA,EAAA,EAAA,GAAA,OAIA,GAAA,KAAA,SAGA,GAAA,GAAA,GAGA,aAAA,WACA,KAAA,cAAA,KAAA,SAGA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,OACA,GAAA,YACA,EAAA,iBAAA,kBAAA,MAAA,GAEA,EAAA,eACA,EAAA,iBAAA,2BAAA,MAAA,GAIA,EAAA,WACA,EAAA,iBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,iBAAA,iBAAA,MAAA,IAGA,gBAAA,WACA,KAAA,iBAAA,KAAA,SAIA,iBAAA,SAAA,GACA,GAAA,GAAA,KAAA,OACA,GAAA,YACA,EAAA,oBAAA,kBAAA,MAAA,GAEA,EAAA,eACA,EAAA,oBAAA,2BAAA,MAAA,GAEA,EAAA,WACA,EAAA,oBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,oBAAA,iBAAA,MAAA,IASA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAGA,KAAA,cAAA,GACA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IAEA,EAAA,IAAA,EAAA,MAIA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,0BAEA,EAAA,QAAA,SAAA,GAEA,KAAA,iBAAA,EAGA,KAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,KAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAIA,SAGA,OAIA,YAAA,SAAA,GAOA,OAFA,EAAA,2BAEA,EAAA,MACA,IAAA,kBAGA,GAAA,GAAA,EAAA,SACA,EAAA,EAAA,YAAA,aACA,EAAA,EAAA,OAGA,EAAA,GAAA,GAAA,aAAA,EACA,GAAA,cAAA,EACA,EAAA,mBAAA,CAIA,IAAA,GACA,EAAA,aAAA,cAAA,SAAA,KAAA,EAAA,SAEA,GAAA,EAAA,SAAA,GAEA,OAAA,EAAA,YAIA,EAAA,iBAAA,EAAA,gBAAA,QAEA,KAAA,EAAA,gBAAA,QAAA,IAEA,KAAA,EAAA,gBAAA,QAAA,GARA,OAaA,EAAA,kBACA,EAAA,GAIA,GAIA,MAEA,KAAA,2BAGA,GAAA,GAAA,EAAA,OAGA,EAAA,EAAA,gBAAA,GAGA,EAAA,EAAA,SAIA,GAAA,EAAA,SAAA,GAEA,MAAA,GAAA,cAIA,EAAA,sBACA,EAAA,GAGA,EARA,QAYA,MAEA,KAAA,iBACA,KAAA,qBAAA,EAAA,OAEA,KAAA,kBAEA,GAEA,GAAA,EAFA,EAAA,EAAA,YACA,EAAA,EAAA,MAEA,qBAAA,EAAA,MACA,GAAA,GAEA,OAGA,KACA,GAAA,GAEA,IAAA,GAAA,EAAA,gBACA,EAAA,EAAA,YAGA,EAAA,EAAA,YAAA,EACA,GAAA,WAAA,EACA,EAAA,aAAA,EAEA,EAAA,gBAAA,EACA,EAAA,YAAA,EAEA,EAAA,EAAA,SAAA,GAEA,MAAA,GAAA,UAKA,EALA,SAcA,MAKA,EAAA,mBAAA,EAGA,EAAA,mBACA,EAAA,iBAAA,IAGA,MAOA,OAAA,YAAA,OAAA,cAAA,UAQA,SAAA,GAGA,GACA,IADA,EAAA,KACA,EAAA,KACA,EAAA,EAAA,MAMA,EAAA,SAAA,EAAA,GACA,KAAA,SACA,KAAA,OAAA,EACA,KAAA,WAAA,EACA,KAAA,SAAA,EAEA,KAAA,WAIA,GAAA,WACA,SAAA,SAAA,GAGA,KAAA,UAAA,EAAA,MCzdA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,QAAA,EAGA,MAAA,aAIA,QAAA,SAAA,GAIA,KAAA,WAGA,KAAA,QAAA,GAEA,KAAA,aAEA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,EAAA,IAIA,GAAA,UAAA,EAEA,KAAA,OAAA,EAAA,IAEA,KAAA,MAAA,EAAA,IAGA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,GAIA,MAFA,MAAA,QAAA,GAAA,KAAA,IAEA,CAGA,OAAA,MAAA,MAAA,IACA,KAAA,OAAA,EAAA,EAAA,KAAA,MAAA,IAEA,KAAA,QAEA,IAGA,KAAA,QAAA,IAAA,IAEA,IAGA,MAAA,SAAA,EAAA,GAEA,GADA,EAAA,MAAA,QAAA,IAAA,QAAA,EAAA,GACA,EAAA,MAAA,UAAA,CAIA,GAAA,GAAA,EAAA,MAAA,KAEA,EAAA,EAAA,GACA,EAAA,EAAA,EC7DA,GD+DA,EAAA,QAAA,cC/DA,KAAA,GAEA,mBAAA,GAEA,WAAA,WACA,KAAA,QAAA,EAAA,EAAA,KAAA,IAEA,KAAA,MAAA,OACA,CACA,GAAA,GAAA,SAAA,EAAA,EAAA,GACA,KAAA,QAAA,EAAA,EAAA,EAAA,EAAA,IACA,KAAA,KACA,GAAA,KAAA,EAAA,KAgBA,QAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,KAAA,MAAA,GAAA,CAEA,IAAA,GAAA,KAAA,QAAA,EACA,IAAA,IAAA,IACA,KAAA,MAAA,GAAA,EACA,EAAA,EAAA,OAAA,KAAA,QAAA,IAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAKA,KAAA,OAAA,GAAA,EAAA,EAAA,GAEA,KAAA,MAEA,MAAA,QAAA,GAAA,KACA,GAAA,IAAA,IACA,KAAA,QAAA,GAAA,OAIA,KAAA,aACA,KAAA,SACA,KAAA,aAEA,UAAA,WACA,KAAA,UACA,KAAA,eAKA,EAAA,IACA,OAAA,EACA,GAAA,SAAA,GACA,MAAA,GAAA,QAAA,KAAA,EAAA,OAAA,KAEA,MAAA,EAAA,QCnEA,IAAA,EAAA,QAEA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,eA2BA,QA1BA,EAAA,MAAA,OAAA,EAAA,MAAA,QACA,GAAA,IAAA,KAAA,UAEA,EAAA,KAAA,MAAA,EAAA,EAAA,OAEA,EAAA,iBAAA,mBAAA,WAEA,GAAA,IAAA,EAAA,WAAA,CAIA,GAAA,GAAA,EAAA,kBAAA,YAEA,EAAA,IACA,IAAA,EACA,GAAA,GAAA,MAAA,EAAA,OAAA,EAAA,GACA,SAAA,OAAA,EACA,CAGA,GAAA,KAAA,GAAA,EAAA,GAAA,IAAA,EACA,EAAA,UAAA,EAAA,aAAA,MAGA,EAAA,OAEA,GC9BA,aAAA,SAAA,EAAA,EAAA,GACA,KAAA,KAAA,EAAA,EAAA,GAAA,aAAA,aAKA,EAAA,IAAA,EACA,EAAA,OAAA,GAGA,OAAA,aASA,SAAA,GC6EA,QAAA,GAAA,GAEA,MAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,KAEA,EAAA,KAAA,GACA,MAAA,GAEA,EAAA,KAAA,SAAA,mBAAA,KACA,QAAA,KAAA,iGACA,GAGA,MAAA,+BAAA,EAIA,QAAA,GAAA,GACA,MAAA,GAAA,YAAA,EAAA,GAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EAAA,CACA,EAAA,EAAA,cAAA,OAEA,IAAA,GAAA,IAAA,KAAA,MAAA,KAAA,KAAA,SAAA,IAAA,IAGA,EAAA,EAAA,YAAA,MAAA,wBACA,GAAA,GAAA,EAAA,IAAA,EAGA,GAAA,IAAA,EAAA,MAEA,MAAA,mBAAA,EAAA,KAQA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,QAGA,OAFA,GAAA,YAAA,EAAA,YACA,EAAA,mBAAA,GACA,ED9HA,GAAA,GAAA,SACA,EAAA,EAAA,MACA,EAAA,UAAA,KAAA,UAAA,WAEA,EAAA,OAAA,kBACA,OAAA,kBAAA,aAAA,UAAA,SAWA,GAEA,kBAAA,YAAA,EAAA,IAEA,kBACA,YAAA,EAAA,IAEA,uBACA,QACA,qBACA,kCAEA,KAAA,KACA,KACA,KAAA,YACA,OAAA,cACA,MAAA,cAIA,UAAA,WACA,GAAA,GAAA,KAAA,aACA,IACA,KAAA,MAAA,IAGA,MAAA,SAAA,GACA,GAAA,KAAA,SAAA,GAEA,YADA,EAAA,OAAA,QAAA,IAAA,yBAAA,EAAA,WAGA,IAAA,GAAA,KAAA,KAAA,IAAA,EAAA,WACA,KACA,KAAA,YAAA,GACA,EAAA,KAAA,KAAA,KAYA,YAAA,SAAA,GACA,EAAA,OAAA,QAAA,IAAA,UAAA,GACA,KAAA,eAAA,GAGA,oBAAA,SAAA,GACA,EAAA,gBAAA,EACA,EAAA,kBACA,EAAA,gBAAA,gBAAA,GAEA,KAAA,eAAA,KACA,EAAA,OAAA,QAAA,IAAA,YAAA,IAEA,gBAAA,SAAA,GAEA,GAAA,EAAA,eACA,EAAA,eAAA,EAAA,aAAA,gBAAA,EACA,KAAA,cAGA,UAAA,WACA,KAAA,YACA,qBAAA,KAAA,YAGA,IAAA,GAAA,IACA,MAAA,WAAA,sBAAA,WAEA,EAAA,eE/GA,YAAA,SAAA,GAoBA,GAhBA,YAAA,sBACA,YAAA,qBAAA,GAGA,EAAA,OAAA,gBAAA,EAEA,KAAA,oBAAA,GAIA,EAAA,cADA,EAAA,WACA,GAAA,aAAA,QAAA,SAAA,IAEA,GAAA,aAAA,SAAA,SAAA,KAIA,EAAA,UAEA,IADA,GAAA,GACA,EAAA,UAAA,QACA,EAAA,EAAA,UAAA,QACA,GACA,GAAA,OAAA,GAIA,MAAA,aAEA,UAAA,SAAA,GACA,EAAA,GACA,KAAA,YAAA,IAGA,EAAA,KAAA,EAAA,KACA,KAAA,aAAA,KAGA,WAAA,SAAA,GAEA,GAAA,GAAA,CACA,GAAA,EAAA,GACA,EAAA,gBAAA,EACA,KAAA,aAAA,IAEA,aAAA,SAAA,GACA,KAAA,aAAA,GACA,SAAA,KAAA,YAAA,IAGA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KACA,EAAA,SAAA,GACA,GACA,EAAA,GAEA,EAAA,oBAAA,GACA,EAAA,YAUA,IARA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,GAOA,GAAA,UAAA,EAAA,UAAA,CDtEA,GAAA,IAAA,CAEA,IAAA,IAAA,EAAA,YAAA,QAAA,WACA,GAAA,MAEA,IAAA,EAAA,MAAA,CAEA,GAAA,CAMA,KAAA,GAAA,GALA,EAAA,EAAA,MAAA,SAEA,EAAA,EAAA,EAAA,OAAA,EAGA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,OAAA,QAAA,cAGA,EAAA,GAAA,QAAA,EAAA,aAOA,GAEA,EAAA,cAAA,GAAA,aAAA,QAAA,SAAA,OAaA,YAAA,SAAA,GAEA,GAAA,GAAA,SAAA,cAAA,SACA,GAAA,gBAAA,EACA,EAAA,IAAA,EAAA,IAAA,EAAA,IAEA,EAAA,GACA,EAAA,cAAA,EACA,KAAA,aAAA,EAAA,WAEA,EAAA,WAAA,YAAA,GACA,EAAA,cAAA,OAEA,SAAA,KAAA,YAAA,IAKA,YAAA,WACA,OAAA,KAAA,gBAAA,KAAA,iBAAA,IAEA,iBAAA,SAAA,EAAA,GAEA,IAAA,GAAA,GADA,EAAA,EAAA,iBAAA,KAAA,sBAAA,IACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,IAAA,KAAA,SAAA,GACA,MAAA,MAAA,YAAA,GACA,EAAA,GAAA,KAAA,iBAAA,EAAA,OAAA,GAAA,EAGA,MAOA,OAAA,IAGA,sBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,kBAAA,KAAA,kBAEA,SAAA,SAAA,GACA,MAAA,GAAA,gBAEA,YAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,QAEA,GAGA,IA6DA,EAAA,sBACA,EAAA,qCAEA,GACA,mBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,cACA,EAAA,EAAA,cAAA,IAGA,OAFA,GAAA,YAAA,KAAA,qBAAA,EAAA,YAAA,GAEA,GAEA,qBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,EAGA,OAFA,GAAA,KAAA,YAAA,EAAA,EAAA,IAKA,YAAA,SAAA,EAAA,EAAA,GAEA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAGA,OAFA,GAAA,KAAA,EACA,EAAA,EAAA,KACA,EAAA,IAAA,EAAA,IAAA,KAOA,GAAA,OAAA,EACA,EAAA,KAAA,EACA,EACA,KAAA,GAEA,aAUA,SAAA,GAwGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GAEA,MAAA,SAAA,EAAA,WAAA,EAAA,aAAA,SAAA,EASA,QAAA,GAAA,EAAA,GAGA,GAAA,GAAA,CACA,aAAA,YAEA,EAAA,SAAA,eAAA,mBAAA,IAKA,EAAA,KAAA,CAGA,IAAA,GAAA,EAAA,cAAA,OACA,GAAA,aAAA,OAAA,GAEA,EAAA,UAEA,EAAA,QAAA,EAGA,IAAA,GAAA,EAAA,cAAA,OE/TA,OAvBA,GAAA,aAAA,UAAA,SAEA,EAAA,KAAA,YAAA,GACA,EAAA,KAAA,YAAA,GAQA,YAAA,YAEA,EAAA,KAAA,UAAA,GAMA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,GAGA,EA+CA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAEA,EAAA,WACA,EAAA,EAAA,IAEA,GAOA,QACA,GAAA,GACA,MAAA,aAAA,EAAA,YACA,EAAA,aAAA,EAKA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,GAWA,GACA,QAZA,CAEA,GAAA,GAAA,YACA,aAAA,EAAA,YACA,EAAA,aAAA,KACA,EAAA,oBAAA,EAAA,GACA,EAAA,EAAA,IAIA,GAAA,iBAAA,EAAA,IAOA,QAAA,GAAA,EAAA,GAGA,QAAA,KACA,GAAA,GACA,GAAA,IAGA,QAAA,KACA,IAEA,IAVA,GAAA,GAAA,EAAA,iBAAA,oBACA,EAAA,EAAA,EAAA,EAAA,MAWA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,GACA,EAAA,KAAA,IAEA,EAAA,iBAAA,OAAA,GAEA,EAAA,iBAAA,QAAA,QAKA,KAIA,QAAA,GAAA,GAEA,MAAA,GAAA,EAAA,QAAA,YAAA,EAAA,OAAA,YAAA,EAAA,SACA,EAAA,eAgBA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,IACA,EAAA,GAKA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WAAA,WAAA,EAAA,IAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MACA,GACA,GAAA,OAAA,KAGA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,IAKA,QAAA,GAAA,GACA,EAAA,OAAA,UAAA,EFmBA,GAAA,GAAA,UAAA,UAAA,cAAA,QACA,EAAA,EACA,EAAA,EAAA,MACA,EAAA,SAGA,EAAA,OAAA,kBACA,kBAAA,aAAA,UAAA,QAEA,IAAA,EEvLA,GAAA,UF0LA,IACA,IADA,EAAA,IACA,EAAA,QACA,EAAA,EAAA,OASA,GACA,aAEA,yBAAA,YAAA,EAAA,IAEA,yBACA,YAAA,EAAA,KACA,KAAA,KACA,SAAA,SAAA,GACA,EAAA,QAAA,IAGA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAGA,GAAA,SAAA,IAEA,aAAA,SAAA,GAGA,MAAA,GAAA,iBAAA,KAAA,qBAAA,KAIA,qBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,yBACA,KAAA,yBAEA,OAAA,SAAA,EAAA,EAAA,GAQA,GAPA,EAAA,MAAA,QAAA,IAAA,SAAA,EAAA,GAMA,EAAA,WAAA,EACA,EAAA,GAAA,CACA,GAAA,GAAA,KAAA,UAAA,EAIA,KAGA,EAAA,EAAA,EAAA,GACA,EAAA,aAAA,EAGA,KAAA,aAAA,GAGA,KAAA,UAAA,GAAA,GAIA,EAAA,OAAA,EAEA,EAAA,aAEA,aAAA,SAAA,GACA,KAAA,YAAA,GACA,KAAA,QAAA,GACA,EAAA,aAIA,UAAA,WACA,EAAA,cAMA,EAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GACA,EAAA,UAAA,KAAA,GEzQA,IAAA,IACA,IAAA,WAEA,MAAA,aAAA,eAAA,SAAA,eAGA,cAAA,EASA,IALA,OAAA,eAAA,SAAA,iBAAA,GACA,OACA,eAAA,EAAA,iBAAA,IAGA,SAAA,QAAA,CACA,GAAA,IACA,IAAA,WAEA,MAAA,QAAA,SAAA,MAEA,cAAA,EAGA,QAAA,eAAA,SAAA,UAAA,GACA,OAAA,eAAA,EAAA,UAAA,GAkBA,GACA,GAAA,YAAA,KAAA,WAAA,cACA,EAAA,kBAiEA,IACA,GAAA,kBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,YACA,EAAA,EAAA,cAIA,QAAA,SAAA,MAAA,WAAA,IAoCA,EAAA,UAAA,EACA,EAAA,UAAA,EACA,EACA,SAAA,EACA,EAAA,iBAAA,EACA,EACA,iBAAA,EACA,EAAA,eAAA,EACA,EAAA,aAAA,GAEA,OAAA,aAUA,SAAA,GAUA,QAAA,GAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,cAAA,EAAA,MAAA,EAAA,WAAA,QACA,EAAA,EAAA,YAMA,QAAA,GAAA,GAGA,IAAA,GAFA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,EAAA,GAAA,EAAA,cACA,EAAA,IACA,EAAA,SAAA,GAEA,EAAA,UAAA,EAAA,SAAA,QACA,EAAA,EAAA,UAcA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EACA,EAAA,qBAAA,IAcA,QAAA,GAAA,GACA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IA3DA,GAGA,IAFA,EAAA,iBAEA,EAAA,UA8CA,GA7CA,EAAA,OA6CA,YAAA,UAAA,SACA,YAAA,UAAA,iBACA,YAAA,UAAA,uBACA,YAAA,UAAA,oBACA,YAAA,UAAA,mBAEA,EAAA,GAAA,kBAAA,EAWA,GACA,QAAA,EACA,EAAA,QAAA,GAGA,aAOA,WAyCA,QAAA,KACA,YAAA,SAAA,aAAA,GArCA,kBAAA,QAAA,cACA,OAAA,YAAA,SAAA,EAAA,GACA,GAAA,GAAA,SAAA,YAAA,aAMA,OAJA,GAAA,UAAA,EACA,EAAA,WAAA,GAAA,GAAA,EACA,EAAA,cAAA,GAAA,GAAA,EACA,EAAA,QACA,GAKA,IAAA,GAAA,OAAA,kBAEA,OAAA,kBAAA,aAAA,UAAA,QAQA,aAAA,iBAAA,WACA,YAAA,OAAA,EACA,YAAA,WAAA,GAAA,OAAA,UACA,EAAA,cACA,GAAA,aAAA,qBAAA,SAAA,OAQA,YAAA,YASA,aAAA,SAAA,YACA,gBAAA,SAAA,aAAA,OAAA,YAEA,IAEA,SAAA,iBAAA,mBAAA,OAYA,OAAA,eAAA,OAAA,iBAAA,UASA,SAAA,GASA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBACA,KAAA,EAEA,IADA,EAAA,EAAA,WACA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAGA,MAAA,GAEA,EAAA,EAAA,MAAA,GACA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,kBAGA,OAAA,MAIA,QAAA,GAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,WACA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,gBAQA,QAAA,GAAA,EAAA,GAEA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IAEA,MAGA,GAAA,EAAA,KAEA,EAAA,EAAA,GAMA,QAAA,GAAA,GACA,MAAA,GAAA,IACA,EAAA,IAEA,OAEA,GAAA,GAKA,QAAA,GAAA,GACA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IAEA,EAFA,SAQA,QAAA,GAAA,GACA,MAAA,GAAA,IAAA,EAAA,GAKA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,OAAA,EAAA,UAEA,EAAA,EAAA,SAAA,EACA,IAAA,EAKA,MAJA,GAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WACA,EAAA,QAAA,GAEA,EAAA,KAAA,QAAA,YACA,GAMA,QAAA,GAAA,GACA,EAAA,GACA,EAAA,IAEA,EAAA,EAAA,SAAA,GACA,EAAA,KAsBA,QAAA,GAAA,GAGA,GAFA,EAAA,KAAA,IAEA,EAAA,CAEA,GAAA,CACA,IAAA,GAAA,OAAA,UAAA,OAAA,SAAA,gBACA,UACA,GAAA,IAMA,QAAA,KACA,GAAA,CAEA,KAAA,GAAA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,GAEA,MAGA,QACA,GAAA,GACA,EACA,EAAA,WACA,EAAA,KAGA,EAAA,GAKA,QAAA,GAAA,IAaA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,YAAA,EAAA,WACA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAIA,EAAA,WAAA,EACA,EAAA,KAAA,QAAA,KAAA,YAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,mBACA,EAAA,KAAA,QAAA,IAAA,YAAA,EAAA,WAEA,EAAA,qBAIA,EAAA,KAAA,QAAA,YAIA,QACA,GAAA,GACA,EAAA,GACA,EAAA,EAAA,SAAA,GAEA,EAAA,KAKA,QAAA,GAAA,GACA,EACA,EAAA,WAEA,EAAA,KAGA,EAAA,GAIA,QAAA,GAAA,IAGA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WAEA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAGA,EAAA,WAAA,EAEA,EAAA,KAAA,QAAA,KAAA,WAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,kBAEA,EAAA,oBAGA,EAAA,KAAA,QAAA,YAQA,QAAA,GAAA,GACA,MAAA,QAAA,kBAAA,kBAAA,aAAA,GACA,EAGA,QAAA,GAAA,GAIA,IAHA,GAAA,GAAA,EACA,EAAA,EAAA,UAEA,GAAA,CACA,GAAA,GAAA,EACA,OAAA,CAEA,GAAA,EAAA,YAAA,EAAA,MAMA,QAAA,GAAA,GACA,GAAA,EAAA,aAAA,EAAA,WAAA,UAAA,CACA,EAAA,KAAA,QAAA,IAAA,6BAAA,EAAA,UAKA,KAFA,GAAA,GAAA,EAAA,WAEA,GACA,EAAA,GACA,EAAA,EAAA,iBAMA,QAAA,GAAA,GACA,EAAA,YACA,EAAA,GAEA,EAAA,WAAA,GAIA,QAAA,GAAA,GAEA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,cAAA,EAAA,MAAA,EAAA,YAEA,EAAA,WAAA,CAEA,IADA,GAAA,GAAA,EAAA,WAAA,GACA,GAAA,IAAA,WAAA,EAAA,MACA,EAAA,EAAA,UAEA,IAAA,GAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,MAAA,EAAA,KAAA,YAAA,EAEA,GAAA,EAAA,MAAA,MAAA,QAAA,MAAA,KAAA,MAIA,QAAA,MAAA,sBAAA,EAAA,OAAA,GAAA,IAIA,EAAA,QAAA,SAAA,GAGA,cAAA,EAAA,OACA,EAAA,EAAA,WAAA,SAAA,GAEA,EAAA,WAIA,EAAA,KAGA,EAAA,EAAA,aAAA,SAAA,GAEA,EAAA,WAIA,EAAA,QAMA,EAAA,KAAA,QAAA,WAOA,QAAA,KAEA,EAAA,EAAA,eACA,IAOA,QAAA,GAAA,GAEA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IAGA,QAAA,GAAA,GACA,EAAA,GAGA,QACA,GAAA,GACA,EAAA,KAAA,QAAA,MAAA,oBAAA,EAAA,QAAA,MAAA,KAAA,OACA,EAAA,GACA,EAAA,KAAA,QAAA,WAGA,QACA,GAAA,GACA,EAAA,EAAA,EAKA,KAAA,GAAA,GADA,EAAA,EAAA,iBAAA,YAAA,EAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,EAAA,QAAA,EAAA,OAAA,UACA,EAAA,EAAA,OAIA,GAAA,GAhYA,GAAA,GAAA,OAAA,aACA,EAAA,OAAA,YAAA,YAAA,iBAAA,OAoHA,GAAA,OAAA,kBACA,OAAA,mBAAA,OAAA,kBACA,GAAA,qBAAA,CAGA,IAAA,IAAA,EAEA,KAyNA,EAAA,GAAA,kBAAA,GAUA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QAsCA,GACA,iBAAA,EACA,EACA,YAAA,EACA,EAAA,oBAAA,EACA,EAAA,WAAA,EACA,EACA,eAAA,EACA,EAAA,aAAA,EAEA,EAAA,gBAAA,EACA,EAAA,gBAAA,EAEA,EAAA,YAAA,GAGA,OAAA,gBAqBA,SAAA,GA6FA,QAAA,GAAA,EAAA,GAKA,GAAA,GAAA,KAEA,KAAA,EAGA,KAAA,IAAA,OAAA,oEAEA,IAAA,EAAA,QAAA,KAAA,EAIA,KAAA,IAAA,OAAA,uGAAA,OAAA,GAAA,KAKA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,oFAAA,OAAA,GAAA,+BAGA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,+CAAA,OAAA,GAAA,0BAKA,KAAA,EAAA,UAGA,KAAA,IAAA,OAAA,8CAmCA,OAhCA,GAAA,OAAA,EAAA,cAEA,EAAA,UAAA,EAAA,cAIA,EAAA,SAAA,EAAA,EAAA,SAIA,EAAA,GAGA,EAAA,GAEA,EAAA,EAAA,WAGA,EAAA,EAAA,OAAA,GAGA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,UAAA,EAAA,UAEA,EAAA,UAAA,YAAA,EAAA,KAGA,EAAA,OAGA,EAAA,oBAAA,UAEA,EAAA;CAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,IAAA,EAAA,GACA,OAAA,EAWA,QAAA,GAAA,GAEA,GAAA,GAAA,EAAA,EACA,OAAA,GAEA,EAAA,EAAA,SAAA,QAAA,OAMA,QAAA,GAAA,GAQA,IAAA,GAAA,GAJA,EAAA,EAAA,QAIA,EAAA,EAAA,EAAA,EAAA,SAAA,GAAA,IACA,EAAA,EAAA,IAAA,EAAA,GAIA,GAAA,IAAA,GAAA,EAAA,OACA,IAEA,EAAA,GAAA,EAAA,QAIA,QAAA,GAAA,GAKA,IAAA,OAAA,UAAA,CAGA,GAAA,GAAA,YAAA,SAEA,IAAA,EAAA,GAAA,CACA,GAAA,GAAA,SAAA,cAAA,EAAA,KACA,EAAA,OAAA,eAAA,EAEA,KAAA,EAAA,YACA,EAAA,GAUA,IADA,GAAA,GAAA,EAAA,EAAA,UACA,GAAA,IAAA,GACA,EAAA,OAAA,eAAA,GACA,EAAA,UAAA,EACA,EAAA,CAIA,GAAA,OAAA,GAQA,QAAA,GAAA,GASA,MAAA,GAAA,EAAA,EAAA,KAAA,GAGA,QAAA,GAAA,EAAA,GAuBA,MArBA,GAAA,IAEA,EAAA,aAAA,KAAA,EAAA,IAGA,EAAA,gBAAA,cAGA,EAAA,EAAA,GAGA,EAAA,cAAA,EAGA,EAAA,GAEA,EAAA,aAAA,GAGA,EAAA,eAAA,GAEA,EAKA,QAAA,GAAA,EAAA,GAEA,OAAA,UACA,EAAA,UAAA,EAAA,WAMA,EAAA,EAAA,EAAA,UAAA,EAAA,QAEA,EAAA,UAAA,EAAA,WAMA,QAAA,GAAA,EAAA,EAAA,GAYA,IAPA,GAAA,MAEA,EAAA,EAKA,IAAA,GAAA,IAAA,YAAA,WAAA,CAEA,IAAA,GAAA,GADA,EAAA,OAAA,oBAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,IAEA,EAAA,KACA,OAAA,eAAA,EAAA,EAEA,OAAA,yBAAA,EAAA,IACA,EAAA,GAAA,EAGA,GAAA,OAAA,eAAA,IAKA,QAAA,GAAA,GAGA,EAAA,iBACA,EAAA,kBAMA,QAAA,GAAA,GAIA,IAAA,EAAA,aAAA,YAAA,CAIA,GAAA,GAAA,EAAA,YAEA,GAAA,aAAA,SAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,EAAA,GAEA,IAAA,GAAA,EAAA,eACA,GAAA,gBAAA,SAAA,GACA,EAAA,KAAA,KAAA,EAAA,KAAA,IAEA,EAAA,aAAA,aAAA,GAKA,QAAA,GAAA,EAAA,EAAA,GAEA,EAAA,EAAA,aACA,IAAA,GAAA,KAAA,aAAA,EACA,GAAA,MAAA,KAAA,UACA,IAAA,GAAA,KAAA,aAAA,EACA,MAAA,0BACA,IAAA,GAEA,KAAA,yBAAA,EAAA,EAAA,GAUA,QAAA,GAAA,GAEA,MAAA,GACA,EAAA,EAAA,eADA,OAMA,QAAA,GAAA,EAAA,GAEA,EAAA,GAAA,EAGA,QAAA,GAAA,GACA,MAAA,YACA,MAAA,GAAA,IAKA,QAAA,GAAA,EAAA,EAAA,GAIA,MAAA,KAAA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,GAMA,QAAA,GAAA,EAAA,GAIA,GAAA,GAAA,EAAA,GAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KAAA,GAAA,EAAA,GACA,MAAA,IAAA,GAAA,IAIA,KAAA,IAAA,EAAA,GACA,MAAA,IAAA,GAAA,KAKA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAGA,OADA,GAAA,aAAA,KAAA,GACA,EAGA,GAAA,GAAA,EAAA,EAKA,OAHA,GAAA,QAAA,MAAA,GACA,EAAA,EAAA,aAEA,EAIA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,MACA,EAAA,EAAA,GAAA,EAAA,UACA,IAAA,EAAA,CAEA,GAAA,GAAA,EAAA,KAAA,EAAA,UACA,MAAA,GAAA,EAAA,EACA,KAAA,IAAA,EAAA,QCtuCA,MAAA,GAAA,EAAA,KAMA,QAAA,GAAA,GAGA,GAAA,GAAA,EAAA,KAAA,KAAA,EAKA,OAFA,GAAA,WAAA,GAEA,EDixBA,IACA,EAAA,OAAA,gBAAA,UAEA,IACA,GAAA,EAAA,MAKA,EAAA,QAAA,SAAA,iBAIA,GAAA,EAAA,UAAA,IAAA,OAAA,qBAAA,OAAA,aAAA,YAAA,UAEA,IACA,EAAA,CAGA,GAAA,GAAA,YAIA,GAAA,YACA,EAAA,eAAA,EAEA,EAAA,YAAA,EACA,EAAA,QAAA,EACA,EAAA,WAAA,EAEA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,gBAAA,EACA,EAAA,oBAAA,EAEA,EAAA,YAAA,EACA,EAAA,uBAEA,CAmIA,GAAA,IACA,iBAAA,gBAAA,YAAA,gBACA,gBAAA,mBAAA,iBAAA,iBAgNA,KAqBA,EAAA,+BC5pCA,EAAA,SAAA,cAAA,KAAA,UACA,EAAA,SAAA,gBAAA,KAAA,UAIA,EAAA,KAAA,UAAA,SAIA,UAAA,gBAAA,EACA,SAAA,cAAA,EAEA,SAAA,gBAAA,EACA,KAAA,UAAA,UAAA,EAEA,EAAA,SAAA,EAcA,EAAA,QAAA,EAMA,GAAA,KAEA,OAAA,WAAA","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);
